Wîkîferheng kuwiktionary https://ku.wiktionary.org/wiki/Destp%C3%AAk MediaWiki 1.47.0-wmf.20 case-sensitive Medya Taybet Gotûbêj Bikarhêner Gotûbêja bikarhêner Wîkîferheng Gotûbêja Wîkîferhengê Wêne Gotûbêja wêneyî MediaWiki Gotûbêja MediaWiki Şablon Gotûbêja şablonê Alîkarî Gotûbêja alîkariyê Kategorî Gotûbêja kategoriyê Pêvek Gotûbêja pêvekê Nimînok Gotûbêja nimînokê Portal Gotûbêja portalê Tewandin Gotûbêja tewandinê Jinûvesazî Gotûbêja jinûvesaziyê TimedText TimedText talk Modul Gotûbêja modulê Event Event talk pênc 0 3195 6532044 6426624 2026-09-18T17:05:37Z Wikihez 7344 Kurmancî/Hejmar: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532044 wikitext text/x-wiki {{h-bnr|penc|pênç}} == {{ziman|ku}} == === Bilêvkirin === * {{IPA|ku|/peːnd͡ʒ/}} * {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-pênc.wav|dever=Bidlîs}} * {{ku-kîte}} === Hejmar === {{hejmar|ku}}, {{p-ya nerm}} # [[hejmar]] [[5]] ([[V]]) ==== Bi alfabeyên din ==== * {{ku-ar|پێنج}} * {{ku-kr|пенщ}} ==== Jê ==== {{kol3|ku|cure=Jê |pêncem |pêncemî |pêncemîn |pêncemînî |pêncî |pêncşem |pêncşemb |pêncşembî |pêncşemî }} ==== Etîmolojî ==== {{etîmon|ku|:mîr|ine-pro:*pénkʷe|dar=1|metn=++}} Hevreha soranî {{g|ckb|پێنج|tr=pênc}} / {{g|ckb|په‌نج|tr=penc}}, hewramî [[penc]], zazakî [[panc]] / [[ponc]], belûçî {{g|bal|پنچ|tr=penç}}, mazenderanî ''penc'', parsî ''penc'', farisî {{g|fa|پنج|tr=penc}}, pehlewî ''penz'', tacikî [[панҷ]] (penc), avestayî [[𐬞𐬀𐬧𐬗𐬀]] (peṇçe-), sogdî ''penc-'', xwarezmî ''p'nç-'', peştûyî {{g|ps|پنځه|tr=pindzê}}, osetî [[фондз]] (fondz), sanskrîtî [[पञ्चन्]] (páñcan), hindî [[पाँच]] (paçe), urdûyî {{g|ur|پانچ|tr=pāñć}}, yûnanî [[πέντε]] (pêntê), albaniya kevn [[pensë]] (nû: [[pesë]]), lîtwanî [[penki]], tokarî A ''päñ'', tokarî B ''piś'', polonî [[pięć]], rusî [[пять]] (pyati), almanî [[fünf]] (p-ya {{ji|ine-pro|ku|-}} di cermenî de dibe "f"), danmarkî / norwecî / swêdî [[fem]], îngilîzî [[five]], holendî [[vijf]], latînî [[quinque]] (p-ya {{ji|ine-pro|ku|-}} gelek caran li destpêkê di latînî de dibe "k" > fransî [[cinq]], portugalî û spanî [[cinco]])... <font style="font-size:10px">'''Çavkanî:''' [[Şablon:Horn|Horn p.73]], [[Şablon:Watkins|Watkins p.64]], [[Şablon:Etymonline|Etymonline]]</font> ==== Herwiha binêre ==== {{hejmar/ku}} ==== Bizelêv ==== * [[pênc]] in bi hev sênc in ==== Bi zaravayên din ==== * Kurmancî: ** Reşwî: [[pênc]] (hw [[pyênc]]) * Soranî: {{W-|ckb|پێنج}} * {{Z|sdh}}: {{W-|sdh|penc|sc=Latn}} * {{Z|lki}}: {{W-|lki|penc|sc=Latn}} * Hewramî: {{W-|hac|penc|sc=Latn}} * Zazakî: {{W+|zza|panc}}, {{W-|zza|ponc}}, {{W-|zza|panj}} ==== Werger ==== {{werger-ser}} * {{Z|aiw}}: {{W-|aiw|dónq}} * {{Z|abx}}: {{W-|abx|lima}} * {{Z|abq}}: {{W-|abq|хвба}} * {{Z|abl}}: {{W-|abl|lemou}} * {{Z|ab}}: {{W-|ab|хуба|sc=Cyrl}} * {{Z|ady}}: {{W-|ady|тфы}} * {{Z|aa}}: {{W-|aa|konóy}} * {{Z|af}}: {{W+|af|vyf}} * {{Z|xag}}: {{W-|xag|𐕇𐕒}} * {{Z|aho}}: {{W-|aho|𑜑𑜡}} * {{Z|akm}}: {{W-|akm|kumugyĭ}} * {{Z|ak}}: {{W-|ak|anum}} * {{Z|akl}}: {{W-|akl|lima}} * {{Z|akz}}: {{W-|akz|táɬɬàapi}} * {{Z|sq}}: {{W+|sq|pesë}} * {{Z|pdc}}: {{W-|pdc|fimf}} * {{Z|de}}: {{W+|de|fünf}} * {{Z|ems}}: {{W-|ems|talliman}} * {{Z|am}}: {{W+|am|አምስት}} (numeral: {{W-|am|፭}}) * {{Z|ami}}: {{W-|ami|lima}} * Apaçî: *: {{Z|apw}}: {{W-|apw|ashdla'i}} * {{Z|an}}: {{W-|an|cinco}}, {{W-|an|cinc}} * {{Z|arc}}: *: {{Z|aii}}: {{W-|aii|ܚܲܡܫܵܐ|tr=ḳāmša|n}}, {{W-|aii|ܚܲܡܸܫ|tr=ḳāmmeš|m}} *: {{Z|syc}}: {{W-|syc|ܚܡܫܐ|n|tr=ḥamšā}}, {{W-|syc|ܚܡܫ|m|tr=ḥammeš}} *: {{Z|tmr}}: {{W-|arc|חַמְשָׁא|n|tr=ḥamšā|sc=Hebr}}, {{W-|arc|חֲמֵשׁ|m|tr=ḥămēš|sc=Hebr}} *: {{Z|amw}}: {{W-|amw|ܚܡܫܐ|n|tr=ḥamša}}, {{W-|amw|ܚܡܫ|m|tr=ḥammeš}} * {{Z|arp}}: {{W-|arp|yoo3on}} * {{Z|aqc}}: {{W-|aqc|ллъо}} * {{Z|agj}}: {{W-|agj|ሀምስት|tr=ammest}} * {{Z|rup}}: {{W-|rup|tsintsi}} * {{Z|as}}: {{W-|as|পাঁচ}} * {{Z|bno}}: {{W-|bno|lima}} * {{Z|ast}}: {{W+|ast|cinco}} * {{Z|aot}}: {{W-|aot|banga}} * {{Z|av}}: {{W-|av|щуго}} * {{Z|ay}}: {{W+|ay|phisqa}} * {{Z|ain}}: {{W-|ain|アシㇰネ|tr=asikne}} * {{Z|az}}: {{W+|az|beş}} * {{Z|bdq}}: {{W-|bdq|pơđăm}} * {{Z|ban}}: {{W-|ban|lima}} * {{Z|bjn}}: {{W-|bjn|lima}} * {{Z|eu}}: {{W+|eu|bost}} * {{Z|bsq}}: {{W-|bsq|hm̀m̌}} * {{Z|ba}}: {{W-|ba|биш|sc=Cyrl}} * {{Z|be}}: {{W+|be|пяць}}, {{W-|be|пяцёра|sc=Cyrl}} * {{Z|bn}}: {{W+|bn|পাঁচ|sc=Beng}} (numeral: [[৫]]) * {{Z|bkd}}: {{W-|bkd|lalima}} * {{Z|bcl}}: {{W-|bcl|lima}} * {{Z|bi}}: {{W-|bi|faef}} * {{Z|br}}: {{W+|br|pemp}} * {{Z|kxd}}: {{W-|kxd|lima}} * {{Z|bdk}}: {{W-|bdk|фуд}} * {{Z|bug}}: {{W-|bug|lima}} * {{Z|mbb}}: {{W-|mbb|lelima}} * {{Z|bg}}: {{W+|bg|пет}} * {{Z|my}}: {{W+|my|ငါး|sc=Mymr}} (numeral: {{W+|my|၅}}) * {{Z|bua}}: {{W-|bua|табан}} * {{Z|pcc}}: {{W-|pcc|hac}} * {{Z|cia}}: {{W-|cia|lima}} * {{Z|coj}}: {{W-|coj|sarap}} * {{Z|dz}}: {{W-|dz|ལྔ}} (numeral: {{W-|bo|༥}}) * {{Z|cow}}: {{W-|cow|čílačš}} * {{Z|cro}}: {{W-|cro|chiaxxó}} * {{Z|ccc}}: {{W-|ccc|pichka}} * {{Z|cja}}: {{W-|cja|ليما}} * {{Z|cjm}}: {{W-|cjm|ꨤꨟꨩ|tr=lamư’}}, {{W-|cjm|ꨤꨪꨟꨩ|tr=limư’}} * {{Z|ce}}: {{W-|ce|пхиъ}} * {{Z|cs}}: {{W+|cs|pět}}, {{W-|cs|patery}} * {{Z|cdm}}: {{W-|cdm|पोङा|tr=ponga}} * {{Z|chr}}: {{W-|chr|ᎯᏍᎩ}} * {{Z|chn}}: {{W-|chn|qwinəm}} * {{Z|ny}}: {{W-|ny|sanu}} * {{Z|cic}}: {{W-|cic|talhlhá'pi}}, {{W-|cic|tulhape}} * {{Z|zh}}: *: {{Z|yue}}: {{W+|yue|五|tr=ng5}} *: {{Z|dng}}: {{W-|dng|ву}} *: {{Z|hak}}: {{W-|hak|五|tr=ng3}} *: {{Z|cmn}}: {{W+|cmn|五|tr=wǔ}} (numeral: {{W+|cmn|伍}}) *: {{Z|cdo}}: {{W-|cdo|五|tr=ngū}}, {{W-|cdo|五|tr=ngô}} *: {{Z|nan}}: {{W+|nan|五|tr=go, ngò}}, {{W+|nan|五|tr=ngou6}} *: {{Z|wuu}}: {{W-|wuu|五}} * {{Z|ctu}}: {{W-|ctu|jo'p'ej}} * {{Z|ckt}}: {{W-|ckt|мэтлыӈэн|tr=mėtlyṇėn}} * {{Z|cv}}: {{W-|cv|пиллӗк|sc=Cyrl}}, {{W-|cv|пилӗк|sc=Cyrl}} * {{Z|chk}}: {{W-|chk|nimu}}, {{W-|chk|nime-}}, {{W-|chk|nimechö}}, {{W-|chk|nimmön}} * {{Z|dlm}}: {{W-|dlm|čenc}} * {{Z|da}}: {{W+|da|fem}} * {{Z|dar}}: {{W-|dar|шол}} * {{Z|tfn}}: {{W-|tfn|ch'qilu}} * {{Z|dv}}: {{W-|dv|ފަސް}} * {{Z|dlg}}: {{W-|dlg|биэс}} * {{Z|duu}}: {{W-|duu|pv'nga}} * {{Z|dtp}}: {{W-|dtp|limo}} * {{Z|erk}}: {{W-|erk|ilim}} * {{Z|id}}: {{W+|id|lima}} * {{Z|ar}}: {{W+|ar|خَمْسَة}} (numeral: {{W-|ar|٥}}) *: {{Z|arz}}: {{W-|arz|خمسة|tr=ḵamsa|sc=Arab}} * {{Z|hy}}: {{W+|hy|հինգ}} * {{Z|myv}}: {{W-|myv|вете}} * {{Z|eo}}: {{W+|eo|kvin}} * {{Z|et}}: {{W+|et|viis}} * {{Z|gez}}: {{W-|gez|ኀምስቱ|n|sc=Ethi}}, {{W-|gez|ኀምስ|m|sc=Ethi}} (numeral: {{W-|gez|፭}}) * {{Z|eve}}: {{W-|eve|ту̇нӈа̇н}} * {{Z|evn}}: {{W-|evn|тунӈа}} * {{Z|ee}}: {{W-|ee|atɔ̃}} * {{Z|ext}}: {{W-|ext|cincu}} * {{Z|fa}}: {{W+|fa|پنج|tr=panj}} (numeral: {{W-|fa|۵}}) * {{Z|ddg}}: {{W-|ddg|lime}} * {{Z|fo}}: {{W+|fo|fimm}} * {{Z|fi}}: {{W+|fi|viisi}} * {{Z|fro}}: {{W-|fro|cinc}} * {{Z|fr}}: {{W+|fr|cinq}} *: {{Z|fro}}: {{W-|fro|cinc}} * {{Z|fur}}: {{W-|fur|cinc}} * {{Z|frr}}: *: {{Z|frr}}: {{W-|frr|fiiw}} *: {{Z|frr}}: {{W-|frr|fiuw}} *: {{Z|frr}}: {{W-|frr|fif}} * {{Z|ofs}}: {{W-|ofs|fīf}} * {{Z|stq}}: {{W-|stq|fieuw}} * {{Z|fy}}: {{W+|fy|fiif}} * {{Z|gd}}: {{W-|gd|còig}}, {{W-|gd|còignear|n}} * {{Z|gl}}: {{W+|gl|cinco}} * {{Z|cab}}: {{W-|cab|seingü}} * {{Z|cel-gau}}: {{W-|cel-gau|pempe}} * {{Z|gaa}}: {{W-|gaa|enumɔ}} * {{Z|glk}}: {{W-|glk|پنج|tr=panj}} * {{Z|got}}: {{W-|got|𐍆𐌹𐌼𐍆}} * {{Z|gu}}: {{W-|gu|પાંચડો}} (numeral: [[૫]]) * {{Z|ka}}: {{W+|ka|ხუთი}} * {{Z|gn}}: {{W+|gn|po}} * {{Z|hts}}: {{W-|hts|botano}} and inflections * {{Z|ht}}: {{W-|ht|senk}} * {{Z|haw}}: {{W-|haw|lima}}, {{W-|haw|ʻelima}} * {{Z|ha}}: {{W-|ha|biyar|cuda=bìyar̃}} * {{Z|mba}}: {{W-|mba|lalima}} * {{Z|hi}}: {{W+|hi|पाँच}} (numeral: {{W+|hi|५}}), {{W+|hi|पंच}}, {{W+|hi|पंज}}, {{W+|hi|पंजा}} * {{Z|ho}}: {{W-|ho|ima}} * {{Z|meu}}: {{W-|meu|ima}} * {{Z|lic}}: {{W-|lic|ba}} * {{Z|mww}}: {{W-|mww|tsib}} * {{Z|nl}}: {{W+|nl|vijf}} * {{Z|hop}}: {{W-|hop|tsivot}} * {{Z|hrx}}: {{W-|hrx|finnef}} * {{Z|huz}}: {{W-|huz|лъино}} * {{Z|he}}: {{W+|he|חָמֵשׁ|tr=khamésh|m}}, {{W+|he|חֲמִשָּׁה|n|tr=khamisha}} * {{Z|io}}: {{W+|io|kin}} * {{Z|ig}}: {{W-|ig|ise}} * {{Z|ilo}}: {{W-|ilo|lima}} * {{Z|ang}}: {{W-|ang|fif}} * {{Z|enm}}: {{W-|enm|five}} * {{Z|en}}: {{W+|en|five}} * {{Z|izh}}: {{W-|izh|viis}} * {{Z|ia}}: {{W+|ia|cinque}} * {{Z|ill}}: {{W-|ill|lima}} * {{Z|ga}}: {{W+|ga|cúig}} *: {{Z|sga}}: {{W-|sga|cóic}} * {{Z|ist}}: {{W-|ist|sinque}} * {{Z|ruo}}: {{W-|ruo|ćinć}} * {{Z|it}}: {{W+|it|cinque}} * {{Z|ium}}: {{W-|ium|biaa}} * {{Z|is}}: {{W+|is|fimm}} * {{Z|ja}}: {{W+|ja|五|tr=ご, go}}, {{W+|ja|五つ|tr=いつつ, itsutsu}} * {{Z|jra}}: {{W-|jra|rơma}} * {{Z|kaw}}: {{W-|kaw|lima}} * {{Z|juc}}: {{W-|juc|ʃundʒa}} * {{Z|quc}}: {{W-|quc|jo'ob'}} * {{Z|kbd}}: {{W-|kbd|тху}} * {{Z|kab}}: {{W-|kab|semmus|n}}, {{W-|kab|semmuset|m}}, {{W-|kab|xemsa}} * {{Z|kl}}: {{W+|kl|tallimat}} * {{Z|xal}}: {{W-|xal|тавн}} * {{Z|kn}}: {{W+|kn|ಐದು|sc=Knda}} (numeral: {{W+|kn|೫}}) * {{Z|kr}}: {{W-|kr|úgù}} * {{Z|kea}}: {{W-|kea|sinku}} * {{Z|cak}}: {{W-|cak|wo'o'}} * {{Z|krc}}: {{W-|krc|беш}} * {{Z|kdr}}: {{W-|kdr|bieš}} * {{Z|xqa}}: {{W-|xqa|بٖيشْ|tr=bḗš}} * {{Z|krl}}: {{W-|krl|viisi}} * {{Z|csb}}: {{W-|csb|piãc}} * {{Z|ca}}: {{W+|ca|cinc}} * {{Z|zku}}: {{W-|zku|mila}}, {{W-|zku|yarapurla kuma}} * {{Z|qu}}: {{W-|qu|pichka}}, {{W-|qu|pisqa}}, {{W-|qu|pichka}}, {{W-|qu|phisqa}}, {{W-|qu|picga}}, {{W-|qu|pizga}} * {{Z|kha}}: {{W-|kha|san}} * {{Z|kjj}}: {{W-|kjj|пхьу}} * {{Z|klb}}: {{W-|klb|salchipam}} * {{Z|krj}}: {{W-|krj|lima}} * {{Z|ky}}: {{W+|ky|беш|sc=Cyrl}} * {{Z|kg}}: {{W-|kg|tanu}} * {{Z|si}}: {{W+|si|පහ}} * {{Z|rw}}: {{W-|rw|gatanu}} * {{Z|gil}}: {{W-|gil|nimaua}} * {{Z|kpv}}: {{W-|kpv|вит}} * {{Z|wni}}: {{W-|wni|tsanu|cuda=-tsanu}} * {{Z|ko}}: {{W+|ko|다섯}}, {{W+|ko|오}}, {{W+|ko|五}} * {{Z|kw}}: {{W-|kw|pymp}} * {{Z|co}}: {{W+|co|cinqui}} * {{Z|lou}}: {{W-|lou|sink}} * {{Z|mfe}}: {{W-|mfe|senk}} * {{Z|cr}}: {{W-|cr|nîyânan}} *: {{Z|crk}}: {{W-|crk|niyānan}} * {{Z|nai-kum}}: {{W-|nai-kum|sarap}} * {{Z|lld}}: {{W-|lld|cinch}} * {{Z|lkt}}: {{W-|lkt|záptaŋ}} * {{Z|ltg}}: {{W-|ltg|pīci|n}}, {{W-|ltg|pīcys|m}} * {{Z|la}}: {{W+|la|quīnque}} * {{Z|lv}}: {{W+|lv|pieci|n}}, {{W-|lv|piecas|m}} * Lenape: *: {{Z|unm}}: {{W-|unm|palenàxk}} * {{Z|lo}}: {{W-|lo|ຫ້າ}} (numeral: {{W-|lo|໕}}) * {{Z|lez}}: {{W-|lez|вад}} * {{Z|ln}}: {{W-|ln|mítáno}} * {{Z|lij}}: {{W-|lij|çìnque}} * {{Z|lt}}: {{W+|lt|penki|n}}, {{W-|lt|penkios|m}} * {{Z|liv}}: {{W-|liv|vīž}} * {{Z|lmo}}: {{W-|lmo|çinc}}, {{W-|lmo|çincu}} * {{Z|khb}}: {{W-|khb|ᦠᦱᧉ}} (numeral: [[᧕]]) * {{Z|lb}}: {{W+|lb|fënnef}} * {{Z|mhn}}: {{W-|mhn|vinf}} * {{Z|mad}}: {{W-|mad|lɛma}} * {{Z|mdh}}: {{W-|mdh|lima}} * {{Z|mkz}}: {{W-|mkz|lima}} * {{Z|mak}}: {{W-|mak|lima}} * Malay: *: {{Z|ms}}: {{W+|ms|ليم|sc=Arab}}, {{W-|ms|ڤنچا|sc=Arab}} *: Rûmî: {{W+|ms|lima}}, {{W-|ms|panca}} * {{Z|mk}}: {{W+|mk|пет}} * {{Z|ml}}: {{W-|ml|അഞ്ചു|sc=Mlym}}, {{W+|ml|അഞ്ച്|sc=Mlym}} (numeral: [[൫]]) * {{Z|mt}}: {{W+|mt|ħamsa}} * {{Z|mnc}}: {{W-|mnc|ᠰᡠᠨᠵᠠ}} * {{Z|mrv}}: {{W-|mrv|rima}} * {{Z|gv}}: {{W-|gv|queig}} * {{Z|msk}}: {{W-|msk|lima}} * {{Z|mrw}}: {{W-|mrw|lima}} * {{Z|mr}}: {{W-|mr|पाच}} * {{Z|mhr}}: {{W-|mhr|визыт}} * {{Z|mrc}}: {{W-|mrc|sarapk}}, {{W-|mrc|srap}} * {{Z|mh}}: {{W-|mh|ļalem}} * {{Z|mat}}: {{W-|mat|rokut'a}} * {{Z|yua}}: {{W-|yua|jo'}} * {{Z|mzn}}: {{W-|mzn|پنج|tr=panj}} * {{Z|hu}}: {{W+|hu|öt}} * {{Z|lus}}: {{W-|lus|pa-nga}} * {{Z|min}}: {{W-|min|limo}} * {{Z|mwl}}: {{W-|mwl|cinco}} * {{Z|mov}}: {{W-|mov|tharap}} * {{Z|mdf}}: {{W-|mdf|вете}} * {{Z|mn}}: *: Kirîlî: {{W+|mn|тав}} *: Mongolî: {{W-|mn|ᠲᠠᠪᠤ}}, {{W-|mn|᠕}} * {{Z|mnw}}: {{W-|mnw|မသုန်}} * {{Z|moe}}: {{W-|moe|patetat}} * {{Z|mlm}}: {{W-|mlm|ŋɔ⁴}} * {{Z|mtq}}: {{W-|mtq|đằm}}, {{W-|mtq|đăm}} * {{Z|nah}}: {{W+|nah|makwilli}}, {{W+|nah|macuilli}} * {{Z|naq}}: {{W-|naq|koro}} * {{Z|nmb}}: {{W-|nmb|iləm'}} * {{Z|gld}}: {{W-|gld|тойңга}} * {{Z|nap}}: {{W-|nap|cìnche}} * {{Z|nv}}: {{W-|nv|ashdlaʼ}} * {{Z|na}}: {{W+|na|aijimo}} * {{Z|nds}}: *: {{Z|nds-de}}: {{W-|nds-de|fîf}} * {{Z|yrk}}: {{W-|yrk|самляӈг}} * {{Z|ne}}: {{W+|ne|पाँच}} * {{Z|hlt}}: {{W-|hlt|panga}} * {{Z|niv}}: {{W-|niv|тʼорӈ}} * {{Z|niu}}: {{W-|niu|lima}} * {{Z|non}}: {{W-|non|fimm}} * {{Z|no}}: {{W+|no|fem}} * {{Z|ood}}: {{W-|ood|hetasp}} * {{Z|cst}}: {{W-|cst|parwes}} * {{Z|css}}: {{W-|css|parue}} * {{Z|oj}}: {{W-|oj|naanan}} * {{Z|oc}}: {{W+|oc|cinc}} * {{Z|or}}: {{W+|or|ପାଞ୍ଚ}} (numeral: {{W-|or|୫}}) * {{Z|oac}}: {{W-|oac|туӈа}} * {{Z|om}}: {{W+|om|shan}} * {{Z|orh}}: {{W-|orh|tʊŋŋa}} * {{Z|os}}: {{W-|os|фондз|sc=Cyrl}} * {{Z|ota}}: {{W-|ota|بش|tr=beš|sc=ota-Arab}} * {{Z|ug}}: {{W+|ug|بەش|sc=ug-Arab}} * {{Z|uz}}: {{W+|uz|besh}} * {{Z|pac}}: {{W-|pac|xông}} * {{Z|ppi}}: {{W-|ppi|sirap}} * {{Z|pau}}: {{W-|pau|eim}} * {{Z|pap}}: {{W-|pap|sinku}} * {{Z|bxd}}: {{W-|bxd|ŋa³¹}} * {{Z|ps}}: {{W-|ps|پنځه|tr=pinjë|sc=ps-Arab}} * {{Z|pms}}: {{W-|pms|sinch}} * {{Z|pis}}: {{W-|pis|faef}} * {{Z|ppl}}: {{W-|ppl|makwil}}, {{W-|ppl|macuil}} * {{Z|pl}}: {{W+|pl|pięć}}, {{W+|pl|pięcioro}} * {{Z|pt}}: {{W+|pt|cinco}} * {{Z|pa}}: {{W-|pa|ਪੰਜ}} (numeral: {{W-|pa|੫}}) * {{Z|kk}}: {{W+|kk|бес|sc=Cyrl}} * {{Z|rah}}: {{W-|rah|বৗং}} * {{Z|lml}}: {{W-|lml|lima}} * {{Z|rap}}: {{W-|rap|ka [[rima]]}} * {{Z|rar}}: {{W-|rar|rima}} * {{Z|rth}}: {{W-|rth|lima}} * {{Z|raw}}: {{W-|raw|pvngwà}} * {{Z|rhg}}: {{W-|rhg|fañs}} * {{Z|rgn}}: {{W-|rgn|zéncv}} * {{Z|rom}}: {{W-|rom|panʒ}} *: {{Z|rmf}}: {{W-|rmf|pangȟ}} * {{Z|ro}}: {{W+|ro|cinci}} * {{Z|rug}}: {{W-|rug|lima}} * {{Z|ru}}: {{W+|ru|пять}}, {{W+|ru|пя́теро}} * {{Z|rue}}: {{W-|rue|пять|sc=Cyrl}} * {{Z|ksw}}: {{W-|ksw|ယဲၢ်}} * {{Z|ssy}}: {{W-|ssy|koon}} * Samî: *: {{Z|smn}}: {{W-|smn|vittâ}} *: {{Z|se}}: {{W-|se|vihtta}} *: {{Z|sms}}: {{W-|sms|vitt}} *: {{Z|sma}}: {{W-|sma|vïjhte}} * {{Z|sma}}: {{W-|sma|vïjhte}} * {{Z|sm}}: {{W+|sm|lima}} * {{Z|sg}}: {{W+|sg|ukü}} * {{Z|sa}}: {{W+|sa|पञ्चन्|tr=páñcan}} * {{Z|sat}}: {{W-|sat|ᱢᱚᱬᱮ}}, {{W-|sat|ᱢᱚᱬᱮᱸ}} * {{Z|srs}}: {{W-|srs|gúùt'áá}} * Sardinian: *: {{Z|sc}}: {{W-|sc|cincu}} *: {{Z|sc}}: {{W-|sc|chimbe}} * {{Z|ceb}}: {{W-|ceb|lima}} * {{Z|sea}}: {{W-|sea|limak}} * {{Z|scn}}: {{W+|scn|cincu}} * {{Z|sid}}: {{W-|sid|onte}} * {{Z|csm}}: {{W-|csm|máš·ok·a-}} * {{Z|szl}}: {{W-|szl|pjyńć}} * {{Z|sd}}: {{W-|sd|پنج|cuda=پَنجَ|tr=panja}} * {{Z|srn}}: {{W-|srn|feifi}}, {{W-|srn|feyfi}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|пе̑т}} *: Latînî: {{W-|sh|pȇt}} * {{Z|sip}}: {{W-|sip|ང}} * {{Z|sco}}: {{W-|sco|five}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|пѧть|sc=Cyrs}} (numeral: [[е҃]]) *: Glagolîtîk: {{W-|cu|ⱂⱔⱅⱐ|sc=Glag}} * {{Z|sk}}: {{W+|sk|päť}} * {{Z|sl}}: {{W+|sl|pét}} * {{Z|tuw-sol}}: {{W-|tuw-sol|tonga}} * {{Z|so}}: {{W+|so|shan}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|pěś}} *: {{Z|hsb}}: {{W-|hsb|pjeć}} * {{Z|es}}: {{W+|es|cinco}} * {{Z|suk}}: {{W-|suk|itaano}} * {{Z|sw}}: {{W+|sw|tano}} * {{Z|ss}}: {{W-|ss|hlanu}} * {{Z|sv}}: {{W+|sv|fem}} * {{Z|shn}}: {{W-|shn|ႁႃႈ}} (numeral: [[႕]]) * {{Z|tg}}: {{W+|tg|панҷ|sc=Cyrl}} * {{Z|tl}}: {{W+|tl|lima}} * {{Z|ty}}: {{W-|ty|pae}} * {{Z|ta}}: {{W+|ta|ஐந்து}} (numeral: {{W-|ta|௫}}), {{W+|ta|ஐந்து|sc=Taml}} * {{Z|txg}}: {{W-|txg|𗏁}} * {{Z|twf}}: {{W-|twf|p’ą́nyuo}} * {{Z|tar}}: {{W-|tar|marí}} * {{Z|roa-tar}}: {{W-|roa-tar|cinghe}} * {{Z|trv}}: {{W-|trv|lima}} * {{Z|shi}}: {{W-|shi|semmos|n}}, {{W-|shi|semmost|m}} * {{Z|tsg}}: {{W-|tsg|lima}} * {{Z|blt}}: {{W-|blt|ꪬ꫁ꪱ}} * {{Z|nod}}: {{W-|nod|ᩉ᩶ᩣ}} * {{Z|th}}: {{W+|th|ห้า}} (numeral: {{W+|th|๕}}) * {{Z|tdd}}: {{W-|tdd|ᥞᥣᥲ}} * {{Z|tbl}}: {{W-|tbl|limu}} * {{Z|ctd}}: {{W-|ctd|nga}} * {{Z|te}}: {{W+|te|ఐదు}} (numeral: {{W+|te|౫}}) * {{Z|tzm}}: {{W-|tzm|ⵙⵎⵎⵓⵙ|sc=Tfng}} * {{Z|tft}}: {{W-|tft|romtoha}} * {{Z|crh}}: {{W-|crh|beş}} * {{Z|tt}}: {{W+|tt|биш|sc=Cyrl}} * {{Z|tet}}: {{W-|tet|lima}} * {{Z|tvo}}: {{W-|tvo|romotoha}} * {{Z|tig}}: {{W-|tig|ሐምስ|sc=Ethi}} (numeral: {{W-|tig|፭}}) * {{Z|ti}}: {{W-|ti|ሓሙሽተ|sc=Ethi}} (numeral: {{W-|ti|፭}}) * {{Z|otk}}: {{W-|otk|𐰋𐰃𐱁|ts=béš}} * {{Z|tr}}: {{W+|tr|beş}} * {{Z|tk}}: {{W+|tk|bäş}} * {{Z|bo}}: {{W-|bo|ལྔ|sc=Tibt}} (numeral: {{W-|bo|༥}}) * {{Z|ocu}}: {{W-|ocu|kuit'aa}} * {{Z|tpi}}: {{W-|tpi|faipela}} * {{Z|to}}: {{W-|to|nima}} * {{Z|ttj}}: {{W-|ttj|taano}}, {{W-|ttj|itaano}} * {{Z|xto}}: {{W-|xto|päñ}} * {{Z|txb}}: {{W-|txb|piś}} * {{Z|tn}}: {{W-|tn|tlhano}} * {{Z|tum}}: {{W-|tum|nkhonde}} * {{Z|tvl}}: {{W-|tvl|lima}} * {{Z|tzj}}: {{W-|tzj|kho’o}} * {{Z|ude}}: {{W-|ude|туӈа}} * {{Z|udi}}: {{W-|udi|хъо}} * {{Z|udm}}: {{W-|udm|вить}} * {{Z|xum}}: {{W-|xum|𐌐𐌖𐌌𐌐𐌄}} * {{Z|ur}}: {{W-|ur|پانچ|tr=pāñc|sc=ur-Arab}} * {{Z|uby}}: {{W-|uby|ʃxə}} * {{Z|uk}}: {{W+|uk|п'ять}} * {{Z|vec}}: {{W-|vec|sinque}}, {{W-|vec|zsinque}} * {{Z|vep}}: {{W-|vep|viž}} * {{Z|vi}}: {{W+|vi|năm}} * {{Z|vo}}: {{W+|vo|lul}} * {{Z|vro}}: {{W-|vro|viiś}} * {{Z|vot}}: {{W-|vot|viis}}, {{W-|vot|viisi}} * {{Z|wls}}: {{W-|wls|nima}} * {{Z|wa}}: {{W+|wa|cénk}} * {{Z|war}}: {{W-|war|lima}} * {{Z|cy}}: {{W+|cy|pump}} * {{Z|wrh}}: {{W-|wrh|marra}} * {{Z|wym}}: {{W-|wym|fynf}} * {{Z|win}}: {{W-|win|saacą}} * {{Z|wo}}: {{W-|wo|juróom}} * {{Z|kjh}}: {{W-|kjh|пис}} * {{Z|kca}}: {{W-|kca|вет}} * {{Z|km}}: {{W+|km|ប្រាំ}} (hejmar: {{W-|km|៥}}) * {{Z|xh}}: {{W-|xh|hlanu}} * {{Z|yai}}: {{W-|yai|панч}} * {{Z|yka}}: {{W-|yka|lime}} * {{Z|sah}}: {{W-|sah|биэс|sc=Cyrl}} * {{Z|yao}}: {{W-|yao|msano}} * {{Z|yaq}}: {{W-|yaq|mámni}} * {{Z|yi}}: {{W-|yi|פֿינף}} * {{Z|ii}}: {{W-|ii|ꉬ}} * {{Z|yo}}: {{W-|yo|márùn-ún}} * {{Z|esu}}: {{W-|esu|talliman}} * {{Z|el}}: {{W+|el|πέντε}}, {{W-|el|ε΄}} *: Kevn: {{W-|grc|πέντε}}, {{W-|grc|ε΄}} * {{Z|zea}}: {{W-|zea|vuuf}}, {{W-|zea|vuve}} * {{Z|za}}: {{W-|za|ngux}}, {{W-|za|haj}} (''Sawndip'' [[五]]) * {{Z|zom}}: {{W-|zom|nga}} * {{Z|zu}}: {{W-|zu|hlanu}} * {{Z|zun}}: {{W-|zun|apde}} {{werger-bin}} === Navdêr === {{navdêr|ku|z=n}} # [[hejmar|Hejmara]] [[5]]. ==== Tewandin ==== {{ku-tewîn-nav|nêr}} ==== Werger ==== {{werger-ser}} * {{Z|fr}}: {{W+|fr|cinq|n}} * {{Z|en}}: {{W+|en|five}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=cênp|PCên}} 9wr6e48vbmwaunwcv78c60dk4t23v72 kirin 0 3487 6532111 6427009 2026-09-18T20:42:53Z Wikihez 7344 Kurmancî/Lêker: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532111 wikitext text/x-wiki {{h-bnr|kirîn}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{deng|ku|LL-Q36163_(kmr)-Key Mîrza-kirin.wav|dever=Wan}} * {{ku-kîte}} === Lêker === {{ku-tewîn-lk|kirin|form=gerguhêz|niha=k|borî=kir}} [[Wêne:Lewis_Hine_Power_house_mechanic_working_on_steam_pump.jpg|thumb|Kesek kar '''dike'''. Peyvên ''[[kar]]'' û ''[[kirin#Kurdî|kirin]]'' [[hevreh]] in.]] {{lêker|ku|c=x-gh}}, {{bilêv|k|nerm}} # [[bi cih anîn]], [[pêk anîn]], [[encam dan]] #: {{mk|ku|Tu çi '''dikî'''?}} #: {{mk|ku|'''Bikin'''! – '''Neke'''! – '''Meke'''!}} #: {{mk|ku|Min hemû ev kar '''kiriye'''.}} #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Were nîşanê Nişanî de xwe bêperde seher<br />Lê ji xûnê '''bike''' perhîz ku şehîdan çi hisab}} # [[niyet]] hebûn, [[li ber bûn]], [[biniyet]] bûn, [[hewl]] dan, [[armanc]] bûn #: {{mk|ku|Min '''dikir''' bipirsim lê ez newêriyam.}} # [[nêzîk]] bûn, [[kêm]] man ku tiştek [[qewimîn|biqewime]] #: {{mk|ku|Ji qehran '''dike''' xwe bikuje.}} # [[lîstin]], [[pê ve]] [[mijûl]] bûn #: {{mk|ku|Ez futbolê '''dikim'''.|Ez futbolê dilîzim.|birêz=1}} # [[zewicîn]], [[mêr]] kirin, [[şû]] kirin, [[jin anîn]], wek [[hevser]] [[qebûl]] kirin #: {{mk|ku|Ez bêmêr bimirim jî, ez te '''nakim'''.}} # [[gan]] kirin, [[seks]] kirin # [[xwestin]] #* {{jêder-kitêb|ku|jêgirtin= '''Kir''' ku ji avê derbas bibe. |nivîskar={{w|Mela Mûsayê Hekarî}}|sernav=Durrû’l Mecalîs|amadekar=Hêmin Omer|sala weşandinê=2022|sal=1857|rûpel=116}} # {{înm|wek [[lêkera sivik|lêkereke sivik]] bo çêkirina [[lêker]]ên [[nû]] ji [[navdêr]] û [[rengdêr]]an}} #: {{mk|ku|[[qebûl kirin]], [[razî kirin]], [[xwedî kirin]], [[dest pê kirin]]}} #: {{mk|ku|[[mezin kirin]], [[xurt kirin]], [[bihêz kirin]], [[perîşan kirin]]}} ==== Bi alfabeyên din ==== * {{ku-ar|کرن}} * {{ku-kr|кьрьн}} ==== Jê ==== {{agadarî|Agadarî}}: Gelek peyv bi alîkariya [[lêkera sivik]] ya "kirin" tên çêkirin loma rêzkirina hemûyan li vir ne mimkin e. Bnr. '''[[:Kategorî:Tewandin:lêkerên pêkhatî yên kurmancî li gel "kirin"|Lêkerên li gel "kirin" (pêkhatî)]]''', '''[[:Kategorî:Peyvên kurmancî yên hevedudanî bi kirin|Peyvên kurmancî yên hevedudanî bi kirin]]. ==== Etîmolojî ==== {{etîmon|ku|:mîr<metn:Taliyê ji>|ine-pro:*kʷer-<t:kirin, [[çêkirin]], [[ava kirin]]>|dar=1|metn=++}} {{veşêre-ser|Bêhtir malûmat û hevreh}} Hevreha soranî {{g|ckb|کردن}}, kurdiya başûrî {{q|sdh|kirdin|sc=Latn}}, lekî {{q|lki|kirdin|sc=Latn}}, goranî/hewramî {{q|hac|kerdey|sc=Latn}}, zazakî {{q|zza|kerdene}}, farisî {{g|fa|کردن|tr=kerden}}, tacikî {{g|tg|кардан|tr=kardan}}, partî {{g|xpr|𐭪𐭫𐭲|tr=kirt}}, pehlewî {{g|pal|𐭪𐭫𐭲|tr=kirt}}, avestayî {{g|ae|𐬐𐬆𐬭𐬆𐬙𐬀|tr=kərəta|w=[[kirî]]}} û {{g|ae|𐬐𐬆𐬭𐬆𐬥𐬀𐬊𐬌𐬙𐬌‎|tr=kərənaoiti|w=ew dike}}, hexamenişî {{g|peo|𐎠𐎤𐎢𐎫𐎠|tr=a-ku-u-t-a /akutā/|w=wî kir}}, sanskrîtî {{g|sa|कृणोति|tr=kṛṇóti}} û {{g|sa|करोति|tr=karóti}}, hindî {{g|hi|करना|tr=kerna}}, ûrdûyî {{g|ur|کرنا|tr=kerna}}, hîtîtî {{g|hit|𒆪𒂊𒅕𒋫|tr=ku-e-er-ta|w=kir}} û {{g|hit|𒆪𒅕𒈪|tr=ku-er-mi|w=dikim}}, lîtwanî {{q|lt|kùrti|w=kirin, çêkirin, ava kirin}} û {{q|lt|kerė́ti|w=[[sihr]] kirin}}, rûsî {{q|ru|ча́ры|tr=čáry|w=[[sihr]]kirin}}. Ji heman rehî herwiha peyva {{q|ku|kar}} û paşgirên {{q|ku|-kar}}, {{q|ku|-ker}}, {{q|ku|-gar}}, {{q|ku|-ger}} (''-ger'' wek bo nimûne di peyva {{q|ku|asinger}}, {{q|ku|hesinger}} de). Peyv ji zimanekî [[hindûîranî]] ketiye hinek zimanên [[ûralî]] jî, bo nimûne: ûdmûrtî {{g|udm|карыны|tr=karini}} û komî-permyakî {{g|koi|керны|tr=kêrni}}. Wek paşgirên {{q|ku|-kâr}}, {{q|ku|-ker}}, {{q|ku|-gâr}} ketiye tirkî û gelek zimanên din jî yên [[tirkîkî]], bo nimûne di van peyvên tirkî de: {{q|tr|muhafazakâr}}, {{q|tr|peyker}}, {{q|tr|rüzgâr}} û bi dehan an bi sedan peyvên din. ;{{biçûk|Çavkanî: * {{Cheung}} * {{Chyet}} * {{Derksen}} * {{Kloekhorst}} * {{Lubotsky}} * {{Mallory}} * {{Tsabolov}} }} {{veşêre-bin}} ==== Bi zaravayên din ==== * {{Z|hac}}: {{W-|hac|kerdey|sc=Latn}} * {{Z|sdh}}: {{W-|sdh|کردن}}, {{W-|sdh|kirdin|sc=Latn}} * {{Z|lki}}: {{W-|lki|کردن}}, {{W-|lki|kirdin|sc=Latn}} * {{Z|ckb}}: {{W-|ckb|کردن|tr=kirdin}} * {{Z|zza}}: {{W-|zza|kerdene}} ==== Werger ==== {{werger-ser|bi cih anîn, encam dan, çêkirin (1)}} * {{Z|af}}: {{W+|af|doen}} * {{Z|sq}}: {{W+|sq|bëj}} * {{Z|de}}: {{W+|de|tun}}, {{W+|de|machen}} *: {{Z|gsw}}: {{W-|gsw|tue}} * {{Z|am}}: {{W-|am|ማድረግ}} * {{Z|an}}: {{W+|an|fer}} * {{Z|aii}}: {{W-|aii|ܥܵܒ݂ܹܕ|tr=ʿawed}} * {{Z|rup}}: {{W-|rup|fac}} * {{Z|as}}: {{W-|as|কৰ}} * {{Z|ast}}: {{W+|ast|facer}} * {{Z|ask}}: {{W-|ask|ko}} * {{Z|ain}}: {{W-|ain|キ|tr=ki}} * {{Z|az}}: {{W-|az|eləmək}}, {{W+|az|etmək}}, {{W-|az|qılmaq}} * {{Z|ban}}: {{W-|ban|gaé}} * {{Z|eu}}: {{W-|eu|egin}} * {{Z|be}}: {{W-|be|рабі́ць|impf}}, {{W-|be|зрабі́ць|pf}} * {{Z|bn}}: {{W-|bn|করা}} * {{Z|bqi}}: {{W-|bqi|کردن|tr=kerden}} * {{Z|br}}: {{W+|br|ober}} * {{Z|bg}}: {{W-|bg|пра́вя}} * {{Z|my}}: {{W+|my|လုပ်}}, {{W+|my|ပြု}} * {{Z|ce}}: {{W-|ce|да}}, {{W-|ce|дан}} * {{Z|cs}}: {{W-|cs|dělat|impf}}, {{W-|cs|udělat|pf}} * {{Z|chr}}: {{W-|chr|ᎾᏛᏁᎭ}} * {{Z|zh}}: *: {{Z|cmn}}: {{W-|cmn|做|tr=zuò}}, {{W+|cmn|作|tr=zuò}} * {{Z|cv}}: {{W-|cv|ту}} * {{Z|dlm}}: {{W-|dlm|fur}} * {{Z|da}}: {{W+|da|gøre}}, {{W-|da|udføre}} * {{Z|id}}: {{W+|id|buat}}, {{W+|id|laku}}, {{W+|id|melakukan}} * {{Z|ar}}: {{W-|ar|فَعَلَ}}, {{W-|ar|عَمِلَ}} *: {{Z|arq}}: {{W-|arq|دار}} *: {{Z|arz}}: {{W-|arz|عمل|tr=ʕamal}} *: {{Z|acw}}: {{W-|acw|سَوَّى|tr=sawwa}} * {{Z|hy}}: {{W+|hy|անել}} * {{Z|eo}}: {{W+|eo|fari}} * {{Z|et}}: {{W+|et|tegema}} * {{Z|ext}}: {{W-|ext|hazel}} * {{Z|fa}}: {{W-|fa|کَردَن|tr=kardan}} * {{Z|fi}}: {{W-|fi|tehdä}} * {{Z|fr}}: {{W-|fr|faire}} * {{Z|fur}}: {{W-|fur|fâ}} * {{Z|frr}}: {{W-|frr|düünj}}, {{W-|frr|du}} * {{Z|fy}}: {{W-|fy|dwaan}} * {{Z|gd}}: {{W-|gd|dèan}} * {{Z|gl}}: {{W+|gl|facer}} * {{Z|got}}: {{W-|got|𐍄𐌰𐌿𐌾𐌰𐌽}} * {{Z|ka}}: {{W+|ka|კეთება}} * {{Z|gn}}: {{W+|gn|japo}} * {{Z|ht}}: {{W-|ht|fè}} * {{Z|hi}}: {{W+|hi|करना}} * {{Z|hil}}: {{W-|hil|buhat}}, {{W-|hil|pagbuhat}} * {{Z|mww}}: {{W-|mww|ua}} * {{Z|nl}}: {{W+|nl|doen}} * {{Z|he}}: {{W-|he|עָשָׂה|tr=asá}},{{W-|he|פָּעַל|tr=pa'al}} * {{Z|io}}: {{W+|io|facar}} * {{Z|ilo}}: {{W-|ilo|aramid}} * {{Z|ang}}: {{W-|ang|dōn}} * {{Z|en}}: {{W+|en|do}}, {{W+|en|perform}}, {{W+|en|execute}} * {{Z|inh}}: {{W-|inh|де}} * {{Z|ia}}: {{W-|ia|facer}} * {{Z|ga}}: {{W-|ga|déan}}, {{W-|ga|dein}} * {{Z|ist}}: {{W-|ist|fà}} * {{Z|it}}: {{W+|it|fare}} * {{Z|is}}: {{W+|is|gera}}, {{W-|is|gjöra}} * {{Z|ja}}: {{W+|ja|する|tr=suru}}, {{W+|ja|やる|tr=yaru}}, {{W-|ja|なさる|tr=nasaru}}, {{W+|ja|致す|tr=いたす, itasu}} * {{Z|jv}}: {{W+|jv|gawe}}, {{W+|jv|gawé}} * {{Z|bsh}}: {{W-|bsh|ku}} * {{Z|xnn}}: {{W-|xnn|ikkan}} * {{Z|kn}}: {{W+|kn|ಮಾಡು}} * {{Z|kea}}: {{W-|kea|faze}} * {{Z|ca}}: {{W-|ca|fer}} * {{Z|qu}}: {{W+|qu|ruray}}, {{W-|qu|rurai}} * {{Z|ks}}: {{W-|ks|کَرُن}} * {{Z|ky}}: {{W-|ky|этүү}} * {{Z|si}}: {{W-|si|කරනවා}} * {{Z|ko}}: {{W+|ko|하다}} * {{Z|co}}: {{W-|co|fà}} * {{Z|mfe}}: {{W-|mfe|fer}} * {{Z|kum}}: {{W-|kum|этмек}} * {{Z|lld}}: {{W-|lld|fé}}, {{W-|lld|fèr}} * {{Z|ltg}}: {{W-|ltg|dareit}} * {{Z|la}}: {{W+|la|faciō}}, {{W+|la|agō}} * {{Z|lv}}: {{W+|lv|darīt}}, {{W-|lv|veikt}} * {{Z|lo}}: {{W+|lo|ເຮັດ}}, {{W-|lo|ທຳ}} * {{Z|lez}}: {{W-|lez|авун}} * {{Z|lt}}: {{W+|lt|daryti}} * {{Z|lmo}}: {{W-|lmo|fà}} * {{Z|mhn}}: {{W-|mhn|mòchen}} * {{Z|mk}}: {{W+|mk|прави}}, {{W-|mk|врши}}, {{W+|mk|направи}} * {{Z|ml}}: {{W+|ml|ചെയ്യുക}} * {{Z|ms}}: {{W+|ms|buat}} * {{Z|mt}}: {{W-|mt|għamel}} * {{Z|mzn}}: {{W-|mzn|هاکردن|tr=hâkërden}} * {{Z|gun}}: {{W-|gun|japo}} * {{Z|hu}}: {{W+|hu|tesz}}, {{W+|hu|csinál}} * {{Z|egy}}: {{W-egy|jrj|h=ir}} * {{Z|mn}}: *: Kirîlî: {{W+|mn|хийх}} * {{Z|nci}}: {{W-|nci|chīhua}} * {{Z|nah}}: {{W+|nah|chīhua}} * {{Z|gld}}: {{W-|gld|анго-}} * {{Z|nap}}: {{W-|nap|fà}} * {{Z|nds}}: *: {{Z|nds-nl}}: {{W-|nds-nl|doan}} *: {{Z|nds-de}}: {{W-|nds-de|doon}} * {{Z|ne}}: {{W+|ne|गर्नु}} * {{Z|nrf}}: {{W-|nrf|faithe}} * {{Z|no}}: *: {{Z|nb}}: {{W+|nb|gjøre}}, {{W+|nb|utføre}} *: {{Z|nn}}: {{W+|nn|gjere}}, {{W+|nn|utføre}} * {{Z|pro}}: {{W-|pro|far}} * {{Z|oc}}: {{W+|oc|far}}, {{W+|oc|har}}, {{W+|oc|faire}} * {{Z|or}}: {{W+|or|କରିବା}} * {{Z|os}}: {{W-|os|кӕнын}} * {{Z|ug}}: {{W-|ug|قىلماق}} * {{Z|uz}}: {{W+|uz|qilmoq}} * {{Z|pi}}: {{W-|pi|karoti}} * {{Z|pap}}: {{W-|pap|hasi}} * {{Z|ps}}: {{W-|ps|کول|tr=kawël}} * {{Z|ppl}}: {{W-|ppl|-chiwa}}, {{W-|ppl|-chihua}} * {{Z|pl}}: {{W+|pl|robić|impf}}, {{W+|pl|zrobić|pf}}, {{W+|pl|czynić|impf}}, {{W+|pl|uczynić|pf}} * {{Z|roa-opt}}: {{W-|roa-opt|fazer}} * {{Z|pt}}: {{W+|pt|fazer}}, {{W+|pt|realizar}} * {{Z|pa}}: {{W-|pa|ਕਰਨਾ}} * {{Z|kk}}: {{W+|kk|істеу}} * {{Z|cop}}: {{W-|cop|ⲉⲓⲣⲉ}} * {{Z|rap}}: {{W-|rap|haka}} * {{Z|rgn}}: {{W-|rgn|fêr}} * {{Z|rm}}: {{W-|rm|far}} * {{Z|ro}}: {{W+|ro|face}} * {{Z|ru}}: {{W-|ru|де́лать|impf}}, {{W-|ru|сде́лать|pf}} * {{Z|rue}}: {{W-|rue|роби́ти|impf}} * {{Z|osx}}: {{W-|osx|dôn}}, {{W-|osx|fremmian}}, {{W-|osx|gifrummian}} * {{Z|sgs}}: {{W-|sgs|darītė}}, {{W-|sgs|dėrbtė}} * {{Z|sa}}: {{W+|sa|करोति|tr=karóti}} *: {{Z|sa}}: {{W+|sa|कृणोति|tr=kṛṇóti}} * {{Z|sc}}: {{W-|sc|fàchere}} *: {{Z|sc}}: {{W-|sc|fai}} * {{Z|ceb}}: {{W-|ceb|buhat}}, {{W-|ceb|buhaton}} * {{Z|scn}}: {{W+|scn|fari}} * {{Z|sd}}: {{W+|sd|ڪَرَڻُ}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|радити}} *: Latînî: {{W+|sh|raditi}}, {{W+|sh|činiti}} * {{Z|syl}}: {{W-|syl|ꠇꠞꠣ}} * {{Z|sco}}: {{W-|sco|dae}} * {{Z|orv}}: {{W-|orv|робити|impf}} * {{Z|sk}}: {{W+|sk|robiť|impf}}, {{W-|sk|urobiť|pf}} * {{Z|sl}}: {{W-|sl|storiti}},{{W-|sl|ukreniti}}, {{W-|sl|narediti}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|cyniś|impf}} *: {{Z|hsb}}: {{W-|hsb|činić|impf}}, {{W-|hsb|sčinić|pf}} * {{Z|es}}: {{W-|es|hacer}} * {{Z|sv}}: {{W+|sv|göra}} * {{Z|shn}}: {{W-|shn|ႁဵတ်း}} * {{Z|tab}}: {{W-|tab|апӏуб}} * {{Z|tg}}: {{W+|tg|кардан}} * {{Z|tl}}: {{W-|tl|gawin}}, {{W-|tl|gumawa}}, {{W-|tl|isagawa}} * {{Z|ta}}: {{W+|ta|செய்}}, {{W+|ta|பண்ணு}} * {{Z|nod}}: {{W-|nod|ᩁᩮᩢ᩠ᨯ}}, {{W-|nod|ᨿᩮ᩠ᨿᩡ}}, {{W-|nod|ᨿᩡ}}, {{W-|nod|ᨿ}} * {{Z|th}}: {{W+|th|ทำ}} * {{Z|te}}: {{W+|te|చేయు}} * {{Z|tt}}: {{W-|tt|эшләү}} * {{Z|tet}}: {{W-|tet|halo}} * {{Z|tr}}: {{W+|tr|yapmak}}, {{W+|tr|etmek}}, {{W+|tr|kılmak}} * {{Z|tk}}: {{W+|tk|etmek}} * {{Z|tpi}}: {{W+|tpi|mekim}}, {{W-|tpi|wokim}} * {{Z|txb}}: {{W-|txb|yām-}} * {{Z|tyv}}: {{W-|tyv|кылыр}} * {{Z|udm}}: {{W-|udm|карыны}} * {{Z|ur}}: {{W-|ur|کَرْنا|tr=karnā}} * {{Z|uk}}: {{W-|uk|роби́ти|impf}}, {{W-|uk|зроби́ти|pf}} * {{Z|vec}}: {{W+|vec|far}} * {{Z|vi}}: {{W+|vi|làm}} * {{Z|wbk}}: {{W-|wbk|ća}} * {{Z|wa}}: {{W+|wa|fé}} * {{Z|wbl}}: {{W-|wbl|car-}} * {{Z|cy}}: {{W-|cy|gwneud}} * {{Z|km}}: {{W+|km|ធ្វើ}} * {{Z|yai}}: {{W-|yai|карак}} * {{Z|yi}}: {{W-|yi|טאָן}} * {{Z|yoi}}: {{W-|yoi|きるん|tr=kirun}} * {{Z|el}}: {{W+|el|κάνω}} *: Kevn: {{W-|grc|πράσσω}}, {{W-|grc|ποιέω}}, {{W-|grc|ῥέζω}}, {{W-|grc|ἔρδω}}, {{W-|grc|δράω}}, {{W-|grc|τελέω}} * {{Z|ase}}: {{W-|ase|C@SideTrunkhigh-PalmDown-C@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}}, {{W-|ase|Claw5@SideTrunkhigh-PalmDown-Claw5@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}} {{werger-bin}} === Navdêr === {{navdêr|z=m|ku}} # [[kar]], [[kiryar]], [[emel]], [[fêl]], [[fealiyet]], [[xebat]], [[şol]], [[encamdan]], [[bicihanîn]], [[çêkirin]] #: {{mk|ku|'''Kirina''' wî karî ne hêsan e.}} #: {{mk|ku|Divê mirov ji '''kirinê''' netirse.}} #* {{jêder-malper|ku|jêgirtin=Di berhemên Fiqih û Usûlu’l-Fiqhê derbas dibe; fermaneke ku '''kirina''' tiştekî/’îbadeketekê di wextê wê lazim bike, qezakirina vê peywira ku di dema xwe nehatiye edakirin jî pêwîst didêre. Ma ev tişt ne rast e? Hûn dikarin di çarçoveya nimêja qeza de vê şîrove bikin?|malper=fetwayenkurdi.com|url=http://www.fetwayenkurdi.com/?p=3995|dîrok=21.07.2019}} #* {{jêder-malper|ku|jêgirtin=Lêkera netêger an jî întransîtîv ew tewre lêker e ku tevger an '''kirina''' wê yekser tesîrê li objektekê nake. Ew çalakî an bûyer bê objekt çêdibe û dema ku ew çalakî pêk tê, tesîreke yekser li tişt an kesekî nayê.|url=https://sites.google.com/a/baranrizgar.co.cc/azadiya-kurdistane/home/lekeren-transitiv--intransitiv-ci-cudati-hene-cawa-ji-hev-veqetinin?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F&showPrintDialog=1|malper=bloga Baran Rizgar|dîrok=21.07.2019}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== * {{g|ku|kirinî}} ==== Etîmolojî ==== Li jortir [[kirin#Etîmolojî|binêrin]]. ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|kar|sc=Latn}}, {{W-|ckb|kirdewe|sc=Latn}} * {{Z|zza}}: {{W-|zza|kerdiş}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Tat|m}}, {{W+|de|Akt|n}}, {{W+|de|Werk|nt}} * {{Z|ba}}: {{W|ba|ғәмәл}} * {{Z|be}}: {{W|be|дзе́янне|nt}}, {{W|be|акт|n}} * {{Z|bg}}: {{W+|bg|де́йствие|nt}}, {{W+|bg|постъпка|m}}, {{W+|bg|акт|n}} * {{Z|cs}}: {{W+|cs|skutek|n}}, {{W+|cs|čin|n}} * {{Z|zh}}: {{W+|cmn|行為|sc=Hani}}, {{W+|cmn|行为|tr=xíngwéi|sc=Hani}} * {{Z|da}}: {{W|da|gerning|c}}, {{W+|da|handling|c}} * {{Z|ar}}: {{W+|ar|عَمَل|n}}, {{W+|ar|فِعْل|n}} * {{Z|hy}}: {{W+|hy|արարք}} * {{Z|eo}}: {{W+|eo|faro}}, {{W|eo|ago}} * {{Z|ee}}: {{W|ee|dɔwɔwɔ}} * {{Z|fa}}: {{W+|fa|کردار|tr=kirdar}}, {{W+|fa|کار|tr=kâr}}, {{W+|fa|اعمال|p|tr=e'mal}} * {{Z|fi}}: {{W+|fi|teko}}, {{W+|fi|toimi}} * {{Z|fr}}: {{W+|fr|acte|n}}, {{W+|fr|action|m}}, {{W+|fr|œuvre|m}} * {{Z|fy}}: {{W|fy|died|nt}} * {{Z|gd}}: {{W|gd|gnìomh|n}} * {{Z|nl}}: {{W+|nl|daad|m}} * {{Z|he}}: {{W+|he|מעשה|m|tr=ma'ase|sc=Hebr}} * {{Z|en}}: {{W|en|deed}}, {{W|en|action}}, {{W|en|disposition}}, {{W|en|doing}}, {{W|en|execution}}, {{W|en|performance}}, {{W|en|executing}} * {{Z|it}}: {{W+|it|fatto|n}}, {{W+|it|gesto}}, {{W+|it|gesta}} * {{Z|is}}: {{W+|is|dáð|m}} * {{Z|ja}}: {{W+|ja|行為|tr=こうい, kōi|sc=Jpan}} * {{Z|ca}}: {{W+|ca|fet|n}}, {{W+|ca|acte|n}} * {{Z|ko}}: {{W+|ko|행위}} * {{Z|la}}: {{W+|la|āctus|n}} * {{Z|lb}}: {{W|lb|Dot|m}} * {{Z|mk}}: {{W|mk|дело|nt}}, {{W|mk|постапка|m}} * {{Z|hu}}: {{W+|hu|tett}} * {{Z|no}}: {{W+|no|dåd}}, {{W|no|gjerning}} * {{Z|pt}}: {{W+|pt|ação|m}}, {{W+|pt|feito|n}} * {{Z|pt}}: {{W+|ro|faptă}} * {{Z|ru}}: {{W+|ru|посту́пок|n}}, {{W+|ru|де́йствие|nt}}, {{W+|ru|дея́ние|nt}}, {{W+|ru|акт|n}} * {{Z|sa}}: {{W+|sa|कार्य|nt}} * {{Z|sh}}: {{W|sh|чи̑н|n}} *: {{Z|sh}}: {{W+|sh|čȋn|n}} * {{Z|sk}}: {{W|sk|skutok|n}}, {{W+|sk|čin|n}} * {{Z|sl}}: {{W+|sl|dejanje|nt}} * {{Z|es}}: {{W+|es|hecho|n}}, {{W+|es|acto|n}}, {{W+|es|acción|m}}, {{W+|es|obra|m}} * {{Z|sv}}: {{W+|sv|gärning}}, {{W+|sv|dåd}} * {{Z|te}}: {{W+|te|చర్య|sc=Telu}} * {{Z|tr}}: {{W+|tr|iş}}, {{W|tr|yapma}}, {{W|tr|etme}}, {{W|tr|koyma}}, {{W+|tr|hareket}}, {{W|tr|eylem}}, {{W|tr|fiiliyat}}, {{W|tr|icra}}, {{W|tr|ika}}, {{W|tr|iştira}}, {{W|tr|gezdirme}} * {{Z|uk}}: {{W+|uk|ді́я|m}}, {{W+|uk|ді́яння|nt}}, {{W+|uk|акт|n}} * {{Z|el}}: {{W+|el|πράξη|m}} *: {{Z|grc}}: {{W|grc|πρᾶξις|m}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=iiknr|rikin}} j2mbynef11tu8st52u2oi3qel9nvr90 6532112 6532111 2026-09-18T20:45:21Z Wikihez 7344 Kurmancî/Lêker: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532112 wikitext text/x-wiki {{h-bnr|kirîn}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{deng|ku|LL-Q36163_(kmr)-Key Mîrza-kirin.wav|dever=Wan}} * {{ku-kîte}} === Lêker === {{ku-tewîn-lk|kirin|form=gerguhêz|niha=k|borî=kir}} [[Wêne:Lewis_Hine_Power_house_mechanic_working_on_steam_pump.jpg|thumb|Kesek kar '''dike'''. Peyvên ''[[kar]]'' û ''[[kirin#Kurdî|kirin]]'' [[hevreh]] in.]] {{lêker|ku|c=x-gh}}, {{bilêv|k|nerm}} # [[bi cih anîn]], [[pêk anîn]], [[encam dan]] #: {{mk|ku|Tu çi '''dikî'''?}} #: {{mk|ku|'''Bikin'''! – '''Neke'''! – '''Meke'''!}} #: {{mk|ku|Min hemû ev kar '''kiriye'''.}} #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Were nîşanê Nişanî de xwe bêperde seher<br />Lê ji xûnê '''bike''' perhîz ku şehîdan çi hisab}} # [[niyet]] hebûn, [[li ber bûn]], [[biniyet]] bûn, [[hewl]] dan, [[armanc]] bûn #: {{mk|ku|Min '''dikir''' bipirsim lê ez newêriyam.}} # [[nêzîk]] bûn, [[kêm]] man ku tiştek [[qewimîn|biqewime]] #: {{mk|ku|Ji qehran '''dike''' xwe bikuje.}} # [[lîstin]], [[pê ve]] [[mijûl]] bûn #: {{mk|ku|Ez futbolê '''dikim'''.|Ez futbolê dilîzim.|birêz=1}} # [[zewicîn]], [[mêr]] kirin, [[şû]] kirin, [[jin anîn]], wek [[hevser]] [[qebûl]] kirin #: {{mk|ku|Ez bêmêr bimirim jî, ez te '''nakim'''.}} # [[gan]] kirin, [[seks]] kirin # [[xwestin]] #* {{jêder-kitêb|ku|jêgirtin= '''Kir''' ku ji avê derbas bibe. |nivîskar={{w|Mela Mûsayê Hekarî}}|sernav=Durrû’l Mecalîs|amadekar=Hêmin Omer|sala weşandinê=2022|sal=1857|rûpel=116}} # {{înm|wek [[lêkera sivik|lêkereke sivik]] bo çêkirina [[lêker]]ên [[nû]] ji [[navdêr]] û [[rengdêr]]an}} #: {{mk|ku|[[qebûl kirin]], [[razî kirin]], [[xwedî kirin]], [[dest pê kirin]]}} #: {{mk|ku|[[mezin kirin]], [[xurt kirin]], [[bihêz kirin]], [[perîşan kirin]]}} ==== Bi alfabeyên din ==== * {{ku-ar|کرن}} * {{ku-kr|кьрьн}} ==== Jê ==== {{agadarî|Agadarî}}: Gelek peyv bi alîkariya [[lêkera sivik]] ya "kirin" tên çêkirin loma rêzkirina hemûyan li vir ne mimkin e. Bnr. '''[[:Kategorî:Tewandin:lêkerên pêkhatî yên kurmancî li gel "kirin"|Lêkerên li gel "kirin" (pêkhatî)]]''', '''[[:Kategorî:Peyvên kurmancî yên hevedudanî bi kirin|Peyvên kurmancî yên hevedudanî bi kirin]]. ==== Etîmolojî ==== {{etîmon|ku|:mîr|ine-pro:*kʷer-<t:kirin, [[çêkirin]], [[ava kirin]]>|dar=1|metn=++}} {{veşêre-ser|Bêhtir malûmat û hevreh}} Hevreha soranî {{g|ckb|کردن}}, kurdiya başûrî {{q|sdh|kirdin|sc=Latn}}, lekî {{q|lki|kirdin|sc=Latn}}, goranî/hewramî {{q|hac|kerdey|sc=Latn}}, zazakî {{q|zza|kerdene}}, farisî {{g|fa|کردن|tr=kerden}}, tacikî {{g|tg|кардан|tr=kardan}}, partî {{g|xpr|𐭪𐭫𐭲|tr=kirt}}, pehlewî {{g|pal|𐭪𐭫𐭲|tr=kirt}}, avestayî {{g|ae|𐬐𐬆𐬭𐬆𐬙𐬀|tr=kərəta|w=[[kirî]]}} û {{g|ae|𐬐𐬆𐬭𐬆𐬥𐬀𐬊𐬌𐬙𐬌‎|tr=kərənaoiti|w=ew dike}}, hexamenişî {{g|peo|𐎠𐎤𐎢𐎫𐎠|tr=a-ku-u-t-a /akutā/|w=wî kir}}, sanskrîtî {{g|sa|कृणोति|tr=kṛṇóti}} û {{g|sa|करोति|tr=karóti}}, hindî {{g|hi|करना|tr=kerna}}, ûrdûyî {{g|ur|کرنا|tr=kerna}}, hîtîtî {{g|hit|𒆪𒂊𒅕𒋫|tr=ku-e-er-ta|w=kir}} û {{g|hit|𒆪𒅕𒈪|tr=ku-er-mi|w=dikim}}, lîtwanî {{q|lt|kùrti|w=kirin, çêkirin, ava kirin}} û {{q|lt|kerė́ti|w=[[sihr]] kirin}}, rûsî {{q|ru|ча́ры|tr=čáry|w=[[sihr]]kirin}}. Ji heman rehî herwiha peyva {{q|ku|kar}} û paşgirên {{q|ku|-kar}}, {{q|ku|-ker}}, {{q|ku|-gar}}, {{q|ku|-ger}} (''-ger'' wek bo nimûne di peyva {{q|ku|asinger}}, {{q|ku|hesinger}} de). Peyv ji zimanekî [[hindûîranî]] ketiye hinek zimanên [[ûralî]] jî, bo nimûne: ûdmûrtî {{g|udm|карыны|tr=karini}} û komî-permyakî {{g|koi|керны|tr=kêrni}}. Wek paşgirên {{q|ku|-kâr}}, {{q|ku|-ker}}, {{q|ku|-gâr}} ketiye tirkî û gelek zimanên din jî yên [[tirkîkî]], bo nimûne di van peyvên tirkî de: {{q|tr|muhafazakâr}}, {{q|tr|peyker}}, {{q|tr|rüzgâr}} û bi dehan an bi sedan peyvên din. ;{{biçûk|Çavkanî: * {{Cheung}} * {{Chyet}} * {{Derksen}} * {{Kloekhorst}} * {{Lubotsky}} * {{Mallory}} * {{Tsabolov}} }} {{veşêre-bin}} ==== Bi zaravayên din ==== * {{Z|hac}}: {{W-|hac|kerdey|sc=Latn}} * {{Z|sdh}}: {{W-|sdh|کردن}}, {{W-|sdh|kirdin|sc=Latn}} * {{Z|lki}}: {{W-|lki|کردن}}, {{W-|lki|kirdin|sc=Latn}} * {{Z|ckb}}: {{W-|ckb|کردن|tr=kirdin}} * {{Z|zza}}: {{W-|zza|kerdene}} ==== Werger ==== {{werger-ser|bi cih anîn, encam dan, çêkirin (1)}} * {{Z|af}}: {{W+|af|doen}} * {{Z|sq}}: {{W+|sq|bëj}} * {{Z|de}}: {{W+|de|tun}}, {{W+|de|machen}} *: {{Z|gsw}}: {{W-|gsw|tue}} * {{Z|am}}: {{W-|am|ማድረግ}} * {{Z|an}}: {{W+|an|fer}} * {{Z|aii}}: {{W-|aii|ܥܵܒ݂ܹܕ|tr=ʿawed}} * {{Z|rup}}: {{W-|rup|fac}} * {{Z|as}}: {{W-|as|কৰ}} * {{Z|ast}}: {{W+|ast|facer}} * {{Z|ask}}: {{W-|ask|ko}} * {{Z|ain}}: {{W-|ain|キ|tr=ki}} * {{Z|az}}: {{W-|az|eləmək}}, {{W+|az|etmək}}, {{W-|az|qılmaq}} * {{Z|ban}}: {{W-|ban|gaé}} * {{Z|eu}}: {{W-|eu|egin}} * {{Z|be}}: {{W-|be|рабі́ць|impf}}, {{W-|be|зрабі́ць|pf}} * {{Z|bn}}: {{W-|bn|করা}} * {{Z|bqi}}: {{W-|bqi|کردن|tr=kerden}} * {{Z|br}}: {{W+|br|ober}} * {{Z|bg}}: {{W-|bg|пра́вя}} * {{Z|my}}: {{W+|my|လုပ်}}, {{W+|my|ပြု}} * {{Z|ce}}: {{W-|ce|да}}, {{W-|ce|дан}} * {{Z|cs}}: {{W-|cs|dělat|impf}}, {{W-|cs|udělat|pf}} * {{Z|chr}}: {{W-|chr|ᎾᏛᏁᎭ}} * {{Z|zh}}: *: {{Z|cmn}}: {{W-|cmn|做|tr=zuò}}, {{W+|cmn|作|tr=zuò}} * {{Z|cv}}: {{W-|cv|ту}} * {{Z|dlm}}: {{W-|dlm|fur}} * {{Z|da}}: {{W+|da|gøre}}, {{W-|da|udføre}} * {{Z|id}}: {{W+|id|buat}}, {{W+|id|laku}}, {{W+|id|melakukan}} * {{Z|ar}}: {{W-|ar|فَعَلَ}}, {{W-|ar|عَمِلَ}} *: {{Z|arq}}: {{W-|arq|دار}} *: {{Z|arz}}: {{W-|arz|عمل|tr=ʕamal}} *: {{Z|acw}}: {{W-|acw|سَوَّى|tr=sawwa}} * {{Z|hy}}: {{W+|hy|անել}} * {{Z|eo}}: {{W+|eo|fari}} * {{Z|et}}: {{W+|et|tegema}} * {{Z|ext}}: {{W-|ext|hazel}} * {{Z|fa}}: {{W-|fa|کَردَن|tr=kardan}} * {{Z|fi}}: {{W-|fi|tehdä}} * {{Z|fr}}: {{W-|fr|faire}} * {{Z|fur}}: {{W-|fur|fâ}} * {{Z|frr}}: {{W-|frr|düünj}}, {{W-|frr|du}} * {{Z|fy}}: {{W-|fy|dwaan}} * {{Z|gd}}: {{W-|gd|dèan}} * {{Z|gl}}: {{W+|gl|facer}} * {{Z|got}}: {{W-|got|𐍄𐌰𐌿𐌾𐌰𐌽}} * {{Z|ka}}: {{W+|ka|კეთება}} * {{Z|gn}}: {{W+|gn|japo}} * {{Z|ht}}: {{W-|ht|fè}} * {{Z|hi}}: {{W+|hi|करना}} * {{Z|hil}}: {{W-|hil|buhat}}, {{W-|hil|pagbuhat}} * {{Z|mww}}: {{W-|mww|ua}} * {{Z|nl}}: {{W+|nl|doen}} * {{Z|he}}: {{W-|he|עָשָׂה|tr=asá}},{{W-|he|פָּעַל|tr=pa'al}} * {{Z|io}}: {{W+|io|facar}} * {{Z|ilo}}: {{W-|ilo|aramid}} * {{Z|ang}}: {{W-|ang|dōn}} * {{Z|en}}: {{W+|en|do}}, {{W+|en|perform}}, {{W+|en|execute}} * {{Z|inh}}: {{W-|inh|де}} * {{Z|ia}}: {{W-|ia|facer}} * {{Z|ga}}: {{W-|ga|déan}}, {{W-|ga|dein}} * {{Z|ist}}: {{W-|ist|fà}} * {{Z|it}}: {{W+|it|fare}} * {{Z|is}}: {{W+|is|gera}}, {{W-|is|gjöra}} * {{Z|ja}}: {{W+|ja|する|tr=suru}}, {{W+|ja|やる|tr=yaru}}, {{W-|ja|なさる|tr=nasaru}}, {{W+|ja|致す|tr=いたす, itasu}} * {{Z|jv}}: {{W+|jv|gawe}}, {{W+|jv|gawé}} * {{Z|bsh}}: {{W-|bsh|ku}} * {{Z|xnn}}: {{W-|xnn|ikkan}} * {{Z|kn}}: {{W+|kn|ಮಾಡು}} * {{Z|kea}}: {{W-|kea|faze}} * {{Z|ca}}: {{W-|ca|fer}} * {{Z|qu}}: {{W+|qu|ruray}}, {{W-|qu|rurai}} * {{Z|ks}}: {{W-|ks|کَرُن}} * {{Z|ky}}: {{W-|ky|этүү}} * {{Z|si}}: {{W-|si|කරනවා}} * {{Z|ko}}: {{W+|ko|하다}} * {{Z|co}}: {{W-|co|fà}} * {{Z|mfe}}: {{W-|mfe|fer}} * {{Z|kum}}: {{W-|kum|этмек}} * {{Z|lld}}: {{W-|lld|fé}}, {{W-|lld|fèr}} * {{Z|ltg}}: {{W-|ltg|dareit}} * {{Z|la}}: {{W+|la|faciō}}, {{W+|la|agō}} * {{Z|lv}}: {{W+|lv|darīt}}, {{W-|lv|veikt}} * {{Z|lo}}: {{W+|lo|ເຮັດ}}, {{W-|lo|ທຳ}} * {{Z|lez}}: {{W-|lez|авун}} * {{Z|lt}}: {{W+|lt|daryti}} * {{Z|lmo}}: {{W-|lmo|fà}} * {{Z|mhn}}: {{W-|mhn|mòchen}} * {{Z|mk}}: {{W+|mk|прави}}, {{W-|mk|врши}}, {{W+|mk|направи}} * {{Z|ml}}: {{W+|ml|ചെയ്യുക}} * {{Z|ms}}: {{W+|ms|buat}} * {{Z|mt}}: {{W-|mt|għamel}} * {{Z|mzn}}: {{W-|mzn|هاکردن|tr=hâkërden}} * {{Z|gun}}: {{W-|gun|japo}} * {{Z|hu}}: {{W+|hu|tesz}}, {{W+|hu|csinál}} * {{Z|egy}}: {{W-egy|jrj|h=ir}} * {{Z|mn}}: *: Kirîlî: {{W+|mn|хийх}} * {{Z|nci}}: {{W-|nci|chīhua}} * {{Z|nah}}: {{W+|nah|chīhua}} * {{Z|gld}}: {{W-|gld|анго-}} * {{Z|nap}}: {{W-|nap|fà}} * {{Z|nds}}: *: {{Z|nds-nl}}: {{W-|nds-nl|doan}} *: {{Z|nds-de}}: {{W-|nds-de|doon}} * {{Z|ne}}: {{W+|ne|गर्नु}} * {{Z|nrf}}: {{W-|nrf|faithe}} * {{Z|no}}: *: {{Z|nb}}: {{W+|nb|gjøre}}, {{W+|nb|utføre}} *: {{Z|nn}}: {{W+|nn|gjere}}, {{W+|nn|utføre}} * {{Z|pro}}: {{W-|pro|far}} * {{Z|oc}}: {{W+|oc|far}}, {{W+|oc|har}}, {{W+|oc|faire}} * {{Z|or}}: {{W+|or|କରିବା}} * {{Z|os}}: {{W-|os|кӕнын}} * {{Z|ug}}: {{W-|ug|قىلماق}} * {{Z|uz}}: {{W+|uz|qilmoq}} * {{Z|pi}}: {{W-|pi|karoti}} * {{Z|pap}}: {{W-|pap|hasi}} * {{Z|ps}}: {{W-|ps|کول|tr=kawël}} * {{Z|ppl}}: {{W-|ppl|-chiwa}}, {{W-|ppl|-chihua}} * {{Z|pl}}: {{W+|pl|robić|impf}}, {{W+|pl|zrobić|pf}}, {{W+|pl|czynić|impf}}, {{W+|pl|uczynić|pf}} * {{Z|roa-opt}}: {{W-|roa-opt|fazer}} * {{Z|pt}}: {{W+|pt|fazer}}, {{W+|pt|realizar}} * {{Z|pa}}: {{W-|pa|ਕਰਨਾ}} * {{Z|kk}}: {{W+|kk|істеу}} * {{Z|cop}}: {{W-|cop|ⲉⲓⲣⲉ}} * {{Z|rap}}: {{W-|rap|haka}} * {{Z|rgn}}: {{W-|rgn|fêr}} * {{Z|rm}}: {{W-|rm|far}} * {{Z|ro}}: {{W+|ro|face}} * {{Z|ru}}: {{W-|ru|де́лать|impf}}, {{W-|ru|сде́лать|pf}} * {{Z|rue}}: {{W-|rue|роби́ти|impf}} * {{Z|osx}}: {{W-|osx|dôn}}, {{W-|osx|fremmian}}, {{W-|osx|gifrummian}} * {{Z|sgs}}: {{W-|sgs|darītė}}, {{W-|sgs|dėrbtė}} * {{Z|sa}}: {{W+|sa|करोति|tr=karóti}} *: {{Z|sa}}: {{W+|sa|कृणोति|tr=kṛṇóti}} * {{Z|sc}}: {{W-|sc|fàchere}} *: {{Z|sc}}: {{W-|sc|fai}} * {{Z|ceb}}: {{W-|ceb|buhat}}, {{W-|ceb|buhaton}} * {{Z|scn}}: {{W+|scn|fari}} * {{Z|sd}}: {{W+|sd|ڪَرَڻُ}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|радити}} *: Latînî: {{W+|sh|raditi}}, {{W+|sh|činiti}} * {{Z|syl}}: {{W-|syl|ꠇꠞꠣ}} * {{Z|sco}}: {{W-|sco|dae}} * {{Z|orv}}: {{W-|orv|робити|impf}} * {{Z|sk}}: {{W+|sk|robiť|impf}}, {{W-|sk|urobiť|pf}} * {{Z|sl}}: {{W-|sl|storiti}},{{W-|sl|ukreniti}}, {{W-|sl|narediti}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|cyniś|impf}} *: {{Z|hsb}}: {{W-|hsb|činić|impf}}, {{W-|hsb|sčinić|pf}} * {{Z|es}}: {{W-|es|hacer}} * {{Z|sv}}: {{W+|sv|göra}} * {{Z|shn}}: {{W-|shn|ႁဵတ်း}} * {{Z|tab}}: {{W-|tab|апӏуб}} * {{Z|tg}}: {{W+|tg|кардан}} * {{Z|tl}}: {{W-|tl|gawin}}, {{W-|tl|gumawa}}, {{W-|tl|isagawa}} * {{Z|ta}}: {{W+|ta|செய்}}, {{W+|ta|பண்ணு}} * {{Z|nod}}: {{W-|nod|ᩁᩮᩢ᩠ᨯ}}, {{W-|nod|ᨿᩮ᩠ᨿᩡ}}, {{W-|nod|ᨿᩡ}}, {{W-|nod|ᨿ}} * {{Z|th}}: {{W+|th|ทำ}} * {{Z|te}}: {{W+|te|చేయు}} * {{Z|tt}}: {{W-|tt|эшләү}} * {{Z|tet}}: {{W-|tet|halo}} * {{Z|tr}}: {{W+|tr|yapmak}}, {{W+|tr|etmek}}, {{W+|tr|kılmak}} * {{Z|tk}}: {{W+|tk|etmek}} * {{Z|tpi}}: {{W+|tpi|mekim}}, {{W-|tpi|wokim}} * {{Z|txb}}: {{W-|txb|yām-}} * {{Z|tyv}}: {{W-|tyv|кылыр}} * {{Z|udm}}: {{W-|udm|карыны}} * {{Z|ur}}: {{W-|ur|کَرْنا|tr=karnā}} * {{Z|uk}}: {{W-|uk|роби́ти|impf}}, {{W-|uk|зроби́ти|pf}} * {{Z|vec}}: {{W+|vec|far}} * {{Z|vi}}: {{W+|vi|làm}} * {{Z|wbk}}: {{W-|wbk|ća}} * {{Z|wa}}: {{W+|wa|fé}} * {{Z|wbl}}: {{W-|wbl|car-}} * {{Z|cy}}: {{W-|cy|gwneud}} * {{Z|km}}: {{W+|km|ធ្វើ}} * {{Z|yai}}: {{W-|yai|карак}} * {{Z|yi}}: {{W-|yi|טאָן}} * {{Z|yoi}}: {{W-|yoi|きるん|tr=kirun}} * {{Z|el}}: {{W+|el|κάνω}} *: Kevn: {{W-|grc|πράσσω}}, {{W-|grc|ποιέω}}, {{W-|grc|ῥέζω}}, {{W-|grc|ἔρδω}}, {{W-|grc|δράω}}, {{W-|grc|τελέω}} * {{Z|ase}}: {{W-|ase|C@SideTrunkhigh-PalmDown-C@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}}, {{W-|ase|Claw5@SideTrunkhigh-PalmDown-Claw5@SideTrunkhigh-PalmDown RoundVertSidetoside-RoundVertSidetoside}} {{werger-bin}} === Navdêr === {{navdêr|z=m|ku}} # [[kar]], [[kiryar]], [[emel]], [[fêl]], [[fealiyet]], [[xebat]], [[şol]], [[encamdan]], [[bicihanîn]], [[çêkirin]] #: {{mk|ku|'''Kirina''' wî karî ne hêsan e.}} #: {{mk|ku|Divê mirov ji '''kirinê''' netirse.}} #* {{jêder-malper|ku|jêgirtin=Di berhemên Fiqih û Usûlu’l-Fiqhê derbas dibe; fermaneke ku '''kirina''' tiştekî/’îbadeketekê di wextê wê lazim bike, qezakirina vê peywira ku di dema xwe nehatiye edakirin jî pêwîst didêre. Ma ev tişt ne rast e? Hûn dikarin di çarçoveya nimêja qeza de vê şîrove bikin?|malper=fetwayenkurdi.com|url=http://www.fetwayenkurdi.com/?p=3995|dîrok=21.07.2019}} #* {{jêder-malper|ku|jêgirtin=Lêkera netêger an jî întransîtîv ew tewre lêker e ku tevger an '''kirina''' wê yekser tesîrê li objektekê nake. Ew çalakî an bûyer bê objekt çêdibe û dema ku ew çalakî pêk tê, tesîreke yekser li tişt an kesekî nayê.|url=https://sites.google.com/a/baranrizgar.co.cc/azadiya-kurdistane/home/lekeren-transitiv--intransitiv-ci-cudati-hene-cawa-ji-hev-veqetinin?tmpl=%2Fsystem%2Fapp%2Ftemplates%2Fprint%2F&showPrintDialog=1|malper=bloga Baran Rizgar|dîrok=21.07.2019}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== * {{g|ku|kirinî}} ==== Etîmolojî ==== Li jortir [[kirin#Etîmolojî|binêrin]]. ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|kar|sc=Latn}}, {{W-|ckb|kirdewe|sc=Latn}} * {{Z|zza}}: {{W-|zza|kerdiş}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Tat|m}}, {{W+|de|Akt|n}}, {{W+|de|Werk|nt}} * {{Z|ba}}: {{W|ba|ғәмәл}} * {{Z|be}}: {{W|be|дзе́янне|nt}}, {{W|be|акт|n}} * {{Z|bg}}: {{W+|bg|де́йствие|nt}}, {{W+|bg|постъпка|m}}, {{W+|bg|акт|n}} * {{Z|cs}}: {{W+|cs|skutek|n}}, {{W+|cs|čin|n}} * {{Z|zh}}: {{W+|cmn|行為|sc=Hani}}, {{W+|cmn|行为|tr=xíngwéi|sc=Hani}} * {{Z|da}}: {{W|da|gerning|c}}, {{W+|da|handling|c}} * {{Z|ar}}: {{W+|ar|عَمَل|n}}, {{W+|ar|فِعْل|n}} * {{Z|hy}}: {{W+|hy|արարք}} * {{Z|eo}}: {{W+|eo|faro}}, {{W|eo|ago}} * {{Z|ee}}: {{W|ee|dɔwɔwɔ}} * {{Z|fa}}: {{W+|fa|کردار|tr=kirdar}}, {{W+|fa|کار|tr=kâr}}, {{W+|fa|اعمال|p|tr=e'mal}} * {{Z|fi}}: {{W+|fi|teko}}, {{W+|fi|toimi}} * {{Z|fr}}: {{W+|fr|acte|n}}, {{W+|fr|action|m}}, {{W+|fr|œuvre|m}} * {{Z|fy}}: {{W|fy|died|nt}} * {{Z|gd}}: {{W|gd|gnìomh|n}} * {{Z|nl}}: {{W+|nl|daad|m}} * {{Z|he}}: {{W+|he|מעשה|m|tr=ma'ase|sc=Hebr}} * {{Z|en}}: {{W|en|deed}}, {{W|en|action}}, {{W|en|disposition}}, {{W|en|doing}}, {{W|en|execution}}, {{W|en|performance}}, {{W|en|executing}} * {{Z|it}}: {{W+|it|fatto|n}}, {{W+|it|gesto}}, {{W+|it|gesta}} * {{Z|is}}: {{W+|is|dáð|m}} * {{Z|ja}}: {{W+|ja|行為|tr=こうい, kōi|sc=Jpan}} * {{Z|ca}}: {{W+|ca|fet|n}}, {{W+|ca|acte|n}} * {{Z|ko}}: {{W+|ko|행위}} * {{Z|la}}: {{W+|la|āctus|n}} * {{Z|lb}}: {{W|lb|Dot|m}} * {{Z|mk}}: {{W|mk|дело|nt}}, {{W|mk|постапка|m}} * {{Z|hu}}: {{W+|hu|tett}} * {{Z|no}}: {{W+|no|dåd}}, {{W|no|gjerning}} * {{Z|pt}}: {{W+|pt|ação|m}}, {{W+|pt|feito|n}} * {{Z|pt}}: {{W+|ro|faptă}} * {{Z|ru}}: {{W+|ru|посту́пок|n}}, {{W+|ru|де́йствие|nt}}, {{W+|ru|дея́ние|nt}}, {{W+|ru|акт|n}} * {{Z|sa}}: {{W+|sa|कार्य|nt}} * {{Z|sh}}: {{W|sh|чи̑н|n}} *: {{Z|sh}}: {{W+|sh|čȋn|n}} * {{Z|sk}}: {{W|sk|skutok|n}}, {{W+|sk|čin|n}} * {{Z|sl}}: {{W+|sl|dejanje|nt}} * {{Z|es}}: {{W+|es|hecho|n}}, {{W+|es|acto|n}}, {{W+|es|acción|m}}, {{W+|es|obra|m}} * {{Z|sv}}: {{W+|sv|gärning}}, {{W+|sv|dåd}} * {{Z|te}}: {{W+|te|చర్య|sc=Telu}} * {{Z|tr}}: {{W+|tr|iş}}, {{W|tr|yapma}}, {{W|tr|etme}}, {{W|tr|koyma}}, {{W+|tr|hareket}}, {{W|tr|eylem}}, {{W|tr|fiiliyat}}, {{W|tr|icra}}, {{W|tr|ika}}, {{W|tr|iştira}}, {{W|tr|gezdirme}} * {{Z|uk}}: {{W+|uk|ді́я|m}}, {{W+|uk|ді́яння|nt}}, {{W+|uk|акт|n}} * {{Z|el}}: {{W+|el|πράξη|m}} *: {{Z|grc}}: {{W|grc|πρᾶξις|m}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=iiknr|rikin}} dp0vbb5z4yxnv5szuixu25qp30ok43m ker 0 3570 6532109 6368007 2026-09-18T20:38:21Z Wikihez 7344 Kurmancî/Navdêr 3: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532109 wikitext text/x-wiki {{h-bnr|ker|kêr|kerr|kêrr|-ker}} == {{ziman|ku}} == === Bilêvkirin === * {{q|ku|ker|cuda=(dewarek)|id=dewarek}} {{IPA|ku|/kʰɜɾ/}}, {{arF|که‌ر}} ** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker.wav|dever=Amed}} *** {{beş|Navdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 1).wav|dever=Bidlîs}} * {{beş|Navdêr 3}} {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-ker (Navdêr 3).wav|dever=Bidlîs}} * {{q|ku|ker|cuda=(parçe)|id=parçe}} {{IPA|ku|/kɜɾ/}}, {{arF|که‌ر}} ** {{q|ku|ker|cuda=(koma pezî)|id=koma pezî}} {{IPA|ku|/kɜɾ/}}, {{arF|که‌ر}} *** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-ker(koma pez).wav|dever=Qers}} **** {{beş|Navdêr 4}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 4).wav|dever=Bidlîs}} * {{q|ku|ker|cuda=(guhgiran)|id=guhgiran}} {{IPA|ku|/kɜr/}}, {{arF|که‌ڕ}} ** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-kerr.wav|dever=Qers}} *** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker (kesê ku nabihîze).wav|dever=Amed}} **** {{deng|ku|Kmr-Efrîn--kerr.oga|dever=Efrîn}} **** {{beş|Rengdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr 1).wav|dever=Bidlîs}} ***** {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr).wav|Deng|dever=Bidlîs}} === Navdêr 1 === [[Wêne:Donkey in Clovelly, North Devon, England.jpg|thumb|Kerek (1)]] [[Wêne:S Veahmätle13.JPG|thumb|'''Kerê''' pezî (2)]] {{navdêr|ku|z=n}} # {{maneid|ku|dewarek}} {{f|ku|guhandar}} [[cûn|Cûnek]] [[dewar]]an e ku [[şibîn|dişibe]] [[hesp]]an û [[hêstir]]an lê ji wan [[kurt]]tir û [[biçûk]]tir e <br>(bi taybetî bo barhilgirtinê tê bikaranîn). #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=ابله چه کت طوافی نابینتن بری رش</br>بیزی دکت ژ قنجان ژ رمز و ناز و غنجان</br>قدری گلان چه زانت کربش دڤیت '''کری''' رش|tr=Ebleh çi kit ṭewafê nabînitin Berê reş</br>Bêzê dikit ji qencan ji remz û naz û x̣encan</br>Qedrê gulan çi zanit kerbeş divêt '''kerê''' reş}} # {{maneid|ku|koma pezî}} [[kom|Komeke]] [[pez]]î, [[garan]]a pezî, [[ber]]ê pezî # {{maneid|ku|bêaqil}} {{f|ku|mecazî}} [[bêaqil|Bêaqil]], [[bêhiş]], [[bêmejî]], [[mejîreş]], [[aqilsivik]], [[nezan]]. # {{f|ku|mecazî|heqaret}} (ji peyva ker a heywan) ji bo kesê zir, serhişk û bêpîr û şerde #* {{J:Firat Cewerî:Girtî:1986|jêgirtin=- Hûn in, ha!. . . Ji bo çi hûn diziyê dikin '''ker''' lawê '''keran'''?}} ==== Tewandin ==== {{ku-tewîn-nav/nû|nêr}} ==== Notên bikaranînê ==== {{agadarî}} Di gelek devokên kurmancî de '''ker''' tenê bo van cûn dewarên nêr bi kar tê. Yên mê '''[[maker]]''' in. ==== Jê ==== {{kol3|ku | keratî | kerçove | kerçovetî | kerî | kerînî | kerîtî | kertî | kurrûk | maker | nêreker }} ==== Etîmolojî ==== Ji {{mîr|ira-pro||*xárah||ker}}, ji {{mîr|iir-pro||*kʰáras||ker}}; belkî taliyê ji zimanekî [[samî]]{{çp}}, bo nimûne ji {{ji|akk|ku|tr=xeradu|w=ker, nêreker}}.{{çp}} Hevreha soranî {{g|ckb|که‌ر|tr=ker}}, zazakî {{q|zza|her}}, hewramî {{g|hac|ھەر‎|tr=her}}, farisî {{g|fa|خر|tr=xer}}, avestayî {{g|ae|𐬑𐬀𐬭𐬀|tr=xere}}, sanskrîtî {{g|sa|खर|tr=khére}}, osetî {{g|os|хӕрӕг|tr=xereg}}, peştûyî {{g|ps|خر|tr=xer}}, belûçî {{g|bal|ہر|tr=her}}. ==== Gotinên pêşiyan ==== * [[şîreta kîrê ker e]] ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|کەر‎|tr=ker}} * {{Z|sdh}}: {{W-|sdh|xer|sc=Latn}} * {{Z|lki}}: {{W-|lki|xer|sc=Latn}} * {{Z|hac}}: {{W-|hac|her|sc=Latn}} * {{Z|zza}}: {{W-|zza|her}} ==== Werger ==== {{werger-ser|dewarek}} * {{Z|ab}}: {{W-|ab|аҽада}} * {{Z|ady}}: {{W-|ady|щыды}} * {{Z|aa}}: {{W-|aa|danán|n}} * {{Z|af}}: {{W+|af|donkie}} * {{Z|akk}}: {{W-|akk|𒀲|n|tr=imēru}} * {{Z|sq}}: {{W+|sq|gomar|n}}, {{W-|sq|magar|n}} * {{Z|de}}: {{W+|de|Esel|n}}; {{W+|de|Grauchen|nt}}, {{W-|de|Grautier|nt}} * {{Z|alt}}: {{W-|alt|эштек}} * {{Z|am}}: {{W-|am|አህያ|tr=äheyya}} * {{Z|ani}}: {{W-|ani|гьаморохи}} * {{Z|arc}}: *: {{Z|syc}}: {{W-|syc|ܚܡܪܐ|g|tr=ḥəmārā}}, {{W-|syc|ܚܡܪܬܐ|m|tr=ḥəmārtā}}, {{W-|syc|ܐܬܢܐ|m|tr=ʾăṯānā}} *: {{Z|tmr}}: {{W-|arc|חֲמָרָא|n|tr=ḥămārā}} * {{Z|rup}}: {{W-|rup|cãci}}, {{W-|rup|dãngã}}, {{W-|rup|gumar}}, {{W-|rup|dãnglãrã}}, {{W-|rup|shonj}}, {{W-|rup|tãronj}}, {{W-|rup|uci}}, {{W-|rup|uricljat}}, {{W-|rup|tar}} * {{Z|as}}: {{W-|as|গাধ}} * {{Z|ast}}: {{W+|ast|burru|n}}, {{W+|ast|burra|m}}, {{W+|ast|pollín|n}} * {{Z|aot}}: {{W-|aot|gada}} * {{Z|av}}: {{W-|av|хӏама}} * {{Z|awa}}: {{W-|awa|गदहा|n}} * {{Z|az}}: {{W+|az|eşşək}}, {{W-|az|ulaq}} * {{Z|bdr}}: {{W-|bdr|keribas}} * {{Z|eu}}: {{W+|eu|asto}} * {{Z|ba}}: {{W-|ba|ишәк}} * {{Z|sne}}: {{W-|sne|kaldei}} * {{Z|be}}: {{W-|be|асёл|n}} * {{Z|bal}}: {{W-|bal|ہر|tr=har}} * {{Z|bn}}: {{W+|bn|গাধা}} * {{Z|br}}: {{W+|br|azen|n}} * {{Z|bdk}}: {{W-|bdk|лем}} * {{Z|bg}}: {{W-|bg|мага́ре|nt}}, {{W-|bg|осе́л|n}} * {{Z|my}}: {{W+|my|မြည်း}} * {{Z|bua}}: {{W-|bua|элжэгэн}} * {{Z|ce}}: {{W-|ce|вир}} * {{Z|cs}}: {{W+|cs|osel|n}} * {{Z|chr}}: {{W-|chr|ᏗᎦᎵᏅᎯᏛ}} * {{Z|chy}}: {{W-|chy|a'éevo'ha}} * {{Z|ny}}: {{W-|ny|bulu}} * {{Z|cic}}: {{W-|cic|haksibish falaa'}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|驢|tr=leoi4}}, {{W-|yue|驢仔|tr=leoi4 zai2}} *: {{Z|dng}}: {{W-|dng|лү}} *: {{Z|hak}}: {{W-|hak|驢仔|tr=lì-è}} *: {{Z|cmn}}: {{W+|cmn|驢|tr=lǘ}}, {{W-|cmn|驢子|tr=lǘzi}} *: {{Z|cdo}}: {{W-|cdo|驢|tr=lè̤}} *: {{Z|nan}}: {{W+|nan|驢|tr=lîr / lû / lî}}, {{W+|nan|驢仔|tr=lû-á / lî-á / lîr-á}} *: {{Z|wuu}}: {{W-|wuu|驢}} * {{Z|cv}}: {{W-|cv|ашак}} * {{Z|chk}}: {{W-|chk|tongki}} * {{Z|dlm}}: {{W-|dlm|samur|n}} * {{Z|da}}: {{W+|da|æsel|nt}} * {{Z|dv}}: {{W-|dv|ހިާމރު}} * {{Z|ovd}}: {{W-|ovd|åsn|m}} * {{Z|id}}: {{W+|id|keledai}} * {{Z|ar}}: {{W+|ar|حِمَار|n}} *: {{Z|arz}}: {{W-|arz|حمار|n|tr=ḥumār, ḥmār}} *: {{Z|acw}}: {{W-|acw|حُمار|n|tr=ḥumār}} *: {{Z|acm}}: {{W-|acm|زمال|n|tr=zmāl}} *: {{Z|afb}}: {{W-|afb|حمار|n|tr=ḥmār}} *: {{Z|aeb}}: {{W-|aeb|بهيم|n|tr=bhīm}} *: {{Z|ary}}: {{W-|ary|حمار|n|tr=ḥmār}}, {{W-|ary|حمارة|m|tr=ḥmāra}}, {{W-|ary|دحش|tr=daḥš}}, {{W-|ary|دحشة|m|tr=daḥša}} * {{Z|hy}}: {{W+|hy|էշ}}, {{W+|hy|ավանակ}} * {{Z|eo}}: {{W+|eo|azeno}} * {{Z|et}}: {{W+|et|eesel}} * {{Z|gez}}: {{W-|gez|አድግ}} * {{Z|ee}}: {{W-|ee|tedzi|nt}} * {{Z|fa}}: {{W+|fa|خر|tr=xar}}, {{W+|fa|الاغ|tr=olâğ}} * {{Z|fo}}: {{W-|fo|asni}} * {{Z|fi}}: {{W+|fi|aasi}} * {{Z|fro}}: {{W-|fro|asne|n}} * {{Z|fr}}: {{W+|fr|âne|n}} * {{Z|fur}}: {{W-|fur|mus}} * {{Z|fy}}: {{W-|fy|ezel}} * {{Z|gd}}: {{W-|gd|asal|m}} * {{Z|gag}}: {{W-|gag|eşek}}, {{W-|gag|yeşek}} * {{Z|gl}}: {{W+|gl|asno}}, {{W+|gl|burro}} * {{Z|got}}: {{W-|got|𐌰𐍃𐌹𐌻𐌿𐍃}} * {{Z|gu}}: {{W-|gu|ગધેડો}} * {{Z|ka}}: {{W+|ka|ვირი}}, {{W+|ka|ჯორი}} * {{Z|ha}}: {{W+|ha|jaki}} * {{Z|hi}}: {{W+|hi|गधा|n}} * {{Z|nl}}: {{W+|nl|ezel|n}} * {{Z|he}}: {{W-|he|חֲמוֹר|n|tr=khamór}}, {{W-|he|אָתוֹן|m|tr=atón}} * {{Z|io}}: {{W+|io|asno}} * {{Z|ang}}: {{W-|ang|esol|n}} * {{Z|en}}: {{W+|en|donkey}} * {{Z|inh}}: {{W-|inh|вир}} * {{Z|ia}}: {{W-|ia|asino}} * {{Z|ga}}: {{W+|ga|asal|n}} * {{Z|ist}}: {{W-|ist|samèri|n-p}} * {{Z|it}}: {{W+|it|asino|n}}, {{W+|it|somaro|n}}, {{W-|it|buricco|n}}, {{W+|it|ciuco}} * {{Z|is}}: {{W+|is|asni}} * {{Z|ja}}: {{W+|ja|驢馬|tr=ろば, roba}}, {{W+|ja|ロバ|tr=roba}} * {{Z|kab}}: {{W-|kab|aɣyul|n}} * {{Z|kl}}: {{W-|kl|siutitooq}} * {{Z|xal}}: {{W-|xal|элҗгн}} * {{Z|ktb}}: {{W-|ktb|harreta}} * {{Z|kn}}: {{W+|kn|ಕತ್ತೆ}} * {{Z|krc}}: {{W-|krc|эшек|tr=eşek}} * {{Z|csb}}: {{W-|csb|osoł|n}}, {{W-|csb|òseł}} * {{Z|ca}}: {{W+|ca|ase|n}}, {{W+|ca|somera|m}}, {{W+|ca|burro|n}}, {{W+|ca|burra|m}}, {{W+|ca|ruc|n}}, {{W+|ca|ruca|m}} * {{Z|qu}}: {{W-|qu|wuru}}, {{W-|qu|asnu}} * {{Z|ks}}: {{W-|ks|خَر|n}} * {{Z|ky}}: {{W+|ky|эшек}} * Ladin: *: {{Z|lld}}: {{W-|lld|musciat|n}} *: {{Z|lld}}: {{W-|lld|müsc|n}} *: {{Z|lld}}: {{W-|lld|èsen|n}},{{W-|lld|musciat|n}} * {{Z|si}}: {{W+|si|බූරුවා}} * {{Z|ko}}: {{W+|ko|당나귀}}, {{W+|ko|나귀}} * {{Z|rop}}: {{W-|rop|ginggong ginggong}} * {{Z|la}}: {{W-|la|asellus}}, {{W-|la|asinus|n}} * {{Z|lv}}: {{W-|lv|ēzelis|n}} * {{Z|lo}}: {{W-|lo|ລາ}}, {{W-|lo|ມ້າລໍ}} * {{Z|lzz}}: {{W-|lzz|ეშეღი}} * {{Z|lez}}: {{W-|lez|лам}} * {{Z|lij}}: {{W-|lij|ase}} * {{Z|li}}: {{W+|li|aezel}} * {{Z|lt}}: {{W+|lt|asilas|n}} * {{Z|khb}}: {{W-|khb|ᩃᩣ}} * {{Z|lb}}: {{W-|lb|Iesel|n}} * {{Z|luo}}: {{W-|luo|punda}} * {{Z|mk}}: {{W-|mk|магаре|nt}} * Malay: *: {{Z|ms}}: {{W-|ms|کلداي}}, {{W-|ms|حمار}} *: Rûmî: {{W+|ms|keldai}}, {{W-|ms|himar}} * {{Z|ml}}: {{W+|ml|കഴുത}} * {{Z|mt}}: {{W-|mt|ħmar|n}} * {{Z|mnc}}: {{W-|mnc|ᡝᡳᡥᡝᠨ}} * {{Z|gv}}: {{W-|gv|assyl|n}} * {{Z|mi}}: {{W-|mi|kāihe}} * {{Z|mr}}: {{W+|mr|गाढव|n}} * {{Z|mhr}}: {{W-|mhr|осёл}} * {{Z|hu}}: {{W+|hu|szamár}} * {{Z|xmf}}: {{W-|xmf|გირინი}} * {{Z|mel}}: {{W-|mel|keledai}} * {{Z|egy}}: {{W-egy|ꜥꜣ|n|h=aA:D52-E7}} * {{Z|mdf}}: {{W-|mdf|ишме}} * {{Z|mn}}: {{W+|mn|илжиг}} * {{Z|nap}}: {{W-|nap|ciuccio}} * {{Z|nv}}: {{W-|nv|télii|sc=Latn}} * {{Z|nds}}: {{W+|nds|Esel|n}} * {{Z|nrf}}: {{W-|nrf|âne|n}} * {{Z|no}}: {{W+|no|esel|nt}} * {{Z|oc}}: {{W+|oc|ase}}, {{W+|oc|asne|n}} * {{Z|or}}: {{W+|or|ଗଧ}} * {{Z|om}}: {{W+|om|harree}} * {{Z|os}}: {{W-|os|хӕрӕг}} * {{Z|ota}}: {{W-|ota|اشك|tr=eşek}} * {{Z|ug}}: {{W-|ug|ئېشەك}} * {{Z|uz}}: {{W+|uz|eshak}} * {{Z|pi}}: {{W-|pi|gadrabha|n}} * {{Z|ps}}: {{W+|ps|خر|n|tr=xar}} * {{Z|pdt}}: {{W-|pdt|Äsel|n}} * {{Z|pox}}: {{W-|pox|asål|n}} * {{Z|pl}}: {{W+|pl|osioł|n}}, {{W+|pl|oślica|m}} * {{Z|pt}}: {{W+|pt|asno|n}}, {{W+|pt|jerico|n}}, {{W+|pt|jegue|n}}, {{W+|pt|jumento|n}}, {{W+|pt|burro|n}} * {{Z|pa}}: {{W-|pa|ਗਧਾ}} * {{Z|kk}}: {{W-|kk|есек}} * {{Z|cop}}: {{W-|cop|ⲉⲱ}} * {{Z|rm}}: {{W-|rm|asen}} * {{Z|rom}}: {{W-|rom|magari|n}}, {{W-|rom|magarka|m}} * {{Z|ro}}: {{W+|ro|măgar|n}}, {{W+|ro|asin|n}} * {{Z|ru}}: {{W+|ru|осёл|n}}, {{W-|ru|осли́ца|m}}, {{W-|ru|иша́к|n}} * {{Z|ssy}}: {{W-|ssy|zanan}} * {{Z|se}}: {{W-|se|ásen}} * {{Z|sm}}: {{W-|sm|asini}} * {{Z|sa}}: {{W+|sa|गर्दभ|n}} * {{Z|sc}}: {{W-|sc|burriccu}}, {{W-|sc|molenti}}, {{W-|sc|molingianu}}, {{W-|sc|àinu}} *: {{Z|sc}}: {{W-|sc|àinu}}, {{W-|sc|bestiolu}}, {{W-|sc|molènti}}, {{W-|sc|bistrassu}} *: {{Z|sc}}: {{W-|sc|poleddu}}, {{W-|sc|polléddu}}, {{W-|sc|pulléddu}}, {{W-|sc|àinu}}, {{W-|sc|àinu}} * {{Z|scn}}: {{W+|scn|sceccu|n}} * {{Z|sid}}: {{W-|sid|harre}} * {{Z|sd}}: {{W-|sd|گڏھ|tr=gaḋahu}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|ма̀гарац|n}}, {{W-|sh|то̀вар|n}} *: Latînî: {{W+|sh|màgarac|n}}, {{W+|sh|tòvar|n}} * {{Z|sco}}: {{W-|sco|cuddie}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|осьлъ|n}} * {{Z|orv}}: {{W-|orv|осьлъ|n}} * {{Z|sk}}: {{W-|sk|somár|n}}, {{W+|sk|osol|n}} * {{Z|sl}}: {{W+|sl|osel|n}}, {{W-|sl|oslica|m}} * {{Z|so}}: {{W+|so|dameer|n}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|ezel|n}}, {{W-|dsb|wósoł|n}} *: {{Z|hsb}}: {{W-|hsb|wosoł|n}} * {{Z|st}}: {{W+|st|tonki}} * {{Z|es}}: {{W+|es|asno|n}}, {{W+|es|burro|n}}, {{W+|es|jumento}} * {{Z|sux}}: {{W-|sux|𒀲|tr=ANŠE}} * {{Z|sw}}: {{W+|sw|punda}} * {{Z|sv}}: {{W+|sv|åsna}} * {{Z|tg}}: {{W+|tg|хар}} * {{Z|tl}}: {{W+|tl|asno}}, {{W-|tl|buriko}} * {{Z|ta}}: {{W+|ta|கழுதை}} * {{Z|twf}}: {{W-|twf|mùldu’úna}} * {{Z|rif}}: {{W-|rif|aɣyur|n}} * {{Z|th}}: {{W+|th|ลา}} * {{Z|te}}: {{W+|te|గాడిద}} * {{Z|crh}}: {{W-|crh|eşek}} * {{Z|tt}}: {{W+|tt|ишәк}} * {{Z|ti}}: {{W-|ti|ኣድጊ}} * {{Z|tr}}: {{W+|tr|eşek}}, {{W+|tr|merkep}}, {{W+|tr|sıpa}} * {{Z|tk}}: {{W-|tk|eşek}} * {{Z|bo}}: {{W-|bo|བོང་བུ}} * {{Z|tpi}}: {{W-|tpi|donki}}, {{W-|tpi|esel}} * {{Z|txb}}: {{W-|txb|kercapo}} * {{Z|tum}}: {{W-|tum|bulu}} * {{Z|tyv}}: {{W-|tyv|элчиген}} * {{Z|udi}}: {{W-|udi|елем}} * {{Z|udm}}: {{W-|udm|ишак}}, {{W-|udm|осёл}} * {{Z|ur}}: {{W-|ur|گدھا|n|tr=gadhā}} * {{Z|uk}}: {{W-|uk|осе́л|n}}, {{W-|uk|віслю́к|n}}, {{W-|uk|іша́к|n}} * {{Z|vec}}: {{W+|vec|muso|n}}, {{W+|vec|àxeno|n}} * {{Z|vi}}: {{W+|vi|lừa}} * {{Z|vo}}: {{W+|vo|cuk}} * {{Z|wa}}: {{W+|wa|ågne|n|m}}, {{W+|wa|bådet|n}}, {{W+|wa|både|m}}, {{W+|wa|bourike|m}}, {{W+|wa|ågntea|n}} * {{Z|wbl}}: {{W-|wbl|xur}} * {{Z|cy}}: {{W-|cy|asyn|n}} * {{Z|wo}}: {{W-|wo|mbaam-sëf|cuda=mbaam-sëf mi}}, {{W-|wo|mbaam-sëf}} * {{Z|km}}: {{W-|km|សត្វលា}}, {{W+|km|លា}} * {{Z|xh}}: {{W-|xh|imbongolo}} * {{Z|sah}}: {{W-|sah|осёл}} * {{Z|yi}}: {{W-|yi|אייזל|n}}, {{W-|yi|חמור|n|tr=khamer}} * {{Z|yo}}: {{W-|yo|kẹ́tẹ́kẹ́tẹ́}} * {{Z|el}}: {{W+|el|γάιδαρος|n}}, {{W+|el|γαϊδούρα|m}}, {{W+|el|γαϊδούρι|nt}}, {{W+|el|όνος|n|m}} *: Kevn: {{W-|grc|ὄνος|n|m}} * {{Z|zu}}: {{W-|zu|imbongolo}}, {{W-|zu|udonki}} * {{Z|zun}}: {{W-|zun|moshok'o}} {{werger-bin}} :{{werger çavkanî|en|donkey|beş=Ev qismê Wergerê|oldid=75539477}} === Navdêr 2 === [[Wêne:Cut-apple-slices_21575-480x360_(4900266300).jpg|thumb|Çend '''kerên''' sêvan.]] {{navdêr|ku|z=n}} {{k-ya nerm}} # {{maneid|ku|parçe}} [[felqe]], [[parçe]], [[qet]], [[par]], [[pirt]]<br> (bi taybetî ya ku bi [[kêr]]ê hatiye [[birîn]]). #* ''Hisreta me '''kerî nanê reş''', [[kas]]ek dewê tirş, [[yan]]ê hin [[toraq]] bû; lê dîsa em ji hale xwe razî bûn.''<ref>1931, ''Hakob Qezeryan-Lazo'', ''Serhatiya Casim'', guhastin:Haciyê Cindî-Emînê Evdal </ref> #: {{mk|ku|'''Kerek''' ji sêva xwe da min.}} #* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Cewherek lê kir nezer ew bû du '''ker'''<br />Paşê Wî çêkir ji nûra [[namuwer]]}} ==== Bi alfabeyên din ==== * {{ku-ar|که‌ر}} ==== Formên alternatîv ==== * {{g|ku|kert}} ==== Jê ==== {{kol3|ku | kerker | ker kirin | kerkirin | kerkirî | kêr | ker bûn<q:lêker> | ker kirin<q:lêker> | kerbûn<q:navdêr> | kerkirin<q:navdêr> | kerbûyî<q:rengdêr> | kerkirî<q:rengdêr> }} ==== Etîmolojî ==== Hevreha soranî {{g|ckb|که‌رت|tr=[[kert]]}}, hewramî û zazakî {{q|zza|kerd}}, [[kurdiya başûrî]] {{q|sdh|qeł|sc=Latn}}, belûçî {{q|bal||tr=karç}}, farisî {{g|fa|کارد|tr=kard}}, pehlewî ''kart'', avestayî ''kerite-'', sanskrîtî ''krti-'', ermeniya kevn {{g|xcl|քերեմ|tr=k'êrêm|w=[[jê birin]], [[xîç]] kirin}}, yûnaniya kevn {{g|grc|κείρω|tr=kêiro|w=[[birîn]], [[cew]] kirin}}, latînî {{q|la|curtus|w=[[kurt]]}}, îngilîzî {{q|en|share|w=[[par]], [[beş]]}}, {{q|en|shear|w=[[birîn]], [[cew]] kirin}}, {{q|en|short|w=[[kurt]]}}, hemû ji {{ji|ine-pro|ku|*(s)ker-|w=[[birîn]], [[jê kirin]]}}. :<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.243]], [[Şablon:Horn|Horn p.185]], [[Şablon:MacKenzie|MacKenzie P.129]], [[Şablon:Watkins|Watkins p.100]] </font> | <font style="font-size:10px">'''Pokorny: '''941 - 942</font> :<font style="font-size:10px">'''[[Hevreh]]''': [[kêr]] [[kurt]], [[çerm]]</font> ==== Bi zaravayên din ==== * {{Z|ckb}}: [[kert]] * {{Z|sdh}}: [[qeł]] ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Brotscheibe|m}}, {{W+|de|Scheibe|m}}, {{W+|de|Anteil|n}}, {{W+|de|Teil|n}}, {{W+|de|Stück|nt}} * {{Z|be}}: {{W-|be|лу́ста|m}}, {{W-|be|скрыль|n}}, {{W-|be|скі́ба|m}} * {{Z|bg}}: {{W+|bg|филия|nt}}, {{W+|bg|резен|n}} * {{Z|cs}}: {{W+|cs|krajíc|n}}, {{W+|cs|plátek|n}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|片|tr=pin3}} *: {{Z|cmn}}: {{W+|cmn|片|tr=piàn}} * {{Z|da}}: {{W+|da|skive|g}} * {{Z|ar}}: {{W-|ar|شريحة|m}} * {{Z|eo}}: {{W-|eo|tranĉaĵo}} * {{Z|et}}: {{W-|et|viilukas}}, {{W-|et|viil}} * {{Z|fa}}: {{W+|fa|قاچ|tr=qâč}}, {{W+|fa|تیکه|tr=tikke}}, {{W+|fa|لزگه|tr=lazge}}, {{W+|fa|کرچ|tr=karč}} * Polish: [[plaster]], [[plasterek]] ; [[kromka]], [[pajda]] ; [[kawałek]] ; * {{Z|fi}}: {{W+|fi|viipale}} * {{Z|fr}}: {{W+|fr|tranche|m}}, {{W+|fr|tronçon|n}} * {{Z|gd}}: {{W-|gd|sliseag|m}} * {{Z|gl}}: {{W+|gl|rebanda|m}}, {{W+|gl|toro|n}}, {{W-|gl|tallada|m}}, {{W+|gl|posta|m}} * {{Z|nl}}: {{W+|nl|plak|nt}}, {{W+|nl|schijf|nt}} * {{Z|he}}: {{W-|he|פְּרוּסָה|m|tr=prusá}}, {{W-|he|נֵתַח|n|tr=nétaḥ}}, {{W-|he|פֶּלַח|n|tr=pélaḥ}} * {{Z|io}}: {{W+|io|loncho}} * {{Z|en}}: {{W+|en|slice}} * {{Z|izh}}: {{W-|izh|pytky}} * {{Z|it}}: {{W+|it|fetta|m}}, {{W+|it|trancio|n}} * {{Z|is}}: {{W-|is|sneið|m}} * {{Z|ja}}: {{W-|ja|切れ|tr=きれ, kire|sc=Jpan}}, {{W+|ja|一片|tr=いっぺん, ippen|sc=Jpan}}, {{W-|ja|スライス|tr=suraisu|sc=Jpan}} * {{Z|ca}}: {{W+|ca|llesca|m}} * {{Z|ko}}: {{W+|ko|부분}}, {{W+|ko|몫}}, {{W-|ko|슬라이스}} * {{Z|lv}}: {{W+|lv|rika|m}} * {{Z|lo}}: {{W-|lo|ປ່ຽງ}}, {{W-|lo|ແຜ່ນບາງໆ}} * {{Z|lt}}: {{W-|lt|riekė̃|m}} * {{Z|mi}}: {{W-|mi|kōripi}}, {{W-|mi|topenga}} * {{Z|hu}}: {{W+|hu|szelet}}, {{W+|hu|karéj}} * {{Z|egy}}: {{W-egy|fdq|h=f:d-q-Z9:D40}} * {{Z|nrf}}: {{W-|nrf|tranche|m}} * {{Z|pt}}: {{W+|pt|fatia}} * {{Z|ro}}: {{W+|ro|felie|m}} * {{Z|ru}}: {{W-|ru|ломо́ть|n}}, {{W-|ru|ло́мтик|n}}, {{W-|ru|кусо́к|n}}, {{W-|ru|кусо́чек|n}}, {{W+|ru|слайс|n}} * {{Z|scn}}: {{W-|scn|feḍḍa|m}}, {{W+|scn|pezzu|n}} * {{Z|sh}}: {{W+|sh|kriška|m}} * {{Z|es}}: {{W+|es|rebanada|m}} * {{Z|sv}}: {{W+|sv|skiva|g}} * {{Z|th}}: {{W+|th|ชิ้น}} * {{Z|tr}}: {{W+|tr|dilim}} * {{Z|uk}}: {{W-|uk|ски́ба|m}}, {{W-|uk|ски́бка|m}}, {{W-|uk|шмато́к|n}}, {{W-|uk|кусо́к|n}} * {{Z|vi}}: {{W-|vi|lát mỏng}}, {{W-|vi|miếng mỏng}} * {{Z|cy}}: {{W-|cy|tafelll|m}} * {{Z|el}}: {{W+|el|φέτα|m}} *: Kevn: {{W-|grc|τέμαχος|nt}} {{werger-bin}} :{{werger çavkanî|en|slice|beş=Ev qismê Wergerê|oldid=75505183}} === Navdêr 3 === {{navdêr|ku|z=mn}} {{k-ya nerm}} # Kesa/ê tiştekî dike yan tiştek kiriye. #: {{mk|ku|Divê '''kerên''' vê xirabiyê bên sizadan.}} ==== Notên bikaranînê ==== {{agadarî}} Peyva '''ker''' bi vê maneyê kêm serbixwe peyda dibe lê pirtir wek paşgirekê di gel hin peyvan tê bikaranîn: ''[[çêker]], [[şerker]], [[sazker]] ==== Etîmolojî ==== {{etîmon|ku|:ji<metn:Ji [[rehê dema niha]] yê kevn ê>|kirin|id=kirin|metn=++|dar=1}} ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|doer}}, {{W+|en|actor}}, {{W+|en|agent}} {{werger-bin}} === Navdêr 4 === {{navdêr|ku|z=n}} # {{mj|kom, grûp}} {{bnr|kerî}} === Rengdêr 1 === {{rengdêr|ku}} {{k-ya nerm}}, {{r-ya req}} # {{senseid|ku|guhgiran}}Kesa/ê [[qet]] yan [[baş]] [[deng]]an [[bihîstin|nabihîze]]. #: {{hevmane|ku|guhgiran|nebihîz}} #: {{mk|ku|'''Ker''' û [[lal]]|kesa/ê ne [[karîn|dikare]] [[axiftin|biaxive]] û ne jî [[bîstin|bibîze]]|birêz=1}} ==== Bi alfabeyên din ==== * {{ku-ar|که‌ڕ}} ==== Formên alternatîv ==== * {{g|ku|kerr}} ==== Jê ==== {{kol3|ku | ker bûn<q:lêker> | ker kirin<q:lêker> | xwe lê ker kirin | kerbûn<q:navdêr> | kerkirin<q:navdêr> | kerbûyî<q:rengdêr> | kerkirî<q:rengdêr> | kerî | kerînî | kerîtî | kerker | kertî }} ==== Etîmolojî ==== Hevreha soranî {{g|ckb|که‌ڕ|tr=kerr}}, [[kurdiya başûrî]] [[keř]], zazakî ''kerr'', hewramî ''kerr'', belûçî {{g|ckb|کر|tr=kerr}}, {{hv|fa|کر|tr=kerr}}, {{hv|pal||k-rr|sc=Latn}}, soxdî ''k-rn-'', {{hv|ae||kerne-|sc=Latn}}, peştûyî {{g|ps|کوڼ|tr=kuṇ}}, {{hv|sa|कर्ण}} (kárṇa-: [[guh]]), slavoniya kevn [[кърнъ]] (kŭrnŭ), latviyayî [[kurls]], {{hv|lt|kurčias}}, hemû ji {{ji|ine-pro|ku|*kʷorno-|w=[[guh]]}}. Maneya bingehîn "guh" bû lê di zimanên îranî û yên [[baltî]] de maneya "[[guhgiran]]" wergirtiye. Di zimanên hindî de bi maneya "guh" maye: hindî [[कान]] (kan), urdûyî {{g|ur|کان|tr=kan}}, bengalî [[কর্ণ]] (korno) û [[কান]] (kan)... ==== Bide ber ==== {{kol2|ku| | {{g|ku|kor}} | {{g|ku|lal}} }} ==== Werger ==== {{werger-ser|guhgiran}} * {{Z|ab}}: {{W-|ab|адагәа}} * {{Z|ady}}: {{W-|ady|дэгу}} * {{Z|af}}: {{W-|af|dowe}} * {{Z|xag}}: {{W-|xag|𐕆𐔼𐕒𐔽𐔰}} * {{Z|akl}}: {{W-|akl|bungoe}} * {{Z|sq}}: {{W-|sq|i shurdhër}} * {{Z|de}}: {{W+|de|taub}}, {{W+|de|gehörlos}} * {{Z|an}}: {{W-|an|xordo}} * {{Z|rup}}: {{W-|rup|surdu}} * {{Z|as}}: {{W-|as|কলা}}, {{W-|as|অন্ধ}} * {{Z|ast}}: {{W-|ast|sordu}}, {{W-|ast|xordu}} * {{Z|av}}: {{W-|av|гӏинкъаб}} * {{Z|az}}: {{W+|az|kar}} * {{Z|ban}}: {{W-|ban|bongol}} * {{Z|eu}}: {{W+|eu|gor}} * {{Z|ba}}: {{W-|ba|һаңғырау}} * {{Z|sne}}: {{W-|sne|bongam}} * {{Z|be}}: {{W-|be|глухі́}} * {{Z|bcl}}: {{W-|bcl|bungog}} * {{Z|br}}: {{W+|br|bouzar}} * {{Z|bg}}: {{W+|bg|глух}} * {{Z|my}}: {{W+|my|နားပင်း}} * {{Z|ccc}}: {{W-|ccc|majchayi}} * {{Z|ce}}: {{W-|ce|къора}} * {{Z|cs}}: {{W+|cs|hluchý|n}} * {{Z|chr}}: {{W-|chr|ᏧᎵᎡᎾ}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|耳聾|tr=ji5 lung4}}, {{W-|yue|聾|tr=lung4}} *: {{Z|cmn}}: {{W+|cmn|聾|tr=lóng}}, {{W+|cmn|耳聾|tr=ěrlóng}} *: {{Z|nan}}: {{W-|nan|耳聾|tr=hīⁿ-lâng}} * {{Z|dlm}}: {{W-|dlm|suard}} * {{Z|da}}: {{W+|da|døv}} * {{Z|id}}: {{W+|id|tuli}}, {{W-|id|tuna rungu}} * {{Z|ar}}: {{W-|ar|أَصَمّ}} *: {{Z|arz}}: {{W-|arz|أصم|n|tr=ʔaṣamm}}, {{W-|arz|أطرش|n|tr=ʔaṭraš}} * {{Z|hy}}: {{W+|hy|խուլ}} * {{Z|eo}}: {{W+|eo|surda}} * {{Z|et}}: {{W-|et|kurt}} * {{Z|fa}}: {{W+|fa|کر|tr=kar}}, {{W+|fa|ناشنوا|tr=nâšenavâ}} * {{Z|fo}}: {{W-|fo|deyvur}} * {{Z|fi}}: {{W+|fi|kuuro}}, {{W-|fi|kuulovammainen}} * {{Z|fr}}: {{W+|fr|sourd}} * {{Z|fur}}: {{W-|fur|sort}}, {{W-|fur|sord}} * {{Z|frr}}: {{W-|frr|duuf}} * {{Z|fy}}: {{W-|fy|dôf}} * {{Z|gd}}: {{W-|gd|bodhar}} * {{Z|gl}}: {{W-|gl|xordo}} * {{Z|got}}: {{W-|got|𐌱𐌰𐌿𐌸𐍃}} * {{Z|ka}}: {{W+|ka|ყრუ}}, {{W-|ka|სმენადაკარგული}} * {{Z|ht}}: {{W-|ht|soud}} * {{Z|haw}}: {{W-|haw|kuli}} * {{Z|mba}}: {{W-|mba|bungol}} * {{Z|hi}}: {{W+|hi|बहरा}} * {{Z|nl}}: {{W+|nl|doof}}, {{W+|nl|dove}} * {{Z|hrx}}: {{W-|hrx|daab}} * {{Z|iba}}: {{W-|iba|achak}} * {{Z|he}}: {{W-|he|חֵירֵשׁ|tr=kheresh}} * {{Z|ang}}: {{W-|ang|dēaf}} * {{Z|en}}: {{W+|en|deaf}} * {{Z|izh}}: {{W-|izh|gluuhkoi}} * {{Z|ga}}: {{W-|ga|bodhar}} *: {{Z|sga}}: {{W-|sga|bodar}} * {{Z|ist}}: {{W-|ist|surdo}} * {{Z|it}}: {{W+|it|sordo}} * {{Z|is}}: {{W+|is|daufur}} * {{Z|ja}}: {{W-|ja|[[耳]]の[[聞こえる|聞こえない]]|tr=みみのきこえない, mimi no kikoenai}}, {{W-|ja|耳が不自由|tr=mimi ga fujiyuu}} * {{Z|kaw}}: {{W-|kaw|buḍĕg}} * {{Z|jv}}: {{W+|jv|budheg}}, {{W+|jv|jampeng}} * {{Z|kbd}}: {{W-|kbd|дэгу}} * {{Z|ca}}: {{W+|ca|sord}} * {{Z|kjj}}: {{W-|kjj|баьш}} * {{Z|si}}: {{W+|si|බිහිරි}} * {{Z|ko}}: {{W-|ko|[[귀머거리]]-의}} * {{Z|kw}}: {{W-|kw|bodhar}} * {{Z|co}}: {{W+|co|sordu}} * {{Z|lld}}: {{W-|lld|sëurt}} * {{Z|lad}}: {{W-|lad|sodro}} * {{Z|ltg}}: {{W-|ltg|kūrslys|n}} * {{Z|la}}: {{W+|la|surdus|n}} * {{Z|lv}}: {{W-|lv|kurls|n}}, {{W-|lv|nedzirdīgs}} * {{Z|lo}}: {{W-|lo|ຫູໜວກ}} * {{Z|lez}}: {{W-|lez|биши}} * {{Z|lt}}: {{W-|lt|kurčias}} * {{Z|lb}}: {{W+|lb|daf}} * {{Z|mk}}: {{W-|mk|глув}} * {{Z|pse}}: {{W-|pse|pekak}} * {{Z|ms}}: {{W+|ms|pekak}}, {{W-|ms|tuli}}, {{W-|ms|congek}}, {{W-|ms|tunakerna}} * {{Z|mt}}: {{W-|mt|trux}} * {{Z|mnc}}: {{W-|mnc|ᡩᡠᡨᡠ}} * {{Z|msk}}: {{W-|msk|bungul}} * {{Z|mi}}: {{W+|mi|turi}}, {{W-|mi|pūwharawhara}} * {{Z|mrw}}: {{W-|mrw|bengel}}, {{W-|mrw|biso}} * {{Z|mr}}: {{W-|mr|बधीर}}, {{W+|mr|बहिरा}} * {{Z|hu}}: {{W+|hu|süket}}, {{W+|hu|siket}} * {{Z|xmf}}: {{W-|xmf|ჸუნგა}}, {{W-|xmf|ჸურუ}}, {{W-|xmf|ჸუჯა}}, {{W-|xmf|დაგუა|cuda=დაგუ̂ა}} * {{Z|mel}}: {{W-|mel|pakeak}}, {{W-|mel|tulek}} * {{Z|mui}}: {{W-|mui|pekak}} * {{Z|nv}}: {{W-|nv|ajéékałgo ąąh dahazʼą́}}, {{W-|nv|jééhkał}} * {{Z|nds}}: {{W-|nds|dow}} * {{Z|nay}}: {{W-|nay|plombatji}} * {{Z|no}}: *: {{Z|no}}: {{W+|no|døv}} *: {{Z|nn}}: {{W+|nn|døv}}, {{W-|nn|dauv}} * {{Z|oc}}: {{W+|oc|sord}} * {{Z|or}}: {{W+|or|ବଧିର}} * {{Z|om}}: {{W-|om|duudaa}} * {{Z|ota}}: {{W-|ota|صاغر|tr=sağır}} * {{Z|ps}}: {{W+|ps|کوڼ|tr=kuṇ}} * {{Z|pdt}}: {{W-|pdt|doof}} * {{Z|pl}}: {{W+|pl|głuchy|n}} * {{Z|pt}}: {{W+|pt|surdo}} * {{Z|kk}}: {{W-|kk|саңырау}} * {{Z|ro}}: {{W+|ro|surd}} * {{Z|ru}}: {{W-|ru|глухо́й}} * {{Z|se}}: {{W-|se|bealjeheapmi}} * {{Z|sms}}: {{W-|sms|kluuǥǥai}} * {{Z|sa}}: {{W+|sa|बधिर}}, {{W+|sa|कल्ल}} * {{Z|sc}}: {{W-|sc|suldu}}, {{W-|sc|surdu}} * {{Z|ceb}}: {{W-|ceb|bungol}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|глув}}, {{W-|sh|глух}} *: Latînî: {{W+|sh|gluv}}, {{W+|sh|gluh}} * {{Z|sco}}: {{W-|sco|deif}} * {{Z|sk}}: {{W-|sk|hluchý|n}} * {{Z|sl}}: {{W+|sl|gluh}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|głuchy}} * {{Z|es}}: {{W+|es|sordo}} * {{Z|su}}: {{W-|su|torék}} * {{Z|sva}}: {{W-|sva|ყუ̂რიუ̂}}, {{W-|sva|ყუგ}} * {{Z|sv}}: {{W+|sv|döv}} * {{Z|tg}}: {{W+|tg|кар}} * {{Z|tl}}: {{W-|tl|bingi}} * {{Z|th}}: {{W-|th|หูหนวก}} * {{Z|te}}: {{W+|te|చెవిటి}} * {{Z|crh}}: {{W-|crh|sağır}} * {{Z|tr}}: {{W+|tr|sağır}} * {{Z|bo}}: {{W-|bo|འོན་པ}} * {{Z|tli}}: {{W-|tli|lkhool.áxhji}} * {{Z|ur}}: {{W-|ur|بہرا|tr=bahrā}} * {{Z|uby}}: {{W-|uby|дагәы}} * {{Z|uk}}: {{W-|uk|глухи́й}} * {{Z|vec}}: {{W-|vec|sórdo}} * {{Z|vi}}: {{W+|vi|điếc}} * {{Z|vo}}: {{W-|vo|surdik}} * {{Z|cy}}: {{W+|cy|byddar}} * {{Z|km}}: {{W+|km|ថ្លង់|tr=tlɑŋ}} * {{Z|yai}}: {{W-|yai|кар}} * {{Z|yi}}: {{W-|yi|טויב}}, {{W-|yi|טויבלעך}}, {{W-|yi|חושימדיק|tr=khushemdik}} * {{Z|esu}}: {{W-|esu|niitesciigatelria}} * {{Z|el}}: {{W+|el|κωφός|n}}, {{W+|el|κουφός|n}} *: Kevn: {{W-|grc|κωφός}} * {{Z|bfi}}: {{W-|bfi|H@Ear}} * {{Z|ase}}: {{W-|ase|1@Jaw 1@Chin}} {{werger-bin}} :{{werger çavkanî|en|deaf|beş=Ev qismê Wergerê|oldid=75710619}} === Rengdêr 2 === {{rengdêr|ku}} # {{mj|bêdeng}} {{bnr|kirr}} ==== Anagram ==== * {{anagram|ku|a=ekr|ekr|erk|rek}} === Çavkanî === {{çavkanî}} == {{ziman|ckb}} == === Navdêr === {{navdêr|ckb|sc=Latn}} # {{f|ckb|guhandar}} {{ckb-Arab|کەر}} == {{ziman|sl}} == === Girêdek === {{girêdek|sl}} # [[çimkî#ku|çimkî]], [[çunkî#ku|çunkî]], [[ji ber ku#ku|ji ber ku]] 29fsxxawc0s4llpq63o5k7qlfkssf96 6532110 6532109 2026-09-18T20:39:00Z Wikihez 7344 Kurmancî/Navdêr 3: beşa «Jê» hate zêdekirin (DefSideBoxes) 6532110 wikitext text/x-wiki {{h-bnr|ker|kêr|kerr|kêrr|-ker}} == {{ziman|ku}} == === Bilêvkirin === * {{q|ku|ker|cuda=(dewarek)|id=dewarek}} {{IPA|ku|/kʰɜɾ/}}, {{arF|که‌ر}} ** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker.wav|dever=Amed}} *** {{beş|Navdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 1).wav|dever=Bidlîs}} * {{beş|Navdêr 3}} {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-ker (Navdêr 3).wav|dever=Bidlîs}} * {{q|ku|ker|cuda=(parçe)|id=parçe}} {{IPA|ku|/kɜɾ/}}, {{arF|که‌ر}} ** {{q|ku|ker|cuda=(koma pezî)|id=koma pezî}} {{IPA|ku|/kɜɾ/}}, {{arF|که‌ر}} *** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-ker(koma pez).wav|dever=Qers}} **** {{beş|Navdêr 4}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 4).wav|dever=Bidlîs}} * {{q|ku|ker|cuda=(guhgiran)|id=guhgiran}} {{IPA|ku|/kɜr/}}, {{arF|که‌ڕ}} ** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-kerr.wav|dever=Qers}} *** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker (kesê ku nabihîze).wav|dever=Amed}} **** {{deng|ku|Kmr-Efrîn--kerr.oga|dever=Efrîn}} **** {{beş|Rengdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr 1).wav|dever=Bidlîs}} ***** {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr).wav|Deng|dever=Bidlîs}} === Navdêr 1 === [[Wêne:Donkey in Clovelly, North Devon, England.jpg|thumb|Kerek (1)]] [[Wêne:S Veahmätle13.JPG|thumb|'''Kerê''' pezî (2)]] {{navdêr|ku|z=n}} # {{maneid|ku|dewarek}} {{f|ku|guhandar}} [[cûn|Cûnek]] [[dewar]]an e ku [[şibîn|dişibe]] [[hesp]]an û [[hêstir]]an lê ji wan [[kurt]]tir û [[biçûk]]tir e <br>(bi taybetî bo barhilgirtinê tê bikaranîn). #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=ابله چه کت طوافی نابینتن بری رش</br>بیزی دکت ژ قنجان ژ رمز و ناز و غنجان</br>قدری گلان چه زانت کربش دڤیت '''کری''' رش|tr=Ebleh çi kit ṭewafê nabînitin Berê reş</br>Bêzê dikit ji qencan ji remz û naz û x̣encan</br>Qedrê gulan çi zanit kerbeş divêt '''kerê''' reş}} # {{maneid|ku|koma pezî}} [[kom|Komeke]] [[pez]]î, [[garan]]a pezî, [[ber]]ê pezî # {{maneid|ku|bêaqil}} {{f|ku|mecazî}} [[bêaqil|Bêaqil]], [[bêhiş]], [[bêmejî]], [[mejîreş]], [[aqilsivik]], [[nezan]]. # {{f|ku|mecazî|heqaret}} (ji peyva ker a heywan) ji bo kesê zir, serhişk û bêpîr û şerde #* {{J:Firat Cewerî:Girtî:1986|jêgirtin=- Hûn in, ha!. . . Ji bo çi hûn diziyê dikin '''ker''' lawê '''keran'''?}} ==== Tewandin ==== {{ku-tewîn-nav/nû|nêr}} ==== Notên bikaranînê ==== {{agadarî}} Di gelek devokên kurmancî de '''ker''' tenê bo van cûn dewarên nêr bi kar tê. Yên mê '''[[maker]]''' in. ==== Jê ==== {{kol3|ku | keratî | kerçove | kerçovetî | kerî | kerînî | kerîtî | kertî | kurrûk | maker | nêreker }} ==== Etîmolojî ==== Ji {{mîr|ira-pro||*xárah||ker}}, ji {{mîr|iir-pro||*kʰáras||ker}}; belkî taliyê ji zimanekî [[samî]]{{çp}}, bo nimûne ji {{ji|akk|ku|tr=xeradu|w=ker, nêreker}}.{{çp}} Hevreha soranî {{g|ckb|که‌ر|tr=ker}}, zazakî {{q|zza|her}}, hewramî {{g|hac|ھەر‎|tr=her}}, farisî {{g|fa|خر|tr=xer}}, avestayî {{g|ae|𐬑𐬀𐬭𐬀|tr=xere}}, sanskrîtî {{g|sa|खर|tr=khére}}, osetî {{g|os|хӕрӕг|tr=xereg}}, peştûyî {{g|ps|خر|tr=xer}}, belûçî {{g|bal|ہر|tr=her}}. ==== Gotinên pêşiyan ==== * [[şîreta kîrê ker e]] ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|کەر‎|tr=ker}} * {{Z|sdh}}: {{W-|sdh|xer|sc=Latn}} * {{Z|lki}}: {{W-|lki|xer|sc=Latn}} * {{Z|hac}}: {{W-|hac|her|sc=Latn}} * {{Z|zza}}: {{W-|zza|her}} ==== Werger ==== {{werger-ser|dewarek}} * {{Z|ab}}: {{W-|ab|аҽада}} * {{Z|ady}}: {{W-|ady|щыды}} * {{Z|aa}}: {{W-|aa|danán|n}} * {{Z|af}}: {{W+|af|donkie}} * {{Z|akk}}: {{W-|akk|𒀲|n|tr=imēru}} * {{Z|sq}}: {{W+|sq|gomar|n}}, {{W-|sq|magar|n}} * {{Z|de}}: {{W+|de|Esel|n}}; {{W+|de|Grauchen|nt}}, {{W-|de|Grautier|nt}} * {{Z|alt}}: {{W-|alt|эштек}} * {{Z|am}}: {{W-|am|አህያ|tr=äheyya}} * {{Z|ani}}: {{W-|ani|гьаморохи}} * {{Z|arc}}: *: {{Z|syc}}: {{W-|syc|ܚܡܪܐ|g|tr=ḥəmārā}}, {{W-|syc|ܚܡܪܬܐ|m|tr=ḥəmārtā}}, {{W-|syc|ܐܬܢܐ|m|tr=ʾăṯānā}} *: {{Z|tmr}}: {{W-|arc|חֲמָרָא|n|tr=ḥămārā}} * {{Z|rup}}: {{W-|rup|cãci}}, {{W-|rup|dãngã}}, {{W-|rup|gumar}}, {{W-|rup|dãnglãrã}}, {{W-|rup|shonj}}, {{W-|rup|tãronj}}, {{W-|rup|uci}}, {{W-|rup|uricljat}}, {{W-|rup|tar}} * {{Z|as}}: {{W-|as|গাধ}} * {{Z|ast}}: {{W+|ast|burru|n}}, {{W+|ast|burra|m}}, {{W+|ast|pollín|n}} * {{Z|aot}}: {{W-|aot|gada}} * {{Z|av}}: {{W-|av|хӏама}} * {{Z|awa}}: {{W-|awa|गदहा|n}} * {{Z|az}}: {{W+|az|eşşək}}, {{W-|az|ulaq}} * {{Z|bdr}}: {{W-|bdr|keribas}} * {{Z|eu}}: {{W+|eu|asto}} * {{Z|ba}}: {{W-|ba|ишәк}} * {{Z|sne}}: {{W-|sne|kaldei}} * {{Z|be}}: {{W-|be|асёл|n}} * {{Z|bal}}: {{W-|bal|ہر|tr=har}} * {{Z|bn}}: {{W+|bn|গাধা}} * {{Z|br}}: {{W+|br|azen|n}} * {{Z|bdk}}: {{W-|bdk|лем}} * {{Z|bg}}: {{W-|bg|мага́ре|nt}}, {{W-|bg|осе́л|n}} * {{Z|my}}: {{W+|my|မြည်း}} * {{Z|bua}}: {{W-|bua|элжэгэн}} * {{Z|ce}}: {{W-|ce|вир}} * {{Z|cs}}: {{W+|cs|osel|n}} * {{Z|chr}}: {{W-|chr|ᏗᎦᎵᏅᎯᏛ}} * {{Z|chy}}: {{W-|chy|a'éevo'ha}} * {{Z|ny}}: {{W-|ny|bulu}} * {{Z|cic}}: {{W-|cic|haksibish falaa'}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|驢|tr=leoi4}}, {{W-|yue|驢仔|tr=leoi4 zai2}} *: {{Z|dng}}: {{W-|dng|лү}} *: {{Z|hak}}: {{W-|hak|驢仔|tr=lì-è}} *: {{Z|cmn}}: {{W+|cmn|驢|tr=lǘ}}, {{W-|cmn|驢子|tr=lǘzi}} *: {{Z|cdo}}: {{W-|cdo|驢|tr=lè̤}} *: {{Z|nan}}: {{W+|nan|驢|tr=lîr / lû / lî}}, {{W+|nan|驢仔|tr=lû-á / lî-á / lîr-á}} *: {{Z|wuu}}: {{W-|wuu|驢}} * {{Z|cv}}: {{W-|cv|ашак}} * {{Z|chk}}: {{W-|chk|tongki}} * {{Z|dlm}}: {{W-|dlm|samur|n}} * {{Z|da}}: {{W+|da|æsel|nt}} * {{Z|dv}}: {{W-|dv|ހިާމރު}} * {{Z|ovd}}: {{W-|ovd|åsn|m}} * {{Z|id}}: {{W+|id|keledai}} * {{Z|ar}}: {{W+|ar|حِمَار|n}} *: {{Z|arz}}: {{W-|arz|حمار|n|tr=ḥumār, ḥmār}} *: {{Z|acw}}: {{W-|acw|حُمار|n|tr=ḥumār}} *: {{Z|acm}}: {{W-|acm|زمال|n|tr=zmāl}} *: {{Z|afb}}: {{W-|afb|حمار|n|tr=ḥmār}} *: {{Z|aeb}}: {{W-|aeb|بهيم|n|tr=bhīm}} *: {{Z|ary}}: {{W-|ary|حمار|n|tr=ḥmār}}, {{W-|ary|حمارة|m|tr=ḥmāra}}, {{W-|ary|دحش|tr=daḥš}}, {{W-|ary|دحشة|m|tr=daḥša}} * {{Z|hy}}: {{W+|hy|էշ}}, {{W+|hy|ավանակ}} * {{Z|eo}}: {{W+|eo|azeno}} * {{Z|et}}: {{W+|et|eesel}} * {{Z|gez}}: {{W-|gez|አድግ}} * {{Z|ee}}: {{W-|ee|tedzi|nt}} * {{Z|fa}}: {{W+|fa|خر|tr=xar}}, {{W+|fa|الاغ|tr=olâğ}} * {{Z|fo}}: {{W-|fo|asni}} * {{Z|fi}}: {{W+|fi|aasi}} * {{Z|fro}}: {{W-|fro|asne|n}} * {{Z|fr}}: {{W+|fr|âne|n}} * {{Z|fur}}: {{W-|fur|mus}} * {{Z|fy}}: {{W-|fy|ezel}} * {{Z|gd}}: {{W-|gd|asal|m}} * {{Z|gag}}: {{W-|gag|eşek}}, {{W-|gag|yeşek}} * {{Z|gl}}: {{W+|gl|asno}}, {{W+|gl|burro}} * {{Z|got}}: {{W-|got|𐌰𐍃𐌹𐌻𐌿𐍃}} * {{Z|gu}}: {{W-|gu|ગધેડો}} * {{Z|ka}}: {{W+|ka|ვირი}}, {{W+|ka|ჯორი}} * {{Z|ha}}: {{W+|ha|jaki}} * {{Z|hi}}: {{W+|hi|गधा|n}} * {{Z|nl}}: {{W+|nl|ezel|n}} * {{Z|he}}: {{W-|he|חֲמוֹר|n|tr=khamór}}, {{W-|he|אָתוֹן|m|tr=atón}} * {{Z|io}}: {{W+|io|asno}} * {{Z|ang}}: {{W-|ang|esol|n}} * {{Z|en}}: {{W+|en|donkey}} * {{Z|inh}}: {{W-|inh|вир}} * {{Z|ia}}: {{W-|ia|asino}} * {{Z|ga}}: {{W+|ga|asal|n}} * {{Z|ist}}: {{W-|ist|samèri|n-p}} * {{Z|it}}: {{W+|it|asino|n}}, {{W+|it|somaro|n}}, {{W-|it|buricco|n}}, {{W+|it|ciuco}} * {{Z|is}}: {{W+|is|asni}} * {{Z|ja}}: {{W+|ja|驢馬|tr=ろば, roba}}, {{W+|ja|ロバ|tr=roba}} * {{Z|kab}}: {{W-|kab|aɣyul|n}} * {{Z|kl}}: {{W-|kl|siutitooq}} * {{Z|xal}}: {{W-|xal|элҗгн}} * {{Z|ktb}}: {{W-|ktb|harreta}} * {{Z|kn}}: {{W+|kn|ಕತ್ತೆ}} * {{Z|krc}}: {{W-|krc|эшек|tr=eşek}} * {{Z|csb}}: {{W-|csb|osoł|n}}, {{W-|csb|òseł}} * {{Z|ca}}: {{W+|ca|ase|n}}, {{W+|ca|somera|m}}, {{W+|ca|burro|n}}, {{W+|ca|burra|m}}, {{W+|ca|ruc|n}}, {{W+|ca|ruca|m}} * {{Z|qu}}: {{W-|qu|wuru}}, {{W-|qu|asnu}} * {{Z|ks}}: {{W-|ks|خَر|n}} * {{Z|ky}}: {{W+|ky|эшек}} * Ladin: *: {{Z|lld}}: {{W-|lld|musciat|n}} *: {{Z|lld}}: {{W-|lld|müsc|n}} *: {{Z|lld}}: {{W-|lld|èsen|n}},{{W-|lld|musciat|n}} * {{Z|si}}: {{W+|si|බූරුවා}} * {{Z|ko}}: {{W+|ko|당나귀}}, {{W+|ko|나귀}} * {{Z|rop}}: {{W-|rop|ginggong ginggong}} * {{Z|la}}: {{W-|la|asellus}}, {{W-|la|asinus|n}} * {{Z|lv}}: {{W-|lv|ēzelis|n}} * {{Z|lo}}: {{W-|lo|ລາ}}, {{W-|lo|ມ້າລໍ}} * {{Z|lzz}}: {{W-|lzz|ეშეღი}} * {{Z|lez}}: {{W-|lez|лам}} * {{Z|lij}}: {{W-|lij|ase}} * {{Z|li}}: {{W+|li|aezel}} * {{Z|lt}}: {{W+|lt|asilas|n}} * {{Z|khb}}: {{W-|khb|ᩃᩣ}} * {{Z|lb}}: {{W-|lb|Iesel|n}} * {{Z|luo}}: {{W-|luo|punda}} * {{Z|mk}}: {{W-|mk|магаре|nt}} * Malay: *: {{Z|ms}}: {{W-|ms|کلداي}}, {{W-|ms|حمار}} *: Rûmî: {{W+|ms|keldai}}, {{W-|ms|himar}} * {{Z|ml}}: {{W+|ml|കഴുത}} * {{Z|mt}}: {{W-|mt|ħmar|n}} * {{Z|mnc}}: {{W-|mnc|ᡝᡳᡥᡝᠨ}} * {{Z|gv}}: {{W-|gv|assyl|n}} * {{Z|mi}}: {{W-|mi|kāihe}} * {{Z|mr}}: {{W+|mr|गाढव|n}} * {{Z|mhr}}: {{W-|mhr|осёл}} * {{Z|hu}}: {{W+|hu|szamár}} * {{Z|xmf}}: {{W-|xmf|გირინი}} * {{Z|mel}}: {{W-|mel|keledai}} * {{Z|egy}}: {{W-egy|ꜥꜣ|n|h=aA:D52-E7}} * {{Z|mdf}}: {{W-|mdf|ишме}} * {{Z|mn}}: {{W+|mn|илжиг}} * {{Z|nap}}: {{W-|nap|ciuccio}} * {{Z|nv}}: {{W-|nv|télii|sc=Latn}} * {{Z|nds}}: {{W+|nds|Esel|n}} * {{Z|nrf}}: {{W-|nrf|âne|n}} * {{Z|no}}: {{W+|no|esel|nt}} * {{Z|oc}}: {{W+|oc|ase}}, {{W+|oc|asne|n}} * {{Z|or}}: {{W+|or|ଗଧ}} * {{Z|om}}: {{W+|om|harree}} * {{Z|os}}: {{W-|os|хӕрӕг}} * {{Z|ota}}: {{W-|ota|اشك|tr=eşek}} * {{Z|ug}}: {{W-|ug|ئېشەك}} * {{Z|uz}}: {{W+|uz|eshak}} * {{Z|pi}}: {{W-|pi|gadrabha|n}} * {{Z|ps}}: {{W+|ps|خر|n|tr=xar}} * {{Z|pdt}}: {{W-|pdt|Äsel|n}} * {{Z|pox}}: {{W-|pox|asål|n}} * {{Z|pl}}: {{W+|pl|osioł|n}}, {{W+|pl|oślica|m}} * {{Z|pt}}: {{W+|pt|asno|n}}, {{W+|pt|jerico|n}}, {{W+|pt|jegue|n}}, {{W+|pt|jumento|n}}, {{W+|pt|burro|n}} * {{Z|pa}}: {{W-|pa|ਗਧਾ}} * {{Z|kk}}: {{W-|kk|есек}} * {{Z|cop}}: {{W-|cop|ⲉⲱ}} * {{Z|rm}}: {{W-|rm|asen}} * {{Z|rom}}: {{W-|rom|magari|n}}, {{W-|rom|magarka|m}} * {{Z|ro}}: {{W+|ro|măgar|n}}, {{W+|ro|asin|n}} * {{Z|ru}}: {{W+|ru|осёл|n}}, {{W-|ru|осли́ца|m}}, {{W-|ru|иша́к|n}} * {{Z|ssy}}: {{W-|ssy|zanan}} * {{Z|se}}: {{W-|se|ásen}} * {{Z|sm}}: {{W-|sm|asini}} * {{Z|sa}}: {{W+|sa|गर्दभ|n}} * {{Z|sc}}: {{W-|sc|burriccu}}, {{W-|sc|molenti}}, {{W-|sc|molingianu}}, {{W-|sc|àinu}} *: {{Z|sc}}: {{W-|sc|àinu}}, {{W-|sc|bestiolu}}, {{W-|sc|molènti}}, {{W-|sc|bistrassu}} *: {{Z|sc}}: {{W-|sc|poleddu}}, {{W-|sc|polléddu}}, {{W-|sc|pulléddu}}, {{W-|sc|àinu}}, {{W-|sc|àinu}} * {{Z|scn}}: {{W+|scn|sceccu|n}} * {{Z|sid}}: {{W-|sid|harre}} * {{Z|sd}}: {{W-|sd|گڏھ|tr=gaḋahu}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|ма̀гарац|n}}, {{W-|sh|то̀вар|n}} *: Latînî: {{W+|sh|màgarac|n}}, {{W+|sh|tòvar|n}} * {{Z|sco}}: {{W-|sco|cuddie}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|осьлъ|n}} * {{Z|orv}}: {{W-|orv|осьлъ|n}} * {{Z|sk}}: {{W-|sk|somár|n}}, {{W+|sk|osol|n}} * {{Z|sl}}: {{W+|sl|osel|n}}, {{W-|sl|oslica|m}} * {{Z|so}}: {{W+|so|dameer|n}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|ezel|n}}, {{W-|dsb|wósoł|n}} *: {{Z|hsb}}: {{W-|hsb|wosoł|n}} * {{Z|st}}: {{W+|st|tonki}} * {{Z|es}}: {{W+|es|asno|n}}, {{W+|es|burro|n}}, {{W+|es|jumento}} * {{Z|sux}}: {{W-|sux|𒀲|tr=ANŠE}} * {{Z|sw}}: {{W+|sw|punda}} * {{Z|sv}}: {{W+|sv|åsna}} * {{Z|tg}}: {{W+|tg|хар}} * {{Z|tl}}: {{W+|tl|asno}}, {{W-|tl|buriko}} * {{Z|ta}}: {{W+|ta|கழுதை}} * {{Z|twf}}: {{W-|twf|mùldu’úna}} * {{Z|rif}}: {{W-|rif|aɣyur|n}} * {{Z|th}}: {{W+|th|ลา}} * {{Z|te}}: {{W+|te|గాడిద}} * {{Z|crh}}: {{W-|crh|eşek}} * {{Z|tt}}: {{W+|tt|ишәк}} * {{Z|ti}}: {{W-|ti|ኣድጊ}} * {{Z|tr}}: {{W+|tr|eşek}}, {{W+|tr|merkep}}, {{W+|tr|sıpa}} * {{Z|tk}}: {{W-|tk|eşek}} * {{Z|bo}}: {{W-|bo|བོང་བུ}} * {{Z|tpi}}: {{W-|tpi|donki}}, {{W-|tpi|esel}} * {{Z|txb}}: {{W-|txb|kercapo}} * {{Z|tum}}: {{W-|tum|bulu}} * {{Z|tyv}}: {{W-|tyv|элчиген}} * {{Z|udi}}: {{W-|udi|елем}} * {{Z|udm}}: {{W-|udm|ишак}}, {{W-|udm|осёл}} * {{Z|ur}}: {{W-|ur|گدھا|n|tr=gadhā}} * {{Z|uk}}: {{W-|uk|осе́л|n}}, {{W-|uk|віслю́к|n}}, {{W-|uk|іша́к|n}} * {{Z|vec}}: {{W+|vec|muso|n}}, {{W+|vec|àxeno|n}} * {{Z|vi}}: {{W+|vi|lừa}} * {{Z|vo}}: {{W+|vo|cuk}} * {{Z|wa}}: {{W+|wa|ågne|n|m}}, {{W+|wa|bådet|n}}, {{W+|wa|både|m}}, {{W+|wa|bourike|m}}, {{W+|wa|ågntea|n}} * {{Z|wbl}}: {{W-|wbl|xur}} * {{Z|cy}}: {{W-|cy|asyn|n}} * {{Z|wo}}: {{W-|wo|mbaam-sëf|cuda=mbaam-sëf mi}}, {{W-|wo|mbaam-sëf}} * {{Z|km}}: {{W-|km|សត្វលា}}, {{W+|km|លា}} * {{Z|xh}}: {{W-|xh|imbongolo}} * {{Z|sah}}: {{W-|sah|осёл}} * {{Z|yi}}: {{W-|yi|אייזל|n}}, {{W-|yi|חמור|n|tr=khamer}} * {{Z|yo}}: {{W-|yo|kẹ́tẹ́kẹ́tẹ́}} * {{Z|el}}: {{W+|el|γάιδαρος|n}}, {{W+|el|γαϊδούρα|m}}, {{W+|el|γαϊδούρι|nt}}, {{W+|el|όνος|n|m}} *: Kevn: {{W-|grc|ὄνος|n|m}} * {{Z|zu}}: {{W-|zu|imbongolo}}, {{W-|zu|udonki}} * {{Z|zun}}: {{W-|zun|moshok'o}} {{werger-bin}} :{{werger çavkanî|en|donkey|beş=Ev qismê Wergerê|oldid=75539477}} === Navdêr 2 === [[Wêne:Cut-apple-slices_21575-480x360_(4900266300).jpg|thumb|Çend '''kerên''' sêvan.]] {{navdêr|ku|z=n}} {{k-ya nerm}} # {{maneid|ku|parçe}} [[felqe]], [[parçe]], [[qet]], [[par]], [[pirt]]<br> (bi taybetî ya ku bi [[kêr]]ê hatiye [[birîn]]). #* ''Hisreta me '''kerî nanê reş''', [[kas]]ek dewê tirş, [[yan]]ê hin [[toraq]] bû; lê dîsa em ji hale xwe razî bûn.''<ref>1931, ''Hakob Qezeryan-Lazo'', ''Serhatiya Casim'', guhastin:Haciyê Cindî-Emînê Evdal </ref> #: {{mk|ku|'''Kerek''' ji sêva xwe da min.}} #* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Cewherek lê kir nezer ew bû du '''ker'''<br />Paşê Wî çêkir ji nûra [[namuwer]]}} ==== Bi alfabeyên din ==== * {{ku-ar|که‌ر}} ==== Formên alternatîv ==== * {{g|ku|kert}} ==== Jê ==== {{kol3|ku | kerker | ker kirin | kerkirin | kerkirî | kêr | ker bûn<q:lêker> | ker kirin<q:lêker> | kerbûn<q:navdêr> | kerkirin<q:navdêr> | kerbûyî<q:rengdêr> | kerkirî<q:rengdêr> }} ==== Etîmolojî ==== Hevreha soranî {{g|ckb|که‌رت|tr=[[kert]]}}, hewramî û zazakî {{q|zza|kerd}}, [[kurdiya başûrî]] {{q|sdh|qeł|sc=Latn}}, belûçî {{q|bal||tr=karç}}, farisî {{g|fa|کارد|tr=kard}}, pehlewî ''kart'', avestayî ''kerite-'', sanskrîtî ''krti-'', ermeniya kevn {{g|xcl|քերեմ|tr=k'êrêm|w=[[jê birin]], [[xîç]] kirin}}, yûnaniya kevn {{g|grc|κείρω|tr=kêiro|w=[[birîn]], [[cew]] kirin}}, latînî {{q|la|curtus|w=[[kurt]]}}, îngilîzî {{q|en|share|w=[[par]], [[beş]]}}, {{q|en|shear|w=[[birîn]], [[cew]] kirin}}, {{q|en|short|w=[[kurt]]}}, hemû ji {{ji|ine-pro|ku|*(s)ker-|w=[[birîn]], [[jê kirin]]}}. :<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.243]], [[Şablon:Horn|Horn p.185]], [[Şablon:MacKenzie|MacKenzie P.129]], [[Şablon:Watkins|Watkins p.100]] </font> | <font style="font-size:10px">'''Pokorny: '''941 - 942</font> :<font style="font-size:10px">'''[[Hevreh]]''': [[kêr]] [[kurt]], [[çerm]]</font> ==== Bi zaravayên din ==== * {{Z|ckb}}: [[kert]] * {{Z|sdh}}: [[qeł]] ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Brotscheibe|m}}, {{W+|de|Scheibe|m}}, {{W+|de|Anteil|n}}, {{W+|de|Teil|n}}, {{W+|de|Stück|nt}} * {{Z|be}}: {{W-|be|лу́ста|m}}, {{W-|be|скрыль|n}}, {{W-|be|скі́ба|m}} * {{Z|bg}}: {{W+|bg|филия|nt}}, {{W+|bg|резен|n}} * {{Z|cs}}: {{W+|cs|krajíc|n}}, {{W+|cs|plátek|n}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|片|tr=pin3}} *: {{Z|cmn}}: {{W+|cmn|片|tr=piàn}} * {{Z|da}}: {{W+|da|skive|g}} * {{Z|ar}}: {{W-|ar|شريحة|m}} * {{Z|eo}}: {{W-|eo|tranĉaĵo}} * {{Z|et}}: {{W-|et|viilukas}}, {{W-|et|viil}} * {{Z|fa}}: {{W+|fa|قاچ|tr=qâč}}, {{W+|fa|تیکه|tr=tikke}}, {{W+|fa|لزگه|tr=lazge}}, {{W+|fa|کرچ|tr=karč}} * Polish: [[plaster]], [[plasterek]] ; [[kromka]], [[pajda]] ; [[kawałek]] ; * {{Z|fi}}: {{W+|fi|viipale}} * {{Z|fr}}: {{W+|fr|tranche|m}}, {{W+|fr|tronçon|n}} * {{Z|gd}}: {{W-|gd|sliseag|m}} * {{Z|gl}}: {{W+|gl|rebanda|m}}, {{W+|gl|toro|n}}, {{W-|gl|tallada|m}}, {{W+|gl|posta|m}} * {{Z|nl}}: {{W+|nl|plak|nt}}, {{W+|nl|schijf|nt}} * {{Z|he}}: {{W-|he|פְּרוּסָה|m|tr=prusá}}, {{W-|he|נֵתַח|n|tr=nétaḥ}}, {{W-|he|פֶּלַח|n|tr=pélaḥ}} * {{Z|io}}: {{W+|io|loncho}} * {{Z|en}}: {{W+|en|slice}} * {{Z|izh}}: {{W-|izh|pytky}} * {{Z|it}}: {{W+|it|fetta|m}}, {{W+|it|trancio|n}} * {{Z|is}}: {{W-|is|sneið|m}} * {{Z|ja}}: {{W-|ja|切れ|tr=きれ, kire|sc=Jpan}}, {{W+|ja|一片|tr=いっぺん, ippen|sc=Jpan}}, {{W-|ja|スライス|tr=suraisu|sc=Jpan}} * {{Z|ca}}: {{W+|ca|llesca|m}} * {{Z|ko}}: {{W+|ko|부분}}, {{W+|ko|몫}}, {{W-|ko|슬라이스}} * {{Z|lv}}: {{W+|lv|rika|m}} * {{Z|lo}}: {{W-|lo|ປ່ຽງ}}, {{W-|lo|ແຜ່ນບາງໆ}} * {{Z|lt}}: {{W-|lt|riekė̃|m}} * {{Z|mi}}: {{W-|mi|kōripi}}, {{W-|mi|topenga}} * {{Z|hu}}: {{W+|hu|szelet}}, {{W+|hu|karéj}} * {{Z|egy}}: {{W-egy|fdq|h=f:d-q-Z9:D40}} * {{Z|nrf}}: {{W-|nrf|tranche|m}} * {{Z|pt}}: {{W+|pt|fatia}} * {{Z|ro}}: {{W+|ro|felie|m}} * {{Z|ru}}: {{W-|ru|ломо́ть|n}}, {{W-|ru|ло́мтик|n}}, {{W-|ru|кусо́к|n}}, {{W-|ru|кусо́чек|n}}, {{W+|ru|слайс|n}} * {{Z|scn}}: {{W-|scn|feḍḍa|m}}, {{W+|scn|pezzu|n}} * {{Z|sh}}: {{W+|sh|kriška|m}} * {{Z|es}}: {{W+|es|rebanada|m}} * {{Z|sv}}: {{W+|sv|skiva|g}} * {{Z|th}}: {{W+|th|ชิ้น}} * {{Z|tr}}: {{W+|tr|dilim}} * {{Z|uk}}: {{W-|uk|ски́ба|m}}, {{W-|uk|ски́бка|m}}, {{W-|uk|шмато́к|n}}, {{W-|uk|кусо́к|n}} * {{Z|vi}}: {{W-|vi|lát mỏng}}, {{W-|vi|miếng mỏng}} * {{Z|cy}}: {{W-|cy|tafelll|m}} * {{Z|el}}: {{W+|el|φέτα|m}} *: Kevn: {{W-|grc|τέμαχος|nt}} {{werger-bin}} :{{werger çavkanî|en|slice|beş=Ev qismê Wergerê|oldid=75505183}} === Navdêr 3 === {{navdêr|ku|z=mn}} {{k-ya nerm}} # Kesa/ê tiştekî dike yan tiştek kiriye. #: {{mk|ku|Divê '''kerên''' vê xirabiyê bên sizadan.}} ==== Notên bikaranînê ==== {{agadarî}} Peyva '''ker''' bi vê maneyê kêm serbixwe peyda dibe lê pirtir wek paşgirekê di gel hin peyvan tê bikaranîn: ''[[çêker]], [[şerker]], [[sazker]] ==== Jê ==== {{kol3|ku|cure=Jê |-ker }} ==== Etîmolojî ==== {{etîmon|ku|:ji<metn:Ji [[rehê dema niha]] yê kevn ê>|kirin|id=kirin|metn=++|dar=1}} ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|doer}}, {{W+|en|actor}}, {{W+|en|agent}} {{werger-bin}} === Navdêr 4 === {{navdêr|ku|z=n}} # {{mj|kom, grûp}} {{bnr|kerî}} === Rengdêr 1 === {{rengdêr|ku}} {{k-ya nerm}}, {{r-ya req}} # {{senseid|ku|guhgiran}}Kesa/ê [[qet]] yan [[baş]] [[deng]]an [[bihîstin|nabihîze]]. #: {{hevmane|ku|guhgiran|nebihîz}} #: {{mk|ku|'''Ker''' û [[lal]]|kesa/ê ne [[karîn|dikare]] [[axiftin|biaxive]] û ne jî [[bîstin|bibîze]]|birêz=1}} ==== Bi alfabeyên din ==== * {{ku-ar|که‌ڕ}} ==== Formên alternatîv ==== * {{g|ku|kerr}} ==== Jê ==== {{kol3|ku | ker bûn<q:lêker> | ker kirin<q:lêker> | xwe lê ker kirin | kerbûn<q:navdêr> | kerkirin<q:navdêr> | kerbûyî<q:rengdêr> | kerkirî<q:rengdêr> | kerî | kerînî | kerîtî | kerker | kertî }} ==== Etîmolojî ==== Hevreha soranî {{g|ckb|که‌ڕ|tr=kerr}}, [[kurdiya başûrî]] [[keř]], zazakî ''kerr'', hewramî ''kerr'', belûçî {{g|ckb|کر|tr=kerr}}, {{hv|fa|کر|tr=kerr}}, {{hv|pal||k-rr|sc=Latn}}, soxdî ''k-rn-'', {{hv|ae||kerne-|sc=Latn}}, peştûyî {{g|ps|کوڼ|tr=kuṇ}}, {{hv|sa|कर्ण}} (kárṇa-: [[guh]]), slavoniya kevn [[кърнъ]] (kŭrnŭ), latviyayî [[kurls]], {{hv|lt|kurčias}}, hemû ji {{ji|ine-pro|ku|*kʷorno-|w=[[guh]]}}. Maneya bingehîn "guh" bû lê di zimanên îranî û yên [[baltî]] de maneya "[[guhgiran]]" wergirtiye. Di zimanên hindî de bi maneya "guh" maye: hindî [[कान]] (kan), urdûyî {{g|ur|کان|tr=kan}}, bengalî [[কর্ণ]] (korno) û [[কান]] (kan)... ==== Bide ber ==== {{kol2|ku| | {{g|ku|kor}} | {{g|ku|lal}} }} ==== Werger ==== {{werger-ser|guhgiran}} * {{Z|ab}}: {{W-|ab|адагәа}} * {{Z|ady}}: {{W-|ady|дэгу}} * {{Z|af}}: {{W-|af|dowe}} * {{Z|xag}}: {{W-|xag|𐕆𐔼𐕒𐔽𐔰}} * {{Z|akl}}: {{W-|akl|bungoe}} * {{Z|sq}}: {{W-|sq|i shurdhër}} * {{Z|de}}: {{W+|de|taub}}, {{W+|de|gehörlos}} * {{Z|an}}: {{W-|an|xordo}} * {{Z|rup}}: {{W-|rup|surdu}} * {{Z|as}}: {{W-|as|কলা}}, {{W-|as|অন্ধ}} * {{Z|ast}}: {{W-|ast|sordu}}, {{W-|ast|xordu}} * {{Z|av}}: {{W-|av|гӏинкъаб}} * {{Z|az}}: {{W+|az|kar}} * {{Z|ban}}: {{W-|ban|bongol}} * {{Z|eu}}: {{W+|eu|gor}} * {{Z|ba}}: {{W-|ba|һаңғырау}} * {{Z|sne}}: {{W-|sne|bongam}} * {{Z|be}}: {{W-|be|глухі́}} * {{Z|bcl}}: {{W-|bcl|bungog}} * {{Z|br}}: {{W+|br|bouzar}} * {{Z|bg}}: {{W+|bg|глух}} * {{Z|my}}: {{W+|my|နားပင်း}} * {{Z|ccc}}: {{W-|ccc|majchayi}} * {{Z|ce}}: {{W-|ce|къора}} * {{Z|cs}}: {{W+|cs|hluchý|n}} * {{Z|chr}}: {{W-|chr|ᏧᎵᎡᎾ}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|耳聾|tr=ji5 lung4}}, {{W-|yue|聾|tr=lung4}} *: {{Z|cmn}}: {{W+|cmn|聾|tr=lóng}}, {{W+|cmn|耳聾|tr=ěrlóng}} *: {{Z|nan}}: {{W-|nan|耳聾|tr=hīⁿ-lâng}} * {{Z|dlm}}: {{W-|dlm|suard}} * {{Z|da}}: {{W+|da|døv}} * {{Z|id}}: {{W+|id|tuli}}, {{W-|id|tuna rungu}} * {{Z|ar}}: {{W-|ar|أَصَمّ}} *: {{Z|arz}}: {{W-|arz|أصم|n|tr=ʔaṣamm}}, {{W-|arz|أطرش|n|tr=ʔaṭraš}} * {{Z|hy}}: {{W+|hy|խուլ}} * {{Z|eo}}: {{W+|eo|surda}} * {{Z|et}}: {{W-|et|kurt}} * {{Z|fa}}: {{W+|fa|کر|tr=kar}}, {{W+|fa|ناشنوا|tr=nâšenavâ}} * {{Z|fo}}: {{W-|fo|deyvur}} * {{Z|fi}}: {{W+|fi|kuuro}}, {{W-|fi|kuulovammainen}} * {{Z|fr}}: {{W+|fr|sourd}} * {{Z|fur}}: {{W-|fur|sort}}, {{W-|fur|sord}} * {{Z|frr}}: {{W-|frr|duuf}} * {{Z|fy}}: {{W-|fy|dôf}} * {{Z|gd}}: {{W-|gd|bodhar}} * {{Z|gl}}: {{W-|gl|xordo}} * {{Z|got}}: {{W-|got|𐌱𐌰𐌿𐌸𐍃}} * {{Z|ka}}: {{W+|ka|ყრუ}}, {{W-|ka|სმენადაკარგული}} * {{Z|ht}}: {{W-|ht|soud}} * {{Z|haw}}: {{W-|haw|kuli}} * {{Z|mba}}: {{W-|mba|bungol}} * {{Z|hi}}: {{W+|hi|बहरा}} * {{Z|nl}}: {{W+|nl|doof}}, {{W+|nl|dove}} * {{Z|hrx}}: {{W-|hrx|daab}} * {{Z|iba}}: {{W-|iba|achak}} * {{Z|he}}: {{W-|he|חֵירֵשׁ|tr=kheresh}} * {{Z|ang}}: {{W-|ang|dēaf}} * {{Z|en}}: {{W+|en|deaf}} * {{Z|izh}}: {{W-|izh|gluuhkoi}} * {{Z|ga}}: {{W-|ga|bodhar}} *: {{Z|sga}}: {{W-|sga|bodar}} * {{Z|ist}}: {{W-|ist|surdo}} * {{Z|it}}: {{W+|it|sordo}} * {{Z|is}}: {{W+|is|daufur}} * {{Z|ja}}: {{W-|ja|[[耳]]の[[聞こえる|聞こえない]]|tr=みみのきこえない, mimi no kikoenai}}, {{W-|ja|耳が不自由|tr=mimi ga fujiyuu}} * {{Z|kaw}}: {{W-|kaw|buḍĕg}} * {{Z|jv}}: {{W+|jv|budheg}}, {{W+|jv|jampeng}} * {{Z|kbd}}: {{W-|kbd|дэгу}} * {{Z|ca}}: {{W+|ca|sord}} * {{Z|kjj}}: {{W-|kjj|баьш}} * {{Z|si}}: {{W+|si|බිහිරි}} * {{Z|ko}}: {{W-|ko|[[귀머거리]]-의}} * {{Z|kw}}: {{W-|kw|bodhar}} * {{Z|co}}: {{W+|co|sordu}} * {{Z|lld}}: {{W-|lld|sëurt}} * {{Z|lad}}: {{W-|lad|sodro}} * {{Z|ltg}}: {{W-|ltg|kūrslys|n}} * {{Z|la}}: {{W+|la|surdus|n}} * {{Z|lv}}: {{W-|lv|kurls|n}}, {{W-|lv|nedzirdīgs}} * {{Z|lo}}: {{W-|lo|ຫູໜວກ}} * {{Z|lez}}: {{W-|lez|биши}} * {{Z|lt}}: {{W-|lt|kurčias}} * {{Z|lb}}: {{W+|lb|daf}} * {{Z|mk}}: {{W-|mk|глув}} * {{Z|pse}}: {{W-|pse|pekak}} * {{Z|ms}}: {{W+|ms|pekak}}, {{W-|ms|tuli}}, {{W-|ms|congek}}, {{W-|ms|tunakerna}} * {{Z|mt}}: {{W-|mt|trux}} * {{Z|mnc}}: {{W-|mnc|ᡩᡠᡨᡠ}} * {{Z|msk}}: {{W-|msk|bungul}} * {{Z|mi}}: {{W+|mi|turi}}, {{W-|mi|pūwharawhara}} * {{Z|mrw}}: {{W-|mrw|bengel}}, {{W-|mrw|biso}} * {{Z|mr}}: {{W-|mr|बधीर}}, {{W+|mr|बहिरा}} * {{Z|hu}}: {{W+|hu|süket}}, {{W+|hu|siket}} * {{Z|xmf}}: {{W-|xmf|ჸუნგა}}, {{W-|xmf|ჸურუ}}, {{W-|xmf|ჸუჯა}}, {{W-|xmf|დაგუა|cuda=დაგუ̂ა}} * {{Z|mel}}: {{W-|mel|pakeak}}, {{W-|mel|tulek}} * {{Z|mui}}: {{W-|mui|pekak}} * {{Z|nv}}: {{W-|nv|ajéékałgo ąąh dahazʼą́}}, {{W-|nv|jééhkał}} * {{Z|nds}}: {{W-|nds|dow}} * {{Z|nay}}: {{W-|nay|plombatji}} * {{Z|no}}: *: {{Z|no}}: {{W+|no|døv}} *: {{Z|nn}}: {{W+|nn|døv}}, {{W-|nn|dauv}} * {{Z|oc}}: {{W+|oc|sord}} * {{Z|or}}: {{W+|or|ବଧିର}} * {{Z|om}}: {{W-|om|duudaa}} * {{Z|ota}}: {{W-|ota|صاغر|tr=sağır}} * {{Z|ps}}: {{W+|ps|کوڼ|tr=kuṇ}} * {{Z|pdt}}: {{W-|pdt|doof}} * {{Z|pl}}: {{W+|pl|głuchy|n}} * {{Z|pt}}: {{W+|pt|surdo}} * {{Z|kk}}: {{W-|kk|саңырау}} * {{Z|ro}}: {{W+|ro|surd}} * {{Z|ru}}: {{W-|ru|глухо́й}} * {{Z|se}}: {{W-|se|bealjeheapmi}} * {{Z|sms}}: {{W-|sms|kluuǥǥai}} * {{Z|sa}}: {{W+|sa|बधिर}}, {{W+|sa|कल्ल}} * {{Z|sc}}: {{W-|sc|suldu}}, {{W-|sc|surdu}} * {{Z|ceb}}: {{W-|ceb|bungol}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|глув}}, {{W-|sh|глух}} *: Latînî: {{W+|sh|gluv}}, {{W+|sh|gluh}} * {{Z|sco}}: {{W-|sco|deif}} * {{Z|sk}}: {{W-|sk|hluchý|n}} * {{Z|sl}}: {{W+|sl|gluh}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|głuchy}} * {{Z|es}}: {{W+|es|sordo}} * {{Z|su}}: {{W-|su|torék}} * {{Z|sva}}: {{W-|sva|ყუ̂რიუ̂}}, {{W-|sva|ყუგ}} * {{Z|sv}}: {{W+|sv|döv}} * {{Z|tg}}: {{W+|tg|кар}} * {{Z|tl}}: {{W-|tl|bingi}} * {{Z|th}}: {{W-|th|หูหนวก}} * {{Z|te}}: {{W+|te|చెవిటి}} * {{Z|crh}}: {{W-|crh|sağır}} * {{Z|tr}}: {{W+|tr|sağır}} * {{Z|bo}}: {{W-|bo|འོན་པ}} * {{Z|tli}}: {{W-|tli|lkhool.áxhji}} * {{Z|ur}}: {{W-|ur|بہرا|tr=bahrā}} * {{Z|uby}}: {{W-|uby|дагәы}} * {{Z|uk}}: {{W-|uk|глухи́й}} * {{Z|vec}}: {{W-|vec|sórdo}} * {{Z|vi}}: {{W+|vi|điếc}} * {{Z|vo}}: {{W-|vo|surdik}} * {{Z|cy}}: {{W+|cy|byddar}} * {{Z|km}}: {{W+|km|ថ្លង់|tr=tlɑŋ}} * {{Z|yai}}: {{W-|yai|кар}} * {{Z|yi}}: {{W-|yi|טויב}}, {{W-|yi|טויבלעך}}, {{W-|yi|חושימדיק|tr=khushemdik}} * {{Z|esu}}: {{W-|esu|niitesciigatelria}} * {{Z|el}}: {{W+|el|κωφός|n}}, {{W+|el|κουφός|n}} *: Kevn: {{W-|grc|κωφός}} * {{Z|bfi}}: {{W-|bfi|H@Ear}} * {{Z|ase}}: {{W-|ase|1@Jaw 1@Chin}} {{werger-bin}} :{{werger çavkanî|en|deaf|beş=Ev qismê Wergerê|oldid=75710619}} === Rengdêr 2 === {{rengdêr|ku}} # {{mj|bêdeng}} {{bnr|kirr}} ==== Anagram ==== * {{anagram|ku|a=ekr|ekr|erk|rek}} === Çavkanî === {{çavkanî}} == {{ziman|ckb}} == === Navdêr === {{navdêr|ckb|sc=Latn}} # {{f|ckb|guhandar}} {{ckb-Arab|کەر}} == {{ziman|sl}} == === Girêdek === {{girêdek|sl}} # [[çimkî#ku|çimkî]], [[çunkî#ku|çunkî]], [[ji ber ku#ku|ji ber ku]] r8r050ip46jpe0glkoxzw9tt54wlxc8 6532116 6532110 2026-09-18T22:12:10Z Balyozbot 7867 Bot: Paqijiyên kozmetîk ({{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.) 6532116 wikitext text/x-wiki {{h-bnr|ker|kêr|kerr|kêrr|-ker}} == {{ziman|ku}} == === Bilêvkirin === * {{q|ku|ker|cuda=(dewarek)|id=dewarek}} {{IPA|ku|/kʰɜɾ/}}, {{arF|که‌ر}} ** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker.wav|dever=Amed}} *** {{beş|Navdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 1).wav|dever=Bidlîs}} * {{beş|Navdêr 3}} {{deng|ku|LL-Q36163 (kmr)-Ebulfîda-ker (Navdêr 3).wav|dever=Bidlîs}} * {{q|ku|ker|cuda=(parçe)|id=parçe}} {{IPA|ku|/kɜɾ/}}, {{arF|که‌ر}} ** {{q|ku|ker|cuda=(koma pezî)|id=koma pezî}} {{IPA|ku|/kɜɾ/}}, {{arF|که‌ر}} *** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-ker(koma pez).wav|dever=Qers}} **** {{beş|Navdêr 4}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (navdêr 4).wav|dever=Bidlîs}} * {{q|ku|ker|cuda=(guhgiran)|id=guhgiran}} {{IPA|ku|/kɜr/}}, {{arF|که‌ڕ}} ** {{deng|ku|LL-Q36368 (kur)-Mihemed Qers-kerr.wav|dever=Qers}} *** {{deng|ku|LL-Q36368 (kur)-Dildadil-ker (kesê ku nabihîze).wav|dever=Amed}} **** {{deng|ku|Kmr-Efrîn--kerr.oga|dever=Efrîn}} **** {{beş|Rengdêr 1}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr 1).wav|dever=Bidlîs}} ***** {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ker (rengdêr).wav|Deng|dever=Bidlîs}} === Navdêr 1 === [[Wêne:Donkey in Clovelly, North Devon, England.jpg|thumb|Kerek (1)]] [[Wêne:S Veahmätle13.JPG|thumb|'''Kerê''' pezî (2)]] {{navdêr|ku|z=n}} # {{maneid|ku|dewarek}} {{f|ku|guhandar}} [[cûn|Cûnek]] [[dewar]]an e ku [[şibîn|dişibe]] [[hesp]]an û [[hêstir]]an lê ji wan [[kurt]]tir û [[biçûk]]tir e <br>(bi taybetî bo barhilgirtinê tê bikaranîn). #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=ابله چه کت طوافی نابینتن بری رش</br>بیزی دکت ژ قنجان ژ رمز و ناز و غنجان</br>قدری گلان چه زانت کربش دڤیت '''کری''' رش|tr=Ebleh çi kit ṭewafê nabînitin Berê reş</br>Bêzê dikit ji qencan ji remz û naz û x̣encan</br>Qedrê gulan çi zanit kerbeş divêt '''kerê''' reş}} # {{maneid|ku|koma pezî}} [[kom|Komeke]] [[pez]]î, [[garan]]a pezî, [[ber]]ê pezî # {{maneid|ku|bêaqil}} {{f|ku|mecazî}} [[bêaqil|Bêaqil]], [[bêhiş]], [[bêmejî]], [[mejîreş]], [[aqilsivik]], [[nezan]]. # {{f|ku|mecazî|heqaret}} (ji peyva ker a heywan) ji bo kesê zir, serhişk û bêpîr û şerde #* {{J:Firat Cewerî:Girtî:1986|jêgirtin=- Hûn in, ha!. . . Ji bo çi hûn diziyê dikin '''ker''' lawê '''keran'''?}} ==== Tewandin ==== {{ku-tewîn-nav|nêr}} ==== Notên bikaranînê ==== {{agadarî}} Di gelek devokên kurmancî de '''ker''' tenê bo van cûn dewarên nêr bi kar tê. Yên mê '''[[maker]]''' in. ==== Jê ==== {{kol3|ku | keratî | kerçove | kerçovetî | kerî | kerînî | kerîtî | kertî | kurrûk | maker | nêreker }} ==== Etîmolojî ==== Ji {{mîr|ira-pro||*xárah||ker}}, ji {{mîr|iir-pro||*kʰáras||ker}}; belkî taliyê ji zimanekî [[samî]]{{çp}}, bo nimûne ji {{ji|akk|ku|tr=xeradu|w=ker, nêreker}}.{{çp}} Hevreha soranî {{g|ckb|که‌ر|tr=ker}}, zazakî {{q|zza|her}}, hewramî {{g|hac|ھەر‎|tr=her}}, farisî {{g|fa|خر|tr=xer}}, avestayî {{g|ae|𐬑𐬀𐬭𐬀|tr=xere}}, sanskrîtî {{g|sa|खर|tr=khére}}, osetî {{g|os|хӕрӕг|tr=xereg}}, peştûyî {{g|ps|خر|tr=xer}}, belûçî {{g|bal|ہر|tr=her}}. ==== Gotinên pêşiyan ==== * [[şîreta kîrê ker e]] ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|کەر‎|tr=ker}} * {{Z|sdh}}: {{W-|sdh|xer|sc=Latn}} * {{Z|lki}}: {{W-|lki|xer|sc=Latn}} * {{Z|hac}}: {{W-|hac|her|sc=Latn}} * {{Z|zza}}: {{W-|zza|her}} ==== Werger ==== {{werger-ser|dewarek}} * {{Z|ab}}: {{W-|ab|аҽада}} * {{Z|ady}}: {{W-|ady|щыды}} * {{Z|aa}}: {{W-|aa|danán|n}} * {{Z|af}}: {{W+|af|donkie}} * {{Z|akk}}: {{W-|akk|𒀲|n|tr=imēru}} * {{Z|sq}}: {{W+|sq|gomar|n}}, {{W-|sq|magar|n}} * {{Z|de}}: {{W+|de|Esel|n}}; {{W+|de|Grauchen|nt}}, {{W-|de|Grautier|nt}} * {{Z|alt}}: {{W-|alt|эштек}} * {{Z|am}}: {{W-|am|አህያ|tr=äheyya}} * {{Z|ani}}: {{W-|ani|гьаморохи}} * {{Z|arc}}: *: {{Z|syc}}: {{W-|syc|ܚܡܪܐ|g|tr=ḥəmārā}}, {{W-|syc|ܚܡܪܬܐ|m|tr=ḥəmārtā}}, {{W-|syc|ܐܬܢܐ|m|tr=ʾăṯānā}} *: {{Z|tmr}}: {{W-|arc|חֲמָרָא|n|tr=ḥămārā}} * {{Z|rup}}: {{W-|rup|cãci}}, {{W-|rup|dãngã}}, {{W-|rup|gumar}}, {{W-|rup|dãnglãrã}}, {{W-|rup|shonj}}, {{W-|rup|tãronj}}, {{W-|rup|uci}}, {{W-|rup|uricljat}}, {{W-|rup|tar}} * {{Z|as}}: {{W-|as|গাধ}} * {{Z|ast}}: {{W+|ast|burru|n}}, {{W+|ast|burra|m}}, {{W+|ast|pollín|n}} * {{Z|aot}}: {{W-|aot|gada}} * {{Z|av}}: {{W-|av|хӏама}} * {{Z|awa}}: {{W-|awa|गदहा|n}} * {{Z|az}}: {{W+|az|eşşək}}, {{W-|az|ulaq}} * {{Z|bdr}}: {{W-|bdr|keribas}} * {{Z|eu}}: {{W+|eu|asto}} * {{Z|ba}}: {{W-|ba|ишәк}} * {{Z|sne}}: {{W-|sne|kaldei}} * {{Z|be}}: {{W-|be|асёл|n}} * {{Z|bal}}: {{W-|bal|ہر|tr=har}} * {{Z|bn}}: {{W+|bn|গাধা}} * {{Z|br}}: {{W+|br|azen|n}} * {{Z|bdk}}: {{W-|bdk|лем}} * {{Z|bg}}: {{W-|bg|мага́ре|nt}}, {{W-|bg|осе́л|n}} * {{Z|my}}: {{W+|my|မြည်း}} * {{Z|bua}}: {{W-|bua|элжэгэн}} * {{Z|ce}}: {{W-|ce|вир}} * {{Z|cs}}: {{W+|cs|osel|n}} * {{Z|chr}}: {{W-|chr|ᏗᎦᎵᏅᎯᏛ}} * {{Z|chy}}: {{W-|chy|a'éevo'ha}} * {{Z|ny}}: {{W-|ny|bulu}} * {{Z|cic}}: {{W-|cic|haksibish falaa'}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|驢|tr=leoi4}}, {{W-|yue|驢仔|tr=leoi4 zai2}} *: {{Z|dng}}: {{W-|dng|лү}} *: {{Z|hak}}: {{W-|hak|驢仔|tr=lì-è}} *: {{Z|cmn}}: {{W+|cmn|驢|tr=lǘ}}, {{W-|cmn|驢子|tr=lǘzi}} *: {{Z|cdo}}: {{W-|cdo|驢|tr=lè̤}} *: {{Z|nan}}: {{W+|nan|驢|tr=lîr / lû / lî}}, {{W+|nan|驢仔|tr=lû-á / lî-á / lîr-á}} *: {{Z|wuu}}: {{W-|wuu|驢}} * {{Z|cv}}: {{W-|cv|ашак}} * {{Z|chk}}: {{W-|chk|tongki}} * {{Z|dlm}}: {{W-|dlm|samur|n}} * {{Z|da}}: {{W+|da|æsel|nt}} * {{Z|dv}}: {{W-|dv|ހިާމރު}} * {{Z|ovd}}: {{W-|ovd|åsn|m}} * {{Z|id}}: {{W+|id|keledai}} * {{Z|ar}}: {{W+|ar|حِمَار|n}} *: {{Z|arz}}: {{W-|arz|حمار|n|tr=ḥumār, ḥmār}} *: {{Z|acw}}: {{W-|acw|حُمار|n|tr=ḥumār}} *: {{Z|acm}}: {{W-|acm|زمال|n|tr=zmāl}} *: {{Z|afb}}: {{W-|afb|حمار|n|tr=ḥmār}} *: {{Z|aeb}}: {{W-|aeb|بهيم|n|tr=bhīm}} *: {{Z|ary}}: {{W-|ary|حمار|n|tr=ḥmār}}, {{W-|ary|حمارة|m|tr=ḥmāra}}, {{W-|ary|دحش|tr=daḥš}}, {{W-|ary|دحشة|m|tr=daḥša}} * {{Z|hy}}: {{W+|hy|էշ}}, {{W+|hy|ավանակ}} * {{Z|eo}}: {{W+|eo|azeno}} * {{Z|et}}: {{W+|et|eesel}} * {{Z|gez}}: {{W-|gez|አድግ}} * {{Z|ee}}: {{W-|ee|tedzi|nt}} * {{Z|fa}}: {{W+|fa|خر|tr=xar}}, {{W+|fa|الاغ|tr=olâğ}} * {{Z|fo}}: {{W-|fo|asni}} * {{Z|fi}}: {{W+|fi|aasi}} * {{Z|fro}}: {{W-|fro|asne|n}} * {{Z|fr}}: {{W+|fr|âne|n}} * {{Z|fur}}: {{W-|fur|mus}} * {{Z|fy}}: {{W-|fy|ezel}} * {{Z|gd}}: {{W-|gd|asal|m}} * {{Z|gag}}: {{W-|gag|eşek}}, {{W-|gag|yeşek}} * {{Z|gl}}: {{W+|gl|asno}}, {{W+|gl|burro}} * {{Z|got}}: {{W-|got|𐌰𐍃𐌹𐌻𐌿𐍃}} * {{Z|gu}}: {{W-|gu|ગધેડો}} * {{Z|ka}}: {{W+|ka|ვირი}}, {{W+|ka|ჯორი}} * {{Z|ha}}: {{W+|ha|jaki}} * {{Z|hi}}: {{W+|hi|गधा|n}} * {{Z|nl}}: {{W+|nl|ezel|n}} * {{Z|he}}: {{W-|he|חֲמוֹר|n|tr=khamór}}, {{W-|he|אָתוֹן|m|tr=atón}} * {{Z|io}}: {{W+|io|asno}} * {{Z|ang}}: {{W-|ang|esol|n}} * {{Z|en}}: {{W+|en|donkey}} * {{Z|inh}}: {{W-|inh|вир}} * {{Z|ia}}: {{W-|ia|asino}} * {{Z|ga}}: {{W+|ga|asal|n}} * {{Z|ist}}: {{W-|ist|samèri|n-p}} * {{Z|it}}: {{W+|it|asino|n}}, {{W+|it|somaro|n}}, {{W-|it|buricco|n}}, {{W+|it|ciuco}} * {{Z|is}}: {{W+|is|asni}} * {{Z|ja}}: {{W+|ja|驢馬|tr=ろば, roba}}, {{W+|ja|ロバ|tr=roba}} * {{Z|kab}}: {{W-|kab|aɣyul|n}} * {{Z|kl}}: {{W-|kl|siutitooq}} * {{Z|xal}}: {{W-|xal|элҗгн}} * {{Z|ktb}}: {{W-|ktb|harreta}} * {{Z|kn}}: {{W+|kn|ಕತ್ತೆ}} * {{Z|krc}}: {{W-|krc|эшек|tr=eşek}} * {{Z|csb}}: {{W-|csb|osoł|n}}, {{W-|csb|òseł}} * {{Z|ca}}: {{W+|ca|ase|n}}, {{W+|ca|somera|m}}, {{W+|ca|burro|n}}, {{W+|ca|burra|m}}, {{W+|ca|ruc|n}}, {{W+|ca|ruca|m}} * {{Z|qu}}: {{W-|qu|wuru}}, {{W-|qu|asnu}} * {{Z|ks}}: {{W-|ks|خَر|n}} * {{Z|ky}}: {{W+|ky|эшек}} * Ladin: *: {{Z|lld}}: {{W-|lld|musciat|n}} *: {{Z|lld}}: {{W-|lld|müsc|n}} *: {{Z|lld}}: {{W-|lld|èsen|n}},{{W-|lld|musciat|n}} * {{Z|si}}: {{W+|si|බූරුවා}} * {{Z|ko}}: {{W+|ko|당나귀}}, {{W+|ko|나귀}} * {{Z|rop}}: {{W-|rop|ginggong ginggong}} * {{Z|la}}: {{W-|la|asellus}}, {{W-|la|asinus|n}} * {{Z|lv}}: {{W-|lv|ēzelis|n}} * {{Z|lo}}: {{W-|lo|ລາ}}, {{W-|lo|ມ້າລໍ}} * {{Z|lzz}}: {{W-|lzz|ეშეღი}} * {{Z|lez}}: {{W-|lez|лам}} * {{Z|lij}}: {{W-|lij|ase}} * {{Z|li}}: {{W+|li|aezel}} * {{Z|lt}}: {{W+|lt|asilas|n}} * {{Z|khb}}: {{W-|khb|ᩃᩣ}} * {{Z|lb}}: {{W-|lb|Iesel|n}} * {{Z|luo}}: {{W-|luo|punda}} * {{Z|mk}}: {{W-|mk|магаре|nt}} * Malay: *: {{Z|ms}}: {{W-|ms|کلداي}}, {{W-|ms|حمار}} *: Rûmî: {{W+|ms|keldai}}, {{W-|ms|himar}} * {{Z|ml}}: {{W+|ml|കഴുത}} * {{Z|mt}}: {{W-|mt|ħmar|n}} * {{Z|mnc}}: {{W-|mnc|ᡝᡳᡥᡝᠨ}} * {{Z|gv}}: {{W-|gv|assyl|n}} * {{Z|mi}}: {{W-|mi|kāihe}} * {{Z|mr}}: {{W+|mr|गाढव|n}} * {{Z|mhr}}: {{W-|mhr|осёл}} * {{Z|hu}}: {{W+|hu|szamár}} * {{Z|xmf}}: {{W-|xmf|გირინი}} * {{Z|mel}}: {{W-|mel|keledai}} * {{Z|egy}}: {{W-egy|ꜥꜣ|n|h=aA:D52-E7}} * {{Z|mdf}}: {{W-|mdf|ишме}} * {{Z|mn}}: {{W+|mn|илжиг}} * {{Z|nap}}: {{W-|nap|ciuccio}} * {{Z|nv}}: {{W-|nv|télii|sc=Latn}} * {{Z|nds}}: {{W+|nds|Esel|n}} * {{Z|nrf}}: {{W-|nrf|âne|n}} * {{Z|no}}: {{W+|no|esel|nt}} * {{Z|oc}}: {{W+|oc|ase}}, {{W+|oc|asne|n}} * {{Z|or}}: {{W+|or|ଗଧ}} * {{Z|om}}: {{W+|om|harree}} * {{Z|os}}: {{W-|os|хӕрӕг}} * {{Z|ota}}: {{W-|ota|اشك|tr=eşek}} * {{Z|ug}}: {{W-|ug|ئېشەك}} * {{Z|uz}}: {{W+|uz|eshak}} * {{Z|pi}}: {{W-|pi|gadrabha|n}} * {{Z|ps}}: {{W+|ps|خر|n|tr=xar}} * {{Z|pdt}}: {{W-|pdt|Äsel|n}} * {{Z|pox}}: {{W-|pox|asål|n}} * {{Z|pl}}: {{W+|pl|osioł|n}}, {{W+|pl|oślica|m}} * {{Z|pt}}: {{W+|pt|asno|n}}, {{W+|pt|jerico|n}}, {{W+|pt|jegue|n}}, {{W+|pt|jumento|n}}, {{W+|pt|burro|n}} * {{Z|pa}}: {{W-|pa|ਗਧਾ}} * {{Z|kk}}: {{W-|kk|есек}} * {{Z|cop}}: {{W-|cop|ⲉⲱ}} * {{Z|rm}}: {{W-|rm|asen}} * {{Z|rom}}: {{W-|rom|magari|n}}, {{W-|rom|magarka|m}} * {{Z|ro}}: {{W+|ro|măgar|n}}, {{W+|ro|asin|n}} * {{Z|ru}}: {{W+|ru|осёл|n}}, {{W-|ru|осли́ца|m}}, {{W-|ru|иша́к|n}} * {{Z|ssy}}: {{W-|ssy|zanan}} * {{Z|se}}: {{W-|se|ásen}} * {{Z|sm}}: {{W-|sm|asini}} * {{Z|sa}}: {{W+|sa|गर्दभ|n}} * {{Z|sc}}: {{W-|sc|burriccu}}, {{W-|sc|molenti}}, {{W-|sc|molingianu}}, {{W-|sc|àinu}} *: {{Z|sc}}: {{W-|sc|àinu}}, {{W-|sc|bestiolu}}, {{W-|sc|molènti}}, {{W-|sc|bistrassu}} *: {{Z|sc}}: {{W-|sc|poleddu}}, {{W-|sc|polléddu}}, {{W-|sc|pulléddu}}, {{W-|sc|àinu}}, {{W-|sc|àinu}} * {{Z|scn}}: {{W+|scn|sceccu|n}} * {{Z|sid}}: {{W-|sid|harre}} * {{Z|sd}}: {{W-|sd|گڏھ|tr=gaḋahu}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|ма̀гарац|n}}, {{W-|sh|то̀вар|n}} *: Latînî: {{W+|sh|màgarac|n}}, {{W+|sh|tòvar|n}} * {{Z|sco}}: {{W-|sco|cuddie}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|осьлъ|n}} * {{Z|orv}}: {{W-|orv|осьлъ|n}} * {{Z|sk}}: {{W-|sk|somár|n}}, {{W+|sk|osol|n}} * {{Z|sl}}: {{W+|sl|osel|n}}, {{W-|sl|oslica|m}} * {{Z|so}}: {{W+|so|dameer|n}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|ezel|n}}, {{W-|dsb|wósoł|n}} *: {{Z|hsb}}: {{W-|hsb|wosoł|n}} * {{Z|st}}: {{W+|st|tonki}} * {{Z|es}}: {{W+|es|asno|n}}, {{W+|es|burro|n}}, {{W+|es|jumento}} * {{Z|sux}}: {{W-|sux|𒀲|tr=ANŠE}} * {{Z|sw}}: {{W+|sw|punda}} * {{Z|sv}}: {{W+|sv|åsna}} * {{Z|tg}}: {{W+|tg|хар}} * {{Z|tl}}: {{W+|tl|asno}}, {{W-|tl|buriko}} * {{Z|ta}}: {{W+|ta|கழுதை}} * {{Z|twf}}: {{W-|twf|mùldu’úna}} * {{Z|rif}}: {{W-|rif|aɣyur|n}} * {{Z|th}}: {{W+|th|ลา}} * {{Z|te}}: {{W+|te|గాడిద}} * {{Z|crh}}: {{W-|crh|eşek}} * {{Z|tt}}: {{W+|tt|ишәк}} * {{Z|ti}}: {{W-|ti|ኣድጊ}} * {{Z|tr}}: {{W+|tr|eşek}}, {{W+|tr|merkep}}, {{W+|tr|sıpa}} * {{Z|tk}}: {{W-|tk|eşek}} * {{Z|bo}}: {{W-|bo|བོང་བུ}} * {{Z|tpi}}: {{W-|tpi|donki}}, {{W-|tpi|esel}} * {{Z|txb}}: {{W-|txb|kercapo}} * {{Z|tum}}: {{W-|tum|bulu}} * {{Z|tyv}}: {{W-|tyv|элчиген}} * {{Z|udi}}: {{W-|udi|елем}} * {{Z|udm}}: {{W-|udm|ишак}}, {{W-|udm|осёл}} * {{Z|ur}}: {{W-|ur|گدھا|n|tr=gadhā}} * {{Z|uk}}: {{W-|uk|осе́л|n}}, {{W-|uk|віслю́к|n}}, {{W-|uk|іша́к|n}} * {{Z|vec}}: {{W+|vec|muso|n}}, {{W+|vec|àxeno|n}} * {{Z|vi}}: {{W+|vi|lừa}} * {{Z|vo}}: {{W+|vo|cuk}} * {{Z|wa}}: {{W+|wa|ågne|n|m}}, {{W+|wa|bådet|n}}, {{W+|wa|både|m}}, {{W+|wa|bourike|m}}, {{W+|wa|ågntea|n}} * {{Z|wbl}}: {{W-|wbl|xur}} * {{Z|cy}}: {{W-|cy|asyn|n}} * {{Z|wo}}: {{W-|wo|mbaam-sëf|cuda=mbaam-sëf mi}}, {{W-|wo|mbaam-sëf}} * {{Z|km}}: {{W-|km|សត្វលា}}, {{W+|km|លា}} * {{Z|xh}}: {{W-|xh|imbongolo}} * {{Z|sah}}: {{W-|sah|осёл}} * {{Z|yi}}: {{W-|yi|אייזל|n}}, {{W-|yi|חמור|n|tr=khamer}} * {{Z|yo}}: {{W-|yo|kẹ́tẹ́kẹ́tẹ́}} * {{Z|el}}: {{W+|el|γάιδαρος|n}}, {{W+|el|γαϊδούρα|m}}, {{W+|el|γαϊδούρι|nt}}, {{W+|el|όνος|n|m}} *: Kevn: {{W-|grc|ὄνος|n|m}} * {{Z|zu}}: {{W-|zu|imbongolo}}, {{W-|zu|udonki}} * {{Z|zun}}: {{W-|zun|moshok'o}} {{werger-bin}} :{{werger çavkanî|en|donkey|beş=Ev qismê Wergerê|oldid=75539477}} === Navdêr 2 === [[Wêne:Cut-apple-slices_21575-480x360_(4900266300).jpg|thumb|Çend '''kerên''' sêvan.]] {{navdêr|ku|z=n}} {{k-ya nerm}} # {{maneid|ku|parçe}} [[felqe]], [[parçe]], [[qet]], [[par]], [[pirt]]<br> (bi taybetî ya ku bi [[kêr]]ê hatiye [[birîn]]). #* ''Hisreta me '''kerî nanê reş''', [[kas]]ek dewê tirş, [[yan]]ê hin [[toraq]] bû; lê dîsa em ji hale xwe razî bûn.''<ref>1931, ''Hakob Qezeryan-Lazo'', ''Serhatiya Casim'', guhastin:Haciyê Cindî-Emînê Evdal </ref> #: {{mk|ku|'''Kerek''' ji sêva xwe da min.}} #* {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Cewherek lê kir nezer ew bû du '''ker'''<br />Paşê Wî çêkir ji nûra [[namuwer]]}} ==== Bi alfabeyên din ==== * {{ku-ar|که‌ر}} ==== Formên alternatîv ==== * {{g|ku|kert}} ==== Jê ==== {{kol3|ku | kerker | ker kirin | kerkirin | kerkirî | kêr | ker bûn<q:lêker> | ker kirin<q:lêker> | kerbûn<q:navdêr> | kerkirin<q:navdêr> | kerbûyî<q:rengdêr> | kerkirî<q:rengdêr> }} ==== Etîmolojî ==== Hevreha soranî {{g|ckb|که‌رت|tr=[[kert]]}}, hewramî û zazakî {{q|zza|kerd}}, [[kurdiya başûrî]] {{q|sdh|qeł|sc=Latn}}, belûçî {{q|bal||tr=karç}}, farisî {{g|fa|کارد|tr=kard}}, pehlewî ''kart'', avestayî ''kerite-'', sanskrîtî ''krti-'', ermeniya kevn {{g|xcl|քերեմ|tr=k'êrêm|w=[[jê birin]], [[xîç]] kirin}}, yûnaniya kevn {{g|grc|κείρω|tr=kêiro|w=[[birîn]], [[cew]] kirin}}, latînî {{q|la|curtus|w=[[kurt]]}}, îngilîzî {{q|en|share|w=[[par]], [[beş]]}}, {{q|en|shear|w=[[birîn]], [[cew]] kirin}}, {{q|en|short|w=[[kurt]]}}, hemû ji {{ji|ine-pro|ku|*(s)ker-|w=[[birîn]], [[jê kirin]]}}. :<font style="font-size:10px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.243]], [[Şablon:Horn|Horn p.185]], [[Şablon:MacKenzie|MacKenzie P.129]], [[Şablon:Watkins|Watkins p.100]] </font> | <font style="font-size:10px">'''Pokorny: '''941 - 942</font> :<font style="font-size:10px">'''[[Hevreh]]''': [[kêr]] [[kurt]], [[çerm]]</font> ==== Bi zaravayên din ==== * {{Z|ckb}}: [[kert]] * {{Z|sdh}}: [[qeł]] ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Brotscheibe|m}}, {{W+|de|Scheibe|m}}, {{W+|de|Anteil|n}}, {{W+|de|Teil|n}}, {{W+|de|Stück|nt}} * {{Z|be}}: {{W-|be|лу́ста|m}}, {{W-|be|скрыль|n}}, {{W-|be|скі́ба|m}} * {{Z|bg}}: {{W+|bg|филия|nt}}, {{W+|bg|резен|n}} * {{Z|cs}}: {{W+|cs|krajíc|n}}, {{W+|cs|plátek|n}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|片|tr=pin3}} *: {{Z|cmn}}: {{W+|cmn|片|tr=piàn}} * {{Z|da}}: {{W+|da|skive|g}} * {{Z|ar}}: {{W-|ar|شريحة|m}} * {{Z|eo}}: {{W-|eo|tranĉaĵo}} * {{Z|et}}: {{W-|et|viilukas}}, {{W-|et|viil}} * {{Z|fa}}: {{W+|fa|قاچ|tr=qâč}}, {{W+|fa|تیکه|tr=tikke}}, {{W+|fa|لزگه|tr=lazge}}, {{W+|fa|کرچ|tr=karč}} * Polish: [[plaster]], [[plasterek]] ; [[kromka]], [[pajda]] ; [[kawałek]] ; * {{Z|fi}}: {{W+|fi|viipale}} * {{Z|fr}}: {{W+|fr|tranche|m}}, {{W+|fr|tronçon|n}} * {{Z|gd}}: {{W-|gd|sliseag|m}} * {{Z|gl}}: {{W+|gl|rebanda|m}}, {{W+|gl|toro|n}}, {{W-|gl|tallada|m}}, {{W+|gl|posta|m}} * {{Z|nl}}: {{W+|nl|plak|nt}}, {{W+|nl|schijf|nt}} * {{Z|he}}: {{W-|he|פְּרוּסָה|m|tr=prusá}}, {{W-|he|נֵתַח|n|tr=nétaḥ}}, {{W-|he|פֶּלַח|n|tr=pélaḥ}} * {{Z|io}}: {{W+|io|loncho}} * {{Z|en}}: {{W+|en|slice}} * {{Z|izh}}: {{W-|izh|pytky}} * {{Z|it}}: {{W+|it|fetta|m}}, {{W+|it|trancio|n}} * {{Z|is}}: {{W-|is|sneið|m}} * {{Z|ja}}: {{W-|ja|切れ|tr=きれ, kire|sc=Jpan}}, {{W+|ja|一片|tr=いっぺん, ippen|sc=Jpan}}, {{W-|ja|スライス|tr=suraisu|sc=Jpan}} * {{Z|ca}}: {{W+|ca|llesca|m}} * {{Z|ko}}: {{W+|ko|부분}}, {{W+|ko|몫}}, {{W-|ko|슬라이스}} * {{Z|lv}}: {{W+|lv|rika|m}} * {{Z|lo}}: {{W-|lo|ປ່ຽງ}}, {{W-|lo|ແຜ່ນບາງໆ}} * {{Z|lt}}: {{W-|lt|riekė̃|m}} * {{Z|mi}}: {{W-|mi|kōripi}}, {{W-|mi|topenga}} * {{Z|hu}}: {{W+|hu|szelet}}, {{W+|hu|karéj}} * {{Z|egy}}: {{W-egy|fdq|h=f:d-q-Z9:D40}} * {{Z|nrf}}: {{W-|nrf|tranche|m}} * {{Z|pt}}: {{W+|pt|fatia}} * {{Z|ro}}: {{W+|ro|felie|m}} * {{Z|ru}}: {{W-|ru|ломо́ть|n}}, {{W-|ru|ло́мтик|n}}, {{W-|ru|кусо́к|n}}, {{W-|ru|кусо́чек|n}}, {{W+|ru|слайс|n}} * {{Z|scn}}: {{W-|scn|feḍḍa|m}}, {{W+|scn|pezzu|n}} * {{Z|sh}}: {{W+|sh|kriška|m}} * {{Z|es}}: {{W+|es|rebanada|m}} * {{Z|sv}}: {{W+|sv|skiva|g}} * {{Z|th}}: {{W+|th|ชิ้น}} * {{Z|tr}}: {{W+|tr|dilim}} * {{Z|uk}}: {{W-|uk|ски́ба|m}}, {{W-|uk|ски́бка|m}}, {{W-|uk|шмато́к|n}}, {{W-|uk|кусо́к|n}} * {{Z|vi}}: {{W-|vi|lát mỏng}}, {{W-|vi|miếng mỏng}} * {{Z|cy}}: {{W-|cy|tafelll|m}} * {{Z|el}}: {{W+|el|φέτα|m}} *: Kevn: {{W-|grc|τέμαχος|nt}} {{werger-bin}} :{{werger çavkanî|en|slice|beş=Ev qismê Wergerê|oldid=75505183}} === Navdêr 3 === {{navdêr|ku|z=mn}} {{k-ya nerm}} # Kesa/ê tiştekî dike yan tiştek kiriye. #: {{mk|ku|Divê '''kerên''' vê xirabiyê bên sizadan.}} ==== Notên bikaranînê ==== {{agadarî}} Peyva '''ker''' bi vê maneyê kêm serbixwe peyda dibe lê pirtir wek paşgirekê di gel hin peyvan tê bikaranîn: ''[[çêker]], [[şerker]], [[sazker]] ==== Jê ==== {{kol3|ku|cure=Jê |-ker }} ==== Etîmolojî ==== {{etîmon|ku|:ji<metn:Ji [[rehê dema niha]] yê kevn ê>|kirin|id=kirin|metn=++|dar=1}} ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|doer}}, {{W+|en|actor}}, {{W+|en|agent}} {{werger-bin}} === Navdêr 4 === {{navdêr|ku|z=n}} # {{mj|kom, grûp}} {{bnr|kerî}} === Rengdêr 1 === {{rengdêr|ku}} {{k-ya nerm}}, {{r-ya req}} # {{senseid|ku|guhgiran}}Kesa/ê [[qet]] yan [[baş]] [[deng]]an [[bihîstin|nabihîze]]. #: {{hevmane|ku|guhgiran|nebihîz}} #: {{mk|ku|'''Ker''' û [[lal]]|kesa/ê ne [[karîn|dikare]] [[axiftin|biaxive]] û ne jî [[bîstin|bibîze]]|birêz=1}} ==== Bi alfabeyên din ==== * {{ku-ar|که‌ڕ}} ==== Formên alternatîv ==== * {{g|ku|kerr}} ==== Jê ==== {{kol3|ku | ker bûn<q:lêker> | ker kirin<q:lêker> | xwe lê ker kirin | kerbûn<q:navdêr> | kerkirin<q:navdêr> | kerbûyî<q:rengdêr> | kerkirî<q:rengdêr> | kerî | kerînî | kerîtî | kerker | kertî }} ==== Etîmolojî ==== Hevreha soranî {{g|ckb|که‌ڕ|tr=kerr}}, [[kurdiya başûrî]] [[keř]], zazakî ''kerr'', hewramî ''kerr'', belûçî {{g|ckb|کر|tr=kerr}}, {{hv|fa|کر|tr=kerr}}, {{hv|pal||k-rr|sc=Latn}}, soxdî ''k-rn-'', {{hv|ae||kerne-|sc=Latn}}, peştûyî {{g|ps|کوڼ|tr=kuṇ}}, {{hv|sa|कर्ण}} (kárṇa-: [[guh]]), slavoniya kevn [[кърнъ]] (kŭrnŭ), latviyayî [[kurls]], {{hv|lt|kurčias}}, hemû ji {{ji|ine-pro|ku|*kʷorno-|w=[[guh]]}}. Maneya bingehîn "guh" bû lê di zimanên îranî û yên [[baltî]] de maneya "[[guhgiran]]" wergirtiye. Di zimanên hindî de bi maneya "guh" maye: hindî [[कान]] (kan), urdûyî {{g|ur|کان|tr=kan}}, bengalî [[কর্ণ]] (korno) û [[কান]] (kan)... ==== Bide ber ==== {{kol2|ku| | {{g|ku|kor}} | {{g|ku|lal}} }} ==== Werger ==== {{werger-ser|guhgiran}} * {{Z|ab}}: {{W-|ab|адагәа}} * {{Z|ady}}: {{W-|ady|дэгу}} * {{Z|af}}: {{W-|af|dowe}} * {{Z|xag}}: {{W-|xag|𐕆𐔼𐕒𐔽𐔰}} * {{Z|akl}}: {{W-|akl|bungoe}} * {{Z|sq}}: {{W-|sq|i shurdhër}} * {{Z|de}}: {{W+|de|taub}}, {{W+|de|gehörlos}} * {{Z|an}}: {{W-|an|xordo}} * {{Z|rup}}: {{W-|rup|surdu}} * {{Z|as}}: {{W-|as|কলা}}, {{W-|as|অন্ধ}} * {{Z|ast}}: {{W-|ast|sordu}}, {{W-|ast|xordu}} * {{Z|av}}: {{W-|av|гӏинкъаб}} * {{Z|az}}: {{W+|az|kar}} * {{Z|ban}}: {{W-|ban|bongol}} * {{Z|eu}}: {{W+|eu|gor}} * {{Z|ba}}: {{W-|ba|һаңғырау}} * {{Z|sne}}: {{W-|sne|bongam}} * {{Z|be}}: {{W-|be|глухі́}} * {{Z|bcl}}: {{W-|bcl|bungog}} * {{Z|br}}: {{W+|br|bouzar}} * {{Z|bg}}: {{W+|bg|глух}} * {{Z|my}}: {{W+|my|နားပင်း}} * {{Z|ccc}}: {{W-|ccc|majchayi}} * {{Z|ce}}: {{W-|ce|къора}} * {{Z|cs}}: {{W+|cs|hluchý|n}} * {{Z|chr}}: {{W-|chr|ᏧᎵᎡᎾ}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|耳聾|tr=ji5 lung4}}, {{W-|yue|聾|tr=lung4}} *: {{Z|cmn}}: {{W+|cmn|聾|tr=lóng}}, {{W+|cmn|耳聾|tr=ěrlóng}} *: {{Z|nan}}: {{W-|nan|耳聾|tr=hīⁿ-lâng}} * {{Z|dlm}}: {{W-|dlm|suard}} * {{Z|da}}: {{W+|da|døv}} * {{Z|id}}: {{W+|id|tuli}}, {{W-|id|tuna rungu}} * {{Z|ar}}: {{W-|ar|أَصَمّ}} *: {{Z|arz}}: {{W-|arz|أصم|n|tr=ʔaṣamm}}, {{W-|arz|أطرش|n|tr=ʔaṭraš}} * {{Z|hy}}: {{W+|hy|խուլ}} * {{Z|eo}}: {{W+|eo|surda}} * {{Z|et}}: {{W-|et|kurt}} * {{Z|fa}}: {{W+|fa|کر|tr=kar}}, {{W+|fa|ناشنوا|tr=nâšenavâ}} * {{Z|fo}}: {{W-|fo|deyvur}} * {{Z|fi}}: {{W+|fi|kuuro}}, {{W-|fi|kuulovammainen}} * {{Z|fr}}: {{W+|fr|sourd}} * {{Z|fur}}: {{W-|fur|sort}}, {{W-|fur|sord}} * {{Z|frr}}: {{W-|frr|duuf}} * {{Z|fy}}: {{W-|fy|dôf}} * {{Z|gd}}: {{W-|gd|bodhar}} * {{Z|gl}}: {{W-|gl|xordo}} * {{Z|got}}: {{W-|got|𐌱𐌰𐌿𐌸𐍃}} * {{Z|ka}}: {{W+|ka|ყრუ}}, {{W-|ka|სმენადაკარგული}} * {{Z|ht}}: {{W-|ht|soud}} * {{Z|haw}}: {{W-|haw|kuli}} * {{Z|mba}}: {{W-|mba|bungol}} * {{Z|hi}}: {{W+|hi|बहरा}} * {{Z|nl}}: {{W+|nl|doof}}, {{W+|nl|dove}} * {{Z|hrx}}: {{W-|hrx|daab}} * {{Z|iba}}: {{W-|iba|achak}} * {{Z|he}}: {{W-|he|חֵירֵשׁ|tr=kheresh}} * {{Z|ang}}: {{W-|ang|dēaf}} * {{Z|en}}: {{W+|en|deaf}} * {{Z|izh}}: {{W-|izh|gluuhkoi}} * {{Z|ga}}: {{W-|ga|bodhar}} *: {{Z|sga}}: {{W-|sga|bodar}} * {{Z|ist}}: {{W-|ist|surdo}} * {{Z|it}}: {{W+|it|sordo}} * {{Z|is}}: {{W+|is|daufur}} * {{Z|ja}}: {{W-|ja|[[耳]]の[[聞こえる|聞こえない]]|tr=みみのきこえない, mimi no kikoenai}}, {{W-|ja|耳が不自由|tr=mimi ga fujiyuu}} * {{Z|kaw}}: {{W-|kaw|buḍĕg}} * {{Z|jv}}: {{W+|jv|budheg}}, {{W+|jv|jampeng}} * {{Z|kbd}}: {{W-|kbd|дэгу}} * {{Z|ca}}: {{W+|ca|sord}} * {{Z|kjj}}: {{W-|kjj|баьш}} * {{Z|si}}: {{W+|si|බිහිරි}} * {{Z|ko}}: {{W-|ko|[[귀머거리]]-의}} * {{Z|kw}}: {{W-|kw|bodhar}} * {{Z|co}}: {{W+|co|sordu}} * {{Z|lld}}: {{W-|lld|sëurt}} * {{Z|lad}}: {{W-|lad|sodro}} * {{Z|ltg}}: {{W-|ltg|kūrslys|n}} * {{Z|la}}: {{W+|la|surdus|n}} * {{Z|lv}}: {{W-|lv|kurls|n}}, {{W-|lv|nedzirdīgs}} * {{Z|lo}}: {{W-|lo|ຫູໜວກ}} * {{Z|lez}}: {{W-|lez|биши}} * {{Z|lt}}: {{W-|lt|kurčias}} * {{Z|lb}}: {{W+|lb|daf}} * {{Z|mk}}: {{W-|mk|глув}} * {{Z|pse}}: {{W-|pse|pekak}} * {{Z|ms}}: {{W+|ms|pekak}}, {{W-|ms|tuli}}, {{W-|ms|congek}}, {{W-|ms|tunakerna}} * {{Z|mt}}: {{W-|mt|trux}} * {{Z|mnc}}: {{W-|mnc|ᡩᡠᡨᡠ}} * {{Z|msk}}: {{W-|msk|bungul}} * {{Z|mi}}: {{W+|mi|turi}}, {{W-|mi|pūwharawhara}} * {{Z|mrw}}: {{W-|mrw|bengel}}, {{W-|mrw|biso}} * {{Z|mr}}: {{W-|mr|बधीर}}, {{W+|mr|बहिरा}} * {{Z|hu}}: {{W+|hu|süket}}, {{W+|hu|siket}} * {{Z|xmf}}: {{W-|xmf|ჸუნგა}}, {{W-|xmf|ჸურუ}}, {{W-|xmf|ჸუჯა}}, {{W-|xmf|დაგუა|cuda=დაგუ̂ა}} * {{Z|mel}}: {{W-|mel|pakeak}}, {{W-|mel|tulek}} * {{Z|mui}}: {{W-|mui|pekak}} * {{Z|nv}}: {{W-|nv|ajéékałgo ąąh dahazʼą́}}, {{W-|nv|jééhkał}} * {{Z|nds}}: {{W-|nds|dow}} * {{Z|nay}}: {{W-|nay|plombatji}} * {{Z|no}}: *: {{Z|no}}: {{W+|no|døv}} *: {{Z|nn}}: {{W+|nn|døv}}, {{W-|nn|dauv}} * {{Z|oc}}: {{W+|oc|sord}} * {{Z|or}}: {{W+|or|ବଧିର}} * {{Z|om}}: {{W-|om|duudaa}} * {{Z|ota}}: {{W-|ota|صاغر|tr=sağır}} * {{Z|ps}}: {{W+|ps|کوڼ|tr=kuṇ}} * {{Z|pdt}}: {{W-|pdt|doof}} * {{Z|pl}}: {{W+|pl|głuchy|n}} * {{Z|pt}}: {{W+|pt|surdo}} * {{Z|kk}}: {{W-|kk|саңырау}} * {{Z|ro}}: {{W+|ro|surd}} * {{Z|ru}}: {{W-|ru|глухо́й}} * {{Z|se}}: {{W-|se|bealjeheapmi}} * {{Z|sms}}: {{W-|sms|kluuǥǥai}} * {{Z|sa}}: {{W+|sa|बधिर}}, {{W+|sa|कल्ल}} * {{Z|sc}}: {{W-|sc|suldu}}, {{W-|sc|surdu}} * {{Z|ceb}}: {{W-|ceb|bungol}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|глув}}, {{W-|sh|глух}} *: Latînî: {{W+|sh|gluv}}, {{W+|sh|gluh}} * {{Z|sco}}: {{W-|sco|deif}} * {{Z|sk}}: {{W-|sk|hluchý|n}} * {{Z|sl}}: {{W+|sl|gluh}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|głuchy}} * {{Z|es}}: {{W+|es|sordo}} * {{Z|su}}: {{W-|su|torék}} * {{Z|sva}}: {{W-|sva|ყუ̂რიუ̂}}, {{W-|sva|ყუგ}} * {{Z|sv}}: {{W+|sv|döv}} * {{Z|tg}}: {{W+|tg|кар}} * {{Z|tl}}: {{W-|tl|bingi}} * {{Z|th}}: {{W-|th|หูหนวก}} * {{Z|te}}: {{W+|te|చెవిటి}} * {{Z|crh}}: {{W-|crh|sağır}} * {{Z|tr}}: {{W+|tr|sağır}} * {{Z|bo}}: {{W-|bo|འོན་པ}} * {{Z|tli}}: {{W-|tli|lkhool.áxhji}} * {{Z|ur}}: {{W-|ur|بہرا|tr=bahrā}} * {{Z|uby}}: {{W-|uby|дагәы}} * {{Z|uk}}: {{W-|uk|глухи́й}} * {{Z|vec}}: {{W-|vec|sórdo}} * {{Z|vi}}: {{W+|vi|điếc}} * {{Z|vo}}: {{W-|vo|surdik}} * {{Z|cy}}: {{W+|cy|byddar}} * {{Z|km}}: {{W+|km|ថ្លង់|tr=tlɑŋ}} * {{Z|yai}}: {{W-|yai|кар}} * {{Z|yi}}: {{W-|yi|טויב}}, {{W-|yi|טויבלעך}}, {{W-|yi|חושימדיק|tr=khushemdik}} * {{Z|esu}}: {{W-|esu|niitesciigatelria}} * {{Z|el}}: {{W+|el|κωφός|n}}, {{W+|el|κουφός|n}} *: Kevn: {{W-|grc|κωφός}} * {{Z|bfi}}: {{W-|bfi|H@Ear}} * {{Z|ase}}: {{W-|ase|1@Jaw 1@Chin}} {{werger-bin}} :{{werger çavkanî|en|deaf|beş=Ev qismê Wergerê|oldid=75710619}} === Rengdêr 2 === {{rengdêr|ku}} # {{mj|bêdeng}} {{bnr|kirr}} ==== Anagram ==== * {{anagram|ku|a=ekr|ekr|erk|rek}} === Çavkanî === {{çavkanî}} == {{ziman|ckb}} == === Navdêr === {{navdêr|ckb|sc=Latn}} # {{f|ckb|guhandar}} {{ckb-Arab|کەر}} == {{ziman|sl}} == === Girêdek === {{girêdek|sl}} # [[çimkî#ku|çimkî]], [[çunkî#ku|çunkî]], [[ji ber ku#ku|ji ber ku]] 18vxy8hexmb58ydp0mwybsqke17ym7g ava 0 3656 6532022 6362434 2026-09-18T15:38:28Z Wikihez 7344 Kurmancî/Rengdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532022 wikitext text/x-wiki {{h-bnr|Ava|-ava}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{beş|Rengdêr}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava.wav|dever=Wan}} * {{beş|Formeke navdêrê}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava-2.wav|dever=Wan}} * {{ku-kîte}} === Rengdêr === {{ku-tewîn-rd|ava}} {{rengdêr|ku}} # Ne [[kavil]], ne [[xirabe]], ne [[xirabkirî]], ne [[xopan]], ne [[wêran]], ne [[ruxandî]], ne [[hilweşandî]] #: {{hevmaneyên peyvê|ku|çêkirî|dirist|birêk|birêkûpêk|lidar|çalak|liserxwe}} #: {{dijmane|ku|kavil|wêran|xirabe|xopan}} #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Spêde kifş-i bû dîsa</br>Merîxa nehsê '''ava''' bû</br>Xwiya bû roj di şerqê da}} ==== Bi alfabeyên din ==== * {{ku-ar|ئاڤا}} ==== Formên alternatîv ==== * {{g|ku|awa}} (2) ==== Jê ==== {{kol3|ku|cure=Jê |-ava |avahî |avakar |avakarî |avaker |avakerî |avanî |avatî |avayî |ava kirin<q:lêker> |ava bûn<q:lêker> |avabûn<q:navdêr> |avakirin<q:navdêr> |avadan |avabûyî<q:rengdêr> |avakirî<q:rengdêr> |avaçûyî }} ==== Etîmolojî ==== {{etîmon|ku|:mîr|ira-pro:*āpāta-<etimon:mîr<ine-pro:*peh₂->>|dar=1|metn=++}} têkilî {{hv|fa|آباد|tr=abad}} û {{hv|ckb|ئاوه‌دان}} / [[awedan]], {{hv|zza|awan}}. Belkî hevreha {{hv|sa|आवास}}. ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|built}} * {{Z|tr}}: {{W+|tr|bayındır}}, {{W+|tr|mamur}}, {{W+|tr|şen}}, {{W+|tr|abat}} {{werger-bin}} === Formeke navdêrê === {{ku-tew-nav|av|mê|îzafe|binavkirî}} {{navdêr|ku|form=erê}} # {{formeke peyvê|ku|av||îzafe|yekjimar|binavkirî}} t42lsgqk3jldo7as9nfhc92vkr2d72a 6532039 6532022 2026-09-18T16:43:00Z Wikihez 7344 /* Etîmolojî */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re) 6532039 wikitext text/x-wiki {{h-bnr|Ava|-ava}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{beş|Rengdêr}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava.wav|dever=Wan}} * {{beş|Formeke navdêrê}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava-2.wav|dever=Wan}} * {{ku-kîte}} === Rengdêr === {{ku-tewîn-rd|ava}} {{rengdêr|ku}} # Ne [[kavil]], ne [[xirabe]], ne [[xirabkirî]], ne [[xopan]], ne [[wêran]], ne [[ruxandî]], ne [[hilweşandî]] #: {{hevmaneyên peyvê|ku|çêkirî|dirist|birêk|birêkûpêk|lidar|çalak|liserxwe}} #: {{dijmane|ku|kavil|wêran|xirabe|xopan}} #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Spêde kifş-i bû dîsa</br>Merîxa nehsê '''ava''' bû</br>Xwiya bû roj di şerqê da}} ==== Bi alfabeyên din ==== * {{ku-ar|ئاڤا}} ==== Formên alternatîv ==== * {{g|ku|awa}} (2) ==== Jê ==== {{kol3|ku|cure=Jê |-ava |avahî |avakar |avakarî |avaker |avakerî |avanî |avatî |avayî |ava kirin<q:lêker> |ava bûn<q:lêker> |avabûn<q:navdêr> |avakirin<q:navdêr> |avadan |avabûyî<q:rengdêr> |avakirî<q:rengdêr> |avaçûyî }} ==== Etîmolojî ==== {{etîmon|ku|id=ne xirabe|:mîr|ira-pro:*āpāta-<etimon:mîr<ine-pro:*peh₂->>|dar=1|metn=++}} têkilî {{hv|fa|آباد|tr=abad}} û {{hv|ckb|ئاوه‌دان}} / [[awedan]], {{hv|zza|awan}}. Belkî hevreha {{hv|sa|आवास}}. ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|built}} * {{Z|tr}}: {{W+|tr|bayındır}}, {{W+|tr|mamur}}, {{W+|tr|şen}}, {{W+|tr|abat}} {{werger-bin}} === Formeke navdêrê === {{ku-tew-nav|av|mê|îzafe|binavkirî}} {{navdêr|ku|form=erê}} # {{formeke peyvê|ku|av||îzafe|yekjimar|binavkirî}} tfc42pk7r1w4386z3hc4iwaou754xxv 6532040 6532039 2026-09-18T16:43:27Z Wikihez 7344 Kurmancî/Rengdêr: beşa «Jê» hate nûkirin (DefSideBoxes) 6532040 wikitext text/x-wiki {{h-bnr|Ava|-ava}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{beş|Rengdêr}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava.wav|dever=Wan}} * {{beş|Formeke navdêrê}} {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-ava-2.wav|dever=Wan}} * {{ku-kîte}} === Rengdêr === {{ku-tewîn-rd|ava}} {{rengdêr|ku}} # Ne [[kavil]], ne [[xirabe]], ne [[xirabkirî]], ne [[xopan]], ne [[wêran]], ne [[ruxandî]], ne [[hilweşandî]] #: {{hevmaneyên peyvê|ku|çêkirî|dirist|birêk|birêkûpêk|lidar|çalak|liserxwe}} #: {{dijmane|ku|kavil|wêran|xirabe|xopan}} #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Spêde kifş-i bû dîsa</br>Merîxa nehsê '''ava''' bû</br>Xwiya bû roj di şerqê da}} ==== Bi alfabeyên din ==== * {{ku-ar|ئاڤا}} ==== Formên alternatîv ==== * {{g|ku|awa}} (2) ==== Jê ==== {{kol3|ku|cure=Jê |-ava |avahî |avakar |avakarî |avaker |avakerî |avanî |avatî |avayî |ava kirin<q:lêker> |ava bûn<q:lêker> |avabûn<q:navdêr> |avakirin<q:navdêr> |avadan |avabûyî<q:rengdêr> |avakirî<q:rengdêr> |avaçûyî |malava }} ==== Etîmolojî ==== {{etîmon|ku|id=ne xirabe|:mîr|ira-pro:*āpāta-<etimon:mîr<ine-pro:*peh₂->>|dar=1|metn=++}} têkilî {{hv|fa|آباد|tr=abad}} û {{hv|ckb|ئاوه‌دان}} / [[awedan]], {{hv|zza|awan}}. Belkî hevreha {{hv|sa|आवास}}. ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|built}} * {{Z|tr}}: {{W+|tr|bayındır}}, {{W+|tr|mamur}}, {{W+|tr|şen}}, {{W+|tr|abat}} {{werger-bin}} === Formeke navdêrê === {{ku-tew-nav|av|mê|îzafe|binavkirî}} {{navdêr|ku|form=erê}} # {{formeke peyvê|ku|av||îzafe|yekjimar|binavkirî}} dwf7tnv9xhu3w8s97mw8u1fdjkh8l0s deve 0 3759 6532021 6427293 2026-09-18T15:35:04Z Wikihez 7344 /* Etîmolojî */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re) 6532021 wikitext text/x-wiki {{h-bnr|devê}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # {{f|ku|guhandar}} [[dewar|Dewarek]] [[piştqoz]] e bi taybetî li [[berî|beriyan]] tê [[bikaranîn]] bo lê[[siwar]]bûn û [[bar]][[hilgirtin]]ê. #: {{hevmane|ku|hêştir}} ==== Tewandin ==== {{ku-tewîn-nav|mê|guherto=hemû}} ==== Bi alfabeyên din ==== * {{ku-ar|ده‌ڤه}} ==== Formên alternatîv ==== * {{g|ku|deveh}} ==== Etîmolojî ==== {{etîmon|ku|:deyn|ota:دوه<tr:deve><id:hêştir>|dar=1|metn=++|id=hêştir}} Hevreha {{hv|az|dəvə}}, {{hv|ba|дөйә}}, {{hv|cv|тӗве}}, {{hv|kk|түйе}}, {{hv|ky|төө}}, {{hv|tk|düýe}}, {{hv|ug|تۆگە}} û {{hv|uz|tuya}}. ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Kamel}} {{n}}, {{W|de|Dromedar|m|guman=erê}} * {{Z|ar}}: {{W|ar|إبل|guman=erê}}, {{W|ar|جمل|guman=erê}} * {{Z|fa}}: {{W|fa|شتر|guman=erê}}, {{W|fa|فضولات حیوانی|guman=erê}}, {{W|fa|ناقه|guman=erê}} * {{Z|en}}: {{W|en|dromedary}}, {{W|en|camel}} * {{Z|tr}}: {{W|tr|mekkâre|guman=erê}} {{werger-bin}} === Daçek === {{daçek|ku}} # {{maneid|ku|daçek}} {{f|ku|Behdînan}} [[ba]] wê/wî/wan, [[bal]] wê/wî/wan, [[nik]] wê/wî/wan, [[cem]] wê/wî/wan, [[dev]] wê/wî wan ==== Notên bikaranînê ==== * '''deve''': ''Ez çûme deve.'' * '''ji deve''': ''Ez ji deve hatime.'' * '''li deve''': ''Ez li deve bûm.'' ==== Etîmolojî ==== Ji {{q|ku|dev|id=daçek}} (2) + ''[[-e|e]]''. ==== Werger ==== {{werger-ser}} {{werger-bin}} == {{ziman|sq}} == === Navdêr === {{navdêr|sq|z=m}} # {{mijar|sq|heywan}} {{g|ku|hêştir}}, {{g|ku|deve}} === Çavkanî === {{rûpela wergerê|sq|hêştir}} == {{ziman|tr}} == === Bilêvkirin === * {{deng|tr|LL-Q256 (tur)-ToprakM-deve.wav|Deng|dever=}} === Navdêr === {{navdêr|tr}} # [[deve#Kurdî|deve]], [[hêştir]], [[lok]] ==== Etîmolojî ==== {{etîmon|tr|:mîr|ota:دوه<id:hêştir>|dar=1|metn=++|id=hêştir}} fjumsex8t07jg42vrofwhnd8179ujut -van 0 3904 6532019 6369373 2026-09-18T15:33:10Z Wikihez 7344 /* Etîmolojî */ 6532019 wikitext text/x-wiki {{h-bnr|van|-van|Van}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Paşgir === {{paşgir|ku}} # [[paşgir|Paşgirek]] e maneya "[[çavdêr]]" dide hin gotinan. #: ''[[gavan]], [[şivan]]'' # [[paşgir|Paşgirek]] e maneya "[[pîşe]]" yan [[kar]] dide hin gotinan. #: [[xwendevan]]'', ''[[rojnamevan]]'' ==== Bi alfabeyên din ==== * {{ku-ar|ـڤان}} ==== Formên alternatîv ==== {{kol3|ku |-evan }} ==== Jê ==== * {{g|ku|vanane}} * {{g|ku|-vanî}} * {{g|ku|vanîtî}} * {{g|ku|vantî}} {{paşgirbibîne|ku}} ==== Etîmolojî ==== {{etîmon|ku|:mîr|ine-pro:*peh₂-<id:parastin>|metn=++|id=paşgira meslekî}} Hevreha {{hv|ckb|ـوان|tr=-wan}}, {{hv|fa|ـبان|tr=-bân}}, ''pane-'' / ''paneg'' ya farisiya navîn, avestayî ''pane'' ({{q|ku|pena}}, {{q|ku|parastin}}); binêre: {{q|ku|payîn}}. ==== Bide ber ==== {{kol3|ku |[[-pan]]{{çp}} }} ==== Herwiha binêre ==== {{kol3|ku |-cî |-çî |-dar |-der |-kar |-ker |-mend |-war |-wer }} ==== Werger ==== {{werger-ser}} * {{Z|af}}: {{W-|af|-er}} * {{Z|sq}}: {{W-|sq|-es|n}}, {{W-|sq|-ese|m}}, {{W-|sq|-ës|n}}, {{W-|sq|-ëse|m}}, {{W-|sq|-tar|n}}, {{W-|sq|-tare|m}} * {{Z|de}}: {{W+|de|-er|n}} * {{Z|ba}}: {{W-|ba|-сы|sc=Cyrl}}, {{W-|ba|-се|sc=Cyrl}}, {{W-|ba|-со|sc=Cyrl}}, {{W-|ba|-сө|sc=Cyrl}} * {{Z|cs}}: {{W-|cs|-ič|n}}, {{W-|cs|-ač|n}}, {{W-|cs|-itel|n}}, {{W-|cs|-átor|n}}, {{W+|cs|-ec|n}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|者|tr=-zhě|cuda=...者}}, {{W+|cmn|家|tr=-jiā|cuda=...家}} * {{Z|da}}: {{W+|da|-er}} * {{Z|id}}: {{W-|id|peng-}}, {{W-|id|pem-}}, {{W+|id|pe}} * {{Z|ar}}: {{W+|ar|مُـ}} *: {{Z|arz}}: {{W-|arz|مِـ|tr=mi-}} * {{Z|hy}}: {{W-|hy|-իչ}} * {{Z|fa}}: {{W+|fa|کننده|tr=-konande|cuda=ـکننده}}, {{W+|fa|گر|tr=-gar|cuda=ـگر}} * {{Z|fo}}: {{W-|fo|-ari}} * {{Z|fi}}: {{W+|fi|-ja}}, {{W+|fi|-ri}}; {{W+|fi|-in}} * {{Z|fr}}: {{W+|fr|-eur|n}}, {{W+|fr|-euse|m}} * {{Z|gd}}: {{W-|gd|-adair}}, {{W-|gd|-air}}, {{W-|gd|-aire}}, {{W-|gd|-ear}}, {{W-|gd|-iche}} * {{Z|gl}}: {{W+|gl|-eiro|n}}, {{W-|gl|-eira|m}} * {{Z|gn}}: {{W-|gn|-hára}} * {{Z|io}}: {{W-|io|-er}} * {{Z|ig}}: {{W-|ig|onye-}} * {{Z|en}}: {{W+|en|-er}} * {{Z|ia}}: {{W-|ia|-ero|n}}, {{W-|ia|-era|m}}, {{W-|ia|-ario|n}}, {{W-|ia|-aria|m}}, {{W-|ia|-ista|n|m}} * {{Z|ga}}: {{W-|ga|-éir|n}} * {{Z|it}}: {{W-|it|-ore|n}}, {{W-|it|-tore|n}} * {{Z|is}}: {{W-|is|-ari|n}} * {{Z|ja}}: {{W+|ja|者|tr=...しゃ, -sha|cuda=...者}}, {{W+|ja|家|tr=...か, -ka|cuda=...家}}, {{W+|ja|手|tr=...て, -te|cuda=...手}} * {{Z|ca}}: {{W+|ca|-dor|n}}, {{W+|ca|-dora|m}}, {{W-|ca|-triu|m}}, {{W+|ca|-er|n}}, {{W+|ca|-era|m}} * {{Z|ky}}: {{W-|ky|-чы}}, {{W-|ky|-чы|cuda=-чи}}, {{W-|ky|-чы|cuda=-чу}}, {{W-|ky|-чы|cuda=-чү}} * {{Z|kg}}: {{W-|kg|mu-}} * {{Z|la}}: {{W-|la|-tor|n}} * {{Z|lv}}: {{W+|lv|-ājs|n}}, {{W-|lv|-āja|m}}, {{W+|lv|-ējs|n}}, {{W-|lv|-ēja|m}}, {{W-|lv|-ents|n}}, {{W-|lv|-ente|m}}, {{W-|lv|-ists|n}}, {{W-|lv|-iste|m}}, {{W-|lv|-ors|n}}, {{W-|lv|-ore|m}}, {{W-|lv|-ers|n}}, {{W-|lv|-eris|n}}, {{W-|lv|-ere|m}}, {{W-|lv|-ieris|n}}, {{W-|lv|-iere|m}} * {{Z|ms}}: {{W-|ms|peng-}}, {{W-|ms|pem-}} * {{Z|mi}}: {{W-|mi|kai-}} * {{Z|hu}}: {{W+|hu|-ó}}/{{W+|hu|-ő}} * {{Z|mn}}: {{W-|mn|-гч|sc=Cyrl}} * {{Z|nv}}: {{W-|nv|-é}} * {{Z|nup}}: {{W-|nup|-ci}} * {{Z|ps}}: {{W-|ps|-ونکی}} * {{Z|pt}}: {{W+|pt|-dor|n}} * {{Z|ro}}: {{W+|ro|-tor|n}}, {{W-|ro|-toare|m}} * {{Z|ru}}: {{W+|ru|-тель|n}}, {{W+|ru|-ник|n}}, {{W-|ru|-о́вщик|n}}, {{W+|ru|-щик|n}}, {{W+|ru|-щи́к|n}}, {{W+|ru|-чик|n}}, {{W+|ru|-ик|n}}, {{W+|ru|-и́к|n}}, {{W+|ru|-ец|n}}, {{W+|ru|-а́тор}}, {{W+|ru|-а́ч|n}}, {{W+|ru|-ер|n}} * {{Z|sa}}: {{W-|sa|-क|n}} * {{Z|es}}: {{W+|es|-dor|n}}, {{W+|es|-dora|m}}, {{W+|es|-ero|n}}, {{W+|es|-era|m}} * {{Z|sw}}: {{W-|sw|m-}} * {{Z|sv}}: {{W+|sv|-re}} * {{Z|th}}: {{W+|th|นัก|cuda=นัก...|tr=nák...}}, {{W+|th|ผู้|cuda=ผู้...|tr=pûu...}}, {{W+|th|คน|cuda=คน...|tr=kon...}}, {{W+|th|ช่าง|cuda=ช่าง...|tr=châang...}} * {{Z|tr}}: {{W+|tr|-cı}}, {{W+|tr|-ci}}, {{W+|tr|-cu}}, {{W+|tr|-cü}}; {{W+|tr|-çı}}, {{W+|tr|-çi}}, {{W+|tr|-çu}}, {{W+|tr|-çü}} * {{Z|cy}}: {{W+|cy|-wr|n}}, {{W+|cy|-ydd|n}}, {{W-|cy|-wraig|m}} * {{Z|wrh}}: {{W-|wrh|-daayn}} * {{Z|yo}}: {{W-|yo|oní-}} * {{Z|el}}: {{W+|el|-άς|n}}, {{W+|el|-ού|m}} * {{Z|ase}}: {{W-|ase|OpenB@SideChesthigh-OpenB@SideChesthigh OpenB@SideTrunkhigh-OpenB@SideTrunkhigh}} {{werger-bin}} :{{werger çavkanî|en|-er|beş=Ev qismê Wergerê|oldid=75987219}} 9fjavxldctfcmytxesbnv0rm2vjwpyd destav 0 4720 6532100 6428355 2026-09-18T20:20:39Z Wikihez 7344 Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532100 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{IPA|ku|/dɛsˈtɑːv/}} * {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-destav.wav|dever=Bidlîs}} * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # {{f|ku|xweşbêjî}} Peyvek [[rêzdar]] e li şûna ''[[gû]]'' û / yan ''[[mîz]]''. ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Bi alfabeyên din ==== * {{ku-ar|دەستئاڤ}} ==== Jê ==== * '''destava stûr''': [[gû]] * '''destava zirav''': [[mîz]] * çûn destavê * destav(a xwe) xweş kirin: [[mîstin]] yan [[rîtin]] * {{g|ku|destavdank}} * {{g|ku|destavxane}} ==== Etîmolojî ==== {{etîmon|ku|:qf|dest|av|dar=1|metn=+}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Waschung|m}} * {{Z|ar}}: {{W|ar|مرافق}}, {{W|ar|مرحاض}}, {{W|ar|غائط}} * {{Z|fa}}: {{W|fa|دستشویی}}, {{W|fa|آبدست}} * {{Z|en}}: {{W|en|rest room}}, {{W|en|water closet}}, {{W|en|bath room|guman=erê}}, {{W|ar|excrement}}, {{W|en|urinating}} * {{Z|tr}}: {{W|tr|aptes}}, {{W|tr|hacet}}, {{W|tr|fasit olmak}}, {{W|tr|hacet yeri|guman=erê}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=adestv|avdest}} 5jni4xe2a8zhn50gmdyt4w9qt3f7tbe şûştin 0 5090 6532018 6337976 2026-09-18T15:22:40Z Wikihez 7344 /* Lêker */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re) 6532018 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{IPA|ku|/ʃuːʃˈtɘn/}} ** (''[[rojhilatî]]'') {{IPA|ku|/ʃʉːʃˈtɘn/}} === Lêker === {{ku-tewîn-lk|şûştin|form=gerguhêz|niha=şo|borî=şûşt}} [[Wêne:OCD handwash.jpg|thumb|Kesek destên xwe '''dişo'''.]] {{lêker|ku|c=x-gh}} # Bi [[av]]ê [[paqij]] kirin. #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Destekê sunnet e tê da di yekê nessê kitab e<br />Dil '''bişo''' tu j' vê nifaqê ko bidit sîne beraqê<br />Bi sefa hemrehê erbabê dil û ehlê sefa be}} #* {{jêder-malper|ku|jêgirtin=Xwîn bi xwînê nayê '''şûştin'''.|nivîskar=Hasan Polat|sernav= Nêrinek li ser romana Mîrzayê Reben|url=https://www.gazeteduvar.com.tr/kitap/2020/02/18/nerinek-li-ser-romana-mirzaye-reben/|dîrok=18.02.2020|malper=gazeteduvar.com.tr}} #* {{jêder-pirtûk|ku|jêgirtin=Du dest cilên mela bazîd hebûn, yek '''berşûştûnê''' bû yek dişûştin yek jî ber dikirin. Jina mela bazîdî înan ew destêd cilêd mayî ku '''berşûştûnê''' bûn, daye jaran...|nivîskar=Mele Mehmûdê Bazîdî|sernav=Cami’eya Riseleyan û Hikayetan Bi Zimanê Kurmancî|cîh=Stembol|weşanxane={{w|Weşanên Lîs|Lîs}}|sal=2010|çap=1|rûpel=60|isbn=978-605-5683-27-6}} ==== Bi alfabeyên din ==== * {{ku-ar|شووشتن}} ==== Formên alternatîv ==== {{kol3|ku |şîştin |şuştin |şwîştin }} ==== Jê ==== {{kol3|ku|cure=Jê |[[aman]] şûştin |[[cil]] şûştin |[[firax]] şûşin |[[leş]]ê xwe şûştin |serê xwe şûştin |[[xwe]] şûştin |amanşo |amanşok |amanşokî |amanşoyî |destşo |destşok |destşokî |destşoyî |pêşo |pêşok |serşo |serşok |serşokî |têşo |têşok |veşo |veşok |veşokî |veşoyî |veşûştin |berşûştin }} ==== Etîmolojî ==== Ji {{ji|ira-pro||-}} '''*xşaud'''- ("şûştin"), {{ae}}: '''xşaod'''- ("to become liquid"), '''xşaodah'''- ("herrikîna avê"), {{xpr}}: '''şwd'''- ("şûştin"), {{pal}}: '''şwd'''-, '''şws'''-, '''şus'''- ("şûştin"), {{fa}}: '''şo'''- ("şustin"), {{bal}}: '''şuş'''-, '''şus'''- ("şûştin"), {{gil}}: '''şos'''- ("şûştin"), {{kmr}}: '''şûştin'''- ("şûştin"), {{ckb}}: '''şûştin, şordin'''- ("şûştin"), {{hac}}: '''şi'''- ("şûştin"), {{zza}}: ''' şiten / şi'''-) {{ir}}, {{sa}}: '''kşod''' ("to dissolve", "to disintegrate") <font style="font-size:12px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.455]]</font> ==== Bide ber ==== * {{g|ku|balav}} ==== Bi zaravayên din ==== * {{Z|ckb}}: [[şitin]], [[şordin]], [[şûştin]] * Zazakî: şutene, şutiş ==== Werger ==== {{werger-ser}} * {{Z|af}}: {{W+|af|was}} * {{Z|akl}}: {{W-|akl|eaba}} * {{Z|sq}}: {{W+|sq|lan}} * {{Z|goh}}: {{W-|goh|dwahan}} * {{Z|de}}: {{W+|de|waschen}}, {{W+|de|spülen}} * {{Z|arc}}: *: Siryanî: {{W-|syc|ܣܚܐ|tr=sħā|sc=Syrc}} * {{Z|rup}}: {{W-|rup|spel}}, {{W-|rup|aspel}}, {{W-|rup|lau}} * {{Z|as}}: {{W-|as|ধোৱা}} * {{Z|ast}}: {{W+|ast|llavar}} * {{Z|az}}: {{W+|az|yumaq}} * {{Z|eu}}: {{W-|eu|garbitu}} * {{Z|ba}}: {{W-|ba|йыуыу}} * {{Z|be}}: {{W-|be|мыць|impf}}, {{W-|be|памы́ць|pf}}; {{W-|be|праць|impf}} * {{Z|bn}}: {{W+|bn|ধোয়া}}, {{W+|bn|ধোওয়া}} * {{Z|bcl}}: {{W-|bcl|hugas}} * {{Z|br}}: {{W+|br|gwalc'hiñ}} * {{Z|bg}}: {{W+|bg|ми́я|impf}}, {{W+|bg|измивам}} * {{Z|my}}: {{W+|my|ဆေး|sc=Mymr}} * {{Z|bua}}: {{W-|bua|угааха}} * {{Z|cs}}: {{W+|cs|mýt|impf}}, {{W+|cs|prát|impf}} * {{Z|chr}}: {{W-|chr|ᏕᎬᎩᎶᎠ}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|洗|tr=sai2}} *: {{Z|cmn}}: {{W+|cmn|洗|tr=xǐ}}, {{W-|cmn|洗滌|tr=xǐdí}}, {{W+|cmn|沖洗|tr=chōngxǐ}} * {{Z|cv}}: {{W-|cv|ҫу}} * Classical Nahuatl: [[paca|pāca]] * {{Z|da}}: {{W+|da|vaske}} * {{Z|dlg}}: {{W-|dlg|һууй|tr=huuy}} * {{Z|ovd}}: {{W-|ovd|rįesa}} * {{Z|id}}: {{W+|id|mencuci}} * {{Z|ar}}: {{W-|ar|غَسَلَ}} * {{Z|hy}}: {{W+|hy|լվալ|sc=Armn}}, {{W+|hy|լվանալ|sc=Armn}} * {{Z|eo}}: {{W-|eo|lavi}} * {{Z|et}}: {{W+|et|pesema}} * {{Z|eve}}: {{W-|eve|авдай}}, {{W-|eve|хилкадай}} * {{Z|evn}}: {{W-|evn|авми}}, {{W-|evn|силкими}} * {{Z|fa}}: {{W+|fa|شستن|tr=šostan}} * {{Z|fo}}: {{W+|fo|vaska}} * {{Z|fi}}: {{W+|fi|pestä}}; {{W+|fi|tiskata}}, {{W+|fi|pyykätä}} * {{Z|fr}}: {{W+|fr|laver}} * {{Z|fur}}: {{W-|fur|lavâ}} * {{Z|fy}}: {{W-|fy|waskje}} * {{Z|gl}}: {{W+|gl|lavar}} * {{Z|got}}: {{W-|got|𐌸𐍅𐌰𐌷𐌰𐌽}} * {{Z|ka}}: {{W-|ka|რეცხვა|sc=Geor}}, {{W-|ka|გარეცხვა|sc=Geor}}, {{W-|ka|ბანვა|sc=Geor}} * {{Z|gn}}: {{W-|gn|johéi}} * {{Z|ht}}: {{W-|ht|lave}} * {{Z|haw}}: {{W-|haw|holoi}} * {{Z|hi}}: {{W+|hi|धोना}} * {{Z|nl}}: {{W+|nl|wassen}}, {{W+|nl|spoelen}}, {{W+|nl|afspoelen}} * {{Z|he}}: {{W+|he|רָחַץ|tr=rakháts}}, {{W+|he|שָׁטַף|tr=shatáf}} * {{Z|io}}: {{W+|io|lavar}} * {{Z|ang}}: {{W-|ang|þwēan}}, {{W-|ang|wascan}} * {{Z|enm}}: {{W-|enm|wasshen}} * {{Z|en}}: {{W+|en|wash}} * {{Z|ga}}: {{W-|ga|nigh}} *: {{Z|sga}}: {{W-|sga|nigid}}, {{W-|sga|ind·aim}} * {{Z|isd}}: {{W-|isd|uxat}} * {{Z|it}}: {{W+|it|lavare}} * {{Z|is}}: {{W+|is|þvo}} * {{Z|ja}}: {{W+|ja|洗う|tr=あらう, arau}} * {{Z|kaw}}: {{W-|kaw|kumbah}} * {{Z|jv}}: {{W-|jv|ngumbah}}, {{W+|jv|raup}}, {{W+|jv|wisuh}} * {{Z|kab}}: {{W-|kab|ssired}} * {{Z|xal}}: {{W-|xal|уһах}} * {{Z|csb}}: {{W-|csb|mëc}} * {{Z|ca}}: {{W+|ca|rentar}}, {{W+|ca|llavar}} * {{Z|qu}}: {{W-|qu|mayllay}}, {{W-|qu|t'aqsay}} * {{Z|ks}}: {{W-|ks|چھَلُن}} * {{Z|ky}}: {{W+|ky|жуу}} * {{Z|ko}}: {{W+|ko|씻다}} * {{Z|kw}}: {{W-|kw|golhi}} * {{Z|la}}: {{W+|la|lavō}}, {{W-|la|luo}} * {{Z|lv}}: {{W+|lv|mazgāt}} * {{Z|lo}}: {{W+|lo|ລ້າງ}}, {{W-|lo|ຊັກ}}, {{W-|lo|ສ່ວຍ}} * {{Z|li}}: {{W+|li|wasje}}, {{W-|li|wesje}}, {{W+|li|speule}}, {{W+|li|aafspeule}} * {{Z|lt}}: {{W-|lt|pláuti}}, {{W-|lt|mazgoti}}, {{W+|lt|prausti|cuda=praũsti}} * {{Z|lmo}}: {{W-|lmo|lavà}} * {{Z|mdh}}: {{W-|mdh|ugas}} * {{Z|mk}}: {{W-|mk|мие|impf}} * {{Z|ms}}: {{W-|ms|mencuci}} * {{Z|mt}}: {{W-|mt|ħasel}} * {{Z|mnc}}: {{W-|mnc|ᠣᠪᠣᠮᠪᡳ}} * {{Z|mi}}: {{W-|mi|horoi}} * {{Z|hu}}: {{W+|hu|mos}}, {{W+|hu|kimos}} * {{Z|egy}}: {{W-egy|jꜥj|h=i-a:N35B}} * {{Z|mn}}: {{W+|mn|угаалга|sc=Cyrl}} * {{Z|gld}}: {{W-|gld|силко-}} * {{Z|nds}}: {{W-|nds|waschen}} * {{Z|nrf}}: {{W-|nrf|laver}} * {{Z|non}}: {{W-|non|þvó}}, {{W-|non|þvætta}} * {{Z|no}}: {{W-|no|tvette}}, {{W+|no|vaske}} * {{Z|oc}}: {{W+|oc|lavar}} * {{Z|om}}: {{W-|om|miiccuu}} * {{Z|os}}: {{W-|os|ӕхсын}} * {{Z|ota}}: {{W-|ota|ییقامق|tr=yıkamak|sc=ota-Arab}} * {{Z|ug}}: {{W-|ug|ياقىماق}}, {{W-|ug|يۇماق}} *: {{Z|ug}}: {{W-|ug|يۇماق}}, {{W-|ug|يۇيماق}} *: {{Z|ug}}: {{W-|ug|жумақ}}, {{W-|ug|жуймақ}} * {{Z|uz}}: {{W+|uz|yuvmoq}}, {{W+|uz|yuvinmoq}} * {{Z|pap}}: {{W-|pap|laba}} * {{Z|ps}}: {{W-|ps|ولل|tr=wlᶕl}}, {{W-|ps|اندرېيل|tr=andreyál}} * {{Z|pms}}: {{W-|pms|lavé}} * {{Z|pl}}: {{W+|pl|myć|impf}}, {{W+|pl|prać|impf}} * {{Z|pt}}: {{W+|pt|lavar}} * {{Z|kk}}: {{W-|kk|жуу|sc=Cyrl}} * {{Z|rhg}}: {{W-|rhg|dúo}} * {{Z|rgn}}: {{W-|rgn|lavêr}} * {{Z|rm}}: {{W-|rm|lavar}}, {{W-|rm|laver}} * {{Z|rom}}: {{W-|rom|thovel}} * {{Z|ro}}: {{W+|ro|spăla}} * {{Z|ru}}: {{W+|ru|мыть|impf}}, {{W+|ru|помы́ть|pf}}, {{W+|ru|вы́мыть|pf}}; {{W+|ru|стира́ть|impf}}, {{W+|ru|постира́ть|pf}} * {{Z|sm}}: {{W-|sm|fulu}} * {{Z|sa}}: {{W+|sa|क्षिपति}} * {{Z|sc}}: {{W-|sc|samunài}}, {{W-|sc|samunàe}}, {{W-|sc|samunàre}}, {{W-|sc|sciacuai}}, {{W-|sc|labare}} * Scottish Gaelic: [[nigh#Irish|nigh]] * {{Z|ceb}}: {{W-|ceb|laba}}, {{W-|ceb|hugas}} * {{Z|scn}}: {{W+|scn|lavari}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|ми̏ти|impf}}, {{W-|sh|пра̏ти|impf}} *: Latînî: {{W+|sh|mȉti|impf}}, {{W+|sh|prȁti|impf}} * {{Z|syl}}: {{W-|syl|ꠗꠃꠣ}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|мꙑти|impf}} * {{Z|orv}}: {{W-|orv|мꙑти|impf}} * {{Z|sk}}: {{W-|sk|myť|impf}}, {{W-|sk|prať|impf}} * {{Z|sl}}: {{W-|sl|miti|impf}}, {{W-|sl|prati|impf}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|myś|impf}} * {{Z|es}}: {{W+|es|lavar}} * {{Z|su}}: {{W+|su|kumbah}} * {{Z|sw}}: {{W-|sw|osha|cuda=-osha}}, {{W+|sw|fua|cuda=-fua}}, {{W-|sw|nawa|cuda=-nawa}} * {{Z|sv}}: {{W+|sv|tvätta}}, {{W+|sv|tvaga}}, {{W+|sv|två}} * {{Z|zdj}}: {{W-|zdj|yela|cuda=uyela}} * {{Z|tg}}: {{W+|tg|шустан}} * {{Z|tl}}: {{W-|tl|maghugas}}, {{W-|tl|hugasan}} * {{Z|ta}}: {{W+|ta|கழுவு|sc=Taml}}, {{W+|ta|அலம்பு|sc=Taml}} * {{Z|tsg}}: {{W-|tsg|hugas}} * {{Z|th}}: {{W+|th|ล้าง}}, {{W+|th|ซัก}} * {{Z|te}}: {{W+|te|కడుగు}} ''hands, dishes, etc.'', {{W+|te|ఉతుకు}} ''clothes'' * {{Z|crh}}: {{W-|crh|yuvmaq}}, {{W-|crh|cuvmaq}} * {{Z|tt}}: {{W+|tt|юарга}} * {{Z|tet}}: {{W-|tet|fase}} * {{Z|tr}}: {{W+|tr|yıkamak}}, {{W+|tr|yumak}} * {{Z|tk}}: {{W-|tk|ýuvmak}} * {{Z|bo}}: {{W-|bo|བཀྲུ་བ|sc=Tibt}} * {{Z|to}}: {{W-|to|kaukau}} * {{Z|tyv}}: {{W-|tyv|чуур}} * {{Z|uga}}: {{W-|uga|𐎗𐎈𐎕}} * {{Z|ur}}: {{W-|ur|دھونا|tr=dhonā}} * {{Z|uk}}: {{W-|uk|ми́ти|impf}}, {{W-|uk|пра́ти|impf}} * {{Z|vi}}: {{W+|vi|rửa}}, {{W+|vi|giặt}} * {{Z|vo}}: {{W+|vo|lavön}} * {{Z|vro}}: {{W-|vro|mõskma}} * {{Z|wa}}: {{W-|wa|laver}}, {{W+|wa|rinetyî}}, {{W+|wa|rilaver}} * {{Z|cy}}: {{W+|cy|golchi}} * {{Z|kjh}}: {{W-|kjh|чуурға}} * {{Z|km}}: {{W+|km|លាង}} * {{Z|yi}}: {{W-|yi|וואַשן}} * {{Z|el}}: {{W+|el|πλένω}} *: Kevn: {{W-|grc|πλύνω}}, {{W-|grc|νίπτω}}, {{W-|grc|λούω}} * {{Z|zea}}: {{W-|zea|wasse}} {{werger-bin}} :{{werger çavkanî|en|wash|beş=Ev beşa Wergerê|oldid=75572665}} === Navdêr === {{navdêr|ku|z=m}} # bi avê pakkirina tiştek an jî kesekî ji qilêrî û lekeyan, karê paqijiya bi avê #: {{nm|ku|Berî xwarinê '''şûştina''' dest û ser û çavan bi min re bûye adet.}} ==== Tewandin ==== {{ku-tewîn-nav/nû|mê}} ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|clean}} * {{Z|tr}}: {{W+|tr|yıkama}} {{werger-bin}} gp6ilhtcuzyel8x15i08gkq22uc2a7r 6532050 6532018 2026-09-18T17:12:13Z Balyozbot 7867 Bot: Paqijiyên kozmetîk ({{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.) 6532050 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{IPA|ku|/ʃuːʃˈtɘn/}} ** (''[[rojhilatî]]'') {{IPA|ku|/ʃʉːʃˈtɘn/}} === Lêker === {{ku-tewîn-lk|şûştin|form=gerguhêz|niha=şo|borî=şûşt}} [[Wêne:OCD handwash.jpg|thumb|Kesek destên xwe '''dişo'''.]] {{lêker|ku|c=x-gh}} # Bi [[av]]ê [[paqij]] kirin. #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Destekê sunnet e tê da di yekê nessê kitab e<br />Dil '''bişo''' tu j' vê nifaqê ko bidit sîne beraqê<br />Bi sefa hemrehê erbabê dil û ehlê sefa be}} #* {{jêder-malper|ku|jêgirtin=Xwîn bi xwînê nayê '''şûştin'''.|nivîskar=Hasan Polat|sernav= Nêrinek li ser romana Mîrzayê Reben|url=https://www.gazeteduvar.com.tr/kitap/2020/02/18/nerinek-li-ser-romana-mirzaye-reben/|dîrok=18.02.2020|malper=gazeteduvar.com.tr}} #* {{jêder-pirtûk|ku|jêgirtin=Du dest cilên mela bazîd hebûn, yek '''berşûştûnê''' bû yek dişûştin yek jî ber dikirin. Jina mela bazîdî înan ew destêd cilêd mayî ku '''berşûştûnê''' bûn, daye jaran...|nivîskar=Mele Mehmûdê Bazîdî|sernav=Cami’eya Riseleyan û Hikayetan Bi Zimanê Kurmancî|cîh=Stembol|weşanxane={{w|Weşanên Lîs|Lîs}}|sal=2010|çap=1|rûpel=60|isbn=978-605-5683-27-6}} ==== Bi alfabeyên din ==== * {{ku-ar|شووشتن}} ==== Formên alternatîv ==== {{kol3|ku |şîştin |şuştin |şwîştin }} ==== Jê ==== {{kol3|ku|cure=Jê |[[aman]] şûştin |[[cil]] şûştin |[[firax]] şûşin |[[leş]]ê xwe şûştin |serê xwe şûştin |[[xwe]] şûştin |amanşo |amanşok |amanşokî |amanşoyî |destşo |destşok |destşokî |destşoyî |pêşo |pêşok |serşo |serşok |serşokî |têşo |têşok |veşo |veşok |veşokî |veşoyî |veşûştin |berşûştin }} ==== Etîmolojî ==== Ji {{ji|ira-pro||-}} '''*xşaud'''- ("şûştin"), {{ae}}: '''xşaod'''- ("to become liquid"), '''xşaodah'''- ("herrikîna avê"), {{xpr}}: '''şwd'''- ("şûştin"), {{pal}}: '''şwd'''-, '''şws'''-, '''şus'''- ("şûştin"), {{fa}}: '''şo'''- ("şustin"), {{bal}}: '''şuş'''-, '''şus'''- ("şûştin"), {{gil}}: '''şos'''- ("şûştin"), {{kmr}}: '''şûştin'''- ("şûştin"), {{ckb}}: '''şûştin, şordin'''- ("şûştin"), {{hac}}: '''şi'''- ("şûştin"), {{zza}}: ''' şiten / şi'''-) {{ir}}, {{sa}}: '''kşod''' ("to dissolve", "to disintegrate") <font style="font-size:12px">'''Çavkanî:''' [[Şablon:Cheung|Cheung p.455]]</font> ==== Bide ber ==== * {{g|ku|balav}} ==== Bi zaravayên din ==== * {{Z|ckb}}: [[şitin]], [[şordin]], [[şûştin]] * Zazakî: şutene, şutiş ==== Werger ==== {{werger-ser}} * {{Z|af}}: {{W+|af|was}} * {{Z|akl}}: {{W-|akl|eaba}} * {{Z|sq}}: {{W+|sq|lan}} * {{Z|goh}}: {{W-|goh|dwahan}} * {{Z|de}}: {{W+|de|waschen}}, {{W+|de|spülen}} * {{Z|arc}}: *: Siryanî: {{W-|syc|ܣܚܐ|tr=sħā|sc=Syrc}} * {{Z|rup}}: {{W-|rup|spel}}, {{W-|rup|aspel}}, {{W-|rup|lau}} * {{Z|as}}: {{W-|as|ধোৱা}} * {{Z|ast}}: {{W+|ast|llavar}} * {{Z|az}}: {{W+|az|yumaq}} * {{Z|eu}}: {{W-|eu|garbitu}} * {{Z|ba}}: {{W-|ba|йыуыу}} * {{Z|be}}: {{W-|be|мыць|impf}}, {{W-|be|памы́ць|pf}}; {{W-|be|праць|impf}} * {{Z|bn}}: {{W+|bn|ধোয়া}}, {{W+|bn|ধোওয়া}} * {{Z|bcl}}: {{W-|bcl|hugas}} * {{Z|br}}: {{W+|br|gwalc'hiñ}} * {{Z|bg}}: {{W+|bg|ми́я|impf}}, {{W+|bg|измивам}} * {{Z|my}}: {{W+|my|ဆေး|sc=Mymr}} * {{Z|bua}}: {{W-|bua|угааха}} * {{Z|cs}}: {{W+|cs|mýt|impf}}, {{W+|cs|prát|impf}} * {{Z|chr}}: {{W-|chr|ᏕᎬᎩᎶᎠ}} * {{Z|zh}}: *: {{Z|yue}}: {{W-|yue|洗|tr=sai2}} *: {{Z|cmn}}: {{W+|cmn|洗|tr=xǐ}}, {{W-|cmn|洗滌|tr=xǐdí}}, {{W+|cmn|沖洗|tr=chōngxǐ}} * {{Z|cv}}: {{W-|cv|ҫу}} * Classical Nahuatl: [[paca|pāca]] * {{Z|da}}: {{W+|da|vaske}} * {{Z|dlg}}: {{W-|dlg|һууй|tr=huuy}} * {{Z|ovd}}: {{W-|ovd|rįesa}} * {{Z|id}}: {{W+|id|mencuci}} * {{Z|ar}}: {{W-|ar|غَسَلَ}} * {{Z|hy}}: {{W+|hy|լվալ|sc=Armn}}, {{W+|hy|լվանալ|sc=Armn}} * {{Z|eo}}: {{W-|eo|lavi}} * {{Z|et}}: {{W+|et|pesema}} * {{Z|eve}}: {{W-|eve|авдай}}, {{W-|eve|хилкадай}} * {{Z|evn}}: {{W-|evn|авми}}, {{W-|evn|силкими}} * {{Z|fa}}: {{W+|fa|شستن|tr=šostan}} * {{Z|fo}}: {{W+|fo|vaska}} * {{Z|fi}}: {{W+|fi|pestä}}; {{W+|fi|tiskata}}, {{W+|fi|pyykätä}} * {{Z|fr}}: {{W+|fr|laver}} * {{Z|fur}}: {{W-|fur|lavâ}} * {{Z|fy}}: {{W-|fy|waskje}} * {{Z|gl}}: {{W+|gl|lavar}} * {{Z|got}}: {{W-|got|𐌸𐍅𐌰𐌷𐌰𐌽}} * {{Z|ka}}: {{W-|ka|რეცხვა|sc=Geor}}, {{W-|ka|გარეცხვა|sc=Geor}}, {{W-|ka|ბანვა|sc=Geor}} * {{Z|gn}}: {{W-|gn|johéi}} * {{Z|ht}}: {{W-|ht|lave}} * {{Z|haw}}: {{W-|haw|holoi}} * {{Z|hi}}: {{W+|hi|धोना}} * {{Z|nl}}: {{W+|nl|wassen}}, {{W+|nl|spoelen}}, {{W+|nl|afspoelen}} * {{Z|he}}: {{W+|he|רָחַץ|tr=rakháts}}, {{W+|he|שָׁטַף|tr=shatáf}} * {{Z|io}}: {{W+|io|lavar}} * {{Z|ang}}: {{W-|ang|þwēan}}, {{W-|ang|wascan}} * {{Z|enm}}: {{W-|enm|wasshen}} * {{Z|en}}: {{W+|en|wash}} * {{Z|ga}}: {{W-|ga|nigh}} *: {{Z|sga}}: {{W-|sga|nigid}}, {{W-|sga|ind·aim}} * {{Z|isd}}: {{W-|isd|uxat}} * {{Z|it}}: {{W+|it|lavare}} * {{Z|is}}: {{W+|is|þvo}} * {{Z|ja}}: {{W+|ja|洗う|tr=あらう, arau}} * {{Z|kaw}}: {{W-|kaw|kumbah}} * {{Z|jv}}: {{W-|jv|ngumbah}}, {{W+|jv|raup}}, {{W+|jv|wisuh}} * {{Z|kab}}: {{W-|kab|ssired}} * {{Z|xal}}: {{W-|xal|уһах}} * {{Z|csb}}: {{W-|csb|mëc}} * {{Z|ca}}: {{W+|ca|rentar}}, {{W+|ca|llavar}} * {{Z|qu}}: {{W-|qu|mayllay}}, {{W-|qu|t'aqsay}} * {{Z|ks}}: {{W-|ks|چھَلُن}} * {{Z|ky}}: {{W+|ky|жуу}} * {{Z|ko}}: {{W+|ko|씻다}} * {{Z|kw}}: {{W-|kw|golhi}} * {{Z|la}}: {{W+|la|lavō}}, {{W-|la|luo}} * {{Z|lv}}: {{W+|lv|mazgāt}} * {{Z|lo}}: {{W+|lo|ລ້າງ}}, {{W-|lo|ຊັກ}}, {{W-|lo|ສ່ວຍ}} * {{Z|li}}: {{W+|li|wasje}}, {{W-|li|wesje}}, {{W+|li|speule}}, {{W+|li|aafspeule}} * {{Z|lt}}: {{W-|lt|pláuti}}, {{W-|lt|mazgoti}}, {{W+|lt|prausti|cuda=praũsti}} * {{Z|lmo}}: {{W-|lmo|lavà}} * {{Z|mdh}}: {{W-|mdh|ugas}} * {{Z|mk}}: {{W-|mk|мие|impf}} * {{Z|ms}}: {{W-|ms|mencuci}} * {{Z|mt}}: {{W-|mt|ħasel}} * {{Z|mnc}}: {{W-|mnc|ᠣᠪᠣᠮᠪᡳ}} * {{Z|mi}}: {{W-|mi|horoi}} * {{Z|hu}}: {{W+|hu|mos}}, {{W+|hu|kimos}} * {{Z|egy}}: {{W-egy|jꜥj|h=i-a:N35B}} * {{Z|mn}}: {{W+|mn|угаалга|sc=Cyrl}} * {{Z|gld}}: {{W-|gld|силко-}} * {{Z|nds}}: {{W-|nds|waschen}} * {{Z|nrf}}: {{W-|nrf|laver}} * {{Z|non}}: {{W-|non|þvó}}, {{W-|non|þvætta}} * {{Z|no}}: {{W-|no|tvette}}, {{W+|no|vaske}} * {{Z|oc}}: {{W+|oc|lavar}} * {{Z|om}}: {{W-|om|miiccuu}} * {{Z|os}}: {{W-|os|ӕхсын}} * {{Z|ota}}: {{W-|ota|ییقامق|tr=yıkamak|sc=ota-Arab}} * {{Z|ug}}: {{W-|ug|ياقىماق}}, {{W-|ug|يۇماق}} *: {{Z|ug}}: {{W-|ug|يۇماق}}, {{W-|ug|يۇيماق}} *: {{Z|ug}}: {{W-|ug|жумақ}}, {{W-|ug|жуймақ}} * {{Z|uz}}: {{W+|uz|yuvmoq}}, {{W+|uz|yuvinmoq}} * {{Z|pap}}: {{W-|pap|laba}} * {{Z|ps}}: {{W-|ps|ولل|tr=wlᶕl}}, {{W-|ps|اندرېيل|tr=andreyál}} * {{Z|pms}}: {{W-|pms|lavé}} * {{Z|pl}}: {{W+|pl|myć|impf}}, {{W+|pl|prać|impf}} * {{Z|pt}}: {{W+|pt|lavar}} * {{Z|kk}}: {{W-|kk|жуу|sc=Cyrl}} * {{Z|rhg}}: {{W-|rhg|dúo}} * {{Z|rgn}}: {{W-|rgn|lavêr}} * {{Z|rm}}: {{W-|rm|lavar}}, {{W-|rm|laver}} * {{Z|rom}}: {{W-|rom|thovel}} * {{Z|ro}}: {{W+|ro|spăla}} * {{Z|ru}}: {{W+|ru|мыть|impf}}, {{W+|ru|помы́ть|pf}}, {{W+|ru|вы́мыть|pf}}; {{W+|ru|стира́ть|impf}}, {{W+|ru|постира́ть|pf}} * {{Z|sm}}: {{W-|sm|fulu}} * {{Z|sa}}: {{W+|sa|क्षिपति}} * {{Z|sc}}: {{W-|sc|samunài}}, {{W-|sc|samunàe}}, {{W-|sc|samunàre}}, {{W-|sc|sciacuai}}, {{W-|sc|labare}} * Scottish Gaelic: [[nigh#Irish|nigh]] * {{Z|ceb}}: {{W-|ceb|laba}}, {{W-|ceb|hugas}} * {{Z|scn}}: {{W+|scn|lavari}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|ми̏ти|impf}}, {{W-|sh|пра̏ти|impf}} *: Latînî: {{W+|sh|mȉti|impf}}, {{W+|sh|prȁti|impf}} * {{Z|syl}}: {{W-|syl|ꠗꠃꠣ}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|мꙑти|impf}} * {{Z|orv}}: {{W-|orv|мꙑти|impf}} * {{Z|sk}}: {{W-|sk|myť|impf}}, {{W-|sk|prať|impf}} * {{Z|sl}}: {{W-|sl|miti|impf}}, {{W-|sl|prati|impf}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|myś|impf}} * {{Z|es}}: {{W+|es|lavar}} * {{Z|su}}: {{W+|su|kumbah}} * {{Z|sw}}: {{W-|sw|osha|cuda=-osha}}, {{W+|sw|fua|cuda=-fua}}, {{W-|sw|nawa|cuda=-nawa}} * {{Z|sv}}: {{W+|sv|tvätta}}, {{W+|sv|tvaga}}, {{W+|sv|två}} * {{Z|zdj}}: {{W-|zdj|yela|cuda=uyela}} * {{Z|tg}}: {{W+|tg|шустан}} * {{Z|tl}}: {{W-|tl|maghugas}}, {{W-|tl|hugasan}} * {{Z|ta}}: {{W+|ta|கழுவு|sc=Taml}}, {{W+|ta|அலம்பு|sc=Taml}} * {{Z|tsg}}: {{W-|tsg|hugas}} * {{Z|th}}: {{W+|th|ล้าง}}, {{W+|th|ซัก}} * {{Z|te}}: {{W+|te|కడుగు}} ''hands, dishes, etc.'', {{W+|te|ఉతుకు}} ''clothes'' * {{Z|crh}}: {{W-|crh|yuvmaq}}, {{W-|crh|cuvmaq}} * {{Z|tt}}: {{W+|tt|юарга}} * {{Z|tet}}: {{W-|tet|fase}} * {{Z|tr}}: {{W+|tr|yıkamak}}, {{W+|tr|yumak}} * {{Z|tk}}: {{W-|tk|ýuvmak}} * {{Z|bo}}: {{W-|bo|བཀྲུ་བ|sc=Tibt}} * {{Z|to}}: {{W-|to|kaukau}} * {{Z|tyv}}: {{W-|tyv|чуур}} * {{Z|uga}}: {{W-|uga|𐎗𐎈𐎕}} * {{Z|ur}}: {{W-|ur|دھونا|tr=dhonā}} * {{Z|uk}}: {{W-|uk|ми́ти|impf}}, {{W-|uk|пра́ти|impf}} * {{Z|vi}}: {{W+|vi|rửa}}, {{W+|vi|giặt}} * {{Z|vo}}: {{W+|vo|lavön}} * {{Z|vro}}: {{W-|vro|mõskma}} * {{Z|wa}}: {{W-|wa|laver}}, {{W+|wa|rinetyî}}, {{W+|wa|rilaver}} * {{Z|cy}}: {{W+|cy|golchi}} * {{Z|kjh}}: {{W-|kjh|чуурға}} * {{Z|km}}: {{W+|km|លាង}} * {{Z|yi}}: {{W-|yi|וואַשן}} * {{Z|el}}: {{W+|el|πλένω}} *: Kevn: {{W-|grc|πλύνω}}, {{W-|grc|νίπτω}}, {{W-|grc|λούω}} * {{Z|zea}}: {{W-|zea|wasse}} {{werger-bin}} :{{werger çavkanî|en|wash|beş=Ev beşa Wergerê|oldid=75572665}} === Navdêr === {{navdêr|ku|z=m}} # bi avê pakkirina tiştek an jî kesekî ji qilêrî û lekeyan, karê paqijiya bi avê #: {{nm|ku|Berî xwarinê '''şûştina''' dest û ser û çavan bi min re bûye adet.}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Werger ==== {{werger-ser}} * {{Z|en}}: {{W+|en|clean}} * {{Z|tr}}: {{W+|tr|yıkama}} {{werger-bin}} goo4nbyh5syla16fbss4nq0hyej1ni2 -ker 0 9269 6532107 6368197 2026-09-18T20:36:23Z Wikihez 7344 Kurmancî/Paşgir: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532107 wikitext text/x-wiki {{h-bnr|ker|kêr|kerr|kêrr|-ker}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Paşgir === {{paşgir|ku}} # Kesa/ê tiştekê/î dike. #: ''[[karker|kar'''ker''']], [[nivêjker|nivêj'''ker''']], [[pirsker|pirs'''ker''']]'' ==== Formên alternatîv ==== * [[-kar]] ==== Jê ==== {{paşgirbibîne|ku}} * [[-kerî]] ==== Etîmolojî ==== {{etîmon|ku|:ji|ker<id:kirin>|dar=1|metn=++}} ==== Bide ber ==== * [[-dar]] * [[-yar]] ==== Werger ==== {{werger-ser}} {{werger-bin}} es8jxy8aniuwx5y9rbw0xbppwlinqci heram 0 10274 6532988 6434758 2026-09-19T10:02:51Z Şêr 1103 6532988 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Rengdêr === {{ku-tewîn-rd|heram}} {{rengdêr|ku}} # [[qedexe]], [[yasax]], [[memnû]], tişta/ê ku nabe bêt kirin (bi taybetî li gor [[dîn]]î) # [[pîs]], [[qirêj]], [[gemarî]], [[genî]], ne [[paqij]], ne [[pak]], ne [[bijûn]], ne [[temîz]] ==== Ji wêjeya klasîk ==== * {{J:Mela Hisênê Bateyî:Mewlûda Kurdî|jêgirtin=Xakîpayê Ehmed ew Beyt-ul '''heram'''<br />Lew şerîf in Zemzem û rukn û meqam}} ==== Bi alfabeyên din ==== * {{ku-ar|حه‌رام}} ==== Formên alternatîv ==== * [[ḧeram]] ==== Hevmane ==== * [[nehelal]] ==== Dijmane ==== * [[helal]] ==== Jê ==== {{kol3|ku|cure=Jê |heram bûn<q:lêker> |heram kirin<q:lêker> |heram xwarin |herambûn<q:navdêr> |heramkirin<q:navdêr> |heramxwarin<q:navdêr> |herambûyî<q:rengdêr> |heramkirî<q:rengdêr> |heramzade |heramzadehî |heramxwer |heramxwerî |herimandin |herimandî |herimî |herimîn |herimînende |herimînendehî |herimînendetî |herimînendeyî |herimîner |herimînerî |hilîheram }} ==== Etîmolojî ==== Ji {{deyn|ar|ku|حَرَام}}. Ji heman rehî: [[herêm]], [[harem]], [[miherem]]... ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|gesetzeswidrig|guman=erê}}, {{W-|de|unberührbar}}, {{W+|de|verboten}}, {{W+|de|unantastbar}}, {{W+|de|schmutzig}} * {{Z|ar}}: {{W|ar|حرام|guman=erê}}, {{W|ar|البسل|guman=erê}} * {{Z|fa}}: {{W+|fa|کثیف}} * {{Z|en}}: {{W+|en|illegal}}, {{W+|en|illicit}}, {{W+|en|uncleanly}}, {{W+|en|unlawful}}, {{W+|en|vulgar}}, {{W+|en|prohibited}}, {{W+|en|illegitimate}}, {{W+|en|excogitate}}, {{W+|en|excommunicate|guman=erê}}, {{W|en|haram|guman=erê}} * {{Z|tr}}: {{W+|tr|haram}}, {{W+|tr|illegal}}, {{W|tr|hakir|guman=erê}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=aehmr|ehram|ermah|harem|mehra|merha|rehma}} 90c4h7tdw9sca81yiak48lmjptn87es mîr 0 11269 6532099 6435250 2026-09-18T20:15:21Z Ziv 14071 ([[c:GR|GR]]) [[File:Bedir Khan Pasha (Bedir Khan Beg).jpg]] → [[File:Portrait of a Lebanese guard.jpg]] [[c:COM:FR#FR3|Criterion 3]] · corr, misleading name 6532099 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{deng|ku|LL-Q36163 (kmr)-Key Mîrza-mîr.wav|dever=Bidlîs}} * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=n}} [[Wêne:Portrait of a Lebanese guard.jpg|thumb|250px| '''Mîr''' Bedirxan]] # [[prens]], [[key]], [[paşa]], [[qiral]], [[melik]], [[padîşa]], [[serok]], [[serdar]], [[serwer]], [[pêşeng]], [[pêşewa]] #* {{jêder|ku|2=Hawar|jêgirtin=Şivan xwe gihand Birca Belek û derket xafa '''Mîr'''.}} #* {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Secdeyek ber wan du birhan nagirit cih sed nimaz</br>'Îd e û '''mîrê''' me îro dergehê lutfê vekir</br>Go Mela hingî bixwazî dê bidim bes tu bixwaz}} ==== Tewandin ==== {{ku-tewîn-nav|nêr}} ==== Bi alfabeyên din ==== * {{ku-ar|میر}} ==== Formên alternatîv ==== {{kol3|ku |emîr }} ==== Jê ==== {{kol3|ku|cure=Jê |mîr bûn<crz:lêker> |mîr kirin<crz:lêker> |mîrbûn<crz:navdêr> |mîrkirin<crz:navdêr> |mîrbûyî<crz:rengdêr> |mîrkirî<crz:rengdêr> |mîran |mîrane |mîranî |mîrbanî |mîrek |mîrekî |mîrî |mîrîtî |mîrnişîn |mîrnişînî |mîrza }} ==== Etîmolojî ==== Ji {{deyn|ar|ku|أمير|tr=emîr}}. Ketina herfên dengdar (vokal, vowel) ji destpêka peyvên ji erebî deynkirî di kurdî de tiştekî gelek normal e: Îbrahîm > Birahîm, Îsmaîl > Simayîl loma emîr > mîr jî. ;{{biçûk|Çavkanî * {{Chyet|r=396}} }} ==== Bide ber ==== {{kol3|ku |mar |mer |mêr |mir |mor |mur |mûr }} ==== Herwiha binêre ==== {{kol3|ku |bîr |çîr |dîr |fîr |gîr |hîr |jîr |kîr |lîr |nîr |pîr |qîr |sîr |şîr |tîr |zîr }} ==== Werger ==== {{werger-ser}} * {{Z|ady}}: {{W-|ady|пщы}} * {{Z|af}}: {{W+|af|prins}} * {{Z|sq}}: {{W-|sq|pringj|n}} * {{Z|de}}: {{W+|de|Fürst|n}} * {{Z|as}}: {{W-|as|কোঁৱৰ|tr=kü̃or}} * {{Z|ast}}: {{W+|ast|príncipe|n}} * {{Z|az}}: {{W-|az|şahzadə}}, {{W-|az|əmir}} * {{Z|bar}}: {{W-|bar|Fiarst}}, {{W-|bar|Fiascht}} * {{Z|be}}: {{W-|be|князь|n}}, {{W-|be|прынц|n}} * {{Z|bn}}: {{W+|bn|রাজকুমার}}, {{W+|bn|রাজপুত্র}}, {{W-|bn|শাহজাদা}}, {{W-|bn|আমীরজাদা}} * {{Z|br}}: {{W+|br|priñs|n}} * {{Z|bg}}: {{W+|bg|княз|n}}, {{W-|bg|принц|n}} * {{Z|my}}: {{W+|my|မင်းသား}} * {{Z|chg}}: {{W-|chg|شهزاده}} * {{Z|ce}}: {{W-|ce|э̄ла}} * {{Z|cs}}: {{W+|cs|kníže|n}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|亲王|tr=qīnwáng}} ; {{W-|cmn|國王|tr=guówáng}} ; {{W+|cmn|郡王|tr=jùnwáng}} ; {{W+|cmn|王|tr=wáng}}; {{W+|cmn|王爵|tr=wángjué}}; {{W+|cmn|王爷|tr=huángzǐ}} ; {{W+|cmn|王子|tr=wángzi}} * {{Z|da}}: {{W+|da|prins|g}}, {{W-|da|fyrste|g}} * {{Z|id}}: {{W+|id|pangeran}}, {{W+|id|putera}} * {{Z|ar}}: {{W+|ar|أَمِير|n}} *: {{Z|ary}}: {{W-|ary|مير|tr=mir}} * {{Z|hy}}: {{W+|hy|իշխան}} * {{Z|myv}}: {{W-|myv|каназор}} * {{Z|eo}}: {{W-|eo|princo}} * {{Z|et}}: {{W-|et|vürst}} * {{Z|fa}}: {{W+|fa|شاهزاده|tr=šâhzâde}}, {{W+|fa|امیر|tr=amir}}, {{W+|fa|شهریار|tr=šahryâr}} * {{Z|fo}}: {{W-|fo|prinsur|n}}, {{W-|fo|fúrsti|n}} * {{Z|fi}}: {{W+|fi|ruhtinas}} * {{Z|fr}}: {{W+|fr|prince|n}} * {{Z|gd}}: {{W-|gd|prionnsa|n}}, {{W-|gd|flath|n}} * {{Z|gl}}: {{W+|gl|príncipe|n}} * {{Z|ka}}: {{W-|ka|პრინცი}}, {{W-|ka|უფლისწული}} * {{Z|hi}}: {{W-|hi|शहज़ादा|n}}, {{W+|hi|राजकुमार|n}} * {{Z|nl}}: {{W+|nl|prins}} * {{Z|he}}: {{W+|he|נָסִיךְ|n|tr=nasik}} * {{Z|ang}}: {{W-|ang|æþeling|n}} * {{Z|en}}: {{W+|en|prince}} * {{Z|inh}}: {{W-|inh|аьла}} * {{Z|ga}}: {{W-|ga|flaith|n}}, {{W-|ga|prionsa|n}} * {{Z|it}}: {{W+|it|principe}} * {{Z|is}}: {{W+|is|prins|n}}, {{W-|is|fursti|n}} * {{Z|ja}}: {{W+|ja|公|tr=こう, kō}}, {{W+|ja|候|tr=こう, kō}}, {{W+|ja|大公|tr=たいこう, taikō}}, {{W+|ja|王子|tr=おうじ, ōji}}, {{W+|ja|皇子|tr=こうし, kōshi}} * {{Z|kbd}}: {{W-|kbd|пщы}} * {{Z|pam}}: {{W-|pam|lakan}}, {{W-|pam|datu}}, {{W-|pam|pirinsipi}} * {{Z|ca}}: {{W+|ca|príncep|n}} * {{Z|qu}}: {{W-|qu|awki}} * {{Z|ky}}: {{W+|ky|канзаада}}, {{W-|ky|принц}} * {{Z|ko}}: {{W+|ko|대공}}, {{W+|ko|대군}} * {{Z|kw}}: {{W-|kw|pennsevik|n}} * {{Z|la}}: {{W-|la|regulus}}, {{W+|la|prīnceps|n}} * {{Z|lv}}: {{W-|lv|princis|n}} * {{Z|lo}}: {{W-|lo|ເຈົ້າຊາຍ}} * {{Z|lt}}: {{W-|lt|princas|n}} * {{Z|khb}}: {{W-|khb|ᦈᧁᦌᦻ}} * {{Z|lb}}: {{W-|lb|Prënz|n}} * {{Z|mk}}: {{W-|mk|кнез|n}}, {{W-|mk|принц|n}} * {{Z|ms}}: {{W+|ms|putera}} * {{Z|mnc}}: {{W-|mnc|ᠠᡤᡝ}} * {{Z|gv}}: {{W-|gv|prinse|n}}, {{W-|gv|flah|n}} * {{Z|mi}}: {{W-|mi|piriniha}} * {{Z|hu}}: {{W+|hu|fejedelem}}, {{W+|hu|uralkodó}} * {{Z|egy}}: {{W-egy|jnpw|h=i-n:p-w-A42}} * {{Z|mn}}: *: Kirîlî: {{W+|mn|ноён}} * {{Z|nah}}: {{W+|nah|pilli}} * {{Z|nrf}}: {{W-|nrf|prînce|n}} * {{Z|no}}: *: {{Z|nb}}: {{W+|nb|fyrste|n}}, {{W+|nb|fyrst}} *: {{Z|nn}}: {{W-|nn|fyrste|n}}, {{W-|nn|fyrst}} * {{Z|pro}}: {{W-|pro|prince|n}} * {{Z|ota}}: {{W-|ota|امیر|tr=emir}}, {{W-|ota|خان|tr=han}} * {{Z|ug}}: {{W+|ug|شاھزادە}} * {{Z|uz}}: {{W+|uz|shahzoda}}, {{W+|uz|amir}} * {{Z|xpr}}: {{W-|xpr|𐫇𐫏𐫘𐫛𐫇𐫍𐫡|tr=wispuhr}} * {{Z|xpr}}: {{W-|xpr|𐫇𐫏𐫘𐫛𐫇𐫍𐫡|tr=wispuhr}} * {{Z|ps}}: {{W-|ps|شاهزاده|n|tr=šāhzādá}}, {{W-|ps|شازاده|n|tr=šāzãdá}}, {{W-|ps|اميرزاده|n|tr=amirzādá}}, {{W-|ps|شاهزوى|n|tr=šāhzóy}} * {{Z|pl}}: {{W+|pl|książę|n}}, {{W+|pl|kniaź|n}} * {{Z|pt}}: {{W+|pt|príncipe}} * {{Z|kk}}: {{W-|kk|ханзада}}, {{W+|kk|шаһзада}} * {{Z|ro}}: {{W+|ro|prinț|n}} * {{Z|ru}}: {{W+|ru|князь|n}}, {{W+|ru|принц|n}} * {{Z|sm}}: {{W-|sm|aloalii}}, {{W-|sm|purinise}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|кра́љевић|n}}, {{W-|sh|ца̏ревић|n}}, {{W-|sh|при̏нц|n}} *: Latînî: {{W+|sh|králjević|n}}, {{W+|sh|cȁrević|n}}, {{W+|sh|prȉnc|n}} * {{Z|cu}}: *: Kirîlî: {{W-|cu|кънѧзь|n}}, {{W-|cu|кънѧѕь}} *: Glagolîtîk: {{W-|cu|ⰽⱏⱀⱔⰸⱐ|n}}, {{W-|cu|ⰽⱏⱀⱔⰷⱐ|n}} * {{Z|orv}}: {{W-|orv|кънѧзь|n}}, {{W-|orv|кнѧзь|n}} * {{Z|sk}}: {{W-|sk|knieža|n}} * {{Z|sl}}: {{W+|sl|knez|n}} * Sorbî: *: {{Z|dsb}}: {{W-|dsb|wjerch|n}} * {{Z|es}}: {{W+|es|príncipe}}, {{W+|es|conde|n}} * {{Z|sw}}: {{W+|sw|mkuu}} * {{Z|sv}}: {{W+|sv|furste|g}} * {{Z|tg}}: {{W+|tg|шоҳзода}}, {{W-|tg|амир}} * {{Z|tl}}: {{W-|tl|prinsipe}}, {{W+|tl|lakan}} * {{Z|th}}: {{W+|th|เจ้าชาย}}, {{W+|th|เจ้า}} * {{Z|tt}}: {{W+|tt|шаһзадә}} * {{Z|tr}}: {{W+|tr|prens}}, {{W+|tr|şehzade}} * {{Z|tk}}: {{W-|tk|şazada}}, {{W-|tk|knýaz}} * {{Z|bo}}: {{W-|bo|རྒྱལ་སྲས}}, {{W-|bo|རྒྱལ་བུ}} * {{Z|to}}: {{W-|to|pilinisi}} * {{Z|ur}}: {{W-|ur|شہزادہ|n|tr=śahzādā}}, {{W-|ur|راجکمار|n|tr=rājkumār}} * {{Z|uk}}: {{W-|uk|князь|n}}, {{W-|uk|принц|n}} * {{Z|vi}}: {{W+|vi|hoàng tử}}, {{W+|vi|vương tử}} * {{Z|vo}}: {{W+|vo|plin}}, {{W-|vo|hiplin}} * {{Z|wa}}: {{W+|wa|prince|n}} * {{Z|cy}}: {{W+|cy|tywysog|n}} * {{Z|km}}: {{W+|km|ព្រះអង្គម្ចាស់}} * {{Z|yi}}: {{W-|yi|פּרינץ|n}} * {{Z|el}}: {{W+|el|πρίγκιπας|n}}, {{W+|el|βασιλόπουλο|nt}} *: {{Z|grc}}: {{W-|grc|πρῖγκιψ|n}}, {{W-|grc|βασιλείδης|n}} {{werger-bin}} :{{werger çavkanî|en|prince|beş=Ev qismê Wergerê|oldid=76016362}} === Rengdêr 1 === {{rengdêr|ku}} # {{f|ku|Xorasan}} [[sax]], [[saxlem]], bi[[silamet]] ==== Werger ==== {{werger-ser}} {{werger-bin}} === Rengdêr 2 === {{rengdêr|ku}} # ''(hûrûmûr) Binere'': '''[[mûr]]''' j08xsb14w374m1srg79r3a70rxkbw6v destavxane 0 11946 6532095 6435472 2026-09-18T19:56:35Z Wikihez 7344 Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532095 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # Cihê ku [[destav]] tê de tê girtin. # Cihê [[destav]]kirinê, [[cih]]ê lê[[rîtin]] û lê[[mîstin]]ê, cihê mirov lê [[rîtin|dirîn]] û [[mîstin|dimîzin]]. #: {{hevmaneyên peyvê|ku|tiwalet|taharetxane|edeb|WC}} ==== Tewandin ==== {{ku-tewîn-nav|mê|guherto=hemû}} ==== Formên alternatîv ==== {{kol3|ku|cure=Herwiha | {{herwiha|ku|taharetxane}} | {{herwiha|ku|abdestga}} | {{herwiha|ku|abdestgah}} | {{herwiha|ku|abdestge}} | {{herwiha|ku|abdestgeh}} | {{herwiha|ku|abdestgih}} | {{herwiha|ku|abdestxane}} | {{herwiha|ku|avdestga}} | {{herwiha|ku|avdestgah}} | {{herwiha|ku|avdestge}} | {{herwiha|ku|avdestgeh}} | {{herwiha|ku|avdestgih}} | {{herwiha|ku|avdestxane}} | {{herwiha|ku|awdestga}} | {{herwiha|ku|awdestgah}} | {{herwiha|ku|awdestge}} | {{herwiha|ku|awdestgeh}} | {{herwiha|ku|awdestgih}} | {{herwiha|ku|awdestxane}} | {{herwiha|ku|destabga}} | {{herwiha|ku|destabgah}} | {{herwiha|ku|destabge}} | {{herwiha|ku|destabgeh}} | {{herwiha|ku|destabgih}} | {{herwiha|ku|destabxane}} | {{herwiha|ku|destavga}} | {{herwiha|ku|destavgah}} | {{herwiha|ku|destavge}} | {{herwiha|ku|destavgeh}} | {{herwiha|ku|destavgih}} | {{herwiha|ku|destawga}} | {{herwiha|ku|destawgah}} | {{herwiha|ku|destawge}} | {{herwiha|ku|destawgeh}} | {{herwiha|ku|destawgih}} | {{herwiha|ku|destawxane}} }} ==== Jê ==== * {{g|ku|destavxaneyî}} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|destav|-xane|dar=1|metn=++}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Toilette|f|guman=erê}} * {{Z|fa}}: {{W+|fa|دستشویی}}, {{W+|fa|مستراح|guman=erê}} * {{Z|en}}: {{W+|en|toilet}}, {{W+|en|water closet}}, {{W+|en|urinal|guman=erê}}, {{W+|en|bog|guman=erê}} * {{Z|tr}}: {{W+|tr|abdesthane}}, {{W+|tr|hacet yolu}}, {{W+|tr|lavabo}}, {{W+|tr|tuvalet}}, {{W+|tr|apteshane}}, {{W+|tr|aptesthane}}, {{W+|tr|yüz numara|guman=erê}}, {{W+|tr|yüznumara|guman=erê}}, {{W+|tr|helâ|guman=erê}}, {{W|tr|ayakyolu|guman=erê}}, {{W|tr|hela|guman=erê}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=aadeenstvx|avdestxane}} n4w93ke5qznkh808sl3tkmu6qv8jxl7 sinî 0 35096 6532591 6453044 2026-09-19T08:59:33Z Wikihez 7344 Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532591 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{kîte|ku|si|nî}} === Navdêr === {{navdêr|ku|z=m}} # [[mezheb]]a [[serekî]] ya [[îslam]]ê # [[peyrew]]ê/a wê [[mezheb]]ê ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * [[sine]] (2) * [[sinne]] * [[sune]] * [[sunî]] ==== Jê ==== * [[sinetî]] ==== Etîmolojî ==== {{etîmon|ku|:deyn|ar:سُنِّيّ|metn=++|dar=1|id=mezheba Îslamê}}, têkildarî ''[[sinet]], [[sunet]]''. ==== Bide ber ==== * [[şîî]] ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|künstlich}}, {{W+|de|sunnitisch}}, {{W+|de|Scheibe|f|guman=erê}} * {{Z|fa}}: {{W+|fa|سینی}} * {{Z|en}}: {{W+|en|sunnah}}, {{W+|en|sunnite}} * {{Z|tr}}: {{W+|tr|Sünni|guman=erê}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=iîns|isîn}} thy6ujvhyxe5bl0krq5rlyccy0ukqpm 6532595 6532591 2026-09-19T09:00:01Z Wikihez 7344 Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532595 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{kîte|ku|si|nî}} === Navdêr === {{navdêr|ku|z=m}} # [[mezheb]]a [[serekî]] ya [[îslam]]ê # [[peyrew]]ê/a wê [[mezheb]]ê ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * [[sine]] (2) * [[sinne]] * [[sune]] * [[sunî]] ==== Jê ==== * [[sinetî]] ==== Etîmolojî ==== {{etîmon|ku|:deyn|ar:سُنِّيّ|metn=++|dar=1|id=mezheba Îslamê|niqtena=1}}, têkildarî ''[[sinet]], [[sunet]]''. ==== Bide ber ==== * [[şîî]] ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|künstlich}}, {{W+|de|sunnitisch}}, {{W+|de|Scheibe|f|guman=erê}} * {{Z|fa}}: {{W+|fa|سینی}} * {{Z|en}}: {{W+|en|sunnah}}, {{W+|en|sunnite}} * {{Z|tr}}: {{W+|tr|Sünni|guman=erê}} {{werger-bin}} ==== Anagram ==== * {{anagram|ku|a=iîns|isîn}} cof7schyodcowtk3o00tm04hpazqki9 pencemor 0 38723 6532028 6349424 2026-09-18T15:47:10Z Wikihez 7344 /* Etîmolojî */ 6532028 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === [[Wêne:Fingerprintonpaper.jpg|thumb|250px|pencemor li ser kaxezê]] {{navdêr|ku|z=m}} # [[mor]]a [[til]]an #: {{hevmaneyên peyvê|ku|şûntil|besmat}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== {{kol3|ku |pencemohir |pencemohr |pencemuhir |pencemuhr }} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|pence|mor|dar=1|metn=++}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Fingerabdruck|m}} * {{Z|zh}}: {{W+|zh|指印}} * {{Z|da}}: {{W+|da|fingeraftryk}} * {{Z|fi}}: {{W+|fi|sormenjälki}} * {{Z|fr}}: {{W+|fr|empreinte digitale|f}} * {{Z|nl}}: {{W+|nl|vingerafdruk|m}} * {{Z|en}}: {{W+|en|fingerprint}} * {{Z|it}}: {{W-|it|impronta digitale|f}} * {{Z|ja}}: {{W+|ja|指紋}} * {{Z|ko}}: {{W+|ko|지문}} * {{Z|no}}: {{W-|no|fingeravtrykk|n}} * {{Z|pt}}: {{W+|pt|impressão digital|f}} * {{Z|ru}}: {{W-|ru|отпечаток пальца|tr=otpečátok pál'ca}} * {{Z|es}}: {{W-|es|huella digital|f}} * {{Z|tr}}: {{W+|tr|parmak izi}} * {{Z|el}}: {{W-|el|δακτυλικό αποτύπωμα|n}} {{werger-bin}} 8k4e2iqerpi0my8ssh02sbfbihlmm0w pence 0 39078 6532027 6349427 2026-09-18T15:44:41Z Wikihez 7344 Kurmancî/Navdêr: beşa «Jê» hate nûkirin (DefSideBoxes) 6532027 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{ku-kîte}} === Navdêr === [[Wêne: Claw.jpg|thumb|'''Penceyên''' pisîkekê.]] {{navdêr|ku|z=m}} # [[nahpik]], [[nînok]], [[pencik]], [[pencirk]] (bi taybetî yên [[tûj]] û [[dirinde]]) # [[til]], [[tilî]], [[tipl]], [[pêçî]] ==== Ji wêjeya klasîk ==== * {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Cinn û teyyarek mi dî werbû di min winda kirim</br>Dame ber '''pence''' w kulaban hilfirandim wek 'uqab</br>Suflewî înam û avêhtim zemîna zulmetê}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Bi alfabeyên din ==== * {{ku-ar|په‌نجه}} ==== Formên alternatîv ==== {{kol3|ku |penc }} ==== Jê ==== {{kol3|ku |pence kirin<crz:lêker> |pencekirin<crz:navdêr> |pencekirî<crz:rengdêr> |pencemor }} ==== Etîmolojî ==== Hevreha {{hv|ckb|په‌نجه|tr=pence|w=[[til]], [[tilî]], [[tipl]]}}, farisî {{g|fa|پنجه|tr=pencê: [[dest]], [[her]] [[pênc]] [[til]]}}, ji {{ji|ira|ku|-}}, têkilî peyva [[pênc]], bi farisî {{g|fa|پنج|tr=penc}} + [[-e]], bide ber îngilîzî [[finger]] (til) ku têkilî peyva [[five]] (pênc) e. Bi heman awayî [[heft]] > [[hefte]] / [[heftî]]. ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|ڕنۆک|tr=rinok}} ==== Werger ==== {{werger-ser}} * {{Z|fa}}: {{W+|fa|پنجه}} * {{Z|en}}: {{W+|en|claw}} * {{Z|tr}}: {{W+|tr|pençe}} {{werger-bin}} == {{ziman|en}} == === Bilêvkirin === :{{ku-tîp|pêns}} * {{deng|en|LL-Q1860 (eng)-Vealhurl-pence.wav|Deng|dever=Başûrê Îngilistanê, QY}} === Formeke navdêrê === {{navdêr|en|form=erê}} # {{pirjimar|en|penny|w=[[pens]], [[pare]]yekê [[hûrde]] yê [[brîtanî]] ye}} ==== Bide ber ==== {{kol3|en |penny }} bs8lgwuwd9yw64ttzlhhmrefaxxlcd3 6532042 6532027 2026-09-18T16:56:08Z Wikihez 7344 /* Etîmolojî */ 6532042 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-IPA}} * {{ku-kîte}} === Navdêr === [[Wêne: Claw.jpg|thumb|'''Penceyên''' pisîkekê.]] {{navdêr|ku|z=m}} # [[nahpik]], [[nînok]], [[pencik]], [[pencirk]] (bi taybetî yên [[tûj]] û [[dirinde]]) # [[til]], [[tilî]], [[tipl]], [[pêçî]] ==== Ji wêjeya klasîk ==== * {{J:Melayê Cizîrî:Dîwana Melayê Cizîrî|jêgirtin=Cinn û teyyarek mi dî werbû di min winda kirim</br>Dame ber '''pence''' w kulaban hilfirandim wek 'uqab</br>Suflewî înam û avêhtim zemîna zulmetê}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Bi alfabeyên din ==== * {{ku-ar|په‌نجه}} ==== Formên alternatîv ==== {{kol3|ku |penc }} ==== Jê ==== {{kol3|ku |pence kirin<crz:lêker> |pencekirin<crz:navdêr> |pencekirî<crz:rengdêr> |pencemor }} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|pênc|-e|:drş|fa:پنجه<tr:pencê><t:[[dest]], [[her]] [[pênc]] [[til]]>|metn=++|dar=1}} Hevreha {{hv|ckb|په‌نجه|tr=pence|w=[[til]], [[tilî]], [[tipl]]}}, farisî {{g|fa|پنجه|tr=pencê: [[dest]], [[her]] [[pênc]] [[til]]}}, ji {{ji|ira|ku|-}}, têkilî peyva [[pênc]], bi farisî {{g|fa|پنج|tr=penc}} + [[-e]], bide ber îngilîzî [[finger]] (til) ku têkilî peyva [[five]] (pênc) e. Bi heman awayî [[heft]] > [[hefte]] / [[heftî]]. ==== Bi zaravayên din ==== * {{Z|ckb}}: {{W-|ckb|ڕنۆک|tr=rinok}} ==== Werger ==== {{werger-ser}} * {{Z|fa}}: {{W+|fa|پنجه}} * {{Z|en}}: {{W+|en|claw}} * {{Z|tr}}: {{W+|tr|pençe}} {{werger-bin}} == {{ziman|en}} == === Bilêvkirin === :{{ku-tîp|pêns}} * {{deng|en|LL-Q1860 (eng)-Vealhurl-pence.wav|Deng|dever=Başûrê Îngilistanê, QY}} === Formeke navdêrê === {{navdêr|en|form=erê}} # {{pirjimar|en|penny|w=[[pens]], [[pare]]yekê [[hûrde]] yê [[brîtanî]] ye}} ==== Bide ber ==== {{kol3|en |penny }} i990ojtmfxcml5o1m2ts8yh88lua7zh sinet 0 39109 6533045 6458350 2026-09-19T10:12:09Z Wikihez 7344 /* Navdêr 1 */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re) 6533045 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr 1 === [[Wêne:Shmadarahd1.png|thumb|250px|Îmamê somalî ku taqiye an '''sinet''' ({{maneno|ku|kulav}}) li serê xwe kiriye]] {{navdêr|ku|z=m}} # ([[îslam|''Îslam'']]) Ji kirin û tevgerên [[Muhemmed]] pêxember tê gotin. # {{f|ku|Îslam}} Tiştên ku mirov ne [[mecbûr]] e bike lê [[baş]] e ku bên kirin. #: {{nm|ku|nivêjên '''sinet'''|Nivêjên ji bilî her pênc nivêjên rojê|rêz=1}} #* {{J:Feqiyê Teyran|jêgirtin=Têk û vêk guhdarê pîr bûm</br>B' işqa dîn û '''sinnetê'''</br>Şêxê serdarê xelîfan}} # [[birîn|Birîna]] [[çerm]]ê ser [[kîr]]î (ku li gor [[Îslam]]ê û [[cihûtî|cihûtiyê]] [[mecbûrî|mecbûriyek]] [[dînî]] ye). # [[birîn|Birîna]] [[çerm]]ê ser [[quz]]î (ku li gor hin ayînan [[mecbûrî|mecbûriyek]] [[dînî]] ye). # {{maneid|ku|kulav}} {{f|ku|Îslam}} [[kulav|Kulaveke]] [[kevneşopî]] ya ku hinek Kurdên [[Misilman]], bi [[taybetî]] li [[herêma]] [[Kurdistanê]], li xwe [[dikin]]. Ew bi [[gelemperî]] [[kepek]] [[kinckirî]] ye, ku pir caran bi [[dersok]] ve tê [[pêçandin]].<ref>https://kurdologist.wordpress.com/2021/05/07/a-dictionary-of-duhoki-kurdish/</ref> ==== Formên alternatîv ==== * {{g|ku|sinnet}} * {{g|ku|sunet}} * {{g|ku|sunnet}} ==== Jê ==== {{kol3|ku|cure=Jê |sinet bûn<pos:lêker> |sinet kirin<pos:lêker> |sinetbûn<pos:navdêr> |sinetkirin<pos:navdêr> |sinetbûyî<pos:rengdêr> |sinetkirî<pos:rengdêr> }} ==== Etîmolojî ==== Ji {{deyn|ar|ku|سُنَّة}}, têkildarî [[sinî]]. ==== Bide ber ==== * {{g|ku|sanat}} ==== Herwiha binêre ==== * {{g|ku|sened}} ==== Werger ==== {{werger-ser|kirinên Mihemed Pêxemberî}} * {{Z|de}}: {{W+|de|Handwerk|n}} * {{Z|ar}}: {{W-|ar|السنة النبوية}}, {{W-|ar|السنة}}, {{W-|ar|ختان}}, {{W-|ar|النفل}} * {{Z|en}}: {{W+|en|sonnet}}, {{W-|en|Prophetic Tradition}}, {{W+|en|Sunnah}} * {{Z|tr}}: {{W+|tr|sünnet}} {{werger-bin}} {{werger-ser|birîna çermê li ser organa cinsî}} * {{Z|en}}: {{W+|en|circumcision}} * {{Z|tr}}: {{W+|tr|sünnet}} {{werger-bin}} === Navdêr 2 === {{navdêr|ku|z=m}} # {{guharto|ku|senet|w=huner}} === Çavkanî === {{çavkanî}} fxnd4mlcs7prdzh443drpe16dyf2o77 ahlak 0 41731 6532058 6442231 2026-09-18T17:34:10Z Taylor 49 5771 ([[c:GR|GR]]) [[c:COM:FR|File renamed]]: [[File:Tr tr ahlak.ogg]] → [[File:Tr-ahlak.oga]] CRIT 4 CRIT 6 6532058 wikitext text/x-wiki == {{ziman|tr}} == === Bilêvkirin === * {{deng|tr|Tr-ahlak.oga}} * {{deng|tr|LL-Q256 (tur)-ToprakM-ahlak.wav|Deng|dever=Îzmîr, Tirkiye}} === Navdêr === {{navdêr|tr}} # [[sinc]], [[rewişt]], [[exlaq]], [[moral]], [[etîk]] ==== Etîmolojî ==== Ji {{deyn|ar|tr|أَخْلَاق}} ==== Anagram ==== * {{anagram|tr|a=aahkl|halka}} mw9rj2xnhd0kazzk1d8b86ernuh1dd0 lojîk 0 42153 6532055 6463193 2026-09-18T17:19:20Z Avestaboy 5833 6532055 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[jenk]], [[jîrbêjî]], [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * {{g|ku|locîk}} ==== Jê ==== * {{g|ku|îlojîk}} * {{g|ku|lojîkî}} * {{g|ku|lojîsyen}} ==== Etîmolojî ==== Bi rêya {{deyn|fr|ku|logique}} yan {{hv|en|logic}} ji {{hv|la|logica}} ji {{hv|grc|λογικος}} ji {{g|grc|λόγος|w=[[hiş]], [[aqil]]}}. ==== Werger ==== {{werger-bnr|mantiq}} ==== Anagram ==== * {{anagram|ku|a=îjklo|kolîj}} 4lhgevtyqh3a4xnfzssh05yxdbmwdp4 gîtarîst 0 45350 6532026 6339321 2026-09-18T15:43:17Z Wikihez 7344 Kurmancî/Navdêr: beşa «Resim» hate nûkirin (DefSideBoxes) 6532026 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === [[Wêne:Guitarist Gretchen Menn 2017.jpg|thumb|250px|'''Gîtarîstek''' li festîvala muzîkê.]] {{navdêr|ku|z=mn}} # {{f|ku|muzîsyen|muzîk}} [[hunermend|Hunermendê]]/a [[gîtar]]ê, kesa/ê ku li [[gîtar]]ê dide. #: {{hevmane|ku|gîtarvan|gîtarjen}} #: {{jornav|ku|muzîsyen}} #* {{jêder|ku|jêgirtin=Li dû axaftin û peyaman, koma dansê ya Alman ku ji 3 hezar kesî pêk hatiye, dest pê kir. Li gel barana [[sift]] jî performansa komê gelek bal kişand. Piştre koma bulgarî ya 2 hezar kesî hemû beşdar mest kirin. Di festîvalê de yek ji komên herî balkêş jî koma gîtarê ya 200 kesî bû. Aheng û lihevkirina di navbera '''gîtarîstan''' de ji aliyê temaşevanan ve li piyan hat silavkirin û bi çepikan hat pîrozkirin. Herwisa [[yoga]] û [[medîtasyon]]a ku ji aliyê bi hezaran kesî ve hat kirin, bû sedem ku [[stadyûm]]a Olîmpiyadê di nav bêdengiyeke kûr de bimîne. Armanca yoga û medîtasyonkirinê ew bû ku bikeve nav Pirtûka Rekoran a Guinesê.|Ali Guler ''Di festîvala cîhanê de deng û rengên Kurdan'', Rudaw.net, 7/2011}} ==== Tewandin ==== {{ku-tewîn-nav/nû|mê û nêr}} ==== Jê ==== * {{g|ku|gîtarîstî}} ==== Etîmolojî ==== {{navmiletî|ku}} bide ber {{ji|en|ku|guitarist}}, {{ji|fr|ku|guitariste}}; wekheva {{qertaf|ku|gîtar|-îst}}. ==== Werger ==== {{werger-ser|Kesê li gîtarê dide}} * {{Z|sq}}: {{W+|sq|kitarist|n}}, {{W-|sq|kitariste|m}} * {{Z|de}}: {{W+|de|Gitarrenspieler|n}}, {{W+|de|Gitarrenspielerin|m}}, {{W+|de|Gitarrist|n}}, {{W+|de|Gitarristin|m}} * {{Z|ast}}: {{W-|ast|guitarrista|n|m}}, {{W-|ast|guitarreru|n}} * {{Z|be}}: {{W-|be|гітары́ст|n}}, {{W-|be|гітары́стка|m}} * {{Z|bg}}: {{W-|bg|китари́ст|n}}, {{W-|bg|китари́стка|m}} * {{Z|cs}}: {{W+|cs|kytarista|n}}, {{W-|cs|kytaristka|m}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|吉他手}} * {{Z|da}}: {{W+|da|guitarist|g}} * {{Z|ar}}: {{W-|ar|[[عَازِف]] [[قِيثَارَة]]|n}} * {{Z|hy}}: {{W+|hy|կիթառահար}} * {{Z|eo}}: {{W-|eo|gitaristo}} * {{Z|et}}: {{W-|et|kitarrist}} * {{Z|fa}}: {{W-|fa|گیتاریست|tr=gitârist}}, {{W-|fa|گیتارنواز|tr=gitârnavâz}} * {{Z|fi}}: {{W+|fi|kitaristi}}, {{W-|fi|kitaransoittaja}} * {{Z|fr}}: {{W+|fr|guitariste|n|m}} * {{Z|gl}}: {{W+|gl|guitarrista|n|m}}, {{W+|gl|guitarra|n|m}} * {{Z|ka}}: {{W-|ka|გიტარისტი}} * {{Z|nl}}: {{W+|nl|gitarist|n}}, {{W+|nl|gitariste|m}}, {{W+|nl|gitaarspeler|n}}, {{W-|nl|gitaarspeelster|m}} * {{Z|he}}: {{W+|he|גִּיטָרִיסְט|n|tr=gitaríst}} * {{Z|en}}: {{W+|en|guitarist}} * {{Z|ga}}: {{W-|ga|giotáraí|n}} * {{Z|it}}: {{W+|it|chitarrista|n|m}} * {{Z|is}}: {{W-|is|gítaristi|n}}, {{W-|is|gítarleikari|n}} * {{Z|ja}}: {{W+|ja|ギタリスト|tr=gitarisuto}} * {{Z|ca}}: {{W+|ca|guitarrista|n|m}} * {{Z|ko}}: {{W-|ko|[[기타]] [[연주자]]}}, {{W-|ko|기타리스트}} * {{Z|la}}: {{W-|la|guitarista|m}}, {{W-|la|guitaristus|n}} * {{Z|lv}}: {{W-|lv|ģitārists|n}}, {{W-|lv|ģitāriste|m}} * {{Z|lt}}: {{W-|lt|gitaristas|n}}, {{W-|lt|gitaristė|m}} * {{Z|mk}}: {{W-|mk|гитари́ст|n}}, {{W-|mk|гитари́стка|m}} * {{Z|mi}}: {{W-|mi|kairakuraku kitā}} * {{Z|hu}}: {{W+|hu|gitáros}} * {{Z|no}}: *: {{Z|nb}}: {{W+|nb|gitarist|n}} *: {{Z|nn}}: {{W-|nn|gitarist|n}} * {{Z|pl}}: {{W+|pl|gitarzysta}}, {{W+|pl|gitarzystka|m}} * {{Z|pt}}: {{W+|pt|guitarrista|n|m}} * {{Z|ro}}: {{W+|ro|chitarist|n}}, {{W+|ro|chitaristă|m}} * {{Z|ru}}: {{W+|ru|гитари́ст|n}}, {{W+|ru|гитари́стка|m}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|гита̀рист|n}}, {{W-|sh|гитариста|n}}, {{W-|sh|гита̀ристица|m}}, {{W-|sh|гитаристкиња|m}} *: Latînî: {{W+|sh|gitàrist|n}}, {{W+|sh|gitarista|n}}, {{W+|sh|gitàristica|m}}, {{W-|sh|gitaristkinja|m}} * {{Z|sk}}: {{W-|sk|gitarista|n}}, {{W-|sk|gitaristka|m}} * {{Z|sl}}: {{W+|sl|kitarist|n}}, {{W-|sl|kitaristka|m}} * {{Z|es}}: {{W+|es|guitarrista|n|m}}, {{W-|es|guitarrero|n}}, {{W+|es|guitarra|n|m}} * {{Z|sw}}: {{W-|sw|mpiga gitaa}} * {{Z|sv}}: {{W+|sv|gitarrist}} * {{Z|tl}}: {{W-|tl|gitarista}} * {{Z|tr}}: {{W+|tr|gitarist}} * {{Z|uk}}: {{W+|uk|гітари́ст|n}}, {{W-|uk|гітари́стка|m}} * {{Z|vi}}: {{W-|vi|người chơi ghi-ta}}, {{W-|vi|người đánh ghi-ta}}, {{W-|vi|ghi-ta thủ}}, {{W-|vi|người chơi lục huyền cầm}}, {{W-|vi|người chơi Tây Ban cầm}}, {{W-|vi|người đánh lục huyền cầm}}, {{W-|vi|người đánh Tây Ban cầm}}, {{W-|vi|Tây Ban cầm thủ}}, {{W-|vi|lục huyền cầm thủ}} * {{Z|sah}}: {{W-|sah|гитараһыт}} * {{Z|yi}}: {{W-|yi|גיטאַריסט|n}}, {{W-|yi|גיטאַר־שפּילער|n}} * {{Z|el}}: {{W+|el|κιθαρίστας|n}}, {{W+|el|κιθαριστής|n}}, {{W+|el|κιθαρίστρια|m}} {{werger-bin}} :{{werger çavkanî|en|guitarist|beş=Ev qismê Wergerê|oldid=82007208}} 6lrzb65e80cscb6yohxkuronyolk9u1 6532048 6532026 2026-09-18T17:12:07Z Balyozbot 7867 Bot: Paqijiyên kozmetîk ({{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.) 6532048 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === [[Wêne:Guitarist Gretchen Menn 2017.jpg|thumb|250px|'''Gîtarîstek''' li festîvala muzîkê.]] {{navdêr|ku|z=mn}} # {{f|ku|muzîsyen|muzîk}} [[hunermend|Hunermendê]]/a [[gîtar]]ê, kesa/ê ku li [[gîtar]]ê dide. #: {{hevmane|ku|gîtarvan|gîtarjen}} #: {{jornav|ku|muzîsyen}} #* {{jêder|ku|jêgirtin=Li dû axaftin û peyaman, koma dansê ya Alman ku ji 3 hezar kesî pêk hatiye, dest pê kir. Li gel barana [[sift]] jî performansa komê gelek bal kişand. Piştre koma bulgarî ya 2 hezar kesî hemû beşdar mest kirin. Di festîvalê de yek ji komên herî balkêş jî koma gîtarê ya 200 kesî bû. Aheng û lihevkirina di navbera '''gîtarîstan''' de ji aliyê temaşevanan ve li piyan hat silavkirin û bi çepikan hat pîrozkirin. Herwisa [[yoga]] û [[medîtasyon]]a ku ji aliyê bi hezaran kesî ve hat kirin, bû sedem ku [[stadyûm]]a Olîmpiyadê di nav bêdengiyeke kûr de bimîne. Armanca yoga û medîtasyonkirinê ew bû ku bikeve nav Pirtûka Rekoran a Guinesê.|Ali Guler ''Di festîvala cîhanê de deng û rengên Kurdan'', Rudaw.net, 7/2011}} ==== Tewandin ==== {{ku-tewîn-nav|mê û nêr}} ==== Jê ==== * {{g|ku|gîtarîstî}} ==== Etîmolojî ==== {{navmiletî|ku}} bide ber {{ji|en|ku|guitarist}}, {{ji|fr|ku|guitariste}}; wekheva {{qertaf|ku|gîtar|-îst}}. ==== Werger ==== {{werger-ser|Kesê li gîtarê dide}} * {{Z|sq}}: {{W+|sq|kitarist|n}}, {{W-|sq|kitariste|m}} * {{Z|de}}: {{W+|de|Gitarrenspieler|n}}, {{W+|de|Gitarrenspielerin|m}}, {{W+|de|Gitarrist|n}}, {{W+|de|Gitarristin|m}} * {{Z|ast}}: {{W-|ast|guitarrista|n|m}}, {{W-|ast|guitarreru|n}} * {{Z|be}}: {{W-|be|гітары́ст|n}}, {{W-|be|гітары́стка|m}} * {{Z|bg}}: {{W-|bg|китари́ст|n}}, {{W-|bg|китари́стка|m}} * {{Z|cs}}: {{W+|cs|kytarista|n}}, {{W-|cs|kytaristka|m}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|吉他手}} * {{Z|da}}: {{W+|da|guitarist|g}} * {{Z|ar}}: {{W-|ar|[[عَازِف]] [[قِيثَارَة]]|n}} * {{Z|hy}}: {{W+|hy|կիթառահար}} * {{Z|eo}}: {{W-|eo|gitaristo}} * {{Z|et}}: {{W-|et|kitarrist}} * {{Z|fa}}: {{W-|fa|گیتاریست|tr=gitârist}}, {{W-|fa|گیتارنواز|tr=gitârnavâz}} * {{Z|fi}}: {{W+|fi|kitaristi}}, {{W-|fi|kitaransoittaja}} * {{Z|fr}}: {{W+|fr|guitariste|n|m}} * {{Z|gl}}: {{W+|gl|guitarrista|n|m}}, {{W+|gl|guitarra|n|m}} * {{Z|ka}}: {{W-|ka|გიტარისტი}} * {{Z|nl}}: {{W+|nl|gitarist|n}}, {{W+|nl|gitariste|m}}, {{W+|nl|gitaarspeler|n}}, {{W-|nl|gitaarspeelster|m}} * {{Z|he}}: {{W+|he|גִּיטָרִיסְט|n|tr=gitaríst}} * {{Z|en}}: {{W+|en|guitarist}} * {{Z|ga}}: {{W-|ga|giotáraí|n}} * {{Z|it}}: {{W+|it|chitarrista|n|m}} * {{Z|is}}: {{W-|is|gítaristi|n}}, {{W-|is|gítarleikari|n}} * {{Z|ja}}: {{W+|ja|ギタリスト|tr=gitarisuto}} * {{Z|ca}}: {{W+|ca|guitarrista|n|m}} * {{Z|ko}}: {{W-|ko|[[기타]] [[연주자]]}}, {{W-|ko|기타리스트}} * {{Z|la}}: {{W-|la|guitarista|m}}, {{W-|la|guitaristus|n}} * {{Z|lv}}: {{W-|lv|ģitārists|n}}, {{W-|lv|ģitāriste|m}} * {{Z|lt}}: {{W-|lt|gitaristas|n}}, {{W-|lt|gitaristė|m}} * {{Z|mk}}: {{W-|mk|гитари́ст|n}}, {{W-|mk|гитари́стка|m}} * {{Z|mi}}: {{W-|mi|kairakuraku kitā}} * {{Z|hu}}: {{W+|hu|gitáros}} * {{Z|no}}: *: {{Z|nb}}: {{W+|nb|gitarist|n}} *: {{Z|nn}}: {{W-|nn|gitarist|n}} * {{Z|pl}}: {{W+|pl|gitarzysta}}, {{W+|pl|gitarzystka|m}} * {{Z|pt}}: {{W+|pt|guitarrista|n|m}} * {{Z|ro}}: {{W+|ro|chitarist|n}}, {{W+|ro|chitaristă|m}} * {{Z|ru}}: {{W+|ru|гитари́ст|n}}, {{W+|ru|гитари́стка|m}} * {{Z|sh}}: *: Kirîlî: {{W-|sh|гита̀рист|n}}, {{W-|sh|гитариста|n}}, {{W-|sh|гита̀ристица|m}}, {{W-|sh|гитаристкиња|m}} *: Latînî: {{W+|sh|gitàrist|n}}, {{W+|sh|gitarista|n}}, {{W+|sh|gitàristica|m}}, {{W-|sh|gitaristkinja|m}} * {{Z|sk}}: {{W-|sk|gitarista|n}}, {{W-|sk|gitaristka|m}} * {{Z|sl}}: {{W+|sl|kitarist|n}}, {{W-|sl|kitaristka|m}} * {{Z|es}}: {{W+|es|guitarrista|n|m}}, {{W-|es|guitarrero|n}}, {{W+|es|guitarra|n|m}} * {{Z|sw}}: {{W-|sw|mpiga gitaa}} * {{Z|sv}}: {{W+|sv|gitarrist}} * {{Z|tl}}: {{W-|tl|gitarista}} * {{Z|tr}}: {{W+|tr|gitarist}} * {{Z|uk}}: {{W+|uk|гітари́ст|n}}, {{W-|uk|гітари́стка|m}} * {{Z|vi}}: {{W-|vi|người chơi ghi-ta}}, {{W-|vi|người đánh ghi-ta}}, {{W-|vi|ghi-ta thủ}}, {{W-|vi|người chơi lục huyền cầm}}, {{W-|vi|người chơi Tây Ban cầm}}, {{W-|vi|người đánh lục huyền cầm}}, {{W-|vi|người đánh Tây Ban cầm}}, {{W-|vi|Tây Ban cầm thủ}}, {{W-|vi|lục huyền cầm thủ}} * {{Z|sah}}: {{W-|sah|гитараһыт}} * {{Z|yi}}: {{W-|yi|גיטאַריסט|n}}, {{W-|yi|גיטאַר־שפּילער|n}} * {{Z|el}}: {{W+|el|κιθαρίστας|n}}, {{W+|el|κιθαριστής|n}}, {{W+|el|κιθαρίστρια|m}} {{werger-bin}} :{{werger çavkanî|en|guitarist|beş=Ev qismê Wergerê|oldid=82007208}} 9qdqcq6mhikfs4e9mkjbvk9uyvmmw8h Sinîstan 0 45818 6532523 6467658 2026-09-19T08:48:55Z Wikihez 7344 Kurmancî/Navdêr: +nimûneya bikaranînê bi amûra « [[Mediawiki:Gadget-wikt.add-examples|Nimûne zêde bike]] » (v2.0), mane hate guhartin, beşa «Ji wêjeyê» hate rakirin (DefSideBoxes) 6532523 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[herêm|Herêm]]a [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye). #* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}} # [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * [[Sunîstan]] ==== Jê ==== * [[sinîstanî]] * [[sinîstanîtî]] ==== Etîmolojî ==== Ji {{qertaf|ku|sinî|-stan}}. ==== Bide ber ==== * [[Kurdistan]] * [[Şîistan]] mjpbhtk3hwrgab1wi0m8qr10w9bs98y 6532545 6532523 2026-09-19T08:52:26Z Wikihez 7344 Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532545 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[herêm|Herêm]]a [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye). #* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}} # [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * [[Sunîstan]] ==== Jê ==== * [[sinîstanî]] * [[sinîstanîtî]] ==== Etîmolojî ==== {{etîmon|ku|sinî|-istan<cuda:-stan>|metn=++|dar=1}} ==== Bide ber ==== * [[Kurdistan]] * [[Şîistan]] hy7cm2rbp8gmrj3tdt6q3piy1nvc1pk 6532551 6532545 2026-09-19T08:53:03Z Wikihez 7344 Kurmancî/Navdêr: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532551 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[herêm|Herêm]]a [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye). #* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}} # [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * [[Sunîstan]] ==== Jê ==== * [[sinîstanî]] * [[sinîstanîtî]] ==== Etîmolojî ==== {{etîmon|ku|:qf|sinî|-istan<cuda:-stan>|metn=++|dar=1}} ==== Bide ber ==== * [[Kurdistan]] * [[Şîistan]] imttdphd77ca291gvjkv1ltuyzfo1i5 6533044 6532551 2026-09-19T10:12:06Z Balyozbot 7867 Bot: Paqijiyên kozmetîk (Lînk paqij kir, --Valahiyên nehewce.) 6533044 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[herêm|Herêma]] [[Iraq]]ê ya ku [[misilman]]ên [[sinî]] yên [[ereb]] lê [[jîn|dijîn]] (ta niha ne navek fermî ye). #* {{jêder|ku|Nefel.com, 9/2007|jêgirtin=Hillary Clintona senatora ji lîsteya Demokratan jî piştgiriya pêşniyara Joseph Bidenî dike û heger serokê Emerîkayê George Bush guhê xwe bide wê pêşniyarê divêt Iraq bibe sê herêmên konfederal ko ji Şîistan, '''Sinistan''' û Kurdistanê pêk têt.}} # [['''sinîstan''']]: her [[dever]]a ku [[misilman]]ên [[sinî]] lê [[piranî]] ne ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * [[Sunîstan]] ==== Jê ==== * [[sinîstanî]] * [[sinîstanîtî]] ==== Etîmolojî ==== {{etîmon|ku|:qf|sinî|-istan<cuda:-stan>|metn=++|dar=1}} ==== Bide ber ==== * [[Kurdistan]] * [[Şîistan]] lqny3ty51f8i15zgrshk5wnrt3cscq0 malava 0 60450 6532023 6245603 2026-09-18T15:39:45Z Wikihez 7344 Kurmancî/Baneşan: beşa «Etîmolojî» hate nûkirin (DefSideBoxes) 6532023 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Baneşan === {{baneşan|ku}} # [[spas]], [[memnûn]], [[şikir]], [[teşekur]], [[Xwedê ji te razî be]], <br>[[peyv]]ek e bo wî kesî têt gotin yê ku [[qencî|qenciyek]] kiriye # [[bi xatirê te]], [[bi xatirê we]] # [[oxir be]], [[wexera xêrê be]] # [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]" ==== Formên alternatîv ==== * {{g|ku|mal ava}} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}} ==== Jê ==== {{kol3|ku |malava kirin<pos:lêker> |malavakirin<pos:navdêr> |malavahî |malavatî |malavayî }} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}} * {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}} * {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}} * {{Z|tr}}: {{W|tr|yahu}} {{werger-bin}} dirbe32mtg2dx40h9r3cylpwmitgl9k 6532024 6532023 2026-09-18T15:41:06Z Wikihez 7344 Kurmancî/Baneşan: mane, hevmane hatin guhartin (DefSideBoxes) 6532024 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Baneşan === {{baneşan|ku}} # {{înm|[[peyv|Peyv]]ek e bo wî kesî tê gotin yê ku [[qencî|qenciyek]] kiriye.}} #: {{hevmane|ku|spas|memnûn|şikir|teşekur|Xwedê ji te razî be}} # [[bi xatirê te]], [[bi xatirê we]] # [[oxir be]], [[wexera xêrê be]] # [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]" ==== Formên alternatîv ==== * {{g|ku|mal ava}} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}} ==== Jê ==== {{kol3|ku |malava kirin<pos:lêker> |malavakirin<pos:navdêr> |malavahî |malavatî |malavayî }} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}} * {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}} * {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}} * {{Z|tr}}: {{W|tr|yahu}} {{werger-bin}} b7wvz258eoeqc8hcvgr1domrsuwoi4a 6532025 6532024 2026-09-18T15:41:07Z Balyozbot 7867 [[Special:PermanentLink/6298023|Bot]]: rêzkirina beşan 6532025 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Baneşan === {{baneşan|ku}} # {{înm|[[peyv|Peyv]]ek e bo wî kesî tê gotin yê ku [[qencî|qenciyek]] kiriye.}} #: {{hevmane|ku|spas|memnûn|şikir|teşekur|Xwedê ji te razî be}} # [[bi xatirê te]], [[bi xatirê we]] # [[oxir be]], [[wexera xêrê be]] # [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]" ==== Formên alternatîv ==== * {{g|ku|mal ava}} ==== Jê ==== {{kol3|ku |malava kirin<pos:lêker> |malavakirin<pos:navdêr> |malavahî |malavatî |malavayî }} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}} * {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}} * {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}} * {{Z|tr}}: {{W|tr|yahu}} {{werger-bin}} gktpcfzevnk94ih2khcfacdf6vqwno7 6532049 6532025 2026-09-18T17:12:10Z Balyozbot 7867 Bot: Paqijiyên kozmetîk (Lînk paqij kir.) 6532049 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Baneşan === {{baneşan|ku}} # {{înm|[[peyv|Peyvek]] e bo wî kesî tê gotin yê ku [[qencî|qenciyek]] kiriye.}} #: {{hevmane|ku|spas|memnûn|şikir|teşekur|Xwedê ji te razî be}} # [[bi xatirê te]], [[bi xatirê we]] # [[oxir be]], [[wexera xêrê be]] # [[dijmane]]ya "[[malxirab]], [[malwêran]], [[malkembax]]" ==== Formên alternatîv ==== * {{g|ku|mal ava}} ==== Jê ==== {{kol3|ku |malava kirin<pos:lêker> |malavakirin<pos:navdêr> |malavahî |malavatî |malavayî }} ==== Etîmolojî ==== {{etîmon|ku|:qertaf|mal<id:xanî>|ava|dar=1|metn=++}} ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W|de|Dank|m}}, {{W|de|Abschied|m}} * {{Z|fa}}: {{W|fa|تحسین}}, {{W|fa|ندای}} * {{Z|en}}: {{W|en|acknowledgment}}, {{W|en|prosperous}}, {{W|en|thankfulness|guman=erê}} * {{Z|tr}}: {{W|tr|yahu}} {{werger-bin}} klqq8fireywagrre938u72d2h43o9yq vac 0 62171 6532054 6288889 2026-09-18T17:18:41Z Avestaboy 5833 6532054 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku}} # [[mantiq]], [[jenk]], [[lojîk]], [[beraqilî]], [[jîrbêjî]] li gor hiş û aqilî, ne keyfî ==== Formên alternatîv ==== ji derveyî vacê, bêvac, bivac ==== Etîmolojî ==== {{bêetîmolojî|ku}} ==== Bi zaravayên din ==== * Soranî: [[jîrbêjî]] ==== Werger ==== {{werger-ser}} * {{Z|tr}}: {{W+|tr|mantık}} {{werger-bin}} 72831sh09lck1ac3znzgx1kcdoit5ur mantiq 0 63786 6532045 6311635 2026-09-18T17:07:30Z Avestaboy 5833 6532045 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} #[[jenk]] [[lojîk]], [[hişmendî]], [[aqilmendî]], [[aqil]], [[zihndarî]], [[zihniyet]] ==== Tewandin ==== {{ku-tewîn-nav/nû|mê}} ==== Bi alfabeyên din ==== * {{ku-ar|مانتق}} ==== Formên alternatîv ==== * [[mentiq]] * [[mantix]] ==== Jê ==== * [[bêmantiq]] * [[bêmantiqî]] * [[bimantiq]] * [[mantiqdar]] * [[mantiqdarî]] * [[mantiqî]] ==== Etîmolojî ==== Ji {{ji|ar|ku|منطق|tr=menṭiq}} ji {{g|ar|نطق|tr=nuṭq|w=[[peyv]], [[axivîn]], [[gotin]]}} ji lêker {{g|ku|نطق|tr=neṭeqe|w=[[axivîn]]}}, wergerra yekser ya peyva yûnanî [[λογική]] (logikê: mentiq, [[lojîk]]) ku ji peyva [[λόγος]] (logos: [[peyv]]; [[hiş]]) hatiye çêkirin. ==== Werger ==== {{werger-ser}} * {{Z|sq}}: {{W+|sq|logjikë|m}} * {{Z|de}}: {{W+|de|Logik|m}} * {{Z|az}}: {{W+|az|məntiq}} * {{Z|eu}}: {{W+|eu|logika}} * {{Z|bn}}: {{W+|bn|মন্তেক}} * {{Z|bg}}: {{W+|bg|ло́гика|m}} * {{Z|cs}}: {{W+|cs|logika|m}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|邏輯|tr=luóji}}, {{W+|cmn|論理|tr=lùnlǐ}} * {{Z|id}}: {{W+|id|logika}}, {{W+|id|mantik}} * {{Z|ar}}: {{W-|ar|مَنْطِق|n}} * {{Z|hy}}: {{W+|hy|տրամաբանություն}} * {{Z|eo}}: {{W-|eo|logiko}} * {{Z|fa}}: {{W+|fa|منطق|tr=manteq}} * {{Z|fi}}: {{W+|fi|logiikka}} * {{Z|fr}}: {{W+|fr|logique|m}} * {{Z|gl}}: {{W+|gl|lóxica|m}} * {{Z|hi}}: {{W+|hi|तर्क}} * {{Z|nl}}: {{W+|nl|logica|m}} * {{Z|he}}: {{W+|he|הגיון|tr=higayon}} * {{Z|ang}}: {{W-|ang|flitcræft|n}} * {{Z|en}}: {{W+|en|logic}} * {{Z|ga}}: {{W-|ga|loighic|m}} * {{Z|it}}: {{W+|it|logica|m}}, {{W+|it|logica matematica|m}} * {{Z|is}}: {{W-|is|rökfræði|m}} * {{Z|ja}}: {{W+|ja|論理|tr=ろんり, ronri}} * {{Z|ca}}: {{W+|ca|lògica|m}} * {{Z|ko}}: {{W+|ko|논리}} * {{Z|la}}: {{W-|la|dialectica|m}} * {{Z|lv}}: {{W-|lv|loģika|m}} * {{Z|mk}}: {{W-|mk|ло́гика|m}} * {{Z|hu}}: {{W+|hu|logika}} * {{Z|no}}: {{W-|no|logikk|n}} * {{Z|ug}}: {{W-|ug|مەنتىق}} * {{Z|pl}}: {{W+|pl|logika|m}} * {{Z|pt}}: {{W+|pt|lógica|m}} * {{Z|ro}}: {{W+|ro|logică|m}} * {{Z|ru}}: {{W+|ru|ло́гика|m}} * {{Z|sa}}: {{W-|sa|न्यायम्}} * {{Z|sh}}: {{W+|sh|lògika|m}} * {{Z|sk}}: {{W-|sk|logika|m}} * {{Z|sl}}: {{W+|sl|logika|m}} * {{Z|es}}: {{W+|es|lógica|m}} * {{Z|sw}}: {{W+|sw|mantiki}} * {{Z|sv}}: {{W+|sv|logik|g}} * {{Z|tl}}: {{W-|tl|matwiran}} * {{Z|th}}: {{W+|th|ตรรกะ}} * {{Z|te}}: {{W+|te|తర్కము}} * {{Z|tr}}: {{W+|tr|mantık}} * {{Z|tpi}}: {{W-|tpi|lajik}} * {{Z|ur}}: {{W-|ur|ترک|tr=tark}} * {{Z|uk}}: {{W+|uk|ло́гіка|m}} * {{Z|vi}}: {{W+|vi|logic}}, {{W-|vi|lô-gíc}}, {{W+|vi|luận lý}} * {{Z|cy}}: {{W+|cy|rhesymeg|m}} * {{Z|km}}: {{W+|km|តក្ក|sc=Khmr|tr=takka}} * {{Z|xh}}: {{W-|xh|i-logic}} * {{Z|yi}}: {{W-|yi|לאָגיק|m}} * {{Z|el}}: {{W+|el|λογική|m}} {{werger-bin}} :{{werger çavkanî|en|logic|beş=Ev qismê Wergerê|oldid=75874211}} 8euqf9klfe3c1c0z7vybvi8mglvzqam 6532046 6532045 2026-09-18T17:07:40Z Avestaboy 5833 6532046 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} #[[jenk]], [[lojîk]], [[hişmendî]], [[aqilmendî]], [[aqil]], [[zihndarî]], [[zihniyet]] ==== Tewandin ==== {{ku-tewîn-nav/nû|mê}} ==== Bi alfabeyên din ==== * {{ku-ar|مانتق}} ==== Formên alternatîv ==== * [[mentiq]] * [[mantix]] ==== Jê ==== * [[bêmantiq]] * [[bêmantiqî]] * [[bimantiq]] * [[mantiqdar]] * [[mantiqdarî]] * [[mantiqî]] ==== Etîmolojî ==== Ji {{ji|ar|ku|منطق|tr=menṭiq}} ji {{g|ar|نطق|tr=nuṭq|w=[[peyv]], [[axivîn]], [[gotin]]}} ji lêker {{g|ku|نطق|tr=neṭeqe|w=[[axivîn]]}}, wergerra yekser ya peyva yûnanî [[λογική]] (logikê: mentiq, [[lojîk]]) ku ji peyva [[λόγος]] (logos: [[peyv]]; [[hiş]]) hatiye çêkirin. ==== Werger ==== {{werger-ser}} * {{Z|sq}}: {{W+|sq|logjikë|m}} * {{Z|de}}: {{W+|de|Logik|m}} * {{Z|az}}: {{W+|az|məntiq}} * {{Z|eu}}: {{W+|eu|logika}} * {{Z|bn}}: {{W+|bn|মন্তেক}} * {{Z|bg}}: {{W+|bg|ло́гика|m}} * {{Z|cs}}: {{W+|cs|logika|m}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|邏輯|tr=luóji}}, {{W+|cmn|論理|tr=lùnlǐ}} * {{Z|id}}: {{W+|id|logika}}, {{W+|id|mantik}} * {{Z|ar}}: {{W-|ar|مَنْطِق|n}} * {{Z|hy}}: {{W+|hy|տրամաբանություն}} * {{Z|eo}}: {{W-|eo|logiko}} * {{Z|fa}}: {{W+|fa|منطق|tr=manteq}} * {{Z|fi}}: {{W+|fi|logiikka}} * {{Z|fr}}: {{W+|fr|logique|m}} * {{Z|gl}}: {{W+|gl|lóxica|m}} * {{Z|hi}}: {{W+|hi|तर्क}} * {{Z|nl}}: {{W+|nl|logica|m}} * {{Z|he}}: {{W+|he|הגיון|tr=higayon}} * {{Z|ang}}: {{W-|ang|flitcræft|n}} * {{Z|en}}: {{W+|en|logic}} * {{Z|ga}}: {{W-|ga|loighic|m}} * {{Z|it}}: {{W+|it|logica|m}}, {{W+|it|logica matematica|m}} * {{Z|is}}: {{W-|is|rökfræði|m}} * {{Z|ja}}: {{W+|ja|論理|tr=ろんり, ronri}} * {{Z|ca}}: {{W+|ca|lògica|m}} * {{Z|ko}}: {{W+|ko|논리}} * {{Z|la}}: {{W-|la|dialectica|m}} * {{Z|lv}}: {{W-|lv|loģika|m}} * {{Z|mk}}: {{W-|mk|ло́гика|m}} * {{Z|hu}}: {{W+|hu|logika}} * {{Z|no}}: {{W-|no|logikk|n}} * {{Z|ug}}: {{W-|ug|مەنتىق}} * {{Z|pl}}: {{W+|pl|logika|m}} * {{Z|pt}}: {{W+|pt|lógica|m}} * {{Z|ro}}: {{W+|ro|logică|m}} * {{Z|ru}}: {{W+|ru|ло́гика|m}} * {{Z|sa}}: {{W-|sa|न्यायम्}} * {{Z|sh}}: {{W+|sh|lògika|m}} * {{Z|sk}}: {{W-|sk|logika|m}} * {{Z|sl}}: {{W+|sl|logika|m}} * {{Z|es}}: {{W+|es|lógica|m}} * {{Z|sw}}: {{W+|sw|mantiki}} * {{Z|sv}}: {{W+|sv|logik|g}} * {{Z|tl}}: {{W-|tl|matwiran}} * {{Z|th}}: {{W+|th|ตรรกะ}} * {{Z|te}}: {{W+|te|తర్కము}} * {{Z|tr}}: {{W+|tr|mantık}} * {{Z|tpi}}: {{W-|tpi|lajik}} * {{Z|ur}}: {{W-|ur|ترک|tr=tark}} * {{Z|uk}}: {{W+|uk|ло́гіка|m}} * {{Z|vi}}: {{W+|vi|logic}}, {{W-|vi|lô-gíc}}, {{W+|vi|luận lý}} * {{Z|cy}}: {{W+|cy|rhesymeg|m}} * {{Z|km}}: {{W+|km|តក្ក|sc=Khmr|tr=takka}} * {{Z|xh}}: {{W-|xh|i-logic}} * {{Z|yi}}: {{W-|yi|לאָגיק|m}} * {{Z|el}}: {{W+|el|λογική|m}} {{werger-bin}} :{{werger çavkanî|en|logic|beş=Ev qismê Wergerê|oldid=75874211}} k2fovph8bauw01qpiumm6o657tpcemp 6532071 6532046 2026-09-18T18:12:07Z Balyozbot 7867 Bot: Paqijiyên kozmetîk (+Valahiya lîsteyan, --Valahiyên nehewce, {{ku-tewîn-nav/nû}} → {{ku-tewîn-nav}}.) 6532071 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[jenk]], [[lojîk]], [[hişmendî]], [[aqilmendî]], [[aqil]], [[zihndarî]], [[zihniyet]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Bi alfabeyên din ==== * {{ku-ar|مانتق}} ==== Formên alternatîv ==== * [[mentiq]] * [[mantix]] ==== Jê ==== * [[bêmantiq]] * [[bêmantiqî]] * [[bimantiq]] * [[mantiqdar]] * [[mantiqdarî]] * [[mantiqî]] ==== Etîmolojî ==== Ji {{ji|ar|ku|منطق|tr=menṭiq}} ji {{g|ar|نطق|tr=nuṭq|w=[[peyv]], [[axivîn]], [[gotin]]}} ji lêker {{g|ku|نطق|tr=neṭeqe|w=[[axivîn]]}}, wergerra yekser ya peyva yûnanî [[λογική]] (logikê: mentiq, [[lojîk]]) ku ji peyva [[λόγος]] (logos: [[peyv]]; [[hiş]]) hatiye çêkirin. ==== Werger ==== {{werger-ser}} * {{Z|sq}}: {{W+|sq|logjikë|m}} * {{Z|de}}: {{W+|de|Logik|m}} * {{Z|az}}: {{W+|az|məntiq}} * {{Z|eu}}: {{W+|eu|logika}} * {{Z|bn}}: {{W+|bn|মন্তেক}} * {{Z|bg}}: {{W+|bg|ло́гика|m}} * {{Z|cs}}: {{W+|cs|logika|m}} * {{Z|zh}}: *: {{Z|cmn}}: {{W+|cmn|邏輯|tr=luóji}}, {{W+|cmn|論理|tr=lùnlǐ}} * {{Z|id}}: {{W+|id|logika}}, {{W+|id|mantik}} * {{Z|ar}}: {{W-|ar|مَنْطِق|n}} * {{Z|hy}}: {{W+|hy|տրամաբանություն}} * {{Z|eo}}: {{W-|eo|logiko}} * {{Z|fa}}: {{W+|fa|منطق|tr=manteq}} * {{Z|fi}}: {{W+|fi|logiikka}} * {{Z|fr}}: {{W+|fr|logique|m}} * {{Z|gl}}: {{W+|gl|lóxica|m}} * {{Z|hi}}: {{W+|hi|तर्क}} * {{Z|nl}}: {{W+|nl|logica|m}} * {{Z|he}}: {{W+|he|הגיון|tr=higayon}} * {{Z|ang}}: {{W-|ang|flitcræft|n}} * {{Z|en}}: {{W+|en|logic}} * {{Z|ga}}: {{W-|ga|loighic|m}} * {{Z|it}}: {{W+|it|logica|m}}, {{W+|it|logica matematica|m}} * {{Z|is}}: {{W-|is|rökfræði|m}} * {{Z|ja}}: {{W+|ja|論理|tr=ろんり, ronri}} * {{Z|ca}}: {{W+|ca|lògica|m}} * {{Z|ko}}: {{W+|ko|논리}} * {{Z|la}}: {{W-|la|dialectica|m}} * {{Z|lv}}: {{W-|lv|loģika|m}} * {{Z|mk}}: {{W-|mk|ло́гика|m}} * {{Z|hu}}: {{W+|hu|logika}} * {{Z|no}}: {{W-|no|logikk|n}} * {{Z|ug}}: {{W-|ug|مەنتىق}} * {{Z|pl}}: {{W+|pl|logika|m}} * {{Z|pt}}: {{W+|pt|lógica|m}} * {{Z|ro}}: {{W+|ro|logică|m}} * {{Z|ru}}: {{W+|ru|ло́гика|m}} * {{Z|sa}}: {{W-|sa|न्यायम्}} * {{Z|sh}}: {{W+|sh|lògika|m}} * {{Z|sk}}: {{W-|sk|logika|m}} * {{Z|sl}}: {{W+|sl|logika|m}} * {{Z|es}}: {{W+|es|lógica|m}} * {{Z|sw}}: {{W+|sw|mantiki}} * {{Z|sv}}: {{W+|sv|logik|g}} * {{Z|tl}}: {{W-|tl|matwiran}} * {{Z|th}}: {{W+|th|ตรรกะ}} * {{Z|te}}: {{W+|te|తర్కము}} * {{Z|tr}}: {{W+|tr|mantık}} * {{Z|tpi}}: {{W-|tpi|lajik}} * {{Z|ur}}: {{W-|ur|ترک|tr=tark}} * {{Z|uk}}: {{W+|uk|ло́гіка|m}} * {{Z|vi}}: {{W+|vi|logic}}, {{W-|vi|lô-gíc}}, {{W+|vi|luận lý}} * {{Z|cy}}: {{W+|cy|rhesymeg|m}} * {{Z|km}}: {{W+|km|តក្ក|sc=Khmr|tr=takka}} * {{Z|xh}}: {{W-|xh|i-logic}} * {{Z|yi}}: {{W-|yi|לאָגיק|m}} * {{Z|el}}: {{W+|el|λογική|m}} {{werger-bin}} :{{werger çavkanî|en|logic|beş=Ev qismê Wergerê|oldid=75874211}} exetyf8arbn28a8fzau9sdbwqyhy9z5 MediaWiki:Gadgets-definition 8 118586 6533056 6531726 2026-09-19T10:13:21Z Wikihez 7344 wikt.cite: add wikt.cite/etimon.js to the package (the {{etîmon}} builder) 6533056 wikitext text/x-wiki Binêre [[Taybet:Gadgets]] ji bo belgekirina amûrên li jêr. * LegacyScripts[ResourceLoader|default|dependencies=site,mediawiki.util,mediawiki.cookie,ext.gadget.LegacyScriptsNewNode,ext.gadget.StorageUtils|type=general]|legacy.js ==Rû== * LiveClock[ResourceLoader|dependencies=mediawiki.util]|LiveClock.js * charinsert-styles[ResourceLoader|hidden|type=styles]|charinsert-styles.css * LanguagesAndScripts[ResourceLoader|default]|LanguagesAndScripts.css * jeder[ResourceLoader|dependencies=ext.gadget.VisibilityToggles|default]|jeder.css|jeder.js * CodeLinks[ResourceLoader|default|dependencies=site,mediawiki.util]|CodeLinks.js * Tabset[ResourceLoader|default]|Tabset.js|Tabset.css * kuTewandin[ResourceLoader|default]|kuTewandin.js * wikt.showids[ResourceLoader|package|namespaces=0,2,4,108|actions=view|dependencies=mediawiki.util]|wikt.showids.js|wikt.showids.css * EtytreeZoom[ResourceLoader|default|dependencies=mediawiki.util]|EtytreeZoom.js * PagePreviews[ResourceLoader|default|dependencies=site,mediawiki.api,mediawiki.util,mediawiki.Title|skins=vector,vector-2022,monobook,timeless,modern,cologneblue]|PagePreviews.js * AutoRedirect[ResourceLoader|default|dependencies=user,mediawiki.util|actions=view|namespaces=0]|AutoRedirect.js * TreeDescs[ResourceLoader|default|namespaces=0,108|peers=TreeDescs-pagestyles]|TreeDescs.js ==AmûrênGuhartinê== * wikEd[ResourceLoader]|wikEd.js * charinsert[ResourceLoader|default|peers=charinsert-styles]|charinsert.js * translation_editor[ResourceLoader|default|dependencies=mediawiki.notification|type=general]|silent_fail_storage.js|editor.js|translation_editor.js|translation_editor.css * QQ[ResourceLoader|dependencies=mediawiki.util,oojs-ui-core,oojs-ui-widgets|type=general]|QQ.js|QQ.css * WiktAccFormCreation[ResourceLoader|dependencies=mediawiki.util]|WiktAccFormCreation.js * AjaxEdit[ResourceLoader|dependencies=mediawiki.util,mediawiki.user,mediawiki.api]|AjaxEdit.js * EditHere[ResourceLoader|dependencies=mediawiki.api,oojs-ui-core,oojs-ui-widgets]|EditHere.js * clearer-edit-summary[ResourceLoader|default|actions=view]|clearer-edit-summary.js * DeluxeHistory[ResourceLoader|dependencies=user,mediawiki.util]|DeluxeHistory.js|DeluxeHistory.css * JumpToError[ResourceLoader|dependencies=mediawiki.notification]|JumpToError.js * aWa[ResourceLoader|rights=autoconfirmed|dependencies=mediawiki.util,mediawiki.api,mediawiki.user,user.options,mediawiki.Title|type=general]|aWa.js|aWa.css * purgetab[ResourceLoader|dependencies=mediawiki.api,mediawiki.util]|purgetab.js * start[ResourceLoader|default|package|namespaces=0,2,4,108|dependencies=mediawiki.util,ext.gadget.wikt.core]|start.js * wikt.dsb[ResourceLoader|default|package|namespaces=0,2,4,108|actions=view|dependencies=mediawiki.util,ext.gadget.wikt.core]|wikt.dsb.js|wikt.dsb.css * linkify-toolbar[ResourceLoader|default|actions=edit,submit|dependencies=ext.gadget.linkify,jquery.textSelection,ext.wikiEditor]|linkify-toolbar.js ==Kategorî== * HotCat[ResourceLoader]|HotCat.js * Cat-a-lot[ResourceLoader|rights=autoconfirmed]|Cat-a-lot.css|Cat-a-lot.js ==AmûrênVeşartî== * LegacyScriptsNewNode[ResourceLoader|hidden|targets=desktop,mobile]|LegacyScriptsNewNode.js * StorageUtils[ResourceLoader|hidden|dependencies=mediawiki.cookie,mediawiki.storage]|StorageUtils.js * charinsert-core[ResourceLoader|hidden|dependencies=jquery.textSelection,user,mediawiki.storage]|charinsert-core.js * VisibilityToggles[ResourceLoader|hidden|targets=desktop,mobile|dependencies=user,mediawiki.cookie]|VisibilityToggles.js * defaultVisibilityToggles[ResourceLoader|hidden|default|targets=desktop,mobile|dependencies=ext.gadget.VisibilityToggles]|defaultVisibilityToggles.js * Site[ResourceLoader|hidden|default]|Site.css * catfix[ResourceLoader|hidden|default|dependencies=mediawiki.Title|categories=Pages using catfix]|catfix.js * Palette[ResourceLoader|hidden|default]|Palette.css * test[ResourceLoader|rights=autoconfirmed]|test.js * citoid-helper[ResourceLoader|hidden|dependencies=mediawiki.util]|citoid-helper.js * wikt.core[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.storage]|wikt.core.js|wikt.core/sections.js|wikt.core/prefs.js|wikt.core/data-sections.json|wikt.core.css * wikt.edit[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.api,ext.gadget.wikt.core]|wikt.edit.js|wikt.edit/util.js|wikt.edit/wikitext.js|wikt.edit/langs.js|wikt.edit/labels.js|wikt.edit/posparams.js|wikt.edit/data-main.json|wikt.edit/ziman-core.json|wikt.edit.css * wikt.cite[ResourceLoader|hidden|package|dependencies=mediawiki.api,oojs-ui-core,oojs-ui-widgets,oojs-ui-windows,ext.gadget.citoid-helper,ext.gadget.wikt.edit]|wikt.cite.js|wikt.cite/etimon.js|wikt.cite.css * wikt.dsb-panels[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.api,ext.gadget.wikt.core,ext.gadget.wikt.edit,ext.gadget.wikt.cite,ext.gadget.wikt.add-examples,oojs-ui-core,oojs-ui-widgets,oojs-ui-windows]|wikt.dsb-panels.js|wikt.dsb-panels.css * wikt.start-wizard[ResourceLoader|hidden|package|dependencies=mediawiki.util,mediawiki.api,ext.gadget.wikt.core,ext.gadget.wikt.edit,ext.gadget.wikt.cite,ext.gadget.StorageUtils,ext.gadget.citoid-helper,oojs-ui-core,oojs-ui-widgets,oojs-ui-windows]|wikt.start-wizard.js|wikt.start-wizard.css * wikt.add-examples[ResourceLoader|hidden|package|dependencies=oojs,oojs-ui,ext.gadget.citoid-helper,ext.gadget.StorageUtils,ext.gadget.wikt.core,ext.gadget.wikt.edit,ext.gadget.wikt.cite]|wikt.add-examples.js|wikt.add-examples.css * linkify[ResourceLoader|hidden|dependencies=mediawiki.api]|linkify.js * TreeDescs-pagestyles[hidden|type=styles]|TreeDescs-pagestyles.css 1qs0k02rwfpe6vs96pyfnr35zlfhl0i remiz 0 160337 6532014 6531832 2026-09-18T14:00:00Z Wikihez 7344 ([[m:Special:MyLanguage/User:Jon Harald Søby/diffedit|diffedit]]) 6532014 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[sembol]], [[dawer]], [[nîşan]], [[totem]], [[nimûne]], [[mînak]], [[îşaret]] #* {{jêder|ku|Melayê Cizîrî|jg=Bi '''remza''' qabê qewseyni, ji wan birhan xeberdar în<br>Fe atil qewse biarîha ela ya ramiyel qewseyn}} ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== {{kol3|ku |remzî }} ==== Etîmolojî ==== Ji {{ji|ar|ku|رمز|tr=remz}}, hevreha {{hv|arc|ܪܡܙܐ}} (remza), {{hv|he|רמז}} (rêmez) ==== Werger ==== {{werger-ser}} * {{Z|de}}: {{W+|de|Symbol|n}} * {{Z|zh}}: {{W+|zh|符号}} * {{Z|fa}}: {{W+|fa|نشانه}} * {{Z|fi}}: {{W+|fi|symboli}} * {{Z|fr}}: {{W+|fr|symbole|m}}, {{W+|fr|sigle|m}} * {{Z|nl}}: {{W+|nl|symbool}} * {{Z|io}}: {{W+|io|simbolo}} * {{Z|en}}: {{W+|en|symbol}}, {{W+|en|trademark}} * {{Z|it}}: {{W+|it|simbolo|m}} * {{Z|lt}}: {{W+|lt|simbolis|m}} * {{Z|sh}}: {{W+|sh|simbol}}, [[znak]]; [[oznaka]] * {{Z|sh}}: *: Kirîlî: [[симбол]], [[знак]] {{mê}}; [[ознака]] {{mê}} *: Latînî: {{W-|la|simbol}}, [[znak]]; [[oznaka]] * {{Z|sv}}: {{W+|sv|symbol}}, {{W+|sv|tecken|n}} * {{Z|tr}}: {{W-|tr|sembol#Tirkî}}, {{W+|tr|remiz}}, {{W+|tr|rumuz}}, {{W+|tr|simge}}, {{W+|tr|taklit}} {{werger-bin}} {{mijar|ku|zimannasî}} ==== Anagram ==== * {{anagram|ku|a=eimrz|zimre}} == {{ziman|tr}} == === Navdêr === {{navdêr|tr}} # [[remz]], [[sembol]] 89w24out49eqz9zi4ectpyllef6o3r5 çendemîn 0 180184 6532307 6279386 2026-09-19T08:13:32Z Şêr 1103 ne lêker e! 6532307 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Cînav === {{cînav|ku|c=}} # [[çendem]] # a çendan # [[kîjan]] ==== Etîmolojî ==== {{bêetîmolojî|ku}} ==== Werger ==== {{werger-ser}} * {{Z|fa}}: {{W-|fa|چندمین}} * {{Z|tr}}: {{W+|tr|kaçıncı}} {{werger-bin}} 91znvvarzpamv539p7ogi1ql7gmp1hl پنج 0 256436 6532047 5143161 2026-09-18T17:10:00Z Wikihez 7344 [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:پنج|en.wikt]] 6532047 wikitext text/x-wiki == {{ziman|ckb}} == === Navdêr === {{navdêr|ckb}} # [[reh]] #: {{hevmane|ckb|ڕەگ|ڕیشە}} == {{ziman|fa}} == === Bilêvkirin === : {{ku-tîp|penc}} === Navdêr === {{navdêr|fa|tr=}} # [[pênc]] ==== Têkildar ==== * {{g|fa|شمار|tr=şomar}} ==== Etîmolojî ==== {{etymon|fa|id=pênc|:mîr|pal:<tr:pnc><ts:panǰ><etimon:mîr<ira-pro:*pánča<id:pênc>>>|dar=1|metn=++}} Bide ber {{hv|ku|pênc}}, {{hv|os|фондз}}, {{hv|ps|پنځه|tr=pindzə}}, {{hv|ae|𐬞𐬀𐬧𐬗𐬀}}, {{hv|sa|पञ्च|tr=páñca}}, {{hv|srh|pundz}}. 1hbf0neiiq0vq5vwd8l7y3t8oyxiu3o پنجه 0 256437 6532043 5272587 2026-09-18T17:01:49Z Wikihez 7344 /* Farisî */ [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:پنجه|en.wikt]] 6532043 wikitext text/x-wiki == {{ziman|fa}} == === Bilêvkirin === {{fa-IPA|pan`ja}} === Navdêr === {{navdêr|fa|tr=pence|p=پنجه‌ها}} # [[pence]] # {{e|fa|axlebî|_|Darî|Tacîkî}} [[çetel]] ==== Etîmolojî ==== {{ety|fa|id=pence|:qertaf|پَنْج<tr:penc><t:pênc>|ـَه<id:paşgir><tr:-e>|tree=1|metn=1}} ==== Dûnde ==== {{stûn| * {{dû|hy|փանջա|deyn=1}} * {{dû|az|pəncə|deyn=1}} * {{dû|bn|পাঞ্জা|deyn=1}} * {{dû|crh|panca|deyn=1}} * {{dû|inc-hnd|-|deyn=1}} *: {{dû|hi|पंजा}} *: {{dû|ur|پَن٘جَہ}} * {{dû|te|పంజా}} * {{dardû|ota|پنچه|deyn=1}} * {{dû|tk|penje|deyn=1}} }} == {{ziman|ps}} == === Navdêr === {{navdêr|ps|tr=panǰá}} # {{f|ps|aman}} {{g|ku|çetel}} bcg9o51ebh9bs0pgqtsk7o96u6mlxoh بەدبەخت 0 268389 6532125 5863854 2026-09-19T07:43:11Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin (Test) 6532125 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bedbext === Rengdêr === {{rengdêr|ckb}} # [[bextreş]], [[bêsiûd]], [[bênesîb]] qh36a5mtemlrp197cy62k1ucfhiys4u بەدرەقە 0 268390 6532126 5863856 2026-09-19T07:44:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532126 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bedreqe === Navdêr === {{navdêr|ckb}} # [[rêber]], [[raber]] 6741ilb66owhqdiczlrhzwobxi2g4dz بەفر 0 268391 6532127 6433221 2026-09-19T07:44:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532127 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :befir === Navdêr === {{navdêr|ckb}} # [[berf]], [[befir]] ==== Anagram ==== * {{anagram|ckb|a=برفە|بەرف}} fw75ep5vliw5duqyx4jvx0k4vz4a7v0 بەھا 0 268392 6532128 5863958 2026-09-19T07:44:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532128 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beha === Navdêr === {{navdêr|ckb}} # [[biha]], [[nirx]], [[qîmet]], [[fiyet]] 84e18kyhsepx1r2sqg5xygwp7ta35bw بەھانە 0 268393 6532129 5863962 2026-09-19T07:44:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532129 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :behane === Navdêr === {{navdêr|ckb}} # [[hêcet]], [[hincet]], [[bihane]] mev6a6llfmxa3ohpw5yqxsjizmv40ok بەھارات 0 268394 6532130 5863960 2026-09-19T07:44:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532130 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beharat === Navdêr === {{navdêr|ckb}} # [[biharat]] tslx6owygu1tuu4rs479jrvcbek25ez بەھەشت 0 268395 6532131 5863968 2026-09-19T07:45:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532131 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beheşt === Navdêr === {{navdêr|ckb}} # [[biheşt]], [[buhuşt]], [[cennet]], [[paradîs]] 367td2gfi4ay2v3zvnvl3ongs49874o بەھر 0 268396 6532119 5863964 2026-09-19T07:31:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532119 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :behr === Lêker === {{lêker|ckb}} # [[par]], [[pişk]], [[behr]] 4r424wsv8yddpzybt7qjflgx63rf14a 6532124 6532119 2026-09-19T07:36:39Z ~2026-50522-76 15382 Guhartoya [[Special:Diff/6532119|6532119]] yê [[Special:Contributions/JiyanBot|JiyanBot]] ([[User talk:JiyanBot|gotûbêj]]) şûnde kir 6532124 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :behr === Mane === {{bêcure|ckb}} # [[par]], [[pişk]], [[behr]] lds0nxc9qwpq2vojqbg4p180fmynkba 6532132 6532124 2026-09-19T07:45:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532132 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :behr === Navdêr === {{navdêr|ckb}} # [[par]], [[pişk]], [[behr]] 2mj07i2sfgs0xsv99ltete4p8knkhxa بەحر 0 268397 6532133 5863836 2026-09-19T07:45:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532133 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beĥr === Navdêr === {{navdêr|ckb}} # [[derya]], [[zerya]], [[behr]] ojerux8mfz5g5ysz839vro16ar3tdp6 بەھرە 0 268398 6532120 5863966 2026-09-19T07:31:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532120 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :behre === Lêker === {{lêker|ckb}} # [[qabîliyet]], [[tiwana]], [[karîn]], [[jêhatîtî]] 7bvlc210gv30rdvtrsljqsbyrcid7yz 6532123 6532120 2026-09-19T07:36:22Z ~2026-50522-76 15382 Guhartoya [[Special:Diff/6532120|6532120]] yê [[Special:Contributions/JiyanBot|JiyanBot]] ([[User talk:JiyanBot|gotûbêj]]) şûnde kir 6532123 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :behre === Mane === {{bêcure|ckb}} # [[qabîliyet]], [[tiwana]], [[karîn]], [[jêhatîtî]] gv9f0puk3rsd7s3buq395h4hz64ry0l بەژ 0 268399 6532121 5863900 2026-09-19T07:31:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532121 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bej === Lêker === {{lêker|ckb}} # [[erd]], [[ax]], [[beyaristan]], [[bej]] 4rsqq13u494q5se6qo9gcx9aqrnrwil 6532122 6532121 2026-09-19T07:34:19Z Şêr 1103 xeletiya bot 6532122 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bej === Navdêr === {{navdêr|ckb}} # [[erd]], [[ax]], [[beyaristan]], [[bej]] m60ooweo5gjga8yw84jecrhet6eyjaq بەلایەن 0 268404 6532134 5863930 2026-09-19T07:45:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532134 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :belayen === Rengdêr === {{rengdêr|ckb}} # [[alîgir]], [[bialî]], ne bêalî mhpzbkg4456xss57rwgp1xxjao3ekrk بەلەم 0 268408 6532135 5863942 2026-09-19T07:45:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532135 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :belem === Navdêr === {{navdêr|ckb}} # [[beleme]], [[keştîk]], [[qayik]] svbgcffahfmw1c9he9vcpqgp8f5t66w بەلەز 0 268409 6532136 5863938 2026-09-19T07:45:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532136 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :belez === Rengdêr === {{rengdêr|ckb}} # [[bilez]], [[lezgîn]] a1syw0uinjrp50c99i9vy6djj45nuw9 بەڵەیاندن 0 268410 6532137 5863944 2026-09-19T07:46:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532137 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :belleyandin === Lêker === {{lêker|ckb}} # [[pesend kirin]], [[pejirandin]], [[beliyandin]], [[qebûl kirin]] njok88vbem2z9h7uaxjrix971ykvoh4 بەڵگە 0 268412 6532138 5863934 2026-09-19T07:46:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532138 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bellge === Navdêr === {{navdêr|ckb}} # [[belge]], [[nîşane]], [[delîl]], [[govahî]] spe338bh7khu93yh6o4scpfpagbryo0 بەناوبانگ 0 268413 6532139 5863946 2026-09-19T07:46:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532139 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :benawbang === Rengdêr === {{rengdêr|ckb}} # [[navdar]], [[binavûdeng]], [[meşhûr]] 58zq187x3057rwq9275q5sf7e9ecntv بەند 0 268414 6532140 5863948 2026-09-19T07:46:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532140 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bend === Navdêr === {{navdêr|ckb}} # [[bend]], [[bend]], [[baraj]] iimmben5cwqsqi6zao9x4c3pq52rb9t 6532143 6532140 2026-09-19T07:47:05Z Şêr 1103 6532143 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bend === Navdêr === {{navdêr|ckb}} # [[bend]], [[bendav]], [[baraj]] 4k6ttarjtx4x3dkxh9y8agjlck52bsa بەندە 0 268415 6532141 5863950 2026-09-19T07:46:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532141 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bende === Navdêr === {{navdêr|ckb}} # [[xulam]], [[kole]] ixonuui3dwgh37ttpdial17ix5jq53x بەندەگی 0 268416 6532142 5863952 2026-09-19T07:46:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532142 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bendegî === Navdêr === {{navdêr|ckb}} # [[xulamî]], [[koletî]] kq9ro9fbjnnsj4kape0c51j55bnx7wy بەنگ 0 268417 6532144 5863954 2026-09-19T07:47:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532144 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beng === Navdêr === {{navdêr|ckb}} # [[heşîş]], [[tilyak]] 9btwl1olflsogy1np8vihp8x16ae54a بەق 0 268418 6532145 5863916 2026-09-19T07:47:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532145 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beq === Navdêr === {{navdêr|ckb}} # [[nêrekew]], kewê nêr 4wnvh1p5v765u71pmlhe5erb3sjxzae بەقال 0 268419 6532146 5863918 2026-09-19T07:47:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532146 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beqal === Navdêr === {{navdêr|ckb}} # [[beqal]], [[firoşkar]], [[bifiroş]] 1jowfxpacbemumochk4c0wsr3kezkjd بەقلیسۆک 0 268420 6532147 5863920 2026-09-19T07:47:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532147 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beqlîsok === Rengdêr === {{rengdêr|ckb}} # [[bêşerm]], [[bênamûs]], [[bêşeref]] snqnl5cm9skndru765d7wew17wilhnh بەرایی 0 268421 6532148 5863860 2026-09-19T07:47:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532148 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berayî === Navdêr === {{navdêr|ckb}} # [[destpêk]], [[pêşekî]] trk44sk5vas2mv6nqs8fneps0zkxkvh بەردەوک 0 268423 6532149 5863864 2026-09-19T07:47:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532149 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berdewk === Navdêr === {{navdêr|ckb}} # [[xweşheval]], [[dost]], [[birader]] iw0malluuv2ygm4bbbgtguo8o19qi8h بەرە 0 268424 6532150 5863888 2026-09-19T07:48:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532150 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bere === Navdêr === {{navdêr|ckb}} # [[enî]], [[bere]]: Berey Kurdistanî بەرەی کوردستانی Bereyê Kurdistanî, Eniya Kurdistanî sa9f3j85l8psvl49x1f8uxe6nqdcp3j بەرەو 0 268426 6532151 5863892 2026-09-19T07:48:15Z JiyanBot 3048 Cure Daçek hat lêzêdekirin 6532151 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berew === Daçek === {{daçek|ckb}} # [[ber]], [[ber bi]], [[ber bi]], [[ve]], [[ber bi]], [[de]], [[berev]], ber bi derekê ve: berew ayindeyêkî nadiyar بەرەو ئایندەیێکی نادیار ber bi pêşerojek nediyar 7molp0eldol9k6rru9xzryllblhbai2 بەرەوژێرکە 0 268427 6532152 5863896 2026-09-19T07:48:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532152 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berewjêrke === Navdêr === {{navdêr|ckb}} # [[nişîvî]], [[berejêrk]] a18esc5sf04stnp06hyobnmaduwt8su بەرەوژۆرکە 0 268428 6532153 5863894 2026-09-19T07:48:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532153 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berewjorke === Navdêr === {{navdêr|ckb}} # [[evrazî]], [[berejork]] gul4u8m2xn12f7k04yzxn5rka8eiwrm بەرەزە 0 268429 6532154 5863890 2026-09-19T07:48:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532154 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bereze === Rengdêr === {{rengdêr|ckb}} # [[aware]], [[derbider]], [[bêmal]] 5j1fxxbexocd1zl1r36ojhghhjq3tj2 بەرگری 0 268431 6532155 5863878 2026-09-19T07:48:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532155 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bergirî === Navdêr === {{navdêr|ckb}} # [[berevanî]] nb1k0905yvtu63r1vt09jyn0h36mgi7 بەرژەوەندی 0 268433 6532156 5863872 2026-09-19T07:49:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532156 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berjewendî === Navdêr === {{navdêr|ckb}} # [[berjewendî]], [[menfeet]], [[mifa]], [[sûd]], [[kelke]], [[feyde]] ezq7k7zrrgwnx82qiaxmwjwr45dc0ss بەرف 0 268434 6532157 6433224 2026-09-19T07:49:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532157 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berf === Navdêr === {{navdêr|ckb}} # [[befir]], [[berf]] ==== Anagram ==== * {{anagram|ckb|a=برفە|بەفر}} 2z9cj7228fak9g2ifjdim75i5xzbg3q بەرگ 0 268435 6532158 5863876 2026-09-19T07:49:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532158 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berg === Navdêr === {{navdêr|ckb}} # [[berg]], [[cild]], [[rû]] mag9iqv4xztotnizll55aub6w16rnqc بەرگەشتە 0 268437 6532159 5863882 2026-09-19T07:49:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532159 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bergeşte === Rengdêr === {{rengdêr|ckb}} # [[bextreş]], [[bêsiûd]], [[bênesîb]] kkkwovv2s4r5fnldgu6p56wly8bow6w بەروودوا 0 268439 6532160 5863886 2026-09-19T07:49:45Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532160 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berûdiwa === Hoker === {{hoker|ckb}} # [[berûpişt]], [[berevajî]] qymelx5kougv1mn5tnez0vr3a6a3tth بەروار 0 268440 6532161 5863884 2026-09-19T07:49:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532161 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berwar === Navdêr === {{navdêr|ckb}} # [[roj]], [[dem]], [[tarîx]], dema dê tiştek bibe yan bêt kirin thn47wr7130ol0scopjl7yyn1szj73f بەرز 0 268441 6532162 5863866 2026-09-19T07:50:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532162 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berz === Rengdêr === {{rengdêr|ckb}} # [[bilind]], [[bala]], [[berz]], [[bihagiran]], [[jêhatî]], [[berkeftî]], [[hêja]] 6429rb94bap7qmfyvxjk9pberd4r7ye بەرزە 0 268442 6532163 5863868 2026-09-19T07:50:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532163 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :berze === Rengdêr === {{rengdêr|ckb}} # [[hinda]], [[wenda]], [[berze]], [[nediyar]], [[nexwiya]] 2uvydd2vt5hq7hxs8aavon07temr7uw بەستە 0 268444 6532164 5863904 2026-09-19T07:50:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532164 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beste === Navdêr === {{navdêr|ckb}} # [[pûte]], [[giringî]], [[watedarî]] nktx98qd8giuc1qh4w7mzy7pdl5y68b بەش 0 268446 6532165 5863908 2026-09-19T07:50:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532165 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beş === Navdêr === {{navdêr|ckb}} # [[par]], [[behr]], [[pişk]], [[beş]], [[parçe]], ker; babet; biwêj: Beşî naka بەشی ناکا têra nake'' kxklahgetbo1y1jghturu639mmve5m1 بەتڵانە 0 268449 6532166 5863834 2026-09-19T07:50:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532166 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :betllane === Navdêr === {{navdêr|ckb}} # [[azane]], [[betlane]], [[tatîl]] ei7zuy9xo4593iylp5j5c9vsyasxsay بەو 0 268450 6532167 5863970 2026-09-19T07:50:55Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532167 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bew === Hoker === {{hoker|ckb}} # [[bi wê]], [[bi wî]] on88u8o2e8vcn7y81747kct8k0pouxr بەخش 0 268454 6532168 5863846 2026-09-19T07:51:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532168 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bexş === Navdêr === {{navdêr|ckb}} # [[diyarî]], [[xelat]], [[efû]] a9i8ryhm4ouy5tjd0yt7zv3sjh2ovj8 بەخشەندە 0 268456 6532170 5863848 2026-09-19T07:51:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532170 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bexşende === Rengdêr === {{rengdêr|ckb}} # [[dilovan]], [[mihrevan]], [[camêr]], [[merd]], [[bexşende]] 1hp3mp4ofcq08lkhzwgvfl4jzeyfwds بەخت 0 268458 6532171 5863838 2026-09-19T07:51:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532171 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bext === Navdêr === {{navdêr|ckb}} # [[bext]], [[şans]], [[nesîb]] 228yvw9gii8mps6nn2jk0q9zywk7jog بەختەوەر 0 268460 6532172 5863844 2026-09-19T07:51:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532172 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bextewer === Rengdêr === {{rengdêr|ckb}} # [[bextbaş]], [[binesîb]] qt0wwfaxz33nxdi2ziwzozi1qk3ddlp بەختیار 0 268461 6532173 5863842 2026-09-19T07:51:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532173 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bextiyar === Rengdêr === {{rengdêr|ckb}} # [[dilşad]], [[kêfxweş]], [[bextiyar]] szh810ksfqjybh7rh7enun6pv0rdgf0 بەخترەش 0 268462 6532174 5863840 2026-09-19T07:51:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532174 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bextreş === Rengdêr === {{rengdêr|ckb}} # [[bextreş]], [[bênesîb]] 0oynetimzxbcqww6cq33efgnpp7035d بەیانی 0 268464 6532175 5863982 2026-09-19T07:52:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532175 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beyanî === Navdêr === {{navdêr|ckb}} # [[spêde]], [[sibe]], [[serê sibê]], [[sihar]] 1v6mzccfhe7vptwvuztjwh11canj0ij بەیاننامە 0 268465 6532176 5863980 2026-09-19T07:52:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532176 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beyanname === Navdêr === {{navdêr|ckb}} # [[daxwiyanî]], [[îlan]] 9zimz9kz7p9s9tmgmrttglxadcqcls4 بەیار 0 268466 6532177 5863974 2026-09-19T07:52:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532177 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beyar === Rengdêr === {{rengdêr|ckb}} # [[beyar]], erdê ziha / hişk j8tb19gfkfctpq1lgg9cr7huj4d1z5o بەیاز 0 268468 6532178 5863978 2026-09-19T07:52:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532178 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beyaz === Navdêr === {{navdêr|ckb}} # [[destnivîs]], [[dîwan]] nrpgy4t93ion3f7h36n8sd168qbedc3 بەیچەڵ 0 268469 6532179 5863984 2026-09-19T07:52:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532179 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beyçell === Rengdêr === {{rengdêr|ckb}} # [[stewr]], jina zarok nabin nmo2jfjbkwm53pqyb410lqybrwqec3m بەیدەست 0 268471 6532180 5863986 2026-09-19T07:52:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532180 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beydest === Rengdêr === {{rengdêr|ckb}} # [[bêdest]], [[bêdestûdar]], [[bêdesthilat]], [[bêhêz]] tavl4ewk5d39j43xoybp08zawi3ax00 بەینەت 0 268472 6532181 5863988 2026-09-19T07:53:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532181 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beynet === Navdêr === {{navdêr|ckb}} # [[pêbawerî]], [[emînî]], [[sadiqî]], [[bawerîpêanîn]] twi889325ek295h9kluic3kmob4570k بەینەتدار 0 268473 6532182 5863990 2026-09-19T07:53:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532182 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :beynetdar === Rengdêr === {{rengdêr|ckb}} # [[pêbawer]], [[sadiq]], [[emîn]] fqbrcf4kft72d4nfxeghkme06jhgr8s بەزم 0 268476 6532183 5863898 2026-09-19T07:53:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532183 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bezm === Navdêr === {{navdêr|ckb}} # [[şahî]], [[şehyan]], [[kêfxweşî]], [[aheng]] # [[mijar]], [[babet]] jag27ix5fotdagry48vwv8giea06bfd بێگومان 0 268481 6532184 5863668 2026-09-19T07:53:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532184 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêguman === Rengdêr === {{rengdêr|ckb}} # [[bêşik]], [[bêguman]], [[bivê-nevê]], [[bêvirde-wirde]], [[bêhirve-wirve]] iphtopa08hqpdbmeyo5odmng83711aw بێھیوا 0 268482 6532185 5863814 2026-09-19T07:53:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532185 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêhîwa === Rengdêr === {{rengdêr|ckb}} # [[bêhêvî]] augvwvmxhff1jp6dtttsqbnkvekkh0r بێژار 0 268483 6532186 5863535 2026-09-19T07:53:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532186 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêjar === Navdêr === {{navdêr|ckb}} # [[pîne]], [[pinî]] g4qymraldtbq69sqz2gxcpc1mk5by5j بێلایەن 0 268484 6532187 5863675 2026-09-19T07:54:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532187 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêlayen === Rengdêr === {{rengdêr|ckb}} # [[bêal]], [[bêalî]] li4kk13ki9nkxynmom2d40qvp6tvess بێلایەنی 0 268485 6532188 5863677 2026-09-19T07:54:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532188 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêlayenî === Navdêr === {{navdêr|ckb}} # [[bêalîtî]] 7pkmqnzlc1qcdnlhvxghka96oaee289 بێنەوبەرە 0 268486 6532189 5863788 2026-09-19T07:54:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532189 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bênewbere === Navdêr === {{navdêr|ckb}} # [[prose]], [[pêvajo]] eaqsx7rtwjmp6qo8ylcl666iygig5cx بێسەرووشوێن 0 268487 6532190 5863559 2026-09-19T07:54:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532190 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêserûşiwên === Rengdêr === {{rengdêr|ckb}} # [[bêsereder]], [[nediyar]], [[wenda]] miigp3d5ksp09qf1yzoob2t1oeeu4zg بێشەڵان 0 268490 6532191 5863578 2026-09-19T07:54:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532191 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêşellan === Navdêr === {{navdêr|ckb}} # [[dalistan]], [[dehlistan]] gnkri2lsp2a28t6kfy8zyfacr7693vc بێتار 0 268492 6532192 5863392 2026-09-19T07:54:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532192 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêtar === Navdêr === {{navdêr|ckb}} # [[tengasî]], [[tengije]], [[tengavî]], [[alozî]], [[kosp]] 4r1dm9pzb2z2pr2abjsia2ppbtj9snn بێخ 0 268497 6532193 5863442 2026-09-19T07:55:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532193 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêx === Navdêr === {{navdêr|ckb}} # [[bingeh]], [[esas]] a8x9xvdw1e8fhr38e78dn90t8nw67zx بێخبڕ 0 268498 6532194 5863450 2026-09-19T07:55:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532194 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêxbirr === Navdêr === {{navdêr|ckb}} # [[akam]], [[encam]], [[dawî]] bcqsc63sipk1ahesp66gnrrq89pi0m3 بێزار 0 268499 6532195 5863523 2026-09-19T07:55:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532195 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bêzar === Rengdêr === {{rengdêr|ckb}} # [[betilî]], [[bêzar]], [[tengezar]], [[westayî]] hapi15jnlxr0bvq865ra6igmpuirhgy بژاردە 0 268502 6532196 5862588 2026-09-19T07:55:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532196 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bijarde === Rengdêr === {{rengdêr|ckb}} # [[bijare]] gscksp36a54x8qf6os6wmqa1mscttbh بژوولک 0 268504 6532197 5862589 2026-09-19T07:55:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532197 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bijûlk === Navdêr === {{navdêr|ckb}} # [[bûjang]], [[mûjang]] 9m92gxm5yqit0fw6utx8qcmcu4bn1uf بڵند 0 268507 6532198 5862701 2026-09-19T07:55:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532198 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :billind === Rengdêr === {{rengdêr|ckb}} # [[bilind]], [[berz]], [[bala]] af533l46m336sxzacw2z2cm6p9qzpk9 6532205 6532198 2026-09-19T07:56:56Z Wikihez 7344 /* Soranî */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re) 6532205 wikitext text/x-wiki == {{ziman|ckb}} == === Rengdêr === {{rengdêr|ckb|tr=billind}} # [[bilind]], [[berz]], [[bala]] cocm73mlyifas6194v9uzh94rx161zl بلیمەت 0 268508 6532199 5862751 2026-09-19T07:56:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532199 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bilîmet === Rengdêr === {{rengdêr|ckb}} # [[dahî]], [[bilîmet]] pqyq7emfkc8jjlv7s80exsqdciux0ag بناغە 0 268511 6532200 5862772 2026-09-19T07:56:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532200 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :binaghe === Navdêr === {{navdêr|ckb}} # [[bingeh]], [[esas]] m1vmguop0yyja646wcamt5zjqr59vzr بنچە 0 268512 6532201 5862779 2026-09-19T07:56:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532201 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :binçe === Navdêr === {{navdêr|ckb}} # [[nifş]], [[cêl]] 7y97yp1aj74pcs19o9fhkeoukwkerzs بنچینەیی 0 268514 6532202 5862777 2026-09-19T07:56:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532202 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :binçîneyî === Rengdêr === {{rengdêr|ckb}} # [[bingehîn]], [[esasî]] jketwr144394u1uqws2uxfnzordinja بنەما 0 268515 6532203 5862836 2026-09-19T07:56:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532203 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :binema === Navdêr === {{navdêr|ckb}} # [[bingeh]], [[esas]] o2jkloqrbnpi9g4h9rzghh9ev4znzl0 بنەوش 0 268516 6532204 5862838 2026-09-19T07:56:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532204 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :binewş === Navdêr === {{navdêr|ckb}} # [[binefş]] 4uwo3jovl168v8bta4gc36n7jjv7hyw بنکە 0 268519 6532206 5862817 2026-09-19T07:57:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532206 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :binke === Navdêr === {{navdêr|ckb}} # [[bingeh]], [[esas]] iit16kqhkdenzyzrlgc4szrvfvksv6x بڕێک 0 268521 6532207 5862548 2026-09-19T07:57:15Z JiyanBot 3048 Cure Cînav hat lêzêdekirin 6532207 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :birrêk === Cînav === {{cînav|ckb}} # [[hinek]], [[piçek]] c1rgyqq4mfyz0ozn58sh0c79rmk29ka بڕاو 0 268524 6532208 6433251 2026-09-19T07:57:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532208 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :birraw === Rengdêr === {{rengdêr|ckb}} # [[birrî]], [[qutkirî]], [[veqetandî]] ==== Anagram ==== * {{anagram|ckb|a=ابوڕ|بڕوا}} q5tkepakiicvmmhvu78mwmadyg7v863 بڕیار 0 268540 6532209 5862528 2026-09-19T07:57:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532209 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :birryar === Navdêr === {{navdêr|ckb}} # [[biryar]], [[qerar]] 1ks2409si3lstpqgd8jc47jf7h6n940 بسکە 0 268542 6532210 5862601 2026-09-19T07:57:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532210 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :biske === Navdêr === {{navdêr|ckb}} # [[girnij]], [[bişir]] 1po05o92t1n03inxq8v2s6wsu79a8zk بشێوە 0 268543 6532211 5862615 2026-09-19T07:57:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532211 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bişêwe === Navdêr === {{navdêr|ckb}} # [[tevlihevî]], [[alozî]] bchmlygs7gjso0pyickbrnaigruvhi9 بوێر 0 268545 6532212 5863157 2026-09-19T07:58:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532212 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :biwêr === Rengdêr === {{rengdêr|ckb}} # [[wêrek]], [[biste]], [[cesûr]], [[bicesaret]] r7rpe0zsing2m7ed8paemc85niy3x90 بیانوو 0 268547 6532213 5863371 2026-09-19T07:58:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532213 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :biyanû === Navdêr === {{navdêr|ckb}} # [[bihane]], [[hêcet]], [[hincet]] m1mr2hkdd25674bgadtguaq1r9gi8vg بزووتنەوە 0 268553 6532214 5862585 2026-09-19T07:58:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532214 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bizûtnewe === Navdêr === {{navdêr|ckb}} # [[bizav]], [[tevger]], [[hereke]] tdbwkqudz0tjlv8xcfrrpfrtb6jd7nz بیبن 0 268554 6532215 5863377 2026-09-19T07:58:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532215 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîbin === Navdêr === {{navdêr|ckb}} # [[kemer]], [[kember]], [[şal]] bxgqd62xv7206lqa6kgopab365x2jda بیجامە 0 268556 6532216 5863410 2026-09-19T07:58:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532216 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîcame === Navdêr === {{navdêr|ckb}} # [[pîjama]], [[bîcame]] t5jv90fg3zadx4gbx2jb1qwjky74ll9 بیچم 0 268557 6532217 5863426 2026-09-19T07:58:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532217 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîçm === Navdêr === {{navdêr|ckb}} # [[biçm]], [[serûçav]], [[bejnûbal]], [[rû]], [[derdirûv]] mgbv7p3z0r69dycjlq2mg9dej7tky8k بیراز 0 268562 6532218 5863474 2026-09-19T07:59:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532218 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîraz === Navdêr === {{navdêr|ckb}} # [[lome]], [[lêdan]] k0pemrwuvczrz4806f67inhbhzo4mpd بیرە 0 268563 6532219 5863521 2026-09-19T07:59:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532219 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîre === Navdêr === {{navdêr|ckb}} # [[bîre]], [[bîra]] r3xfnxh95brhlpwuinu1oaa32amhlga بیرتەسک 0 268564 6532220 5863478 2026-09-19T07:59:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532220 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîrtesk === Rengdêr === {{rengdêr|ckb}} # [[bênteng]] 5f90vuxb9r9wqvgnouwo4j6mz8yfgqh بیرووڕا 0 268565 6532221 5863518 2026-09-19T07:59:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532221 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîrûrra === Navdêr === {{navdêr|ckb}} # [[bîrewerî]], dîtin û nerîn, [[bawerî]] dk1n2y1x6y10bwkrpccwblor0gr46gr بیستا 0 268566 6532222 6433215 2026-09-19T07:59:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532222 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîsta === Navdêr === {{navdêr|ckb}} # [[guhdar]] ==== Anagram ==== * {{anagram|ckb|a=ابتسی|بایست}} 7uj0u1kanb298bqy6d1ddtwab1cy1k6 بیستەر 0 268567 6532223 5863549 2026-09-19T07:59:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532223 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîster === Navdêr === {{navdêr|ckb}} # [[bihîster]], [[guhdar]] 4fug31w8qiwi3ldkmm9x1weypbv8ie4 بیستن 0 268568 6532224 5863544 2026-09-19T08:00:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532224 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîstin === Lêker === {{lêker|ckb}} # [[bihîstin]], [[bîstin]], [[guh lê bûn]] ms1t7df7l8v84am5w18n24ft41q6a5y بیستۆک 0 268569 6532225 5863547 2026-09-19T08:00:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532225 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîstok === Navdêr === {{navdêr|ckb}} # [[telefon]], [[bîstok]], [[bihîstok]], [[wergirk]] emunbt4m1hhlbmr0mw0cf3pwzts4or6 بیستراو 0 268570 6532226 5863539 2026-09-19T08:00:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532226 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîstraw === Navdêr === {{navdêr|ckb}} # [[bihîstî]], ya hatî guhlêbûn clmritt7n974filzqfo3gvjp8xe0oky بیڤر 0 268571 6532227 5863632 2026-09-19T08:00:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532227 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bîvir === Navdêr === {{navdêr|ckb}} # [[bivir]], [[darbirrk]] bupycckm3tzzkhvsw05t7y5pqie79aw بۆچوون 0 268572 6532228 5863159 2026-09-19T08:00:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532228 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :boçûn === Navdêr === {{navdêr|ckb}} # dîtin û nerîn, [[helwest]], [[boçûn]], [[bîrewerî]] kv3dx3rfj224se480awdz33yee7rugr بۆنە 0 268574 6532229 5863165 2026-09-19T08:00:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532229 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bone === Navdêr === {{navdêr|ckb}} # [[sedem]], [[minasibet]], [[bone]] cj0mv1fx2mzb30ojapd5s92rj17c643 بۆران 0 268575 6532230 5863160 2026-09-19T08:01:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532230 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :boran === Navdêr === {{navdêr|ckb}} # [[bahoz]], [[barove]], [[bager]] ke2fb8105twozj4ej5l935vehlrn2le بۆردن 0 268578 6532231 5863162 2026-09-19T08:01:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532231 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bordin === Navdêr === {{navdêr|ckb}} # [[borîn]], [[buhurîn]], [[bihirîn]] 4v4bwmiehuayjkji53rh8s951hq12mc بۆق 0 268579 6532232 5863163 2026-09-19T08:01:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532232 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :boq === Navdêr === {{navdêr|ckb}} # [[beq]] pwly653x0jw184t5cvqxvckcduti1mk بۆینباخ 0 268582 6532233 5863166 2026-09-19T08:01:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532233 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :boyinbax === Navdêr === {{navdêr|ckb}} # [[stobend]], [[krawat]] rk9czt2t7wh9v13oy9w06m6jst9p39o بووێژ 0 268583 6532234 5863148 2026-09-19T08:01:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532234 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :buwêj === Rengdêr === {{rengdêr|ckb}} # [[biaxiftin]], [[devbixeber]], [[zêdebêj]] dmifhbnymxwjlqlpu2veboezdy0g34n بوخچە 0 268584 6532235 5863131 2026-09-19T08:01:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532235 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :buxçe === Navdêr === {{navdêr|ckb}} # [[buxçik]], [[buxçe]] gfa5fxx4sr1uq1kzw1487qmsurb03nx بوختان 0 268585 6532236 5863129 2026-09-19T08:02:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532236 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :buxtan === Navdêr === {{navdêr|ckb}} # [[newehî]], [[sêf]], [[fesad]], [[buxtan]] bj5s0i0896a04103dwj41puw2t0kbmu بوودینە 0 268587 6532237 5863141 2026-09-19T08:02:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532237 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bûdîne === Navdêr === {{navdêr|ckb}} # [[nane]] 6ukv36ni9apn4mrx7kbdzr52miszw8x بووژاندن 0 268589 6532238 5863144 2026-09-19T08:02:25Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532238 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bûjandin === Lêker === {{lêker|ckb}} # [[vejandin]], [[vejiyandin]] b64k8ci2ic6jx80eegm5rwvihrnihop بووم 0 268590 6532239 5863146 2026-09-19T08:02:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532239 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bûm === Navdêr === {{navdêr|ckb}} # [[erd]], [[zevî]], [[ax]], [[xak]] # [[avanî]], [[sazî]] 5yj6v2lw8mzbvcrj8r4jv1fdyjdx02u بووسە 0 268594 6532240 5863145 2026-09-19T08:02:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532240 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :bûse === Navdêr === {{navdêr|ckb}} # [[xweveşartin]], [[veşartokane]] 1xt5ibtqp691eci4igxu2yza2p9i3e4 چاچی 0 268598 6532241 5866763 2026-09-19T08:02:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532241 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çaçî === Navdêr === {{navdêr|ckb}} # [[çayçî]], [[çaygêr]] oxthjqpef6ltzad1aj3poe64jbaib50 چادرگا 0 268600 6532242 5866781 2026-09-19T08:03:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532242 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çadirga === Navdêr === {{navdêr|ckb}} # [[war]], [[wargeh]], [[xîvetgeh]], [[çadirgeh]] lemwv6ey3erw93005bx3dod8rpcapxr چاکەت 0 268602 6532243 5866845 2026-09-19T08:03:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532243 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çaket === Navdêr === {{navdêr|ckb}} # [[çaket]], [[saqo]], [[qapût]] 7f7tqf2x8f4nvnx2ubvsf002oui9huf چاڵ 0 268603 6532244 5866847 2026-09-19T08:03:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532244 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çall === Navdêr === {{navdêr|ckb}} # [[çal]], [[kend]], [[kosp]], [[kun]] lrxwawo5rc73kgl0n1wqzth10c3u8fm چاڵاو 0 268605 6532245 5866857 2026-09-19T08:03:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532245 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çallaw === Navdêr === {{navdêr|ckb}} # [[çalav]], [[hewz]], [[gerrik]], [[gom]], [[lîç]] ngich8oox9a0wbp7d7ht5vepmlbf056 چاڵەچەقیلە 0 268606 6532246 5866863 2026-09-19T08:03:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532246 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çalleçeqîle === Navdêr === {{navdêr|ckb}} # [[lale]], [[alale]], [[lele]], [[lehle]] juz55lyzpgs6bca3k8wni5itdt2kd6n چاندەمەنی 0 268608 6532247 5866865 2026-09-19T08:03:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532247 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çandemenî === Navdêr === {{navdêr|ckb}} # [[dexl]], [[dexlûdan]], [[çandemenî]], berhemê çandinê njjnzt43zsro2dqfv02qus19s6pxhit چاپکراو 0 268610 6532248 5866751 2026-09-19T08:04:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532248 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çapkiraw === Rengdêr === {{rengdêr|ckb}} # [[çapkirî]], [[çapandî]], [[weşandî]], [[tebihkirî]] b2raf2v7khzfzjnnn3ke6h0l9pxafkp چاپخانە 0 268611 6532250 5866749 2026-09-19T08:04:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532250 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çapxane === Navdêr === {{navdêr|ckb}} # [[çapxane]], [[weşanxane]], [[metbee]] hcwvcxh01g810xpnnvy137w5ujiwvz2 چاپەز 0 268613 6532251 5866759 2026-09-19T08:04:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532251 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çapez === Navdêr === {{navdêr|ckb}} # [[çaydank]], [[qorî]], [[qorîk]], [[çadank]] no1maz5893fccwfp8bcjky6m1no2yir چارەنووس 0 268616 6532252 5866803 2026-09-19T08:04:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532252 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çarenûs === Navdêr === {{navdêr|ckb}} # [[çarenivîs]], [[qeder]], [[felek]] j1ra2kpr00d9vb0lx731zzq0tr9wck4 چارەنووسساز 0 268617 6532253 5866805 2026-09-19T08:04:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532253 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çarenûssaz === Rengdêr === {{rengdêr|ckb}} # [[diyarker]], [[xwiyaker]], [[zelalker]] ml31hlqljlqw6n3vqnkrvb63h9nolnp چارەوا 0 268618 6532254 5866807 2026-09-19T08:04:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532254 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çarewa === Navdêr === {{navdêr|ckb}} # [[hesp]], [[mehîn]] axp6vvh4r0ih35tbv7q0d3qoeee98k5 چارشێو 0 268619 6532255 5866789 2026-09-19T08:05:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532255 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çarşêw === Navdêr === {{navdêr|ckb}} # [[çarçev]], [[serdoşek]], [[çarçav]] 7crow9nwmxifz7evv3dhju04ja3eyva چاسر 0 268620 6532256 5866809 2026-09-19T08:05:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532256 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çasir === Navdêr === {{navdêr|ckb}} # [[parsek]], [[xwestok]], [[gerok]], [[xwastok]] bz3qcj04oazomzolzx1laad9kmzsrlf چاش 0 268621 6532257 5866811 2026-09-19T08:05:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532257 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çaş === Rengdêr === {{rengdêr|ckb}} # [[mat]], [[ecêbgirtî]], [[matmayî]], [[matbûyî]] t78gi4ptm3deyh38ibmp2m75tzxpe5l چاشنی 0 268622 6532258 5866815 2026-09-19T08:05:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532258 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çaşnî === Navdêr === {{navdêr|ckb}} # [[tam]], [[çêj]] i5464dvci8dzeq0uzvpeqpw4w878vpm چاشتێنگا 0 268624 6532259 5866813 2026-09-19T08:05:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532259 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çaştênga === Navdêr === {{navdêr|ckb}} # [[danê sibê]], [[danê siharê]], berî nîvro o4821z7q3pxakmfjq00oex6qkpzqq9f چاوباشقاڵ 0 268627 6532260 5866877 2026-09-19T08:05:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532260 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çawbaşqall === Navdêr === {{navdêr|ckb}} # [[flortker]], [[;flortkerî]] a4uxieej322blkc8bsrtn3az488wiv3 چاوەڕوانکراو 0 268630 6532261 5866883 2026-09-19T08:06:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532261 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çawerrwankiraw === Rengdêr === {{rengdêr|ckb}} # [[pêşbînîkirî]] 0hkmp0uxlpp10wx7fked9pxa6vgzs88 چاوێشە 0 268631 6532262 5866881 2026-09-19T08:06:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532262 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çawêşe === Navdêr === {{navdêr|ckb}} # [[çavêşî]], êşa çavan 24fam6nt929psff9ikljj1wfam006kt چایەر 0 268634 6532263 5866899 2026-09-19T08:06:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532263 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çayer === Navdêr === {{navdêr|ckb}} # [[mêrg]], [[çîmen]], [[çayir]], [[keskistan]], [[şêngeh]], [[lewerr]], [[çerîngeh]] 11m4lddhbqiet8iuugo5iuo3xbtbf7c چەکووش 0 268636 6532264 5867592 2026-09-19T08:06:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532264 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çekûş === Navdêr === {{navdêr|ckb}} # [[çekûç]], [[keçûç]] rclzramvzlm556q0h7brw64bp3apxmj چەلاک 0 268637 6532265 5867593 2026-09-19T08:06:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532265 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çelak === Navdêr === {{navdêr|ckb}} # [[çelak]], darikek dirêj e bo daweşandina gûz û hin berhemên din yên daran têt bikaranîn etd63bvlzcg4n1h4570qgkva95nc6rn چەلاو 0 268639 6532266 6433275 2026-09-19T08:06:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532266 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çelaw === Navdêr === {{navdêr|ckb}} # [[serûpêk]], ser û piyên bizinan yan mihan dema tên kelandin yan qelandin ==== Anagram ==== * {{anagram|ckb|a=الوچە|چوالە}} jams07ipl2irv6wppbh1gh1uvm9e1eo چەڵەمە 0 268640 6532267 5867597 2026-09-19T08:07:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532267 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çelleme === Navdêr === {{navdêr|ckb}} # [[arîşe]], [[kêşe]], [[krîz]], rewşa ne pêdandî û sabit i0q7lx171niuoepaf4lb27kg88r8quh چەلیپا 0 268641 6532268 5867596 2026-09-19T08:07:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532268 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çelîpa === Navdêr === {{navdêr|ckb}} # [[xaç]], '':r'' xîçûxaç 8tu4r4k7c3ms47h17gr80gz27rf81o4 چەمچە 0 268643 6532269 5867598 2026-09-19T08:07:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532269 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çemçe === Navdêr === {{navdêr|ckb}} # [[heskû]], [[mifsik]], kefçiyê mezin yê pê xwarinê ji qazanan dikin sêniyan fje6g968kv6eti5cdhjamxc2t3694st چەمەر 0 268644 6532270 5867601 2026-09-19T08:07:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532270 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çemer === Navdêr === {{navdêr|ckb}} # [[çemer]], [[çember]], [[xirrxal]], [[bazine]], [[xelek]] kcllnarzm0esp5tnsreip77mwx20pk1 چەنە 0 268648 6532271 5867606 2026-09-19T08:07:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532271 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :Çene / çenage dan === Lêker === {{lêker|ckb}} # [[zêde peyivîn]], gelek axiftin, pirr ştexilîn hdtfv1fuyhhbam3ylacqk9anbymgl8l چەندەمین 0 268650 6532272 5867605 2026-09-19T08:07:55Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532272 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çendemîn === Lêker === {{lêker|ckb}} # [[çendem]], [[çendemîn]], ya çendê / çendan p29253awljslw6kjs20a1ng02aqukxq 6532276 6532272 2026-09-19T08:08:32Z Şêr 1103 Guhartoya [[Special:Diff/6532272|6532272]] yê [[Special:Contributions/JiyanBot|JiyanBot]] ([[User talk:JiyanBot|gotûbêj]]) şûnde kir 6532276 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çendemîn === Mane === {{bêcure|ckb}} # [[çendem]], [[çendemîn]], ya çendê / çendan n2pwwbmv417i2mn1w1il8ty2c9eyn7h چەنەباز 0 268652 6532273 5867607 2026-09-19T08:08:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532273 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çenebaz === Rengdêr === {{rengdêr|ckb}} # [[zêdebêj]], [[pirraxiv]] 1e0fmnyss3zqixy24i1h79m4srbd7u6 چەنەبازی 0 268653 6532274 5867608 2026-09-19T08:08:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532274 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çenebazî === Navdêr === {{navdêr|ckb}} # [[zêdebêjî]], [[pirraxivî]] 3iihc0rufr4gh590irj1lcjuy8120lk چەنەچەن 0 268654 6532275 5867609 2026-09-19T08:08:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532275 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeneçen === Navdêr === {{navdêr|ckb}} # [[zimandirêjî]] 15araqkk9k0u6z35dgjqbnjrvhv4mtg چەنەھەراش 0 268655 6532277 5867610 2026-09-19T08:08:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532277 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeneheraş === Rengdêr === {{rengdêr|ckb}} # [[bedmebest]], [[niyetxirab]], yê gotinan bi armanca xirabiyê dike spg3vh0hxvxlvoi1vrgb6zzsuwxr6ts چەپاڵ 0 268656 6532278 5867496 2026-09-19T08:08:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532278 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepall === Navdêr === {{navdêr|ckb}} # [[dest]] nlv2j100mpdegz1osbommmovy1q9c9y چەپاڵە 0 268657 6532279 5867499 2026-09-19T08:08:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532279 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepalle === Navdêr === {{navdêr|ckb}} # [[pate]], [[patok]], [[parçe]], [[parçok]] r93dziqciaalyosmmoaldsjkjm8681b چەپاو 0 268658 6532280 5867501 2026-09-19T08:09:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532280 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepaw === Navdêr === {{navdêr|ckb}} # [[şelandin]], [[talan]], êrişa / pelamara şelandinê / talankirinê 6ufpbbeh5p5sb9aj3edzfce7fk7sxie چەپەڵۆک 0 268664 6532281 5867523 2026-09-19T08:09:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532281 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepellok === Navdêr === {{navdêr|ckb}} # [[zele]], [[sîle]], [[şeq]], [[şep]], [[şeqam]], [[şîrqam]], [[şîrmaq]], [[zelle]] c78ayh5e9o8khtlvcw6yhjlj85ss39c چەپەر 0 268665 6532282 5867521 2026-09-19T08:09:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532282 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeper === Navdêr === {{navdêr|ckb}} # [[çeper]], [[tan]], [[kozik]], [[kotan]] np4kouamtevzzyrxu4853j78m6u2jtq چەپکەن 0 268666 6532283 5867509 2026-09-19T08:09:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532283 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepken === Navdêr === {{navdêr|ckb}} # [[nihûn]], [[tunel]], kuna / qula ji herdu aliyan ve vekirî fe2o6bv6awz80dg6u0sco1yk4wubxz8 چەپۆک 0 268669 6532284 5867515 2026-09-19T08:09:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532284 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepok === Navdêr === {{navdêr|ckb}} # [[zele]], [[sîle]], [[şeq]], [[şep]], [[şeqam]], [[şîrqam]], [[şîrmaq]], [[zelle]] iqzubif5tlj6vsj50mnh0dzi17jbkqh چەپڕۆ 0 268670 6532285 5867505 2026-09-19T08:09:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532285 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeprro === Navdêr === {{navdêr|ckb}} # [[çepgir]], [[çepperwer]], [[çepperest]], peyrewê / alîgirê / mirûdê rêzanî û siyaseta çepgiriyê shqw9o122vt1a6jqao9nnftv0c0i5es چەپڕۆیی 0 268671 6532286 5867507 2026-09-19T08:10:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532286 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeprroyî === Navdêr === {{navdêr|ckb}} # [[çepgirî]], [[çepperwerî]], [[çepperestî]], di siyasetê de alîgirê rêbaz û rêzaniya çepiyê 9dacgxwgy9c7ztgjvenjhb299h4fwpu چەپخوون 0 268673 6532287 5867503 2026-09-19T08:10:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532287 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çepxûn === Rengdêr === {{rengdêr|ckb}} # [[şûm]], [[neqet]], [[venehewayî]], [[destmatî]] k95pg5oiagxvjufl0hvuowzmpo0jtlv چەقاڵ 0 268674 6532288 5867585 2026-09-19T08:10:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532288 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeqall === Rengdêr === {{rengdêr|ckb}} # [[sade]], Bi taybetî wek çeqall û beqall tên bikaranîn û wateya wê kesên nemalmezin e, Bi pirranî di wateya biçûkhesibandinê de têt bikaranîn === Dijmane === *[[malmezin]] * [[esilzade]] * [[zanedan]] j70oy2hk1usbzsgxvtnvj9jdugf1w6q چەقان 0 268675 6532289 5867586 2026-09-19T08:10:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532289 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeqan === Navdêr === {{navdêr|ckb}} # [[daçûn]], di nav berfê / heriyê re man / daçûn / xetimîn / alizîn / asê bûn / asê man: le qurr çeqan di heriyê re man, di nav heriyê de asê bûn 8l2km54sl3vg988nurdk4v7xoo0kd72 چەقاندن 0 268676 6532290 5867587 2026-09-19T08:10:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532290 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeqandin === Lêker === {{lêker|ckb}} # [[pal dan]], [[def dan]], [[han dan]], pal pê radan, pal bi yekî radan ijk3c0p26bxpluipuvuwtddvcduas7r چەقۆکێش 0 268682 6532291 5867589 2026-09-19T08:10:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532291 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeqokêş === Navdêr === {{navdêr|ckb}} # [[şerxwaz]], [[belakir]], [[gefxwer]], [[hereşeker]], [[tehdîdker]] 1slw3e4fw6hqc3m82o55w97raoc4elm چەرداوەروو 0 268685 6532292 5867570 2026-09-19T08:11:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532292 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerdawerû === Rengdêr === {{rengdêr|ckb}} # [[rûqayîm]], [[bêşerm]] bbdzlomsl93pmu582xw6n0axxh0fcrp چەرداخ 0 268686 6532293 5867569 2026-09-19T08:11:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532293 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerdax === Navdêr === {{navdêr|ckb}} # [[kepir]], xaniyên havînî yên bêdîwar û serbanê wan ji çilû yan qamûş ewo9zf3pn1h8ua3r51gyweprn48dwiy چەردە 0 268687 6532294 5867571 2026-09-19T08:11:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532294 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerde === Navdêr === {{navdêr|ckb}} # [[miqdar]], [[çendanî]], [[gelekî]], [[pirrî]], [[zehfî]] 63tvrvpptpgj37c9i76x7yybihun956 چەڕندە 0 268689 6532295 5867575 2026-09-19T08:11:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532295 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerrinde === Navdêr === {{navdêr|ckb}} # [[çerîngeh]], [[çêrgeh]], cihê heywan lê diçerin 7bpglj1x850ii1r90ysrxl9ns5jomoz چەڕین 0 268690 6532296 5867576 2026-09-19T08:11:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532296 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerrîn === Lêker === {{lêker|ckb}} # [[çerîn]], [[çêrîn]], dema heywan giyayê li mêrg û çîmen û çayiran şên dibe dixwin advt8kqq3s0phcqqhufiomjqyinkxlm چەرم 0 268691 6532297 5867573 2026-09-19T08:11:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532297 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerm === Navdêr === {{navdêr|ckb}} # [[çerm]], [[pîst]], [[kevil]], [[post]] iiio6jd8wwoqneaeg43axynr851nr38 چەرمەسەرێ 0 268692 6532298 5867574 2026-09-19T08:12:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532298 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çermeserê === Navdêr === {{navdêr|ckb}} # [[kul]], [[xem]], [[derd]] :Çermeserêm meke Serê min neêşîn, Serê min gêj neke c1c7gfqgcoyxcg0wv9ykmnbbj0q1lqs چەرس 0 268693 6532299 5867572 2026-09-19T08:12:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532299 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çers === Navdêr === {{navdêr|ckb}} # [[tilyak]], [[beng]], [[heşîş]] q3rozoi631gpnmcji3ubwh97utp41e9 چەرخاو 0 268695 6532300 5867567 2026-09-19T08:12:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532300 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerxaw === Navdêr === {{navdêr|ckb}} # [[çerxav]], [[aşê avê]] cmd3srh1zarezkp0wopy3tn2l4rfmoj چەرخەمە 0 268696 6532301 5867568 2026-09-19T08:12:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532301 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çerxeme === Navdêr === {{navdêr|ckb}} # [[zembîl]], [[selik]], [[sepet]], [[zembûl]] 7ngnymygw882h7vyocza99ag4a4llfl چەسپ 0 268698 6532302 5867578 2026-09-19T08:12:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532302 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çesp === Rengdêr === {{rengdêr|ckb}} # ji hev diçe lê zû-zû ji hev venabe, [[çist]], [[xurt]], [[xwegir]], [[xweragir]], [[qayîm]] 9l70ud9vb0w99jgy5ay3g9cfudj8rei چەش 0 268701 6532303 5867579 2026-09-19T08:12:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532303 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeş === Navdêr === {{navdêr|ckb}} # [[1]], [[tam]], [[çêj]], tehm 2, [[dav]], [[xefik]], [[tepik]], [[davik]], dav û xefik elrmxwxat30acgkgijf9slme5xlb0cc چەشن 0 268702 6532304 5867583 2026-09-19T08:13:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532304 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeşin === Navdêr === {{navdêr|ckb}} # [[bir]], [[cure]], [[reng]], [[awa]], [[çeşn]], [[teşn]], [[şêwe]], [[tewir]], [[tehir]] kanoom71ytsaerpmpz7zkvw89x41vmv چەشکە 0 268703 6532305 5867581 2026-09-19T08:13:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532305 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeşke === Navdêr === {{navdêr|ckb}} # [[mifsik]], [[heskû]], [[kefçî]] dut184hzol2egkugb9ya1lbc80q4acm چەشمە 0 268704 6532306 6433287 2026-09-19T08:13:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532306 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeşme === Navdêr === {{navdêr|ckb}} # [[kanî]], [[avzêk]], [[çeşme]], cihê av jê dizê ==== Anagram ==== * {{anagram|ckb|a=شمچەە|شەمچە}} 6zvswg0si806jns7zzd3dhvtlx6ksw0 چەشتن 0 268706 6532308 5867580 2026-09-19T08:13:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532308 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çeştin === Lêker === {{lêker|ckb}} # [[tam kirin]], tama tiştekî seh kirin atw2m188glews1wqlgexs1hg7gk6jj3 چەتاڵ 0 268708 6532309 5867525 2026-09-19T08:13:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532309 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çetall === Navdêr === {{navdêr|ckb}} # [[şen]], [[şeneke]], [[milhêb]] ([[alav]] # [[şen]], [[şeneke]], [[milhêb]] ([[alav]]a vebijartina dexl û dan) 3ar6lc1js9p1aqvpqhagrmtae8a1jkx چەتە 0 268709 6532310 5867565 2026-09-19T08:13:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532310 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çete === Navdêr === {{navdêr|ckb}} # [[çete]], [[cerdevan]], '':keleş; diz'' fgzyky3hei4tvc1hd9ogd2bh8o0lk2z چەتیانە 0 268711 6532311 5867564 2026-09-19T08:14:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532311 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çetiyane === Navdêr === {{navdêr|ckb}} # şûr (şûr û tîr, [[t]], şûrên xwar), '':; [[şûr]] (t'' yên xwar) mnxwa6vjntb27pdicbpledemu9e0bcd چەتڵەمەز 0 268713 6532313 5867563 2026-09-19T08:14:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532313 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çetllemez === Navdêr === {{navdêr|ckb}} # [[fêlbaz]], [[hîlebaz]], [[hîleker]], [[fêlker]] 722s0o5vks7dzkyod2wjwplzq4ookmh چەو 0 268715 6532314 5867611 2026-09-19T08:14:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532314 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çew === Rengdêr === {{rengdêr|ckb}} # [[xiş]], [[şuj]], [[zixik]], [[zixruk]], [[xişeber]], [[xîz]], [[hirdû]], kevirên hûrik, [[hûreberik]], [[hûrekevirok]] a1b9qvysxv3a68nmtuup17ocsjhwwld چەوتانەوە 0 268724 6532315 5867613 2026-09-19T08:14:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532315 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çewtanewe === Lêker === {{lêker|ckb}} # [[çemîn]], [[tewîn]], [[çeman]], hatin çemandin / tewandin, [[tewiyan]], [[çemihan]] qztba3jv1bc12gcl3sy5yrjx0kvwx82 چەوتی 0 268725 6532316 6433296 2026-09-19T08:14:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532316 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çewtî === Navdêr === {{navdêr|ckb}} # [[xwarî]], [[xwehrî]], [[xwêlî]], [[şaşî]], [[çewtî]], [[xeletî]], [[heleyî]], [[şaşîtî]] ==== Anagram ==== * {{anagram|ckb|a=توچیە|چەتیو}} lfqup9wlx75ue28a7mutxumyrb5snmn چەخماق 0 268726 6532317 5867566 2026-09-19T08:14:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532317 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çexmaq === Navdêr === {{navdêr|ckb}} # [[heste]], [[çeqmaq]], alavek e bo vêxistina / agirberdana cigareyan mhtopb9u6t4du7yo7sjbrsn5szh4lkj چێژ 0 268727 6532318 5867453 2026-09-19T08:15:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532318 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêj === Navdêr === {{navdêr|ckb}} # [[tam]], [[çêj]], [[tehm]] 1eklfsoi6uqhg9scpwg8ilqfx0lcebg چێژان 0 268728 6532319 5867456 2026-09-19T08:15:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532319 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêjan === Lêker === {{lêker|ckb}} # [[kêşan]], kişandin (t, zehmetî kêşan), [[rezalet dîtin]] gpbl2ieb4ig2cc0lf5zu6u554ofu8ja چێر 0 268730 6532320 5867434 2026-09-19T08:15:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532320 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêr === Rengdêr === {{rengdêr|ckb}} # [[zal]], [[serdest]], [[serwer]] e6cayqvzelvxgvwj0g3gxe0np6epkdh چێش 0 268731 6532321 5867462 2026-09-19T08:15:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532321 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêş === Navdêr === {{navdêr|ckb}} # [[tam]], [[çêj]], [[tehm]] d48ejtdmqz460ljdqdt6mix8e6zfs9o چێشتکەر 0 268734 6532322 5867467 2026-09-19T08:15:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532322 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêştker === Navdêr === {{navdêr|ckb}} # [[xwarinçêker]] ([[t]], yên kar û pîşeyên wan xwarinçêkirin e) 22njhby8t8l8d10wf7dzul18rfq9tid 6532325 6532322 2026-09-19T08:16:15Z Şêr 1103 t?? 6532325 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêştker === Navdêr === {{navdêr|ckb}} # [[xwarinçêker]] ( yên kar û pîşeyên wan xwarinçêkirin e) p21z5xoj82s7p4bexy2owrju6zwr047 چێشتخانە 0 268735 6532323 5867465 2026-09-19T08:15:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532323 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêştxane === Navdêr === {{navdêr|ckb}} # [[metbex]], [[mitfax]], [[xwarinçêkiringeh]], [[aşxane]] 9ncl54zmaxewf4i9ku5oi9e4h6tf9pf چێو 0 268736 6532324 5867489 2026-09-19T08:16:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532324 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêw === Navdêr === {{navdêr|ckb}} # [[çîv]], [[şiv]], [[darik]], [[tirrik]], [[gilç]], [[darik]], [[şivtan]], [[şiftan]], [[dar]] 61xdnpoika4ts4dwaxkow1jltyw50vb چێوین 0 268738 6532326 5867491 2026-09-19T08:16:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532326 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çêwîn === Rengdêr === {{rengdêr|ckb}} # [[darîn]], [[textîn]], tiştên ji dar hatine çêkirin 8tx1rafja5kidd1d8e1olbk4g8m8oqx چکان 0 268740 6532327 5867127 2026-09-19T08:16:25Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532327 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çikan === Lêker === {{lêker|ckb}} # [[çikîn]], [[miçiqîn]], zuha / ziwa bûn, [[hişk bûn]], av lê neman (bi taybetî çem, rûbar yan co berî ku bigihe deryayê yan avek ji xwe boştir) j2si9p3669nilacmpd9lg133j6pry04 چکۆک 0 268742 6532328 5867133 2026-09-19T08:16:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532328 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çikok === Navdêr === {{navdêr|ckb}} # [[çirke]], [[saniye]] idr805e7dpufayq3jhgkw1mle2qmhsp چکۆڵە 0 268743 6532329 6433305 2026-09-19T08:16:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532329 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çikolle === Rengdêr === {{rengdêr|ckb}} # [[biçkok]], [[hûrkok]], [[biçûkok]], [[hûrik]], pirr biçûk ==== Anagram ==== * {{anagram|ckb|a=چکڵۆە|کچۆڵە}} qj8sg7zjoh386sx228axgg00g33s64t چلێس 0 268747 6532330 5867167 2026-09-19T08:16:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532330 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çilês === Rengdêr === {{rengdêr|ckb}} # [[çavbirsî]], [[hesûd]], [[çavbirçî]] qcyos36oxhbk0iol153p1uq14chz8yh چلێسی 0 268748 6532331 5867169 2026-09-19T08:17:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532331 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çilêsî === Navdêr === {{navdêr|ckb}} # [[birsîtî]], [[hesûdî]], [[çavbirçîtî]] j2oy6xtnbk53pwhws92m0ejuacft7og چڵک 0 268749 6532332 5867155 2026-09-19T08:17:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532332 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çillk === Navdêr === {{navdêr|ckb}} # [[qirêjî]], [[pîsatî]], [[nerindî]] 3pgv0lsy1wbw5287lqxo4eemdm08yhy چڵم 0 268755 6532333 5867159 2026-09-19T08:17:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532333 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çillm === Navdêr === {{navdêr|ckb}} # [[kilmûş]], [[çilm]], ava tîr ya ji pozan / difinan / bêvilan têt i7ismbtk0wpw853vlm9ij8uwtrgokjk چنگاڵ 0 268757 6532334 5867230 2026-09-19T08:17:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532334 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çingall === Navdêr === {{navdêr|ckb}} # [[1]], [[çelak]], çengal 2, [[çetel]], [[çartilk]] ebqv73p94cudoiwj40j2nkmwwmoi41s چنۆک 0 268759 6532335 5867243 2026-09-19T08:17:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532335 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çinok === Rengdêr === {{rengdêr|ckb}} # [[çavbirsî]], [[hesûd]], ya / yê qet têr nabe (bi taybetî ji xwarinê) l8yen0qvpthzcbgvqybxo5kw38ekr8u چپک 0 268760 6532336 5866915 2026-09-19T08:17:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532336 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çipik === Navdêr === {{navdêr|ckb}} # [[bişkoj]], [[bişkojk]], [[bişkivok]], pelên daran yên hê nû dibişkivin / hê negihane le7wg9ea4mlunxn8cyzf368r8uhs1l5 چقڵ 0 268761 6532337 5867125 2026-09-19T08:18:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532337 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiqill === Navdêr === {{navdêr|ckb}} # [[çeq]], [[çiq]], [[çiqil]], çeqên daran bf2nb59l32ipv05fk31e48q5mvmw4i7 چرادان 0 268762 6532338 5866925 2026-09-19T08:18:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532338 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiradan === Navdêr === {{navdêr|ckb}} # [[çiradank]], [[şemaldank]], [[mûmdank]], [[finddank]], tişta find / şemal / mûm / çira tê de têt bicîkirin eyb1xgu25kbroginuudxgg9jmkh215p چراکەوان 0 268763 6532339 5866931 2026-09-19T08:18:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532339 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirakewan === Navdêr === {{navdêr|ckb}} # [[tavsork]], [[hengur]], ronahiya rojê berî ku roj ava dibe d3yurcug7kw9nh1n61nkr1axe5qq2iq چڕان 0 268764 6532340 5866939 2026-09-19T08:18:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532340 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirran === Lêker === {{lêker|ckb}} # [[civîn]], [[kom bûn]], [[berhev bûn]], [[li hev civîn]], [[li hev kom bûn]], '': bi hev re gerrîn, bi hev re meşîn'' dgngb7yqprwqf7db9q3fmp9fees3olu چراورک 0 268765 6532341 5866943 2026-09-19T08:18:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532341 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirawirk === Navdêr === {{navdêr|ckb}} # [[pêtal]], [[meşal]] h49wea8ga84cnguqzqqx1729aivgown چرچ 0 268766 6532342 5866957 2026-09-19T08:18:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532342 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirç === Navdêr === {{navdêr|ckb}} # [[rengjêçûyî]], [[rengavêtî]] 7kkbu6soixs45u6st5lp5uxpphcbehs چرکاندن 0 268769 6532343 5866987 2026-09-19T08:19:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532343 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirkandin === Lêker === {{lêker|ckb}} # [[çirkandin]], dengê "çirk" jê anîn r7jk5w31vw9ypbtsykvbacuz1ommpnv چڕنووک 0 268771 6532344 5866997 2026-09-19T08:19:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532344 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirrnûk === Navdêr === {{navdêr|ckb}} # [[pence]], nînokên tûj lfnx2uv2tp0svchoxlj4q6x7oq6wuws چڕووچاو 0 268773 6532345 5866999 2026-09-19T08:19:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532345 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirrûçaw === Navdêr === {{navdêr|ckb}} # [[serûçav]], [[devûlêv]], [[rû]], [[biçim]] 527oabtce86i35h22h0xr6svjt1hkpv چرووسان 0 268775 6532346 5867001 2026-09-19T08:19:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532346 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirûsan === Lêker === {{lêker|ckb}} # [[hincirîn]], [[peritîn]], [[pûç bûn]], [[xespal bûn]], [[xerabe bûn]] itczfqxvanytvomxq9owter2ul71vi8 چرووساندن 0 268776 6532347 5867003 2026-09-19T08:19:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532347 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirûsandin === Lêker === {{lêker|ckb}} # [[peritandin]], [[hincirandin]], [[pûç kirin]], [[xespal kirin]], [[xerabe kirin]] l0ak5g27wjh105ej0qxtkf9sej5uskl چرووساو 0 268777 6532348 5867005 2026-09-19T08:19:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532348 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çirûsaw === Rengdêr === {{rengdêr|ckb}} # [[hinicirî]], [[peritî]], [[xespal]], [[xerabe]], [[xopan]] ppbuycx1cj3ngqsxs5rumu92po7obtc چش 0 268778 6532349 5867043 2026-09-19T08:20:05Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532349 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiş === Hoker === {{hoker|ckb}} # [[vêca]], vêca çi, ango çi, vêca ango çi, ma çi ye, [[de bila]]: Ew naye, çiş! Ew nayê, de bila qet neyê! Ew nayê, ma xema me ye! jw48z97yh90rr9s0pgs0d77t54bucaj چوالە 0 268779 6532350 6433278 2026-09-19T08:20:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532350 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiwale === Navdêr === {{navdêr|ckb}} # [[behîv]], [[bahîv]] (bi taybetî yên kerrik / negihiştî) ==== Anagram ==== * {{anagram|ckb|a=الوچە|چەلاو}} nnrnf7hn6t4pye5d9s2ayvgpb5iodv7 چوارچێوە 0 268781 6532351 5867311 2026-09-19T08:20:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532351 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiwarçêwe === Navdêr === {{navdêr|ckb}} # [[çarçeve]], [[milbend]] 91g1wk39bt9usstu52l0qz3qigmnod7 چواردەور 0 268783 6532352 5867314 2026-09-19T08:20:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532352 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiwardewr === Navdêr === {{navdêr|ckb}} # [[dorber]], [[derdor]], [[hawirdor]], [[dewrûber]] 4ic9hjz3huows5jkt79z38c32x9i0gz چوارەک 0 268784 6532353 5867321 2026-09-19T08:20:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532353 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çiwarek === Navdêr === {{navdêr|ckb}} # [[çarek]], [[çarêk]], yek ji çarê, [[çarêk]], 15 deqe (ji saetê) ck2tjnz8pepsqbw88m15xbvcx3mcktr چیل 0 268789 6532354 5867473 2026-09-19T08:20:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532354 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çîl === Navdêr === {{navdêr|ckb}} # [[mêkew]], kewên mê 51s3txzxkaxqe4krbjdbf9igsj65yc3 چیلەک 0 268791 6532355 6433312 2026-09-19T08:21:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532355 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çîlek === Navdêr === {{navdêr|ckb}} # [[tûtfiringî]], [[çîlek]] ==== Anagram ==== * {{anagram|ckb|a=لچکیە|چیلکە}} kfyp0vk9k9uzyd4stwwqtsgsitw6vld چیم 0 268793 6532356 5867479 2026-09-19T08:21:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532356 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çîm === Navdêr === {{navdêr|ckb}} # [[giya]], [[gîha]], [[şênkatî]] 7ke7ol629dplgne56fksfpxdsy3yopy چیتۆکە 0 268796 6532357 5867426 2026-09-19T08:21:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532357 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çîtoke === Navdêr === {{navdêr|ckb}} # [[çîtok]], [[çîtik]], çîtê bêbiha yan kêmnirx fbji5oen41zmmigma7evc4h9o5x9w8n چۆڵ 0 268798 6532358 5867415 2026-09-19T08:21:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532358 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :[[çoll]] === Navdêr === {{navdêr|ckb}} # [[çol]], (devera) vale / xalî / bêkes / bêtişt 7iq8awjc641vwylf9eyjdeclemys9o1 چۆلاغ 0 268799 6532359 5867417 2026-09-19T08:21:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532359 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çolagh === Rengdêr === {{rengdêr|ckb}} # [[netebitî]], [[venehewayî]], [[nerehet]] (bi taybetî hespê ne hêmin û aram e) qpeuco6j197ypixtdj3grti0y4igaiq چۆلک 0 268800 6532360 5867420 2026-09-19T08:21:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532360 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çolk === Navdêr === {{navdêr|ckb}} # [[destavxane]], [[tiwalet]], [[avdestxane]] k40qhirum7qjmq6lyn6nuvrnpum9f2c چۆپین 0 268807 6532361 5867402 2026-09-19T08:22:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532361 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çopîn === Lêker === {{lêker|ckb}} # [[govend kirin]], [[dîlan kirin]], [[dawet kirin]], [[çopîn]], [[dansîn]], [[reqîsîn]] bp6b8bs2in7brjyqnomlp1r4b7hwhli چۆق 0 268808 6532362 5867413 2026-09-19T08:22:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532362 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çoq === Navdêr === {{navdêr|ckb}} # [[kel]], [[germayî]], pirr germî 7tvodm9qaxxo4kzg31aoqy7y6j94uls چۆڕان 0 268809 6532363 5867406 2026-09-19T08:22:25Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532363 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çorran === Lêker === {{lêker|ckb}} # [[çikîn]], [[miçiqîn]], zuha / ziwa bûn, [[hişk bûn]], av lê neman (bi taybetî çem, rûbar yan co berî ku bigihe deryayê yan avek ji xwe boştir) n261agmu8hiy5s45k8ys94lvhvdwch3 چۆڕاندن 0 268810 6532364 5867409 2026-09-19T08:22:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532364 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çorrandin === Lêker === {{lêker|ckb}} # [[çikandin]], [[miçiqandin]], [[hişk kirin]], [[ziwa kirin]], av jê qut kirin ap9gjvnwp4mj25ugun0z93cduhq2yca چوست 0 268814 6532365 5867386 2026-09-19T08:22:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532365 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çust === Rengdêr === {{rengdêr|ckb}} # [[çist]], [[çeleng]], [[zîrek]], [[liserxwe]], [[bidîsîplîn]] jvldwebt7yhpw25zvngoaic0d204spw چوختی 0 268815 6532366 5867380 2026-09-19T08:22:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532366 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :çuxtî === Rengdêr === {{rengdêr|ckb}} # [[rûqayîm]], [[bêşerm]] sm4m1dni27l97l99j5sb2hw6muxe28s فافۆن 0 268900 6532367 5872031 2026-09-19T08:23:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532367 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fafon === Navdêr === {{navdêr|ckb}} # [[fafon]], [[bafon]], [[aluminyum]] cyxnq7csajjgbpept71yky7wcatzf1i فاک 0 268901 6532368 6433319 2026-09-19T08:23:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532368 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fak === Navdêr === {{navdêr|ckb}} # [[lêb]], [[lêhb]], [[lihb]], [[fêl]], [[dek]], [[dekûdolab]], [[hîle]] ==== Anagram ==== * {{anagram|ckb|a=افک|کاف}} 3tm4yelaq2ckyac7idyev3iusp8mhn6 فاڵ 0 268902 6532369 5872043 2026-09-19T08:23:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532369 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fall === Navdêr === {{navdêr|ckb}} # [[fal]], [[pêşbînîkirin]], diyarkirina bûyerên demên bên, [[telewî]], rewşa mirovekî yan heywanekî ku tê de têkiliya cinsî pirr dixwaze 3rp7tt4yub6793a3cxgku3hin1aul65 فاما 0 268904 6532370 5872057 2026-09-19T08:23:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532370 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fama === Rengdêr === {{rengdêr|ckb}} # [[fama]], [[têgîştî]], [[fehma]] t4pu9siyoem7ecptidc08ou1kdyoj1r فامین 0 268906 6532371 5872067 2026-09-19T08:23:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532371 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :famîn === Lêker === {{lêker|ckb}} # tê gîştin, [[fam kirin]], [[famîn]] cpe8mnxypwamr7m3l0xochyrm6tss6r فانۆس 0 268907 6532372 5872075 2026-09-19T08:23:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532372 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fanos === Navdêr === {{navdêr|ckb}} # [[fanos]], [[lampe]], [[çira]] egl8y211ionsiolfhrukevs04fkj8bg فاقە 0 268908 6532373 5872035 2026-09-19T08:24:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532373 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :faqe === Navdêr === {{navdêr|ckb}} # [[xefik]], [[tepik]], [[faqe]], [[dav]], [[davik]] 2kl7bmo9h9u0mr58n4tuxtvgancppgf فایل 0 268910 6532374 5872081 2026-09-19T08:24:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532374 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fayl === Navdêr === {{navdêr|ckb}} # [[dosye]], [[fayl]], [[belge]] s9c4n3brd640uuomobhw278p6lao8to فەکڵە 0 268911 6532375 6433326 2026-09-19T08:24:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532375 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :feklle === Navdêr === {{navdêr|ckb}} # [[cênîk]] ==== Anagram ==== * {{anagram|ckb|a=فکڵەە|کەفەڵ}} 0shnc7daaacrupz66t5xp21328k3w5s فەلە 0 268912 6532376 5872606 2026-09-19T08:24:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532376 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fele === Navdêr === {{navdêr|ckb}} # [[file]], [[xrîstiyan]], [[mesîhî]], [[îsawî]], [[asûrî]], [[siryanî]] 8vjnfe5wdgqonlrfowo7eh6dgsikiti فەلسەفە 0 268913 6532377 5872605 2026-09-19T08:24:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532377 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :felsefe === Navdêr === {{navdêr|ckb}} # [[felsefe]], [[fîlozofî]] nhqj1zyiqt659s88dp9425culk2m9uy فەقێ 0 268917 6532378 5872602 2026-09-19T08:24:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532378 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :feqê === Navdêr === {{navdêr|ckb}} # [[feqe]], [[feqî]], şagirdê dînî (t îslamê) ea5jtsjcxib3z0glf7wppevoos6aa5m فەرامۆش 0 268920 6532379 5872564 2026-09-19T08:25:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532379 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :feramoş === Rengdêr === {{rengdêr|ckb}} # [[feramoş]], [[nehesibandî]], [[înkarkirî]], [[jibîrkirî]] nwyjkigtfyg4iquwm39q3atsb5h4lwk فەرامۆشی 0 268921 6532380 5872566 2026-09-19T08:25:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532380 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :feramoşî === Navdêr === {{navdêr|ckb}} # [[sersarî]], [[xemsarî]], '': înkar; [[jibîrkirin]], [[ nehesibandin'']] 8qkskspzwmxqxzsxjd32m85q8rbwvsi فەڕاقە 0 268922 6532381 5872562 2026-09-19T08:25:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532381 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferraqe === Navdêr === {{navdêr|ckb}} # [[bend]], [[qeyd]], [[zincîr]] (t yên pî / ling pê tên girêdan) l5o1kjjjaj9id4mkjp9cmg41zit85sc فەڕاش 0 268923 6532382 5872560 2026-09-19T08:25:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532382 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferraş === Navdêr === {{navdêr|ckb}} # [[dergevan]], kesa/ê karûbarên xaniyekî (t yên îdarî) yên mîna malînê dike egpk6fsjgpo12ybrzvnpghdvsrjro0g فەڕدار 0 268924 6532383 5872572 2026-09-19T08:25:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532383 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferrdar === Rengdêr === {{rengdêr|ckb}} # [[1]], [[bihagiran]], [[binirx]], [[hêja]], hejî (tiştekî) 2, [[bikêr]], [[biwec]], [[bikêrhatî]] njpugt4qdpnx3w8axtacwb04733w8ic فەردە 0 268925 6532384 5872574 2026-09-19T08:25:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532384 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferde === Navdêr === {{navdêr|ckb}} # [[ferde]], [[kîs]], [[torbe]], [[tûrik]], [[telîs]] 6as1487hlnzyng2c46ku78qkylsb89i فەریک 0 268929 6532385 5872599 2026-09-19T08:26:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532385 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferîk === Rengdêr === {{rengdêr|ckb}} # [[1]], [[kerrik]], [[kojik]], [[rizik]], çilmik (fêkiyên / keskiyên / sebzeyên) negihayî / negihiştî 2, [[ -terrk]], -kelî: ferîkeqezwan kezwanterrk, kezwanên terr, ferîkenok kelînok, [[kelînuhk]], nokên terr lcjwrgqivs1lt7k098kn9qy61hfw3h5 فەرکاندن 0 268930 6532386 5872584 2026-09-19T08:26:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532386 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferkandin === Lêker === {{lêker|ckb}} # [[ferkandin]], li ber nivîsîn, [[ji ber girtin]], [[kopî kirin]], [[lasa kirin]], [[texlîd kirin]] ltxsfuap5adunybce6fwp2fnoz4sxgy فەرکانە 0 268931 6532387 5872585 2026-09-19T08:26:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532387 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferkane === Navdêr === {{navdêr|ckb}} # [[jibergirî]], [[lasayî]], [[texlîd]] 18ayk6pqkkf9kq6i68wicfilyb5m9by فەرکار 0 268932 6532388 5872582 2026-09-19T08:26:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532388 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferkar === Navdêr === {{navdêr|ckb}} # [[destnîşanî]], tilnîşanî # [[şîret]], [[nesîhet]], [[pêşniya]], [[pêşniyar]], [[pêşniyaz]], [[pêşniyad]], [[teklîf]] nzyv66galrd2bus0tm3sx1kkdwp911v فەرمان 0 268933 6532389 5872586 2026-09-19T08:26:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532389 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferman === Navdêr === {{navdêr|ckb}} # [[ferman]], [[emir]], [[emr]] qnppmw7tnmiz43oudk40zhetcpvfj51 فەرمانبەر 0 268934 6532390 5872587 2026-09-19T08:26:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532390 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fermanber === Navdêr === {{navdêr|ckb}} # [[fermanber]], [[karmend]], [[memûr]], kesa/ê di karek fermî / hukumî de dixebite ja791p5lyy27ag6y74azm7ctbcz9vx9 فەرمانگێڕی 0 268935 6532391 5872590 2026-09-19T08:27:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532391 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fermangêrrî === Rengdêr === {{rengdêr|ckb}} # [[hukumî]], [[fermî]], [[resmî]], [[fermangêrrî]] oqsbq40u96nu2oba8kts2m20i3sjv4k فەرمانی 0 268936 6532392 5872591 2026-09-19T08:27:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532392 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fermanî === Rengdêr === {{rengdêr|ckb}} # [[fermanî]], [[emrî]], [[împeratîv]] m0tzn5plpi7bydrfenm82fxmf93nqgy فەرمانڕەوایی 0 268938 6532393 5872589 2026-09-19T08:27:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532393 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fermanrrewayî === Navdêr === {{navdêr|ckb}} # [[rêveberî]], [[ serok(at)î]], [[serwerî]], [[fermanrewayî]], [[administrasyon]] 9tbhbu6t99q1pohit8ak1cvc4b1moyw فەرمایشت 0 268939 6532394 5872592 2026-09-19T08:27:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532394 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fermayişt === Navdêr === {{navdêr|ckb}} # [[kerem]] :Wek Elî fermayişt kirdûwe, Wek Elî kerem kiriye, (Awayek rêzgirtinê ye li şûna "Wek Elî gotiye") dmufug7a9ar3k1pldb2hs9namrikzsd فەرموون 0 268941 6532395 5872594 2026-09-19T08:27:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532395 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fermûn === Lêker === {{lêker|ckb}} # [[1]], [[kerem kirin]], '':kerem bikin 2'' gotin (t dema rêzgirtin û qedir û qîmet hemberî kesa/ê tiştek gotiye têt nîşandan) Xwa le Quran da fermûyetî ke, Xwedê di Quranê de kerem kiriye ku, [[ (]], gotiye ku, ) (Herwa bi tirraneyî / tinazî jî têt bikaranîn:) "Cenabtan" çî defermê? Çi dibêjî, [[ "ezbenî"?]] kdkuccsxaccy43njhu4eerqapc06weh فەرق 0 268942 6532396 5872580 2026-09-19T08:27:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532396 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferq === Rengdêr === {{rengdêr|ckb}} # [[ferq]], [[cuda]], [[cihê]] r78hx9xzv9i63mpr0z5o5x8vdrof2cg فەرتووت 0 268945 6532397 5872568 2026-09-19T08:28:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532397 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fertût === Rengdêr === {{rengdêr|ckb}} #(kesa/ê ji pîriyê / êxtiyariyê) jitaqetketî, [[bêtaqet]], [[neşê]] bl1exr2gmaeiikomcink4c6ej4q29eb فەروو 0 268946 6532398 5872598 2026-09-19T08:28:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532398 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferû === Navdêr === {{navdêr|ckb}} # [[per]], perûpûrtê bi mirîşk û elokan ve jtwcatz1wkmitt37qgjkcf6p7xmvy7y فەرز 0 268949 6532399 6433332 2026-09-19T08:28:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532399 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferz === Rengdêr === {{rengdêr|ckb}} # [[ferz]], [[gerek]], [[pêdivî]], [[pêwîst]], [[hewce]], [[lazim]] ==== Anagram ==== * {{anagram|ckb|a=رزفە|فرەز}} 745wbpju081layhy13vjvtc1t8gpis6 فەرزین 0 268950 6532400 5872578 2026-09-19T08:28:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532400 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ferzîn === Navdêr === {{navdêr|ckb}} # (di şetrencê de) [[wezîr]] 0ztve9bn6djj0nfgvztpu286ncw6m8y فەسڵ 0 268951 6532401 5872601 2026-09-19T08:28:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532401 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fesll === Navdêr === {{navdêr|ckb}} # [[lihevhatin]], [[sulh]], [[rêkeftin]], [[lihevkirin]], dijminatiya di navbera xwe herdu aliyan de nehêlan 7ifzn5ktbe73tsst4s3s4qyvuas38v1 فەتارەت 0 268954 6532402 5872554 2026-09-19T08:28:55Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532402 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fetaret === Lêker === {{lêker|ckb}} # [[birihîn]], [[telifîn]], [[neman]], ji holê rabûn, ji navê rabûn jo8rf3nzxcaro3772qm5zqk7r7s2iwa فەوتان 0 268956 6532403 5872611 2026-09-19T08:29:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532403 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fewtan === Lêker === {{lêker|ckb}} # [[pûç bûn]], [[wêran bûn]], [[kembax bûn]], [[ruxîn]], [[hilweşîn]] dud985jspe97s90241fn90vlolmrjcz فەوتاندن 0 268957 6532404 5872612 2026-09-19T08:29:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532404 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fewtandin === Lêker === {{lêker|ckb}} # [[pûç kirin]], [[wêran kirin]], [[kembax kirin]], [[ruxandin]], [[hilweşandin]] 3rfjs7l4iwrmjz49bv1q0w9evr8cg5f فەوتاو 0 268958 6532405 5872613 2026-09-19T08:29:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532405 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fewtaw === Rengdêr === {{rengdêr|ckb}} # [[pûç(bûyî)]], [[ wêran(bûyî)]], [[ kembax(bûyî)]], [[ruxî]], [[hilweşî]] kpaxfsbasm3a6huavs73rxkt6nw17z9 فەلەسووف 0 268959 6532406 5872607 2026-09-19T08:29:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532406 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :felesûf === Navdêr === {{navdêr|ckb}} # [[fîlozof]], [[feylesof]] 6wg5chz57carjljilr5ed64o7qyluj5 فەخفووری 0 268960 6532407 5872558 2026-09-19T08:29:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532407 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fexfûrî === Navdêr === {{navdêr|ckb}} # [[ferfûrî]], [[çîn]], [[porselen]] l3dk53fi7amtol9mzmr1zlqi6zvc82m فێڵ 0 268963 6532408 5872530 2026-09-19T08:29:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532408 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fêll === Navdêr === {{navdêr|ckb}} # [[fêl]], [[lêb]], [[lêhb]], [[hîle]], [[dekûdolab]], [[lîstik]] 1h7gaycq6gsoyidjciuzibebbzffey7 فێڵباز 0 268964 6532409 5872532 2026-09-19T08:30:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532409 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fêllbaz === Navdêr === {{navdêr|ckb}} # [[fêlbaz]], [[hîlebaz]], [[lêbker]], [[lêhbker]] 04qra455nevw86z6her9420s63qichu فێڵووفەرەج 0 268965 6532410 5872544 2026-09-19T08:30:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532410 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fêllûferec === Navdêr === {{navdêr|ckb}} # [[dekûdolab]], [[lêb]], [[hîle]], [[fêl]], [[lêhb]], [[xapandin]] hx4r38m5r2ol8hsrk4nqzx3escpmq5l فێرگە 0 268971 6532411 5872508 2026-09-19T08:30:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532411 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fêrge === Navdêr === {{navdêr|ckb}} # [[fêrge]], [[xwendinge]], [[dibistan]], [[qutabxane]], cihê lêfêrkirinê û lêfêrbûnê rf8tspyor0rlv5bbrnb1xmh4ier25lf فێسان 0 268972 6532412 5872514 2026-09-19T08:30:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532412 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fêsan === Lêker === {{lêker|ckb}} # [[şil bûn]], [[şilîn]], [[şilikîn]] 7oo7d4cresp1zjtfrfhwl9ti3eha1lc فڵان 0 268974 6532413 5872448 2026-09-19T08:30:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532413 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fillan === Navdêr === {{navdêr|ckb}} # [[filan]] :~ car filan car(ê), ~ kes filan kes, ~ şit filan tişt, ~ û fîsar filan-bêvan, [[filan û bêvan]] bj9ne8m4a7vkwu43ojq9lugwawf3daa فلیقاندن 0 268975 6532414 5872469 2026-09-19T08:30:55Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532414 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :filîqandin === Lêker === {{lêker|ckb}} # [[meriçandin]], [[merçiqandin]], [[perçiqandin]], [[pelçiqandin]] lbxyyernn6ddl0safsbfxlyqw7eicby فلیقاو 0 268976 6532415 5872470 2026-09-19T08:31:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532415 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :filîqaw === Rengdêr === {{rengdêr|ckb}} # [[merriçî]], [[merçiqî]], [[perçiqî]], [[pelçiqî]], hatî merriçandin / merçiqandin qfrf5pvur2rbmmo8e863q4fwa6o16z6 فڵیتە 0 268977 6532416 5872468 2026-09-19T08:31:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532416 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fillîte === Rengdêr === {{rengdêr|ckb}} # [[felîte]], [[tûle]], [[tolaz]], [[pûç]] nmt3dxtmjxdc1n3uda0b8wvoueswnls فڵتاندن 0 268980 6532417 5872453 2026-09-19T08:31:25Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532417 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :filltandin === Lêker === {{lêker|ckb}} # [[minandin]], [[ mine-min kirin]], bi mine-minkî peyivîn, wa nezelal û dengnizm axivîn ku bi asanî jê neyê famkirin bxz106ri6godhdc6v3ndwku9pkazznp فراژان 0 268986 6532418 5872156 2026-09-19T08:31:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532418 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firajan === Lêker === {{lêker|ckb}} # [[firajîn]], [[peresîn]], [[pêş ketin]], guhertinên wa tê de çêbûn ku ji berê baştir / kêrhatîtir bibe m58z2njhb1ytfgq895mmtqhsfcj4ytw فراژاندن 0 268987 6532419 5872158 2026-09-19T08:31:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532419 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firajandin === Lêker === {{lêker|ckb}} # [[firajandin]], [[peresandin]], [[pêş xistin]], [[pêşve birin]], guhertinên wa tê de çêkirin ku ji berê baştir / kêrhatîtir bibe 05ulgty9qsfz5cmh800p721olnlpmwf فراژیوەر 0 268989 6532420 5872162 2026-09-19T08:31:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532420 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firajîwer === Rengdêr === {{rengdêr|ckb}} # [[firajîwer]], [[guherbar]], tişta diguhere yan dikare biguhere (t, baştir bibe) r6qqgz21vu56zm09ibwlzndn4u818in فرە 0 268992 6532421 5872372 2026-09-19T08:32:05Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532421 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fire === Hoker === {{hoker|ckb}} # [[pirr]], [[gelek]] ct8i9poqlc73s8w6y65340by6x2z9vh فرەبێژ 0 268994 6532422 5872374 2026-09-19T08:32:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532422 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firebêj === Rengdêr === {{rengdêr|ckb}} # [[pirbêj]], [[zêdeaxiv]] f4432elk6l9j7jzkcco2j5icao9ber9 فرەھزبایی 0 268996 6532423 5872377 2026-09-19T08:32:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532423 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firehizbayî === Navdêr === {{navdêr|ckb}} # [[pirrpartîtî]], [[pluralîzm]] 7z78bn4fdsdea9tfqp08tv2p81fonyw فرەیی 0 268997 6532424 5872379 2026-09-19T08:32:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532424 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fireyî === Navdêr === {{navdêr|ckb}} # [[pirrî]], [[gelekî]], [[zêdeyî]], [[mişeyî]], [[zafî]] qa9y8f13o8kzalysfar0mmcooduvk37 فرەز 0 268998 6532425 6433335 2026-09-19T08:32:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532425 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firez === Navdêr === {{navdêr|ckb}} # [[qedîfe]] ==== Anagram ==== * {{anagram|ckb|a=رزفە|فەرز}} rh1lntyvrt9zct0704rhq6kijaffjiq فرەنەتەوەیی 0 268999 6532426 5872376 2026-09-19T08:32:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532426 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fireneteweyî === Navdêr === {{navdêr|ckb}} # [[pirneteweyî]], [[multînasyonal]] blieriwaoxs8nxeot22vjr06rb2edly فڕێ 0 269000 6532427 5872354 2026-09-19T08:33:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532427 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrê === Lêker === {{lêker|ckb}} # [[avêtin]], [[virr kirin]] pdi4yszwc7meo5129h9eh0uisib984a فڕێدراو 0 269001 6532428 5872364 2026-09-19T08:33:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532428 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrêdiraw === Rengdêr === {{rengdêr|ckb}} # [[avêtî]], [[virrkirrî]], [[bêxwedî(hiştî)]], [[bêxudan(hêlayî)]] akuovieyjm1axt1sdpzxmv7o3upndby فڕفینگ 0 269004 6532429 5872272 2026-09-19T08:33:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532429 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrfîng === Navdêr === {{navdêr|ckb}} # [[persîv]], êşa sarmayê ajp70wa26zpzqxt3ai338itunhtkkfq فڕگە 0 269005 6532430 5872284 2026-09-19T08:33:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532430 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrge === Navdêr === {{navdêr|ckb}} # [[firrgeh]], cihê firrîna balafiran nv5u8n4nn0pv6171vee18gcu92g2kt2 فڕن 0 269006 6532431 5872316 2026-09-19T08:33:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532431 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrin === Navdêr === {{navdêr|ckb}} # [[firin]], [[tenûr]] mpzrape9maad224ttrqc1m783znqnup فڕیشتە 0 269010 6532432 5872366 2026-09-19T08:33:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532432 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firîşte === Navdêr === {{navdêr|ckb}} # [[firîşte]], [[melek]], [[melaîket]] bhq6wk4lt3acykuop5s6vwc6bxqf561 فریو 0 269011 6532433 5872368 2026-09-19T08:34:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532433 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firîw === Navdêr === {{navdêr|ckb}} # [[xap]], [[hîle]], [[lêb]], [[lêhb]], [[fêl]], [[dekûdolab]] r3q1gsq4y6akbtzmb7ovli5tfyy3eue فریواندن 0 269012 6532434 5872369 2026-09-19T08:34:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532434 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firîwandin === Lêker === {{lêker|ckb}} # [[xapandin]], [[hîle lê kirin]], dekûdolab lê kirin nmsv8u09sowtn03jrsvwz9sn3z1p2ib فریز 0 269015 6532435 5872365 2026-09-19T08:34:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532435 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firîz === Navdêr === {{navdêr|ckb}} # [[firîz]], giyayek e li mêrg û çîmenan şên dibe fr9e7a6a1czkec3fsrjp495aknwi4sd فڕکان 0 269016 6532436 5872280 2026-09-19T08:34:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532436 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrkan === Navdêr === {{navdêr|ckb}} # [[bîsk]], [[kêlîk]], [[gav]] :Be firrkanêk gerrayewe Di gavekê de vegerî efwhvupld46thjs8tntrv5srrb762jv فڕۆکەنەھێڵ 0 269019 6532437 5872352 2026-09-19T08:34:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532437 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrokenehêll === Navdêr === {{navdêr|ckb}} # [[dij-firoke]], [[ dij-balafir]], çekên dijî firokeyan tên bikaranîn 0btrj6ny2ld9ubtyajdbwcp8w0fgpzb فڕۆکەوان 0 269020 6532438 6342848 2026-09-19T08:34:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532438 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrokewan === Navdêr === {{navdêr|ckb}} # [[firokevan]], [[pîlot]], kesa/ê firokeyan difirîne 3322nj40ra0fuo3wr1p9ddl0p83y19e فرستادە 0 269021 6532439 5872230 2026-09-19T08:35:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532439 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firstade === Navdêr === {{navdêr|ckb}} # [[peyamber]], [[qasid]] 0ux5z3r96qi6bny5gjbuh29mm6d080f فرۆشراو 0 269022 6532440 5872351 2026-09-19T08:35:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532440 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firoşraw === Rengdêr === {{rengdêr|ckb}} # [[firotî]], hatî firotin gcjz7o96vv5hgsgelmu05l5i7ulbjx9 فرشتەنگ 0 269026 6532441 5872246 2026-09-19T08:35:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532441 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firşteng === Rengdêr === {{rengdêr|ckb}} # [[bênteng]], [[bênçik]] === Dijmane === * [[bênfire]] mti382y0ge9v8qwjkp1hk390n6a9arj فرتەنە 0 269027 6532442 5872194 2026-09-19T08:35:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532442 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firtene === Navdêr === {{navdêr|ckb}} # [[firtone]], [[bahoz]], [[barove]], [[tûfan]] 6oigb1cf3ykqt45zzkaqrd7wotbzyd0 فڕووفێڵ 0 269030 6532443 5872348 2026-09-19T08:35:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532443 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrûfêll === Navdêr === {{navdêr|ckb}} # [[dekûdolab]], [[hîle]], [[fenûfêl]] ktq1p7tryczofogp1mfr6noy7qoe1iz فڕوون 0 269031 6532444 5872349 2026-09-19T08:35:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532444 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :firrûn === Navdêr === {{navdêr|ckb}} # [[firin]], [[tenûr]] hzug7oafrcezntfe2whhlz6ykdo4ovw فس 0 269033 6532445 5872382 2026-09-19T08:36:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532445 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fis === Navdêr === {{navdêr|ckb}} # [[fis]], [[fisîn]], [[fisikîn]], dengê fisefisê 7qlymqu6ynl4sudt2ukhye31atsxj78 فسکەفسک 0 269035 6532446 5872390 2026-09-19T08:36:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532446 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fiskefisk === Navdêr === {{navdêr|ckb}} # [[pistepist]], peyivîna bi dengek pirr nizm (t li ber guhê kesekî) joqput2e7r84t3fojevdwlzn6td97hm فشەگاڵتە 0 269037 6532447 5872402 2026-09-19T08:36:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532447 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fişegallte === Navdêr === {{navdêr|ckb}} # [[tirrane]], [[tinazî]], [[qerf]], [[henek]], [[yarî]], [[galte]] g7c83yktl34650emnjgdz2x9sppgrlz فشقیات 0 269039 6532448 5872400 2026-09-19T08:36:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532448 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fişqiyat === Navdêr === {{navdêr|ckb}} # [[qerf]], [[henek]], [[tirrane]], [[galte]], [[yarî]], [[tinazî]] ffeyo6xgwrcth2plq5tr59cc4g52nq5 فتیلە 0 269040 6532449 5872097 2026-09-19T08:36:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532449 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fitîle === Navdêr === {{navdêr|ckb}} # [[fitîl]], fitîlk (wek ya fanosê) h2tmxivb3d7cu3v9k0gne13sc04d3pl فترە 0 269041 6532450 5872083 2026-09-19T08:36:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532450 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fitre === Navdêr === {{navdêr|ckb}} # [[fitre]], [[fitir]] ohzdy1jfkjv72pgxy70m1v8j4k7zzza فتوا 0 269042 6532451 5872091 2026-09-19T08:37:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532451 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fitwa === Navdêr === {{navdêr|ckb}} # [[fitwa]] 30squilmv5ndyptrqn5brkj7ip9vw0e فیچقە 0 269044 6532452 5872498 2026-09-19T08:37:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532452 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîçqe === Navdêr === {{navdêr|ckb}} # [[derzî]], [[kutank]], [[şirînqe]], [[enjeksiyon]] jg75cezi0sgbes932rjzgpknekdz010 فیک 0 269047 6532453 6433344 2026-09-19T08:37:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532453 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîk === Navdêr === {{navdêr|ckb}} # [[fît]], [[fîrr]], [[fîtvedan]], dengê fîtefît ==== Anagram ==== * {{anagram|ckb|a=فکی|کیف}} a7kdc8j36h8zptjjas8kcy717xoq2uz فیکە 0 269048 6532454 6433352 2026-09-19T08:37:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532454 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîke === Navdêr === {{navdêr|ckb}} # [[fîtik]], [[dudik]], [[fîrrfîrrk]], [[fîtok]], [[firîzok]], alava pêfîtînê / pêfîtvedanê ==== Anagram ==== * {{anagram|ckb|a=فکیە|کەیف}} di2fwyednj0uib0ftzu32723dqz13of فیرست 0 269052 6532455 5872506 2026-09-19T08:37:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532455 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîrist === Navdêr === {{navdêr|ckb}} # [[îndeks]], [[fîrist]], [[fihrist]] q0mi7rptgg8ynmfy8m5x8yhsixfnp1c فیڕکە 0 269053 6532456 5872507 2026-09-19T08:37:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532456 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîrrke === Navdêr === {{navdêr|ckb}} # [[fîrrik]], [[fîşik]], [[hinavçûn]], [[zikçûn]], [[îshal]] ml4n1wisurhtaspmepm6ztwaki53971 فیڕۆ 0 269054 6532457 5872509 2026-09-19T08:38:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532457 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîrro === Lêker === {{lêker|ckb}} # (maliyet) [[pûç kirin]], zêde mesref kirin gio6ho5zngmmr7go6t4is27xjp7a8cu فیسان 0 269055 6532458 5872515 2026-09-19T08:38:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532458 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîsan === Lêker === {{lêker|ckb}} # [[şil bûn]], [[şilîn]], [[şilikîn]] 033nylh749f70wli9cwiiov8wvo0p09 فیسەڵ 0 269057 6532459 5872516 2026-09-19T08:38:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532459 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîsell === Rengdêr === {{rengdêr|ckb}} # [[ziwa]], [[hişk]] ==== Hevmane ==== * {{g|ckb|وشک}} l8jae81zbo58fjhvrh75xeqz1yi5xwb فیز 0 269063 6532460 5872510 2026-09-19T08:38:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532460 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîz === Navdêr === {{navdêr|ckb}} # [[qurretî]], [[pozbilindî]] m81nep1j7qd8syq5bbtkq9h2hveu49x فیزار 0 269064 6532461 5872511 2026-09-19T08:38:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532461 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîzar === Navdêr === {{navdêr|ckb}} # [[nalîn]], [[gilî]], [[gazin]], [[xem]], [[derd]], kul û kovan 0w4xfp8o21mzu3f3zd7c9l56t0e2xyd فیزن 0 269065 6532462 5872512 2026-09-19T08:38:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532462 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fîzin === Rengdêr === {{rengdêr|ckb}} # [[qure]], [[pozbilind]] dzz11y0ik0ahfzi5q19i6xwmzdsv4x2 فوودراو 0 269067 6532463 5872495 2026-09-19T08:39:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532463 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fûdiraw === Rengdêr === {{rengdêr|ckb}} # [[pifdayî]], [[perçivandî]], tijî hewa kirî 51p8rsrnpncu9y7qqz7qqpuzpzdbq1t فوورھە 0 269068 6532464 5872496 2026-09-19T08:39:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532464 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :fûrhe === Navdêr === {{navdêr|ckb}} # [[sûlavok]], [[sûlav]] (t biçûk), cihê ava çem / rûbar lê ji bilindayiyekê dikeve erdek nizm r9ic4w7x73u2hrcklbxdjsot9z7xl9l گاگۆڵکێ 0 269073 6532465 5874833 2026-09-19T08:39:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532465 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gagollkê === Navdêr === {{navdêr|ckb}} # [[çarlepk]], meşîna li ser herdu destan û herdu piyan dfoa957t10mhbrm4ayijv7tc7m46rta گاکێوی 0 269074 6532466 5874831 2026-09-19T08:39:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532466 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gakêwî === Navdêr === {{navdêr|ckb}} # [[gakûvî]], gayên kûvî bn4ogg5u46w9u8k0uhhcko726j4adbq گاڵە 0 269076 6532467 6433359 2026-09-19T08:39:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532467 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :galle === Navdêr === {{navdêr|ckb}} # [[qîrrî]], [[qêrrî]], [[qîjî]], [[qêjî]], giriyê bi dengek bilind ==== Anagram ==== * {{anagram|ckb|a=اگڵە|گەڵا}} hc68uw64spkg148uufmr7k2hywhvech گاڵەکوت 0 269077 6532468 5874859 2026-09-19T08:39:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532468 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gallekut === Navdêr === {{navdêr|ckb}} # [[galegot]], [[galgal]], gotinên bêbingeh hz389dgnvlkp8xkhu4r7svpjpcgmiml گالیسکە 0 269078 6532469 5874855 2026-09-19T08:40:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532469 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :galîske === Navdêr === {{navdêr|ckb}} # [[erebe]], [[erebane]] (ya hesp li dû xwe dikêşin) mqmyy5cfop9c8zvxcnf47x3h4f8ym77 گاڵۆک 0 269079 6532470 5874853 2026-09-19T08:40:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532470 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gallok === Navdêr === {{navdêr|ckb}} # [[gopal]], [[kaşok]] (t yên gavanan) 4ynjczm7l8bfhlsesx873jwlyl15akf گاڵتە 0 269080 6532471 5874841 2026-09-19T08:40:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532471 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gallte === Navdêr === {{navdêr|ckb}} # [[qerf]], [[henek]], [[tinaz]], [[tirrane]], [[galte]], [[yarî]], [[şoxî]], [[tinazî]] jhp6u7slc3fmf6vn2mlbb3g98m9dgca گاڵتەبێژ 0 269081 6532472 5874843 2026-09-19T08:40:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532472 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :galltebêj === Navdêr === {{navdêr|ckb}} # [[henekbêj]], [[qerfbêj]], [[tinazbêj]], [[tirraneker]], [[galtebêj]], [[tinazîker]], kesa/ê henekan dike / dibêje ash5c8n7qd3m0wsgt2j7ckduvio6c7l گاڵتەجاڕ 0 269082 6532473 5874845 2026-09-19T08:40:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532473 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :galltecarr === Navdêr === {{navdêr|ckb}} # [[qerfok]], [[pêkenok]], [[qeşmer]] 9sw1b6xguyt66imgfmfx75txfhpl9f4 گاڵتەچی 0 269083 6532474 5874847 2026-09-19T08:40:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532474 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gallteçî === Navdêr === {{navdêr|ckb}} # [[henekbêj]], [[tirraneker]], [[tinazîbêj]] 6v7agq5kp588bo4qd8qtdy9ef7v3g0j گامەڵاس 0 269085 6532475 5874865 2026-09-19T08:41:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532475 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gamellas === Navdêr === {{navdêr|ckb}} # [[serhişkî]], [[dijberî]] g3graiunwrotady3u5izyyyf826v514 گامێش 0 269086 6532476 5874863 2026-09-19T08:41:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532476 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gamêş === Navdêr === {{navdêr|ckb}} # [[gamêş]], [[ga]] ts6hlxxew52s1i8mdysdawr0ozmwv9x گاناوی 0 269088 6532477 6433365 2026-09-19T08:41:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532477 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ganawî === Rengdêr === {{rengdêr|ckb}} # [[seksî]], [[ganawî]] ==== Anagram ==== * {{anagram|ckb|a=اانوگی|گاوانی}} 9jvkba2e4wii4bw3e2fz4ob6nvlrzvq گارەگار 0 269091 6532478 5874809 2026-09-19T08:41:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532478 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :garegar === Navdêr === {{navdêr|ckb}} # [[qidqid]] (dengê mirîşkan) 2s1yopsm79em3mhnmwd8o7oj2xc0alh گاڕس 0 269092 6532479 5874805 2026-09-19T08:41:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532479 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :garris === Navdêr === {{navdêr|ckb}} # [[garis]] mh4d5d75xgaysbkwzua47puo06s7sx0 گاسن 0 269093 6532480 5874827 2026-09-19T08:41:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532480 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gasin === Navdêr === {{navdêr|ckb}} # [[gasin]], [[gêsin]] 82ypa35ldrxnji2nh2rydx49zllvpq7 گاووگۆتاڵ 0 269095 6532481 5874903 2026-09-19T08:42:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532481 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gaûgotall === Navdêr === {{navdêr|ckb}} # [[garan]], koma çêl û gayan e17ojx11hq42lhwjfmhfs2krgig5gc5 گاوارە 0 269099 6532482 5874887 2026-09-19T08:42:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532482 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gaware === Navdêr === {{navdêr|ckb}} # [[dergûş]], [[landik]], cihê lêçêbûna yan jêdestpêkirina tiştekî a398bw6o2r3fuer9eq7gq5mbbtbf4aa گاووس 0 269100 6532483 5874901 2026-09-19T08:42:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532483 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gawus === Navdêr === {{navdêr|ckb}} # [[meşk]] iekiyekwnnd1mp3q6lb4sg9rpepb4gc گایلکە 0 269101 6532484 5874905 2026-09-19T08:42:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532484 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gayilke === Navdêr === {{navdêr|ckb}} # [[hêstir]], [[qantir]] glzk3hcy4iw36qavkubjw225x3q93yy گایی 0 269102 6532485 6433368 2026-09-19T08:42:45Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532485 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gayî === Hoker === {{hoker|ckb}} # [[geyî]], [[ car-carî]], [[carinan]], hin car ==== Anagram ==== * {{anagram|ckb|a=اگیی|گییا}} 8pv46zgi6xlbz13tc8f0a19mhlb62ag گازەرا 0 269103 6532486 5874825 2026-09-19T08:42:55Z JiyanBot 3048 Cure Daçek hat lêzêdekirin 6532486 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gazera === Daçek === {{daçek|ckb}} # [[nav]], [[nêv]], [[nîv]], nava / nêva / nîva tiştekî / derekê ic4bbwfqxvi015sshp3psv9a6k5v5sx گازندە 0 269104 6532487 5874821 2026-09-19T08:43:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532487 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gazinde === Navdêr === {{navdêr|ckb}} # [[gazin]], [[gazind]], [[gazinc]], [[gazinde]], gilî û gazin, [[nalîn]], kul û kovan kj8hgejr9e7j90xqsxldhkk7owvfm66 گازر 0 269106 6532488 5874815 2026-09-19T08:43:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532488 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gazir === Navdêr === {{navdêr|ckb}} # [[spîkirin]] k4bfln2p9v8g6iooid3snll5wjjxq5t گەچ 0 269107 6532489 5875552 2026-09-19T08:43:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532489 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geç === Rengdêr === {{rengdêr|ckb}} # [[gêç]], [[cis]], [[ces]] fwss3ghb9llvki8p4y7mf5eqb38sn4l گەدا 0 269108 6532490 5875553 2026-09-19T08:43:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532490 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geda === Navdêr === {{navdêr|ckb}} # [[geda]], [[parsek]], [[xwestok]], [[ xwazo(k)]] bkj08qnz80o7ovsbw0dji14rwy7uepo گەدایی 0 269109 6532491 5875554 2026-09-19T08:43:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532491 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gedayî === Navdêr === {{navdêr|ckb}} # [[gedatî]], [[parsekî]], [[xwestokî]], [[xwazokî]] 6k6c5t822f68x4ni1tuncohh8q6azca گەدە 0 269110 6532492 5875555 2026-09-19T08:43:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532492 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gede === Navdêr === {{navdêr|ckb}} # [[zik]], ûr bn sik 15uyfdd9tazva1vhb47cship2p8novo گەف 0 269111 6532493 5875615 2026-09-19T08:44:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532493 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gef === Navdêr === {{navdêr|ckb}} # [[gef]], [[hereşe]], [[tehdîd]], [[rey]], [[rew]], hew (dengê se û kûçikan) ja6l5n8k3o9lobybrygp2fe0l2l8m4e گەفین 0 269112 6532494 5875617 2026-09-19T08:44:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532494 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gefîn === Lêker === {{lêker|ckb}} # [[reyîn]], [[rewîn]], [[hewtîn]] (dengê se û kûçikan) 426it1yjr9pklw23r5ci5f7yur9zwwq گەفووگوڕ 0 269113 6532495 5875616 2026-09-19T08:44:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532495 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gefûgurr === Navdêr === {{navdêr|ckb}} # [[gef]], [[tehdîd]], [[hereşe]] 9qx9ark6vlvcmjbhu1446r8d1mahqb6 گەل 0 269114 6532496 5875618 2026-09-19T08:44:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532496 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gel === Navdêr === {{navdêr|ckb}} # [[gel]], [[milet]], [[xelk]], [[mirov]], [[netewe]] dzhq2khmhu1xkmq4dmanj6hbhix88in گەڵادار 0 269116 6532497 5875619 2026-09-19T08:44:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532497 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gelladar === Rengdêr === {{rengdêr|ckb}} # [[peldar]], [[bipel]], [[belgîn]] 2bxtijdravir0xz2t1pkvq6y4iv3uyy گەڵاکوتک 0 269119 6532498 5875622 2026-09-19T08:44:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532498 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gellakutk === Navdêr === {{navdêr|ckb}} # [[şûnik]], darek pan e cil û xalîçe pê tên qutan dema tên şûştin daku baş paqij bibin 2k3eh0tjb4gx59p2kx8uxikhtktzmr1 گەلال 0 269120 6532499 5875623 2026-09-19T08:45:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532499 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gelal === Navdêr === {{navdêr|ckb}} # [[celal]], [[meyav]], [[rûbarok]], [[rûbar]] 5ya5iqhk8719yxrfkbsc75xve94ko4o گەڵاڵە 0 269121 6532500 5875624 2026-09-19T08:45:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532500 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gellalle === Navdêr === {{navdêr|ckb}} # [[pêşnima]], [[miswede]] l94pjaawm08s9b0fq8e705vyq7tjffv گەلھۆ 0 269128 6532501 5875628 2026-09-19T08:45:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532501 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gelho === Rengdêr === {{rengdêr|ckb}} # [[famkor]], [[mejîreş]] sh1z8gmqx2kkog1w0xy1lhyhf3u2atv گەلۆر 0 269130 6532502 5875629 2026-09-19T08:45:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532502 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gelor === Rengdêr === {{rengdêr|ckb}} # [[peledîn]], [[aqilsivik]], [[mejîreş]], [[famkor]], [[xwelîser]], [[delodîn]], [[tirredîn]], [[hepledîn]], [[hepletiraş]] 9uyaqqzynzsgv5nxiwuk5ykuzpy20da گەمارۆ 0 269132 6532503 5875633 2026-09-19T08:45:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532503 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gemaro === Navdêr === {{navdêr|ckb}} # [[dorpêç]], [[dorgirtin]], [[ambargo]] 610iq424uqgqrrje3wqm935264rmzlj گەموورە 0 269134 6532504 5875635 2026-09-19T08:45:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532504 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gemûre === Navdêr === {{navdêr|ckb}} # [[gilîz]], [[tif]], [[bilxem]] f011nh764ld84frdnkwsryy2jp1zl1c گەناندن 0 269135 6532505 5875636 2026-09-19T08:46:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532505 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :genandin === Lêker === {{lêker|ckb}} # [[genandin]], [[genî kirin]], [[rizandin]] 7djk46f39dzz5a66w02vhg43bkg4fv5 گەندووگوو 0 269139 6532506 5875637 2026-09-19T08:46:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532506 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gendûgû === Navdêr === {{navdêr|ckb}} # [[pîsî]], [[qirêjî]], bîna pîs 8a090ko1p6c2yc490h7p6o2op7pe2h4 گەنمە 0 269141 6532507 5875640 2026-09-19T08:46:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532507 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :genime === Navdêr === {{navdêr|ckb}} # [[balûk]] iq6zxzxom0q5n5qjciii9uo4olrxu28 گەنیو 0 269145 6532508 5875643 2026-09-19T08:46:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532508 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :genîw === Rengdêr === {{rengdêr|ckb}} # [[genî]], [[genîbûyî]], [[rizî]], [[riziyayî]] p6aln3j49pvj4xm5o3qobyfhn67778n گەپەگەپ 0 269146 6532509 5875551 2026-09-19T08:46:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532509 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gepegep === Navdêr === {{navdêr|ckb}} # [[devjenkî]], [[suhbet]], [[galgal]], [[galegot]], ''gotinên bêbingeh'' 708odr7kzara7x9ni493ho5qhq662qn گەر 0 269147 6532510 5875556 2026-09-19T08:46:55Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532510 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ger === Hoker === {{hoker|ckb}} # [[ger]], [[eger]], [[heke]], [[heger]], [[heku]] nazygkkyescn3irgbvi98e9r0izis7z گەڕان 0 269149 6532511 5875557 2026-09-19T08:47:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532511 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geran === Lêker === {{lêker|ckb}} # [[gerîn]], [[geriyan]], [[gerihan]], [[hatin û çûn]] h8vykr2h7rqm7rhax4t228m81h4k2kx گەڕانەوە 0 269152 6532512 5875560 2026-09-19T08:47:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532512 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerranewe === Navdêr === {{navdêr|ckb}} # [[vegerrîn]], [[vehatin]], hatin ve g636y61ymb6bmfmmkbd2gydr425bf7l گەردانە 0 269155 6532513 5875562 2026-09-19T08:47:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532513 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdane === Navdêr === {{navdêr|ckb}} # [[gerdenî]], ristika gerdenê 6iimk3bqik8a1v2tjhro2g1ageni9x6 گەرداو 0 269156 6532514 5875563 2026-09-19T08:47:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532514 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdaw === Rengdêr === {{rengdêr|ckb}} # [[1]], [[tevlihev]], serobin 2, [[zivirok]] 5i20tjmjemx3qn3thjl9ez9y4gqas8j گەردنکەچ 0 269159 6532515 5875565 2026-09-19T08:47:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532515 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdinkeç === Rengdêr === {{rengdêr|ckb}} # [[nefsbiçûk]] ppr1hhr5jh7x47wtjswj9tik85wykv2 گەردنکەش 0 269160 6532516 5875566 2026-09-19T08:47:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532516 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdinkeş === Rengdêr === {{rengdêr|ckb}} # [[dijraber]], [[serhildêr]], [[xweragir]], [[mukum]] ia9pqzjday8w8l1vg3rmkvo01krnd1a گەردنکێل 0 269161 6532517 5875564 2026-09-19T08:48:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532517 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdinkêl === Rengdêr === {{rengdêr|ckb}} # [[biînat]], [[înato]] qlicct78a1rd8nhe8crxosrlq4dkcci گەردەش 0 269162 6532518 5875570 2026-09-19T08:48:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532518 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdeş === Navdêr === {{navdêr|ckb}} # [[pevçûn]], [[şerenîx]], [[ajawe]], [[şoreş]] m1g44ikytfjygnuwmfqv7bcg4ae3vde گەردووگەڵا 0 269164 6532519 5875568 2026-09-19T08:48:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532519 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdûgella === Navdêr === {{navdêr|ckb}} # [[elind]], [[berspêde]], [[gizing]], [[berbeyanî]] 5b0sp8z0mv0sjtf0frvdyb5v3ylo2aj گەردوون 0 269165 6532520 5875569 2026-09-19T08:48:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532520 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdûn === Navdêr === {{navdêr|ckb}} # [[gerdûn]], [[kaînat]], erd û esman, [[felek]] q04n361wh4pyvrzh3e60jp5t7skki0k گەردووخول 0 269166 6532521 5875567 2026-09-19T08:48:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532521 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerdûxul === Rengdêr === {{rengdêr|ckb}} # [[zivirok]], [[çerxok]] bwzrqqi05nxnjpq5j5gn6lohqfkgqxu گەرەکی 0 269168 6532522 5875592 2026-09-19T08:48:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532522 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerekî === Navdêr === {{navdêr|ckb}} # [[gerekî]], [[lazimî]], [[hewcetî]], [[pêdivîtî]], [[pêwîstî]], [[divêtî]] 7bpdmn326grl2p3w73fwn8m9cnt4pvy گەڕەلاوژە 0 269170 6532524 5875593 2026-09-19T08:49:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532524 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerrelawje === Navdêr === {{navdêr|ckb}} # [[tevlihevî]], [[serobinî]], [[bêahengî]] bma7xjyvugznm7afflvxbfwxayj2phi گەڕی 0 269171 6532525 5875590 2026-09-19T08:49:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532525 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerrî === Rengdêr === {{rengdêr|ckb}} # [[gerrewî]], [[girrewî]], [[gurî]], [[pîs]], [[lewitî]] lb009rm1hopek9u8l50b52wydgxj1z3 گەرم 0 269173 6532526 5875571 2026-09-19T08:49:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532526 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germ === Rengdêr === {{rengdêr|ckb}} # [[germ]], '': (dax) kel, [[gurî]]; (şîletên) [[tênşîr]], [[tînşîr]], [[ têhnşîr'']] hctbkjeu0hp73wjagb29a9rscle6kcb گەرما 0 269174 6532527 5875572 2026-09-19T08:49:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532527 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germa === Navdêr === {{navdêr|ckb}} # [[germa]], [[germî]] (hewayê germ) l32u56i3hftzrds21u95zrop58l6433 گەرماپێو 0 269176 6532528 5875573 2026-09-19T08:49:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532528 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germapêw === Navdêr === {{navdêr|ckb}} # [[germapîv]], [[germîpîv]], [[termometre]] n8uw99j6lxw15wondjnbxudims2lacb گەرماو 0 269177 6532529 5875575 2026-09-19T08:49:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532529 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germaw === Navdêr === {{navdêr|ckb}} # [[germav]], ava (ji xwe) germ (e û têt bawerkirin ku derman e) gmg6uyl3nbio81itvfm9hmjvdh68n99 گەرماوگەرم 0 269178 6532530 5875576 2026-09-19T08:50:05Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532530 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germawgerm === Hoker === {{hoker|ckb}} # [[tavil]], [[di cî de]], [[serdanpê]] pgwdwg06taf3ilgmipbr15l3az7185i گەرمایی 0 269179 6532531 5875577 2026-09-19T08:50:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532531 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germayî === Navdêr === {{navdêr|ckb}} # [[germî]], [[germayî]], [[germatî]] 08sdwsznwkihyl3kat6hg8s1xfmjf6m گەرمبردوو 0 269180 6532532 5875578 2026-09-19T08:50:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532532 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germbirdû === Rengdêr === {{rengdêr|ckb}} # [[germbirî]], tiştê li ber germayê pûç bûye j7eb0ya5osdy1jzy3yco9eh5ea85g5y گەرمەگلێ 0 269181 6532533 5875584 2026-09-19T08:50:35Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532533 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germegilê === Hoker === {{hoker|ckb}} # [[1]], [[bênavbir]], [[bêbênvedan]], bêîstîrehet 2, navê lîstikek goganê / holanê ye 5qlbritmafyuqw6u84tozouk8xgj3pq گەرمێتی 0 269182 6532534 5875583 2026-09-19T08:50:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532534 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germêtî === Navdêr === {{navdêr|ckb}} # [[germî]], [[germatî]] 5bak163k2nf8l27ql1uqszrl2vkf0ly گەرمیان 0 269183 6532535 5875580 2026-09-19T08:50:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532535 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germiyan === Navdêr === {{navdêr|ckb}} # [[deşt]], [[nizmistan]], '':herêmek e li Başûrê Kurdistanê; germiyan û kiwêstan deşt û zozan'' 974bdowmsbi6bg7pdm7qi5uuom17jxl گەرمیانی 0 269184 6532536 6433380 2026-09-19T08:51:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532536 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germiyanî === Rengdêr === {{rengdêr|ckb}} # [[deştî]], '':xelkê herêma Germiyan li Başûrê Kurdistanê'' ==== Anagram ==== * {{anagram|ckb|a=ارمنگییە|گەرمییان}} aekfkb6zn6hy1rid3ndgk5zgumsoa9a گەرمی 0 269185 6532537 5875579 2026-09-19T08:51:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532537 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :germî === Navdêr === {{navdêr|ckb}} # [[germî]], [[germatî]] gv0zz8i6hw9hjupvon3ulntgwaqtern گەڕۆک 0 269187 6532538 6433389 2026-09-19T08:51:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532538 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerok === Navdêr === {{navdêr|ckb}} # [[gerok]], kesa/ê pirr digere ==== Anagram ==== * {{anagram|ckb|a=ڕکگۆە|کۆڕگە}} k9gyeug2p7xg9k5dx6dfte94mmr40rz گەرووێش 0 269190 6532539 5875586 2026-09-19T08:51:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532539 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerûêş === Navdêr === {{navdêr|ckb}} # [[gewrîêş]], [[hefkêş]], [[anjîn]], [[angîna]] jwuia57ekvpywgh6bzdnjradtaq1it9 گەروانکە 0 269191 6532540 5875585 2026-09-19T08:51:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532540 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gerwanke === Navdêr === {{navdêr|ckb}} # [[pakêt]] 73zb8u7o6jlz2aj903pwpds9s6dd062 گەسکە 0 269193 6532541 5875601 2026-09-19T08:51:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532541 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geske === Navdêr === {{navdêr|ckb}} # [[xeleng]], [[gezik]], giyayê gezik jê tên çêkirin 1kf57lbp3m2ntsuijja53f0g9kafnob گەستن 0 269194 6532542 5875600 2026-09-19T08:52:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532542 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gestin === Lêker === {{lêker|ckb}} # [[gezandin]], [[dan ber didanan]], [[leq lê dan]], [[gestin]], [[gez kirin]], [[leqandin]], '':(mar) pê vedan'' e1jtpc1gilr2mgq7pnjbtkzn0denpha گەشایشت 0 269196 6532543 5875603 2026-09-19T08:52:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532543 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geşayişt === Navdêr === {{navdêr|ckb}} # [[geşedan]], [[firajî]], [[pêşketin]], [[pêşveçûn]] t23muvlecvpltircq670wn516bi1ikz گەشبین 0 269197 6532544 5875604 2026-09-19T08:52:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532544 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geşbîn === Rengdêr === {{rengdêr|ckb}} # [[geşbîn]], [[xweşbîn]], [[hêvîdar]], [[optimîst]], [[umêdewar]] sauky5x4faw86g1ycu70b5qxlskvvm8 گەشبینی 0 269198 6532546 5875605 2026-09-19T08:52:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532546 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geşbînî === Navdêr === {{navdêr|ckb}} # [[geşbînî]], [[xweşbînî]], [[hêvîdarî]], [[umêdewarî]], [[optimîzm]] kpowpzxxsqbwdgjako7ipw6d64ig392 گەشەکردوو 0 269200 6532548 5875614 2026-09-19T08:52:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532548 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geşekirdû === Rengdêr === {{rengdêr|ckb}} # [[gihiştî]], [[pêşketî]], [[pêşveçûyî]] 1zffvnddpqb8wc5q9gcapiqetyuiprq گەشکە 0 269202 6532550 5875611 2026-09-19T08:52:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532550 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geşke === Navdêr === {{navdêr|ckb}} # [[heyranî]], [[şadmanî]], [[mestî]], [[jihalçûn]], [[hîsterî]], [[ekstasî]] 3lgdtkxs9k2ywa6ocryw7donax5eyew گەشتووگوزار 0 269206 6532552 5875608 2026-09-19T08:53:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532552 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geştûguzar === Navdêr === {{navdêr|ckb}} # [[turîzm]] 6oz0a4onpq3y14ykvz58m6zgu6npysy گەشتوەر 0 269207 6532553 5875609 2026-09-19T08:53:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532553 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geştwer === Navdêr === {{navdêr|ckb}} # [[gerok]], [[lêger]] 9sc0m5pw9fi0fpnzozph26g2awj5hp9 گەشتیار 0 269208 6532554 5875610 2026-09-19T08:53:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532554 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geştyar === Navdêr === {{navdêr|ckb}} # [[geşyar]], [[turîst]], [[rêving]], [[rêwî]] 14d2s8dy7cpwq40hqgiko8t9ux8d6ab گەواھ 0 269211 6532555 5875647 2026-09-19T08:53:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532555 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewah === Navdêr === {{navdêr|ckb}} # [[govan]], [[gova]], [[şahid]], kesê bûyerek dîtiye dema qewimiye drjxi1xf5zhubys0xs1a0ou3c9bsuqn گەواھی 0 269212 6532556 5875648 2026-09-19T08:53:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532556 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewahî === Navdêr === {{navdêr|ckb}} # [[govanî]], [[govahî]], [[şahidî]], dîtina qewimîna bûyerekê iynjcxi5b87dsrwm1j31s7a56aprf2x گەوار 0 269214 6532557 5875645 2026-09-19T08:53:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532557 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewar === Rengdêr === {{rengdêr|ckb}} # [[kêrhatî]], [[baş]], [[têr]] (a tiştekî dike), [[saxlem]], [[sax]], [[qenc]] q6p32nkw1enenqtfofxecv4wl6y648e گەوھەربەند 0 269219 6532558 5875654 2026-09-19T08:54:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532558 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewherbend === Rengdêr === {{rengdêr|ckb}} # [[gewerlê]], [[gewerkirî]], [[bigewer]] 0blvofz85f8eh6ua7zioty1a81t34b6 گەوھەردار 0 269220 6532559 5875655 2026-09-19T08:54:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532559 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewherdar === Rengdêr === {{rengdêr|ckb}} # (pirr) [[delal]], [[bedew]], [[rind]], [[xweşik]], [[bingehîn]], [[giring]], [[esasî]] 9yzli6vqcz04ipj3f5m9krvbkk3ehiq گەوەری 0 269222 6532560 5875659 2026-09-19T08:54:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532560 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewerî === Rengdêr === {{rengdêr|ckb}} # [[gewerî]], ji gewer, '': resen; [[bingehîn]], [[esasî]], [[ giring'']] bi13cl0cxr16vqsdsytfbw788qsqnos گەورەیی 0 269225 6532561 5875650 2026-09-19T08:54:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532561 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewreyî === Navdêr === {{navdêr|ckb}} # [[mezinî]], [[mezintî]], [[girî]], [[girsî]], [[zexmî]], [[giringî]] k8i6tcz4ywj7a5a0cc52m57lssisjb1 گەوون 0 269228 6532562 5875657 2026-09-19T08:54:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532562 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gewun === Navdêr === {{navdêr|ckb}} # [[devî]], [[tirraş]], [[kêrat]] 2n7vvk6e07jy4xgrxwt3k10utp8fr32 گەی 0 269231 6532563 5875661 2026-09-19T08:54:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532563 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gey === Navdêr === {{navdêr|ckb}} # [[kerb]], [[kîn]], [[qehr]], [[nefret]], [[nifir]] jlybxy2kdzp7w31ujsow550xuszmk4c گەیشتگە 0 269235 6532564 5875663 2026-09-19T08:55:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532564 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :geyiştge === Rengdêr === {{rengdêr|ckb}} # [[gihiştge(h)]], [[cihê]] (hev)gihiştinê 71j4t13iydv2dg6u6gbgtajt6lmcf3q گەزەن 0 269239 6532565 6433404 2026-09-19T08:55:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532565 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gezen === Navdêr === {{navdêr|ckb}} # [[ziyan]], [[zerer]], [[ezyet]], [[azar]] ==== Anagram ==== * {{anagram|ckb|a=زنگەە|گەزنە}} suie0c8dk09sabu9p65icvxvy5q5dtp گەزنە 0 269243 6532566 6433407 2026-09-19T08:55:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532566 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gezne === Navdêr === {{navdêr|ckb}} # [[gezgezok]], [[gezgezînk]] (giyayek e) ==== Anagram ==== * {{anagram|ckb|a=زنگەە|گەزەن}} 94ri7zdal4he0ofbdk7r1qpj53jas0i گێژاو 0 269246 6532567 5875537 2026-09-19T08:55:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532567 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêjaw === Navdêr === {{navdêr|ckb}} # [[1]], [[serzivirok]], çavzivirok 2, [[pirsgirêk]], [[arîşe]] lwnz89i37kgxoem8g2rxm7dy7oj646o گێژوووێژ 0 269247 6532568 5875538 2026-09-19T08:55:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532568 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêjûwêj === Rengdêr === {{rengdêr|ckb}} # [[gêjelok]], [[mejîreş]], kesa/ê tişt li bîrê namînin û hişên wê / wî ji ser tiştekî diçin yek dî û nikare serdariya hişê xwe bike rfs7l0zjhtf8m9z425mnlyojxrm0zid گێلی 0 269249 6532569 5875548 2026-09-19T08:55:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532569 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêlî === Navdêr === {{navdêr|ckb}} # [[peledînî]], [[aqilsivikî]] dnf8xq9oro3rak8tq8tdrhc5bdus17w گێپەڕە 0 269251 6532570 5875504 2026-09-19T08:56:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532570 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêperre === Navdêr === {{navdêr|ckb}} # [[hefik]], [[sto]], [[hustu]], [[stu]] 2evf86gh5p79ht41epw0fg7pcqmxey1 گێڕان 0 269252 6532571 5875516 2026-09-19T08:56:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532571 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêrran === Lêker === {{lêker|ckb}} # [[1]], [[gerandin]], gêrran 2, (karûbarek) [[meşandin]], [[bi rê ve birin]], '': li dar xistin'' 3qnxclk7eyep3ls7gpnzwtealf5a56l گێرەووکێشە 0 269255 6532572 5875533 2026-09-19T08:56:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532572 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêreûkêşe === Navdêr === {{navdêr|ckb}} # [[şerenîx]], [[xirrenîx]], [[gengeşe]], [[qerqeşe]], [[lihevnekirin]] k1i3y93999t7c8x01540p3webymrmdx گێسوو 0 269256 6532573 5875541 2026-09-19T08:56:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532573 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêsû === Navdêr === {{navdêr|ckb}} # [[bisk]], [[kezî]] (pirça / porrê jinan) 2jeuaan0unrv69pa0l628bhifh2lb46 گێزەر 0 269259 6532574 5875536 2026-09-19T08:56:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532574 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gêzer === Navdêr === {{navdêr|ckb}} # [[gêzer]], [[gizêr]], [[gêzel]] cybnsmyr584eu2jodlwzidmsp9vmmoe گفتووگۆ 0 269261 6532575 5875191 2026-09-19T08:56:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532575 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giftûgo === Navdêr === {{navdêr|ckb}} # [[danûstandin]], [[giftûgo]], [[gotûbêj]], [[mizakere]], '':suhbet; devjenkî'' jap6r9vgb4tokpjpcxsjylef30yzcj6 گلاو 0 269267 6532576 5875227 2026-09-19T08:57:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532576 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gilaw === Rengdêr === {{rengdêr|ckb}} # [[pîs]], kesa/ê ne wa paqij e ku bikare nivêjê bike 9basafilb81qw2rq8gtsqs5v12o7pmk گلەسپی 0 269269 6532577 5875257 2026-09-19T08:57:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532577 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gilespî === Navdêr === {{navdêr|ckb}} # [[tebeşîr]] 8gdsujywlcf0aaci3gvd1f0wi0pdri9 گلەخان 0 269270 6532578 5875256 2026-09-19T08:57:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532578 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gilexan === Navdêr === {{navdêr|ckb}} # [[mexel]], cihê bênvedana lawiran / ajalan / heywanan 4o6lv032amfarau8hsglz08jajqg4wf گلەیی 0 269271 6532579 5875258 2026-09-19T08:57:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532579 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gileyî === Navdêr === {{navdêr|ckb}} # [[gilî]], [[gazin]], gilî û gazin, [[nalîn]] gz4l8kbwwxw1l96rot81b8dsiu2d03i گلێجە 0 269272 6532580 5875251 2026-09-19T08:57:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532580 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gilêce === Navdêr === {{navdêr|ckb}} # [[zik]], [[ûr]] l86dypcxo569fjqtuh8fhfgazeg3ytn گلێر 0 269274 6532581 5875252 2026-09-19T08:57:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532581 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gilêr === Rengdêr === {{rengdêr|ckb}} # [[kom]], [[berhev]] 4m0gl78wvcxpatmzm8eg0mjkuxefncl گلۆفتن 0 269276 6532582 5875248 2026-09-19T08:58:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532582 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giloftin === Navdêr === {{navdêr|ckb}} # (çav) [[perixandin]], [[firikandin]], [[mizdan]] r18cnuk9cibs4hfrh4jy0uq6r9vqudt گڵۆپ 0 269278 6532583 5875247 2026-09-19T08:58:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532583 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gillop === Navdêr === {{navdêr|ckb}} # [[gulop]], [[şewle]], [[lampe]], [[ronahî]], [[çira]] gaj6mp6mqcy8lw5hvygjg7wq9rs65x8 گندۆر 0 269279 6532584 5875282 2026-09-19T08:58:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532584 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gindor === Navdêr === {{navdêr|ckb}} # [[gundor]], [[petêx]], [[talik]], [[kalik]] ftgnohg2at71ygx9dxv909ltd2v7egl گرفتە 0 269280 6532585 5875105 2026-09-19T08:58:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532585 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girifte === Navdêr === {{navdêr|ckb}} # [[pirsgirêk]], [[kêşe]], [[girift]] mn3hefycioj95mm433zncw87g6pg0lu گڕاندن 0 269283 6532586 5874957 2026-09-19T08:58:45Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532586 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girrandin === Lêker === {{lêker|ckb}} # [[sujandin]], [[şewitandin]], [[sotandin]], agir berdanê / vêxistin 2a8jz3rppyn47ibg24viid1h83baha3 گردە 0 269285 6532587 6433418 2026-09-19T08:58:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532587 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girde === Navdêr === {{navdêr|ckb}} # [[hevok]], [[tevok]], [[cumle]] ==== Anagram ==== * {{anagram|ckb|a=درگە|گەرد}} fvw1x57uxl2khtk8j36e0kop7gbhfs3 گردەبا 0 269286 6532588 6433425 2026-09-19T08:59:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532588 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girdeba === Navdêr === {{navdêr|ckb}} # [[babelîsk]], [[bager]] ==== Anagram ==== * {{anagram|ckb|a=ابدرگە|گابەرد}} mhgwt0p0u93zkvofpgg5z5n61ymsiw1 گردەڵە 0 269287 6532589 5875073 2026-09-19T08:59:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532589 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girdelle === Rengdêr === {{rengdêr|ckb}} # [[1]], [[zivirok]], [[dewrok]], [[dorok]], dewra / zivira biçûk 2, [[qelewok]], [[qelew]] si50tjz2e9rs090hu24gwfdrtjafusg گردەپیاو 0 269288 6532590 5875071 2026-09-19T08:59:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532590 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girdepiyaw === Rengdêr === {{rengdêr|ckb}} # [[qut]], [[kin]], [[bejnbost]], [[bejnkurt]] 84o5rdmouxi0xm3q17d8im3yn23msda گردۆکۆ 0 269289 6532592 5875062 2026-09-19T08:59:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532592 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girdoko === Navdêr === {{navdêr|ckb}} # [[berhevok]], tiştek komkirî / berhevkirî jddroz0c7h6su0cxtf4wgdv780o5nl3 گرەو 0 269291 6532593 6433401 2026-09-19T08:59:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532593 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girew === Navdêr === {{navdêr|ckb}} # [[şertanê]], [[qumar]] ==== Anagram ==== * {{anagram|ckb|a=روگە|گەور}} 4bdkrgy0io9f79glni4jqx70w6srdg5 گرێدراو 0 269293 6532594 5875147 2026-09-19T08:59:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532594 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girêdiraw === Rengdêr === {{rengdêr|ckb}} # [[girêdayî]] ba7a972cmkwss4i88j1xp5vf6jnp59i گڕگر 0 269295 6532596 5875108 2026-09-19T09:00:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532596 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girrgir === Rengdêr === {{rengdêr|ckb}} # [[agirgir]], tiştaagir dikare (bi asanî) berbibiyê / vêbikeve 2juah40nqeoxeqjoba1f7h81n4c7kzm گڕگرتوو 0 269296 6532597 5875109 2026-09-19T09:00:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532597 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girrgirtû === Rengdêr === {{rengdêr|ckb}} # [[agirvêketî]], [[geş]], [[gur]] 8lu723q5iakb2acmyj6of40ibkc3cta گرنگی 0 269300 6532598 5875121 2026-09-19T09:00:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532598 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giringî === Navdêr === {{navdêr|ckb}} # [[giringî]], [[ferî]], [[muhîmî]], [[watedarî]], [[şandarî]], [[pûte]] tffuwstlaozepab5qkbaq3ixnhvju4x گریشمە 0 269303 6532600 5875149 2026-09-19T09:00:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532600 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girîşme === Navdêr === {{navdêr|ckb}} # [[nazdarî]], [[qiştik]], [[tewşik]] fe676g1xeeqjz3dgpbdxyx0vgbzaosc گرژی 0 269305 6532601 5875077 2026-09-19T09:00:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532601 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girjî === Navdêr === {{navdêr|ckb}} # [[1]], [[rûtirşî]], buxumîtî 2, [[girmiçîtî]], [[çilmisîtî]] fefyfk0nhtwpmskaz98klg0jd6lk6nn گرمەژنە 0 269306 6532602 5875119 2026-09-19T09:00:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532602 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girmejine === Navdêr === {{navdêr|ckb}} # [[gurmij]], agirê gur û geş h6issrt9qtqizu0ito6ir626w75m52i گرمۆڵەیی 0 269308 6532603 5875118 2026-09-19T09:01:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532603 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girmolleyî === Navdêr === {{navdêr|ckb}} # [[badokî]], [[badayîtî]] 5ujs5lwqaxywupcylqq9oe03983d0fs گڕۆز 0 269310 6532604 5875145 2026-09-19T09:01:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532604 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girroz === Rengdêr === {{rengdêr|ckb}} # [[gazindo]], [[nerazî]] ds9uc21dgtzezqtg76m34xkea2jk5b7 گرس 0 269311 6532605 5875079 2026-09-19T09:01:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532605 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girs === Rengdêr === {{rengdêr|ckb}} # [[bor]], [[boş]], [[asê]], di nav hev re cdcv7dq35f4aihoug4sof8izvp4s0qr گرتەک 0 269312 6532606 5874973 2026-09-19T09:01:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532606 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girtek === Navdêr === {{navdêr|ckb}} # [[girtek]], [[fatura]], [[kupon]] jswygexz0rnldiapgrgr9eszla8gknb گرتوو 0 269315 6532607 5874968 2026-09-19T09:01:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532607 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girtû === Navdêr === {{navdêr|ckb}} # [[girtî]], [[dîl]], [[esîr]], [[êxsîr]] 5z60npvhdugqtg1c6om5u7189or22f0 گرتووخانە 0 269316 6532608 5874970 2026-09-19T09:01:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532608 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girtûxane === Navdêr === {{navdêr|ckb}} # [[girtîxane]], [[zindan]], [[hefs]] tcabcrpj1m1gch4771hn2gw9tyj4483 گروون 0 269318 6532609 5875141 2026-09-19T09:02:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532609 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girûn === Lêker === {{lêker|ckb}} # [[girûn]], çerm / pîst / post ji ser vekirin, ji kevil kirin dclmpe55v39advw6yvy2fcqpmm6xlru گڕوێ 0 269319 6532610 5875142 2026-09-19T09:02:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532610 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girrwê === Navdêr === {{navdêr|ckb}} # [[girrewî]], [[qirêjî]], [[pûrtikî]] 1dhq90l1byeud8ltv9hxt31s56mu4yx گڕوێیی 0 269320 6532611 5875143 2026-09-19T09:02:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532611 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :girrwêyî === Navdêr === {{navdêr|ckb}} # [[girrew]], [[qirêjî]], [[pûrtik]] 1ykz3dm4034ahjlgxxsqj7fwqin4b14 گڤی 0 269326 6532613 6433434 2026-09-19T09:02:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532613 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :givî === Navdêr === {{navdêr|ckb}} # [[borî]], [[boşî]], [[qijavijî]] ==== Anagram ==== * {{anagram|ckb|a=ڤگی|گیڤ}} mjdjjb6vpfzf6zv5qofyebdcvtlrsqm گوێ 0 269328 6532615 5875429 2026-09-19T09:02:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532615 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwê === Navdêr === {{navdêr|ckb}} # [[1]], guh 2, [[rex]], [[serlêv]], [[berlêv]], [[kenar]], [[qerax]] bh52g46uzpxp5rpfurjtns6arn2p0pz گوێبەل 0 269329 6532617 5875432 2026-09-19T09:02:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532617 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêbel === Rengdêr === {{rengdêr|ckb}} # [[guhbel]] t81m9cun7cmiimvxl9hriu5unh6yk7o گوێدێر 0 269330 6532618 5875433 2026-09-19T09:03:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532618 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêdêr === Navdêr === {{navdêr|ckb}} # [[guhdêr]], kesa/ê guh dide tiştekî (wek radyo) lsxnovi6r9vjcj08rg45j4iubflcpp7 گوێگر 0 269332 6532619 5875447 2026-09-19T09:03:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532619 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêgir === Navdêr === {{navdêr|ckb}} # [[guhdar]] 6w0c7w4orp74cpe4x8ehyk86uckhud7 گوێگران 0 269333 6532620 5875448 2026-09-19T09:03:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532620 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêgiran === Rengdêr === {{rengdêr|ckb}} # [[guhgiran]], kesa/ê xweş nabîze, [[dijw]], [[guhsivik]] e4fzu8hqcsoyqe4zh7ihtqhod5wtd0c گوێنی 0 269336 6532621 5875450 2026-09-19T09:03:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532621 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwênî === Navdêr === {{navdêr|ckb}} # [[tûr]], [[kîs]], [[telîs]], [[tûrik]], [[kîsik]], [[telîsk]] havndeo3wxtp49ymt0q06ck6h9rp2fm گوێقوڵاخ 0 269337 6532622 5875445 2026-09-19T09:03:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532622 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêqullax === Rengdêr === {{rengdêr|ckb}} # [[hişyar]], [[guhlê]], [[bidîqet]], kesa/ê guhê wê/wî lê ye ka dê çi biqewime edkc8cht6lnv28psd6zga2maiq36ccx گوێقورس 0 269338 6532623 5875444 2026-09-19T09:03:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532623 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêqurs === Rengdêr === {{rengdêr|ckb}} # [[guhgiran]], kesa/ê xweş nabîze, [[dijw]], [[guhsivik]] fd7l2bnqxi2yevrj2u30emhtw9qw8aw گوێرە 0 269341 6532624 5875434 2026-09-19T09:04:05Z JiyanBot 3048 Cure Daçek hat lêzêdekirin 6532624 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêre === Daçek === {{daçek|ckb}} # [[gor]], [[dû]], [[wek]] :be giwêrey ke dellên li gor ku têt gotin, wek ku tê gotin, angorî gotinê licn01j871rali31pf7rshsdsb0uoil گوێرەکە 0 269342 6532625 5875436 2026-09-19T09:04:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532625 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêreke === Navdêr === {{navdêr|ckb}} # [[golik]], çêla / gayê biçûk û berşîr chiwaxeow9jmtq4iz3tbt57fdxpk3qp گوێڕەپ 0 269343 6532626 5875435 2026-09-19T09:04:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532626 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêrrep === Rengdêr === {{rengdêr|ckb}} # [[guhrep]] i9lduo1o8uc0bi4175gkxoyn6q8gnty گوێزەر 0 269348 6532627 5875440 2026-09-19T09:04:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532627 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giwêzer === Navdêr === {{navdêr|ckb}} # [[gêzer]] mvdlcgtxzo5d5z872ee3s6z5kkb4olr گیایی 0 269359 6532628 5875503 2026-09-19T09:04:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532628 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :giyayî === Rengdêr === {{rengdêr|ckb}} # [[giyayî]], [[gîhayî]], ji giya / gîha 4a0iwgx9mwzrgogwqtrlpwdt7cigphy گزیر 0 269362 6532629 6527428 2026-09-19T09:04:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532629 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gizîr === Navdêr === {{navdêr|ckb}} # (wezîr û) [[gizîr]], [[serok]], [[rêveber]], [[serperiştkar]] == {{ziman|fa}} == === Mane === {{bêcure|fa}} # [[felat]] ==== Anagram ==== * {{anagram|fa|a=رزگی|گریز}} pn28y7q7qjszg0vo7h546dud5f9gw4f گیرا 0 269364 6532630 6527431 2026-09-19T09:05:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532630 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîra === Rengdêr === {{rengdêr|ckb}} # [[bicîhatî]], bicihhatî (tika / daxwaz / dua) == {{ziman|fa}} == === Rengdêr === {{rengdêr|fa}} # [[rûfener]] ==== Anagram ==== * {{anagram|fa|a=ارگی|گاری}} dcyt7hajnzx6v36cm5ovfbl0gwwyqps گیران 0 269365 6532631 6433410 2026-09-19T09:05:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532631 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîran === Lêker === {{lêker|ckb}} # [[hatin girtin]] [[(mang]], xor) xeyirîn, tarî bûn; (şerbet) hatin givaştin (şerbet ji fêkî); (mast) hatin rakirin (sertûk / firû ji ser mast) ==== Anagram ==== * {{anagram|ckb|a=ارنگی|گرانی|گریان}} 95jy9zys1fimqt8dy8a7sztmpt0aupu گیراو 0 269366 6532632 5875518 2026-09-19T09:05:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532632 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîraw === Navdêr === {{navdêr|ckb}} # [[girtî]], hatî girtin, [[xeyirî]], tarîbûyî; givaştî; rakirî, bn gîran 64yaj3lq9spn0ofpmt87xmwp6v9yh45 گیراوە 0 269367 6532633 5875520 2026-09-19T09:05:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532633 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîrawe === Navdêr === {{navdêr|ckb}} # [[têkilî]], [[tevlihevî]] (ya du maddeyên têkilî hev bibin û maddeyek nû peyda bikin) cfbh5gl1qh9bwh66l0gurm2yifcwwqd گیڕەگیڕ 0 269369 6532634 5875532 2026-09-19T09:05:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532634 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîrregîrr === Navdêr === {{navdêr|ckb}} # [[pitpit]], [[gazin]], [[gilî]] (t ne bi zimanek zelal) pdfhwkr2pzvheh1nx1dyw2cjpuo9bta گیرۆ 0 269373 6532635 5875528 2026-09-19T09:05:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532635 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîro === Navdêr === {{navdêr|ckb}} # [[girtî]], '': girêdayî; [[rêgirtî]], rêlêgirtî; (bi nesaxiyekê / nexweşiyekê) ketî'' 83te4bs5l50bhjowian7gsgmir9k1f4 گیرۆدار 0 269375 6532636 5875530 2026-09-19T09:06:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532636 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîrodar === Rengdêr === {{rengdêr|ckb}} # [[serdest]], [[serwer]] i7j13dedp66ljoszxnkkuzvbebmo3fs گیرسانەوە 0 269376 6532637 5875521 2026-09-19T09:06:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532637 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîrsanewe === Navdêr === {{navdêr|ckb}} # [[1]], (li hewa) [[vegirtin]], ne hêlan / hiştin tiştek têt xwarê bikeve erdê 2, [[dadan]], [[nişîn]], [[niştin]], ji hewa hatin û "rûniştin" erdê, bn firroke rn4f2yv3bu5xh7fr32lbq3e5l5k9zca گیرووگرفت 0 269377 6532638 5875527 2026-09-19T09:06:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532638 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîrûgirift === Navdêr === {{navdêr|ckb}} # [[asteng]], [[dijwarî]], [[pirsgirêk]], [[zehmetî]], [[gîrûgirift]], [[arîşe]], [[kêşe]], [[astengî]] 390welnz82di35ei4bscz5vu9hj6err گیشە 0 269379 6532639 6433395 2026-09-19T09:06:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532639 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîşe === Navdêr === {{navdêr|ckb}} # [[gidîş]], giyayê (t genim yan cehê dirûyî) li ser hev hatiye komkirin ==== Anagram ==== * {{anagram|ckb|a=شگیە|گەشی}} 2zer4iz6vso4d6t1wlw7ddpspzoctbi گیڤ 0 269380 6532640 6433431 2026-09-19T09:06:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532640 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gîv === Rengdêr === {{rengdêr|ckb}} # [[gij]], [[qij]], pirç / porr / pûrt / mû dema ne rast û rêk û hilû ye ==== Anagram ==== * {{anagram|ckb|a=ڤگی|گڤی}} ik5ndt22u2avnc9w9rbk7z5ddfe6hop گۆج 0 269384 6532641 5875455 2026-09-19T09:06:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532641 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :goc === Rengdêr === {{rengdêr|ckb}} # [[goc]], ji destên xwe şel û seqet yan jî ne jêhatî / zîrek plknmevyrttufri68j6z1yfj6ovmam0 گۆجی 0 269385 6532642 5875457 2026-09-19T09:07:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532642 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gocî === Rengdêr === {{rengdêr|ckb}} # [[gocî]], şelî û seqetiya yan nejêhatiya / nezîrekiya destan j1tanln1xqyn2qh9mbogjnmyka74oqz گۆگرد 0 269386 6532643 5875482 2026-09-19T09:07:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532643 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gogird === Navdêr === {{navdêr|ckb}} # [[kifrît]], [[nifik]], [[derbik]], [[kirgot]] 0qn1khiswksfowi4gom58bfp7l40jmx گۆڵە 0 269388 6532644 5875483 2026-09-19T09:07:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532644 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :golle === Navdêr === {{navdêr|ckb}} # [[cax]], [[şifşe]], [[bist]], [[bistik]], [[şîş]] qigznkaso15d034q5va10kokvi4lci7 گۆنە 0 269391 6532645 5875487 2026-09-19T09:07:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532645 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gone === Navdêr === {{navdêr|ckb}} # [[awa]], [[şêwe]], [[reng]] gwph4md2idqgbip4f9e3gf07g1026m4 گۆنیە 0 269392 6532648 5875486 2026-09-19T09:07:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532648 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gonye === Navdêr === {{navdêr|ckb}} # [[tûr]], [[kîs]], [[telîs]], [[tûrik]], [[kîsik]], [[telîsk]] hbhqolve740zedqrgb72c2fxl7t7a8a گۆڕستان 0 269394 6532649 5875465 2026-09-19T09:07:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532649 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gorristan === Navdêr === {{navdêr|ckb}} # [[goristan]], cihê goran bk9n7d0rlyqur38z9fj7m9i6edeeart گۆڕان 0 269396 6532650 5875460 2026-09-19T09:08:05Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532650 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gorran === Lêker === {{lêker|ckb}} # [[guherîn]], [[guhorrîn]], hatin guherandin / guhartin, [[bedil bûn]], [[têvel bûn]], wek xwe / berê neman n3r9o6dhe7cm8yepca85qbcjo69nch6 گۆڕاندن 0 269397 6532651 5875461 2026-09-19T09:08:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532651 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gorrandin === Lêker === {{lêker|ckb}} # [[guherandin]], [[guhorrandin]], [[guhartin]], [[bedil kirin]], [[têvel kirin]], wek xwe / berê nehêlan jm21f33i6zxadl4g65dxhzx4gtwwyew گۆڕانکار 0 269399 6532652 5875463 2026-09-19T09:08:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532652 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gorrankar === Rengdêr === {{rengdêr|ckb}} # [[guherbar]], [[guhorrbar]], tişta diguhere yan dikare biguhere d39jcmlnmi0vg0cs0k6q8r853v0xals گۆڕین 0 269404 6532655 5875467 2026-09-19T09:08:35Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532655 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gorrîn === Lêker === {{lêker|ckb}} # [[guherandin]], [[guhartin]], [[guhorrandin]], [[bedil kirin]], [[têvel kirin]], wek xwe / berê nehêlan b5ivvf7ycdnxuv2t6gw1i14bu0gb6oj گۆساڵە 0 269406 6532656 5875472 2026-09-19T09:08:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532656 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gosalle === Navdêr === {{navdêr|ckb}} # [[golik]], têjika çêlan 55s2rip8672yvr1kyvm4hahcrvqwnip گۆشەنیگا 0 269410 6532657 5875480 2026-09-19T09:08:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532657 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :goşenîga === Navdêr === {{navdêr|ckb}} # [[goşenîga]], [[ruxsar]], awayê / cihê lênerînê / jêdîtinê o2yamlzj10afzul1de0zdm6rvmibpta گۆشتن 0 269412 6532658 5875476 2026-09-19T09:09:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532658 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :goştin === Rengdêr === {{rengdêr|ckb}} # [[zexm]], [[qelew]], [[têrgoşt]] pi4ny13tmsyhxe0w2k7xyxhsy001xuo گۆشپارە 0 269413 6532659 5875473 2026-09-19T09:09:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532659 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :goşpare === Navdêr === {{navdêr|ckb}} # [[xilmiş]], [[selix]], birîna sivik tmj9aak3frjbxuejuxkpi5zi6eh4xit گۆشتخۆر 0 269414 6532660 5875475 2026-09-19T09:09:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532660 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :goştxor === Rengdêr === {{rengdêr|ckb}} # [[goştxwer]] rctp2tzv57r8agfrggakeeghjjum5l7 گۆتن 0 269417 6532661 5875454 2026-09-19T09:09:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532661 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gotin === Rengdêr === {{rengdêr|ckb}} # [-llê-] gotin, [[bêjîn]], [[bêjan]] eqofpgbms5uuipl6zrjzu5xkab4egto گۆزەر 0 269420 6532662 5875470 2026-09-19T09:09:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532662 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gozer === Navdêr === {{navdêr|ckb}} # [[cerrçêker]] qb1vxbo0crsu7qjsznafs5mneb7gb59 گۆزەڵە 0 269421 6532664 5875471 2026-09-19T09:09:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532664 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gozelle === Navdêr === {{navdêr|ckb}} # [[cerik]], [[cêrrik]] tqeydm868zba2jru01ahq41g576u19m گوژم 0 269423 6532665 5875329 2026-09-19T09:10:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532665 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gujm === Navdêr === {{navdêr|ckb}} # [[1]], [[tundî]], [[tûjî]], şidet 2, (bejnûbala xwe) [[hejandin]] 9pu3b64e0f7j5mefxxi2mzlud51qs74 گوڵ 0 269425 6532666 5875366 2026-09-19T09:10:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532666 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gull === Navdêr === {{navdêr|ckb}} # [[gul]], [[kulîlk]] smhl6ite2hmq2rzs9askpf21fwmg6ct گولاج 0 269426 6532667 5875368 2026-09-19T09:10:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532667 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gulac === Navdêr === {{navdêr|ckb}} # [[kapsûl]], [[kîsik]] 5uasnx9a7fgbubyc0pv3xd8i36olod0 گوڵاڵە 0 269427 6532668 5875369 2026-09-19T09:10:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532668 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullalle === Navdêr === {{navdêr|ckb}} # (gula) [[nîsanî]], (gula) bûkûzava p87tcuiq46mjym4hc6fjhr4skvrspkh گوڵاو 0 269429 6532669 5875371 2026-09-19T09:10:46Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532669 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullaw === Navdêr === {{navdêr|ckb}} # [[gulav]], ava (ji) gulan eiqvu7nyflsj7bhdicxi460mozuqonl گوڵاوی 0 269430 6532670 5875373 2026-09-19T09:10:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532670 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullawî === Navdêr === {{navdêr|ckb}} # [[1]], [[gulavî]], ji ava gulan 2, [[gulavî]], birrek hirmiyan e 9oivxyttrx9tr7n07ob06wos4ttz6qv گوڵبانگ 0 269432 6532671 5875375 2026-09-19T09:11:05Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532671 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullbang === Navdêr === {{navdêr|ckb}} #(peyva/ banga) bixêrhatin(ê), [[daxwaz]], [[tika]], [[rica]] 889643q3mabzei357ifflotczg03ika گوڵدان 0 269435 6532672 5875378 2026-09-19T09:11:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532672 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gulldan === Navdêr === {{navdêr|ckb}} # [[guldank]], amana gulan dikin tê de yan tê de şên dikin o27q87h1hhye1xfhvpu0r0tecikkc9z گوڵدار 0 269436 6532673 5875377 2026-09-19T09:11:25Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532673 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gulldar === Rengdêr === {{rengdêr|ckb}} # [[guldar]], dara / giyayê gulan dide c69ahrkn12466gcb5wv5pz63wavhew8 گوڵەباخ 0 269437 6532674 5875389 2026-09-19T09:11:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532674 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullebax === Navdêr === {{navdêr|ckb}} # [[sorgul]] rbozr3e7t542bx6vhacv4iifg2amrzp گوڵەچاوێشە 0 269439 6532675 5875393 2026-09-19T09:11:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532675 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gulleçawêşe === Navdêr === {{navdêr|ckb}} # [[beybûn]] 3snxv4y5uq3ugr64dluw3unse6rmla9 گوڵی 0 269441 6532676 5875387 2026-09-19T09:11:55Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532676 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullî === Rengdêr === {{rengdêr|ckb}} # [[gulî]], ji gulan, ji rengê gulan 00powjtq8yo48ple83z750rp0mpy82o گوڵگوڵی 0 269442 6532677 5875382 2026-09-19T09:12:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532677 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullgullî === Rengdêr === {{rengdêr|ckb}} # [[gulgulî]], cil û bergên wêneyên gulan li ser rf1arzanz12f2phs9o8dbmj9ai7hi7d گوڵە 0 269443 6532679 5875388 2026-09-19T09:12:15Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532679 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gulle === Navdêr === {{navdêr|ckb}} # [[gulle]], [[berik]], [[fîşek]] cw1q0er6kekc9pmf71rwcc8yjcg44j5 گوڵەباران 0 269444 6532680 5875390 2026-09-19T09:12:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532680 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullebaran === Navdêr === {{navdêr|ckb}} # [[gullebaran]], [[gullereşan]] gywzaimgxnxbyul9qnxvfbz53m5ye7v گوڵمە 0 269446 6532681 5875384 2026-09-19T09:12:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532681 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullme === Navdêr === {{navdêr|ckb}} # [[tibab]], [[parçe]], parçeyek mezin 7g82ve1bcw8ahqm3aqgjef5if61r6h9 گوڵمێخ 0 269447 6532682 5875383 2026-09-19T09:12:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532682 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gullmêx === Navdêr === {{navdêr|ckb}} # [[sing]], [[mîx]], [[arêx]], [[spîn]] q3j185qwx54box7i40s6940uyltxwc2 گولی 0 269452 6532683 5875386 2026-09-19T09:12:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532683 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gulî === Navdêr === {{navdêr|ckb}} # [[girrew]], [[girrewîtî]], [[pîsî]], [[herrimîtî]] mv48gdeqn8o603mhdtvs2n2zfo0b48w گوم 0 269453 6532684 5875396 2026-09-19T09:13:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532684 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gum === Rengdêr === {{rengdêr|ckb}} # [[wenda]], [[hinda]], [[berze]], [[rêwenda]], [[nediyar]], [[jidestdayî]], [[wendakirî]] iba0fz5ow55igkjjcha32renhh4jduo گومانبار 0 269454 6532685 5875397 2026-09-19T09:13:15Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532685 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gumanbar === Rengdêr === {{rengdêr|ckb}} # [[berşik]], [[gumanbar]], kesa/ê / tişta guman jê tên birin f2j4tzcuvx9tzhnb577ai0uhcvyipc6 گومرک 0 269457 6532686 5875401 2026-09-19T09:13:25Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532686 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gumirk === Navdêr === {{navdêr|ckb}} # [[gumirk]] ts20gy29nobqltdraodfn2932tudys7 گومی 0 269458 6532687 5875403 2026-09-19T09:13:35Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532687 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gumî === Navdêr === {{navdêr|ckb}} # [[wendayî]], [[hindayî]], [[berzeyî]], [[rêwendayî]], [[nediyarî]], [[jidestdan]], [[wendakirin]] p801zg2spra6lss9r2o8vy9h2zw728h گومناو 0 269459 6532688 5875402 2026-09-19T09:13:45Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532688 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gumnaw === Rengdêr === {{rengdêr|ckb}} # [[bênav]], [[nenas]], kesa/ê jêhatîtiyên wê/wî nayên nasîn yan ecibandin muis41qco3b6yxnl5h06y06hwloelkt گوناھ 0 269461 6532689 5875406 2026-09-19T09:13:55Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532689 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gunah === Navdêr === {{navdêr|ckb}} # [[gune]], [[guneh]], [[xirabî]], [[tawan]] mj28lxxtsdld18jh1gqi7s7rpovp73u گوناھبار 0 269462 6532690 5875407 2026-09-19T09:14:05Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532690 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gunahbar === Rengdêr === {{rengdêr|ckb}} # [[gune(h)bar]], [[tawanbar]], kesa/ê gunehek yan çend guneh kirine lldhs6ep55089elx58agplt8rap6kuc گونجان 0 269463 6532691 5875408 2026-09-19T09:14:15Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532691 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guncan === Lêker === {{lêker|ckb}} # (bi) [[kêr hatin]], [[guncîn]], [[lê hatin]] rn10cn4t1qx3pmsdhihzqrjb4pueb25 گونجاندن 0 269464 6532692 5875409 2026-09-19T09:14:25Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532692 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guncandin === Lêker === {{lêker|ckb}} # (bi) kêr anîn, [[lê anîn]], [[guncandin]], wa kirin ku (tiştek) kêrî (tiştekî) bêt 96l98adcol2ygxx93plzga66tuhntjx گونجاو 0 269465 6532693 5875410 2026-09-19T09:14:35Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532693 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guncaw === Rengdêr === {{rengdêr|ckb}} # [[bikêr]], [[bikêrhatî]], [[guncav]], [[lêhatî]], [[kêrhatî]], [[minasib]] m9m3liw0n96t230ve2mf0dhq67jwv5w گوندۆرە 0 269468 6532694 5875412 2026-09-19T09:14:45Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532694 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gundore === Navdêr === {{navdêr|ckb}} # [[gundor]], [[petêx]], [[talik]], [[kalik]] 1g1csi836wvd1xgwzy1496445q0pfsc گوربز 0 269472 6532695 6433260 2026-09-19T09:14:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532695 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurbiz === Rengdêr === {{rengdêr|ckb}} # [[zexm]], [[qayim]], [[bihêz]] ==== Anagram ==== * {{anagram|ckb|a=برزوگ|بزگور}} kj44d5g2n0kcslztixixmsh2ixlculu گوڕە 0 269477 6532696 5875316 2026-09-19T09:15:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532696 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurre === Navdêr === {{navdêr|ckb}} # [[qelebalix]], [[geremol]], [[qerebalix]] hndta0bq2o7ny8uxze36rnsch6rbntc گوڕەشە 0 269478 6532697 5875317 2026-09-19T09:15:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532697 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurreşe === Navdêr === {{navdêr|ckb}} # [[lêxurrîn]], [[gef]], [[tehdîd]] :herreşe û gurreşe gef û gurr 30yq0fwbyh2rl2ggocw6us7qo2u1nrj گوڕەووبڕە 0 269480 6532698 5875319 2026-09-19T09:15:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532698 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurreûbirre === Navdêr === {{navdêr|ckb}} # [[heytûhot]], deng û pêjn, [[qerebalix]], dengê bilind û zêde qgi9qoysb7xlqpokrlwhv20y7ag0j59 گورگانگاز 0 269483 6532699 5875315 2026-09-19T09:15:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532699 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurgangaz === Navdêr === {{navdêr|ckb}} # [[xayîn]], hevalê dijminan tpyty2u78towlxd4838q9zxqcciyrf7 گورزە 0 269486 6532700 6433443 2026-09-19T09:15:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532700 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurze === Navdêr === {{navdêr|ckb}} # [[gurze]], [[prîzma]] ==== Anagram ==== * {{anagram|ckb|a=رزوگە|گوزەر}} 0bp3eou97affrh9i3xittn7gfj6lmff گورزەھۆن 0 269487 6532701 5875314 2026-09-19T09:15:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532701 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurzehon === Navdêr === {{navdêr|ckb}} # [[werîs]], [[bizîng]], [[ben]], [[hebl]] 4dwvjbbxh9m7kot2l7nrhu9hbvz7x3j گورزەتیشک 0 269488 6532702 5875313 2026-09-19T09:16:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532702 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gurzetîşk === Navdêr === {{navdêr|ckb}} # [[tîroj]], [[tîrêj]] t65qyf0axvnmhah4k6b34c7xm2bc19h گوستاخی 0 269490 6532703 5875335 2026-09-19T09:16:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532703 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gustaxî === Navdêr === {{navdêr|ckb}} # [[wêrekî]], [[bisteyî]], [[bêtirsî]], [[netirsî]], [[mêranî]] r0tn44b46bgzn47jh4jtfw9wvbe950p گوشار 0 269491 6532704 5875348 2026-09-19T09:16:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532704 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guşar === Navdêr === {{navdêr|ckb}} # [[givaş]], [[guvaş]], [[şidan]] 6i6r1muo7pur6oqogmku506qqb4xq64 گوشراو 0 269494 6532705 5875359 2026-09-19T09:16:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532705 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guşraw === Rengdêr === {{rengdêr|ckb}} # [[givaştî]], [[guvaştî]], [[şidandî]], [[givişandî]] 9zp6acozr54uv443cyr19k63yt2id6c گوشراوە 0 269495 6532706 5875360 2026-09-19T09:16:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532706 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guşrawe === Rengdêr === {{rengdêr|ckb}} # [[derkişandî]], [[jêkişandî]], [[jêderanî]] 56rr5gv34ui086ayxkpdfgi29s2xc91 گووان 0 269496 6532707 5875421 2026-09-19T09:16:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532707 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guwan === Navdêr === {{navdêr|ckb}} # [[guhan]] (memikên lawiran) ls1ejxsrdmy0itnkh0wqfb4i80tjehn گووارە 0 269498 6532708 5875420 2026-09-19T09:17:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532708 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guware === Navdêr === {{navdêr|ckb}} # [[guhar]], [[guhark]] ry0lnk7e1vdci7aw9v8p1q1vk0rmwbg گووێ 0 269500 6532709 5875427 2026-09-19T09:17:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532709 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guwê === Navdêr === {{navdêr|ckb}} # [[guh]] qny9aaakhovh0gxufjvkr8peb5yx2me گووێچکە 0 269501 6532710 5875428 2026-09-19T09:17:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532710 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guwêçke === Navdêr === {{navdêr|ckb}} # [[guh]] 24dqikhaqgd72y9eq71rp4egyaf7r2p گوزارە 0 269502 6532711 5875320 2026-09-19T09:17:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532711 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guzare === Navdêr === {{navdêr|ckb}} # [[giringî]], [[watedarî]], [[pûte]], [[pûtedarî]], [[ferî]], [[muhîmî]] 26pko88oh0tnj8cow516k18tuvhztoj گوزارەدار 0 269503 6532712 5875321 2026-09-19T09:17:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532712 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guzaredar === Rengdêr === {{rengdêr|ckb}} # [[watedar]], [[giring]], [[pûtedar]], [[fer]], [[muhîm]] 4kkyg7fy4qpmlc2a13yqb3he8g99ahu گوزارەیی 0 269505 6532713 5875322 2026-09-19T09:17:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532713 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :guzareyî === Rengdêr === {{rengdêr|ckb}} # [[razber]], [[abstrakt]] lz5nua1h1xn1jqmnd8bdr8n7ai147qq گووبۆق 0 269511 6532714 5875422 2026-09-19T09:18:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532714 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gûboq === Navdêr === {{navdêr|ckb}} # (qewze) [[kevz]] ku7yxm06yz9vdk4hmujxtz3tqx0d452 گووپ 0 269512 6532715 5875423 2026-09-19T09:18:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532715 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gûp === Navdêr === {{navdêr|ckb}} # [[gep]], [[alek]] 4jbvhtcu4l90j9w2k9zfx47sqj9crw3 گووپن 0 269513 6532716 5875424 2026-09-19T09:18:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532716 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gûpin === Lêker === {{lêker|ckb}} # [[gepîn]], [[gepqelew]] jncgdp0e4p2dpnp7rry7zzou7p3jmul گووران 0 269514 6532717 5875425 2026-09-19T09:18:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532717 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gûran === Lêker === {{lêker|ckb}} # [[dirûvîn]], [[dirist bûn]], [[şikil girtin]] 0wb8oxxfsk4y0goctxzapv2bdpb9svu گووواوی 0 269515 6532718 5875426 2026-09-19T09:18:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532718 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :gûwawî === Rengdêr === {{rengdêr|ckb}} # [[pîs]], [[gûyî]], [[herimî]], [[qirêj]], [[lewitî]] razv5eo7hbho7p38nvvy25ngmxr9idj ھاجی 0 269517 6532719 5878061 2026-09-19T09:18:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532719 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hacî === Navdêr === {{navdêr|ckb}} # [[hecî]], [[hacî]], kesa/ê heca xwe bi cî aniye 678sienvvkau4zamzrqopdofx9o81gj ھاجیلەقلەق 0 269520 6532720 5878065 2026-09-19T09:19:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532720 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hacîleqleq === Navdêr === {{navdêr|ckb}} # [[hacîleglege]], [[leglege]], [[quling]] 75ym2qphk64e85p8yw8n4hj1gvx1qm3 ھاجیرەش 0 269521 6532721 5878064 2026-09-19T09:19:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532721 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hacîreş === Navdêr === {{navdêr|ckb}} # [[hacîreşk]], [[hechecîk]], çivîkek rewş e ai5ycdq538inec82kqi1qtbccajv3ui ھاژ 0 269523 6532722 5878084 2026-09-19T09:19:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532722 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :haj === Rengdêr === {{rengdêr|ckb}} # [[mat]], [[matmayî]], [[ecêbgirtî]], [[sersam]] qutbld8k0y1lrbyycdphd5oslcszdgy ھاکا 0 269525 6532723 5878091 2026-09-19T09:19:39Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532723 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :haka === Hoker === {{hoker|ckb}} # [[haha]], [[aniha]], di vê gavê de 4q16n7jhnij24peh43rgw29kfyy3d7t ھاکم 0 269527 6532724 5878093 2026-09-19T09:19:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532724 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hakim === Navdêr === {{navdêr|ckb}} # (fermanrewa) [[hakim]], [[padişah]], [[fermanber]], [[walî]], [[rêveber]], [[mîr]] # [[(dadgêrr]], serokî dadga) dadgêrr, [[dadger]], [[hakim]], serokê dadgehê qd0lk7xlvlvqzjq75tzt1zo3cv0vbvz ھاکمانە 0 269528 6532725 5878094 2026-09-19T09:19:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532725 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hakimane === Rengdêr === {{rengdêr|ckb}} # [[hakimane]], wek / mîna hakiman, [[hikûmî]], [[hukumetî]], [[fermî]] 4ikyh24bj3bulbwhqp3ksplnlzv9r1p ھاکمێتی 0 269529 6532726 5878095 2026-09-19T09:20:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532726 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hakimêtî === Navdêr === {{navdêr|ckb}} # [[hakimî]], [[hakimtî]], [[rêveberî]], [[fermanberî]], [[hukim]] dizprccyyhmswr0l762wva6x8ca06wj ھاڵ 0 269531 6532727 5878097 2026-09-19T09:20:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532727 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hall === Navdêr === {{navdêr|ckb}} # [[hal]], [[rewş]], [[çawanî]] m2436yd0aww7pb6cnf7q2gjba8xipot ھاڵی 0 269532 6532728 5878100 2026-09-19T09:20:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532728 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hallî === Rengdêr === {{rengdêr|ckb}} # [[serwext]], [[fama]], [[têgihiştî]], [[têgihandî]], [[fehma]] 7o53dneazl3hdfqnynf2f4s47zkngey ھاڵاو 0 269533 6532729 5878099 2026-09-19T09:20:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532729 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hallaw === Navdêr === {{navdêr|ckb}} # [[hilm]], [[buxar]], hewayê germ, ava wa germ bûye ku hildikeve hewa ptn5aqt8prwf2exkziiz25vuglon6us ھاڵەت 0 269534 6532730 6433449 2026-09-19T09:20:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532730 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hallet === Navdêr === {{navdêr|ckb}} # [[rewş]], [[destûdar]], [[hal]] ==== Anagram ==== * {{anagram|ckb|a=اتڵھە|ھەڵات}} sgh7lndn9tpz9f5e7hghi5ajjpwmz27 ھامار 0 269535 6532731 5878102 2026-09-19T09:20:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532731 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hamar === Navdêr === {{navdêr|ckb}} # [[rastgeh]], [[deşt]] boubr5lovkt72x7n7pe2u3crdu8m126 ھامێز 0 269536 6532732 5878103 2026-09-19T09:21:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532732 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hamêz === Navdêr === {{navdêr|ckb}} # [[hemêz]], [[hembêz]], [[koş]], [[dergûş]] kv6x4wtphasq1y9kqq1n7b3svxn7ybw ھاندەر 0 269539 6532733 5878107 2026-09-19T09:21:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532733 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hander === Navdêr === {{navdêr|ckb}} # [[palder]], [[defder]], [[şarîner]], [[sorker]], [[teşwîqker]] gxwj9ectemi8ndz2w7l0igtyy0gvdky ھاندراو 0 269540 6532734 5878106 2026-09-19T09:21:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532734 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :handiraw === Rengdêr === {{rengdêr|ckb}} # [[şarandî]], (li tiştekî) [[sorkirî]], [[teşwîqkirî]], berev (kirina tiştekî) defdayî pc1zv2no0itu7atmt8nfficfcvlg258 ھار 0 269541 6532735 5878067 2026-09-19T09:21:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532735 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :har === Rengdêr === {{rengdêr|ckb}} # [[har]], [[dînûhar]], [[dirinde]], [[venehewayî]], [[bêtebat]], [[şûm]], [[neqet]], [[destmatî]] ferbjp4r6wmyrui1bi9l9oj1cm3x3tz ھاڕاو 0 269542 6532736 5878070 2026-09-19T09:21:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532736 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :harraw === Rengdêr === {{rengdêr|ckb}} # [[hêrayî]], [[hêrandî]], [[destarkirî]], [[ (genimê]], goştê û hwd) hûr-hûrkirî mqjswsjvvl089h8p1p70qo3g44lpuvx ھاریکار 0 269546 6532737 5878077 2026-09-19T09:21:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532737 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :harîkar === Navdêr === {{navdêr|ckb}} # [[alîkar]], [[arîkar]], [[alîkar]] 04r7wn4861q8vdrzr9nmnnelrrun2ev ھاریکاری 0 269547 6532738 5878078 2026-09-19T09:22:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532738 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :harîkarî === Navdêr === {{navdêr|ckb}} # [[alîkar]], [[arîkar]], [[alîkar]] 6dkcv9epwli1x5ca92fzz3hm5kut1yv ھاڕین 0 269548 6532739 5878079 2026-09-19T09:22:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532739 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :harrîn === Lêker === {{lêker|ckb}} # [[hêran]], [[hêrandin]], [[hêrîn]], [[destar kirin]], [[ (genim]], goştê û hwd) hûr-hûr kirin bce9w7n4zrptvzgtov40jvdm4wdyl3e ھاروو 0 269549 6532740 5878072 2026-09-19T09:22:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532740 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :harû === Navdêr === {{navdêr|ckb}} # [[pidû]], [[pû]], [[alûne]], [[pidî]], goştê ber didanan t755guglexel3k5ez5hv1vh8qd51nrz ھارووھوورت 0 269550 6532741 5878073 2026-09-19T09:22:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532741 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :harûhûrt === Navdêr === {{navdêr|ckb}} # [[pozbilindî]], [[qurretî]], xwe mezin hesibandin / kirin n0do6go6t0isecjb0t2c0b9izfonkla ھاشا 0 269551 6532742 5878086 2026-09-19T09:22:49Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532742 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :haşa === Hoker === {{hoker|ckb}} # [[haşa]], ne wa / wisan / wiha / wilo / hosa, '': ji bilî, [[ji xeynî]], [['']], [[ne tê de]]: haşa huzûr haşa huzûr, ji bilî yên amade / hazir / li hizûrê 6wug79bhj40j8mzyjdnk51ddujqkkg8 ھاشووھووش 0 269552 6532743 5878088 2026-09-19T09:22:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532743 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :haşûhûş === Navdêr === {{navdêr|ckb}} # [[dengûdor]], [[qerebalix]], [[qerqeşe]], [[gengeşe]], [[şerenîx]] 88twi8q0cz280564tmmbjhuq5t9q6x1 ھاڤل 0 269556 6532744 5878090 2026-09-19T09:23:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532744 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :havil === Navdêr === {{navdêr|ckb}} # [[havil]], [[xebat]], [[berhem]], [[encam]] pzvdfucq7ymwbg9hw2jxl3rlhmrzssa ھاواھەنگی 0 269557 6532745 5878110 2026-09-19T09:23:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532745 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawahengî === Navdêr === {{navdêr|ckb}} # [[hevahengî]], [[lihevanîn]], [[hevkarî]], ''amadekirina tiştekî bi hev re'' nvdbwm1oqk9bu10fito69b07i26db05 ھاواری 0 269558 6532746 5878109 2026-09-19T09:23:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532746 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawarî === Navdêr === {{navdêr|ckb}} # [[hewarî]], [[berbedel]], [[mînek]] po0af23phhpaj4jy7vj3jvblw8ym442 ھاوارکەر 0 269559 6532747 5878108 2026-09-19T09:23:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532747 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawarker === Navdêr === {{navdêr|ckb}} # [[hewarker]], [[gazîker]], [[bangker]], kesa/ê hewarê dike 17ca1xlceza3j546jwq021s1hdppvvo ھاوبەند 0 269560 6532748 5878113 2026-09-19T09:23:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532748 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawbend === Rengdêr === {{rengdêr|ckb}} # [[hevbend]], [[hevgir]] 4w05tzboiaub7shogd3p8pltklzvkuy ھاوبیر 0 269562 6532749 5878111 2026-09-19T09:23:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532749 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawbîr === Rengdêr === {{rengdêr|ckb}} # [[hevbîr]], [[hemfikir]], kesên (li ser mijarekê) dîtin û baweriyên wan mîna hev in dr30lpz5qka7cd4jjhmtf1gmqi1pfpp ھاوجێ 0 269563 6532750 5878123 2026-09-19T09:24:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532750 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawcê === Rengdêr === {{rengdêr|ckb}} # [[hevber]], tiştên mîna / beramberî hev in i2rpt02jlsk93k31v0qs5r8l2uomyor ھاوجۆت 0 269565 6532751 5878122 2026-09-19T09:24:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532751 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawcot === Navdêr === {{navdêr|ckb}} # [[hevcot]], tiştên tam mîna hev, [[hevtov]], ''zarokên cêwî / hevalcêmik yên ku tam dişibin hev'' 9xwajgefr1uwxmdfib6thibgor36m6v ھاوچاوی 0 269567 6532752 5878126 2026-09-19T09:24:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532752 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawçawî === Navdêr === {{navdêr|ckb}} # [[hevrikî]], [[dijberî]], [[berberkî]], dijîtiya hemberî hev l2gklwtqy7siv0yud424bq80i7bqu2y ھاوچاخ 0 269568 6532753 5878124 2026-09-19T09:24:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532753 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawçax === Rengdêr === {{rengdêr|ckb}} # [[hevçax]], [[hevserdem]], [[hevdem]], eynî demî, [[nûjen]], [[hevçerx]], [[nihoyî]], [[modern]] ducjcvoqb00qbd5y76lvwep8wcrfe47 ھاودەرد 0 269572 6532754 5878134 2026-09-19T09:24:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532754 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawderd === Navdêr === {{navdêr|ckb}} # [[hevderd]], kesên derd û kulên wan eynî ne c0vxuj4keyuex6y9dyc3suxnjprbqdl ھاودین 0 269574 6532755 5878133 2026-09-19T09:24:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532755 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawdîn === Rengdêr === {{rengdêr|ckb}} # [[hevdîn]], [[hevol]], kesên dînê wan eynî ye 4tffy8u4ycoatbbshks7fsa0wge0mpu ھاوەن 0 269575 6532756 6433462 2026-09-19T09:25:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532756 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawen === Navdêr === {{navdêr|ckb}} # [[hawin]] ==== Anagram ==== * {{anagram|ckb|a=انوھە|ھەناو}} j8zh2ycxy1m0rink3gtc044mo1svscg ھاوینھەوار 0 269578 6532757 5878172 2026-09-19T09:25:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532757 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawînhewar === Navdêr === {{navdêr|ckb}} # [[havîngeh]], [[havînwar]], cihê bênvedanê yê havînê hkilx33dlhmses8y95cl3gpqx1s4ht0 ھاویشتن 0 269579 6532758 5878171 2026-09-19T09:25:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532758 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawîştin === Lêker === {{lêker|ckb}} # [[avêtin]], [[havêtin]], [[avêştin]] c26aq46m9jbmwdlgzgcxvv7zo1r9wti ھاوکار 0 269580 6532759 5878157 2026-09-19T09:25:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532759 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawkar === Navdêr === {{navdêr|ckb}} # [[hevkar]], [[hevxebit]], [[hevşol]], kesên / tiştên li gel hev karekî dikin yan dixebitin 1dyntm9xnsgny0vp7spbvbf2cnkjori ھاوکاری 0 269581 6532760 5878158 2026-09-19T09:25:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532760 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawkarî === Navdêr === {{navdêr|ckb}} # [[hevkarî]], [[hevxebat]], [[hevşolî]], karkirina bi hev re, şol kirina li gel hev, xebata pêkve jfjvlfmlxtcq4zaahr7abnpczcrzqtz ھاوکات 0 269582 6532761 5878156 2026-09-19T09:25:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532761 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawkat === Rengdêr === {{rengdêr|ckb}} # [[hevdem]], bûyerên di eynî demê de diqewimin n0tsls9n5osvn2u9v02zrwp6xayq846 ھاوکێش 0 269583 6532762 5878159 2026-09-19T09:26:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532762 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawkêş === Navdêr === {{navdêr|ckb}} # [[hevkêş]], [[paralel]] cbf815k97ryxz5qp41e7wiqj0vwlxi4 ھەڤکێشی 0 269585 6532763 5878639 2026-09-19T09:26:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532763 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hevkêşî === Navdêr === {{navdêr|ckb}} # [[hevkêşe]], [[paralelî]], [[paralelîzm]] 79ehgfsuzb5qobdmj1cy55jh1og2pgv ھاولا 0 269586 6532764 5878161 2026-09-19T09:26:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532764 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawla === Rengdêr === {{rengdêr|ckb}} # [[hevhêl]], [[hevla]], [[hevlayen]], tiştên aliyên wan eynî ne 1jpv53d4mtady3ecyd7l9eku3qfax4s ھاومل 0 269588 6532765 5878163 2026-09-19T09:26:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532765 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawmil === Navdêr === {{navdêr|ckb}} # [[hevnîr]], gayên bi hev re vot pê têt kirin, '':(m) heval, [[hevrê]], [[ hevbar'']] ho2o67498lkz6obod736eq9dx8tald1 ھاوپا 0 269593 6532766 5878114 2026-09-19T09:26:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532766 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawpa === Navdêr === {{navdêr|ckb}} # [[hevtawan]], [[hevguneh]], kesên ziyanek / xirabiyek bi hev re kirine kt5gxr3e03qlea9g4wvi5uunsz8bhe0 ھاوپایە 0 269594 6532767 5878115 2026-09-19T09:26:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532767 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawpaye === Navdêr === {{navdêr|ckb}} # [[hevpaye]], kesên di pileya / dereceya xwe de hindî hev in j0l9yuy4s2ep1nlqzxfgsvkhpl1gda5 ھاوپرسی 0 269596 6532768 5878116 2026-09-19T09:27:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532768 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawpirsî === Navdêr === {{navdêr|ckb}} # [[hevpirsî]], [[suhbet]], pirsîna li halê hev sdt2b014d8s2samvf0afvadm04eij2v ھاوپشت 0 269597 6532769 5878117 2026-09-19T09:27:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532769 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawpişt === Navdêr === {{navdêr|ckb}} # [[hevpişt]], [[hevpal]], kesên alîkariya hev dikin 3pq51oxzaq21f2v77sdykyay344uhx4 ھاوراز 0 269598 6532770 5878136 2026-09-19T09:27:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532770 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawraz === Navdêr === {{navdêr|ckb}} # [[hevraz]], kesên tiştek / tiştên hev yê(n) raz / nepenî / nehînî dizanin 43bakftbjtl6zidii33wl86zlsi09zj ھاوڕێ 0 269599 6532771 5878137 2026-09-19T09:27:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532771 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawrrê === Navdêr === {{navdêr|ckb}} # [[heval]], [[hevrê]], [[hogir]], [[dost]], [[birader]] 0w5omxaea46indntkzepmel421451gi ھاوڕێتی 0 269600 6532772 5878138 2026-09-19T09:27:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532772 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawrrêtî === Navdêr === {{navdêr|ckb}} # [[hevalî]], [[hevaltî]], [[hevalînî]], [[hevrêtî]], [[hogirî]], [[dostî]], [[biraderî]] 3ix94fcjxo7m2wg5nal9eimxkx0togq ھاوساڵ 0 269601 6532773 5878143 2026-09-19T09:27:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532773 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawsall === Navdêr === {{navdêr|ckb}} # [[hevjî]], [[hevtemen]], [[hevsal]], kesên jiyê / temenê wan hindî hev e 6wsfyrp64a82as9rlutjhhcfo6rc904 ھاوسامە 0 269602 6532774 5878144 2026-09-19T09:28:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532774 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawsame === Rengdêr === {{rengdêr|ckb}} # [[hevbînahî]], [[hevbîr]], [[hemfikir]], kesên baweriya / bînahiya / dinyabîniya wan wek hev e 71v1wflkhidsh6akbk90wveqz7cmmto ھاوساز 0 269603 6532775 5878142 2026-09-19T09:28:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532775 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawsaz === Rengdêr === {{rengdêr|ckb}} # [[hevgir]], [[hevsaz]], [[hevkêr]], tiştên kêrî hev tên mi5jsfgdsw8px4ed8gjy55kdmjm1v1j ھاوسەنگی 0 269606 6532776 5878151 2026-09-19T09:28:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532776 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawsengî === Navdêr === {{navdêr|ckb}} # [[hevsengî]], [[serbiserî]], [[balans]] fuqqinsjbvpsm0t9d0ou5npgkqjshu1 ھاوسەر 0 269607 6532777 6433470 2026-09-19T09:28:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532777 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawser === Navdêr === {{navdêr|ckb}} # [[şû]], [[hevser]], jina yan mêrê kesekê/î ==== Anagram ==== * {{anagram|ckb|a=ارسوھە|ھەوسار}} g6fuxh5lp0pl3jobxfs907a6vys5sxg ھاوسنوور 0 269608 6532778 5878145 2026-09-19T09:28:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532778 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawsinûr === Rengdêr === {{rengdêr|ckb}} # [[hevtixûb]], [[hevsinor]], cihên (t welatên) sinorên wan bi hev re ne ec5lp9stiradr1ka3n83zxpvfhqq20r ھاوسوێندی 0 269610 6532779 5878147 2026-09-19T09:28:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532779 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawsiwêndî === Navdêr === {{navdêr|ckb}} # [[hevsozî]], [[hevsondî]], [[hevpeymanî]], [[komplo]] iy1flzzvdm6hpu2t3yapq47ex69vek0 ھاوشان 0 269611 6532780 5878153 2026-09-19T09:29:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532780 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawşan === Rengdêr === {{rengdêr|ckb}} # [[hevmil]], kesên di pileya / asta / dereceya hev de, [[hevta]], ''kesên hindî hev zîrek / jêhatî'' 9a77wpa6y5ajtailpe9ik025qp2e5k5 ھاوشار 0 269612 6532781 5878152 2026-09-19T09:29:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532781 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawşar === Navdêr === {{navdêr|ckb}} # [[hevbajar]], [[hevşar]], [[hemşerî]], kesên ji eynî bajarî rk9vp67ik5ecwc1e2eot9mbyh240o4p ھاوشیرە 0 269614 6532782 5878154 2026-09-19T09:29:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532782 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawşîre === Navdêr === {{navdêr|ckb}} # [[hevşîr]], kesên şîrê eynî dayikê xwarine lê ne ji eynî dayikê ne gqr36mowk4qquspokc4hixv14xt3w8w ھاوتا 0 269615 6532783 5878119 2026-09-19T09:29:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532783 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawta === Rengdêr === {{rengdêr|ckb}} # [[hevta]], kesên hindî hev zîrek / jêhatî / xurt û hwd n52u5tmii1wh5efjcngk7bn55dmfei5 ھاوتەک 0 269616 6532784 5878120 2026-09-19T09:29:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532784 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawtek === Navdêr === {{navdêr|ckb}} # [[pêvek]], [[pêrek]], tiştê(n) bi hinek / yek dî ve / re o85sbqv9dyprefiedpmm38yh4grf9z1 ھاوتەمەن 0 269617 6532788 5878121 2026-09-19T09:29:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532788 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawtemen === Navdêr === {{navdêr|ckb}} # [[hevjî]], [[hevtemen]], kesên jiyê / temenê wan hindî hev e 24rzp4ffim5hfdxooqhwi0addtuyepv ھاووڵاتی 0 269619 6532789 5878169 2026-09-19T09:30:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532789 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawwillatî === Navdêr === {{navdêr|ckb}} # [[hevwelatî]], kesa/ê ji welatekî ye û mafê wê / wî yê asayî wek ya / yê herkesa li wî welatî dijî heye rtmxk20axxubi9fatjyr1ccivmjfcpe ھاوخاک 0 269620 6532790 5878130 2026-09-19T09:30:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532790 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawxak === Navdêr === {{navdêr|ckb}} # [[hevax]], [[cîran]] 8xhjgxmz43dhqfylc6ja4dyhysvo0wf ھاوزمان 0 269624 6532791 5878140 2026-09-19T09:30:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532791 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hawziman === Rengdêr === {{rengdêr|ckb}} # [[hevziman]], kesên bi eynî zimanê wan (yê zikmakî) eynî ye drgk29k1psttedb0srw3gicegyrdv60 ھازر 0 269626 6532792 5878082 2026-09-19T09:30:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532792 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hazir === Rengdêr === {{rengdêr|ckb}} # [[amade]], [[hazir]] 3c2n4u9xhsc4cwxtfi084zxfsalxgq1 ھازری 0 269627 6532793 5878083 2026-09-19T09:30:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532793 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hazirî === Navdêr === {{navdêr|ckb}} # [[hazirî]], [[amadeyî]] csebggfy44etcvq3cxgpgfub0pi5fbl ھەب 0 269629 6532794 5878527 2026-09-19T09:30:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532794 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heb === Navdêr === {{navdêr|ckb}} # [[heb]], [[hebik]], [[tablet]], dermanê lib-lib qqxk6ms7hc589p29ivwkv2rflwp1qhm ھەد 0 269631 6532795 5878549 2026-09-19T09:31:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532795 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hed === Navdêr === {{navdêr|ckb}} # [[hed]], [[sinor]], [[tixûb]], [[rade]], [[ast]] # [[wêrekî]], [[bistehî]] qxly9ragykyudm9yvebwdsuwr2d3yjd ھەدیس 0 269632 6532796 5878550 2026-09-19T09:31:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532796 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hedîs === Navdêr === {{navdêr|ckb}} # [[hedîs]], pendên / şîretên / çîrokên têt bawerkirin ji devê Mihemed Pêxember in 5y7gvvbjjrdbeaexp4bef0y5u4fzw75 ھەفتانە 0 269635 6532797 5878634 2026-09-19T09:31:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532797 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heftane === Rengdêr === {{rengdêr|ckb}} # [[heftane]], meaşê heft rojan, [[hefteyî]], ''tişta her hefte (carekê) dibe'' sy047dj4iozi2djvl6p19md1ix1mzg5 ھەفتە 0 269636 6532798 5878635 2026-09-19T09:31:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532798 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hefte === Navdêr === {{navdêr|ckb}} # [[hefte]], [[heftî]], heft roj, yekîneyek demî ye ji heft rojan pêk têt ehs7ladwu6mjew76ur8lad5kdg4z0ly ھەفتەیی 0 269637 6532799 5878636 2026-09-19T09:31:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532799 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hefteyî === Rengdêr === {{rengdêr|ckb}} # [[hefteyî]], tişta her hefte (carekê) dibe k2cf9p1b6y8o42z5xcdadz4n4ue15vr ھەژان 0 269638 6532800 5878602 2026-09-19T09:31:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532800 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hejan === Lêker === {{lêker|ckb}} # [[hejîn]], [[hejiyan]], [[hejihan]], [[hatin hejandin]], [[şilqîn]], [[qeliqîn]], [[livîn]], '':(wurûjan) arîn, [[ariyan]], [[ arihan'']] akhf81u4c9xb1yhbmn0m10dm1ohlfb2 ھەژاندن 0 269639 6532801 5878603 2026-09-19T09:32:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532801 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hejandin === Lêker === {{lêker|ckb}} # [[hejandin]], [[şilqandin]], [[qeliqandin]], [[livandin]], '':(wurûjandin) arandin'' 3k0mwcp36bx44u31hvomaq528mk8c5g ھەژاری 0 269641 6532802 5878601 2026-09-19T09:32:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532802 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hejarî === Navdêr === {{navdêr|ckb}} # [[hejarî]], [[jarî]], [[belengazî]], [[feqîrî]], [[rebenî]], [[destkurtî]] kkjg72nfam3t9v0raro4lg30uhbuq2k ھەژەند 0 269643 6532803 5878607 2026-09-19T09:32:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532803 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hejend === Rengdêr === {{rengdêr|ckb}} # [[hejok]], [[qeliqok]], [[livok]], [[venehewayî]] j0m957ytp20w10x32u5ad0mo46jodct ھەژێنەر 0 269644 6532804 5878606 2026-09-19T09:32:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532804 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hejêner === Rengdêr === {{rengdêr|ckb}} # [[hejîner]], [[qeliqîner]], [[livîner]], ya / yê dihejîne, [[arîner]], ya / yê diarîne panxosx6ptmcuk2e5iive8o4hpzu8jp ھەژگ 0 269645 6532805 5878605 2026-09-19T09:32:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532805 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hejg === Navdêr === {{navdêr|ckb}} # [[1]], [[çeq]], [[çiqil]], [[çeqik]], çikilk (yên daran / deviyan / tirraşan) 2, [[zend]], [[dest]], [[pî]], [[ling]] auuedp5fkbkxml5z3nt4p509wresopf ھەکیم 0 269646 6532806 5878643 2026-09-19T09:32:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532806 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hekîm === Navdêr === {{navdêr|ckb}} # [[hekîm]], [[bijîşk]], [[nojdar]], [[dermanker]], [[luqman]] l5lfnibiyf9iclfcqpytmvc9njpntht ھەل 0 269647 6532807 5878645 2026-09-19T09:33:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532807 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hel === Navdêr === {{navdêr|ckb}} # [[delîv]], [[derfet]], [[firset]], [[fersend]], [[mecal]], [[keys]], [[car]], [[gav]], [[dem]], [[kêlîk]], [[bîsk]], [[hal]], [[neql]] kdhoz8xp9c0qjvd6arq2xxt7luxshkk ھەڵاڵ 0 269649 6532808 5878649 2026-09-19T09:33:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532808 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellall === Rengdêr === {{rengdêr|ckb}} # [[pûyîn]], [[debax]], [[helal]], [[rewa]], [[durist]], ''tiştê (bi taybetî ji alî dînî ve) destûr heye bêt kirin'' 6ssrttvqlbtv50ao46oikznoaxd4589 ھەڵامەت 0 269651 6532809 5878652 2026-09-19T09:33:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532809 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellamet === Navdêr === {{navdêr|ckb}} # [[persîv]], [[arsim]], [[harîk]], [[zekem]], [[asrîm]], [[sarma]] 4jhh34s6g8azx48dvgh17pfs9udgqda ھەڵامسان 0 269653 6532810 5878651 2026-09-19T09:33:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532810 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellamsan === Navdêr === {{navdêr|ckb}} # [[enflasyon]], bihabûna tiştan û daketina qîmetê pare 13nj9bbmpz1tcqaofgd70cof0gcn4xl ھەلانە 0 269654 6532811 5878654 2026-09-19T09:33:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532811 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helane === Navdêr === {{navdêr|ckb}} # [[zembîl]], [[sepet]] j4sbheljmg3gle81qklud5pab96wy28 ھەلات 0 269655 6532812 5878646 2026-09-19T09:33:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532812 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helat === Navdêr === {{navdêr|ckb}} # [[meth]], [[pesn]] (t yên bêbingeh) odebt2i7k5anxq7ad7i6euy6zt7w3s3 ھەڵاوێز 0 269658 6532813 5878659 2026-09-19T09:34:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532813 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellawêz === Rengdêr === {{rengdêr|ckb}} # [[hilawîstî]], [[daliqandî]], (bi dîwar / ristê ve) [[kirî]] 2zebkszr1o7movkwrvw8vcw8tzbgjhd ھەڵاوردن 0 269660 6532814 5878657 2026-09-19T09:34:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532814 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellawirdin === Lêker === {{lêker|ckb}} # [[ji hev kirin]], [[ji hev cuda kirin]], [[ji hev veqetandin]] rjq8j698zmfpg96fm75m9khrez58f3p ھەڵاوسان 0 269661 6532815 5878658 2026-09-19T09:34:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532815 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellawisan === Lêker === {{lêker|ckb}} # [[1]], [[werimîn]], perçivîn 2, [[berfire bûn]], [[belav bûn]] sm3h1v5htevenvkua2fltoem72eckrl ھەڵبەستە 0 269664 6532816 5878673 2026-09-19T09:34:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532816 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbeste === Navdêr === {{navdêr|ckb}} # [[helbest]], t çîrok yan dersa wek helbestê vehûnandî / lihevînayî jmk455biqmpi46wjpmi7tg1azbwt04j ھەڵبەستن 0 269665 6532817 5878672 2026-09-19T09:34:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532817 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbestin === Lêker === {{lêker|ckb}} # [[li hev anîn]], [[çêkirin]] (t derek yan tiştek bo xapandin û lêb û hîleyan) m54z4kvouf6p73tz0klvm8dv7lsehit ھەڵبەستراو 0 269666 6532818 5878671 2026-09-19T09:34:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532818 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbestiraw === Rengdêr === {{rengdêr|ckb}} # [[hûnandî]], [[vehûnandî]], [[lihevînayî]] # [[lihevînayî]], [[çêkirî]], [[çêkirok]], [[xapînok]], [[lêbok]] ok16lj0l1ih0ge99n24z5fvd2xxqhwp ھەڵبژێر 0 269669 6532819 5878667 2026-09-19T09:35:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532819 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbijêr === Navdêr === {{navdêr|ckb}} # [[hilbijêr]], ya/yê ku hildibijêre yan jî mafê hilbijartin û dengdanê heye, [[;hilbijêr]], ''ya / yê (hin kesan / tiştan) dibijêre; ya / yê mafê wê / wî yê dengdanê di hilbijartinan de heye'' hpjpz2y8p7lo31cd3yoc8vv086f8ix7 ھەڵبژار 0 269670 6532820 5878664 2026-09-19T09:35:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532820 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbijar === Rengdêr === {{rengdêr|ckb}} # [[hilbijar]], ya/yê tê yan dikare bê hilbijartin # [[bijare]], tiştên hêja / berkeftî / hezkirî gag6wnzf8ztrvvpumiat20mdtkomacu ھەڵبژاردە 0 269671 6532821 5878666 2026-09-19T09:35:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532821 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbijarde === Rengdêr === {{rengdêr|ckb}} # [[bijare]], tiştên hêja / berkeftî / hezkirî, [[hilbijartî]], [[bijartî]], yên ku hatine bijartin 6vdq73tkn0rzwrqcvfu1c00doqoredq ھەڵبژێڕاو 0 269672 6532822 5878668 2026-09-19T09:35:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532822 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbijêrraw === Rengdêr === {{rengdêr|ckb}} # [[hilbijartî]], ya/yê hatiye hilbijartin 8zzlpy57v45h1utqsoswt7dswz573tr ھەڵدان 0 269673 6532823 5878720 2026-09-19T09:35:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532823 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helldan === Navdêr === {{navdêr|ckb}} # [[hilavêtin]], [[;hilavêtin]], avêtin hewa; (firrfirrok) hilfirrandin; (çadir, [[kûn]], xîvet) vedan; (zêde) pesnên / methên kesekî / tiştekî kirin; (gotina kesekî) vebirrîn; geş bûn, xemlxweş bûn 818k1ppnxu7duo64r221ovrwglkw5rl ھەڵبڕین 0 269674 6532824 5878661 2026-09-19T09:35:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532824 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbirrîn === Lêker === {{lêker|ckb}} # [[hilketin]], [[rabûn]], [[bilind bûn]] # (ronahî) [[hilbûn]], [[vêketin]], [[berbûn]], [[geş bûn]], gurr bûn 3) rê lê girtin, bersîng lê gir # [[rê lê girtin]], bersîng lê girtin (t li êrişên dijmin û nehiştin dijmin bi pêş bikeve) mnx1i7nu0zhrz79om0t9d240r5cgizc ھەڵبرواندن 0 269675 6532825 5878660 2026-09-19T09:36:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532825 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellbirwandin === Lêker === {{lêker|ckb}} # [[meriçandin]], [[merçiqandin]], [[perçiqandin]], [[zirviçandin]] 15idzjojuu7i6gg57tcp0obnnywqcfs ھەڵچنین 0 269679 6532826 5878708 2026-09-19T09:36:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532826 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellçinîn === Lêker === {{lêker|ckb}} # [[nijinîn]], [[nijinandin]], [[gidîş kirin]], (li ser hev) kom / berhev kirin, '':dîwar danîn #(av yan ruhniyek dî) mêtin / mijîn (xwe)'' peskr84q91y0a1gsjor4bp5vrvkt8uf ھەڵچوون 0 269681 6532827 5878709 2026-09-19T09:36:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532827 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellçûn === Navdêr === {{navdêr|ckb}} # [[firûn]] (t şîr dema zêde germ dibe û di ser qazanê / qûşxanê re diavêje) # [[hilketin]], [[hewa ketin]], berev jor / serî / silal çûn 4itqmbh3fcnw1um30g0gjcnnz9dds07 ھەڵدڕان 0 269684 6532828 5878722 2026-09-19T09:36:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532828 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helldirran === Navdêr === {{navdêr|ckb}} # [[dirîn]], [[çirîn]], [[peritîn]], hatin dirandin / çirandin / peritandin echvhrvbarel9md5li7m0s2gw8zl8hn ھەڵدڕین 0 269686 6532829 5878726 2026-09-19T09:36:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532829 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helldirrîn === Lêker === {{lêker|ckb}} # [[hildirandin]], [[hilçirandin]], [[dirandin]], [[çirandin]], bi devek tûj (t yê kêrê) dirandin / çirandin 8s0iz3sor86yxpqsjain0mhajut32w9 ھەڵە 0 269689 6532830 5878828 2026-09-19T09:36:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532830 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helle === Navdêr === {{navdêr|ckb}} # [[şaşî]], [[xeletî]], [[çewtî]] grgev352uwnjim5ijn5hllojxnhtuwe ھەڵەداوان 0 269690 6532831 5878831 2026-09-19T09:37:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532831 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helledawan === Navdêr === {{navdêr|ckb}} # [[lez]], [[bizav]], [[lezûbizav]], [[ecele]], [[pele]] 594teod07epq4aoeacld9dh8abdljpv ھەڵەھەڵ 0 269691 6532832 5878838 2026-09-19T09:37:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532832 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellehell === Navdêr === {{navdêr|ckb}} # [[qîrîn]], [[qîjîn]], [[dengûdor]] suxvazhee2e5bj5l4v8wdh8anzfjr30 ھەلھەلە 0 269693 6532833 5878810 2026-09-19T09:37:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532833 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helhele === Navdêr === {{navdêr|ckb}} # [[tilîlî]], dengê kêfxweşiyê di şahiyan de (t jin vedidin) 00tbm2zkhd0253n18qiizs70kangtks ھەڵەنگووتن 0 269694 6532834 5878837 2026-09-19T09:37:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532834 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellengûtin === Lêker === {{lêker|ckb}} # [[hilingivîn]], [[hilingiftin]], [[likumîn]], [[terpilîn]] dmfoe3w0n69t4yw5gfk92mjblyxbnkh ھەڵەشە 0 269696 6532835 5878832 2026-09-19T09:37:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532835 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helleşe === Rengdêr === {{rengdêr|ckb}} # [[lezok]], [[bilez]], [[bizivok]], [[bilezûbizav]], [[bêsexbêr]], [[bêdîqet]] 61jnpv644dg72z5oyzl0hugkzelvnlr ھەڵەشەیی 0 269697 6532836 5878834 2026-09-19T09:37:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532836 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helleşeyî === Navdêr === {{navdêr|ckb}} # [[lezokî]], [[bizivokî]], [[lez]], [[bizav]], [[bêsexbêrî]] 6ohn22gxbp7iptd7iofez8q8xnrw1w0 ھەڵەت 0 269698 6532837 5878829 2026-09-19T09:38:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532837 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellet === Rengdêr === {{rengdêr|ckb}} # [[asê]], cihê mirov nikare bi asanî lê bimeşe, [[serhişk]], [[neguhdar]], mirovê serkêşiya wê / wî kirin dijwar e mhtrbrbkx5eu1mj6eq9fjuemqj2ximi ھەڵەخەرج 0 269700 6532838 5878830 2026-09-19T09:38:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532838 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellexerc === Rengdêr === {{rengdêr|ckb}} # [[felîte]], [[destbelav]], kesa/ê malê / pareyê xwe pirr xerc / pûç dike poiaxl0yde6z3un4qizxu6f2hgdd6kg ھەڵفلیقان 0 269702 6532839 5878753 2026-09-19T09:38:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532839 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellfilîqan === Lêker === {{lêker|ckb}} # [[meriçîn]], [[merçiqîn]], [[zirviçîn]], [[perçiqîn]] jk5iclhcspp5hwl0rl1oemt7ilj7s98 ھەڵفلیقاو 0 269703 6532840 5878755 2026-09-19T09:38:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532840 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellfilîqaw === Lêker === {{lêker|ckb}} # [[meriçîn]], [[merçiqîn]], [[zirviçîn]], [[perçiqîn]] 6729fmlk3apxkusstbd50car07ujgiq ھەڵفریواندن 0 269706 6532841 5878752 2026-09-19T09:38:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532841 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellfirîwandin === Lêker === {{lêker|ckb}} # [[xapandin]], [[lê]] (h)b lê kirin, [[hîle lê kirin]] caiuq1ntwbmya6862ngcizuf7t8ruda ھەڵگەڕان 0 269707 6532842 5878784 2026-09-19T09:38:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532842 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellgerran === Lêker === {{lêker|ckb}} # [[hilgerrîn]], li hindavî / raserî tiştekî gerrîn yan dewr dan, [[hilketin]], [[hewa ketin]], ji derek nizm meşîn derek bilind; berbelav bûn (dar yan giya dema pelên / çeqên xwe belavî derdorî xwe dike); (reng) guherrîn, [[lê bûn]] (rengek): Rengî zerd hellgerra Reng lê zer bûn (ango bûn spîçolkî / zerik) c4fqiveav6c3y9guhxq2nrjxboe2749 ھەڵگەڕانەوە 0 269708 6532843 5878785 2026-09-19T09:39:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532843 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellgerranewe === Lêker === {{lêker|ckb}} # [[qulipîn]], [[vequlipîn]], [[serberjêr bûn]], [[berejavî bûn]], [[dijber bûn]] m2c8ixjzwffn5pmb4ntd58cofsx49q0 ھەڵگڵۆفتن 0 269709 6532844 5878779 2026-09-19T09:39:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532844 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellgilloftin === Navdêr === {{navdêr|ckb}} # [[perixandin]], [[mizdan]], destê xwe pêve anîn û birin ecs1a0k8n1tv2v8ps9l0p7kdnookzla ھەڵگیرسان 0 269713 6532845 5878782 2026-09-19T09:39:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532845 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellgîrsan === Lêker === {{lêker|ckb}} # [[hilbûn]], [[vêketin]], [[berbûn]], [[geş bûn]], [[gur bûn]] (agir), [[çêbûn]], [[dest pê bûn]], [[berpê bûn]], [[afirîn]]; berbûn hev, li hev sor bûn 71e33c1fu4aef1n4sla9htw40m3czpw ھەڵگیرساندن 0 269714 6532846 5878783 2026-09-19T09:39:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532846 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellgîrsandin === Lêker === {{lêker|ckb}} # [[hilkirin]], [[vêxistin]], [[berdan]], [[geş kirin]], [[gur kirin]] (agir), [[çêkirin]], [[dest pê kirin]], [[berpê kirin]], [[afirandin]]; berdan hev, li hev sor kirin 19ne2kz85wpjw4tvz369n4txus8f25o ھەڵگوشین 0 269715 6532847 5878780 2026-09-19T09:39:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532847 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellguşîn === Lêker === {{lêker|ckb}} # [[givaştin]], [[şidandin]], [[guvaştin]], [[jidandin]] 2q05lp1scwefl67saqcmf6xcrxo9d41 ھەڵھێنجان 0 269719 6532848 5878805 2026-09-19T09:39:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532848 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellhêncan === Lêker === {{lêker|ckb}} #(av ji bîrê) hilkişandin / hilkêşa # (av ji derekê) [[çikîn]], [[miçikîn]], [[miçiqîn]], çik / hişk / ziwa / zuha bûn, (t ji ber germayê av jê) [[qut bûn]] i3ihzhwbhv0y2mv1earzvfliwihud3g ھەڵھێنجراو 0 269720 6532849 5878806 2026-09-19T09:40:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532849 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellhênciraw === Rengdêr === {{rengdêr|ckb}} #(av ji bîrê) hilkişandî / hilkêşay # (av ji derekê) [[çikî]], [[miçikî]], [[miçiqî]], çik / hişk / ziwa / zuha bûyî, (t ji ber germayê av jê) [[qutbûyî]] 9gqzrrjdmxxy3esvq76cinggt1cnohq ھەڵھێنگە 0 269722 6532850 5878808 2026-09-19T09:40:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532850 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellhênge === Navdêr === {{navdêr|ckb}} # [[hêlîn]], [[kurkgeh]], cihê mirîşk lê kurk dibe û hêkên xwe dimeriqîne 7qkn24mcgjbeq98esgeqkgfhgzjg8x8 ھەڵیز 0 269724 6532851 6433477 2026-09-19T09:40:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532851 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellîz === Navdêr === {{navdêr|ckb}} # [[çerm]], [[pîst]], [[post]] (yên heywanan), [[meşk]] ==== Anagram ==== * {{anagram|ckb|a=زڵھیە|ھیزەڵ}} bp7lmkf3vt6zwzvmk7yiih42v9l1y52 ھەڵژمار 0 269725 6532852 5878733 2026-09-19T09:40:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532852 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helljimar === Navdêr === {{navdêr|ckb}} # [[hiljimar]], [[statîstîk]], [[jimarko]] pfi9b6ocnlq0ojo6663rg2eqlk085xn ھەڵژماردن 0 269726 6532853 5878734 2026-09-19T09:40:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532853 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helljimardin === Lêker === {{lêker|ckb}} # [[hejmartin]], [[hiljimartin]], [[hijmartin]], [[jimartin]] 9f055zmh4dfsiyxlo2fpb1nkv7peyi7 ھەڵژمێڕاو 0 269727 6532854 5878735 2026-09-19T09:40:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532854 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helljimêrraw === Rengdêr === {{rengdêr|ckb}} # [[jimartî]], [[hejmartî]], [[hijmartî]], [[hiljimartî]] jyc08uks28nyla99y9q3aoobtrp8jmr ھەلک 0 269728 6532855 5878759 2026-09-19T09:41:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532855 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helk === Rengdêr === {{rengdêr|ckb}} # [[zimanxweş]], [[zimanşirîn]], [[peyvzêrrîn]] llu21nzm7u2py2f40dfcrx0rbue44gf ھەڵکەوت 0 269733 6532856 5878777 2026-09-19T09:41:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532856 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellkewt === Navdêr === {{navdêr|ckb}} # [[hilkeft]], [[bone]], [[minasebet]] 4aygi6pcs9hdrggw9wf6b5pfc571n9z ھەڵکێشان 0 269735 6532857 5878772 2026-09-19T09:41:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532857 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellkêşan === Lêker === {{lêker|ckb}} # [[hilkêşan]], [[hilkişandin]], kêşan / kişandin jor / serî / silal / hewa 7krcvr2eeaqdg3bhjug7xf9mkejaqho ھەڵکێشراو 0 269736 6532858 5878773 2026-09-19T09:41:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532858 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellkêşraw === Rengdêr === {{rengdêr|ckb}} # [[hilkêşayî]], [[hilkişandî]], ya / yê hatiye hilkêşan / hilkişandin a8umwqaj1bnei4i529n7la8tc03c24p ھەڵکڕان 0 269737 6532859 5878761 2026-09-19T09:41:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532859 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellkirran === Lêker === {{lêker|ckb}} # [[selixîn]], [[veçirrîn]], [[verûçîn]], [[verûçikîn]], piçek / pirtek çerm / pîst ji ser vebûn / çûn, bi sivikî birîndar bûn mg8e9vw1q58u0ndfzs3faiepe5usb7v ھەڵکڕاندن 0 269738 6532860 5878762 2026-09-19T09:41:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532860 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellkirrandin === Lêker === {{lêker|ckb}} # [[selixandin]], [[veçirrandin]], [[verûçandin]], [[verûçikandin]], piçek / pirtek çerm / pîst ji ser vekirin / rakirin, bi sivikî birîndar kirin h967nujh993byy8vy5p4c1jmg4xzcni ھەڵکشە 0 269743 6532861 5878767 2026-09-19T09:42:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532861 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellkişe === Navdêr === {{navdêr|ckb}} # [[rabûn]], [[bilindbûn]] (a seviyeya avê) oobx64w9tg8nijgnrtqjqi6laz57wjs ھەڵلا 0 269747 6532862 5878786 2026-09-19T09:42:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532862 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellla === Navdêr === {{navdêr|ckb}} # [[şerenîx]], [[xirenîx]], [[dengûdor]], [[dijberî]] 2p8hz195gpams2y8bdmtrwvkb9thhl9 ھەڵلووشین 0 269748 6532863 5878787 2026-09-19T09:42:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532863 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helllûşîn === Lêker === {{lêker|ckb}} # [[daûrandin]], [[dabeliandin]], [[dabeliandin]], [[daûrandin]], zû yan bi hesûdî xwarin, [[nîçandin]], [[nîç kirin]], çipek / dilopek ji avê yan vexwirakek dî nehêlan kqai291jmeove2kofxzc1cfw6vq4xii ھەڵم 0 269749 6532864 5878788 2026-09-19T09:42:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532864 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellm === Navdêr === {{navdêr|ckb}} # [[hilm]], [[bixar]], [[buxar]], [[dû]], [[dûkêl]] 03452684j6tqmk4pickd6wxf4zkukux ھەڵماڵراو 0 269752 6532865 5878792 2026-09-19T09:42:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532865 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellmallraw === Rengdêr === {{rengdêr|ckb}} # [[hildayî]], [[hilmalî]], [[hilmaliştî]], [[hilmaliyayî]] 20rgtnixewa1y57i86p9z8oknfm62mz ھەڵمەقۆ 0 269756 6532866 5878799 2026-09-19T09:42:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532866 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellmeqo === Navdêr === {{navdêr|ckb}} # [[pêncokanê]], lîstikek / yariyek e bi pênc berkokên / kevirokên biçûk têt kirin ef8jkbb1ioz3am6zmn728xhl1ci67kw ھەڵمەت 0 269757 6532867 5878797 2026-09-19T09:43:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532867 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellmet === Navdêr === {{navdêr|ckb}} # [[êriş]], [[pelamar]], [[lêdan]], [[biserdegirtin]] obdnk678aa5zgjvxb3meseptoh74v7l ھەڵمەتجاڕ 0 269758 6532868 5878798 2026-09-19T09:43:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532868 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellmetcarr === Navdêr === {{navdêr|ckb}} # [[operasyon]], [[êriş]], [[lêdan]], [[biserdegirtin]] 26chkqx301yxxhp7wis24fsfvxmtb5d ھەڵمژین 0 269759 6532869 5878795 2026-09-19T09:43:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532869 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellmijîn === Lêker === {{lêker|ckb}} # [[hilmijandin]], [[hilmêtin]], av bi boriyan hilkişandin, av / hewa kişandin devê xwe, mêtin xwe putu4ndju9u6imqe68vktm6rdeppcva ھەڵنان 0 269761 6532870 5878800 2026-09-19T09:43:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532870 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellnan === Lêker === {{lêker|ckb}} # [[gavîn]], [[gav avêtin]], [[pêngav avêtin]], hewa ketî #(dav / xefik / feq) venan / danîn a2tmsgrv3abukhk0d956yqm5zvhzwi3 ھەڵۆڵ 0 269764 6532871 5878826 2026-09-19T09:43:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532871 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helloll === Rengdêr === {{rengdêr|ckb}} # [[xilole]], [[xulole]] c2spunf4swsixa6lrx252vpu824v96r ھەلۆک 0 269765 6532872 5878825 2026-09-19T09:43:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532872 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helok === Navdêr === {{navdêr|ckb}} # [[kaşok]], [[gopal]], [[dar]] 9jd4yhwtl1fsibun6cvrq519y2e28q9 ھەڵپاچراو 0 269767 6532873 5878674 2026-09-19T09:44:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532873 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpaçraw === Rengdêr === {{rengdêr|ckb}} # [[qusandî]], '':kurrkirî; cewandî, [[ cewkirî'']] ltcsp0ugw9nwqxwea9qjirsu159mow9 ھەڵپەنمان 0 269769 6532874 5878695 2026-09-19T09:44:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532874 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpenman === Navdêr === {{navdêr|ckb}} # [[werimîn]], [[perçivîn]] ih8tkq7871f44oqjtahnbdrkfyzfias ھەڵپەڕکێ 0 269772 6532875 5878691 2026-09-19T09:44:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532875 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellperrkê === Navdêr === {{navdêr|ckb}} # [[govend]], [[dîlan]], [[dawet]], [[reqas]] incmwew2aukagsd0zexf89zq13y1vok ھەڵپەساردن 0 269773 6532876 5878694 2026-09-19T09:44:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532876 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpesardin === Lêker === {{lêker|ckb}} # [[spartin]], [[pal dan]], [[pişt dan]], pala / pişta tiştekî / xwe dan tiştekî nrtos8l9hcprsc0tjenu2vljhhy4gky ھەڵپەساڕاو 0 269774 6532877 5878693 2026-09-19T09:44:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532877 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpesarraw === Rengdêr === {{rengdêr|ckb}} # [[paldayî]], [[piştdayî]] (tiştekî) 4357fuwmdctr9ml0xj5txlfw3xjip44 ھەڵپێچ 0 269775 6532878 5878686 2026-09-19T09:44:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532878 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpêç === Navdêr === {{navdêr|ckb}} # [[dang]], [[daw]], [[dawên]], [[berdang]] jqj58rlb1a42rmjd07qoige60bpgjrz ھەڵپێچان 0 269776 6532879 5878687 2026-09-19T09:45:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532879 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpêçan === Rengdêr === {{rengdêr|ckb}} # [[hilpêçan]], [[hilpêçandin]], [[hildan]], [[rakirî]] # [[gihîn]], [[gihiştin]], ji kulîlk bûn fêkî bxp167g0vxujayhxu66229bkx2nk7fn ھەڵپچڕان 0 269778 6532880 5878676 2026-09-19T09:45:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532880 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpiçrran === Navdêr === {{navdêr|ckb}} # [[peritîn]], [[çirîn]], [[dirîn]], hatin çirandin / dirandin e4i06qvgtwzer5q00jsmaegod7rqfue ھەڵپژان 0 269781 6532881 5878685 2026-09-19T09:45:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532881 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpijan === Lêker === {{lêker|ckb}} #(av û hwd) hilbilqîn, [[vemistin]], [[hilvizîn]], [[hilvizikîn]], di ser re avêtin 6poh48srfqwrckk5457yofiix2r65rn ھەڵپڕووکان 0 269782 6532882 5878682 2026-09-19T09:45:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532882 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpirrûkan === Lêker === {{lêker|ckb}} # [[betilîn]], [[westîn]], [[kerixîn]], [[mandî bûn]] 4cwdz6863pgc4h0x1rdifho1429zpl7 ھەڵپڕووکاندن 0 269783 6532883 5878683 2026-09-19T09:45:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532883 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpirrûkandin === Lêker === {{lêker|ckb}} # [[betilandin]], [[westandin]], [[kerixandin]], [[mandî kirin]] f081mp9srej4jxti3xa6aonkpqwg73c ھەڵپرووکاو 0 269784 6532884 5878684 2026-09-19T09:45:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532884 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpirûkaw === Rengdêr === {{rengdêr|ckb}} # [[betilî]], [[westî]], [[kerixî]], [[mandîbûyî]] erh756of6hrqshewg27qhvgr3furfn7 ھەڵپرووزان 0 269785 6532885 5878679 2026-09-19T09:46:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532885 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpirûzan === Lêker === {{lêker|ckb}} # [[kizirîn]], [[suşîn]], [[sujîn]], [[şewitîn]], bûn qerqûş(k) hzytky9pw2hmwid11jz3ahgceej2687 ھەڵپرووزاندن 0 269786 6532886 5878680 2026-09-19T09:46:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532886 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellpirûzandin === Lêker === {{lêker|ckb}} # [[kizirandin]], [[sotin]], [[sujandin]], [[şewitandin]], kirin qerqûş(k) cfgjphjgp8ymz3g7yfu0yj2ot9spdv9 ھەڵقوڕاندن 0 269789 6532887 5878757 2026-09-19T09:46:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532887 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellqurrandin === Lêker === {{lêker|ckb}} # [[qurtandin]], [[qurçandin]], (av û hwd) qurç-qurç / qurt-qurt vexwarin 46qu3bx8priuix69xpqu1p1pi8qmmbk ھەڵڕشتن 0 269793 6532888 5878730 2026-09-19T09:46:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532888 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellrriştin === Navdêr === {{navdêr|ckb}} # [[hilrijandin]], [[hilriştin]], hilrêtin (bn ellrrijan) kn0hs5wzriz5k8jjehsaz3rt72rhkvu ھەڵسانەوە 0 269796 6532889 5878739 2026-09-19T09:46:49Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532889 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsanewe === Hoker === {{hoker|ckb}} # [[verabûn]], [[dîsan rabûn]] 3vzwuufat95zjtobyyh1kiq5oi0g18p ھەڵساو 0 269797 6532890 5878740 2026-09-19T09:46:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532890 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsaw === Rengdêr === {{rengdêr|ckb}} # [[rabûyî]] dan1tqnqai1j21469itqbsl3zl6yng9 ھەڵسەنگاندن 0 269798 6532891 5878746 2026-09-19T09:47:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532891 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsengandin === Lêker === {{lêker|ckb}} # [[hilsengandin]], [[nirxandin]], [[berisandin]], [[dan ber hev]], li hev pîvan, nirxê / bihayê / giringiya tiştekî texmîn yan hesab kirin, [[kêşandin]], giraniya tiştekî pîvan t0m2jv0yg3f5gk6dga2yav12c3wuoou ھەڵسەنگێنەر 0 269799 6532892 5878747 2026-09-19T09:47:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532892 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsengêner === Navdêr === {{navdêr|ckb}} # [[hilsengîner]], [[nirxîner]], kesa/ê dinirxîne / hildisengîne, [[pîvan]], [[krîter]] qx7w1iaewq99h4ep67xu9od36r4pwgy ھەڵسووکەوت 0 269800 6532893 5878745 2026-09-19T09:47:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532893 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsûkewt === Navdêr === {{navdêr|ckb}} # [[leptûliv]], [[tevger]], [[ rabûn-û-rûniştin]] pknxd5sasb1r07283vh89t4f33mdsjs ھەڵسووڕان 0 269801 6532894 5878741 2026-09-19T09:47:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532894 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsûrran === Lêker === {{lêker|ckb}} # [[çêbûn]], [[durist bûn]], [[saz bûn]], [[pêk hatin]], [[afirîn]], [[amade bûn]], [[hatin pê]], [[berpê bûn]] rhyftig0wqjqtxbydps2ebiy76mpcgq ھەڵسووڕاندن 0 269802 6532895 5878742 2026-09-19T09:47:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532895 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsûrrandin === Lêker === {{lêker|ckb}} # [[çêkirin]], [[durist kirin]], [[saz kirin]], [[pêk anîn]], [[afirandin]], [[amade kirin]], [[anîn pê]], [[berpê kirin]] jj4tiyqy73zl5s5m528zpqg20yl1che ھەڵسووڕاو 0 269803 6532896 5878743 2026-09-19T09:47:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532896 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsûrraw === Rengdêr === {{rengdêr|ckb}} # [[çêkirî]], [[pêkînayî]], [[ durist(kirî)]], [[sazkirî]], [[afirandî]], [[amadekirî]], [[ berpê(kirî)]] 0uzjtc5pfx3cmrzcsa6kn9tfx555ffe ھەڵسووڕێنەر 0 269804 6532897 5878744 2026-09-19T09:48:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532897 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellsûrrêner === Navdêr === {{navdêr|ckb}} # [[çêker]], [[pêkîner]], [[duristker]], [[sazker]], [[amadeker]], [[afirîner]], [[birêveber]] 96ccnnr76zovhdzem4prleu4mok275j ھەڵشاخین 0 269805 6532898 5878748 2026-09-19T09:48:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532898 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellşaxîn === Lêker === {{lêker|ckb}} # (piya) lê xwirrîn, [[gef lê kirin]], enirrî û bi qehr li gel kesekî axivîn svwk349h0t0idu41hr45u29pljoldch ھەڵشێلان 0 269806 6532899 5878749 2026-09-19T09:48:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532899 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellşêlan === Lêker === {{lêker|ckb}} # [[hilşêlandin]], [[şêlandin]], [[têkil kirin]] (t hevîr) rq6zynlylkz2d9m8dvhdctk1wwtg7dd ھەڵتڵیشاو 0 269812 6532900 5878700 2026-09-19T09:48:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532900 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helltillîşaw === Rengdêr === {{rengdêr|ckb}} # [[peritî]], [[ pirt-pirt(bûyî)]], [[ parçe-parçe(bûyî)]], [[ hûr-hûr(bûyî)]] 9jhb97er1jwl38oolozjj3sf6r1g2ya ھەڵتڕین 0 269814 6532901 5878697 2026-09-19T09:48:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532901 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helltirrîn === Lêker === {{lêker|ckb}} # [[finîn]], [[finihan]], ne li ser xêrê çûn (Wek nifirîn têt bi kar anîn: Helltirre! Bifine! Bifinihe! Here ji ber çavên min!) lu3q3rhtw5zb9st5bib98uiwg5t6qhj ھەڵتۆقین 0 269816 6532902 5878702 2026-09-19T09:48:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532902 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helltoqîn === Lêker === {{lêker|ckb}} # [[bilqîn]], [[hilbilqîn]], [[bilq dan]], [[derketin]], serê xwe deranîn; pirzik 0689hvz5mc422rudbe9xpnrq2htsf5t ھەڵووژە 0 269818 6532903 5878815 2026-09-19T09:49:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532903 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellûje === Navdêr === {{navdêr|ckb}} # [[hilû]], [[hilûk]], [[încas]], [[hilîk]], [[hulûk]] ietxzjr5w2cel36lwti6ow3or1ior9i ھەلوومەرج 0 269820 6532904 5878817 2026-09-19T09:49:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532904 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :helûmerc === Navdêr === {{navdêr|ckb}} # [[şertûşirûd]], [[rewş]], [[destûdar]], [[kewdan]], [[barûdox]] b8txvvj50lq2wkhwci1qvledrh88mfb ھەڵواسران 0 269822 6532905 5878811 2026-09-19T09:49:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532905 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellwasran === Lêker === {{lêker|ckb}} # [[hatin hilawîstin]], [[hatin daliqandin]], hatin (bi dar / dîwar ve) kirin p3oa6ng6khlyav5c144rcngz4aqhvk0 ھەڵواسراو 0 269823 6532906 5878812 2026-09-19T09:49:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532906 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellwasraw === Rengdêr === {{rengdêr|ckb}} # [[hilawîstî]], [[daliqandî]], (bi dar / dîwar ve) [[kirî]] rrcagln4luo5j93lge6kjnm3xs77yn4 ھەڵوەران 0 269824 6532907 5878818 2026-09-19T09:49:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532907 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellweran === Lêker === {{lêker|ckb}} # [[werîn]], [[weşîn]], [[weriyan]], [[dawerîn]], [[daweşîn]], [[vewerîn]], [[veweşîn]], [[werihan]], pel / dindik / tov jê veqetîn / cuda bûn fgxo1ewtnkig8f9hq6agkry4ivgf55p ھەڵوەراندن 0 269825 6532908 5878819 2026-09-19T09:49:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532908 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellwerandin === Lêker === {{lêker|ckb}} # [[werandin]], [[weşandin]], [[vewerandin]], [[veweşandin]], pel / dindik / tov jê veqetandin / cuda kirin lgocezfmvj4w2ifz9lf4hadikvevrm6 ھەڵوەشان 0 269826 6532909 5878820 2026-09-19T09:50:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532909 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellweşan === Lêker === {{lêker|ckb}} # [[hilweşîn]], [[ruxîn]], [[têk çûn]], pûç bû # [[verûşîn]], [[verûşan]], [[verûşiyan]], [[verûşihan]], (girêk / dirûn) [[vebûn]] r7tgxwxfgcu1bu9gzcfmy4albpd1jty ھەڵوەشاو 0 269828 6532910 5878822 2026-09-19T09:50:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532910 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellweşaw === Rengdêr === {{rengdêr|ckb}} # [[hilweşî]], [[hilweşiyayî]], [[ruxî]], [[ruxiyayî]], [[têkçûyî]], [[pûçbûy]] # [[verûşî]], [[verûşiyayî]] ng0v79j7xzoxuqyydx9falprt0ax9ta ھەڵوەشێنراو 0 269829 6532911 5878823 2026-09-19T09:50:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532911 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellweşênraw === Rengdêr === {{rengdêr|ckb}} # [[hilweşandî]], [[ruxandî]], [[têkbirî]], [[pûçkir]] # [[verûşandî]], (girêk / dirûn) [[vekirî]] crne1x7a22f4xnv2pn2dig6n3pux5f3 ھەڵووتن 0 269830 6532912 5878814 2026-09-19T09:50:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532912 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellwutin === Lêker === {{lêker|ckb}} # [[pesinandin]], [[pesn dan]], [[metihandin]], [[meth kirin]] 4tg05trbcvthheoj88u00wajgy57bx4 ھەڵخەڵەتاندن 0 269832 6532913 5878717 2026-09-19T09:50:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532913 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellxelletandin === Lêker === {{lêker|ckb}} # [[xapandin]], [[bi ser de birin]], lêb lê kirin, [[hîle lê kirin]], lêhb lê kirin, [[fêl lê kirin]] adgosq4f9nw15deccshywn3emyo9qks ھەڵخەڵەتێو 0 269834 6532914 5878719 2026-09-19T09:50:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532914 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellxelletêw === Rengdêr === {{rengdêr|ckb}} # [[xapînok]], [[lêbok]], [[lêhbok]], ya / yê xapan / hîleyan / lêban dike yan dikare bibe sedema wan 6i5uol9vzrc80xrhbnwur3jylbbt2da ھەڵخلیسکان 0 269835 6532915 5878713 2026-09-19T09:51:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532915 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellxilîskan === Lêker === {{lêker|ckb}} # [[hilisîn]], [[tehisîn]], [[şemitîn]], [[hulusîn]], [[xwişîn]], [[xijîn]], [[xuşîn]], [[xîj bûn]], [[xwiş bûn]], [[terrişîn]], [[şelipîn]], [[xijikîn]] ow29hyj26nw6v9ozv0d5pstpj4zcl33 ھەڵخلیسکاندن 0 269836 6532916 5878714 2026-09-19T09:51:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532916 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellxilîskandin === Lêker === {{lêker|ckb}} # [[hilisandin]], [[tehisandin]], [[şemitandin]], [[hulusandin]], [[xwişandin]], [[xijandin]], [[xuşandin]], [[xîj kirin]], [[xwiş kirin]], [[terrişandin]], [[şelipandin]], [[xijikandin]] jzap56izrwyin2w3knrte700avvn2mw ھەڵخستن 0 269838 6532917 5878712 2026-09-19T09:51:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532917 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellxistin === Lêker === {{lêker|ckb}} # [[raxistin]], [[raêxistin]], (t cil bo ziwabûnê) bi ristê ve kirin, '':bi cî kirin; berdest kirin'' qeiqdbbzmg4uz2cfiz6hpcyh8akix6s ھەڵزڵەپیو 0 269841 6532918 5878732 2026-09-19T09:51:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532918 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hellzillepîw === Rengdêr === {{rengdêr|ckb}} # [[pif]], [[pifî]], [[pifbûyî]], [[perçivî]], [[werimî]] 0abj3nay1gxgp6xrqxdkc1t0disnt7v ھەماڵ 0 269843 6532919 5878841 2026-09-19T09:51:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532919 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemall === Navdêr === {{navdêr|ckb}} # [[hemal]], [[hilgir]], [[xizmetkar]], [[kedka]] # [[karîte]], darên banên xaniyan xwe li ser digirin dp17npdlhnuhwxaidu4blymhg9kmsk0 ھەمام 0 269844 6532920 5878842 2026-09-19T09:51:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532920 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemam === Navdêr === {{navdêr|ckb}} # [[hemam]], [[serşok]], [[germav]] pi9dhy6xvtjeriicfrmvdq0c2stxvb6 ھەمایەڵ 0 269846 6532921 5878845 2026-09-19T09:52:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532921 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemayell === Navdêr === {{navdêr|ckb}} # [[nivişte]], [[niviştok]], [[hemaîlk]] 9yhxldwaj9noh2bfasllwggidggnx90 ھەمەلایەنە 0 269848 6532923 5878854 2026-09-19T09:52:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532923 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemelayene === Rengdêr === {{rengdêr|ckb}} # [[tevalî]], [[hemealî]], [[pirralî]], [[gelekalî]] hiojv9tfe4ohznag0770c2qboolrfsc ھەمیشە 0 269849 6532924 5878852 2026-09-19T09:52:29Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532924 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemîşe === Hoker === {{hoker|ckb}} # [[herdem]], [[hergav]], [[hercar]], [[tim]], [[hertim]] fhs00i46hbqqpgagyyl3bzfglgm3j7m ھەمشین 0 269851 6532925 5878846 2026-09-19T09:52:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532925 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemşîn === Navdêr === {{navdêr|ckb}} # [[mijmije]], [[mişmiş]], [[qeysî]] edwcy77r5d8iox4841z2loze2mttomh ھەمووپرسی 0 269853 6532926 5878849 2026-09-19T09:52:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532926 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemûpirsî === Navdêr === {{navdêr|ckb}} # [[gelpirsî]], [[hemûpirsî]], [[referendum]] iet40bf9dht9ybi23v4eeyeeuqgloxg ھەموووانی 0 269854 6532927 5878850 2026-09-19T09:52:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532927 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hemûwanî === Rengdêr === {{rengdêr|ckb}} # [[gelemperî]], [[giştî]], tiştê / karê / malê hemûyan s1du9qhosnckw79v5209u2x7rgo950m ھەنار 0 269858 6532928 5878856 2026-09-19T09:53:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532928 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henar === Navdêr === {{navdêr|ckb}} # [[hinar]] (fêkiyek e) 6stvvkwinwwqqlzsio16iqinkcxhn48 ھەناردە 0 269859 6532929 5878857 2026-09-19T09:53:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532929 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henarde === Navdêr === {{navdêr|ckb}} # [[hinarde]], [[îxracat]], bo bazirganî eşya / mal ji welatekî birinek yek dî iaijj7l47dsdrpfgml83aozp005zfzy ھەناسەسارد 0 269862 6532930 5878859 2026-09-19T09:53:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532930 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henasesard === Rengdêr === {{rengdêr|ckb}} # [[bextreş]], [[bêsiûd]], [[bênesîb]] efhkv9lvrga3fhn0qptevsqzav4n8lx ھەناسەوواری 0 269864 6532931 5878861 2026-09-19T09:53:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532931 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henasewiwarî === Navdêr === {{navdêr|ckb}} # [[bênçikî]], [[êlpikî]], [[astma]] l1iau8gew57pc574n6wq1h8pbpqjrav ھەند 0 269867 6532932 5878863 2026-09-19T09:53:49Z JiyanBot 3048 Cure Cînav hat lêzêdekirin 6532932 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hend === Cînav === {{cînav|ckb}} # [[hin]], [[hinek]], [[hindek]], [[çend]] (lib / heb û hwd) jjgmmk2n5ynonuxh399qw5uhvkxpu0o ھەنداز 0 269868 6532933 5878864 2026-09-19T09:53:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532933 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hendaz === Rengdêr === {{rengdêr|ckb}} # [[hendaz]], [[birêk]], [[birêkûpêk]], [[rêzkirî]], [[birêz]], [[sererast]], [[sîstematîk]] snipq9o8sj55vfjb5xp1dfd3deu7ygy ھەندە 0 269869 6532934 5878865 2026-09-19T09:54:09Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532934 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hende === Hoker === {{hoker|ckb}} # [[hindî]], [[bi qasî]], [[temetî]], bi temet cjw9p1anmcsc22klckxbmshmso4ovs2 ھەندەر 0 269870 6532935 5878866 2026-09-19T09:54:19Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532935 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hender === Hoker === {{hoker|ckb}} # [[der]], [[derve]] === Dijmane === * [[hindir]] 7fk3yv649qc22m2dh0s6k7afizqe6gy ھەندەران 0 269871 6532936 5878867 2026-09-19T09:54:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532936 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henderan === Navdêr === {{navdêr|ckb}} # derveyî welat, [[biyanistan]], [[dûrî]], [[xerîbî]] hfd39mdreblbfk3r0g4l5xdunbg1qis ھەندەرھۆ 0 269872 6532937 5878868 2026-09-19T09:54:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532937 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henderho === Navdêr === {{navdêr|ckb}} # [[hêsk]], [[colank]] 82ls24bs28hn255ovb6nfc6oc1tcet5 ھەنەزا 0 269873 6532938 5878881 2026-09-19T09:54:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532938 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heneza === Navdêr === {{navdêr|ckb}} # [[nevis]], zarokên mêrê / jina yekî yên ji jinek / mêrek dî fplgst2ikz3h94hjfo8mv5pmj2lmf92 ھەنگامە 0 269875 6532939 5878872 2026-09-19T09:54:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532939 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hengame === Navdêr === {{navdêr|ckb}} # [[tevlihevî]], [[serobinî]] 1no55w43vhiv03jkgmcegwjrc9utfqz ھەنگاو 0 269876 6532940 5878873 2026-09-19T09:55:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532940 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hengaw === Navdêr === {{navdêr|ckb}} # [[gav]], pêngav # [[dem]], [[gav]], [[wext]], [[heyam]] n359592zplx7rt5i5bvpyswi8luuxnf ھەنگڵ 0 269879 6532941 5878876 2026-09-19T09:55:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532941 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hengill === Navdêr === {{navdêr|ckb}} # [[ran]], [[qalçe]], [[newq]], [[hengil]] sx8oh90crj4szo8a0v0yxlr7ptsjd69 ھەنوون 0 269883 6532942 5878880 2026-09-19T09:55:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532942 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :henûn === Lêker === {{lêker|ckb}} # [[sûn]], [[hesûn]], [[hilû kirin]] rkzhd2vdh0n44ougl338yeplxr4gyo2 ھەپەساندن 0 269885 6532943 5878534 2026-09-19T09:55:39Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6532943 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hepesandin === Lêker === {{lêker|ckb}} # [[heyirandin]], [[mat kirin]], [[ecêbgirtî kirin]], [[hêbitandin]] rdd17w5wzzen29p6bezzxkoktwbm60w ھەپەساو 0 269886 6532944 5878535 2026-09-19T09:55:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532944 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hepesaw === Rengdêr === {{rengdêr|ckb}} # [[heyirî]], [[mat]], [[matmayî]], [[ecêbgirtî]], [[hêbitî]] b71zf7z7yxe5gysyhsalmt1mptyvjn7 ھەپین 0 269887 6532945 5878532 2026-09-19T09:55:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532945 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hepîn === Navdêr === {{navdêr|ckb}} # [[hewîn]], [[rewîn]], [[reyîn]] (dengkirina se / kûçik yan wek wan) 9znjiwtnc2engooqs8dsm9tbmcofn2w ھەپس 0 269889 6532946 5878529 2026-09-19T09:56:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532946 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heps === Navdêr === {{navdêr|ckb}} # [[hefs]], [[zindan]], [[dîlî]], [[êsîrî]], [[êxsîrî]], [[heps]] lbnxg2cfidcej61upnb75ut2o3q7eqf ھەپسخانە 0 269890 6532947 5878530 2026-09-19T09:56:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532947 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hepsxane === Navdêr === {{navdêr|ckb}} # [[hefsxane]], [[zindan]], [[girtîxane]], [[girtîgeh]], [[dîlxane]], [[êsîrxane]] oyec9aew0s6kjvseqfhnvsc2ot9uzeq ھەقانی 0 269892 6532948 5878640 2026-09-19T09:56:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532948 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heqanî === Rengdêr === {{rengdêr|ckb}} # [[adil]], [[dadperwer]], [[rastgo]] nar25e7knayjtxsdydsn6husv7qyq7a ھەقایەت 0 269893 6532949 5878641 2026-09-19T09:56:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532949 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heqayet === Navdêr === {{navdêr|ckb}} # [[çîrok]], [[heqayet]] toldgd42t6mritm087h1lpc4974p3j2 ھەگبە 0 269894 6532950 5878644 2026-09-19T09:56:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532950 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hegbe === Navdêr === {{navdêr|ckb}} # [[tûr]], [[kîs]], [[çante]], [[tûrik]], [[telîs]], [[torbe]], [[çewal]] lxfbf92028txp64jcdbpkc6r8ucxph6 ھەقدەست 0 269895 6532951 5878642 2026-09-19T09:56:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532951 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heqdest === Navdêr === {{navdêr|ckb}} # [[heqdest]], [[destmiz]], [[meaş]] 4cnul13z7ja667nsfwxdyedccmddhhn ھەڕا 0 269896 6532952 6433459 2026-09-19T09:57:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532952 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herra === Navdêr === {{navdêr|ckb}} # [[rev]], [[bazdan]], [[bez]] ==== Anagram ==== * {{anagram|ckb|a=اڕھە|ھاڕە}} 0oh4tobfe2s4u6ilbtz3wm7mlx20tr7 ھەراج 0 269897 6532953 5878552 2026-09-19T09:57:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532953 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herac === Navdêr === {{navdêr|ckb}} # [[herac]], [[mezat]], [[mazat]], bazara pitirandinê ya tê de mal dikeve destê kesa/ê herî zêde pare pê bide clrm0kql7bt0i3scit3owv8qj4kilo0 ھەرام 0 269898 6532954 5878555 2026-09-19T09:57:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532954 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heram === Rengdêr === {{rengdêr|ckb}} # [[heram]], [[qedexe]], [[yasax]], tişta nabe bêt kirin (t ya ji alî dînî ve hatiye qedexekirin) 5tmnnrfy955qe6nkgxtudxpg5pspjuk ھەرامە 0 269899 6532955 5878557 2026-09-19T09:57:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532955 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herame === Navdêr === {{navdêr|ckb}} # [[ewk]], [[ewka]], [[ewkê]], [[ ew-a-dî]], [[ ew-ê-dî]], [[çîk]], [[çîkê]], [[çîka]] 7ulll0kqf1hl3gj4igrbsafa289d5mf ھەرامخۆر 0 269900 6532956 5878556 2026-09-19T09:57:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532956 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heramxor === Navdêr === {{navdêr|ckb}} # [[heramxwer]], [[bertîlxwer]], [[rantxwer]], kesa/ê malê ne yê wê / wî bi xwe ye dixwe / bi kar tîne bêyî destûr hebe, '':kesa/ê tiştên dîn heram kirine dixwe (bo nimûne: misilmanên goştê beraz bixwin)'' t0m9ajxyxm68cdgiqdril8jensu98g5 ھەراسان 0 269902 6532957 5878554 2026-09-19T09:57:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532957 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herasan === Rengdêr === {{rengdêr|ckb}} # [[tengezar]], [[nerehet]], [[bêçare]], [[bêzar]], [[bînteng]] 2jm26vtsdu4cige0dxjpmo4qsp7t8g0 ھەرجایی 0 269903 6532958 5878558 2026-09-19T09:58:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532958 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hercayî === Navdêr === {{navdêr|ckb}} # [[binefş]], [[gulbinefş]] m5kdg9c2kvz16tabgyij6bp4116ihpj ھەردوو 0 269907 6532959 6433489 2026-09-19T09:58:19Z JiyanBot 3048 Cure Cînav hat lêzêdekirin 6532959 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herdû === Cînav === {{cînav|ckb}} # [[herdu]] ==== Anagram ==== * {{anagram|ckb|a=درووھە|ھووردە}} jvnrh6se0i1r3xo3mmnxl57a5rtvzuo ھەڕەمە 0 269910 6532960 5878590 2026-09-19T09:58:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532960 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herreme === Rengdêr === {{rengdêr|ckb}} # [[tevlihev]], [[têkil]], [[serûbin]], [[bêserûber]] lymfbs1ukav00ljhglze5xn01gbbiwk ھەرەس 0 269911 6532961 5878587 2026-09-19T09:58:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532961 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heres === Navdêr === {{navdêr|ckb}} # [[1]], [[aşût]], [[aşît]], [[berfxwişî]], [[axxwişî]], dahatina axê / berfê ji erdek bilind berev yek nizm, [[lehî]], rabûna avê, boşûna avê; şirrebaran, barana boş 2 hilweşîn, [[ruxîn]], [[pûçbûn]] maaxinxag354bzi61fvoy9foeik7v2q ھەڕەشە 0 269912 6532962 5878588 2026-09-19T09:58:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532962 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hereşe === Navdêr === {{navdêr|ckb}} # [[gef]], [[tehdîd]], [[hereşe]], [[lêxwirrîn]] c7zd860z79ckvqwifadop3aqw33tau8 ھەرەوەز 0 269913 6532963 5878591 2026-09-19T09:58:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532963 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herewez === Navdêr === {{navdêr|ckb}} # [[hevkar]], [[xizmetkar]] nzuw244g54mtn2f9mfmsmn7srqdnx2c ھەرێم 0 269914 6532964 6433499 2026-09-19T09:59:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532964 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herêm === Navdêr === {{navdêr|ckb}} # [[herêm]], [[navçe]], [[dever]], [[cih]], [[war]] ==== Anagram ==== * {{anagram|ckb|a=رمھێە|ھەرمێ}} 0ibaqvkgluihiy0m452bpm6j82efz3f ھەرێمی 0 269915 6532965 5878585 2026-09-19T09:59:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532965 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herêmî === Rengdêr === {{rengdêr|ckb}} # [[herêmî]], [[navçeyî]], [[deverkî]] (ya / yê ne hemû netewe / welat / dinyayê) favj6kn1j839n25thvdh92aqnq8jea5 ھەرێز 0 269916 6532966 5878582 2026-09-19T09:59:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532966 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herêz === Navdêr === {{navdêr|ckb}} # [[firîz]], [[giya]], [[gîha]] (t yê mêrg û çayir û çîmenan) 6za8ab10xgos8d9hauejllgzmkko7pz ھەرگینە 0 269918 6532967 5878577 2026-09-19T09:59:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532967 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hergîne === Navdêr === {{navdêr|ckb}} # [[cerrûmerr]], [[keramîk]] slmtaebvzrp5kk93ni7fkelbcs7tlgu ھەرگیز 0 269919 6532968 5878575 2026-09-19T09:59:49Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532968 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hergîz === Hoker === {{hoker|ckb}} # [[qet]], [[hîç]], [[ti car]], [[çi car]], [[qe]] ealfbllus8ebjn5kwq9clyywv4hpfwd ھەرلە 0 269922 6532969 5878578 2026-09-19T09:59:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532969 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herle === Navdêr === {{navdêr|ckb}} # [[kêz]], [[kêzik]] i2j39n0s28g7r73ktwtrf5c85r28793 ھەرمێپشکوان 0 269923 6532970 5878579 2026-09-19T10:00:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532970 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hermêpişkiwan === Navdêr === {{navdêr|ckb}} # [[berbihar]], dema pişkivîna hirmiyan fls9a6ocvhfrnotwq41su65mg6cul6k ھەروا 0 269924 6532971 6433512 2026-09-19T10:00:19Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532971 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herwa === Hoker === {{hoker|ckb}} # [[herwa]], [[herwiha]], [[herwisa]] ==== Anagram ==== * {{anagram|ckb|a=اروھە|ھەوار}} 3njyjewjymrle8b5d3vkyhwokby4oq4 ھەرزاڵە 0 269925 6532972 5878563 2026-09-19T10:00:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532972 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herzalle === Navdêr === {{navdêr|ckb}} # [[bingeh]], [[esas]] b9rf4u51n3opgs80n7s4s732oybsvqp ھەرزان 0 269926 6532973 5878564 2026-09-19T10:00:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532973 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herzan === Rengdêr === {{rengdêr|ckb}} # [[erzan]], [[negiran]], [[bihakêm]], [[djw]], [[giran]], [[bihadar]], [[bihagiran]] 3tohtz0i3oty9n1mglg3rty38xfs78f ھەرزانی 0 269927 6532975 5878566 2026-09-19T10:00:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532975 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herzanî === Navdêr === {{navdêr|ckb}} # [[erzanî]], [[negiranî]], [[bihakêmî]] bkqe49br63kkye2hme42iqcpv6opb55 ھەرزەچەنە 0 269930 6532976 5878569 2026-09-19T10:00:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532976 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herzeçene === Rengdêr === {{rengdêr|ckb}} # [[devjen]], [[lewçe]], [[zêdebêj]] agm4uz95i0rk9uvcvao5fqnrkyemny6 ھەرزەکارانە 0 269932 6532977 5878571 2026-09-19T10:01:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532977 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herzekarane === Rengdêr === {{rengdêr|ckb}} # [[cahilane]], [[ciwanane]], [[xortane]], karê ne mîna kesên gihayî û aqildar, [[tûlane]], [[tolazane]], [[felîtane]], karê kesên pûç û nehêja 6c4zhd8p6vmwk95ociactipgpoz1pmv ھەرزەیی 0 269934 6532978 5878573 2026-09-19T10:01:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532978 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :herzeyî === Navdêr === {{navdêr|ckb}} # [[ciwanî]], [[xortî]], [[gencî]], [[cehêlî]] 2924k89idkyzvamohychyesxndmh27o ھەسار 0 269936 6532979 6433483 2026-09-19T10:01:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532979 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hesar === Navdêr === {{navdêr|ckb}} # [[hesar]], [[kelhe]], [[dîwar]], [[dorbend]] ==== Anagram ==== * {{anagram|ckb|a=ارسھە|ھەراس}} hl28a904pd665jf8mls8cef1bd9ath1 ھەسیر 0 269938 6532980 5878620 2026-09-19T10:01:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532980 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hesîr === Navdêr === {{navdêr|ckb}} # [[hêsîl]], [[mafûr]], [[xalîçe]], [[berik]] ik3ak2ck3nmisnouvwapackbpktg7ya ھەستبەر 0 269940 6532981 5878612 2026-09-19T10:01:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532981 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hestber === Rengdêr === {{rengdêr|ckb}} # [[hestber]], [[bihest]], [[hesas]], [[nazdar]] lkhbmakc5dmam6tydq0sdxvsap2npkr ھەستبەری 0 269941 6532982 5878613 2026-09-19T10:01:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532982 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hestberî === Navdêr === {{navdêr|ckb}} # [[hestberî]], [[bihestî]], [[hesasî]], [[nazdarî]] mqmg3v97l913artpnso4b9k5qdwubor ھەستەوەری 0 269944 6532983 5878619 2026-09-19T10:02:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532983 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hestewerî === Navdêr === {{navdêr|ckb}} # [[hestewerî]], [[hesasî]], [[alerjî]] d2r3vzumsxu25wdcoh9nh1ase6eei3w ھەستری 0 269945 6532984 5878614 2026-09-19T10:02:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532984 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hestirî === Navdêr === {{navdêr|ckb}} # [[strî]], giyayên tûj t50xm70bnxk17iqkhi6briufodwz0xa ھەستیار 0 269946 6532985 5878615 2026-09-19T10:02:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532985 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hestyar === Navdêr === {{navdêr|ckb}} # [[hestyar]], kesa/ê dikare (bi asanî) hest bi tiştan bike / pê bihese 2soef47dtclkx6tnx2ac6t5xazulf0r ھەستیاری 0 269947 6532986 5878616 2026-09-19T10:02:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532986 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hestyarî === Navdêr === {{navdêr|ckb}} # [[hestyarî]], (bi asanî) hestkirina bi tiştan, [[pêhesîn]] qezego83edhclah321i2y0afhcwrkuf ھەشار 0 269949 6532987 5878623 2026-09-19T10:02:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532987 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heşar === Rengdêr === {{rengdêr|ckb}} # [[veşarî]], [[veşartin]], [[berşar]] qv5jv0hqn85q9gvegdlwum1kz9rmgkj ھەشاردراو 0 269950 6532989 5878624 2026-09-19T10:02:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532989 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heşardiraw === Rengdêr === {{rengdêr|ckb}} # [[veşartî]], (li cihekî) wa bicîkirî ku (bi asanî) neyêt dîtin hcw11y2ukvmamlpq1q8hhopqr963e28 ھەشبەسەر 0 269951 6532990 5878625 2026-09-19T10:03:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532990 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heşbeser === Rengdêr === {{rengdêr|ckb}} # [[heşbiser]], [[xwelîbiser]], [[bêsiûd]] 689k0kav1ztqj861of1rll1yulhx15c ھەشھەش 0 269953 6532991 5878630 2026-09-19T10:03:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532991 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heşheş === Navdêr === {{navdêr|ckb}} # [[pasevan]], [[çavdêr]], [[zêrevan]], [[heres]], [[dergevan]] 35t178vlm7yluy91isdn9nvd48q0kte ھەشتالوو 0 269956 6532992 5878628 2026-09-19T10:03:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532992 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heştalû === Navdêr === {{navdêr|ckb}} # [[xox]], bn qox arfxzqtvypp1vnazg8z9q26340phjqm ھەشتیەک 0 269957 6532993 5878629 2026-09-19T10:03:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532993 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heştyek === Navdêr === {{navdêr|ckb}} # [[heştyek]], [[heştêk]], yek ji heştan, [[ 1/8]] ge93n6ab7rlvji7rnql2xbdwfwre4zk ھەتا 0 269958 6532994 5878536 2026-09-19T10:03:49Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6532994 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heta === Hoker === {{hoker|ckb}} # [[1]], [[heta]], [[ta]], [[heya]], heyanî 2, [[daku]], [[bo ku]], [[ji bo ku]], [[da]]: Hatim heta pêt billêm Hatim daku bibêjim te, Hatim ji bo ku ji te re bibêjim 3, [[hê]], [[hêj]], [[hêşta]], hê ku: Zû ke heta nemirdûwît şitêk bike Zû be hê nemirî tiştekî bike a2pqf0uvcm8kukrnnsdy9jb9eg3ggor ھەتاو 0 269961 6532995 5878541 2026-09-19T10:03:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532995 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hetaw === Navdêr === {{navdêr|ckb}} # [[tav]], [[hetav]], [[roj]] 1tw7w9re2o5dnchlkw0ag5kv69refsp ھەتھەتۆکە 0 269962 6532996 5878543 2026-09-19T10:04:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532996 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hethetoke === Navdêr === {{navdêr|ckb}} # [[niviştok]], hemaîlk (t yên bi stoyê zarokan ve tên kirin) r26hpax3lycuu44zh2th4dveke8af2m ھەتیو 0 269963 6532997 5878545 2026-09-19T10:04:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532997 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hetîw === Navdêr === {{navdêr|ckb}} # [[sêwî]], [[êtîm]], [[bavmirî]], [[daymirî]], kesa/ê herdu dêbavên wê / wî yan yek ji herduyan mirine, '':(m) xwelîbiser, [[ rezîl'']] oggn07k7dipkwk8cz8lscelqowq623g ھەتیوخانە 0 269965 6532998 5878547 2026-09-19T10:04:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6532998 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hetîwxane === Navdêr === {{navdêr|ckb}} # [[sêwîxane]], xaniyê / lêgeha sêwiyan / êtîman 3bt3t2x1xj6wbfy5lkmxwomae46vhdq ھەترە 0 269966 6532999 5878542 2026-09-19T10:04:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6532999 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hetre === Rengdêr === {{rengdêr|ckb}} # [[pelate]], [[belav]] py5wy0216zb8aazwmg8eh9432qi1xw4 ھەتوان 0 269967 6533000 5878544 2026-09-19T10:04:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533000 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hetwan === Navdêr === {{navdêr|ckb}} # [[melhem]], [[milhem]] jkb2ocamjn3s1a00toemx5s758p4bgw ھەڤاڵ 0 269968 6533001 5878637 2026-09-19T10:04:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533001 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hevall === Navdêr === {{navdêr|ckb}} # [[heval]], [[hawrrê]] h9g90zhjvkisvjlgjlakbqo97mbp58i ھەواڵگوزاری 0 269973 6533002 5878886 2026-09-19T10:05:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533002 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewallguzarî === Navdêr === {{navdêr|ckb}} # [[agastînî]], [[îstîxbarat]] go9vjiuowh8spcmbkkbxv5gvz25min0 ھەواندنەوە 0 269974 6533003 5878889 2026-09-19T10:05:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533003 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewandinewe === Lêker === {{lêker|ckb}} # [[vehewandin]], [[xwedî kirin]], [[xudan kirin]], matî jê kirin, sereguhiya yekî kirin 5u6mi37n4cqyga7f5bwj6ftvg2fii3n ھەوانەوە 0 269975 6533004 5878890 2026-09-19T10:05:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533004 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewanewe === Lêker === {{lêker|ckb}} # [[vehewîn]], [[tebitîn]], [[hedinîn]], [[sekinîn]], [[rehet bûn]], [[rawestîn]], li cihê xwe man i1gdgxdsqhtheuks03j0i7jtrd1oyjd ھەوار 0 269976 6533005 6433510 2026-09-19T10:05:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533005 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewar === Navdêr === {{navdêr|ckb}} # [[war]], [[kamp]], [[lêmangeh]], [[havîngeh]], cihê havînan koçer yan seyranî lê dijîn ==== Anagram ==== * {{anagram|ckb|a=اروھە|ھەروا}} ewey08qtv51lw170f56vz8b61z2gxms ھەوارگە 0 269977 6533006 5878884 2026-09-19T10:05:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533006 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewarge === Navdêr === {{navdêr|ckb}} # [[wargeh]], [[havîngeh]], [[kamp]], [[aqar]], [[kûngeh]], [[kongeh]] ipailpos1hfu7mim8scz260acocbmju ھەواری 0 269978 6533007 5878885 2026-09-19T10:05:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533007 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewarî === Navdêr === {{navdêr|ckb}} # [[kûn]], [[kon]], [[xîvet]], [[çadir]] 84b86frnh2spgi8rx3eelhbbymj83hh ھەوجاڕ 0 269980 6533008 5878896 2026-09-19T10:06:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533008 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewcarr === Navdêr === {{navdêr|ckb}} # [[hevcar]], [[gasin]] rb34udnkdip9g3eh5khx6tt6xsoiib7 ھەوجۆش 0 269981 6533009 5878897 2026-09-19T10:06:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533009 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewcoş === Navdêr === {{navdêr|ckb}} # asinê / hesinê heland # [[mesîn]], [[misînk]] j6zgiow2y1see5xs22id4gfnemupq3f ھەودا 0 269982 6533010 5878898 2026-09-19T10:06:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533010 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewda === Navdêr === {{navdêr|ckb}} # [[ben]], [[dezî]], [[benik]], [[rîs]], [[ta]] 1h4l8bi9jyt59g3ls019eh2m78iq4lh ھەوەڵ 0 269983 6533011 5878913 2026-09-19T10:06:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533011 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewell === Rengdêr === {{rengdêr|ckb}} # [[pêşîn]], [[ewil]], [[yekem]] g2dyimpifypl1k71jp5oddmzf50f78j ھەوەس 0 269984 6533012 5878912 2026-09-19T10:06:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533012 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewes === Navdêr === {{navdêr|ckb}} # [[hewes]], [[daxwaz]], [[arezû]], [[hêvî]], [[çêj]], [[tam]], xwestina tiştekî pirr / ji dil i61qzafu1bqi2y7wu68nwoxj8tds5qu ھەوێن 0 269986 6533013 5878910 2026-09-19T10:06:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533013 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewên === Navdêr === {{navdêr|ckb}} # [[hêvên]], [[haveyn]], dermankek e dikin nav hevîr daku hevîr pê pif bibe û kêrî pehtina nan bêt hij9eyamyn637456earpgeyhxamtehf ھەویر 0 269988 6533014 5878909 2026-09-19T10:07:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533014 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewîr === Navdêr === {{navdêr|ckb}} # [[hevîr]], [[hêvîr]], ar û av û hêvênê têkilî hev hatine kirin daku nan jê bêt çêkirin 3r3cis9a7hdxv7a5d9ueil4m2xmmi8f ھەوراز 0 269990 6533015 5878899 2026-09-19T10:07:19Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533015 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewraz === Hoker === {{hoker|ckb}} # [[evraz]], [[berjor]] qlsl03dm1900u3bcy7s5y4tb48x7avq ھەورەباڵا 0 269991 6533016 5878902 2026-09-19T10:07:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533016 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewreballa === Navdêr === {{navdêr|ckb}} # [[balexane]], avahiyên bilindiya wan digihe ber ewran pohytyal7ys74721rvt2t4561honber ھەورەتریشقە 0 269992 6533017 5878903 2026-09-19T10:07:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533017 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewretirîşqe === Navdêr === {{navdêr|ckb}} # [[birûsk]], şirqîna ewran s5pe44mvjg33y7snjuavqeycrarekg2 ھەوریس 0 269993 6533018 5878901 2026-09-19T10:07:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533018 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewrîs === Navdêr === {{navdêr|ckb}} # (dara) [[qaç]], [[hevriz]], [[hêvriz]], [[merx]], dara kêmê sqexifs8bqlm05jdx9dhajseken78x5 ھەوسار 0 269994 6533019 6433473 2026-09-19T10:07:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533019 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewsar === Navdêr === {{navdêr|ckb}} # [[hefsar]], [[hevsar]], benê bi serê hespan / keran û hwd tê ve tê girêdan daku pê bên kişandin yan zeft kirin, '':alava serkêşiyê / serkêşîpêkirinê'' ==== Anagram ==== * {{anagram|ckb|a=ارسوھە|ھاوسەر}} lwh1ffus5k5s93voomc33rbj6s9ku1g ھەوسەڵە 0 269995 6533020 5878907 2026-09-19T10:08:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533020 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewselle === Navdêr === {{navdêr|ckb}} # [[bênfireyî]], [[sebr]], [[taqet]], [[xwegirî]], [[baldirêjî]] 97x2s7ydaxq4c5ijw9jziywkv1tgqnn ھەوتیر 0 269999 6533021 5878893 2026-09-19T10:08:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533021 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewtîr === Navdêr === {{navdêr|ckb}} # [[demance]] (ya heftlibxwer) 32wfad7glueb66t0lb2hw68fk5e0ff8 ھەوز 0 270000 6533022 5878904 2026-09-19T10:08:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533022 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hewz === Navdêr === {{navdêr|ckb}} # [[hewz]], [[birk]], birka avê o7dkbe04rncas6ttirwnvkq33blqczq ھەیران 0 270007 6533023 5878917 2026-09-19T10:08:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533023 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heyran === Navdêr === {{navdêr|ckb}} # [[heyran]], [[gorî]], [[qurban]], kesa/ê wa pirr ji tiştekî / kesekî hez dike ku dikare xwe jê re bike gorî / qurba # [[heyranok]], [[heyran]], birrek stranên kurdî ye jgp98htgv568qlpwmswc8a0fuky0dlm ھەیشۆ 0 270010 6533024 5878922 2026-09-19T10:08:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533024 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heyşo === Navdêr === {{navdêr|ckb}} # [[fehêt]], [[fedî]], [[şerm]], [[eyb]] bt5oiawqu62wjhm6rsndqzxk47mhwjz ھەیتە 0 270011 6533025 5878916 2026-09-19T10:08:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533025 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heyte === Rengdêr === {{rengdêr|ckb}} # [[nesefandî]], [[venebijart]] # [[polî]] # komek leşkerên osmanî limcrimspcp2pb6u40al9nduj87vjii ھەیوانان 0 270013 6533026 5878927 2026-09-19T10:09:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533026 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heywanan === Navdêr === {{navdêr|ckb}} # [[havîn]], dema mirov dikare li eywanan binive (ji derengî biharê ta berpayizê) t01q3xhnn18btqrbftnszg2hmro34yl ھەیزەران 0 270015 6533027 5878918 2026-09-19T10:09:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533027 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :heyzeran === Navdêr === {{navdêr|ckb}} # [[heyzeran]], [[rûl]], [[qamûş]] hmb8oxy7m4idmilrdhe5pcodpxl60xx ھەز 0 270016 6533028 5878592 2026-09-19T10:09:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533028 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hez === Navdêr === {{navdêr|ckb}} # [[hez]], [[viyan]], [[xwestin]], [[evîn]], [[hêvî]], [[daxwaz]] p474vmskedlfl5of7y6rgww027aq486 ھەزارە 0 270018 6533029 5878596 2026-09-19T10:09:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533029 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hezare === Navdêr === {{navdêr|ckb}} # [[hezarsal]], [[hezare]], [[mîlenyûm]] 0cvir2ta9ct805digea1iytp55xtebo ھەزبێلە 0 270020 6533030 5878597 2026-09-19T10:09:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533030 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hezbêle === Navdêr === {{navdêr|ckb}} # [[giyaderman]], [[davûderman]], giyayên wek derman tên bikaranîn psdabp6zlhbioyjeeam5lfmru739lnq ھێدز 0 270024 6533031 5878470 2026-09-19T10:09:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533031 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêdiz === Rengdêr === {{rengdêr|ckb}} # [[aciz]] co5rsq79ffcb00q5tp756hrgmc21jp0 ھێل 0 270026 6533032 5878491 2026-09-19T10:10:09Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533032 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêl === Hoker === {{hoker|ckb}} # [[hêl]], [[qaqûle]] 525cvnsuhx64uv02pu9np6hm3kgcjoz ھێڵان 0 270028 6533033 5878494 2026-09-19T10:10:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533033 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêllan === Lêker === {{lêker|ckb}} # [[hêlan]], [[hêliştin]], [[rê dan]], [[hiştin]] ddtctqmppdyz2qw7xx6oli7l3au9u7q ھێلانە 0 270029 6533034 5878496 2026-09-19T10:10:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533034 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêlane === Navdêr === {{navdêr|ckb}} # [[hêlîn]], cihê firrinde hêkên xwe tê de diparêzin pikwgtzimw9pktg2r8nuik31bo2pwc1 ھێلم 0 270030 6533035 5878502 2026-09-19T10:10:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533035 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêlim === Navdêr === {{navdêr|ckb}} # [[zeliqek]], [[çirrek]], [[demûş]], [[debûş]], [[lehîm]], [[girek]] 3bgb6osqnmg4lm6jnyzh4j6hqn8os1q ھێلز 0 270032 6533036 5878497 2026-09-19T10:10:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533036 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêliz === Navdêr === {{navdêr|ckb}} # [[heliz]] (navê giyayekê ye) h7yycn71lkhp3jb18w1vs5f5ifnty2s ھێڵکاری 0 270033 6533037 5878498 2026-09-19T10:10:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533037 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêllkarî === Navdêr === {{navdêr|ckb}} # [[grafîk]], [[xetkarî]], [[hêlkarî]] p9ybpyngzeuuzar5ux0jww4jr9d8hkf ھێلکە 0 270034 6533038 5878499 2026-09-19T10:11:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533038 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêlke === Navdêr === {{navdêr|ckb}} # [[hêk]], '': (hî masiyan) xerz, xirz; (gun) [[hêlik]], [[gun]], [[ ritil'']] 7ii1zi8o6ki5bwl5nerhtryxuq2in3i ھێلکەورۆن 0 270035 6533039 5878500 2026-09-19T10:11:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533039 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêlkewron === Navdêr === {{navdêr|ckb}} # [[hêkrûn]] rua432kg4yu8998ju9k55jby0frnf30 ھێلکەیی 0 270036 6533040 5878501 2026-09-19T10:11:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533040 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêlkeyî === Rengdêr === {{rengdêr|ckb}} # [[hêkî]], (tişta dirûvê / şikilê wê) mîna hêkê dv5zrngag8asl87kmmjwixw2oqv83jq ھێمن 0 270038 6533041 5878507 2026-09-19T10:11:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533041 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêmin === Rengdêr === {{rengdêr|ckb}} # [[aram]], [[rehet]], [[nerm]], [[hêdî]] avqf7q1flindj434t3melj8u1qn1tzy ھێمنی 0 270039 6533042 5878508 2026-09-19T10:11:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533042 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêminî === Navdêr === {{navdêr|ckb}} # [[aramî]], [[rehetî]], [[nermî]], [[hêdîkî]] tq1mlne6confxgpxpoieohd1n477z8j ھێنان 0 270040 6533043 5878510 2026-09-19T10:11:59Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533043 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hênan === Lêker === {{lêker|ckb}} # [[anîn]], [[înan]], [[hînan]] 41hd29d64hlwstftqrz1kk9k4qze5we ھێرۆ 0 270043 6533046 5878474 2026-09-19T10:12:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533046 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêro === Navdêr === {{navdêr|ckb}} # [[hêro]] (navê gulekê ye) 5gvue0er63e8ndnksdr260wedu6oz8m ھێوەر 0 270044 6533047 5878520 2026-09-19T10:12:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533047 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêwer === Rengdêr === {{rengdêr|ckb}} # [[tî]], birayê mêrê kesekê 6d1s6h825g9ma714yilsc70wcnq6022 ھێشتن 0 270046 6533048 5878487 2026-09-19T10:12:29Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533048 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêştin === Lêker === {{lêker|ckb}} # [[hêlan]], [[hêliştin]], [[rê dan]], [[hiştin]] 6mm8rk70ztymks4nrxn19fulpxzo4ab ھێشوو 0 270047 6533050 5878489 2026-09-19T10:12:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533050 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêşû === Navdêr === {{navdêr|ckb}} # [[wîşî]], [[guşî]] (yê tirî / xurmeyê) 9y42cnst9uifrha35c8tzvkkjrsv0mk ھێشخان 0 270048 6533051 5878488 2026-09-19T10:12:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533051 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêşxan === Navdêr === {{navdêr|ckb}} # [[aşxane]], odeya xwiraka malê tê ve têt parastin r19swq9b6luvoth0zt3g7ecmyxsv1uw ھێواش 0 270049 6533053 5878514 2026-09-19T10:12:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533053 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêwaş === Rengdêr === {{rengdêr|ckb}} # [[hêdî]] (tişta / mirovê pêdivî bi demek dirêj heye ta ku biqewime / bibe / bike) # [[ hêdî]], [[rehet]], [[aram]], [[ tena]] === Dijmane === * [[zû]] * [[bilez]] * [[lezgîn]] * [[pît]] * [[hêl]] 4n0bx2c0pw73gtba0e38yqrqku9tfaf ھێواشی 0 270050 6533054 5878516 2026-09-19T10:13:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533054 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêwaşî === Navdêr === {{navdêr|ckb}} # [[hêdîtî]], [[rehetî]], [[tenahî]], [[aramî]] 5ny7dqtzv6fp0qjta8dd58nuy361nq5 ھێواشکار 0 270051 6533055 5878515 2026-09-19T10:13:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533055 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêwaşkar === Navdêr === {{navdêr|ckb}} #(mirova/ê yan tiştê - t dermanê -) hêdîker, [[tenaker]], [[rehetker]], [[aramker]] peyhunr7e4b6p3rzrrb5g7sx41hifpm ھێور 0 270054 6533057 5878517 2026-09-19T10:13:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533057 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêwir === Rengdêr === {{rengdêr|ckb}} # [[rehet]], [[aram]], [[ten]] # [[objektîv]], [[hêwir]], dûrî hestên kesînî / şexsî l930h3phets0v5gh1x7ab5wzxbssqw4 ھێز 0 270057 6533058 5878475 2026-09-19T10:13:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533058 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêz === Navdêr === {{navdêr|ckb}} # [[hêz]], [[quwet]], [[şiyan]], [[xurtî]], [[taqet]] kxhx0bocgyqrh1at1z7cm0wdedl13za ھێزم 0 270059 6533060 5878479 2026-09-19T10:13:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533060 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hêzim === Navdêr === {{navdêr|ckb}} # [[êzing]], [[tirrik]], darên sotinê / şewitandinê o2htaz2rasquavqyi68bvmexsyss6ig ھکوومەت 0 270060 6533062 5878240 2026-09-19T10:13:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533062 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hikûmet === Navdêr === {{navdêr|ckb}} # [[hikûmet]], [[hukumet]], civata wezîran (û serokkomar), serokatiya dewletê, rêveberiya dewletê pqgqxpdicex6qwiaklhdydmi48ubefo ھسێب 0 270062 6533064 5878222 2026-09-19T10:14:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533064 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hisêb === Navdêr === {{navdêr|ckb}} # [[hesab]], [[hisêb]] 2ksie8jq8ln2ipzn323s6pcu0gdsa6l ھزب 0 270063 6533066 5878215 2026-09-19T10:14:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533066 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hizb === Navdêr === {{navdêr|ckb}} # [[partî]], [[hizb]] 8l9i8rochnib8drs5vgtgc74ae0owl9 ھیکمەت 0 270065 6533067 5878490 2026-09-19T10:14:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533067 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîkmet === Navdêr === {{navdêr|ckb}} # [[hikmet]], [[hişmendî]], [[aqildarî]], [[hişyarî]], [[hiş]], [[aqil]] 2x7rtoq9hz7xpa9h3q2h7rc33m73lci ھیچی 0 270068 6533068 5878466 2026-09-19T10:14:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533068 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîçî === Navdêr === {{navdêr|ckb}} # [[hîçî]], [[tineyî]], [[çineyî]], [[çuneyî]], [[ ne-ti-tiştî]] 23wkh0eik5pih0i2gi20n2hruuzbuhk ھیدایەت 0 270069 6533070 5878467 2026-09-19T10:14:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533070 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîdayet === Navdêr === {{navdêr|ckb}} # [[rêberî]], [[rênîşandan]], [[hîdayet]] 3r5ddjw3mpjj09u7vuoa2xru661mo26 ھیلاک 0 270070 6533072 5878493 2026-09-19T10:14:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533072 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîlak === Rengdêr === {{rengdêr|ckb}} # [[westayî]], [[mandî]], [[betilî]], [[kerixî]], [[mirin]], [[hîlak]] e2q6fhj1l89jfiznv4yzfyrekdlvpu8 ھیساب 0 270073 6533074 5878484 2026-09-19T10:15:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533074 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîsab === Navdêr === {{navdêr|ckb}} # [[hesab]], [[matematîk]] 9r0pkd219awvr92b4peskq0x48iaaep ھیوادار 0 270076 6533076 5878513 2026-09-19T10:15:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533076 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîwadar === Rengdêr === {{rengdêr|ckb}} # [[hêvîdar]], [[umêdewar]], [[bihêvî]] 6of99wx2yfmlqqzvqhaayjz3bu8k5cw ھیزە 0 270079 6533077 5878481 2026-09-19T10:15:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533077 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîze === Navdêr === {{navdêr|ckb}} # [[pîst]], [[çerm]], [[post]] (t yê reş bo têdeparastina rûn) 9xbq15yctl48ec60z6uu716awlvr08e ھیزەڵ 0 270080 6533078 6433480 2026-09-19T10:15:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533078 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîzell === Rengdêr === {{rengdêr|ckb}} # [[neşê]], [[nekar]], kesa/ê nikare / neşê tiştekî bike ==== Anagram ==== * {{anagram|ckb|a=زڵھیە|ھەڵیز}} 6whmqc8nuosa3e1gtk94bjvrj9tmh62 ھیزێتی 0 270081 6533079 5878480 2026-09-19T10:15:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533079 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hîzêtî === Navdêr === {{navdêr|ckb}} # [[hîzî]], [[hîzîtî]], karê hîzan r4nvtfzk8zupm5catbtxkrpj4j2tzqt ھۆدار 0 270082 6533080 5878428 2026-09-19T10:15:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533080 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hodar === Navdêr === {{navdêr|ckb}} # [[hîmdar]], [[mantiq]], [[lojîk]], tişta sedema xwe ya asayî yan diyar heye û dikare bêt famkirina ka çima wa ye yan wa dibe l0k527sntxdeagduuzyghd2wjxrpise ھۆجەنە 0 270083 6533081 5878427 2026-09-19T10:16:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533081 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hocene === Navdêr === {{navdêr|ckb}} # [[niviştî]], [[nivişte]] j6kzj2meib6ybls9fpu5shkvekfj1bv ھۆدە 0 270084 6533082 5878429 2026-09-19T10:16:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533082 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hode === Navdêr === {{navdêr|ckb}} # [[ode]], [[jore]] 3auikyye9xu57ko2dfnbxzhcd18737s ھۆگر 0 270085 6533083 5878447 2026-09-19T10:16:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533083 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hogir === Navdêr === {{navdêr|ckb}} # [[pêvek]], [[pêrek]] (tişta bi tiştek dî ve ye yan li gel wê ye), [[hogir]], heval û hogir 9uw2y50qg5xa2s3u08m2h833hzq1f65 ھۆکار 0 270086 6533084 5878445 2026-09-19T10:16:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533084 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hokar === Navdêr === {{navdêr|ckb}} # [[hîmker]], [[bandorker]], [[sedem]], [[sebeb]] 52mnokpepjvfe2kj30n0l1tui11qj5o ھۆکڵ 0 270087 6533085 5878446 2026-09-19T10:16:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533085 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hokill === Navdêr === {{navdêr|ckb}} # [[xizmetkar]], [[berdestk]], [[xulam]], [[noker]] oho12e39tj2w2blfvz08wg763b2y0u0 ھۆنەر 0 270090 6533086 5878450 2026-09-19T10:16:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533086 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :honer === Navdêr === {{navdêr|ckb}} # [[helbestvan]], [[hozanvan]], [[helbestnivîs]] gzmvy1zyd1kamk9e4ks50ahljsft8ax ھۆڕ 0 270091 6533087 5878430 2026-09-19T10:17:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533087 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :horr === Navdêr === {{navdêr|ckb}} # [[têrr]], [[çewal]], [[tûrik]], [[kîs]], [[telîs]], [[torbe]] 54iz6zein8pxvdvzuokb9m4x8negeh3 ھۆڕن 0 270092 6533088 5878433 2026-09-19T10:17:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533088 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :horrin === Navdêr === {{navdêr|ckb}} # [[horrin]], [[tûtik]], dengê agadarkirinê yê tirimpêlan û hin tiştên dî 81m0vzn0d2b18c1z621j4u7epu4mgsr ھۆردوو 0 270093 6533089 5878432 2026-09-19T10:17:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533089 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hordû === Navdêr === {{navdêr|ckb}} # [[artêş]], [[ordî]], [[leşker]], [[cêş]], [[esker]] bwhq7gwtitcio4scstx0ckcqsxjmtl4 ھۆرتە 0 270096 6533090 5878431 2026-09-19T10:17:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533090 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :horte === Navdêr === {{navdêr|ckb}} # [[edet]], [[banek]], irf û edet, [[tore]] nhcvn5yp77ckr1npd4uecrojl48ul5n ھۆشبڕ 0 270097 6533091 5878439 2026-09-19T10:17:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533091 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hoşbirr === Navdêr === {{navdêr|ckb}} # [[hişbirr]], [[bêhişker]], [[haybirr]], [[bêhayker]] h1xwc3j956180r3iugs2akub9jxw6eu ھۆشمەندی 0 270099 6533092 5878441 2026-09-19T10:17:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533092 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hoşmendî === Navdêr === {{navdêr|ckb}} # [[hişmendî]], [[hişyarî]], [[haydarî]], [[aqildarî]], [[biaqilî]], [[têgihiştinî]], [[zanayî]], [[ronakbîrî]], [[rewşenbîrî]] sbor9ie7lbs2gu3k6nigwef0s9q7a63 ھۆشیار 0 270100 6533093 5878442 2026-09-19T10:18:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533093 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hoşyar === Rengdêr === {{rengdêr|ckb}} # [[hişyar]], [[haydar]], kesa/ê hay ji xwe heye, [[şiyar]], kesa/ê ne di xew e pvtv6mfjmxv80hks86x1ln1cxyj5fey ھۆشیاری 0 270102 6533094 5878444 2026-09-19T10:18:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533094 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hoşyarî === Navdêr === {{navdêr|ckb}} # [[hişyarî]], [[haydarî]], [[şiyarî]], [[nedixewî]] 4jaoq3efoqhd7agvxtfabd90scgj9ru ھۆز 0 270104 6533095 5878435 2026-09-19T10:18:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533095 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hoz === Navdêr === {{navdêr|ckb}} # [[hoz]], [[êl]], [[eşîr]], [[binemal]], [[ûcax]] n54ots5a5l2ima1a699bc8zpzb4mj5v ھۆزانی 0 270107 6533096 5878437 2026-09-19T10:18:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533096 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hozanî === Navdêr === {{navdêr|ckb}} # [[hişmendî]], [[hişyarî]], [[aqildarî]], [[zanayî]], [[xwendayî]], [[zanyarî]], [[têgihiştinî]], [[dinyadîtinî]] 5q8o1bjd0qwmlx5grjquyxwu9oi3a8x ھوجرە 0 270109 6533097 5878387 2026-09-19T10:18:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533097 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hucre === Navdêr === {{navdêr|ckb}} # [[hucre]], [[odek]], odeya biçûk j3e0hmgi5fi1k56kikmknvxoni3w230 ھوکمدار 0 270111 6533098 5878404 2026-09-19T10:18:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533098 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hukimdar === Navdêr === {{navdêr|ckb}} # [[fermandar]], [[hukimdar]], [[serok]], [[desthilatdar]] ib96w7smtt5ff73agsvfp7cyp63fy1p ھولەسێ 0 270113 6533099 5878408 2026-09-19T10:19:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533099 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hulesê === Navdêr === {{navdêr|ckb}} # [[angaşt]], [[îdîa]] f2y5ftdle0jqyx26k24mtd8vfac3zic ھولھولی 0 270114 6533101 5878406 2026-09-19T10:19:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533101 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hulhulî === Rengdêr === {{rengdêr|ckb}} # [[guherok]], [[xweranegir]], [[guherbar]] d4nbxxslc2rtpx1nrkrxgzrelcb1ujv ھومەڵخەزا 0 270116 6533102 5878410 2026-09-19T10:19:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533102 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :humellxeza === Navdêr === {{navdêr|ckb}} # [[tevlihevî]], [[serobinî]], [[taromarî]] 732g0w4rpe7owd5qlhtaar3ae991wqq ھونەر 0 270117 6533103 5878411 2026-09-19T10:19:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533103 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :huner === Navdêr === {{navdêr|ckb}} # [[1]], [[huner]], [[afirînerî]], efrînerî 2, [[hinêr]], [[hunêrî]], [[şiyan]], [[jêhatin]], [[karîn]], [[kanîn]] 1hbql4426fwpnrxrkszkz3rb9mrf261 ھونەرگا 0 270118 6533104 5878412 2026-09-19T10:19:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533104 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hunerga === Navdêr === {{navdêr|ckb}} # [[hunergeh]], cihê huneran o73dhpixwcavmgwetvu43rza8hj338t ھونەرمەند 0 270120 6533105 5878413 2026-09-19T10:19:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533105 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hunermend === Navdêr === {{navdêr|ckb}} # [[hunermend]], [[afirîner]] 3r91otq2snq8hc0gf432eujlh0kw34h ھونەروەر 0 270122 6533106 5878415 2026-09-19T10:20:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533106 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hunerwer === Rengdêr === {{rengdêr|ckb}} # [[1]], bn hunermend 2, [[jêhatî]], [[bihinêr]], [[bişiyan]], [[hinêrwer]] om6j2w8epx7tvnfqmdt2k5652qexo44 ھورمەت 0 270124 6533107 5878390 2026-09-19T10:20:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533107 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hurmet === Navdêr === {{navdêr|ckb}} # [[rêzgirtin]], [[hurmet]], [[qedirgirtin]], [[qîmetgirtin]] 19ol2dt6ldu6jk8971kcc7852jtb4y9 ھوشتر 0 270126 6533108 5878398 2026-09-19T10:20:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533108 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :huştir === Navdêr === {{navdêr|ckb}} # [[hêştir]], [[deve]], [[sare]] sy61mb0we9uotk97y0oy86k48gv4pmc ھوزەیران 0 270127 6533109 5878393 2026-09-19T10:20:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533109 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :huzeyran === Navdêr === {{navdêr|ckb}} # [[pûşber]], [[hezîran]], meha 6em ji salnameya romî, meha piştî gulanê û berî tîrmehê djg4gkwh1awnrvlyfmkjdcw21pppj6x ھوو 0 270129 6533110 5878417 2026-09-19T10:20:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533110 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hû === Navdêr === {{navdêr|ckb}} # [[sûde]], [[kêr]], [[kelk]], [[mifa]], [[feyde]], [[kar]], [[qezenc]], [[qazanc]] ckylhonyjhx3zgp6ir85iu932cszx01 ھووھووکەرە 0 270131 6533111 5878425 2026-09-19T10:20:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533111 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hûhûkere === Navdêr === {{navdêr|ckb}} # [[kund]], [[bum]], [[bim]] 9xwkju0zj0743bo9t95hc5yi9o8qwx7 ھووڕ 0 270132 6533112 5878419 2026-09-19T10:21:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533112 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hûrr === Navdêr === {{navdêr|ckb}} # [[dengûdor]], dengê bilind / nexweş 80rrlizqhidjc6f8ypt6nidb4f4419m ھووردەبینی 0 270134 6533113 5878421 2026-09-19T10:21:19Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533113 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hûrdebînî === Lêker === {{lêker|ckb}} # [[hûrnerî]], [[tûjandin]], [[vekolandin]], [[hûrsehî]], hûr lênerîn / vekolandin / pûnijîn bo diyarkirina rastîniya tiştekî h9ioat4zs4aos0bec8nmnctcd7iyvc5 ھووشە 0 270135 6533114 5878422 2026-09-19T10:21:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533114 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hûşe === Navdêr === {{navdêr|ckb}} # [[meth]], [[pesn]], [[qurretî]], [[pozbilindî]] 0jct7vno6jo1z4l917g7yd7fj468s5g ھووت 0 270137 6533115 5878418 2026-09-19T10:21:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533115 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :hût === Navdêr === {{navdêr|ckb}} # [[avilke]], [[neheng]], [[hût]], [[balîna]], mezintirîn lawirê guhandar yê avî 45kxcqpad0isj2ay5jxw3r9nbuvprbq ژاژ 0 270154 6533116 5875059 2026-09-19T10:21:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533116 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jaj === Navdêr === {{navdêr|ckb}} # [[jaj]], giyayek e têkilî nav penîrê an mastî vexewixandî dikin û jajî jê çêdikin == {{ziman|fa}} == === Navdêr === {{navdêr|fa}} # [[jaj]] # ''mecazî'': [[devbelaşî]], [[devleqî]] hc6mvh4jlxc6ggobiw6z5w05xt9lbqi ژاژک 0 270155 6533117 5869686 2026-09-19T10:21:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533117 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jajik === Navdêr === {{navdêr|ckb}} # [[benîşt]], [[qajik]], [[ilk]], [[jajik]], [[qaçik]], [[cûtek]] 3ulsm5gbwy62qk94c20dkii1a6bj0r8 ژاڵە 0 270159 6533118 5869687 2026-09-19T10:22:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533118 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jalle === Navdêr === {{navdêr|ckb}} # [[jale]], [[kerkujk]], darek yan deviyek jehrî ya her-şên e bi gulên geş yên spî yan pembe (pîvazî) yan sor n5icl3i8mtfo4fcl3la4i3bo77chqe8 ژاندار 0 270161 6533119 5869689 2026-09-19T10:22:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533119 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jandar === Rengdêr === {{rengdêr|ckb}} # [[jandar]], [[bijan]] jv3npqklb2v3krt1qe8of8o3yrdy3as ژانەسەر 0 270162 6533120 5869693 2026-09-19T10:22:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533120 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :janeser === Navdêr === {{navdêr|ckb}} # [[janeser]], [[serêşî]], êşîna serî sva2hl9kxtj0ilan3bvg8y0ts8o821s ژانەسک 0 270163 6533121 5869692 2026-09-19T10:22:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533121 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :janesik === Navdêr === {{navdêr|ckb}} # [[zikêşî]], êşîna zikî kc403x4agffxkb3g5kh323conwdllrw ژاراو 0 270165 6533122 5869678 2026-09-19T10:22:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533122 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jaraw === Rengdêr === {{rengdêr|ckb}} # [[jarav]], [[jehrav]], ava jehrî 54y5k58x8oqf1wt9gd2hx5znuh55734 ژاراوی 0 270166 6533123 5869679 2026-09-19T10:22:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533123 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jarawî === Rengdêr === {{rengdêr|ckb}} # [[jarawî]], [[jehrawî]], [[bijar]], [[bijehr]], [[jehrkirî]] nc6f75orb7tfyy3hc85ric7br3jrvt5 ژارووژەنگ 0 270170 6533124 5869683 2026-09-19T10:23:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533124 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jarûjeng === Navdêr === {{navdêr|ckb}} # [[rikmane]], [[dijberî]], [[kerb]], [[kîn]] eumee1xdu14s74ho4mz8e4pxax2ktl3 ژاوەژاو 0 270171 6533125 5869694 2026-09-19T10:23:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533125 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jawejaw === Navdêr === {{navdêr|ckb}} # [[dengûdor]], [[qerebalix]], [[geremol]], dengên bilind û tevlihev j3iko97j17917rls154nrs9dgipym2z ژەندن 0 270175 6533126 5869757 2026-09-19T10:23:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533126 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jendin === Rengdêr === {{rengdêr|ckb}} # [[jenandî]] # [[şilqandî]] # [[hejandin]], [[qeliqandin]], [[livandin]], [[lebitandin]] 2s4c8mc916w0qvwkvqd168t6efdzfln ژەقنەبووت 0 270179 6533127 5869754 2026-09-19T10:23:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533127 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jeqnebût === Navdêr === {{navdêr|ckb}} # [[ziqnebût]], darek bi fêkiyê jehrewî ye, Herwa wek peyvek tal yan nifrîn yan dijûn têt bikaranîn û wateya wê nêzî "quzilqurt" û "jehremar" e 2en2lp0flj39e7n25z1454i8mli34dl ژێر 0 270180 6533128 5869722 2026-09-19T10:23:49Z JiyanBot 3048 Cure Daçek hat lêzêdekirin 6533128 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêr === Daçek === {{daçek|ckb}} # [[bin]], [[jêr]] 4w2772lpj3219ivvvf00d2b71523eef ژێربەران 0 270181 6533129 5869729 2026-09-19T10:23:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533129 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrberan === Navdêr === {{navdêr|ckb}} # [[derazînk]], bilindeka li ber deriyan fyrbjwiokmzt6zacga0r1nv36rm3xd6 ژێرچەپۆکە 0 270182 6533130 5869733 2026-09-19T10:24:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533130 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrçepoke === Rengdêr === {{rengdêr|ckb}} # [[serşor]], [[ruhkole]], [[neazad]], [[neserbilind]] n3tf3u5f3m5jqddbr91p9on4a6f6a8b ژێردەست 0 270183 6533131 5869734 2026-09-19T10:24:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533131 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrdest === Rengdêr === {{rengdêr|ckb}} # [[bindest]], [[neazad]], [[neserbixwe]], kesa/ê / welatê û hwd yê di bin destê hinên dî ve alytze3rkee7bh0eqphyih2ac78vcfm ژێردەستی 0 270184 6533132 5869735 2026-09-19T10:24:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533132 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrdestî === Navdêr === {{navdêr|ckb}} # [[bindestî]], rewşa yên bindest tê de dijîn 3pqpfkgpi01hcl8pycpz7ds6w03httf ژێرکەنارە 0 270187 6533133 5869740 2026-09-19T10:24:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533133 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrkenare === Navdêr === {{navdêr|ckb}} # [[jêrenot]], [[binnivîsk]], nîşeyên / ravekên / şiroveyên li binê her rûpelî yan li dawiya nivîsarê bi tîpên hûr tên danîn 8cgpfkyws5w85x8ducbwo1ydyxmevd9 ژێرپیاڵە 0 270189 6533134 5869731 2026-09-19T10:24:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533134 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrpiyalle === Navdêr === {{navdêr|ckb}} # [[binkask]], [[binpiyalok]], sênîkoka piyaleyekê / fincanek datîne tê de daku cihê kefçikê têkvedanê û belkî şekira kabik hebe û belkî ji ber germiya çayê û germbûna piyaleyê baştir e mirov li şûna piyaleyê dest biavêje wê sênîkokê ku jê re binkask tê gotin dkc7okb21pr3l1hnqr0onfxmxflp55m ژێرسەر 0 270190 6533135 5869738 2026-09-19T10:24:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533135 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrser === Navdêr === {{navdêr|ckb}} # [[balguh]], [[balîf]], [[balîfk]], [[binserk]] ej465i6chm6uhu7bxnyzosrrab23fdw ژێرتیپ 0 270191 6533136 5869732 2026-09-19T10:25:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533136 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrtîp === Navdêr === {{navdêr|ckb}} # [[bintîp]], [[kontrol]], [[dîsîplîn]] bzu2fmdu6s7h43xrjue6dlqwnb8vk8e ژێرووزەبەر 0 270193 6533137 5869745 2026-09-19T10:25:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533137 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrûzeber === Rengdêr === {{rengdêr|ckb}} # [[serobin]], [[tevlihev]] lgog0puk3zkjrasywyeboldyzaduxg4 ژێرزەمین 0 270194 6533138 5869736 2026-09-19T10:25:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533138 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrzemîn === Rengdêr === {{rengdêr|ckb}} # [[binerd]], [[binax]] s58rz1xx45tdu02udfibfyqd6stizwi ژێرزەمینی 0 270195 6533139 5869737 2026-09-19T10:25:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533139 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jêrzemînî === Rengdêr === {{rengdêr|ckb}} # [[binerdî]], [[binaxî]] h1we6jrrd3a7y27uanme326pv8t0ww3 ژلێوە 0 270197 6533140 5869697 2026-09-19T10:25:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533140 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jilêwe === Navdêr === {{navdêr|ckb}} # [[kiş]], [[kişkirin]], [[şarandin]], [[lêsorkirin]], [[kişkişandin]] 6gvowu5t122sbza6g1p87wnt3u3h7c4 ژمار 0 270198 6533141 5869698 2026-09-19T10:25:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533141 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimar === Navdêr === {{navdêr|ckb}} # [[jimar]], [[hejmar]], [[hesab]] 6jdbj5mm0e1dmbd8o4fzdgf0dszlrqp ژماردن 0 270199 6533142 5869699 2026-09-19T10:26:09Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533142 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimardin === Lêker === {{lêker|ckb}} # [[jimartin]], [[hejmartin]], [[hijmartin]] cl6wmj0kpv3opakdkdvpb7aly8gdk0w ژمارەگر 0 270201 6533143 5869703 2026-09-19T10:26:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533143 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimaregir === Navdêr === {{navdêr|ckb}} # [[jimaregir]], [[hesabgir]], kesa/ê karê jimartina / hesabkirina lêçûn û dahateyan dike mg20xddbbp5apq8kkhi0itoagjybjfs ژمارەگری 0 270202 6533144 5869704 2026-09-19T10:26:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533144 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimaregirî === Navdêr === {{navdêr|ckb}} # [[jimaregirî]], [[hesabgirî]], jimartina / hesabkirina lêçûn û dahateyan 690stnglm9fwj8xh2yj3pnuhmvxu7m4 ژمارکار 0 270204 6533145 5869700 2026-09-19T10:26:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533145 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimarkar === Navdêr === {{navdêr|ckb}} # [[jimarkar]], makîneya hesabkirinê tjstrxl1euybhyphpe3vf8w3enaj6zz ژمارکۆ 0 270205 6533146 5869701 2026-09-19T10:26:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533146 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimarko === Navdêr === {{navdêr|ckb}} # [[hiljimar]], [[statîstîk]], [[jimarko]] grs2wvsyqmmft1g1xtc8p88t8beoby7 ژمێرە 0 270206 6533147 5869706 2026-09-19T10:26:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533147 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jimêre === Navdêr === {{navdêr|ckb}} # [[jimêre]], di matematîkê de beşa jimare û jimartina wan 0bk290l92bydhsgfui0nyqahqbfqrxw ژنانی 0 270209 6533148 5869707 2026-09-19T10:27:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533148 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jinanî === Navdêr === {{navdêr|ckb}} # [[jinanî]], [[jinok]], [[serjin]], [[jinik]], [[nemêr]], [[nezelam]] ivquw7r1ru18pfj18ib1v4n73mm5tav ژنەشا 0 270210 6533149 5869711 2026-09-19T10:27:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533149 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jineşa === Navdêr === {{navdêr|ckb}} # [[şabanû]], jina şah / padişah / qral / melik r2lsewvll89ze5nyjeblpsdthm4au21 ژنێتی 0 270211 6533150 5869710 2026-09-19T10:27:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533150 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jinêtî === Navdêr === {{navdêr|ckb}} # [[jinî]], [[jinîtî]], [[jinbûn]] dotj565cpsy4r7jb3g60020j436f6zg ژیانی 0 270216 6533151 5869720 2026-09-19T10:27:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533151 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jiyanî === Navdêr === {{navdêr|ckb}} # [[jiyanî]], hindî jiyanê giring 4432ndnr29rg28qkv1b2i8rrfwknlqk ژیاری 0 270218 6533152 5869719 2026-09-19T10:27:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533152 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jiyarî === Navdêr === {{navdêr|ckb}} # [[jiyarî]], debara / îdareya jiyanê pvd7lztz4em4ax5dfqs3pn24jxjkm55 ژیھاتن 0 270219 6533153 5869752 2026-09-19T10:27:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533153 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jîhatin === Navdêr === {{navdêr|ckb}} # [[pêşketin]], [[peresîn]], [[firajî]] fglpt7e2h8gwu3vtw50t1v174mxxoaj ژینامە 0 270221 6533154 5869750 2026-09-19T10:28:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533154 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jîname === Navdêr === {{navdêr|ckb}} # [[jînname]], [[jiyanname]], [[jînenîgar]], [[bîbliyografî]], [[çîrokjiyan]], çîroka jiyana kesekê/î 8dexaurolo4fy14xhgbjw599y9xpv4y ژیری 0 270228 6533155 5869746 2026-09-19T10:28:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533155 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jîrî === Navdêr === {{navdêr|ckb}} # [[jîrî]], hêza / şiyana têgihîna / famkirinê (t zû yan bi asanî) jv00if6recrrvmqbvp3s2cffjn7y4ay ژیرکەلە 0 270229 6533156 5869739 2026-09-19T10:28:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533156 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jîrkele === Rengdêr === {{rengdêr|ckb}} # [[aşt]], [[tena]], [[rehet]], [[tebitî]], [[vehewayî]] (t zarok dema nagirî) rl3ersh1q6y3bm1zaukub629qpzf4ea ژیوار 0 270231 6533157 5869753 2026-09-19T10:28:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533157 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jîwar === Navdêr === {{navdêr|ckb}} # [[jîwar]], [[pozîsyon]], rewşa / pileya mirovek di jiyana xwe de tê de ketste5la3fdhkz50aor2nzhfstyiik ژووان 0 270232 6533158 5869713 2026-09-19T10:28:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533158 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :juwan === Navdêr === {{navdêr|ckb}} # [[jivan]], [[soz]], [[randevû]], [[hevdîtin]], [[dîdar]] 94j4yzn7fsk1hx2gvc81zltprf6gs8k ژوورۆچکە 0 270236 6533159 5869716 2026-09-19T10:28:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533159 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :jûroçke === Navdêr === {{navdêr|ckb}} # [[çavî]], [[hucre]], [[odek]], odeya biçûk h4y1iwnvmzdofdtv3l1346als8raim1 کابان 0 270238 6533160 5872932 2026-09-19T10:29:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533160 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaban === Navdêr === {{navdêr|ckb}} # [[kabanî]], [[kevanî]], [[jin]], jina bermalî 3ikdtluxdk1odv2l2ugtz9roz0l7wcv کابینە 0 270240 6533161 5872937 2026-09-19T10:29:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533161 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kabîne === Navdêr === {{navdêr|ckb}} # [[kabîne]], [[hukumet]], civata wezîran ra3ewqrml37m44sdpwre4f3yaykbhv6 کابرا 0 270241 6533162 5872933 2026-09-19T10:29:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533162 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kabra === Navdêr === {{navdêr|ckb}} # [[camêr]], [[zelam]], [[mêr]], [[mêrik]], [[peya]], [[kabra]] qba6exazoqlbtn3667wsf93jhozp2o6 کاچ 0 270242 6533163 6433266 2026-09-19T10:29:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533163 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaç === Navdêr === {{navdêr|ckb}} # (dar) [[kaj]], [[qaç]] ==== Anagram ==== * {{anagram|ckb|a=اچک|چاک}} lpby5maeze5se7va9rudf3arwfitxve کادان 0 270244 6533164 5872950 2026-09-19T10:29:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533164 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kadan === Navdêr === {{navdêr|ckb}} # [[kadîn]], xaniyê ka tê ve têt parastin kebz1tptqz1a9qxiy0qhxmxv15h5u35 کاھوو 0 270247 6533165 5873146 2026-09-19T10:29:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533165 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kahû === Navdêr === {{navdêr|ckb}} # [[xes]], giyayek e selete jê tê çêkirin 0kk0vdydo973yp5u1imm7j5zaedgvhu کاژەڵاخ 0 270249 6533166 5873057 2026-09-19T10:30:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533166 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kajellax === Navdêr === {{navdêr|ckb}} # [[kulox]], [[ser]] 4s99hwbokggs5ue0xqvnea52dnz03h8 کاک 0 270250 6533167 5873082 2026-09-19T10:30:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533167 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kak === Rengdêr === {{rengdêr|ckb}} # [[kek]], [[kak]], birayê mezin, [[kek]], [[hêja]], [[birêz]], [[berkeftî]], [[ezîz]], [[bihagiran]] p9uq0g1f5uchhj5as1ws4n6bj4pbiix کاکڵ 0 270254 6533168 5873083 2026-09-19T10:30:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533168 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kakill === Navdêr === {{navdêr|ckb}} # [[kakil]], nava tiştekî ya girin # [[pirtik]], [[parçe]], [[pate]], [[paçe]] 1v96n44xlnjd661vlsxyvhlpbzcw5lf کاکۆ 0 270256 6533169 5873084 2026-09-19T10:30:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533169 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kako === Navdêr === {{navdêr|ckb}} # [[gidîş]], koma kayê 57bwsz52l9415enyyw71dv210z1paa6 کاڵا 0 270258 6533170 5873092 2026-09-19T10:30:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533170 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kalla === Navdêr === {{navdêr|ckb}} # [[pertal]], [[perok]], [[cil]], [[libas]] 91npl3wytruot17y8nm8jt0uhkzczpn کالان 0 270259 6533171 5873095 2026-09-19T10:30:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533171 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kalan === Navdêr === {{navdêr|ckb}} # [[kevlan]], [[şûrdank]], [[kaloxk]], alava şûr tê de têt danîn dema mirov wî bi xwe re tîne û dibe daku ziyanan negihîne mirov yan daku pîs nebe ndozr1bwr5b1w5rc4jyrtvknmgujh67 کاڵات 0 270260 6533172 5873093 2026-09-19T10:31:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533172 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kallat === Navdêr === {{navdêr|ckb}} # [[talan]], [[şelandin]] mbe0zai9etpom0a6v4cn10jsbwuijtj کالە 0 270261 6533173 6433543 2026-09-19T10:31:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533173 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kale === Navdêr === {{navdêr|ckb}} # [[pêlav]], [[sol]] ==== Anagram ==== * {{anagram|ckb|a=الکە|کەلا}} gmo9gb1ytcaq9tb6iwihcspql5fyylv کاڵەک 0 270262 6533174 5873104 2026-09-19T10:31:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533174 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kallek === Navdêr === {{navdêr|ckb}} # [[gundor]], [[petêx]], [[talik]], [[kalik]] g6sa0bau4ksnb4wkwxkwkqlerw85tcy کالی 0 270264 6533175 5873099 2026-09-19T10:31:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533175 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kalî === Navdêr === {{navdêr|ckb}} # [[kalî]], [[pîrî]], [[dijw]], [[gencî]], [[xortî]], [[ciwanî]] 4zrsyuftwiu0tdf4tv76q52x8bzs0sj کامار 0 270267 6533176 5873107 2026-09-19T10:31:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533176 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kamar === Navdêr === {{navdêr|ckb}} # [[dorber]], [[tixûb]] pf57bgwacn9d9a979seuy1tqgyy2s1f کاماخ 0 270268 6533177 5873106 2026-09-19T10:31:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533177 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kamax === Navdêr === {{navdêr|ckb}} # [[ran]], [[rehn]], [[qalçe]], [[derqûn]] tc0az7zeo27f7m107k428iwr17v3e52 کامەرانی 0 270270 6533178 5873120 2026-09-19T10:32:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533178 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kameranî === Navdêr === {{navdêr|ckb}} # [[bextiyarî]], [[bextxweşî]], [[kameranî]], [[dilşayî]], [[dilşadî]], [[serkeftinî]] i6ih6bcw9wixud3ha1kbmr26kt20z3o کامپ 0 270273 6533179 5873108 2026-09-19T10:32:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533179 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kamp === Navdêr === {{navdêr|ckb}} # [[kamp]], [[war]], [[wargeh]] dz82dt5vlof674etglohewy1b2uktlc کانوون 0 270282 6533180 5873135 2026-09-19T10:32:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533180 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kanûn === Navdêr === {{navdêr|ckb}} # [[kanûn]] :~î yekem kanûna yekê, [[berfanbar]], meha 12 ji salnameya romî, '':~î duwem kanûna duyê, [[rêbendan]], meha 1 ji salnameya romî'' 3utbra800fv1wukjw5zetyqv9f85f37 کانزا 0 270283 6533181 5873132 2026-09-19T10:32:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533181 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kanza === Navdêr === {{navdêr|ckb}} # [[kanza]], [[maden]], [[metal]] d7wbltg7rf4oqzv4ksxm1v94uao7c3e کانزایی 0 270284 6533182 5873133 2026-09-19T10:32:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533182 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kanzayî === Rengdêr === {{rengdêr|ckb}} # [[kanzayî]], [[madenî]], [[metalîk]] 6m5ys4409l3qapn1hdmpf8sv19fhgae کاپۆڵ 0 270285 6533183 5872940 2026-09-19T10:32:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533183 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kapoll === Navdêr === {{navdêr|ckb}} # [[kulox]], [[ser]] o2cyt66d7npu2z2m20747gvj05qsqxq کاراسک 0 270288 6533184 5872971 2026-09-19T10:33:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533184 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karask === Navdêr === {{navdêr|ckb}} # [[karxezal]], xezalên hê mezin nebûne hae3g8kgy4dd6jhwimwrhwceernhnat کاراشنا 0 270289 6533185 5872972 2026-09-19T10:33:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533185 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karaşna === Navdêr === {{navdêr|ckb}} # [[şareza]], [[karnas]], [[pispor]], kesa/ê karekî baş dizane / dinase 50b2kzryp0iv73nsy7226nq3uyrb995 کاراشنایی 0 270290 6533186 5872973 2026-09-19T10:33:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533186 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karaşnayî === Navdêr === {{navdêr|ckb}} # [[şarezatî]], [[karnasî]], [[pisporî]] l8yl2rvnrlkh0v3auqgksxt7wlafaam کاربەدەستی 0 270292 6533187 5872986 2026-09-19T10:33:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533187 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karbedestî === Navdêr === {{navdêr|ckb}} # [[karbidestî]], [[rayedarî]], [[desthilatdarî]] axzzkgovsegbj1htm8bj25j4vjh1csa کاربرا 0 270294 6533188 5872981 2026-09-19T10:33:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533188 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karbira === Navdêr === {{navdêr|ckb}} # [[hevkar]], kesên li gel hev karekî dikin a2q4hoxpfum65q1kw23hc575i9rw885 کاربرایەتی 0 270295 6533189 5872982 2026-09-19T10:33:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533189 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karbirayetî === Navdêr === {{navdêr|ckb}} # [[hevkarî]], kirina karekî li gel hev 1ucw47l3poi4mntuky3dlxhes4iwq31 کاربین 0 270296 6533190 5872984 2026-09-19T10:34:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533190 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karbîn === Navdêr === {{navdêr|ckb}} # [[pispor]], [[şareza]], zanaya/ê karekî k4ptbzktjd2vo0z9bs8egvl4l9lk8j5 کاردانەوە 0 270297 6533191 5872995 2026-09-19T10:34:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533191 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kardanewe === Navdêr === {{navdêr|ckb}} # [[bertek]], [[bersiv]], [[reaksiyon]] 4dezcizmj3cdeya5oj61cwwf4eqmemt کارەبا 0 270299 6533192 5873050 2026-09-19T10:34:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533192 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kareba === Navdêr === {{navdêr|ckb}} # [[kareba]], [[kehreba]], [[elektrîk]], [[ceyra]] # [[zîqok]], [[zîqzîqok]], hin pirtikên gewerî yên biriqin in bi cilên <st1:City><st1:place>jinan</st1:place></st1:City> / keçan ve tên zeliqandin daku xweşik bin dpolle0s2s8qihpwy54vcj4f76ynq74 کارەکەر 0 270300 6533193 5873055 2026-09-19T10:34:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533193 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kareker === Navdêr === {{navdêr|ckb}} # [[xidam]], xizmetkara jin / keç ku7cn6oerfzc3xxsh34zix5b8ymop73 کارەسات 0 270301 6533194 5873054 2026-09-19T10:34:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533194 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karesat === Navdêr === {{navdêr|ckb}} # [[bela]], [[karesat]], [[bextreşî]] 5gm26nl5ugmsd69r6j4mmm6v8ucetek کارگە 0 270306 6533195 5873027 2026-09-19T10:34:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533195 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karge === Navdêr === {{navdêr|ckb}} # [[karge]], [[kargeh]], cihê kar lê têt kirin s9l670lhac7efhypd50vcf48el3ozml کارگەر 0 270307 6533196 5873028 2026-09-19T10:35:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533196 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karger === Navdêr === {{navdêr|ckb}} # [[sedem]], [[binas]], [[sebeb]], [[ho]], [[faktor]] t78a3lzy3ikzm6yt16li8gm7xvg3uwn کارگێڕی 0 270309 6533197 5873026 2026-09-19T10:35:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533197 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kargêrrî === Navdêr === {{navdêr|ckb}} # [[kargêrî]], [[birêveberî]], [[serkêşî]] 0bbfc6ivxjo1ea2n30dkpwf9hcpbsiv کارگوزاری 0 270311 6533198 5873024 2026-09-19T10:35:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533198 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karguzarî === Navdêr === {{navdêr|ckb}} # [[kêr]], [[bikêrhatin]], [[bikêrî]], [[xizmet]], [[xizmetkarî]] toofptdur5w0nhorrgdjz5ocft3igf7 کارھاتوو 0 270312 6533199 5873036 2026-09-19T10:35:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533199 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karhatû === Rengdêr === {{rengdêr|ckb}} # [[kêrhatî]], [[bikêr]], [[bikêrhatî]] 9q3skg97zv97ujj1915qaizj41mwlne کارژۆلە 0 270316 6533200 5873006 2026-09-19T10:35:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533200 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karjole === Navdêr === {{navdêr|ckb}} # [[karik]], [[kehrik]], kara / kehra sava / nûçêbûyî pf3x07sctbpltak16x9pojnb2c08vv6 کارکەنار 0 270317 6533201 5873015 2026-09-19T10:35:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533201 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karkenar === Rengdêr === {{rengdêr|ckb}} # [[karkinar]], [[zanenşîn]], [[teqawid]] izsgenu9edwfl9yk0dihoh393jepqmf کارکەناری 0 270318 6533202 5873016 2026-09-19T10:36:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533202 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karkenarî === Navdêr === {{navdêr|ckb}} # [[karkinarî]], [[zanenşînî]], [[teqawidî]] 2lsf6k6qwmrmvbmzgph0r9vnw0uoi2s کارکەر 0 270319 6533203 5873014 2026-09-19T10:36:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533203 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karker === Navdêr === {{navdêr|ckb}} # [[karker]], [[şolker]], [[îşker]], [[şuxlker]], kesa/ê kar / şol / îş / şuxl dike 0na48ujya49lnn4jkr87ibhy3x68ukb کارکردە 0 270320 6533204 6433566 2026-09-19T10:36:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533204 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karkirde === Navdêr === {{navdêr|ckb}} # [[şareza]], [[pispor]], [[karzan]], [[karkirde]] ==== Anagram ==== * {{anagram|ckb|a=ادررککە|کردەکار}} 6lohin3oh96rt7ng9i9uv298e7m460h کارساز 0 270324 6533205 5873007 2026-09-19T10:36:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533205 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karsaz === Navdêr === {{navdêr|ckb}} # [[karsaz]], kesa/ê yan şirketa tiştan çêdik # [[çêker]], kesa/ê tiştekî çêdike / karekî dike sd0881nqu1856ot108c8kjnlwbpjhu9 کارووبار 0 270325 6533206 5873044 2026-09-19T10:36:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533206 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karûbar === Navdêr === {{navdêr|ckb}} # [[karûbar]], [[kar]], kar û tiştên dî yên pê re e3k5pp9ljoupkeldrget2nejxj2jomw کاروانکەر 0 270330 6533207 5873042 2026-09-19T10:36:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533207 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karwanker === Navdêr === {{navdêr|ckb}} # [[gerestêr]], [[planet]] 9fyphkjtkn0sgq1ozsy5v1b76iwt2f2 کاروانکوژ 0 270331 6533209 5873041 2026-09-19T10:37:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533209 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karwankuj === Navdêr === {{navdêr|ckb}} # stêra spêdeyê, [[karwankuj]] rlcm4d3kuuhbqlhmcibokvk319w08dv کارخانە 0 270332 6533210 5872990 2026-09-19T10:37:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533210 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karxane === Navdêr === {{navdêr|ckb}} # [[karxane]], [[kargeh]], cihê kar lê têt kirin, [[fabrîqe]] 9ies3ouqswv4og7d0lz5u7jfxts2skx کارزان 0 270333 6533211 5873004 2026-09-19T10:37:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533211 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karzan === Navdêr === {{navdêr|ckb}} # [[karzan]], [[pispor]], [[şareza]], kesa/ê karekî (baş) dizane 092mykifi6qbk4fsa8wsrkwdhvsjtnv کارزانی 0 270334 6533212 5873005 2026-09-19T10:37:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533212 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :karzanî === Navdêr === {{navdêr|ckb}} # [[karzanî]], [[pisporî]], [[şarezayî]] ngcaos4hx4qnu7mxhj7gy21y4jkl780 کاسب 0 270337 6533213 6433197 2026-09-19T10:37:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533213 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kasib === Navdêr === {{navdêr|ckb}} # [[bazirgan]], [[ticar]], [[tacir]], [[dikandar]] ==== Anagram ==== * {{anagram|ckb|a=ابسک|باسک}} 769fa598bkktv3ndh6lr6aqt2cr3fcu کاسبی 0 270338 6533214 5873059 2026-09-19T10:37:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533214 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kasibî === Navdêr === {{navdêr|ckb}} # [[bazirganî]], [[ticaret]], [[dikandarî]] f04y8pu0co22wjnp1cf2yz95sl3vep0 کاسی 0 270339 6533215 5873068 2026-09-19T10:38:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533215 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kasî === Navdêr === {{navdêr|ckb}} # [[gêjî]], [[bêhayî]], [[matî]], [[ecêbgirtinî]], matmanî; mismidî pij90n4wc98fau5p1m3cb7octpj6n39 کاسپ 0 270340 6533216 5873060 2026-09-19T10:38:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533216 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kasp === Navdêr === {{navdêr|ckb}} # [[bazar]], [[bazirganî]], [[ticaret]] cyqzcgw92kj1xipf7wleel9s3kjtb2e کاستی 0 270341 6533218 5873061 2026-09-19T10:38:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533218 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kastî === Navdêr === {{navdêr|ckb}} # [[kêmasî]], [[kêmûkasî]] 1lmxih6cff14pilbdv1ovybfyp8w65p کاشانە 0 270343 6533219 5873070 2026-09-19T10:38:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533219 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaşane === Navdêr === {{navdêr|ckb}} # [[koşk]], [[koçk]], [[seray]], [[qesr]], xaniyên mezin û bihagiran hnx1hmv18e46zfsbx5njglmg8ng8uji کاشە 0 270344 6533220 5873074 2026-09-19T10:38:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533220 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaşe === Navdêr === {{navdêr|ckb}} # [[kaşe]], tiştê mirov li ser / têde rûdine û xwe li ser berfê dixwişînin fcqmzs79j8g986p6x2ak46p53c6x781 کاشی 0 270345 6533221 5873073 2026-09-19T10:38:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533221 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaşî === Navdêr === {{navdêr|ckb}} # [[kaş]], [[libin]], [[blok]] osz2xd0r3idfmetp1d7x0s4dzrbsjpd کات 0 270346 6533222 5872941 2026-09-19T10:39:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533222 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kat === Navdêr === {{navdêr|ckb}} # [[dem]], [[wext]], [[çax]], [[zeman]] gplm32uu3679dnowphr0p5thx766n70 کاتەوکات 0 270347 6533223 5872944 2026-09-19T10:39:19Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533223 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :katewkat === Hoker === {{hoker|ckb}} # [[carinan]], [[car car]], geh geh aah7nbl02xb8lhg725jkt0k0ykyznuj کاتپێو 0 270351 6533224 5872943 2026-09-19T10:39:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533224 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :katpêw === Navdêr === {{navdêr|ckb}} # [[dempîvk]], alava pêpîvana / pêdiyarkirina demê f1955uxaedm1rx36y9zc08dqz83164e کاو 0 270352 6533225 5873147 2026-09-19T10:39:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533225 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaw === Navdêr === {{navdêr|ckb}} # [[kerb]], [[kîn]], [[nefret]] hxwotr8wpn0q0ff55fwyod0mn8v7g03 کاوێژ 0 270353 6533226 5873153 2026-09-19T10:39:49Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533226 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kawêj === Lêker === {{lêker|ckb}} # [[cûn]], [[cûtin]] g0xed6b3kwhmczi51dcbvx07ju4bvgt کاوڕ 0 270355 6533227 5873148 2026-09-19T10:39:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533227 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kawirr === Navdêr === {{navdêr|ckb}} # [[kavirr]], mihên di navbera temenê 3 û 6 mehî de m34qnysp8p6a9c1sjfc33g0qyr9prw6 کاخەز 0 270358 6533228 5872948 2026-09-19T10:40:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533228 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kaxez === Navdêr === {{navdêr|ckb}} # [[per]], [[kaxez]], [[kaxiz]], [[pel]], [[name]] 1bjahkayydgry6mt9p4dg3fsla9fcpd کەباب 0 270361 6533229 5874409 2026-09-19T10:40:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533229 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kebab === Navdêr === {{navdêr|ckb}} # [[kebab]], pirtên goşt yên bi şifşeyan ve li ser yan ber agir tên biraştin qzk7hlx78yubv7n0bf0pyrkrfaet95u کەچەڵ 0 270366 6533231 5874424 2026-09-19T10:40:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533231 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keçell === Rengdêr === {{rengdêr|ckb}} # [[keçel]], hewês [h wek heft] mdsgc1icrahkmnc5sj3x7mscj63iie1 کەفالەت 0 270369 6533232 5874539 2026-09-19T10:40:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533232 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kefalet === Navdêr === {{navdêr|ckb}} # [[kefalet]], [[gerew]], [[garantî]], [[misogerî]] i3qwgnxq2zsvm38n2nh8aw5die8awmw کەفارەت 0 270370 6533233 5874537 2026-09-19T10:40:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533233 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kefaret === Navdêr === {{navdêr|ckb}} # [[filitîn]], [[xilasî]], [[azadî]], [[silametî]] kdslg0sinnfgbmj509vbo6nkhdcoix7 کەفیل 0 270372 6533234 5874545 2026-09-19T10:40:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533234 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kefîl === Navdêr === {{navdêr|ckb}} # [[kefîl]], [[gerewdêr]], [[garantor]], [[misogerker]] jgk3r67d5ckfzylhd8u8ozypcrl7ulr کەفووکۆڵ 0 270373 6533235 5874543 2026-09-19T10:41:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533235 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kefûkoll === Navdêr === {{navdêr|ckb}} # [[bilq]], kefa bi ser tiştekî dikele dikeve 19d67pdc1hejf0uk2snbj2m3svajfn8 کەژاوە 0 270376 6533236 5874474 2026-09-19T10:41:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533236 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kejawe === Navdêr === {{navdêr|ckb}} # [[şixre]], darqetkên / darbestên wek baran li hespan / hêstiran tên barkirin ebx2vm3413xqogceyykts50bzteiswb کەلا 0 270379 6533237 6433540 2026-09-19T10:41:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533237 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kela === Rengdêr === {{rengdêr|ckb}} # [[varê]], [[avarê]], dûrî rê / navendê, [[dûr]] ==== Anagram ==== * {{anagram|ckb|a=الکە|کالە}} ttytvo9fo432k2shmkv4ogf9dmoy29a کەڵان 0 270382 6533238 5874555 2026-09-19T10:41:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533238 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kellan === Navdêr === {{navdêr|ckb}} # [[serek]], [[serok]], [[mezin]] 2kb0ocwh9and05wqtacbvhuykn1pzbd کەلار 0 270383 6533239 5874549 2026-09-19T10:41:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533239 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelar === Navdêr === {{navdêr|ckb}} # [[gidîş]], koma giyayê dirûyî û li ser hev civand # navê bajarokekî ye li Başûrê Kurdistanê r1are8vzm9qgfwhp7ifhkqzdvktkyyp کەلارە 0 270384 6533240 5874551 2026-09-19T10:41:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533240 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelare === Navdêr === {{navdêr|ckb}} # [[kum]], [[kulav]], [[şewqe]], [[şepqe]] 4jrc16kpzntulcc2e71o3wvmszpb8q5 کەڵب 0 270385 6533241 5874557 2026-09-19T10:42:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533241 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kellb === Navdêr === {{navdêr|ckb}} # [[gumtil]], [[gumtilk]], [[komik]] trxf4chbweqcnrzk15xu96eg0pys3c4 کەڵەگەت 0 270388 6533242 5874599 2026-09-19T10:42:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533242 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelleget === Rengdêr === {{rengdêr|ckb}} # [[bejndirêj]], [[dirêj]] fa3y0nwlqe4gmsnmnkakc1r0n7h3sax کەلەکوچ 0 270390 6533243 5874597 2026-09-19T10:42:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533243 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelekuç === Navdêr === {{navdêr|ckb}} # [[perasû]], [[parsû]] 0vaosbqm7lhrylb99cf5ri7xm453mf0 کەلەلا 0 270391 6533244 5874601 2026-09-19T10:42:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533244 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelela === Rengdêr === {{rengdêr|ckb}} # [[seqet]], bêdest yan bêpî, [[birîndar]], [[kirêtkirî]] boapj635kmf3oaqui2ir074c3b1mk0j کەلەم 0 270392 6533245 5874603 2026-09-19T10:42:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533245 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelem === Navdêr === {{navdêr|ckb}} # [[kelemî]], [[kelem]] gx82o35zv6tl1xfvrlg5uy7sx3guovj کەڵەس 0 270397 6533246 5874587 2026-09-19T10:42:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533246 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelles === Navdêr === {{navdêr|ckb}} # [[bizîng]], [[werîs]] 3f130e4f1gqk78mtr26gpn0x13bbw54 کەلەشەق 0 270398 6533247 5874589 2026-09-19T10:43:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533247 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keleşeq === Rengdêr === {{rengdêr|ckb}} # [[serhişk]], [[înato]], [[biînat]] 46oulp6n3zv5jgxwp8kswn8vfp1s7ja کەلتوور 0 270405 6533248 5874559 2026-09-19T10:43:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533248 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keltûr === Navdêr === {{navdêr|ckb}} # [[çande]], [[tore]], [[kultûr]] 3zo1rg1ccajrpbiggdy2o80br0gpsad کەلووکۆم 0 270406 6533249 5874569 2026-09-19T10:43:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533249 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelûkom === Rengdêr === {{rengdêr|ckb}} # [[bêserûber]] 3vkwca51bdjj7hqkd9na8i3hzwh4twl کەلووپەل 0 270407 6533250 5874565 2026-09-19T10:43:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533250 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelûpel === Navdêr === {{navdêr|ckb}} # [[kerûper]], [[pirtûmirt]], [[hûrûmûr]] edwhppxzw1zkzixo7q9u8r85n52bole کەلواز 0 270409 6533251 6433598 2026-09-19T10:43:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533251 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelwaz === Navdêr === {{navdêr|ckb}} # [[sirrûseqem]], [[sirrûsarma]] ==== Anagram ==== * {{anagram|ckb|a=ازلوکە|زەلکاو}} nvoue28mjg2oop00wetyai2nhqrr1yc کەلخانە 0 270410 6533252 5874561 2026-09-19T10:43:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533252 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kelxane === Navdêr === {{navdêr|ckb}} # [[kelxane]], dikana çek-/ tivengçêkeran byn3ncydx7qya4ch5x4nlwg1atb5hko کەماڵ 0 270412 6533253 6433583 2026-09-19T10:44:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533253 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemall === Rengdêr === {{rengdêr|ckb}} # [[kemal]], [[kamil]], [[tam]], [[temam]], [[bêkêmasî]], [[têrûtijî]] ==== Anagram ==== * {{anagram|ckb|a=امکڵە|کەڵام}} be7wkdfyvws035b97yux24jg9h0t5e0 کەمان 0 270413 6533254 5874612 2026-09-19T10:44:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533254 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keman === Navdêr === {{navdêr|ckb}} # [[keman]], alavek jendar ya muzîkê ye icloo1pmxs6jth6lhrb94pvj4hz4pc5 کەمایەتی 0 270417 6533255 5874616 2026-09-19T10:44:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533255 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemayetî === Navdêr === {{navdêr|ckb}} # [[kêmayetî]], [[mînorîte]], [[kêmanî]] 1jx3100ge2x7q8xwixkn6rg3i9jkgpe کەمچیکڵدانە 0 270419 6533256 5874628 2026-09-19T10:44:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533256 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemçîkilldane === Rengdêr === {{rengdêr|ckb}} # [[venehewayî]], [[bêsebr]], [[balkurt]], [[dw]], [[baldirêj]], [[bisebr]] lgjm8ulior5o5155mqca58t0rf8clsx کەمە 0 270422 6533257 5874661 2026-09-19T10:44:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533257 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keme === Navdêr === {{navdêr|ckb}} # [[rex]], [[kinar]], [[qirax]], [[tenişt]], [[serlêvî]], [[sersinorî]] dnsctryzpaaopcsxhifdmng0fun2x36 کەمەکێک 0 270423 6533258 5874677 2026-09-19T10:44:59Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533258 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemekêk === Hoker === {{hoker|ckb}} # [[piçekê]], [[kêmekê]], [[hinekî]] 421kgpqowbj3b2shkg5kkx4dqiucfub کەمەبەند 0 270424 6533259 5874663 2026-09-19T10:45:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533259 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemebend === Navdêr === {{navdêr|ckb}} # [[kemerbend]], kemerek pan e 2qlr3zixk3t24yiwk2m90k7zjud5ddm کەمەربەستی 0 270425 6533260 5874667 2026-09-19T10:45:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533260 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemerbestî === Navdêr === {{navdêr|ckb}} # [[îmmûnîte]], [[parastinî]] rq2macxeq7f86498arjmr34kelbbw3m کەمەرچین 0 270426 6533261 5874669 2026-09-19T10:45:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533261 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemerçîn === Navdêr === {{navdêr|ckb}} # [[çarşev]], [[mêzer]] m1866rkfzy6tfykh0bpvwyd2cx51sdl کەمەردار 0 270427 6533262 5874671 2026-09-19T10:45:39Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533262 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemerdar === Rengdêr === {{rengdêr|ckb}} # [[kemerdar]], [[kemerkirî]], [[bikemer]] c90u6r79v2y11gi99sbw6rw3z0go0x9 کەمەرەیی 0 270428 6533263 5874675 2026-09-19T10:45:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533263 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemereyî === Navdêr === {{navdêr|ckb}} # [[kemerî]], [[ekwatoriyal]] 7q19kinwjt3eekif16mbkd4h67l5ozp کەمەیی 0 270429 6533264 5874679 2026-09-19T10:45:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533264 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemeyî === Navdêr === {{navdêr|ckb}} # [[rexî]], [[kinarî]], [[qiraxî]], [[teniştî]], [[serlêv]], [[sersinor]] 3e1u6hmnld8oyghwr5rg2jxzu2bl7dx کەمناو 0 270432 6533265 5874640 2026-09-19T10:46:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533265 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemnaw === Navdêr === {{navdêr|ckb}} # [[kêmnas]], kesa/ê yan tişta/ê kêm tê nasîn bjn1grvivsklk5wfmsbwmxdcknpfkie کەمۆ 0 270433 6533266 5874645 2026-09-19T10:46:19Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533266 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemo === Rengdêr === {{rengdêr|ckb}} # [[jîr]], [[zîrek]], [[jêhatî]], [[hişyar]] 9h4kxzib15371a3p254cghpp3s8cqca کەمۆکاری 0 270435 6533267 5874650 2026-09-19T10:46:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533267 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemokarî === Navdêr === {{navdêr|ckb}} # [[manîpulasyon]] rldx1plav2c8snesepor4ksvyejv7so کەمۆیار 0 270436 6533268 5874653 2026-09-19T10:46:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533268 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemoyar === Navdêr === {{navdêr|ckb}} # [[jêhatî]], [[dîplomat]] sa9yiy3kus2r7qxjtzx4vi63drz5f9w کەمۆیاری 0 270437 6533269 5874655 2026-09-19T10:46:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533269 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemoyarî === Navdêr === {{navdêr|ckb}} # [[jêhatinî]], [[dîplomasî]] 8sqxcz4gf3ji7r5ewzd25sr7l19z1ye کەمڕوو 0 270438 6533270 5874634 2026-09-19T10:46:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533270 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemrrû === Rengdêr === {{rengdêr|ckb}} # [[şermîn]], [[fedîker]], kesa/ê şerm / fedî / fihêt dike eksawcllx4dcx01qqstd70sm7t4aiyt کەمتەرخەمی 0 270442 6533271 5874626 2026-09-19T10:47:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533271 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemterxemî === Navdêr === {{navdêr|ckb}} # [[xemsarî]], [[sersarî]] cq8a0olqyyh9h46kp3y6bqejogil6il کەمووکووڕی 0 270445 6533272 5874643 2026-09-19T10:47:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533272 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kemûkûrrî === Navdêr === {{navdêr|ckb}} # [[kêmasî]], [[kêmûkasî]], [[netemamî]] 5g2uaeo7dlcu8digm15g34ircq5t83m کەند 0 270451 6533273 6433600 2026-09-19T10:47:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533273 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kend === Navdêr === {{navdêr|ckb}} # [[kend]], [[çal]], [[xendek]], [[newal]], [[nihal]] ==== Anagram ==== * {{anagram|ckb|a=دنکە|دەنک}} 0yzvpg2qkndhqy896nz53jaxxbumolo کەنداڵ 0 270452 6533274 5874698 2026-09-19T10:47:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533274 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kendall === Navdêr === {{navdêr|ckb}} # [[kendal]], cihê av yan ax tê de datêt 55ens5e8st0l2kcl4vlgke76yj0y1ql کەنداو 0 270453 6533275 5874701 2026-09-19T10:47:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533275 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kendaw === Navdêr === {{navdêr|ckb}} # [[kendav]], [[xelîc]], cihê ava deryayekê lê dike navber du bejayiyan (Agadarî: Ger av li van bejayiyan bisekine, jê re kendav (ing, gulf) tê gotin, Ger di wê navbeyna du bejayiyan re bibore û dîsan bigihe ser avek berfire, jê re tengav (ing, straits) tê gotin h83pj8ls7vp7enixjlnljintsndgarx کەندەک 0 270454 6533276 5874705 2026-09-19T10:48:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533276 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kendek === Navdêr === {{navdêr|ckb}} # [[xendek]], [[kendek]], [[kend]] np6ffwl3v45xs0yv7bv2qbc4ayhj3bu کەندەکار 0 270455 6533277 5874707 2026-09-19T10:48:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533277 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kendekar === Navdêr === {{navdêr|ckb}} # [[kolîner]], [[kolînkar]], kesa/ê dikole g2c281xv0ekw0c2o11wtwiedl0uvqqj کەندەڵان 0 270456 6533278 5874710 2026-09-19T10:48:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533278 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kendellan === Navdêr === {{navdêr|ckb}} # [[kend]], [[şeq]], [[kun]], [[tîk]], [[çal]] eeij0tpkq0fkhya2lhx40k3bwovno0t کەنەفت 0 270458 6533279 5874720 2026-09-19T10:48:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533279 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keneft === Rengdêr === {{rengdêr|ckb}} # [[hewce]], [[lazim]], [[neçar]], [[mecbûr]], [[pêdivî]], [[pêwîst]] kubgro9d0b3t6t0v5x5s0mcghd68ocx کەنەفتی 0 270459 6533280 5874722 2026-09-19T10:48:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533280 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keneftî === Navdêr === {{navdêr|ckb}} # [[hewcetî]], [[lazimî]], [[neçarî]], [[mecbûrî]], [[pêdivîtî]], [[pêwîstî]] cm6xkree3q6g51s97o616zjgqx1fumd کەنیلێ 0 270462 6533281 5874716 2026-09-19T10:48:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533281 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kenîlê === Navdêr === {{navdêr|ckb}} # [[keçik]], [[qîzik]], keça / qîza biçû # [[zerî]], [[canik]], bernavê rêzgirtinê bo keçan (li şûna camêr bo zelaman û xanim bo jinan) a86ivh7i8ciueycie6mmp5crjkf4cnn کەنزەک 0 270464 6533282 5874712 2026-09-19T10:48:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533282 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kenzek === Navdêr === {{navdêr|ckb}} # [[yar]], hevala keç, [[destgirt]] # [[xidam]], [[bermalî]], keçika karûbarên navmalî yên malbatek biyanî dike 5o9x0me1q75t3vcp8gehaqq6rd3vlho کەپەنەک 0 270466 6533283 5874414 2026-09-19T10:49:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533283 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kepenek === Navdêr === {{navdêr|ckb}} # [[kepen]], [[kepene]], [[kepenek]], qapûtek / saqoyek / çakêtek dirêj e (t şivan şivan bi ser milê xwe de dikin) hs7kwk8xx178erx00b5w6nbw555w9l6 کەپرۆکە 0 270467 6533284 5874412 2026-09-19T10:49:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533284 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keproke === Navdêr === {{navdêr|ckb}} # [[kepirk]], [[kepirok]], kepirên biçûk sgl6tp4hfwlz51k3lqh0zcotpk2rjvg کەرە 0 270474 6533285 5874451 2026-09-19T10:49:29Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533285 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kere === Navdêr === {{navdêr|ckb}} # [[nîvişk]], [[rûn]] ryfkrksxlhzfn78mx13rab9jsul118y کەرەجی 0 270475 6533286 5874454 2026-09-19T10:49:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533286 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerecî === Navdêr === {{navdêr|ckb}} # [[belem]], [[keştîk]], keştiyên biçûk, amraza raguhezandinê ya seravî 1aq4wg4blyus79wcr4wqjvbrlhkdqd4 کەرەکێوی 0 270477 6533287 5874460 2026-09-19T10:49:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533287 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerekêwî === Navdêr === {{navdêr|ckb}} # [[kerekûvî]], [[zebra]] 7pjtcyki8n16609r43bj0m5tzsm4hat کەڕەنسۆ 0 270480 6533288 5874464 2026-09-19T10:49:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533288 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerreniso === Rengdêr === {{rengdêr|ckb}} # [[bêxem]], [[sersar]], [[xemsar]], kesa/ê t tişt bo ne xem e 5kk5gau246vepfo30mdnffeq38668yl کەرەنتوو 0 270481 6533289 5874462 2026-09-19T10:50:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533289 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerentû === Navdêr === {{navdêr|ckb}} # [[kêlendî]], [[şalok]] alava giyadirûnê 4q0blyx9rvpzib8nmxq8jlnsjv7rjqn کەرەسە 0 270482 6533290 5874456 2026-09-19T10:50:19Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533290 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerese === Navdêr === {{navdêr|ckb}} # [[kerese]], [[materyal]] m5iyfu5l0e0jr08fdh26fec9gj4edin کەڕەت 0 270483 6533291 5874452 2026-09-19T10:50:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533291 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerret === Navdêr === {{navdêr|ckb}} # [[car]], [[gav]], [[dem]], [[bîsk]], [[kêlîk]] 3948ldn1q5yue8dv809o07anfj0xi2y کەڕەتی 0 270484 6533292 5874453 2026-09-19T10:50:39Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533292 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerretî === Hoker === {{hoker|ckb}} # [[carcarî]], [[carinan]], [[carcar]] mf4zbrx55do2dw3qdgjyh78n2pbioye کەرەوز 0 270486 6533293 5874468 2026-09-19T10:50:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533293 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerewz === Navdêr === {{navdêr|ckb}} # [[kerefs]], [[bexdenoz]], [[meydenoz]], navê giyayek xwerbar e qb8pele04emm6e0lbgrociqqz6fz8ag کەرگەز 0 270488 6533294 5874442 2026-09-19T10:50:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533294 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kergez === Navdêr === {{navdêr|ckb}} # [[xertel]], [[eylo]], [[sîsalk]], [[sêmirr]], [[dalereşk]], [[kergezk]] 57tcnvovxqsrlddbq9abxr35kdzuwgz کەڕی 0 270490 6533295 5874449 2026-09-19T10:51:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533295 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerrî === Navdêr === {{navdêr|ckb}} # [[kerrî]], nebûna hinêra bîstinê / guhlêbûnê m96ne87ex2xyxfvbaq9pnfe2yrit4rk کەرکە 0 270491 6533296 5874441 2026-09-19T10:51:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533296 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerke === Navdêr === {{navdêr|ckb}} # [[nîvgirav]], bn nîmçedorge 4go2rijwq7zv2t982rzi9kncihffrep کەرۆکە 0 270493 6533297 5874448 2026-09-19T10:51:29Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533297 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keroke === Rengdêr === {{rengdêr|ckb}} # [[kerok]], [[kerkok]], [[bêaqilok]], [[peledîn]] fmiy9d3s5uwyt74dedxufvzttz2jz4t کەرپەسە 0 270494 6533298 5874432 2026-09-19T10:51:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533298 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerpese === Navdêr === {{navdêr|ckb}} # [[xemegurî]], [[margîsok]], [[marik]], [[marok]] 66a0x6py6q8i7c0s52chfqwdvumbx2o کەڕووواوی 0 270498 6533299 5874447 2026-09-19T10:51:49Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533299 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerrûwawî === Rengdêr === {{rengdêr|ckb}} # [[pijûkî]], [[kûfîkî]] j20tca26rupkwk3lw37mttkw5an28kw کەرت 0 270500 6533300 5874433 2026-09-19T10:52:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533300 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kert === Navdêr === {{navdêr|ckb}} # [[ker]], [[pirt]], [k-ya nerm wek kêm], [[pişk]], [[par]], [[parçe]], [[pirtik]] ai38z8n5t2g6z0rsrg1sz2etxzejgc9 کەرتە 0 270501 6533301 5874437 2026-09-19T10:52:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533301 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kerte === Navdêr === {{navdêr|ckb}} # [[kîte]], [[kite]], [[kit]], pirtikên peyvan, Nimûne: peyva "azadî" sê-kîteyî ye: a-za-d # [[piç]], [[piçek]] jktjiolro8j24scrkdx5yyds1v78a12 کەرتکراو 0 270503 6533302 5874434 2026-09-19T10:52:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533302 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kertkiraw === Rengdêr === {{rengdêr|ckb}} # [[kerkirî]], bn kert pqxtwswoijc127s30udco28u7z58wpx کەرتووپەرت 0 270504 6533303 5874435 2026-09-19T10:52:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533303 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kertûpert === Navdêr === {{navdêr|ckb}} # [[kerûper]], [[pirtûmirt]], [[kitûmat]], [[hûrûmûr]], bn kert gqzzgzc4sstp8mc3bfmkdn6iz1zz4jz کەسانە 0 270508 6533304 5874479 2026-09-19T10:52:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533304 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kesane === Rengdêr === {{rengdêr|ckb}} # [[kesane]], [[prîvat]], [[şexsî]], [[kesî]] 5a0ejll2w7etvmzkl1eo85f6ewnmnvm کەسیرە 0 270509 6533305 5874495 2026-09-19T10:52:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533305 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kesîre === Rengdêr === {{rengdêr|ckb}} # [[qerisî]], [[qefilî]], [[cemidî]], [[tezî]], [[teziyayî]] fc1rekmbnjhsarx4f6ne0qfo61l7quh کەسکوون 0 270512 6533306 5874487 2026-09-19T10:52:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533306 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keskûn === Rengdêr === {{rengdêr|ckb}} # [[tîj]], xwarina tama wê bihêz 421n4sxjnwf1i5ip0ra3dxjsy278906 کەسکووسۆر 0 270513 6533307 5874485 2026-09-19T10:53:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533307 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keskûsor === Navdêr === {{navdêr|ckb}} # [[keskûsor]], [[keskûala]], [[bûka baranê]], bn pelkezêrrîne 42s3hgcai97wpa70i3h29z5r26j5nw5 کەسنەدیو 0 270515 6533308 5874493 2026-09-19T10:53:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533308 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kesnedîw === Rengdêr === {{rengdêr|ckb}} # [[nedîtî]], [[ kesê-nedîtî]], [[ berê-nedîtî]] l3tx92yiuomc705tkzck6xihfdhvxii کەشاکەش 0 270517 6533309 5874499 2026-09-19T10:53:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533309 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşakeş === Navdêr === {{navdêr|ckb}} # [[derd]], [[kul]], [[keder]], [[keser]], [[eger]], [[elem]], [[êş]], [[jan]] dqz167miv18xi8p6og5zzspld8fbj33 کەشە 0 270518 6533310 5874531 2026-09-19T10:53:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533310 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşe === Navdêr === {{navdêr|ckb}} # [[werz]], [[demsal]], [[car]], [[dem]], [[gav]], [[kêlîk]], [[bîsk]] f7b6bfhdxn50txn3dvx835s75xfu0cq کەشەنگ 0 270519 6533311 5874533 2026-09-19T10:53:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533311 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşeng === Rengdêr === {{rengdêr|ckb}} # [[kincir]], [[peritî]], [[diriyayî]], [[çiryayî]] fu0ekg1vhfcfem3t5ew6faqs5zox86z کەشیش 0 270520 6533312 5874526 2026-09-19T10:54:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533312 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşîş === Navdêr === {{navdêr|ckb}} # [[keşîş]] (di filetiyê de hevberê "feqe" yê misilmanan) dpi16r1jyhdqj144hajgul02jfvqq33 کەشک 0 270521 6533314 5874513 2026-09-19T10:54:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533314 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşk === Navdêr === {{navdêr|ckb}} # [[keşk]], mastê / şîrê / penîrê hişkkirî dzkkeol6yjo395r1kuaopmoob5kgruf کەشکە 0 270522 6533315 5874515 2026-09-19T10:54:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533315 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşke === Navdêr === {{navdêr|ckb}} # [[xwezî]], [[xwezîka]], [[xweziya]], [[xozî]], hêvî dikim ku, baştir e / bû ger j9tghvtkbqz7dmazi1z26sfi6k22u49 کەشمەکەشم 0 270524 6533316 5874522 2026-09-19T10:54:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533316 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşmekeşm === Navdêr === {{navdêr|ckb}} # [[qerebalix]], [[heytûhot]], [[geremol]] p41yvsxrw85757ojdyujl2qrsufy8o4 کەشتیگەل 0 270526 6533317 5874501 2026-09-19T10:54:39Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533317 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keştîgel === Navdêr === {{navdêr|ckb}} # [[keştîgel]], koma keştiyan, [[fîlo]], [[donenme]] hd9hmwavudkzy25jrh3z8t4t8vi5cr1 کەشتیوان 0 270527 6533318 5874503 2026-09-19T10:54:49Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533318 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keştîwan === Navdêr === {{navdêr|ckb}} # [[keştîvan]], [[keştîgêrr]], kesa/ê karê meşandina keştiyekê dike 064awnsh55mixxdr6olksu99w5ak9fi کەشتیوانی 0 270528 6533319 5874505 2026-09-19T10:54:59Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533319 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keştîwanî === Navdêr === {{navdêr|ckb}} # [[keştîvanî]], [[keştîgêrrî]] ociikeer5guh06bde6rahdi6g31q6m5 کەشخە 0 270530 6533320 5874507 2026-09-19T10:55:09Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533320 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşxe === Rengdêr === {{rengdêr|ckb}} # [[keşxe]], [[xweşik]], [[delal]], [[spehî]], [[bedew]], [[ciwan]] ozn3njfz7yiuk4yg2i8quczetaynirg کەشیە 0 270531 6533321 5874528 2026-09-19T10:55:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533321 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşye === Navdêr === {{navdêr|ckb}} # [[keşye]], [[şaşik]], [[cemedanî]], [[dersok]] (t ya zer ya hecî dikin zerê xwe) kmo59kabypfatl9ctv3goyg6vf8pyrn کەشزان 0 270532 6533322 5874509 2026-09-19T10:55:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533322 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşzan === Navdêr === {{navdêr|ckb}} # [[seqanas]], [[hewanas]], kesa/ê bi zanista hewa û seqayê mijûl, [[seqadêr]], [[hewadêr]], kesa/ê di navgînek ragihandinê de (televizyon yan radyo) rewşa seqayê radigihîne iz6bgtj6m080naay4qi0joienr74a8s کەشزانی 0 270533 6533323 5874511 2026-09-19T10:55:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533323 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keşzanî === Navdêr === {{navdêr|ckb}} # [[seqanasî]], [[hewanasî]] 9mcxqj2myujh98gdeb2p4e193dj9d1y کەتان 0 270535 6533324 5874416 2026-09-19T10:55:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533324 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ketan === Navdêr === {{navdêr|ckb}} # [[kitan]], [[ketan]], qumaşek e, [[kitan]], [[caw]], [[ketan]] 1m5jn33iqql8dfwpe4eae4cobqffpap کەتە 0 270538 6533325 5874422 2026-09-19T10:55:59Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533325 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kete === Rengdêr === {{rengdêr|ckb}} # [[gir]], [[milpan]], [[mezin]], [[girs]], [[debdebe]], [[gembolan]] qly0us75csl54ta8yxs1aj5eox9spvu کەتن 0 270539 6533326 6433626 2026-09-19T10:56:09Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533326 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ketin === Navdêr === {{navdêr|ckb}} # [[lêb]], [[xap]], [[lêhb]], [[hîle]], [[fêl]], [[fen]], [[xapandin]], '':;bn ketin'' ==== Anagram ==== * {{anagram|ckb|a=تنکە|تەنک}} 4rvllfp3y3dudqhdtd6zbsho44ab04m کەتیرە 0 270540 6533327 5874421 2026-09-19T10:56:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533327 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ketîre === Navdêr === {{navdêr|ckb}} # [[gezo]], ava / dewê daran eumnyeb3wrxyrmu4ulutz6ncmhsirsr کەوا 0 270542 6533328 5874730 2026-09-19T10:56:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533328 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewa === Navdêr === {{navdêr|ckb}} # [[eba]], hin cûn cilên dirêj nx55yvikfmlikwgpw2z0ghrwcdg9rob کەوانکۆشە 0 270544 6533329 5874737 2026-09-19T10:56:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533329 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewankoşe === Navdêr === {{navdêr|ckb}} # [[kevanek]], ev nîşandeka nivîsînê: (, ) t313jz3qest6pqdinepf7wz9xgekb5e کەوچک 0 270549 6533330 5874751 2026-09-19T10:56:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533330 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewçik === Navdêr === {{navdêr|ckb}} # [[kefçik]], [[kefçî]], [[kevçik]], [[kevçî]], alavek pêxwarinê ye i4zno6mv38wowjj85ze9jdteqlnz6s7 کەودەن 0 270551 6533331 5874755 2026-09-19T10:57:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533331 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewden === Rengdêr === {{rengdêr|ckb}} # [[mejîreş]], kesa/ê ti tiştî fam nake, [[peledîn]], [[tirredîn]], [[hepletiraş]], [[delodîn]], [[bêhiş]] rmld8wwi6r0n9c4hqk20r93ho89byhh کەوگیر 0 270555 6533332 5874769 2026-09-19T10:57:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533332 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewgîr === Navdêr === {{navdêr|ckb}} # [[mifsik]], [[heskû]], kefçiyek e di çêkirina xwarinê de bo têkvedanê tê bikaranîn 4t3hlnug4wm4brnochw3ygehgatlijn کەوژ 0 270558 6533333 5874759 2026-09-19T10:57:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533333 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewj === Navdêr === {{navdêr|ckb}} # [[hez]], [[dilbijî]], [[daxwaz]], [[dildarî]], [[azwerî]], [[arezû]] cf5x9z2zlodat8n3ivmeepftk40qo2q کەوژین 0 270559 6533334 5874761 2026-09-19T10:57:30Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533334 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewjîn === Lêker === {{lêker|ckb}} # [[kewjîn]], [[dil bijîn]], [[xwestin]], [[hez kirin]], dil ketin tiştekî 74mlia2yhb11u7kk2imb3rl8lubb7i0 کەوۆت 0 270562 6533335 5874775 2026-09-19T10:57:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533335 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewot === Navdêr === {{navdêr|ckb}} # [[kevot]], [[kevotk]], navê darekê / terraşekê ye khwbnzvmi71yh9qtan8rb13z99mmiby کەوتوو 0 270569 6533336 5874749 2026-09-19T10:57:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533336 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kewtû === Rengdêr === {{rengdêr|ckb}} # [[ketî]], [[keftî]], [[kevtî]] 29ghm7gwdtk2icnpda8rqztl50zil4z کەی 0 270570 6533337 6433647 2026-09-19T10:58:00Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533337 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :key === Hoker === {{hoker|ckb}} # [[kengî]], [[çi demê]], [[kinga]], [[kingê]], çi wextê, çi çaxê ==== Anagram ==== * {{anagram|ckb|a=کیە|یەک}} b318aevf0vsz9iwwcawsno6u7bfdy8b کەیبانوو 0 270571 6533338 5874785 2026-09-19T10:58:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533338 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keybanû === Navdêr === {{navdêr|ckb}} # [[kabanî]], [[kevanî]], [[xanim]], [[bermalî]], [[jin]], [[hurmet]] bsizzfvwpyu2zg8jtticqfwlyl5zfys کەیل 0 270573 6533339 6433653 2026-09-19T10:58:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533339 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keyl === Rengdêr === {{rengdêr|ckb}} # [[xemgîr]], [[xemgîn]], [[têrxem]], [[xemba]] # [[serxweş]], [[mest]], [[sermest]] ==== Anagram ==== * {{anagram|ckb|a=لکیە|لەکی}} 1zhj3gt044qtsvo2xmykanbw8njt8dn کەیلان 0 270574 6533340 6433558 2026-09-19T10:58:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533340 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keylan === Rengdêr === {{rengdêr|ckb}} # [[spehî]], [[delal]], [[bedew]], [[şîrîn]], [[şeng]] ==== Anagram ==== * {{anagram|ckb|a=النکیە|کانیلە}} sipym8cwxusxus8d2zpkwx37dn6jh5c کەیس 0 270575 6533341 5874787 2026-09-19T10:58:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533341 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :keys === Navdêr === {{navdêr|ckb}} # [[delîv]], [[derfet]], [[delîve]], [[keys]], [[şens]] ob8j6lqihcjb74fc9n0syo7qgssqo2x کەزی 0 270578 6533342 5874472 2026-09-19T10:58:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533342 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kezî === Navdêr === {{navdêr|ckb}} # [[kezî]], pirça / porê hûnandî 8gfiptxy7satipxw6ptxpkboxgfiksu کێ 0 270579 6533343 5874354 2026-09-19T10:59:00Z JiyanBot 3048 Cure Cînav hat lêzêdekirin 6533343 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kê === Cînav === {{cînav|ckb}} # [[kî]], '':kê: Kê ye? Kî ye? Bo kê ye? Bo kê ye?'' 6c2dmj4p4yrrmtc2ny89d7w6k3683vs کێچ 0 270580 6533344 5874360 2026-09-19T10:59:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533344 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêç === Navdêr === {{navdêr|ckb}} # [[kêç]], [[spih]] 7cnuw210ig2yltx68bpcl6zjnnwwhyf کێڵراو 0 270584 6533345 5874399 2026-09-19T10:59:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533345 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêllraw === Navdêr === {{navdêr|ckb}} # [[kêlayî]], (ne kûr) [[kolayî]] lpuh8ya8l2wvlbvetnzd9uwxbv3azr0 کێڕ 0 270586 6533346 5874364 2026-09-19T10:59:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533346 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêrr === Navdêr === {{navdêr|ckb}} # [[xet]], [[rêz]] o1d0rvcz7qc8yal3tu1lwrvh1l88v5w کێرزل 0 270588 6533347 5874366 2026-09-19T10:59:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533347 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêrzil === Rengdêr === {{rengdêr|ckb}} # [[pozbilind]], [[difinbilind]], kesa/ê xwe pirr mezin dihesibîne t3l2k2r0blvbpq8gc30cm960u0qdgio کێرزلی 0 270589 6533348 5874368 2026-09-19T10:59:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533348 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêrzilî === Navdêr === {{navdêr|ckb}} # [[pozbilindî]] nocpaai7g6w9wenhvyf9xp5b8rd3q44 کێش 0 270590 6533349 5874379 2026-09-19T11:00:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533349 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêş === Navdêr === {{navdêr|ckb}} # [[kêş]], [[kêşandin]], [[kişandin]], [[giranî]], [[qursî]]; [[kêş]], pîvana helbestan e3oaepa0wvznjpuv00x9wc5x1w2hn8q کێشانەوە 0 270592 6533350 5874381 2026-09-19T11:00:10Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533350 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêşanewe === Lêker === {{lêker|ckb}} # [[vekişandin]], paşve kişandin / kêşan eo68lvuxspfgzg1sf5odjzbs9lql4f2 کێشدار 0 270593 6533351 5874382 2026-09-19T11:00:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533351 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêşdar === Rengdêr === {{rengdêr|ckb}} # [[dirêjvekêş]], bûyera demek dirêj didome f7myzae8q7pal33pbk9ztzihkywoy9e کێشە 0 270594 6533352 5874391 2026-09-19T11:00:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533352 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêşe === Navdêr === {{navdêr|ckb}} # [[pirsgirêk]], [[arîşe]], [[kêşe]], [[problem]], [[girift]], [[dubend]] # [[ked]], [[rênc]], [[rêncberî]] qxzppwmfpgolbaogmngy5awlw7h9mnp کێشمان 0 270596 6533353 5874385 2026-09-19T11:00:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533353 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêşman === Navdêr === {{navdêr|ckb}} # [[kêşman]], dirêjker: gurîsî kêşman werîsê kêşman, werîsê li werîsek din hatiye zêdekirin daku dirêjtir bibe û bigihe ciyekî 6talqzoyt4ln9qxyxbvz00lp1w8oj5v کێشمەکێش 0 270597 6533354 5874386 2026-09-19T11:00:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533354 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêşmekêş === Navdêr === {{navdêr|ckb}} # [[şerenîx]], [[nîgaş]], [[gengeşe]], [[rikmane]] hexoqxysjjdm7m9d13tz3zo7180nnpe کێشراو 0 270599 6533355 5874384 2026-09-19T11:01:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533355 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêşraw === Rengdêr === {{rengdêr|ckb}} # [[kêşayî]], [[kişandî]], [[kêşandî]] i1g8qnpbg1z4b7njqkn70awtbmzml91 کێویلە 0 270602 6533356 5874408 2026-09-19T11:01:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533356 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kêwîle === Rengdêr === {{rengdêr|ckb}} # [[dêm]], [[beyar]], giyayê / fêkiyê bi xwe (ne bi avdana bi destê mirovan) çêdibin fhf5jatjrbab2vxfe64o86zt8ujyhy5 کچەزا 0 270607 6533357 5873209 2026-09-19T11:01:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533357 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiçeza === Navdêr === {{navdêr|ckb}} # [[keçeza]], [[nevî]], zarokên keça kesekî bb45z2dqe8ymitg8v6s2l2rqyal46tb کچکۆڵە 0 270609 6533358 5873202 2026-09-19T11:01:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533358 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiçkolle === Rengdêr === {{rengdêr|ckb}} # [[biçûk]], [[biçûkok]], [[biçkok]] n429ek6opcerbipo2hm736ew43k1ibk کفندڕ 0 270612 6533359 5873547 2026-09-19T11:01:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533359 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kifindirr === Navdêr === {{navdêr|ckb}} # [[kifindirrîn]], ya / yê rê lê nikare bêt girtin, [[berxwedêr]] 3qhl9hl0epzawr9l7d08a1h3gg7mno2 کڵاشچن 0 270620 6533360 5873564 2026-09-19T11:01:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533360 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killaşçin === Navdêr === {{navdêr|ckb}} # [[kalikker]], [[kalikçêker]] c0uh0jr2n545x8e5fxstfvr36wvz1mr کڵاواسن 0 270622 6533361 5873578 2026-09-19T11:02:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533361 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killawasin === Navdêr === {{navdêr|ckb}} # [[kumzirx]], [[kumasin]], [[kulavasin]], kumê / kulavê madenî / asinî / hesinî 79xh7n8w0qaeuwdnluksoadrdizmgaq کڵاوقژ 0 270625 6533362 5873580 2026-09-19T11:02:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533362 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killawqij === Navdêr === {{navdêr|ckb}} # [[perûk]], pirça / porrê çêkirok / nerastîn q4eqpw31avkgwfaplktlse9snd39fzt کڵاوزرێ 0 270626 6533363 5873579 2026-09-19T11:02:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533363 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killawzirê === Navdêr === {{navdêr|ckb}} # [[kumzirx]], [[kumasin]], kumê / kulavê madenî / asinî / hesinî 543jbh79gv0dlnhucl6syu0ipiwiyik کلچان 0 270627 6533364 6433668 2026-09-19T11:02:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533364 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kilçan === Navdêr === {{navdêr|ckb}} # [[fanos]], [[lampe]] ==== Anagram ==== * {{anagram|ckb|a=النچک|لچکان}} 90ohs4ea8nc0ztui275kkl2r49t32ut کلدان 0 270629 6533365 5873589 2026-09-19T11:02:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533365 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kildan === Navdêr === {{navdêr|ckb}} # [[kilda]] # [[kildank]], cihê alavên kildanê tê de tên parastin / ragirtin 7wg3llun0tdjgt7pxpzkiggul4gopvr کلدوومان 0 270630 6533366 5873591 2026-09-19T11:02:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533366 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kildûman === Navdêr === {{navdêr|ckb}} # [[mij]], [[moran]], [[dû]], mij û moran ene7url9135erd7eby4dgdkwdjkqqtp کلەر 0 270631 6533367 5873627 2026-09-19T11:03:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533367 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiler === Navdêr === {{navdêr|ckb}} # [[embar]], [[depo]] qw85mhimmbtl7i9rol6wz6o5j03j8gs کڵێس 0 270632 6533368 5873619 2026-09-19T11:03:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533368 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killês === Rengdêr === {{rengdêr|ckb}} # [[birihayî]], [[qelihayî]], [[qir]], [[nemayî]], [[demborî]], [[kevnbûyî]] ecas2xmadojsxi69p3hix9o82hih0gb کڵێشە 0 270635 6533369 5873621 2026-09-19T11:03:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533369 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killêşe === Navdêr === {{navdêr|ckb}} # [[kefş]], [[binkefş]], [[gulte]] kqxaty3s8cweu2x9cwtqsi1rg9q0rwm کڵفت 0 270636 6533370 5873592 2026-09-19T11:03:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533370 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killift === Rengdêr === {{rengdêr|ckb}} # [[stûr]], [[qalind]], [[asê]] fkzhzew6ojg4czobrstkmgoidfooza6 کلیل 0 270637 6533371 5873623 2026-09-19T11:03:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533371 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kilîl === Navdêr === {{navdêr|ckb}} # [[kilîl]], [[kilît]], [[vekerk]], [[enextar]] dkoa8nh7y7ck06dgwq9g33q78qvno6a کلیم 0 270638 6533372 5873625 2026-09-19T11:03:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533372 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kilîm === Navdêr === {{navdêr|ckb}} # [[kilîm]], [[xalîçe]], [[berik]], [[mehfûr]], [[merş]] j5a45oxdh92imn4apzbcwr0vdiv3qlv کڵۆڵ 0 270641 6533373 5873615 2026-09-19T11:04:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533373 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killoll === Rengdêr === {{rengdêr|ckb}} # [[bextreş]], [[bêsiûd]] f083hb76fnj12jwg254rbun7ss8wu3p کڵۆڵی 0 270642 6533374 5873616 2026-09-19T11:04:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533374 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killollî === Navdêr === {{navdêr|ckb}} # [[bextreşî]], [[bêsiûdî]] ev12n2cn88vveajga8qiqesn4r229ay کڵۆر 0 270643 6533375 5873613 2026-09-19T11:04:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533375 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killor === Rengdêr === {{rengdêr|ckb}} # [[xulole]], dara jixwe kunek yekderî li qurmê wê heye ky2ko2yfbhyc6ey35n10pdr444e4uqn کڵپە 0 270645 6533376 5873583 2026-09-19T11:04:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533376 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killpe === Navdêr === {{navdêr|ckb}} # [[qirç]], [[qirçik]], [[çirûsk]], [[çirîsk]] (yên agirî) bviba9wr566rjof0c00uac5an2z4qvk کڵپووھووڕ 0 270646 6533377 5873582 2026-09-19T11:04:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533377 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :killpûhûrr === Navdêr === {{navdêr|ckb}} # [[gurmij]], agirê pir gur eo8o84k82p0kowfayftdan6s2uqzs38 کنە 0 270650 6533378 6433683 2026-09-19T11:04:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533378 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kine === Navdêr === {{navdêr|ckb}} # [[lêkolîn]], [[hûrlênerî]], [[ezmûn]], [[ceribandin]], [[vekolîn]] ==== Anagram ==== * {{anagram|ckb|a=نکە|کەن}} tgzo291jslrb8mmeyfz1ov9wfd1u32e کنەکار 0 270651 6533379 5873794 2026-09-19T11:05:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533379 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kinekar === Navdêr === {{navdêr|ckb}} # [[lêkol]], [[hûrlêner]], [[ezmûnker]], [[cerribîner]], [[vekol]] 7uyg6kmaw4hcfbcm7k6zyhx0zh83r3z کنگدەر 0 270654 6533380 5873768 2026-09-19T11:05:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533380 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kingder === Navdêr === {{navdêr|ckb}} # [[qûnde]], [[qûnder]], kesê qûna xwe dide / difiroşe (herw, [[ mecazî)]] cskb30612t8k0ptfe3jnjs71oshg1t6 کراس 0 270662 6533381 5873218 2026-09-19T11:05:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533381 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiras === Navdêr === {{navdêr|ckb}} # [[kiras]], [[gumlek]], [[qemûs]] ru41cxxjmatoy6uxlf08fd7w7dd9ya4 کراو 0 270663 6533382 5873219 2026-09-19T11:05:30Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533382 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiraw === Lêker === {{lêker|ckb}} # [[kirî]], [[hatî kirin]], (ya / yê) hatiye kirin 6qzdc1pr72qul67i47b79x7drw476ps کرداری 0 270666 6533383 5873238 2026-09-19T11:05:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533383 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirdarî === Navdêr === {{navdêr|ckb}} # [[kirarî]], [[pratîkî]], [[jiyanî]] 27as2f5q61ubtzwkp74o21ap2pp6v41 کردە 0 270667 6533384 5873256 2026-09-19T11:05:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533384 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirde === Navdêr === {{navdêr|ckb}} # [[kar]], [[xebat]] :Kirdey min û birdey ewe Ez dikim û ew dixwe ih8ooew2wetznbu061tcb8kmcz0brg0 کردەگار 0 270668 6533385 5873260 2026-09-19T11:06:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533385 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :Kirdegar === Navdêr === {{navdêr|ckb}} # [[Yezdan]], [[Afirîner]], [[Xwedê]] st6569eyg32x1b7858wgo613xjh8hp7 کردەکار 0 270669 6533386 6433564 2026-09-19T11:06:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533386 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirdekar === Navdêr === {{navdêr|ckb}} # [[rêveber]], [[çêker]] ==== Anagram ==== * {{anagram|ckb|a=ادررککە|کارکردە}} 0ljb8m8vfmwv5r140n77gllfubrfcok کڕە 0 270672 6533387 6433689 2026-09-19T11:06:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533387 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirre === Navdêr === {{navdêr|ckb}} # [[conî]], [[cuhnî]], [[destarr]] ==== Anagram ==== * {{anagram|ckb|a=ڕکە|ڕکە|کەڕ}} ccz0072s4m051p6j15dp447l7imotdm کڕەک 0 270673 6533388 5873343 2026-09-19T11:06:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533388 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirrek === Rengdêr === {{rengdêr|ckb}} # [[bêruh]], [[nejîndar]] 3cz90fr86rk9utn6m5j2x1tirxy3dao کرێکاری 0 270677 6533389 5873335 2026-09-19T11:06:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533389 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirêkarî === Navdêr === {{navdêr|ckb}} # [[paletî]], [[kedkarî]], [[karkerî]], [[palehî]], [[şolkerî]], [[îşkerî]] p3id94m3ja5rltor9iqrprxdb2xx42j کڕێشاوی 0 270680 6533390 5873331 2026-09-19T11:06:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533390 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirrêşawî === Navdêr === {{navdêr|ckb}} # [[keveşkî]], [[kepekî]], [[pabawî]], [[serebêjî]] pajymcm0jhgqg804b1o67sjm6tvirwf کرسپ 0 270682 6533391 5873262 2026-09-19T11:07:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533391 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirisp === Navdêr === {{navdêr|ckb}} # [[kerefs]], giyayek xwarber e f3nh713u06unalzndhungmav3ww29wy کریڤ 0 270683 6533392 5873333 2026-09-19T11:07:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533392 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirîv === Navdêr === {{navdêr|ckb}} # [[heval]], [[hogir]], [[dost]], [[yar]], [[xizm]], [[lêzim]], [[mirov]], [[eqreba]] 5hjzqdye4hfe6c88q8eodnvnrc1ckh0 کرمدڵ 0 270690 6533393 5873289 2026-09-19T11:07:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533393 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirmdill === Rengdêr === {{rengdêr|ckb}} # [[biguman]], [[bişik]], [[kirmdil]] b130t6aadigsx30ras8f8z27zaglx45 کرتناک 0 270695 6533394 5873225 2026-09-19T11:07:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533394 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirtnak === Navdêr === {{navdêr|ckb}} # [[tîrok]] po7g9fxe2lml7itlji0tsjt43hcyl6x کڕووھوڕ 0 270696 6533395 5873309 2026-09-19T11:07:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533395 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirrûhurr === Navdêr === {{navdêr|ckb}} # [[dengûdor]], dengê bilind û berdewam fnpmtlprz3x98m45gni5s9gqf397np6 کڕووزانەوە 0 270697 6533396 5873304 2026-09-19T11:07:50Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533396 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirrûzanewe === Lêker === {{lêker|ckb}} # [[kizîn]] (girîna zarokan / savayan) 7jvgvfzcms4wghwltlmuegaeseuqldu کڕووزە 0 270698 6533397 5873306 2026-09-19T11:08:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533397 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kirrûze === Navdêr === {{navdêr|ckb}} # [[kiz]], [[kizgirî]], giriyê savayan / zarokan 8y1wvuf1mq71dc6mk5dw1dau2liuuku کڕیار 0 270699 6533398 5873323 2026-09-19T11:08:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533398 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiryar === Navdêr === {{navdêr|ckb}} # [[bikir]], [[kiryar]], kesa/ê dikirre, [[mişterî]] kxwn7hkijr4bln1970zs5xapz56kv9t کسپ 0 270700 6533399 5873377 2026-09-19T11:08:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533399 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kisp === Navdêr === {{navdêr|ckb}} # [[kerb]], [[kîn]], [[qehr]] f629drkleinaifyt5e62zg9nlk2j6e5 کسپووکۆ 0 270701 6533400 5873380 2026-09-19T11:08:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533400 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kispûko === Navdêr === {{navdêr|ckb}} # [[kerb]], [[kîn]], [[qehr]], [[kerb û kîn]] 19b1efjlebrheiwy3s8hpf992dlj48r کشان 0 270703 6533401 5873408 2026-09-19T11:08:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533401 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kişan === Lêker === {{lêker|ckb}} # [[kişîn]], [[kêşîn]], xwe kişandin / kêşan, '': xwişîn; [[qeliqîn]], [[velivîn]], [[lebitîn]]; (stêr) [[darijîn]], xwiricîn; [[jêk çûn]], ji hev çûn'' 890syde98oxr7euw9pi356gimqkchnt کشت 0 270704 6533402 6527449 2026-09-19T11:08:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533402 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kişt === Navdêr === {{navdêr|ckb}} # [[çandin]], [[cotkarî]], [[çandinî]], [[zîraet]] == {{ziman|fa}} == === Bilêvkirin === :kişt === Rengdêr === {{rengdêr|fa}} # [[çandin]], [[cotkarî]], [[çandinî]], [[zîraet]] ==== Anagram ==== * {{anagram|fa|a=تشک|تشک}} 7i0zrucckk103n9v5g9v8jorax1i6ob کشتەک 0 270705 6533403 5873465 2026-09-19T11:09:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533403 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiştek === Navdêr === {{navdêr|ckb}} # [[ben]], [[dezî]], [[rîs]], [[benik]], [[ta]] 3jje1pgv1w06q00f5xdsbnp3ogtwuyf کشتگەھ 0 270706 6533404 5873423 2026-09-19T11:09:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533404 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiştgeh === Navdêr === {{navdêr|ckb}} # [[cotgeh]], [[çandingeh]], [[zevî]] rj0d5l5w454jingvzeokwtmd0fhr9sx کشتکار 0 270707 6533405 5873421 2026-09-19T11:09:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533405 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiştkar === Navdêr === {{navdêr|ckb}} # [[cotkar]], [[cotyar]], [[çîner]] t7islzcefu85f25p93gvbuajywyziib کشووماتی 0 270710 6533406 5873489 2026-09-19T11:09:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533406 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kişûmatî === Navdêr === {{navdêr|ckb}} # [[mitî]], [[kirî]], [[bêdengî]], [[bêpêjnî]], [[bindestî]], [[ çewisandinî]] rj7v3ssmf06gcjud88gne9z3ppourhz کتێبەڤان 0 270713 6533407 5873185 2026-09-19T11:09:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533407 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kitêbevan === Navdêr === {{navdêr|ckb}} # [[pirtûkxanevan]], kesa/ê li ber pirtûkxaneyekê kar dike anm9kizl50m1tmh7ulbancjy6bbpkyv کتک 0 270716 6533408 5873176 2026-09-19T11:09:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533408 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kitik === Navdêr === {{navdêr|ckb}} # [[kitik]], [[pisîk]], [[pişîk]] == {{ziman|fa}} == === Mane === {{bêcure|fa}} # [[gumisk]], [[hitik]] mpnwnj83h2zc0h9jiur87i8983c8yt3 کتکنەوتینە 0 270717 6533409 5873179 2026-09-19T11:10:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533409 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kitiknewtîne === Navdêr === {{navdêr|ckb}} # [[belakir]], kesa/ê dixwaze her belayan peyda bike pj0owc42zcc1j08rlfr0rla5m7y1ocj کتکی 0 270718 6533410 5873180 2026-09-19T11:10:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533410 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kitkî === Rengdêr === {{rengdêr|ckb}} # [[kufîkî]], [[kifîkî]], [[rizî]], [[genî]], [[fistewî]] 1vp8p1e5ylr9a8pgaopepmsjw3amhkv کوێلە 0 270721 6533411 5874156 2026-09-19T11:10:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533411 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêle === Navdêr === {{navdêr|ckb}} # [[kole]], [[xulam]], [[xizmetkar]], [[berdestk]] 57qlvmb4zfulyijfvjba9a0zvrkwjch کوێلەیی 0 270724 6533412 5874162 2026-09-19T11:10:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533412 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêleyî === Navdêr === {{navdêr|ckb}} # [[koleyî]], [[koletî]], rewşa koleyan 34u50l74ixm617xjmvln6axi9l3gh9v کوێرانە 0 270728 6533413 5874140 2026-09-19T11:10:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533413 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêrane === Rengdêr === {{rengdêr|ckb}} # [[korane]], mîna koran s1trt73167eez59dt9qa8el2nnb84no کوێرەمار 0 270733 6533414 5874148 2026-09-19T11:10:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533414 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêremar === Navdêr === {{navdêr|ckb}} # [[koremar]] mcldsou473ycg325nlebskvp8wok7ky کوێرەڕێ 0 270735 6533415 5874145 2026-09-19T11:11:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533415 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêrerrê === Navdêr === {{navdêr|ckb}} # [[korerê]], rêya dawî lê tê û bi derek din ve naçe, [[tengerê]], rêya teng 113klxrmwd0kl4svhis3gwy1sazlw1w کوێرەوەری 0 270737 6533416 5874152 2026-09-19T11:11:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533416 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêrewerî === Navdêr === {{navdêr|ckb}} # [[tengasî]], [[tengavî]], rewşa dijwar 68zs3nqdamnr4hkark2iv9phm7brbnz کوێخا 0 270743 6533417 5874137 2026-09-19T11:11:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533417 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêxa === Navdêr === {{navdêr|ckb}} # [[axa]], [[muxtar]], serokê / serdarê gundekî / hozekî / êlekî / eşîrekî k19a63ssg1dw438ekevcfwkyeywbkw2 کوێخایەتی 0 270744 6533418 5874138 2026-09-19T11:11:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533418 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kiwêxayetî === Navdêr === {{navdêr|ckb}} # [[axatî]], [[muxtarî]], [[serdarî]] rab8t6d8osgun60kohrbukjabep2nh5 کخ 0 270745 6533419 5873210 2026-09-19T11:11:40Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533419 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kix === Hoker === {{hoker|ckb}} # [[kix]], pîs e, [[nexwe]], biavêje (bo bangkirina li zarokan) 0h2n5zyholrzq2usagnmnstn0hov8ca کزر 0 270750 6533420 5873354 2026-09-19T11:11:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533420 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kizir === Rengdêr === {{rengdêr|ckb}} # [[kizir]], [[nîvziwa]], erda ne herrî û ne jî toz 3mpp26eaxmymrxa0wsum0huzt29p6u2 کزۆڵە 0 270752 6533421 5873356 2026-09-19T11:12:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533421 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kizolle === Rengdêr === {{rengdêr|ckb}} # [[kizok]], [[bêhêvî]], [[dilsar]] 962lnkn9tzws35n61mxvcbipc2c0ybq کیسەڵ 0 270756 6533422 5874378 2026-09-19T11:12:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533422 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kîsell === Navdêr === {{navdêr|ckb}} # [[kûs]], [[kûsî]], [[kûsele]], [[req]] hqgty3gdy35jolg7epggjpc8uclvgj4 کیشوەر 0 270757 6533423 5874388 2026-09-19T11:12:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533423 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kîşwer === Navdêr === {{navdêr|ckb}} # [[kîşwer]], [[parzemîn]], [[qita]], [[kontînent]] 3rozd2ud5gzbr4dyr9hrejn5nyjporb کیشوەری 0 270759 6533424 5874390 2026-09-19T11:12:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533424 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kîşwerî === Rengdêr === {{rengdêr|ckb}} # [[kîşwerî]], [[parzemînî]], [[qitayî]], [[kontînental]] sv11d58icex877edsf5gu86l12nzijz کیتەڵە 0 270760 6533425 5874358 2026-09-19T11:12:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533425 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kîtelle === Navdêr === {{navdêr|ckb}} # [[cerik]], [[cer]] py1bjt9ygdc4rr395qeuiqah1uaywkt کۆبوونەوە 0 270764 6533426 5874170 2026-09-19T11:12:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533426 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kobûnewe === Navdêr === {{navdêr|ckb}} # [[kombûn]], [[civîn]] 7uhtu3b78se5bwf6gf38u89rfb38gjq کۆجەڵە 0 270765 6533427 5874186 2026-09-19T11:13:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533427 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kocelle === Navdêr === {{navdêr|ckb}} # [[kas]], [[kasik]], [[tirar]], [[tirark]] (amanek / firaxek e) nddaslkh1thp9tyrvvkze8bsqkvz66e کۆچ 0 270766 6533428 5874188 2026-09-19T11:13:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533428 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koç === Navdêr === {{navdêr|ckb}} # [[koç]], [[ (mal)barkirin]], ji ciyekî bar kirin cihek dî n981gucqddvvb4ioj94gxiyt36xa4vz کۆچاوکۆچ 0 270767 6533429 5874190 2026-09-19T11:13:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533429 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçawkoç === Navdêr === {{navdêr|ckb}} # [[koçerî]], koçkirina berdewam qzy93b8bu15xivs4blg1mu42pqfv6sg کۆچەک 0 270768 6533430 5874202 2026-09-19T11:13:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533430 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçek === Navdêr === {{navdêr|ckb}} # [[koçek]], [[gerro]] # [[koçek]] (hin alim û zanayên êzidiyan in) h5ulto0kgum9gnad7631oqcm6g690dg کۆچەکە 0 270769 6533431 5874204 2026-09-19T11:13:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533431 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçeke === Navdêr === {{navdêr|ckb}} # [[kum]], [[kulav]] (t cûnek kulavên bo jinan) 8ya8krxb694ycetpm3eierqk6dpcude کۆچەرێتی 0 270771 6533432 5874200 2026-09-19T11:13:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533432 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçerêtî === Navdêr === {{navdêr|ckb}} # [[koçertî]], (awayê) jiyana koçeran g0aqtj27uk8ikawsel6lj8bdho83ybw کۆچەری 0 270772 6533433 5874198 2026-09-19T11:14:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533433 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçerî === Navdêr === {{navdêr|ckb}} # [[koçerî]], mîna koçeran ldqopifuy348tcwmcpko9y8o6gxrxfv کۆچی 0 270773 6533434 5874194 2026-09-19T11:14:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533434 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçî === Rengdêr === {{rengdêr|ckb}} # [[koçî]], [[hicrî]], salnameya îslamî n3bbrboswdat05p5qua5cpzc8um7srz کۆچکەر 0 270774 6533435 5874192 2026-09-19T11:14:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533435 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koçker === Navdêr === {{navdêr|ckb}} # [[koçker]], [[gerok]], [[geştiyar]] poqfspd1v0radhri6g1p0byoz9ri0l5 کۆد 0 270775 6533436 5874211 2026-09-19T11:14:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533436 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kod === Navdêr === {{navdêr|ckb}} # [[den]], [[dewlik]], [[bîdon]], '':zerik (amanek e şîrî ji bizinan / mihan didoşinê)'' c0ee2op2j29lxcxgak0qvtikew0lmsb کۆفرۆش 0 270776 6533437 5874247 2026-09-19T11:14:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533437 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kofiroş === Navdêr === {{navdêr|ckb}} # [[komfiroş]], kesa/ê yan şirketa tiştan kom bi kom difiroşe cqil8895jrbxjl3jc35vbxj0ou6g4ab کۆژە 0 270778 6533438 5874229 2026-09-19T11:14:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533438 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koje === Navdêr === {{navdêr|ckb}} # [[pisto]], [[pistok]], [[berstu]], [[berstuk]], [[yax]], [[girîvan]] tshezmuhd1mq840d5q3c03jua9x338r کۆژۆ 0 270779 6533439 5874227 2026-09-19T11:15:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533439 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kojo === Rengdêr === {{rengdêr|ckb}} # [[xirab]], [[xopan]], [[kembax]] 3a6a6du5bk9sndpd0i3l1ndnrv89oym کۆکردنەوە 0 270780 6533440 5874253 2026-09-19T11:15:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533440 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kokirdinewe === Navdêr === {{navdêr|ckb}} # [[berhevkirin]], [[komkirin]], [[berhevkarî]] 94glhyjvsunkeengzs3inberi82b7to کۆکەکۆک 0 270782 6533441 5874259 2026-09-19T11:15:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533441 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kokekok === Navdêr === {{navdêr|ckb}} # [[kuxekux]], kuxîna berdewam cgx9jt8wy7tlg45kwnynqqd6zbo1d68 کۆکێتی 0 270783 6533442 5874255 2026-09-19T11:15:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533442 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kokêtî === Navdêr === {{navdêr|ckb}} # [[lihevkirin]], [[pêkhatin]], [[sulh]] ibido4jpigc7pe87w2aer9k8hsqc40h کۆڵانکوت 0 270787 6533443 5874268 2026-09-19T11:15:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533443 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollankut === Navdêr === {{navdêr|ckb}} # [[kolanî]], [[gerok]], kesa/ê li kolanan dijî (ango ne di xaniyekî ve / ne li mala xwe) ryy3tj4tdpcnneljw3tfxwi5xl9ji1m کۆڵارە 0 270788 6533444 5874261 2026-09-19T11:15:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533444 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollare === Navdêr === {{navdêr|ckb}} # (yariyeke) [[firfirok]], pirpirok (navê pêlîstokekê ye ku têt firandin # (ballendeke) [[kolare]], [[qereqûş]], [[xertel]], [[qertal]] (navê firindeyekî ye) 7uv22cj7v8q9w3tdaikjlh5zzdw44jf کۆڵەر 0 270790 6533445 5874300 2026-09-19T11:16:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533445 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koller === Navdêr === {{navdêr|ckb}} # [[koler]], kesa/ê tiştekî dikol # [[vekoler]], [[lêkolîner]], kesa/ê azmûnan li ser tiştan dike h2fs65c93z4bzs114oashkzu31cwwus کۆڵھەڵگر 0 270794 6533446 5874286 2026-09-19T11:16:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533446 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollhellgir === Navdêr === {{navdêr|ckb}} # [[piştohilgir]], [[piştîhilgir]], [[hemal]] rsnl1pb3jw1ra30umqhu2h3u19ycz6t کۆڵنج 0 270795 6533447 5874278 2026-09-19T11:16:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533447 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollinc === Navdêr === {{navdêr|ckb}} # [[qolinc]], [[milreqî]], êşîna ji ber reqiya navbera <st1:City><st1:place>milan</st1:place></st1:City> û patikê izhhbekrz4fql2d4nvccopc9q7gtwre کۆڵنگە 0 270797 6533448 5874282 2026-09-19T11:16:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533448 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollinge === Navdêr === {{navdêr|ckb}} # [[patik]], [[paşstu]], [[pate]], [[stukur]] h9q2ott037ovww658p7sfqowcl10exi کۆڵین 0 270798 6533449 5874294 2026-09-19T11:16:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533449 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollîn === Lêker === {{lêker|ckb}} # [[kolîn]], [[kolan]], [[kolandin]], [[kêlîn]], [[kêlan]], [[kêlandin]] dt3ui70l06dipz5wbbt9e3g68emdgpo کۆڵینەوە 0 270799 6533450 5874296 2026-09-19T11:16:50Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533450 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollînewe === Lêker === {{lêker|ckb}} # [[vekolîn]], [[lê kolîn]] 2pzrhe1aqzi8xrqe7bn7u62bde0eooe کۆڵیت 0 270801 6533451 5874290 2026-09-19T11:17:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533451 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollît === Navdêr === {{navdêr|ckb}} # [[kolik]], [[xanîk]], [[kox]], [[koxik]], [[stargeh]], [[asêgeh]], [[senger]] 679dzqmqkapv5vrx62nrr1r4lqaz3dg کۆڵکێش 0 270802 6533452 5874274 2026-09-19T11:17:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533452 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollkêş === Navdêr === {{navdêr|ckb}} # [[piştokêş]], [[piştîhilgir]] bcbtt022myzfvw0r6s2hj8l69e06x28 کۆڵنەدەر 0 270803 6533453 5874284 2026-09-19T11:17:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533453 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollneder === Rengdêr === {{rengdêr|ckb}} # [[xweragir]], [[xurt]], kesa/ê (bi asanî) rê nade ku kesek zora wê / wî bibe r13aant9azgfpb4sz1z37jclsjj790x کۆڵراو 0 270804 6533454 5874270 2026-09-19T11:17:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533454 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kollraw === Navdêr === {{navdêr|ckb}} # [[kolî]], [[qewartî]], [[kolayî]], tiştên (darên / kevirên) hatine kolandin nxdmyakymrbbx6msoh3hsj6h9e8xoyb کۆماری 0 270808 6533455 5874310 2026-09-19T11:17:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533455 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komarî === Navdêr === {{navdêr|ckb}} # [[komarî]], [[cimhûrî]], [[cumhûrî]] fdoebhu7q5d6t24ps3ebsxxer37tows کۆماوە 0 270809 6533456 5874312 2026-09-19T11:17:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533456 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komawe === Rengdêr === {{rengdêr|ckb}} # [[qozbûyî]], [[kûzbûyî]], [[xûzbûyî]], [[qilûzbûyî]] j2j3em1tmbtgywmohvqct1hflc2tka6 کۆمەڵزان 0 270816 6533457 5874328 2026-09-19T11:18:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533457 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komellzan === Navdêr === {{navdêr|ckb}} # [[civaknas]], [[sosyolog]] tcekkzn8tp8n4bnkf5djfiqpd7jicy5 کۆمەڵزانی 0 270817 6533458 5874330 2026-09-19T11:18:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533458 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komellzanî === Navdêr === {{navdêr|ckb}} # [[civaknasî]], [[sosyolojî]] 5852uq8oxrgcg1jpqw73uk5j35hphkl کۆمفرۆش 0 270818 6533459 5874314 2026-09-19T11:18:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533459 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komfiroş === Navdêr === {{navdêr|ckb}} # [[komfiroş]], kesa/ê yan şirketa eşya li ser hev difiroşe === Dijmane === * [[kitfiroş]] haiucyuvt1ncl7yppl8nzo8zov8oygo کۆمفرۆشی 0 270819 6533460 5874316 2026-09-19T11:18:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533460 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komfiroşî === Navdêr === {{navdêr|ckb}} # [[komfiroş]], firotina eşya li ser hev, [[dijw]], [[kitfiroşî]] rtpx5z5afl2ebmkh5e5dh8i7wyeh0u7 کۆمی 0 270820 6533461 5874318 2026-09-19T11:18:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533461 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :komî === Navdêr === {{navdêr|ckb}} # (pişt) [[qozî]], [[xûzî]], [[kûzî]], [[qilûzî]] n596xfeggrgfe4c3tylikjxbkta5uvj کۆنە 0 270822 6533462 5874340 2026-09-19T11:18:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533462 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kone === Rengdêr === {{rengdêr|ckb}} # [[kincir]], [[kevne]], [[kevnekincir]], tiştên (t cilên) kevn, [[kevnenû]], tiştên (t cilên) hatine bikaranîn lê hê pûç nebûne czlcuh73x8ttkkyqwfwm37zmlr8tee1 کۆنەفرۆش 0 270824 6533463 5874352 2026-09-19T11:19:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533463 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :konefiroş === Navdêr === {{navdêr|ckb}} # [[kevnefiroş]], kesa/ê yan şirketa tiştên kevnenû difiroşe 472oa9nl8fubh3orjuo932v2rj7sy3m کۆنەپەرستی 0 270826 6533464 5874348 2026-09-19T11:19:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533464 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koneperistî === Navdêr === {{navdêr|ckb}} # [[kevneperestî]], perestina irf û edetên berê û dijberiya nûbûnê ja4y4ymplff08us1ujwyqfd0sk07ljh کۆنەپۆش 0 270827 6533465 5874344 2026-09-19T11:19:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533465 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :konepoş === Navdêr === {{navdêr|ckb}} # [[kinc]], cil û bergên mêjîn (ne nûjen / modern) inns73l365wjsam0eyjh4gf8p7jknnv کۆنەساڵ 0 270828 6533466 5874350 2026-09-19T11:19:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533466 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :konesall === Rengdêr === {{rengdêr|ckb}} # [[pîr]], [[salmend]] jkw81rj7bkyafvc9xmm9mw9gn0pjncu کۆنی 0 270829 6533467 5874336 2026-09-19T11:19:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533467 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :konî === Navdêr === {{navdêr|ckb}} # [[kevnî]], [[kevntî]], [[kevnatî]] fc6rux0okto05yu8h7byfszj0ltd2b7 کۆنینە 0 270830 6533468 5874338 2026-09-19T11:19:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533468 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :konîne === Rengdêr === {{rengdêr|ckb}} # [[kevnar]], [[kevnare]], [[mêjîn]], [[dêrîn]], [[qedîm]], [[antîk]], (tiştek zemanê) [[berê]] qf0tqa10lnbo472wbhnq27a0ug4e7ko کۆپارە 0 270831 6533469 5874174 2026-09-19T11:20:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533469 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kopare === Navdêr === {{navdêr|ckb}} # [[kovik]], [[qozik]], [[xûzik]], cihê bilind yê pişta hêştiran ldukxh2ucomu29blvmhflci27a0k6di کۆڕگە 0 270833 6533470 6433386 2026-09-19T11:20:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533470 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :korrge === Navdêr === {{navdêr|ckb}} # [[civang]], [[encûmen]], [[şûra]] ==== Anagram ==== * {{anagram|ckb|a=ڕکگۆە|گەڕۆک}} kihfz2fbbgyv2x0g2x9cqkcskyuxsy7 کۆسە 0 270837 6533471 6433701 2026-09-19T11:20:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533471 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kose === Navdêr === {{navdêr|ckb}} # [[semasî]], [[sêmasî]], dirrindeyek avî ye (ing, [[shark]], tirkî köpekbaligi) ==== Anagram ==== * {{anagram|ckb|a=سکۆە|سەکۆ}} hjoy9wqq0f7qxuwbv0mk6xrrt2vrc82 کۆسپ 0 270838 6533472 5874231 2026-09-19T11:20:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533472 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kosp === Navdêr === {{navdêr|ckb}} # [[kosp]], [[asteng]], [[kend û kosp]], rêya nexweş d0jzttxzfa4sj1d7uesrh6jbhfxddst کۆسپایی 0 270839 6533473 5874233 2026-09-19T11:20:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533473 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kospayî === Navdêr === {{navdêr|ckb}} # [[kospayî]], erda nedûz / ne-edil pdj8wn2xs7tywl7x0j3suknrt0tg3bd کۆستەوەوی 0 270841 6533474 5977889 2026-09-19T11:20:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533474 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kostewewî === Rengdêr === {{rengdêr|ckb}} # [[sexte]], [[sixte]], [[ne resen]], [[ne rast]] ok454y0569491w5pgot0wdvl9pfj70t کۆشان 0 270843 6533475 5874241 2026-09-19T11:21:00Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533475 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koşan === Lêker === {{lêker|ckb}} # [[koşîn]], [[xebitîn]], [[dan xwe]], [[hewl dan]], [[mihawele kirin]] 0qwuy3tgxqd4865wfdd14blrmp3k69g کۆشش 0 270844 6533476 5874243 2026-09-19T11:21:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533476 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koşiş === Navdêr === {{navdêr|ckb}} # [[xebat]], [[koşiş]], [[hewl]], [[koşî]] # [[ra-anîn]], [[rahênan]], [[ders]], [[temrîn]] 3ehp8n9el2ciz29nku5tj4gitfhnqwy کۆتان 0 270847 6533477 5874178 2026-09-19T11:21:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533477 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kotan === Navdêr === {{navdêr|ckb}} # [[kotan]], [[koz]], [[guhêrr]], cihê tankirî / çeperkirî bo têve parastina terş û tewal eauitpohccn83saln62dti7wlv7he8k کۆتایی 0 270848 6533478 5874180 2026-09-19T11:21:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533478 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kotayî === Navdêr === {{navdêr|ckb}} # [[texsîr]], [[xemsarî]], [[sersarî]] lg98ztctkxoz435qnhkgz2111h0ta7r کۆتەرە 0 270849 6533479 5874184 2026-09-19T11:21:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533479 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kotere === Navdêr === {{navdêr|ckb}} # [[qurmik]], [[kokik]], '':stûnik; serikê stûnan'' b9yva4zeijya6r0kkn4vaeovz6tki8r کۆڤان 0 270851 6533480 5874251 2026-09-19T11:21:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533480 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kovan === Navdêr === {{navdêr|ckb}} # [[kovan]], [[kul]], [[xem]], [[derd]], [[keser]], [[keder]] 139gqxq47aqex2nc7do5seuxinhdb9v کۆخوازی 0 270853 6533481 5874209 2026-09-19T11:22:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533481 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :koxwazî === Navdêr === {{navdêr|ckb}} # [[lihevkirin]], [[konsensûs]] bqi4qyiaeyv8m0brj7ez41d63j9vzjf کوچوولە 0 270859 6533482 5873871 2026-09-19T11:22:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533482 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuçûle === Navdêr === {{navdêr|ckb}} # [[xefik]], [[dav]], [[tepik]] bnkzakoszze7uzkycf1pgi5romb91ab کوفار 0 270861 6533483 5874015 2026-09-19T11:22:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533483 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kufar === Navdêr === {{navdêr|ckb}} # [[kafir]] (t pirjimar) plhbgnv2sqvwmk4ift2bxaftme9syjr کوژاندنەوە 0 270862 6533484 5873995 2026-09-19T11:22:30Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533484 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kujandinewe === Lêker === {{lêker|ckb}} # [[temirandin]], [[vemirandin]], [[mirandin]], [[birhandin]], [[nehêlan]] bvhemp9yawoxw1auuou59bebcu5w2pm کوژران 0 270864 6533485 5873997 2026-09-19T11:22:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533485 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kujran === Lêker === {{lêker|ckb}} # [[hatin kuştin]] 30ymoldgpugn1rl9kbhsdz995upb3ly کوژراو 0 270865 6533486 5873999 2026-09-19T11:22:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533486 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kujraw === Rengdêr === {{rengdêr|ckb}} # [[kuştî]], (ya / yê) hatiye kuştin pxws53i8lie4cws80cv5jezfivdlg1g کولاف 0 270867 6533487 5874025 2026-09-19T11:23:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533487 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kulaf === Navdêr === {{navdêr|ckb}} # [[pencirk]], dest û tilên firindeyan gwo6nlgjmtptv65wmty999hzrm9jnyo کوڵەبەس 0 270873 6533488 5874061 2026-09-19T11:23:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533488 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullebes === Navdêr === {{navdêr|ckb}} # [[nevisî]], [[nevis]], zarokên jina kesekî yên ji mêrê wê yê berî yê niha oby3ecey7o49ozoagv94wzmj0cdq92t کوڵەبنە 0 270874 6533489 5874059 2026-09-19T11:23:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533489 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullebine === Rengdêr === {{rengdêr|ckb}} # [[bejnqut]], [[kin]], [[kurt]], [[bejnbost]], [[qut]], [[qutik]], [[quto]], [[qutê]], [[kinê]], [[kino]] dkocj72a00nvvq1t5ctlyctilfcj6tb کولەمەرگی 0 270876 6533490 5874067 2026-09-19T11:23:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533490 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kulemergî === Navdêr === {{navdêr|ckb}} # [[astengî]], [[dijwarî]], [[tegasî]], [[tengavî]] bfcgoxqa62vu8kq11wj9mmnuvfmkyvr کوڵەنانی 0 270878 6533491 5874072 2026-09-19T11:23:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533491 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullenanî === Navdêr === {{navdêr|ckb}} # [[sêrker]], [[cadûbaz]], [[efsûnkar]], [[sihirbaz]] rx23918qtte8ym3md3kdt1pqyp4e7ej کوڵەنجە 0 270879 6533492 5874074 2026-09-19T11:23:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533492 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullence === Navdêr === {{navdêr|ckb}} # [[çoxik]], [[êlek]] sdfwqhdmdxeotb773pni7ax1ltlp6ma کولەپاچ 0 270880 6533493 5874063 2026-09-19T11:24:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533493 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kulepaç === Navdêr === {{navdêr|ckb}} # [[tevir]] muclbtiycr4r7g96g17gghoyyc4rebe کوڵەپێچ 0 270881 6533494 5874065 2026-09-19T11:24:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533494 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullepêç === Rengdêr === {{rengdêr|ckb}} # [[neliv]], kesa/ê nikare bilive 13mon4k6v4ixfkpavplqv2rdhozfb84 کولیچە 0 270884 6533495 5874056 2026-09-19T11:24:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533495 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kulîçe === Navdêr === {{navdêr|ckb}} # [[kulîçe]], [[kulîparçe]], xwarinek ji nan û gûzan û şekirê / xurmê yê qm1gz9r4kci57eudrb37f4fwrt1o4uv کوڵک 0 270886 6533496 5874038 2026-09-19T11:24:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533496 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullk === Rengdêr === {{rengdêr|ckb}} # (pirça / porrê) [[qijavij]], ne hil # (vexwiraka) [[tîr]] gzahj7jn2ze4ia7xndj634f442fbfi7 کوڵکوڵە 0 270887 6533497 5874040 2026-09-19T11:24:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533497 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullkulle === Navdêr === {{navdêr|ckb}} # [[avreşînk]] m8tspafnsc79gbdf24imvpm9w3654tv کوڵۆت 0 270890 6533498 5874053 2026-09-19T11:24:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533498 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kullot === Navdêr === {{navdêr|ckb}} # [[kemax]], [[hêt]], [[ran]], [[qorrik]] jks0mkalwt0byg4cdrqxp4zjs923jpl کولپ 0 270891 6533499 5874034 2026-09-19T11:25:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533499 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kulp === Navdêr === {{navdêr|ckb}} # [[tengasî]], [[tengavî]], rewşa dijwar ayrxjb7sagvh86xvxb86k0ncbzgv669 کولخان 0 270892 6533500 5874036 2026-09-19T11:25:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533500 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kulxan === Navdêr === {{navdêr|ckb}} # [[argûn]], ciyê agir tê ve tê hilkirin li hindirrî xaniyan ve qugi50ishx7hvr6o2o1wkdwwtbbn25a کونار 0 270893 6533501 5874086 2026-09-19T11:25:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533501 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunar === Navdêr === {{navdêr|ckb}} # [[kenarî]], navê deviyek / terraşek strîtûj e fpa7wzhbfcvy1y7pw93e21ej23y9f92 کوناودەر 0 270894 6533502 5874088 2026-09-19T11:25:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533502 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunawder === Rengdêr === {{rengdêr|ckb}} # [[kunkirî]], [[qulkirî]] ebaoc0a4lubjpwotkdql11dj8rs7qoh کونجی 0 270898 6533503 5874096 2026-09-19T11:25:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533503 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuncî === Navdêr === {{navdêr|ckb}} # [[kuncî]] (Bot, [[ Indicum)]] np14fwyajr7adq1ycvw1sm2dz5x7b24 کونچک 0 270899 6533504 5874100 2026-09-19T11:25:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533504 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunçik === Navdêr === {{navdêr|ckb}} # [[kunik]], kunên hûr(ik) rulmq5t34pywu9g0vyobxi8c4vwzsy0 کونەباجە 0 270900 6533505 5874112 2026-09-19T11:26:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533505 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunebace === Navdêr === {{navdêr|ckb}} # [[pixêrîk]], [[pace]], kuna sobeyan, kuna li ban dûkêl tê re derdikeve derî xanî 49e1517nmsr0yuwz3odvvluvz9vw1g2 کونەبەبوو 0 270901 6533506 5874114 2026-09-19T11:26:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533506 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunebebû === Navdêr === {{navdêr|ckb}} # [[kund]], [[bum]], [[pepûk]] fpxuctctiavn455wzrshquq80jkpgyn کونیلە 0 270902 6533507 5874108 2026-09-19T11:26:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533507 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunîle === Navdêr === {{navdêr|ckb}} # [[kunik]], kunên hûr(ik) 6lfgesl9iphuzjymnhfcz8ga9hewuzq کونیلەدار 0 270903 6533508 5874110 2026-09-19T11:26:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533508 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunîledar === Rengdêr === {{rengdêr|ckb}} # [[kunkunîk]], [[kunkunîşk]], tiştê pirr kunik / kunên hûr lê hene q3658qkjyi1v6hvthi7qirnjlz69vqs کونکراو 0 270905 6533509 5874104 2026-09-19T11:26:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533509 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunkiraw === Rengdêr === {{rengdêr|ckb}} # [[kunkirî]], [[qulkirî]] h0ujeuxln2ocvh1ikeh7rj7hgf9jb7z کونتیلە 0 270906 6533510 5874092 2026-09-19T11:26:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533510 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuntîle === Navdêr === {{navdêr|ckb}} # [[kuntîle]], [[leqem]], [[tunel]] iwl7booe05755hlkjgwptyypaut2ico کونزەین 0 270907 6533511 5874101 2026-09-19T11:27:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533511 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kunzeyn === Rengdêr === {{rengdêr|ckb}} # [[delodîn]], [[tirredîn]], [[peledîn]], [[netemam]], [[aqilsivik]] ffvbhxi029n8l0p28c8q0ehkzteho8u کوڕ 0 270908 6533512 6433719 2026-09-19T11:27:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533512 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurr === Navdêr === {{navdêr|ckb}} # [[kurr]], [[law]], [[pis]], [[xort]], [[gede]], [[sebî]], [[kurrik]], [[lawik]] === Dijmane === *[[keç]] * [[dot]] * [[qîz]] * [[kiç]] ==== Anagram ==== * {{anagram|ckb|a=وڕک|وڕک}} jczats30bip6rml2m40kwny3f81fhwt کوڕانە 0 270909 6533513 5873889 2026-09-19T11:27:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533513 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurrane === Rengdêr === {{rengdêr|ckb}} # [[kurrane]], [[lawane]], [[xortane]], [[gedane]], [[sebiyane]], mîna kurran / lawan / gedeyan / sebiyan qbavf7fdwle9hht5qtel7g7nv0ao34n کوردانە 0 270911 6533514 5873917 2026-09-19T11:27:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533514 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdane === Rengdêr === {{rengdêr|ckb}} # [[kurdane]], mîna kurdan t2o0f2v1nl5a5rjzv9ptbzoa9jhv3wa کوردایەتی 0 270912 6533515 5873919 2026-09-19T11:27:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533515 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdayetî === Navdêr === {{navdêr|ckb}} # [[kurdayetî]], [[kurdîtî]], [[kurdînî]], hesta neteweperweriya kurdî / kurdistanî, tevgera neteweyî ya kurdan 27fawu9zg0ke871t9so5arkp3pykppm کوردەواری 0 270913 6533516 5873941 2026-09-19T11:27:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533516 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdewarî === Navdêr === {{navdêr|ckb}} # [[kurdewarî]], jiyana (mîna ya) kurdan 7t84lvbx4p18va77ronmtajt2rdrvz6 کوردھەز 0 270914 6533517 5873931 2026-09-19T11:28:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533517 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdhez === Navdêr === {{navdêr|ckb}} # [[kurdhez]], [[kurdvîn]], kesa/ê ji kurdan hez dike kbmkzid7nt9aungr4xr577dnpfeogua کوردستانی 0 270916 6533518 5873923 2026-09-19T11:28:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533518 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdistanî === Rengdêr === {{rengdêr|ckb}} # [[kurdistanî]], kesa/ê yan tişta/ê ji Kurdistanê, '':kurd û gelên dî yên li Kurdistanê dijîn; welatiyên Kurdistanê; ku'' m3v49aijw8v4nnx5l54i0tgrkrkuzxj کوردیزانی 0 270919 6533519 5873937 2026-09-19T11:28:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533519 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdîzanî === Navdêr === {{navdêr|ckb}} # [[kurdîzanî]], zanîna zimanê kurd # [[kurdînasî]], pisporiya li ser zimanê kurdî 2dnc6p13kv3iae43hco242cesb727gn کوردپەروەر 0 270922 6533520 5873921 2026-09-19T11:28:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533520 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdperwer === Navdêr === {{navdêr|ckb}} # [[kurdperwer|kurdper]] # # # [[kurdperwer|wer]], kesa/ê dilsoza/ê doza kurdan e 1l4cjd0c375zk2qoeghpych0lkpokgp کوردشناس 0 270923 6533521 5873925 2026-09-19T11:28:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533521 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdşinas === Navdêr === {{navdêr|ckb}} # [[kurdnas]], [[kurdevan]], [[kurdolog]], kesa/ê lêkolînan li ser (jiyana) kurdan dike, kesa/ê li ser (jiyana) kurdan pispor e n79mydrsx4it62842wr8j7t1xqr6c7q کوردناسی 0 270924 6533522 5998718 2026-09-19T11:28:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533522 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurdşinasî === Navdêr === {{navdêr|ckb}} # [[kurdnasî]], [[kurdevanî]], [[kurdolojî]], karê lêkolînan li ser (jiyana) kurdan 6ymadeqeirnb7ot4bxxyl74h3zidvzw کوڕگەل 0 270925 6533523 5873955 2026-09-19T11:29:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533523 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurrgel === Navdêr === {{navdêr|ckb}} # [[xort]], [[kurrgel]], komek kurran / lawan fcoagexul02xjpngjl5leqbtjgc5gjs کوڕەزا 0 270928 6533524 5873976 2026-09-19T11:29:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533524 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurreza === Navdêr === {{navdêr|ckb}} # [[kurreza]], [[lawza]], zaroyên kurrê kesekî, [[nevî]] 90wbgcrtjh7ctvarej3vez9s6goh127 کوڕەزازا 0 270929 6533525 5873978 2026-09-19T11:29:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533525 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurrezaza === Navdêr === {{navdêr|ckb}} # [[kurrezaza]], [[lawzaza]], zaroyên zaroyên kurrê kesekî, [[nevîçirrk]] ean1jce2yozedbjiaf2bjtvghefvod1 کوڕێتی 0 270930 6533526 5873972 2026-09-19T11:29:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533526 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurrêtî === Navdêr === {{navdêr|ckb}} # [[kurrtî]], [[kurrîtî]], [[xortanî]], [[xortî]], [[lawanî]], [[lawt]] # [[tolazî]], [[tûlet]] # [[kurrgerrî]], karê keç dibin pey kurran 2lujcifu7m1cw8n5bgqz8nyvz0byw4g کوڕکوڕە 0 270933 6533527 5873954 2026-09-19T11:29:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533527 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurrkurre === Navdêr === {{navdêr|ckb}} # [[kolare]], [[qereqûş]], [[xertel]], [[qertel]], [[qertal]], navê firrindeyekî ye (zool, [[ Milvus)]] jw3wby02ok2qpjejfm4z8pxcyg95ypz کورتان 0 270937 6533528 5873891 2026-09-19T11:29:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533528 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurtan === Navdêr === {{navdêr|ckb}} # [[kurtan]], [[palik]], [[hawid]] tc18sllp6f4ud40a6lcnt88jxxyl5zp کورتبڕ 0 270939 6533529 5873895 2026-09-19T11:30:00Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533529 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurtbirr === Hoker === {{hoker|ckb}} # [[kurtbirr]], [[kurt û kurmancî]], [[bi kurtî]] lazmz44yi6mgz9sfsisd9pwp935hp7d کورتە 0 270943 6533530 5873909 2026-09-19T11:30:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533530 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurte === Navdêr === {{navdêr|ckb}} # [[kurte]], [[kurtebêje]] ga94w940hpz0mfuu5a1euk2408x2lnw کورتەباڵا 0 270944 6533531 5873911 2026-09-19T11:30:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533531 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurteballa === Rengdêr === {{rengdêr|ckb}} # [[bejnkurt]], [[bejnbost]] 3r33z6hegzo6vge0un8af6i5ig4i70t کورتی 0 270948 6533532 5873905 2026-09-19T11:30:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533532 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kurtî === Navdêr === {{navdêr|ckb}} # [[kurtî]], [[kinî]], [[qutî]], [[gurcî]] 9lganejv4lb476hphmq4ksg2w2cffil کوشتار 0 270951 6533533 5874001 2026-09-19T11:30:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533533 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuştar === Navdêr === {{navdêr|ckb}} # [[kuştar]], [[kujî]], karê kuştinê 1p02bxf0bbsco9uxj0l8o3q5yi2ef22 کوشتبەندان 0 270952 6533534 5874003 2026-09-19T11:30:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533534 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuştbendan === Navdêr === {{navdêr|ckb}} # [[komkujî]], kuştina gelekan bi carekê 9hujczwubdapmxn55s0ctpfod0niz5f کوشتەرا 0 270953 6533535 5874007 2026-09-19T11:31:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533535 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuştera === Navdêr === {{navdêr|ckb}} # [[rende]], [[planya]] 5xf4rpmg5v5l3658dgjnmn9r6uh1a7f کوشتن 0 270954 6533536 5874005 2026-09-19T11:31:10Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533536 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuştin === Lêker === {{lêker|ckb}} # [[kuştin]], [[mirandin]], [[telaftin]], [[telifandin]], [[birhandin]], [[qetl kirin]] m5t6e8oeep1d8simtq0ymkn8051tl1z کوتان 0 270957 6533537 5873824 2026-09-19T11:31:20Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533537 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kutan === Lêker === {{lêker|ckb}} # [[qutan]], [[kutan]] :a) lê dan, [[ lê xistin b) hûr kirin]], hûr-hûr kirin c) derzî lê dan, şirînqe kirî #(~ be zewî da) avêtin erdê, li erdê dan rkoh82ftwoc14r6gbjk2zloaxia0ond کوتووپڕ 0 270959 6533538 5873848 2026-09-19T11:31:30Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533538 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kutûpirr === Hoker === {{hoker|ckb}} # [[tavilê]], [[di cî de]], [[bi lez]] hoqbzxryzhwuxwn71mgnmykin7bf6pp کوزان 0 270961 6533539 5873982 2026-09-19T11:31:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533539 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kuzan === Lêker === {{lêker|ckb}} # [[kuzirîn]], [[kuzîn]], [[suşîn]], [[şewitîn]], [[sotin]], [[kuziryan]] ejufsmvyodgcrnqb0sp598hwbra7wna کوو 0 270962 6533540 5874125 2026-09-19T11:31:50Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533540 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kû === Hoker === {{hoker|ckb}} # [[kusan]], [[çilo]], [[çawa]], [[kusa]], bi çi awayî qjlwphcdza39taljq73qalsqqbzvbcs کووکەلە 0 270964 6533541 5874135 2026-09-19T11:32:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533541 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûkele === Navdêr === {{navdêr|ckb}} # [[kulind]], [[kundir]] deubklsybb2f1lndfngaa2i5sfhaj0r کووکووکەرە 0 270966 6533542 5874134 2026-09-19T11:32:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533542 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûkûkere === Navdêr === {{navdêr|ckb}} # [[pepûk]], [[kund]], [[bum]], [[kûkûk]] jlu381873n4gcflrwulcfkzw413wc3u کووپە 0 270969 6533543 6433614 2026-09-19T11:32:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533543 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûpe === Navdêr === {{navdêr|ckb}} # [[kûp]], [[kûpe]], [[tas]], [[tirar]] (amanek e) ==== Anagram ==== * {{anagram|ckb|a=ووپکە|کەپوو}} 5t3w26679od82igcqbu3k0u2c0zaq14 کووپەڵە 0 270970 6533544 5874128 2026-09-19T11:32:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533544 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûpelle === Navdêr === {{navdêr|ckb}} # [[kûpik]], [[tirarok]], [[tasik]], kûpê biçûk ruv737d4ejipzibxpwkccp7qf5cuk6f کوور 0 270971 6533545 5874130 2026-09-19T11:32:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533545 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûr === Rengdêr === {{rengdêr|ckb}} # kûr [k-ya nerm], nêriyê xort ku êdî ne gîsk e lê hê nebûye nêriyê temam (Ji yên mê re bi kurmancî "tiştûr / tiştîr / teştîr / tuştîr" û bi soranî "tiştîr / çiştîr" tê gotin, ), [[kor]] m0in18ebjfmsejdgzk7juvxkaibbbcn کوورە 0 270973 6533546 5874131 2026-09-19T11:32:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533546 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûre === Navdêr === {{navdêr|ckb}} # [[agirdank]], ciyê agir: argûn, di mal ve ciyê agir tê de tê hilkirin, [[kuçik]], li derî xanî ciyê agir lê tê hilkirin 52j2skxy1oakswu1iwwsvfleqs2zwta کووز 0 270974 6533547 5874132 2026-09-19T11:33:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533547 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :kûz === Navdêr === {{navdêr|ckb}} # [[ker]], [[parçe]], [[pirt]], [[par]] (t ji hin fêkiyan mîna sêv / pirteqal) k83zgfpynvhh85i5m8fkafnm9jj4lg9 لاجانگ 0 270980 6533548 5875683 2026-09-19T11:33:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533548 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lacang === Navdêr === {{navdêr|ckb}} # [[cênîk]] de77wcxikoz0wirjnyo748dmnxrgtib لاجیوەرد 0 270981 6533549 5875684 2026-09-19T11:33:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533549 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lacîwerd === Navdêr === {{navdêr|ckb}} # [[lacîwerd]], şînî zelal 96h7bb53bol3ehzd6wzd80yp5nftzt2 لاچوو 0 270982 6533550 5875685 2026-09-19T11:33:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533550 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laçû === Rengdêr === {{rengdêr|ckb}} # [[demkî]], [[berdemî]] === Dijmane === * [[berdewam]], [[herdemî]] mot6b0ucwla8b86atw8wymycyu5b70f لادێیی 0 270984 6533551 5875686 2026-09-19T11:33:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533551 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :ladêyî === Navdêr === {{navdêr|ckb}} # [[gundî]], [[derbajarî]] iff3x7z9gquhr1ts0hmyhearlsxzfnl لاگیر 0 270988 6533552 5875725 2026-09-19T11:33:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533552 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lagîr === Navdêr === {{navdêr|ckb}} # [[alîgir]], [[piştevan]] otbnd8y1s18ihm2u32qxzi6wx5ondl5 لاگیری 0 270989 6533553 5875726 2026-09-19T11:34:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533553 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lagîrî === Navdêr === {{navdêr|ckb}} # [[alîgirî]], [[piştevanî]] 4lpsqon8o59dces4bi6lbjw4qstz8cv لاژگی 0 270991 6533554 5875695 2026-09-19T11:34:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533554 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lajigî === Navdêr === {{navdêr|ckb}} # [[nezanî]], [[bêhayî]], [[bêagayî]] 99cu926uj7uruimo6ls1hq23my7qs7k لاک 0 270992 6533555 6433534 2026-09-19T11:34:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533555 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lak === Navdêr === {{navdêr|ckb}} # [[kelex]], [[term]] (t yê lawirên sekitî / mirî) ==== Anagram ==== * {{anagram|ckb|a=الک|کال}} 2q4wtw1ffzerh8nk96vdv225grlwrso لاکێش 0 270994 6533556 5875723 2026-09-19T11:34:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533556 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lakêş === Navdêr === {{navdêr|ckb}} # [[kêmkêş]], kesa/ê carinan cigareyan dikêşe 21xispaf94gdcic7wmx329qh16keaqw لاڵانەوە 0 270998 6533557 5875729 2026-09-19T11:34:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533557 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lallanewe === Lêker === {{lêker|ckb}} # lava / dia / dua kirin, [[hêvî kirin]], tika / rica kirin, [[xwestin]] 8g5h5co3hmkm2xm0lyt1wjdlmwujf5z لاڵە 0 271000 6533558 5875736 2026-09-19T11:34:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533558 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lalle === Navdêr === {{navdêr|ckb}} # [[tika]], [[rica]], [[hêvî]], [[daxwaz]], [[dua]], [[lava]] fm0rs4136wfe3rrbzg99jsug4t16r7z لالەنگی 0 271001 6533559 5875738 2026-09-19T11:35:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533559 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lalengî === Navdêr === {{navdêr|ckb}} # [[lalengî]], [[tangerîn]] (navê fêkiyekî ye) j4l2vaucyx9ldgj3gwwq5hkngrwjtkh لاڵوپاڵ 0 271005 6533560 5875732 2026-09-19T11:35:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533560 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lallupall === Rengdêr === {{rengdêr|ckb}} # [[pelate]], [[pijale]], [[belawela]] r7ievikv4qjy22zbfy1339pdu389o4n لامل 0 271007 6533561 5875739 2026-09-19T11:35:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533561 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lamil === Navdêr === {{navdêr|ckb}} # [[stu]], [[patik]], [[paşstu]] 3uo0tl2nlvko5uk5ud5ekp0zatfzbyo لانەوازی 0 271009 6533562 5875753 2026-09-19T11:35:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533562 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lanewazî === Navdêr === {{navdêr|ckb}} # [[derbiderî]], [[mişextî]], [[awareyî]], [[bêmalî]], [[penaberî]] cf3t9oafn0d4445kumokcvfner47j65 لاپچین 0 271012 6533563 5875676 2026-09-19T11:35:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533563 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lapçîn === Navdêr === {{navdêr|ckb}} # [[lapçîn]], [[lafçîn]], [[gezme]], [[pêlav]], [[sol]] mm5g7muyv9g0amuqhi9ey0zdoux9k5e لاقردی 0 271014 6533564 5875715 2026-09-19T11:35:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533564 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laqirdî === Navdêr === {{navdêr|ckb}} # [[qerf]], [[henek]], [[tirrane]], [[galte]], [[yarî]] 5c7ucumih1snsbk4506c1lz49mkiuit لاڕەو 0 271017 6533565 5875689 2026-09-19T11:36:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533565 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :larrew === Rengdêr === {{rengdêr|ckb}} # [[varê]], [[avarê]], aliyekî rê, derî rê, rexî rê, ne li ser rê m31vnbqapb80cnxzprolnmrpdttr49o لارەولار 0 271018 6533566 5875690 2026-09-19T11:36:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533566 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :larewlar === Rengdêr === {{rengdêr|ckb}} # [[xwarûvîç]], [[çepûçûr]] pw03reolvqn1u8wonbvcrduslybhzs1 لاساری 0 271023 6533567 5875696 2026-09-19T11:36:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533567 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lasarî === Navdêr === {{navdêr|ckb}} # [[serhişkî]], [[înat]] el0rdyoie7qwrswmneem7i9ghonmrb1 لاساییانە 0 271024 6533568 5875698 2026-09-19T11:36:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533568 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lasayiyane === Navdêr === {{navdêr|ckb}} # [[lasayiyane]], [[texlîdane]], [[zarveker]], [[îmîtatîv]] s89cvinzyrsgnj6livx12pb6y6vbbji لاساییکەر 0 271026 6533569 5875699 2026-09-19T11:36:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533569 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lasayîker === Navdêr === {{navdêr|ckb}} # [[zarveker]], [[çavlêker]], [[texlîdker]], [[lasayîker]] cvpni4u8whwf9uspjmz2ylu0a7a5r0p لاسەنگ 0 271027 6533570 5875701 2026-09-19T11:36:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533570 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laseng === Rengdêr === {{rengdêr|ckb}} # [[bêseng]], [[alseng]], [[bêbalans]] 0rq2hsy31gli4nejj9uhvm349x0rr5d لاسک 0 271029 6533571 5875700 2026-09-19T11:37:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533571 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lask === Navdêr === {{navdêr|ckb}} # [[destik]] s7h865czi91ovp02cfm2qsvp9evl3u9 لاشان 0 271032 6533572 5875703 2026-09-19T11:37:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533572 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laşan === Rengdêr === {{rengdêr|ckb}} # [[yekal]], rêyên tenê yekalî qb8hqlani3l48bxvbhq6m2qynaaelgx لاشەڕ 0 271033 6533573 5875706 2026-09-19T11:37:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533573 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laşerr === Navdêr === {{navdêr|ckb}} # [[şerrnexwaz]], [[aştîxwaz]], [[pasîfîst]] fmhmgkz7ku2ykjsafelyhezl7nka2mb لاشەڕی 0 271034 6533574 5875707 2026-09-19T11:37:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533574 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laşerrî === Navdêr === {{navdêr|ckb}} # [[şerrnexwazî]], [[pasîfîzm]], [[aştîxwazî]] qescproy8fainqvj7jm0lq2phe271tx لاتەڕاف 0 271036 6533575 5875682 2026-09-19T11:37:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533575 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :laterraf === Navdêr === {{navdêr|ckb}} # [[tenişt]], [[rex]], [[teref]], [[alî]] b3r3e9cjsknngoxg539s31h4tq0282r لاوانەوە 0 271041 6533576 5875756 2026-09-19T11:37:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533576 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lawanewe === Navdêr === {{navdêr|ckb}} # [[lorîk]], stiranên şîniyê li behiyan / taziyan pki33ebdsk03im13984gndo64m03qzh لاواز 0 271042 6533577 5875754 2026-09-19T11:38:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533577 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lawaz === Rengdêr === {{rengdêr|ckb}} # [[lawaz]], [[qels]], [[bêhêz]], [[zeîf]], [[nazik]], [[hejar]], [[lehwaz]], [[dw]], [[xurt]], [[bihêz]] 5zr0gkn8fwqhrqhfxbkf9r63i3l1bdq لاوازی 0 271043 6533578 5875755 2026-09-19T11:38:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533578 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lawazî === Navdêr === {{navdêr|ckb}} # [[lawazî]], [[qelsî]], [[bêhêzî]], [[nazikî]], [[hejarî]], [[zeîfî]], [[dw]], [[xurtî]], [[hêzdarî]], [[bihêzî]] 4mpg6apd56shjars1ov4wrjm010j8b9 لاوێتی 0 271047 6533579 5875763 2026-09-19T11:38:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533579 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lawêtî === Navdêr === {{navdêr|ckb}} # [[ciwanî]], [[gencî]], [[xortî]] od7xdv9h3190w7vbiflpnrwe06gh9mi لای 0 271052 6533580 5875765 2026-09-19T11:38:30Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533580 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lay === Hoker === {{hoker|ckb}} # [[alî]], [[hêl]] ixfcumbippo6788pz40hsravw8jr0p4 لایەنگر 0 271054 6533581 5875771 2026-09-19T11:38:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533581 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :layengir === Navdêr === {{navdêr|ckb}} # [[alîgir]], [[piştevan]], [[piştgir]] 4zauaabmlw9ierydhuwcg6e7sxm04m6 لایەنگری 0 271055 6533582 5875772 2026-09-19T11:38:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533582 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :layengirî === Navdêr === {{navdêr|ckb}} # [[alîgirî]], [[piştevanî]], [[piştgirî]] 76nzrivthubms7r3nov2eslpdr04yli لە 0 271057 6533583 5876073 2026-09-19T11:39:00Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533583 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :le === Hoker === {{hoker|ckb}} # [[li]], ([[le]], da) di, [[de]], [[tê de]], [[l]] # ([[le]], ewe) ji b80y9xicoypkcd8tggsho3ihzsq2g4z لەبەرچاڤ 0 271059 6533584 5876077 2026-09-19T11:39:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533584 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leberçav === Rengdêr === {{rengdêr|ckb}} # [[berçav]], [[diyar]], [[xwiya]], tişta tê dîtin yan dikare (bi asanî) bê dîtin hzz585e5fqeeaxjdprmh8ekr92fi9ph لەبلەبی 0 271060 6533585 5876076 2026-09-19T11:39:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533585 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leblebî === Navdêr === {{navdêr|ckb}} # [[leblebî]], nokên qelandî 3poke0d4ml9d1xkxsb78gpa8t4x4mqs لەبز 0 271061 6533586 5876075 2026-09-19T11:39:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533586 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lebz === Navdêr === {{navdêr|ckb}} # (e) [[gotin]], [[qese]], [[peyv]], [[bêje]], [[kelîme]] 4tms5enon3nigh4ycqxr4mlu8xsth8q لەگەن 0 271065 6533587 5876142 2026-09-19T11:39:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533587 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :legen === Navdêr === {{navdêr|ckb}} # [[legen]], amanek mezin yê avê ye 4dy8h6e5zwkixf7prijpejxsuxqudfy لەفاف 0 271067 6533588 5876128 2026-09-19T11:39:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533588 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lefaf === Navdêr === {{navdêr|ckb}} # [[birînpêçk]], [[lifaf]] q8gjad2aa0zlkfy08flrtgoj493dnze لەکە 0 271071 6533589 6433589 2026-09-19T11:40:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533589 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leke === Navdêr === {{navdêr|ckb}} # [[lewt]], [[tewz]], [[leke]], [[teqme]], pîsatiya li ser tiştekî ==== Anagram ==== * {{anagram|ckb|a=لکەە|کەلە}} 1k56kiffpkn24s5pv46mtjfgbwmy91e لەکەدار 0 271072 6533590 5876139 2026-09-19T11:40:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533590 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lekedar === Rengdêr === {{rengdêr|ckb}} # [[lewitî]], [[tewizî]], [[lekedar]] dhsq41go9xywbj4t067bi02xge3are9 لەکەداری 0 271073 6533591 5876140 2026-09-19T11:40:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533591 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lekedarî === Navdêr === {{navdêr|ckb}} # [[lewitînî]], [[tewizînî]], [[lekedarî]], [[herrimînî]] avmw7494t2pttfrj7p58nre1ttiw9qu لەکی 0 271074 6533592 6433650 2026-09-19T11:40:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533592 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lekî === Navdêr === {{navdêr|ckb}} # [[lekî]], zaravayek zimanê kurdî ==== Anagram ==== * {{anagram|ckb|a=لکیە|کەیل}} ceuibtd9egi35ade56uy4yq17381bg4 لەل 0 271075 6533593 5876143 2026-09-19T11:40:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533593 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lel === Navdêr === {{navdêr|ckb}} # [[kip]], [[kipîn]], [[kipên]], dengek nizm / kurt / biçûk: Nawêrê billê lel Newêre kipênê ji xwe bîne, Newêre ti dengî bike 9nfl0wymgjguiewulzxo3z0tbw4sptd لەلە 0 271076 6533594 5876144 2026-09-19T11:40:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533594 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lele === Navdêr === {{navdêr|ckb}} # [[xulam]], [[evd]], [[xizmetkar]] :Ey min leley tom!? Ma ez xulamê te me! # [[hînker]], [[fêrker]], [[perwerdeker]] pin9cv56ayokex86myy3k6vdpih7q69 لەلەیی 0 271077 6533595 5876145 2026-09-19T11:41:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533595 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leleyî === Navdêr === {{navdêr|ckb}} # [[xulamî]], [[evd]], [[xizmetkarî]] k6a1v567og4cvno5pd0yuo3hczmq0r2 لەمپا 0 271082 6533596 5876151 2026-09-19T11:41:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533596 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lempa === Navdêr === {{navdêr|ckb}} # [[lampe]], [[lempe]], [[çira]], [[şewl]], [[gulop]], [[ronahî]] 8o4qcoc78gnz1r59yh2phq663s7d6t4 لەمپەر 0 271083 6533597 5876152 2026-09-19T11:41:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533597 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lemper === Navdêr === {{navdêr|ckb}} # [[asteng]], kos lemper, [[baraj]] al3du4agx2cvsttnupeaoedka93moml لەنجین 0 271084 6533598 5876154 2026-09-19T11:41:30Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533598 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lencîn === Lêker === {{lêker|ckb}} # [[lîtikîn]], lîtik li xwe dan, [[xwe hilavêtin]] tjv6u9lk6gsgujvbhcuqoxbj2d99jbd لەعنەت 0 271085 6533599 5876127 2026-09-19T11:41:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533599 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lenet === Navdêr === {{navdêr|ckb}} # [[lanet]], [[nalet]], [[lenet]], [[nelet]], [[xezeb]], [[bela]] njxs7xc84h60sroz22u0mjpr7ww7e0c لەنگی 0 271090 6533600 5876155 2026-09-19T11:41:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533600 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lengî === Navdêr === {{navdêr|ckb}} # [[lengî]], [[kulekî]], [[seqet]] # [[nelihevî]], [[newekhevî]], [[bêparsengî]], [[bêbalansî]] eysqxu5tbhlchpcs4fy2hhykqvslx60 لەنگین 0 271091 6533601 5876157 2026-09-19T11:42:00Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533601 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lengîn === Lêker === {{lêker|ckb}} # [[lengîn]], [[kulîn]], wek lengan / kulekan / seqetan meşîn / bi rê ve çûn 4t98lsj2s893rtir8b3p1bit8tuomuy لەپ 0 271092 6533602 6433743 2026-09-19T11:42:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533602 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lep === Navdêr === {{navdêr|ckb}} # [[lep]], paniya destan ==== Anagram ==== * {{anagram|ckb|a=لپە|پەل}} djntozvdop6o0nqdvhp9cihya9axmnf لەپەوڕوو 0 271095 6533603 5876084 2026-09-19T11:42:20Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533603 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lepewrrû === Hoker === {{hoker|ckb}} # [[devûdev]], [[ rû-û-rû]] 7wheqqls247w9d8bl37mftva2vule2z لەقاندن 0 271100 6533604 5876130 2026-09-19T11:42:30Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533604 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leqandin === Lêker === {{lêker|ckb}} # [[leqandin]], [[leqleqandin]], [[livlivandin]], [[velivandin]], [[vehejandin]], ji cihê wê / wî hinekî anîn û birî # [[dalivandin]], [[dahejandin]], [[daçemandin]], [[datewandin]], [[ da-anîn]], [[daînan]], serê xwe bi mebesta "belê / bila" livandin 962imtfd3hxyifb5fi7xztqsqpn9k2k لەقە 0 271101 6533605 5876132 2026-09-19T11:42:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533605 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leqe === Navdêr === {{navdêr|ckb}} # [[pên]], [[pehîn]], [[pêhn]], derbeyên bi (t binê) piyên mirovan, [[zîtik]], [[zîçik]], derbeyên bi simên dewaran p1rdtyiqozxhfr9o4idh0289rmgs589 لەقەب 0 271102 6533606 5876133 2026-09-19T11:42:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533606 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leqeb === Navdêr === {{navdêr|ckb}} # [[paşnav]], [[bernav]] d54hi1v2b0ehk029ap2dmuufwlcsy1d لەقەکوت 0 271103 6533607 5876134 2026-09-19T11:43:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533607 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leqekut === Navdêr === {{navdêr|ckb}} # [[pêqutk]], [[pêkutk]], çendîn car li dû hev piyên xwe li erdê dan / kutan / qutan 0v4ricsd4ogiu4mxdj4agr3zxdg42jy لەقەلەق 0 271104 6533608 5876135 2026-09-19T11:43:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533608 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leqeleq === Navdêr === {{navdêr|ckb}} # [[leqleq]], [[leqeleq]], bn leq 3y1ygai2tbnwf4hingt3o4ace2ea4h1 لەقوولۆق 0 271106 6533609 5876131 2026-09-19T11:43:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533609 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leqûloq === Rengdêr === {{rengdêr|ckb}} # [[leqleqok]], [[livlivok]], [[hejhejok]] hwmpl9u28sto0xk1mahicpbki2d0pz9 لەڕ 0 271107 6533610 5876096 2026-09-19T11:43:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533610 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lerr === Rengdêr === {{rengdêr|ckb}} # [[lawaz]], [[qels]], [[zeîf]], [[qaştîk]], [[çermok]] d1jz3hpx9o1qhcz27ezltky5jikl22w لەران 0 271108 6533611 5876098 2026-09-19T11:43:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533611 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leran === Lêker === {{lêker|ckb}} # [[lerizîn]], [[recifîn]], [[ricifîn]], [[qeliqîn]], [[livîn]] 94x27wjp3kew0p087y2yioiqtfxiyk1 لەرانەوە 0 271110 6533612 5876100 2026-09-19T11:43:50Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533612 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leranewe === Lêker === {{lêker|ckb}} # [[velerizîn]], [[verecifîn]], [[vericifîn]], [[veqeliqîn]], [[velivîn]] qwymfefnr172ocrcnjrz194yqnhuh4u لەڕوویی 0 271113 6533613 5876106 2026-09-19T11:44:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533613 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lerrûyî === Navdêr === {{navdêr|ckb}} # [[rastgoyî]], [[rastbêjî]] 3jbhndghsdey7dix4r051635x4q9w93 لەرز 0 271114 6533614 5876101 2026-09-19T11:44:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533614 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lerz === Navdêr === {{navdêr|ckb}} # [[lerz]], [[recifk]], livîna leşî ji ber sarmayê yan tirsê nwkfzpooy0f5zqi8x4uiwe0jg9f06a5 لەرزۆک 0 271117 6533615 5876104 2026-09-19T11:44:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533615 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lerzok === Rengdêr === {{rengdêr|ckb}} # [[lerizok]], [[recifok]], ya / yê ku dilerize, '': vehejok; [[livlivok]], [[velivok]], [[ veqeliqok'']] he63rdxn5npka4y1k0hd9jepm05zpft لەسەرکەرەوە 0 271118 6533616 5876117 2026-09-19T11:44:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533616 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leserkerewe === Navdêr === {{navdêr|ckb}} # [[berevan]], [[parêzvan]], [[berxwedêr]] fj11bdumreav3zs59g9go6cufki874f لەسەرخۆ 0 271119 6533617 5876115 2026-09-19T11:44:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533617 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leserxo === Rengdêr === {{rengdêr|ckb}} # [[liserxwe]], kesa/ê bi xwe dikare karûbarên xwe bi rê ve bibe, kesa/ê xwedî şiyan / taqe # [[hêdî]], [[rehet]], [[bêlezûbez]] f5lcr33j3ge2np477950d3ug4w8nvau لەش 0 271121 6533618 6433755 2026-09-19T11:44:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533618 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leş === Navdêr === {{navdêr|ckb}} # [[leş]], [[laş]], [[beden]], [[gewde]], [[kelex]] ==== Anagram ==== * {{anagram|ckb|a=شلە|شەل}} jlbrj5yhh12mmcmwkk57rlq331dfsuw لەشی 0 271122 6533619 6433764 2026-09-19T11:45:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533619 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leşî === Rengdêr === {{rengdêr|ckb}} # [[leşî]], tişta têkildarî leş ==== Anagram ==== * {{anagram|ckb|a=شلیە|شیلە}} anmkyehje0s77f5jbek94h85f1xepjf لەشکر 0 271123 6533620 5876121 2026-09-19T11:45:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533620 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leşkir === Navdêr === {{navdêr|ckb}} # [[leşker]], [[leşkir]], [[esker]], [[artêş]], [[ordî]], [[şervan]], [[şerker]], [[ordû]] 3r4eket4vq5wjvjqdxf09f87sg7iqyw لەشکرگا 0 271124 6533621 5876122 2026-09-19T11:45:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533621 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leşkirga === Navdêr === {{navdêr|ckb}} # [[leşkergeh]], navenda / cihê leşker lê 5xi137wz4762wn92lwk98n5rg22nv8u لەشقورس 0 271127 6533622 5876120 2026-09-19T11:45:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533622 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leşqurs === Rengdêr === {{rengdêr|ckb}} # [[leşgiran]], [[keslan]], [[tembel]] j3a6r1bo3b7ge7zv404rufrpp4dy5lp لەشسووک 0 271128 6533623 5876119 2026-09-19T11:45:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533623 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leşsûk === Rengdêr === {{rengdêr|ckb}} # [[leşsivik]], [[destsivik]], [[zîrek]], [[çalak]], [[aktîv]] db9h8i17txr7qqlmtq6krqsi7rn5fyf لەشوولار 0 271129 6533624 5876125 2026-09-19T11:45:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533624 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :leşûlar === Navdêr === {{navdêr|ckb}} # [[bejnûbal]] 7qun8a31fmlppcv4b6su5mmdjswjkca لەتگەر 0 271130 6533625 5876085 2026-09-19T11:46:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533625 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :letger === Navdêr === {{navdêr|ckb}} # [[budje]], hesaba lêçûn û jêhatinan 6rhs23ubvbskrjs5jla1yub491y487u لەتووپەت 0 271131 6533626 5876086 2026-09-19T11:46:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533626 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :letûpet === Navdêr === {{navdêr|ckb}} # [[qedûped]], [[pirtûmirt]], [[ parçe-parçe]] nyand5jcyv4yoqvf1jl29j574ermzjt لەوازە 0 271136 6533627 5876164 2026-09-19T11:46:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533627 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewaze === Navdêr === {{navdêr|ckb}} # [[çartilk]], [[çetelk]] 3muqo1bbuvoz5zg2uqdxrshtnsle7g9 لەوچەیی 0 271138 6533628 5876168 2026-09-19T11:46:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533628 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewçeyî === Navdêr === {{navdêr|ckb}} # [[lewçeyî]], [[zêdebêjî]], [[zêdeaxivî]], axivîna / peyivîna / şitexilîna / xeberdana zêde û bêwate, [[rûqayimî]], [[bêşermî]] e8vy2o21el6s7qozb2dmi815c0cr6n8 لەوەن 0 271139 6533629 5876182 2026-09-19T11:46:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533629 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewen === Navdêr === {{navdêr|ckb}} # [[leven]], [[rûl]], [[qamûş]], [[qamîş]], [[çîq]], giyayek dirêj e ku di avê de yan li ber avê şên dibe 2d1ac248qcidcvwdt9b0mbt7wdwbeec لەوەڕ 0 271140 6533630 5876180 2026-09-19T11:46:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533630 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewerr === Navdêr === {{navdêr|ckb}} # [[mêrg]], [[çîmen]], [[şayir]], [[şêngeh]], [[çerîngeh]], [[çêregeh]], [[çêrgeh]], [[çêrîngeh]] lxfh3q6xgeotki22ik91eoc2fgfxx6z لەوەڕگا 0 271142 6533631 5876181 2026-09-19T11:47:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533631 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewerrga === Navdêr === {{navdêr|ckb}} # [[çerîngeh]], [[çêrgeh]], cihê / meydana çerînê f2tnxjfxjifr07z8v5jjgycrp6xc461 لەوێ 0 271143 6533632 5876172 2026-09-19T11:47:10Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533632 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewê === Hoker === {{hoker|ckb}} # [[li wir]], li wê derê, li wêr # ji wir, ji wê derê, ji wêrê h69vgq5yjensspnujfad860j314aef2 لەوێچ 0 271144 6533633 5876173 2026-09-19T11:47:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533633 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lewêç === Navdêr === {{navdêr|ckb}} # [[mist]], [[kulm]], [[lep]] (tijî / miştî mistekî / kulmekî / lepekî xwê / şekir û hwd) 75erxx0y7bedbm99zr9nnu4qqwgbqxm لەوس 0 271148 6533634 5876169 2026-09-19T11:47:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533634 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lews === Navdêr === {{navdêr|ckb}} # [[lêv]] (t lêva jêrîn ya şorr / dirêj / stûn), bn lêw l17bded2bph2c4n724hrqxh2w1sb1c7 لەخەمڕەخسیو 0 271151 6533635 5876095 2026-09-19T11:47:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533635 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lexemrrexsîw === Rengdêr === {{rengdêr|ckb}} # [[serbixwe]], [[serbest]] (zarrokên yan firrindeyên êdî pêwîstiya wan bi dêbavên / makên wan nemaye) oclj6i1f6qvcgdho9w5prh1sgv5ljbi لەخشتەبەر 0 271152 6533636 5876089 2026-09-19T11:47:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533636 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lexişteber === Rengdêr === {{rengdêr|ckb}} # [[xapîner]], [[xirrîner]], [[xapînok]] pzkzhl5apimh0lbo87r9zdxzwnl3v2v لەخوانەترس 0 271153 6533637 5876092 2026-09-19T11:48:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533637 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lexwanetirs === Rengdêr === {{rengdêr|ckb}} # [[jixwedênetirs]], [[xirab]], [[bêîman]], [[nebawer]] n9k5ciipm6n429rf5vdisko375wbs66 لەخوانەترسی 0 271154 6533638 5876093 2026-09-19T11:48:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533638 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lexwanetirsî === Navdêr === {{navdêr|ckb}} # [[jixwedênetirsî]], [[xirabî]], [[bêîmanî]], [[nebawerî]] nhoaxps1jqo7s3ne2xe20tpuoghkazc لەخواترسی 0 271156 6533639 5876091 2026-09-19T11:48:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533639 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lexwatirsî === Navdêr === {{navdêr|ckb}} # [[jixwedêtirsî]], [[îman]], [[bawerî]], [[qencî]], [[rastî]], [[rêrastî]], [[duristî]], [[heqî]] 1ob3j9ud58rffzqkb7l33ybgk4h2ac5 لەز 0 271157 6533640 6433767 2026-09-19T11:48:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533640 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lez === Navdêr === {{navdêr|ckb}} # [[lez]], [[bizav]], [[lezûbez]], [[lezûbizav]], [[zûkahî]], [[pîtî]], [[ecele]] ==== Anagram ==== * {{anagram|ckb|a=زلە|زەل}} rkpoeo3vm253cp9enzbaljz07rw2cfh لەزگێڕی 0 271159 6533641 5876112 2026-09-19T11:48:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533641 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lezgêrrî === Navdêr === {{navdêr|ckb}} # [[lezgînî]], [[bizav]], [[lezûbez]], [[lezûbizav]], [[pîtî]] 02cnmrcmsftsj4n5k31lmx8vwcr933f لەزاندن 0 271160 6533642 5876109 2026-09-19T11:48:50Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533642 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lezandin === Lêker === {{lêker|ckb}} # [[lezandin]], [[bizivandin]], [[lez lê kirin]] 7gz1z6pda8pe7l1zauu58lpqn17vckk لەزەت 0 271161 6533643 5876114 2026-09-19T11:49:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533643 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lezet === Navdêr === {{navdêr|ckb}} # [[çêj]], [[tam]], [[lezet]] tezbkv4jijtcu99z41wx2qdtvrhsfvo لەزین 0 271162 6533644 5876113 2026-09-19T11:49:10Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533644 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lezîn === Lêker === {{lêker|ckb}} # [[lezîn]], [[bizivîn]], [[lez kirin]], [[ecele kirin]], [[lezûbez kirin]], [[lezûbizav kirin]], [[pîtîn]] q94xbgr9he2l9vmzxgnor3znhw0e2v8 لێ 0 271164 6533645 5875980 2026-09-19T11:49:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533645 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lê === Navdêr === {{navdêr|ckb}} # [[lê]], li wê / wî / wa # [[jê]], ji wê / wî / wan nccvoqcetts1i59yau2iasfep988prl لێبووردن 0 271166 6533646 5876006 2026-09-19T11:49:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533646 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêbûrdin === Navdêr === {{navdêr|ckb}} # [[lêborîn]], [[lênegirtin]], [[efû]], [[bexşandin]] rloks2fvp77xtsllkca7srodn9nyhon لێچوو 0 271168 6533647 5876014 2026-09-19T11:49:40Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533647 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêçû === Hoker === {{hoker|ckb}} # [[eynî]], [[heman]], [[şibî]] 5vugex065wsmrvq3dpdp40xyfw4cr0l لێچوونی 0 271169 6533648 5876015 2026-09-19T11:49:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533648 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêçûnî === Navdêr === {{navdêr|ckb}} # [[hevrengî]], [[şibînî]], [[şibîtî]], [[wekhevî]], [[mînahevî]], [[mînayî]], [[nolayî]], [[fenayî]], [[wekîtî]], [[eynîtî]] fvl4n4jk8kb95jqn5cn779dmqc6q2tz لێدوو 0 271171 6533649 5876018 2026-09-19T11:50:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533649 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêdû === Navdêr === {{navdêr|ckb}} # [[raveker]], [[şiroveker]] dzrwryumyq3lrhgqdjn1smsemqj7llw لێھاتوو 0 271173 6533650 5876064 2026-09-19T11:50:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533650 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêhatû === Rengdêr === {{rengdêr|ckb}} # [[kêrhatî]], [[lêhatî]], [[bikêr]] op9ntsn9q0tlpftnmltp1l2sgw9nn93 لێژاو 0 271175 6533651 5876031 2026-09-19T11:50:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533651 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêjaw === Navdêr === {{navdêr|ckb}} # [[herik]], ava bilez diherike / dimeşe h7bh8crl9d3lgd3bsj23zb8h4tjgust لێک 0 271177 6533652 6433773 2026-09-19T11:50:30Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533652 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêk === Hoker === {{hoker|ckb}} # [[lêk]], li hev(du), [[ lev(du)]], li êk(û)du, li yek(û)d # [[jêk]], [[ji hev]], [[jev]], ji yek(û)du, ji êk(û)du ==== Anagram ==== * {{anagram|ckb|a=لکێ|کێل}} 3xhf7h339fh5ug4kluxprv3v5orw98e لێکۆلینەوە 0 271178 6533653 5876048 2026-09-19T11:50:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533653 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêkolînewe === Navdêr === {{navdêr|ckb}} # [[vekolîn]], [[lêkolîn]], [[azmayîş]], [[azmûn]], [[sehkirin]] p1tm9f9mkqomh9qj7t5hmej3gkyaiyf لێڵایی 0 271181 6533654 5876050 2026-09-19T11:50:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533654 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêllayî === Navdêr === {{navdêr|ckb}} # [[ewrik]], ewrikê / şêlatiya ser çavan, kêmasiya nezelaldîtinê ya çavan 2pos7yclth617z7v8er8fhgbgeodn2a لێڵە 0 271182 6533655 5876053 2026-09-19T11:51:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533655 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêlle === Navdêr === {{navdêr|ckb}} # [[tarîgewrik]], [[xumamî]], dema spêdeyan yan êvaran ku dinya ne tarî û ne jî ronahî ye 4ywgtz1hx2o1iloof1vcdrszojgkigq لێڵی 0 271183 6533656 5876052 2026-09-19T11:51:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533656 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêllî === Navdêr === {{navdêr|ckb}} # [[şêlîtî]], [[nezelalî]], [[mijûmoranî]], [[nexwiyayî]] 0ubxl49gn76fm80s39jlsa0nzqxmqlj لێر 0 271187 6533657 5876019 2026-09-19T11:51:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533657 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêr === Navdêr === {{navdêr|ckb}} # [[dehl]], [[dehlûdir]], [[daristan]], cihê dar lê şên dibin (t yên pir dar / devî / teraş di nav hev re ne yan li nêzî hev in) imnn3zvolcah9ed2zsgarylny6euaeh لێرەوار 0 271188 6533658 5876024 2026-09-19T11:51:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533658 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêrewar === Navdêr === {{navdêr|ckb}} # [[dehlistan]], [[dehlûdir]], daristana asê / bor / boş ptxe7mllztirqycwp1wzv8vv88xdiha لێرە 0 271189 6533659 5876021 2026-09-19T11:51:40Z JiyanBot 3048 Cure Hoker hat lêzêdekirin 6533659 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêre === Hoker === {{hoker|ckb}} # [[vir]], [[vê derê]], [[vira]], [[vêrê]], [[vê dirê]], vî cihî, '':li vir, li vê derê, li vêrê, li vê dirê, li vî cihî; ji vir, ji vê derê, ji vira, ji vêrê, ji vê dirê, ji vî cihî'' 1hu02q21a0oi8wvbxrwx4gb9gjhbwk9 لێسە 0 271191 6533660 5876039 2026-09-19T11:51:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533660 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêse === Navdêr === {{navdêr|ckb}} # [[moçik]], [[kefçî]] k5ww68nl8dqz7jebzag7n2wyeke6sjv لێواولێو 0 271198 6533661 5876068 2026-09-19T11:52:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533661 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêwawlêw === Rengdêr === {{rengdêr|ckb}} # [[bi-lêvan-re]], ta berlêvan dagirtî, [[mişt]], [[tijî]], [[dagirtî]], ta berlêvan dagirtî / tijî / mişt, wisan tijî ku ger piçek din lê bêt zêdekirin dê birije 9uhyxksqnlt83gd1tx4lx196r27oayc لێوەدار 0 271199 6533662 5876070 2026-09-19T11:52:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533662 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêwedar === Rengdêr === {{rengdêr|ckb}} # [[tawî]], [[pejîdar]], kesa/ê ta digire h8jn8ll226a16s8umsapzi3azq06j28 لێوڕێژ 0 271200 6533663 5876069 2026-09-19T11:52:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533663 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêwrrêj === Rengdêr === {{rengdêr|ckb}} # [[lêvrêj]], [[zêde]], ya zêde ku di ser lêvan / berlêvan re dirije 12jrkdoln6zm44xv5pbe6imxnsf70sg لێخوڕ 0 271201 6533664 5876017 2026-09-19T11:52:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533664 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lêxurr === Navdêr === {{navdêr|ckb}} # [[ajo]], [[ajovan]], kesa/ê tiştekî diajo deo3lqlr0ei3lbdbxhzg5v6ga85yodq لچوولێو 0 271209 6533665 5875821 2026-09-19T11:52:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533665 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :liçûlêw === Navdêr === {{navdêr|ckb}} # [[devûlêv]] bmtu7u95s1ymvvftsoxs0mrj3v18rd6 لک 0 271210 6533666 5875874 2026-09-19T11:52:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533666 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lik === Navdêr === {{navdêr|ckb}} # [[liq]], [[pirt]], [[pişk]], [[parçe]], [[par]], [[beş]] cgqfok5bi5ba3e3lrydcc3676a861l7 لکاوە 0 271213 6533667 5875876 2026-09-19T11:53:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533667 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :likawe === Navdêr === {{navdêr|ckb}} # [[pêvek]], [[servek]], tişta neserekî ya li gel ya serekî d5s0kuexlriut3aqdwx9ii9sktfi4no لمین 0 271216 6533668 5875892 2026-09-19T11:53:10Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533668 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :limîn === Lêker === {{lêker|ckb}} # [[xîzîn]], [[qûmîn]], [[axî]], tişta/ê ji xîzî / qûmî 2kse4gqzsdho07eq4yygyxn87qw1lm9 لمۆز 0 271217 6533669 5875891 2026-09-19T11:53:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533669 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :limoz === Navdêr === {{navdêr|ckb}} # [[poz]], [[difin]], [[kepî]], [[bêvil]] (t ya heywanan) ji5jpl0mugk4stcpw0590c7al8up0xd لنگەلەرێ 0 271219 6533670 5875902 2026-09-19T11:53:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533670 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lingelerê === Navdêr === {{navdêr|ckb}} # [[lerz]], [[recifîn]] j1jizlnwskmo39z368t9iokerkzcbsu لوان 0 271222 6533671 5875913 2026-09-19T11:53:40Z JiyanBot 3048 Cure Lêker hat lêzêdekirin 6533671 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :liwan === Lêker === {{lêker|ckb}} # [[lê hatin]], [[kêr hatin]] ktud18gu93apsj1d3biqit3ijl25t7u لواو 0 271224 6533672 5875915 2026-09-19T11:53:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533672 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :liwaw === Rengdêr === {{rengdêr|ckb}} # [[lêhatî]], [[kêrhatî]], [[aşt]] iuypo36wl8bmit56j6vb2m9iluzefp8 لیچاڵ 0 271227 6533673 5876013 2026-09-19T11:54:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533673 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîçall === Navdêr === {{navdêr|ckb}} # [[rîçal]], [[reçel]], [[lîçal]] h1uvpcgh96hnoh6zzebuag4ak05sncn لیک 0 271230 6533674 6527456 2026-09-19T11:54:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533674 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîk === Navdêr === {{navdêr|ckb}} # [[gilîz]], [[ gilêz]], [[ şorrik]], [[ kefşil]], ava bi devûlêvên mirovan de dê xwarê == {{ziman|fa}} == === Binihêre === {{bnr|لیکن}} ==== Anagram ==== * {{anagram|fa|a=لکی|لکی|کلی}} 3y7ikfeeiyfia9jn0w5p0axk03eyagy لیمە 0 271232 6533675 5876060 2026-09-19T11:54:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533675 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîme === Navdêr === {{navdêr|ckb}} # [[parçe]], [[ker]], [[qed]], [[pirt]] b8vfz68xhju6dldjdmz3ucmj1u9x413 لیمۆ 0 271233 6533676 5876057 2026-09-19T11:54:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533676 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîmo === Navdêr === {{navdêr|ckb}} # [[lîmon]], [[leymon]], fêkiyek tirş e 01a8ai6d0ip50qceotktg3yx052jk39 لیمۆنی 0 271234 6533677 5876058 2026-09-19T11:54:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533677 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîmonî === Rengdêr === {{rengdêr|ckb}} # [[enirî]], [[esebî]], [[înato]], [[qehrokî]] lllj07uw0cld2qihfdksb0upcia4sec لیمۆیی 0 271235 6533678 5876059 2026-09-19T11:54:50Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533678 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîmoyî === Rengdêr === {{rengdêr|ckb}} # [[lîmonî]], ji rengê lîmonê, mîna rengê lîmonê 8juputn39scu23ec4otejsvsz0jr5zx لینج 0 271236 6533679 5876061 2026-09-19T11:55:00Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533679 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lînc === Rengdêr === {{rengdêr|ckb}} # [[çirrîk]], kesa/ê yan tişta bi asanî ji mirovî venabe yan bela xwe ji mirovî venake 6q6o9ujq0r9wvxq1mb5zjenuafhttzt لیر 0 271240 6533680 5876020 2026-09-19T11:55:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533680 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîr === Navdêr === {{navdêr|ckb}} # [[lîr]], [[pirzik]], [[kulik]] q08j11667a9v1g7720oz2f7gksiuwz9 لیستە 0 271241 6533681 5876037 2026-09-19T11:55:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533681 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîste === Navdêr === {{navdêr|ckb}} # [[lîste]], [[rêzname]], nameya / kaxeza / perrê navê tiştan / kesan lê hatine rêzkirin / nivîsîn shag6wj4k2pewax1hjkms6op8ai15jv لیوا 0 271243 6533682 5876065 2026-09-19T11:55:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533682 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîwa === Navdêr === {{navdêr|ckb}} # [[parêzgeh]], [[wîlaye]] # [[lîwa]], [[tûgay]] (yekîneyek leşkerî ye) 2uwbvkgb6hyx37pkk1hrseuco4sg4oh لیخن 0 271244 6533683 5876016 2026-09-19T11:55:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533683 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lîxin === Rengdêr === {{rengdêr|ckb}} # [[şêlî]], [[şêlû]], (ava) [[nezelal]] 53dmfo046iqjoi803voo4gbwecapvbj لۆک 0 271245 6533684 5875972 2026-09-19T11:55:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533684 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lok === Navdêr === {{navdêr|ckb}} # [[ben]], [[bizîng]], [[werîs]] 86gr62fo2mcaofzwsgaj1x2csdzw8m7 لۆکە 0 271246 6533685 5875974 2026-09-19T11:56:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533685 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :loke === Navdêr === {{navdêr|ckb}} # [[pembû]] oysjjmlibx3x10ism8x1kz6hbfutxcu لۆککراو 0 271247 6533686 5875973 2026-09-19T11:56:10Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533686 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lokkiraw === Rengdêr === {{rengdêr|ckb}} # [[girêdayî]], [[benkirî]], [[bizîngdayî]], [[werîskirî]] rzd2onih59q5nznasalw58wa2wrbi1y لۆمە 0 271250 6533687 5875977 2026-09-19T11:56:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533687 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lome === Navdêr === {{navdêr|ckb}} # [[lome]], [[gazin]], [[gilî]] 5yl2fq5y6o40zbmdfhej4wp9nrwfohd لۆنگ 0 271252 6533688 5875978 2026-09-19T11:56:30Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533688 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :long === Navdêr === {{navdêr|ckb}} # [[kevînk]], [[dersok]], [[serpoş]], '':desmal; xawlî'' 9mdo3rhoq8yrlqnd0drnh3vfzi7cvqp لۆقە 0 271254 6533689 5875971 2026-09-19T11:56:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533689 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :loqe === Navdêr === {{navdêr|ckb}} # [[çargavkî]] oatcc4mbpdbqwe10ico1m52089cyc0o لۆر 0 271255 6533690 5875966 2026-09-19T11:56:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533690 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lor === Navdêr === {{navdêr|ckb}} # [[rewş]], [[kawdan]], [[hal]], [[barûdox]] r46nzksgn3jw16w0v6n1h4r338ad4jd لۆتیێتی 0 271260 6533691 5875963 2026-09-19T11:57:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533691 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lotiyêtî === Navdêr === {{navdêr|ckb}} # [[lotiyetî]], [[lotîtî]], hunera mitirbên / meymûnên reqisvan / muzîkjen, [[qeşmerî]] 12b40zwgjecuzu7pbf3v93end71kbsj لۆتی 0 271261 6533692 5875962 2026-09-19T11:57:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533692 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lotî === Navdêr === {{navdêr|ckb}} # [[lotî]], mitirbên / meymûnên reqisvan / muzîkjen, [[qeşmer]] o8eeiw5oi46vae6zlrptr0e5q9ds2im لۆخان 0 271264 6533693 5875965 2026-09-19T11:57:20Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533693 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :loxan === Navdêr === {{navdêr|ckb}} # [[şahî]], [[festîval]], [[gala]] jdndmuzmw25qwkvoemt2by3oyo4cslh لۆزەندەر 0 271265 6533694 5875970 2026-09-19T11:57:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533694 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lozender === Rengdêr === {{rengdêr|ckb}} # [[gir]], [[bejndirêj]], [[zexm]], [[girs]] 6r2pjd6lg93yzt65r1k74035egymp20 لوڕ 0 271266 6533695 5875923 2026-09-19T11:57:40Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533695 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lurr === Navdêr === {{navdêr|ckb}} # [[lor]], nijada / gelê lor, kurdên bi zaravaya lorî dipeyivin iupipirindfl4qbwfreo59cgeiikgj0 لوودە 0 271270 6533696 5875949 2026-09-19T11:57:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533696 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûde === Navdêr === {{navdêr|ckb}} # [[gidîş]], koma giyayê dirûyî û li ser hev civandî lypdqw32ock7vpf5zp6flqiz5bvrhkj لوولاق 0 271272 6533697 5875955 2026-09-19T11:58:00Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533697 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûlaq === Navdêr === {{navdêr|ckb}} # [[ling]], [[çok]], [[lûlaq]] o0a98znkrpgexmqpt7r56vhlllv191f لوولە 0 271273 6533698 5875958 2026-09-19T11:58:10Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533698 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûle === Navdêr === {{navdêr|ckb}} # [[lûlî]], [[sîlînder]] oib00sojzy4texywtpfepdb4zs33le4 لووس 0 271279 6533699 5875951 2026-09-19T11:58:20Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533699 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûs === Rengdêr === {{rengdêr|ckb}} # [[hilû]], [[hilis]], [[nerm]], [[rêk]] mteedszme82c41ssh8aiwqru914gvkn لووسکە 0 271280 6533700 5875952 2026-09-19T11:58:30Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533700 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûske === Rengdêr === {{rengdêr|ckb}} # [[kose]], [[bêrih]], kesên rih lê nehatine 6z2en9flq6xv700cz899h17qsw1ud6x لووتبەرز 0 271283 6533701 5875941 2026-09-19T11:58:40Z JiyanBot 3048 Cure Rengdêr hat lêzêdekirin 6533701 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûtberz === Rengdêr === {{rengdêr|ckb}} # [[pozbilind]], kesa/ê xwe pirr mezin dihesibîne emdo97s76dnh0peq0dmzfsxccb15s7l لووتبەرزی 0 271284 6533702 5875942 2026-09-19T11:58:50Z JiyanBot 3048 Cure Navdêr hat lêzêdekirin 6533702 wikitext text/x-wiki == {{ziman|ckb}} == === Bilêvkirin === :lûtberzî === Navdêr === {{navdêr|ckb}} # [[pozbilindî]] 8o9kfavhltloxzifvlt51iemddgsr3h Keltic 0 276401 6532646 6509407 2026-09-19T09:07:38Z Wikihez 7344 Wikihezî/ê navê [[keltic]] weke [[Keltic]] guhart 6509407 wikitext text/x-wiki == {{ziman|en}} == === Rengdêr === {{rengdêr|en}} # (binêr) [[celtic]] ==== Anagram ==== * {{anagram|en|a=ceiklt|Tickle|tickle}} ed9fa2pttgxrsz3mryxqt664eudw3hy 6532663 6532646 2026-09-19T09:09:45Z Wikihez 7344 Îngilîzî/Rengdêr: mane, etîket hatin guhartin (DefSideBoxes) 6532663 wikitext text/x-wiki == {{ziman|en}} == === Rengdêr === {{rengdêr|en}} # {{e|en|nadir}} {{ad|en|Celtic}} ==== Anagram ==== * {{anagram|en|a=ceiklt|Tickle|tickle}} 1wecg234m684sh70f4tmngnv1mu3v8p tickle 0 312093 6532654 6509411 2026-09-19T09:08:34Z Wikihez 7344 6532654 wikitext text/x-wiki == {{ziman|en}} == === Bilêvkirin === * {{deng|en|en-us-tickle.ogg|dever=DYA}} === Lêker === {{lêker|en}} # [[qidqidandin]], [[enitandin]] ==== Anagram ==== * {{anagram|en|a=ceiklt|Keltic}} cpednw83f1aynzx7ai04bmb944jszp4 çendem 0 341789 6532312 6398063 2026-09-19T08:14:08Z Şêr 1103 cînav 6532312 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Cînav === {{cînav|ku|c=}} # [[çendemîn]] ==== Anagram ==== * {{anagram|ku|a=çdeemn|neçemd}} dpgl9tpoyky1f5r0cp8xffug1q5tx4p ducks and geese 0 627894 6532169 5175786 2026-09-19T07:51:11Z Wikihez 7344 Îngilîzî/Mane: mane, etîket hatin guhartin, beşa «Etîmolojî» hate rakirin; Îngilîzî: beşa «Mane» bû «Navdêr» (DefSideBoxes) 6532169 wikitext text/x-wiki == {{ziman|en}} == === Navdêr === {{navdêr|en|j=tp}} # {{f|en|cotepeyv|kolankî}} [[polîs|polîs]] tif6d1xyvqcgb0t4zawwxdu0qxrysg6 6532678 6532169 2026-09-19T09:12:07Z Balyozbot 7867 Bot: Paqijiyên kozmetîk (Lînk paqij kir.) 6532678 wikitext text/x-wiki == {{ziman|en}} == === Navdêr === {{navdêr|en|j=tp}} # {{f|en|cotepeyv|kolankî}} [[polîs]] pzbwqt85evjffd76865ujhfz9t0dgzo Wîkîferheng:Daxwazên peyitandinê 4 843283 6532787 6405981 2026-09-19T09:29:57Z Wikihez 7344 [[Bikarhêner:Wikihez/skrîpt/js/şablon-lêke.js|T]]: Daxwaza peyitandinê: +[[jenk]] 6532787 wikitext text/x-wiki {{/destpêk}} = Hezîran 2020 = == [[romî#Navdêr|romî]] == Li Şingalê maneya polîs? --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:00, 15 hezîran 2020 (UTC) = Tîrmeh 2020 = == [[kêlb#p-mane|kêlb]] == --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:24, 22 tîrmeh 2020 (UTC) == [[ejî#p-mane|ejî]] == --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:24, 22 tîrmeh 2020 (UTC) == [[tutirk#peyitandin|tutirk]] == --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:02, 22 tîrmeh 2020 (UTC) :{{r|Guherto}} Niha çawa ye? Bi ya min çavkaniyên ku min dane têrê me dike. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:43, 22 tîrmeh 2020 (UTC) ::{{r|Balyozxane}} Nizanim.. li hin deveran wek tutirk hatîye nivîsandin û li hin jî wek tûtirk. Li hin deveran bi wateya tûşêmî (Rubus) ye, hin deveran jî bi wateya tûerd (Fragaria × ananassa) e û carna jî bi wateya tû (ê spî û reş go li ser daran çê dibin) ye. -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 08:16, 23 tîrmeh 2020 (UTC) == [[erbane#p-mane|erbane]] == Ji bo ''Amûreke tenê tekerekî wê heye ji bo veguhestina tiştan wek: axê, kevir, hwd'' ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]''--[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:42, 31 tîrmeh 2020 (UTC) = Tebax 2020 = == [[cifta berazan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:57, 9 tebax 2020 (UTC) == [[tê gerîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:26, 10 tebax 2020 (UTC) == [[tapor]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:30, 22 tebax 2020 (UTC) :{{r|Mihemed Qers}} -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 22:16, 22 tebax 2020 (UTC) == [[şimzare]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:01, 26 tebax 2020 (UTC) == [[bîrkok]] == Tenê Mehmed Uzun bi kar tîne. Ji bilî kitêbên wî çavkaniyeke din tune. —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:38, 28 tebax 2020 (UTC) == [[hunera axaftinê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:46, 30 tebax 2020 (UTC) == [[derrijîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 07:38, 31 tebax 2020 (UTC) == [[yekal]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 09:19, 31 tebax 2020 (UTC) == [[av û agir]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:50, 31 tebax 2020 (UTC) : Di çavkaniyeke de wek av û agir kirin derbas dibe û ji wergerandinên inglîzî cuda ye lê nêzîk e.<br> {{jêder-pirtûk|ku|jêgirtin=weke gelek hunermendên ko dû re agir bera berhêm xwe didin Xwedê jî ji bilî maltaba Nûh tevayiyê vê berhema xwe '''av û agir dike''', van melekên xwe yên doxînsist dikişîne asîmanan, li wir wan tawanbar dike, mîna ko bibêje: de biçin û weke xwe bikin, bi derew û tevgerên xwe yên qirêj dijminiya min bikin, Xwedê wan ji asimanan de serjêr davêje xwarê.|nivîskar=Hesenê Metê|sernav=Labîrenta cinan|weşanxane=Nefel|sal=2002|rûpel=132}} --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:37, 31 tebax 2020 (UTC) == [[elm#p-mane-notice|elm]] == Wateya: ''[[ewlebûn]], sihê pê zanîn, baş pê zanîn''. ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:31, 31 tebax 2020 (UTC) :{{r|Hakîmo}} Ku çavkanî tunebûn em ê jê bibin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:47, 19 îlon 2020 (UTC) ::{{r|Balyozxane}} Mala te neketê... Hingê bixwe here lê bigere. Jixwe ez reşwî me. Ma eve ne çavkanî ye? -- [[Bikarhêner:Hakîmo|Hakîmo]] ([[Gotûbêja bikarhêner:Hakîmo|gotûbêj]]) 14:48, 19 îlon 2020 (UTC) :::{{r|Hakîmo}} Hinek bixwîne [[Wîkîferheng:Pîvekên tevlîkirinê]]. Jixwe dema ti kesan din çavkanî lê zêde nakin, ez lê digerim û zêde dikim. Na tu ne ti çavkanî yî. Çavkaniyên nivîskî hewce ne. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:51, 19 îlon 2020 (UTC) ::::{{r|Balyozxane}} Erê, lê ku tine bin em çawa bikinî? Em hema jê bibinî? -- [[Bikarhêner:Hakîmo|Hakîmo]] ([[Gotûbêja bikarhêner:Hakîmo|gotûbêj]]) 14:52, 19 îlon 2020 (UTC) :::::{{r|Hakîmo}} Erê em jê dibin. Lê peyvên jê hatine birin em li rûpela [[Pêvek:Bêçavkanî]] zêde dikin. bnr. [[:Kategorî:Pêvek bêçavkanî]]. Dîsa jî ez jî ji vê rewşa me aciz im û bi ya min peyvên devokî divê nayên jêbirin. Lê ji ber ku [[Wîkîferheng:Rêbazname]] dibêje divê werin jêbirin, ez jê dibim. Hevalên {{r|Jiju|Guherto|Ghybu}} [https://ku.wiktionary.org/wiki/Got%C3%BBb%C3%AAj:kejm%C3%BBn], [https://ku.wiktionary.org/wiki/Got%C3%BBb%C3%AAja_p%C3%AAvek%C3%AA:B%C3%AA%C3%A7avkan%C3%AE] jî ji vê rewşê aciz in. Lê ti kes gotûbêj nadin destpêkirin. Ku tu li vir [[Gotûbêja Wîkîferhengê:Pîvekên tevlîkirinê]] gotûbêjek bidî destpêkirin, ez ê piştgirî bidime te. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:58, 19 îlon 2020 (UTC) ::::::Ji kerema xwe min şaş fêm mekin feqet hemû bikarhêner ku tên vira dilpak nînin. Em çito ew peyvan kotrol bikinê? Mixabin, ji bo konrolkirina peyvan di destên me de tenê xwastina çavkaniyan hene amûrek din tine ye... PS: Herwiha me li ser wîkîferhengê Namespace'yên Nimînok ([[Nimînok:Kurdî/serhedî]]?, [[Nimînok:Kurdî/badînî]]?, ..) û Portal ([[Portal:Kurdî]], [[Portal:Frensî]] (mk. [[:fr:Portail:Français]]), ...) jî çêkiriye...--[[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:32, 19 îlon 2020 (UTC) :::::::Nizanim we nivîsa vira xwand, [[Wîkîferheng:Dîwan#Skotî]]. Piraniya peyvên wîkiya skotî çêkirî ne...--[[Bikarhêner:Ghybu|Ghybu]] ([[Gotûbêja bikarhêner:Ghybu|gotûbêj]]) 15:47, 19 îlon 2020 (UTC) ::::::::@Ghybu erê min ew xwendibû. Ku em peyvan nepeyitînin, rewşa me jî wek mg.wikt û wikiya skotiyan be. Temam em peyvên devokî jê nebin lê em wan jî nexin werger û rûpelên din heta ku werin peyitandin. Herwiha tu dibêjî amûrek tune ye lê tenê ji bo peyvên devokî û navên heywan/riwekan wisa ye. Gelek caran peyitandin pir hêsan e. Mînak @Hakîmo yan jî hevalên din dikarin blogan binivîsin daku em karibin peyvên wan yên devokî (nepeyitandî) têxin rûpela [[Wîkîferheng:Tomarkirina peyvên ji wêjeya kurdî|Jêgirtinekê tomar bike]] û kengî ew peyv ji hêla nivîskar û blogvanên kurd yên din ve hatine bikaranîn hingê em dikarin li wîkîferhengê jî zêde bikin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:05, 19 îlon 2020 (UTC) {{outdent|::::::::}}{{r|Hakîmo|Ghybu}} Xêra dê û bavên we '''[[Gotûbêja_Wîkîferhengê:Pîvekên_tevlîkirinê#Li_ser_peyvên_devokî|li vir]]''' fikrên xwe binivîsin daku kesên din bizanin kesên din jî hene vê fikrê min dipejirînin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 06:48, 3 çiriya pêşîn 2020 (UTC) == [[nîşanbar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 23:51, 31 tebax 2020 (UTC) = Îlon 2020 = == [[besme]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:26, 1 îlon 2020 (UTC) == [[ferengi]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:12, 1 îlon 2020 (UTC) == [[çelape]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:22, 1 îlon 2020 (UTC) == [[cesasandin]] == Çavkaniyek klasîk heye, yên din heye gelo? —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 09:02, 2 îlon 2020 (UTC) == [[depan]] == Depan guhertoyeke textan an textîn e. Lê li vir çi mane heye min fêm nekir. —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:33, 2 îlon 2020 (UTC) == [[li rûyê dinê xweş mayîn]] == Çavkaniyeke klasîk heye —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:38, 2 îlon 2020 (UTC) == [[bêsewî]] == klasîk —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 06:34, 4 îlon 2020 (UTC) == [[merkemoş]] == Klasîk —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 06:34, 4 îlon 2020 (UTC) == [[firfiroka bayî]] == {{r|Mamoste Dilovan}} ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:57, 6 îlon 2020 (UTC) == [[guhê fîlî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:56, 7 îlon 2020 (UTC) : {{r|Bikarhêner}} Min guh li evê peyvê bû ji kesekî ku xudan xwaringehek û baxçeyekî mezin e. : Gelek tişt di berbelav in û xelk dizanin, lê di pertûkan de naye dîtin. {{bêîmze|IbrahimKocher Duhok}} == [[gurovî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:41, 14 îlon 2020 (UTC) :{{r|Bikarhêner}} Çavkanîyên peyvên ku min nivîsandin mixabin ne nivîskî ne. Ev peyv min ji hin mezinên malbatê bihîstine û min jî gelek caran dîtîne ku hatine bikaranîn. Ji bo ku ev peyv wûnda nebin min hem li ba xwe û hem jî li wîkîferhengê nivîsand. Ji bo peyvên ku çavkanîyên nivîskî tunin, mixabin gotinên devkî tene weke çavkanî dimînin. Pêşnîyara te ji bo pevên bi vî awayî çi ye gelo? Spas{{bêîmze|Xwende}} ::{{r|Xwende}} Pêşî li ser malpera [https://tirsik.net/xerhati.php] dûre jî li ser arsiv.org qeyd bike ku nikarî çavkanî peyda bikî. Herwiha bnr [[Alîkarî:Îmze]] --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:00, 15 îlon 2020 (UTC) == [[şîloyî]] == {{r|Xwende}} ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:44, 14 îlon 2020 (UTC) == [[dever]] == Ji bo wateya ''derence, sêlim û merdîwen'' [[Wîkîferheng:Pîvekên tevlîkirinê|çavkanî hewce ye]]. —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:53, 14 îlon 2020 (UTC) == [[kerrnizî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 15:56, 15 îlon 2020 (UTC) == [[li dora (yekê) gerîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:46, 15 îlon 2020 (UTC) == [[glas]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 12:45, 16 îlon 2020 (UTC) == [[kejmûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:42, 17 îlon 2020 (UTC) == [[lirêgerîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:20, 18 îlon 2020 (UTC) == [[çavpeqî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:23, 23 îlon 2020 (UTC) :http://www.geocities.ws/mehname2004a/63/pexsan5.html -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 16:58, 23 îlon 2020 (UTC) == [[çavpeqiyayî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:14, 23 îlon 2020 (UTC) :{{r|Balyozxane}} Çavpeqî û -iyayî eynî peyv in, heke bo nimûne 2 çavkanî ji bo çavpeqî û 1 ji bo -iyayî werin dîtin ew weke 3 ji bo yek peyv tên jimartin? -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:16, 23 îlon 2020 (UTC) ::{{r|Guherto}}. Na, divê yek ji wan peyitandî be daku em karibin yek ji wan wek guherto nîşan bidin. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:45, 23 îlon 2020 (UTC) :::Temam naxwe. {{=(}} -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:48, 23 îlon 2020 (UTC) ::::Ecêb e peyva çavpeqîn jî tune ye. Divê çavpeqî/çavpeqiyayî jê hatibe lê qet tune. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:56, 23 îlon 2020 (UTC) :::::Em çavpeqî ne weke kesekî ku çavê wan peqî ye dibêjin. Siqêfek e. ''Wilo neke, çavpeqî!'' -- [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 18:10, 23 îlon 2020 (UTC) == [[olfatûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:58, 24 îlon 2020 (UTC) :Du çavkanî hatiye dîtin li hêviya ya sisêyan e. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:46, 23 sibat 2025 (UTC) == [[hekûke]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:00, 28 îlon 2020 (UTC) :Tenê çavkaniyek ji Kovara Kurmancî heye ew jî ji kitêba Gundê Mêrxasan a Eliyê Evdilrehman hatiye girtin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:49, 23 sibat 2025 (UTC) == [[dê bêjî kaya di serî de]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:58, 29 îlon 2020 (UTC) == [[heçî ne li malekê, nizanit halekê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:58, 29 îlon 2020 (UTC) == [[heta nîva destî reş nebit, tama devî xoş nabit]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:58, 29 îlon 2020 (UTC) == [[kirtop]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herwiha [[kirtope]]—[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:59, 29 îlon 2020 (UTC) : == [[pişkûmişk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 21:25, 29 îlon 2020 (UTC) = Çiriya pêşîn 2020 = == [[ma te şulê pê ye?]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:19, 1 çiriya pêşîn 2020 (UTC) == [[zelam yêt heyn û zelamoşk jî yêt heyn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:28, 1 çiriya pêşîn 2020 (UTC) == [[ezîz î&#59; ji pêrve ne mîzî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:15, 1 çiriya pêşîn 2020 (UTC) == [[qelpez]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:19, 6 çiriya pêşîn 2020 (UTC) == [[firêzer]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 15:27, 6 çiriya pêşîn 2020 (UTC) == [[kirmişk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 09:03, 7 çiriya pêşîn 2020 (UTC) == [[orijîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 19:03, 7 çiriya pêşîn 2020 (UTC) == [[şequdeq]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:50, 9 çiriya pêşîn 2020 (UTC) == [[helizandin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:23, 9 çiriya pêşîn 2020 (UTC) == [[rewastin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:48, 9 çiriya pêşîn 2020 (UTC) == [[xunaftin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:31, 9 çiriya pêşîn 2020 (UTC) == [[itîmad li ser kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 16:32, 15 çiriya pêşîn 2020 (UTC) == [[sengesor]] == {{r|Saberabdollahizad}} ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:00, 16 çiriya pêşîn 2020 (UTC) :Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}} == [[zenek]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:03, 16 çiriya pêşîn 2020 (UTC) :{{r|Saberabdollahizad}} [[zenek]] jî li Ûrmiyê tê bikaranîn? --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 19:53, 18 çiriya pêşîn 2020 (UTC) == [[pind#p-mane|pind]] == Min tenê çavkaniyek dît ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:48, 17 çiriya pêşîn 2020 (UTC) :Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}} == [[maqezer]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:53, 18 çiriya pêşîn 2020 (UTC) :Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}} == [[pezpezok]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:55, 18 çiriya pêşîn 2020 (UTC) :Navçeya Mirgewerê, Ûrmîye. {{bêîmze|Saberabdollahizad}} == [[parapet#p-mane|parapet]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:53, 31 çiriya pêşîn 2020 (UTC) = Çiriya paşîn 2020 = == [[quloç#p-mane|quloç]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:43, 19 çiriya paşîn 2020 (UTC) == [[di ber (yekî) de avêtin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:57, 20 çiriya paşîn 2020 (UTC) :https://tirsik.net/index.php?mijarid=18749&iro=on&rupel=1 —[[Bikarhêner:Mamoste Dilovan|Mamoste Dilovan]] ([[Gotûbêja bikarhêner:Mamoste Dilovan|gotûbêj]]) 17:37, 20 çiriya paşîn 2020 (UTC) :: {{r|Mamoste Dilovan}} [[di ber re avêtin]] heye. lê te wek di ber '''de''' lê zêde kir. Em biguherînin? Gelek çavkanî ji bo di ber re avêtin heye. --[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:41, 20 çiriya paşîn 2020 (UTC) == [[hêvastin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:49, 21 çiriya paşîn 2020 (UTC) == [[lamçîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:28, 22 çiriya paşîn 2020 (UTC) == [[poz#p-mane|poz]] == Ji bo maneya "[[quz]], [[vajîna]]" ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:28, 22 çiriya paşîn 2020 (UTC) == [[sihetbexş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:35, 24 çiriya paşîn 2020 (UTC) == [[hevjêhatin ji jêhatîbûnê çêtir e]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:14, 25 çiriya paşîn 2020 (UTC) == [[gerriyan#p-mane|gerriyan]] == ''Ji bo wateya cereyan (tevger)''. Qasî ku dibînim tenê Cewerî bi kar aniye —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:24, 25 çiriya paşîn 2020 (UTC) == [[derbend]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:08, 30 çiriya paşîn 2020 (UTC) = Kanûna paşîn 2021 = == [[desthelgirtin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:48, 6 kanûna paşîn 2021 (UTC) == [[êşewî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:52, 7 kanûna paşîn 2021 (UTC) == [[sexorr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:22, 7 kanûna paşîn 2021 (UTC) == [[sapût]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:06, 12 kanûna paşîn 2021 (UTC) = Çiriya pêşîn 2022 = == [[paşbingeh]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:40, 12 çiriya pêşîn 2022 (UTC) = Kanûna paşîn 2023 = == [[berê beringa]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:35, 1 kanûna paşîn 2023 (UTC) == [[mûlûleya xwînê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:36, 6 kanûna paşîn 2023 (UTC) == [[mirovdostî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 05:38, 12 kanûna paşîn 2023 (UTC) == [[derîner]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 23:02, 15 kanûna paşîn 2023 (UTC) == [[neteba]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:01, 16 kanûna paşîn 2023 (UTC) :Maneya "uyruksuz" ji ferhenga Farqînî hatiye kopîkirin wekî din bi giştî bi maneya "nakokî" tê bikaranîn. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:33, 26 hezîran 2026 (UTC) == [[narkotîkfiroş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:59, 16 kanûna paşîn 2023 (UTC) == [[pirik#p-mane|pirik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:15, 16 kanûna paşîn 2023 (UTC) == [[ramyarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ez dibêjim ev peyv tenê bi maneya "fikrî", wek rengdêr heye. Lê belê di soranî de bi şaşemilandineke wekî "siyasî" bi kar anîne, kurmancên me jî rasterast maneya soranî tevlî çend ferhengên hev-kopîkirî kirine û bi vî awayî belkî hin çavkanî hebin. Lê ez dibêjim divê ew çavkanî jî neyên hesibandin. Hin kes zen dikin ku her tiştê di soranî de ripîrast e. Mesele heqeten eletewş e. Agahiyeke li ser peyvê: "[https://www.welateme.info/kurdi/modules.php?name=News&file=print&sid=686 Welateme.info]" Li vir peyv bi maneya "fikrî" hatiye bikaranîn: "[https://xwebun1.org/ziman-sirhelal-e/ Xwebûn]". Qewet be. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:36, 19 kanûna paşîn 2023 (UTC) == [[dolîwgeh]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:08, 22 kanûna paşîn 2023 (UTC) = Sibat 2023 = == [[herebaş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:13, 11 sibat 2023 (UTC) == [[balindeyê korare]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê çavkaniyekê tê xuyan, ew jî kitêba "Balindeyên Kurdistanê" yê Îsmaîl Taha Şahîn e (Îsmaîl Taha Şahîn (2006). Balindeyên Kurdistanê, 1-4. Spîrêz, Duhok). Ev kitêb ji ser înternetê wek word jî peyda dibe. Xuya ye ku ji Weşanên Spîrez fîzîken jî çap bûye. Lê wekî çavkanî tenê ev tê xuyan. —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:10, 14 sibat 2023 (UTC) == [[dîbeyt]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:13, 18 sibat 2023 (UTC) == [[çend pat]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:35, 24 sibat 2023 (UTC) == [[rabînîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji bo kurmancî bêçavkanî ye. Ger ji bo soranî çavkanî hebin jî divê ji bo soranî bi herfên aramî were nivîsîn. An ger halê latînîkirî ya peyveke soranî be, dîsa divê ev hal were eşkerekirin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:36, 26 sibat 2023 (UTC) = Adar 2023 = == [[qirar#p-mane|qirar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:23, 2 adar 2023 (UTC) == [[pîşpêkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê di nivîseke online ya Cemal Nebez de derbas dibe. Dibe ku peyveke başûriyan be. Û di wê nivîsa Cemal Nebezê bi forma "pîş bi ... bikin" jî derbas dibe. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:29, 3 adar 2023 (UTC) == [[kûcag]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:27, 27 adar 2023 (UTC) == [[destbizavî kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Xuya ye ku ev peyv tenê di kitêba “''Nameyek Şernexê''” yê Evdirehman Gundikî de derbas bûye. Û ji wir jî Mistefa Aydoganî maneya peyvê di hejmara 61em ya Kovara ''Kurmancî'' de belav kiriye (rûpela 2yem). Lê belê tenê yek çavkaniyekê ne bes e ji bo ku em vê peyvê di vê ferhengê de wekî peyveke çavkanî-temam belav bikin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:40, 28 adar 2023 (UTC) == [[germav baş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:23, 31 adar 2023 (UTC) == [[germavxweş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:27, 31 adar 2023 (UTC) = Gulan 2023 = == [[kirbend]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 08:34, 5 gulan 2023 (UTC) : Çêkerê rûpelê wek not nivîsiye ku peyv ji herêma Çewlikê ye. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:24, 6 gulan 2023 (UTC) == [[We are off now]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:13, 22 gulan 2023 (UTC) == [[baran ji erd û esmana lê diket]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:46, 26 gulan 2023 (UTC) == [[sîba]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:44, 30 gulan 2023 (UTC) == [[bîrîner]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:20, 30 gulan 2023 (UTC) = Hezîran 2023 = == [[bidestmiz]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:49, 10 hezîran 2023 (UTC) = Tîrmeh 2023 = == [[parzeng]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:01, 15 tîrmeh 2023 (UTC) == [[zerpedest]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:05, 15 tîrmeh 2023 (UTC) == [[heta destên mirov nebine gû, devê mirov nabite tû]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:27, 19 tîrmeh 2023 (UTC) == [[çemê mezin tê dibore diçe]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:38, 19 tîrmeh 2023 (UTC) == [[kevanê nebî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:45, 19 tîrmeh 2023 (UTC) == [[teybûr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê li malpera yuksekovahaber.com-ê derbas dibe, li wir jî bi maneya "çare, çareserî"yê hatiye emilandin, ne bi vê maneyê. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:00, 19 tîrmeh 2023 (UTC) == [[nikêtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:22, 19 tîrmeh 2023 (UTC) = Tebax 2023 = == [[prêze]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 21:19, 15 tebax 2023 (UTC) == [[qelye]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 15:59, 25 tebax 2023 (UTC) = Îlon 2023 = == [[hetwan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:21, 14 îlon 2023 (UTC) == [[milyonmasî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:06, 21 îlon 2023 (UTC) == [[tofana mêjî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:20, 21 îlon 2023 (UTC) == [[îshaf]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:57, 23 îlon 2023 (UTC) == [[odeya karkirinê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:57, 26 îlon 2023 (UTC) == [[odeya şixulînê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 11:42, 26 îlon 2023 (UTC) == [[hîter]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:08, 26 îlon 2023 (UTC) = Çiriya pêşîn 2023 = == [[vîtamîn waw]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:20, 1 çiriya pêşîn 2023 (UTC) == [[berhan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:21, 3 çiriya pêşîn 2023 (UTC) == [[sêlikdêr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:16, 10 çiriya pêşîn 2023 (UTC) == [[qewandêr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:20, 10 çiriya pêşîn 2023 (UTC) == [[darav]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:04, 11 çiriya pêşîn 2023 (UTC) = Çiriya paşîn 2023 = == [[kansernasî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:54, 14 çiriya paşîn 2023 (UTC) == [[golgir]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 16:06, 15 çiriya paşîn 2023 (UTC) == [[ahardar]] == Tenê Zana Farqînî —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 10:34, 26 çiriya paşîn 2023 (UTC) = Kanûna pêşîn 2023 = == [[Kî mal ezîz bike, can rezîl dike&#59; kî mal rezîl bike, can ezîz dike.]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:55, 2 kanûna pêşîn 2023 (UTC) == [[porsing]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:22, 2 kanûna pêşîn 2023 (UTC) == [[newelatî kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:57, 2 kanûna pêşîn 2023 (UTC) == [[newelatîkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:58, 2 kanûna pêşîn 2023 (UTC) == [[alîkar kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:42, 3 kanûna pêşîn 2023 (UTC) == [[aramoş kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'' -- [[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:48, 3 kanûna pêşîn 2023 (UTC) == [[bêvil kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:56, 4 kanûna pêşîn 2023 (UTC) == [[dijberiya naverokî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 22:43, 8 kanûna pêşîn 2023 (UTC) == [[bersivîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]]'', û her wiha ne li gorî qayideyên kurdî (kurmancî) ye. —[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 22:08, 11 kanûna pêşîn 2023 (UTC) == [[hevalzewac]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:25, 18 kanûna pêşîn 2023 (UTC) = Kanûna paşîn 2024 = == [[raperk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:40, 15 kanûna paşîn 2024 (UTC) :Bi wê manê nîne. Bi maneke dî heye. [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 19:26, 6 tebax 2024 (UTC) = Sibat 2024 = == [[bi navê lîstin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:02, 3 sibat 2024 (UTC) : Li ser agahdarkirina çêkerê rûpelê me şablona "dever"ê tevlî kir. Peyv ji herêma Qoser, Mêrdînê ye. Me li qismê "Bikaranîn"ê jî vê yekê dîyar kir. Ji xeynî vê me wê peyvê ji rûpelên din jî bir. Bi vî awayî ev made kare were girtin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:28, 10 nîsan 2024 (UTC) == [[preskirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:43, 11 sibat 2024 (UTC) == [[pres kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:43, 11 sibat 2024 (UTC) == [[Xwedê te têr bike]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:41, 13 sibat 2024 (UTC) == [[isad]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:09, 22 sibat 2024 (UTC) == [[razemendîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:44, 27 sibat 2024 (UTC) = Adar 2024 = == [[zilhêzî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:19, 5 adar 2024 (UTC) == [[hingihîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:32, 13 adar 2024 (UTC) == [[xore]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:30, 15 adar 2024 (UTC) == [[melef]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:55, 19 adar 2024 (UTC) == [[uğursuz ayak]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:11, 23 adar 2024 (UTC) == [[şepûk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:22, 23 adar 2024 (UTC) == [[agirberdêrî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:04, 26 adar 2024 (UTC) == [[kîrquz]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:00, 26 adar 2024 (UTC) == [[kîrquzdê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:01, 26 adar 2024 (UTC) == [[quzgêj]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:03, 26 adar 2024 (UTC) = Nîsan 2024 = == [[hîkarîkerî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:53, 1 nîsan 2024 (UTC) == [[hîkarîker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:54, 1 nîsan 2024 (UTC) == [[hîkarîdarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:55, 1 nîsan 2024 (UTC) == [[hîkarîdar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:56, 1 nîsan 2024 (UTC) == [[bihîkarîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:57, 1 nîsan 2024 (UTC) == [[bihîkarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:58, 1 nîsan 2024 (UTC) == [[bêhîkarîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:58, 1 nîsan 2024 (UTC) == [[bêhîkarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:59, 1 nîsan 2024 (UTC) == [[bêhîkarî bûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:00, 1 nîsan 2024 (UTC) == [[bêhîkarî kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:00, 1 nîsan 2024 (UTC) == [[bêhîkarîbûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:01, 1 nîsan 2024 (UTC) == [[bêhîkarîkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:01, 1 nîsan 2024 (UTC) == [[hîkarîkirî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:02, 1 nîsan 2024 (UTC) == [[hîkarîkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:03, 1 nîsan 2024 (UTC) == [[hîkarî kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:07, 1 nîsan 2024 (UTC) == [[rayda]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:40, 1 nîsan 2024 (UTC) == [[bêrayda]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:42, 1 nîsan 2024 (UTC) == [[bêraydayî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC) == [[bêraydatî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC) == [[bêrayda bûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC) == [[bêrayda kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:43, 1 nîsan 2024 (UTC) == [[bêraydabûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:44, 1 nîsan 2024 (UTC) == [[bêraydakirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:44, 1 nîsan 2024 (UTC) == [[birayda]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:44, 1 nîsan 2024 (UTC) == [[biwerêç]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:46, 1 nîsan 2024 (UTC) == [[biwerêçî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:46, 1 nîsan 2024 (UTC) == [[biwerêçîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:47, 1 nîsan 2024 (UTC) == [[biwerêçtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:47, 1 nîsan 2024 (UTC) == [[werêç]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:49, 1 nîsan 2024 (UTC) == [[werêç kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 1 nîsan 2024 (UTC) == [[werêçkirî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:50, 1 nîsan 2024 (UTC) == [[werêçkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:51, 1 nîsan 2024 (UTC) == [[wişto]] == @[[Bikarhêner:Zerwanda]] Çavkanî ji bo kurmancî tine ye. Zazakî ye? —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 20:19, 1 nîsan 2024 (UTC) :ji devera mûşê, aliyê diya min "wişto/wiştik" digotin. [[Bikarhêner:Zerwanda|Zerwanda]] ([[Gotûbêja bikarhêner:Zerwanda|gotûbêj]]) 20:44, 1 nîsan 2024 (UTC) == [[xewgerî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:19, 2 nîsan 2024 (UTC) == [[xewgerokî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:28, 2 nîsan 2024 (UTC) == [[nimêh]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:51, 2 nîsan 2024 (UTC) == [[فعال]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' [[Bikarhêner:Ghybu|Gyhbu]] di 2021an de li ser rûpela wî tevlî kirîye. Lê ji ber nebûna vê sîstema me tevlî vir nebûye. Lewma min anî ser vir jî. Wê gavê tenê ji bo maneya "kar" ev şablon hatîye tevlîkirin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:27, 3 nîsan 2024 (UTC) == [[pêjor]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:46, 6 nîsan 2024 (UTC) == [[hafil]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:48, 6 nîsan 2024 (UTC) == [[micemi]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Muhtemelem şiklê rast wek "micemî" ye, lê ew jî bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:52, 9 nîsan 2024 (UTC) == [[hesaba xwe]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji xeynî van ev forma wê jî bêçavkanî ne: "[[hisaba xwe]] / [[hesaba xo]] / [[hisaba xo]]". — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:25, 9 nîsan 2024 (UTC) == [[leşkerma]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:53, 24 nîsan 2024 (UTC) = Gulan 2024 = == [[serîi]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek "serî" belkî li kar be, lê wekî "serîi" çavkanî peyda nabe. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:20, 2 gulan 2024 (UTC) == [[virgu]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Bêçavkanî tê xuyan. Peyv bi tirkî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:49, 2 gulan 2024 (UTC) == [[xwerre]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:57, 20 gulan 2024 (UTC) = Hezîran 2024 = == [[di nav deryaya peyvan de avjenî dikir]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:34, 4 hezîran 2024 (UTC) == [[berbixwe]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:03, 10 hezîran 2024 (UTC) == [[şipyakî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:08, 10 hezîran 2024 (UTC) :"şipêkî" heye [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:20, 27 tîrmeh 2024 (UTC) == [[wetalane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:18, 10 hezîran 2024 (UTC) == [[wetalî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:19, 10 hezîran 2024 (UTC) == [[wetalîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:20, 10 hezîran 2024 (UTC) == [[wetaltî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:20, 10 hezîran 2024 (UTC) == [[se direye karwan dibuhire]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:49, 16 hezîran 2024 (UTC) == [[se direwît, karwan bi rêka xo diçît]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:53, 16 hezîran 2024 (UTC) == [[se direwît, karwan diburît]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:54, 16 hezîran 2024 (UTC) == [[se direyê karwan dibûrê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:55, 16 hezîran 2024 (UTC) == [[se direye karvan li riya xwe diçe]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:56, 16 hezîran 2024 (UTC) == [[se direye û kerwan dibihure]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Formeke bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:00, 16 hezîran 2024 (UTC) == [[hingê dinya]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:07, 18 hezîran 2024 (UTC) == [[berdanberdan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:22, 24 hezîran 2024 (UTC) == [[nîska mala Barzan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:05, 25 hezîran 2024 (UTC) = Tîrmeh 2024 = == [[avmêwe]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:41, 16 tîrmeh 2024 (UTC) == [[nihalok]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:53, 24 tîrmeh 2024 (UTC) == [[nihalk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:54, 24 tîrmeh 2024 (UTC) == [[niwalok]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:54, 24 tîrmeh 2024 (UTC) == [[niwalk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:55, 24 tîrmeh 2024 (UTC) == [[niwalik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:55, 24 tîrmeh 2024 (UTC) == [[nehalok]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:56, 24 tîrmeh 2024 (UTC) == [[nehalk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:56, 24 tîrmeh 2024 (UTC) == [[nehalik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:57, 24 tîrmeh 2024 (UTC) == [[alîkarxwazî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:16, 24 tîrmeh 2024 (UTC) == [[nihalik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:19, 24 tîrmeh 2024 (UTC) == [[zêrîb]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Bi dîtina min, ev form bêçavkanî ye. Dibe ku ji bo forma "zerîb" çavkanî hebe, lê ew form li ser Wîkîferhengê wek made nehatîye çêkirin. Pir kêm be jî ev peyv wek "zerîp" jî li cihekî derbas bûye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:31, 24 tîrmeh 2024 (UTC) == [[qanat]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev peyv bi maneya "kanal"ê nîne, xelet e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:59, 25 tîrmeh 2024 (UTC) == [[qenat]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev peyv bi maneya "kanal"ê nîne, xelet e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:59, 25 tîrmeh 2024 (UTC) :Min 1 çavkanî dît, "Ev kes rojê 6-7 qenatên TV ya diğere û diaxive" https://darkamazi.info/archives/1019704 (bi lêgerana "qenatên", ji ber ko lêgeranên dî tijî tiştên dî derdixin) :Lê mimkun e xelet nivîsîbe. [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:31, 27 tîrmeh 2024 (UTC) == [[şkaftmend]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:08, 25 tîrmeh 2024 (UTC) :3 çavkanî hene. Lê xuya dike jêdera wan hemû ferhenga tirsik.netê e. :* Çavkanî 1: https://tirsik.net/ferheng?query=şkaftmend (berî 2014, lê tarîx nîne) :* Çavkanî 2: https://ku.wikipedia.org/wiki/Deranderî (2011) :* Çavkanî 3: https://x.com/zerdeceno/status/1155331427510247425 (2019) :[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:28, 27 tîrmeh 2024 (UTC) == [[dan hev#p-mane|dan hev]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev mane li ser çavkanîyan peyda nabe. Tenê çêkerê rûpelê vê maneyê nivîsîye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:08, 25 tîrmeh 2024 (UTC) == [[baristdar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:47, 25 tîrmeh 2024 (UTC) == [[baristdarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:48, 25 tîrmeh 2024 (UTC) == [[baristdarîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:49, 25 tîrmeh 2024 (UTC) == [[baristdartî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:50, 25 tîrmeh 2024 (UTC) == [[bibaristî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:51, 25 tîrmeh 2024 (UTC) == [[bibarist]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:52, 25 tîrmeh 2024 (UTC) == [[bibaristîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:53, 25 tîrmeh 2024 (UTC) == [[bêbaristî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:54, 25 tîrmeh 2024 (UTC) == [[bêbarist]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:55, 25 tîrmeh 2024 (UTC) == [[peydabûnîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:52, 27 tîrmeh 2024 (UTC) == [[nexşvan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:05, 27 tîrmeh 2024 (UTC) == [[nexşvanî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:05, 27 tîrmeh 2024 (UTC) == [[lêvikî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:47, 27 tîrmeh 2024 (UTC) == [[lêvik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Min zêde nemeyzand. —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:48, 27 tîrmeh 2024 (UTC) == [[şerenîx kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 21:51, 27 tîrmeh 2024 (UTC) == [[sala çîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:09, 29 tîrmeh 2024 (UTC) == [[berê pêşîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:57, 30 tîrmeh 2024 (UTC) == [[berê ewilî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:57, 30 tîrmeh 2024 (UTC) = Tebax 2024 = == [[xwîndijmin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:02, 4 tebax 2024 (UTC) == [[reîsîtî]]/[[reysîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 18:17, 6 tebax 2024 (UTC) == [[soranîaxivî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 18:43, 6 tebax 2024 (UTC) == [[helîna bildo]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji 2020a ve şablon li wir e min tenê li vir zêde kir. —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 19:56, 6 tebax 2024 (UTC) == [[hilbijêrînerî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' "Hilbij" rihê peyvê ye, "-er" jî maneya "kesê dike" dide, qertafa "-îner / -înerî" ya li dawîyê bi eşkereyî xelet e. Û ev peyv bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:45, 7 tebax 2024 (UTC) == [[îqlîmtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:43, 10 tebax 2024 (UTC) == [[jîrbêjî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev peyv ger di soranî de ji bo wê çavkanîyên têr hebe, tenê wek "Nivîsîna bi herfên latînî ya peyva ..." kare were qeydkirin. Lê nabe ku wek kurmancî be, were qeydkirin. Ji bo kurmancî tenê di meqaleyekê de derbas dibe, ew jî ji alî başûrîyekî ve hatîye nivîsîn. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:55, 10 tebax 2024 (UTC) == [[hîgyen]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê ev form bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:40, 12 tebax 2024 (UTC) == [[kolîner]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:45, 12 tebax 2024 (UTC) == [[poşmanî kişîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê di çavkanîyekê de peyda dibe. Ew çavkanîya dayî jî ihtîmal e ku bi tesîra zimanê tirkî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:44, 13 tebax 2024 (UTC) == [[para hevpar a herî mezin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:09, 14 tebax 2024 (UTC) == [[cara hevpar a herî biçûk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:10, 14 tebax 2024 (UTC) == [[regjimar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:16, 14 tebax 2024 (UTC) == [[nîvrengî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:33, 18 tebax 2024 (UTC) == [[nîvdûrgeh]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek "guharto" hatiye qeydkirin, lê yek nikare wilo bêje. Ne "guharto" ye, ji ber wê çavkanî hewce ne. —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:39, 18 tebax 2024 (UTC) == [[nîvtewlîsî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:44, 18 tebax 2024 (UTC) == [[nîvrewa]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:44, 18 tebax 2024 (UTC) == [[nîvşehtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:46, 18 tebax 2024 (UTC) == [[nîvfalincî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:46, 18 tebax 2024 (UTC) == [[nîvgilkarî]] == Ferhenga Sa.Sa. ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 17:48, 18 tebax 2024 (UTC) == [[kesîkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 20:16, 18 tebax 2024 (UTC) == [[biryarbirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:38, 24 tebax 2024 (UTC) = Îlon 2024 = == [[qîblename]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 15:15, 1 îlon 2024 (UTC) == [[cihetnima]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji [https://bianet.org/yazi/ferhenga-ser-u-amrazen-ser-ji-kovara-ronahiye-2-196299 vir] hatiye —[[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 15:27, 1 îlon 2024 (UTC) == [[qûnderîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:36, 7 îlon 2024 (UTC) == [[hevpîşehî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:48, 14 îlon 2024 (UTC) == [[hevpîşeyî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek ''navdêr'' bêçavkanî ye. Wek ''rengdêr'' hebe jî, kêmçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:50, 14 îlon 2024 (UTC) == [[hempay]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:04, 14 îlon 2024 (UTC) == [[nîs]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:43, 14 îlon 2024 (UTC) == [[êxbarçî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji bo ''îxbarçî'' çavkanîyekê peyda dibe, lê kêm e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:06, 14 îlon 2024 (UTC) == [[muxbîrîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:38, 14 îlon 2024 (UTC) == [[ixbarçî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:43, 14 îlon 2024 (UTC) == [[westgeha pasê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:33, 19 îlon 2024 (UTC) == [[avikmadk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:24, 19 îlon 2024 (UTC) == [[ferwerîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:18, 20 îlon 2024 (UTC) == [[bipayderî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:12, 20 îlon 2024 (UTC) == [[bipayderîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:13, 20 îlon 2024 (UTC) == [[bipaydertî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:13, 20 îlon 2024 (UTC) == [[bipedalî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:14, 20 îlon 2024 (UTC) == [[bipedalîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:14, 20 îlon 2024 (UTC) == [[bipedaltî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:14, 20 îlon 2024 (UTC) == [[pedaldarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:15, 20 îlon 2024 (UTC) == [[pedaldarîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:15, 20 îlon 2024 (UTC) == [[pedaldartî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:16, 20 îlon 2024 (UTC) == [[ciwên]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:11, 22 îlon 2024 (UTC) == [[belgebirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:31, 23 îlon 2024 (UTC) == [[avsîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Dibe ku ev kelîme biçavkanî be, lê pir bêagahî hatîye qeydkirin. Biçavkanî be jî, ji ber qeydkirina bêagahî (li ser madeyê agahî kêm hatine pêşkêşkirin) em rûpelê jê bibin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:53, 23 îlon 2024 (UTC) :@[[Bikarhêner:Bikarhêner|Bikarhêner]] Ma ne çêtir e li "Daxwazên zelalkirinê" be naxwe? [[Bikarhêner:Guherto|Guherto]] ([[Gotûbêja bikarhêner:Guherto|gotûbêj]]) 13:40, 10 çiriya paşîn 2024 (UTC) :: {{r|Guherto}} Bi min em karin vê madeyê ji ber bêagahîbûna wî, îlaweyî "Daxwazên jêbirinê" bikin, lê "Daxwazên zelalkirinê" nabe. Wekî din ji ber ku dikeve çarçoveya her du rûpelan jî kîjan be jî dibe, lê madem me li vir da destpêkirin, bila ji vir dewam bike dengdana li ser vê kelîmeyê. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:22, 10 çiriya paşîn 2024 (UTC) == [[kûvank]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas tenê formekê be jî, bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:14, 27 îlon 2024 (UTC) == [[kikark]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:40, 27 îlon 2024 (UTC) == [[kîfkarik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas tenê formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:45, 27 îlon 2024 (UTC) == [[kuvank]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:53, 27 îlon 2024 (UTC) == [[kûvarik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Herçiqas tenê formekê be jî, bêçavkanî dixuye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:01, 27 îlon 2024 (UTC) = Çiriya pêşîn 2024 = == [[muhil]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê qismê kurdî bêçavkanî ye, ne ya tirkî. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:00, 9 çiriya pêşîn 2024 (UTC) == [[muhilk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:00, 9 çiriya pêşîn 2024 (UTC) == [[jêrmal]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:59, 15 çiriya pêşîn 2024 (UTC) = Çiriya paşîn 2024 = == [[bîrxistiner]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 19:38, 14 çiriya paşîn 2024 (UTC) == [[wisa gotin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ne ferhengî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:13, 15 çiriya paşîn 2024 (UTC) == [[tenzîlatî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:12, 16 çiriya paşîn 2024 (UTC) == [[armancparêz]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:03, 19 çiriya paşîn 2024 (UTC) == [[şikaftmend]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:06, 19 çiriya paşîn 2024 (UTC) == [[derander]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:08, 19 çiriya paşîn 2024 (UTC) == [[deranderî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 13:09, 19 çiriya paşîn 2024 (UTC) == [[derxwenîn]] == @[[User:Keyomerd]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 22:38, 19 çiriya paşîn 2024 (UTC) == [[kiyû]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 23:53, 22 çiriya paşîn 2024 (UTC) == [[goçavik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:03, 23 çiriya paşîn 2024 (UTC) == [[hûrhesibaner]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 00:19, 23 çiriya paşîn 2024 (UTC) == [[heybera zindî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:01, 23 çiriya paşîn 2024 (UTC) == [[misadereker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:51, 24 çiriya paşîn 2024 (UTC) == [[kêmtirkar]] == @[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:11, 24 çiriya paşîn 2024 (UTC) == [[cudagir]] == @[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:15, 24 çiriya paşîn 2024 (UTC) == [[qerwaşgir]] == @[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:42, 24 çiriya paşîn 2024 (UTC) == [[mişkilûr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:45, 24 çiriya paşîn 2024 (UTC) == [[agirbiran]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:54, 24 çiriya paşîn 2024 (UTC) == [[alan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:55, 24 çiriya paşîn 2024 (UTC) == [[alêdû]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 18:56, 24 çiriya paşîn 2024 (UTC) == [[henaseker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 17:37, 25 çiriya paşîn 2024 (UTC) == [[nial]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ji xeynî vê, maneya 2yem ya di madeya "nihal" de (navdêr 2) jî bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:46, 27 çiriya paşîn 2024 (UTC) == [[gilçim]] == @[[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:28, 29 çiriya paşîn 2024 (UTC) :Ez ji bajarê Kobaniyê me. Min ev peyv ji ser zimanê dê û dapîra xwe girt. Ez gelekî ji vê peyvê bawer im ji ber ku devoka min e. [[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] ([[Gotûbêja bikarhêner:Roj Rewandiz|gotûbêj]]) 19:14, 23 kanûna pêşîn 2024 (UTC) ::@[[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] Mala te ava. Ji ber ku çavkaniyên nivîskî tine ne em ê vê kelîmeyê wek [[Wîkîferheng:Pîvekên_tevlîkirinê#Peyvên_herêmî|herêmî]] nîşan bidin. [[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 12:22, 25 kanûna pêşîn 2024 (UTC) == [[reşeme kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Li gorî çêkera sayfeyê li Kobaniyê li kar e. Loma dikare wekî herêmî nîşankirin —[[Bikarhêner:Balyozxane|Balyozxane]] ([[Gotûbêja bikarhêner:Balyozxane|gotûbêj]]) 14:35, 29 çiriya paşîn 2024 (UTC) :Li Kobaniyê dibêjin: ‘Tizbiyê min li xwe reş û reşeme kir’ Anko Tizbî bir û venegerand Înkar kir. [[Bikarhêner:Roj Rewandiz|Roj Rewandiz]] ([[Gotûbêja bikarhêner:Roj Rewandiz|gotûbêj]]) 23:48, 7 kanûna paşîn 2025 (UTC) = Kanûna pêşîn 2024 = == [[çarkunc]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:21, 27 kanûna pêşîn 2024 (UTC) = Kanûna paşîn 2025 = == [[pevnatî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev kelîme wek kurtkirina ji "bi hev nehatî" hatîye fikirîn, ihtimal e ku wek sunî hatîye çêkirin û bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:43, 6 kanûna paşîn 2025 (UTC) == [[lihevnatîbûn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Wek formeke "lihevnehatîbûn"ê hatîye fikirîn, lê bêçavkanî ye. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:49, 6 kanûna paşîn 2025 (UTC) == [[Binxetê]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Em zanin ku ji ber sînora Tirkîyeyê ku Cizîrê dike du perçe û ji parçeya binî re Binxet tê gotin ku kurd lê dijîn. Feqet min herêma Binxetê seh nekirîye, û bi tedqîqeke neberfireh jî çavkanî peyda nekir ji bo vê peyvê. Lewma bi min mahîyeta vê madeyê û qeydkirina wek "Binxetê" xelet e. Ger ji bo herêma tarîfkirî çavkanî nîn be, em vê madeyê bikin "'''Binxet'''" û tarîfa wê jî bikin "''Navê Rojavayê Kurdistanê ku li binê xeta Tirkîye - Sûrîyeyê dimîne.''" — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:22, 24 kanûna paşîn 2025 (UTC) == [[xirecir çêkirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' "''Çê''" bi maneya "''baş''" e, û "''çêkirin''" ji bo tiştên pozîtîv likar e, li nav milet jî ev wisa ye. Lewma ev xelet e. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:00, 24 kanûna paşîn 2025 (UTC) == [[sîrkxane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:30, 26 kanûna paşîn 2025 (UTC) == [[anînder]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Di hin çavkanîyan de wek formeke "''der'''''anîn'''"ê hatîye qeydkirin. Lê belê çavkanîyeke eslî (ne ji kitêbên gramerê) peyda nabe ji bo vê kelîmeyê. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:24, 27 kanûna paşîn 2025 (UTC) == [[rastî nîşandan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:14, 30 kanûna paşîn 2025 (UTC) = Sibat 2025 = == [[pir hindik#p-mane|pir hindik]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:31, 3 sibat 2025 (UTC) == [[anteroz]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:19, 15 sibat 2025 (UTC) == [[veşidandin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:43, 15 sibat 2025 (UTC) == [[karîwer kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 02:01, 16 sibat 2025 (UTC) == [[hil girtin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:06, 17 sibat 2025 (UTC) == [[wer girtin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:07, 17 sibat 2025 (UTC) == [[avkûre]] == @[[Bikarhêner:Mohajeer|Mohajeer]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:36, 18 sibat 2025 (UTC) == [[derdek girtin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:42, 18 sibat 2025 (UTC) == [[vekitandin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 19:12, 21 sibat 2025 (UTC) == [[dînperist]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:32, 22 sibat 2025 (UTC) == [[ayînperist]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:33, 22 sibat 2025 (UTC) == [[ayînperistî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:33, 22 sibat 2025 (UTC) == [[ayînperistane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:33, 22 sibat 2025 (UTC) == [[piştrastkirinbar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 01:45, 23 sibat 2025 (UTC) == [[diyarkirinbar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 02:08, 23 sibat 2025 (UTC) == [[hevhatî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 03:52, 1 adar 2025 (UTC) == [[kerexne]] == @[[Bikarhêner:Rojhilat|Rojhilat]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:05, 1 adar 2025 (UTC) == [[pawan#p-mane|pawan]] == Ferhenga Hejar soranî ye, ji bo maneya "cihê qedexekirî, cihê inhisarî" ji xeynî wê çavkanî heye gelo —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:17, 3 adar 2025 (UTC) == [[taqane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 02:11, 6 adar 2025 (UTC) == [[gosirmetî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:07, 6 adar 2025 (UTC) == [[matîjêker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:08, 14 adar 2025 (UTC) == [[hilewesan]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:14, 16 adar 2025 (UTC) == [[peydandin#p-mane|peydandin]] == Ji bo maneya [[dûre]], [[paşî]], [[piştî]] wê / wî ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:26, 19 adar 2025 (UTC) == [[peşar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:36, 19 adar 2025 (UTC) == [[nûzaf]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:30, 20 adar 2025 (UTC) == [[deynname]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:08, 20 adar 2025 (UTC) == [[girtek]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:29, 20 adar 2025 (UTC) == [[bêşxane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:25, 23 adar 2025 (UTC) == [[superleheng]] == @[[Bikarhêner:Avestaboy|Avestaboy]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:34, 23 adar 2025 (UTC) == [[goranparêz]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:54, 27 adar 2025 (UTC) == [[raber#p-mane|raber]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:09, 1 nîsan 2025 (UTC) == [[morîvanî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:06, 1 nîsan 2025 (UTC) == [[wevde]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:17, 3 nîsan 2025 (UTC) == [[şandêr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:31, 3 nîsan 2025 (UTC) == [[giloverî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Tenê li ser Ferhenga Zaravên Teknîkî û hejmara yekem ya kovara Bernamegehê derbas dibe. —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:10, 4 nîsan 2025 (UTC) == [[xêvjimêr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 00:00, 12 nîsan 2025 (UTC) == [[paşekeft]] == @[[Bikarhêner:Jiyar Hesen|Jiyar Hesen]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:11, 13 nîsan 2025 (UTC) == [[paşekeft kirin]] == @[[Bikarhêner:Jiyar Hesen|Jiyar Hesen]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 11:12, 13 nîsan 2025 (UTC) == [[hawirkanî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:36, 20 nîsan 2025 (UTC) == [[hawirkan]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:18, 21 nîsan 2025 (UTC) : Di çavkanîyeke de "''hawrikan''" (ku wek forma vê kelîmeyê hatîye nîşandayîn û wek "hevrêyan" a kurmancî ye) bi maneya "''friends''"a îngilîzî hatîye emilandin. Wekî din ti çavkanî nîne ji bo vê peyvê. Ger ev "hevrik"a kurmancî be, li vir dîsa xelet e. Bi her awayî divê were jêbirin. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:28, 21 nîsan 2025 (UTC) == [[hawirkanî]] == @[[Bikarhêner:Cyrus the virus|Cyrus the virus]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:18, 21 nîsan 2025 (UTC) == [[hawirkanvanî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:18, 21 nîsan 2025 (UTC) == [[riberiz]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:39, 21 nîsan 2025 (UTC) :Ez bawer im ku ev hat peyitandin. Min çavkanî di beşa gotûbêjê de dan û şablona bêçavkanîtiyê rakir. [[Bikarhêner:Ferhengvan|Ferhengvan]] ([[Gotûbêja bikarhêner:Ferhengvan|gotûbêj]]) 06:11, 25 nîsan 2025 (UTC) == [[awam]] == @[[User:Ferhengvan|Ferhengvan]] Min ev kelîme di ferhengên din de nedît. Gelo di kurmancî de tê bikaranîn? —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:09, 23 nîsan 2025 (UTC) :@[[Bikarhêner:Zerwanda|Zerwanda]] tu jî forma [[vam]] ya vê kelîmeyê diemilînî, gelo çavkanî ji bo wê jî heye? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:11, 23 nîsan 2025 (UTC) ::Min jî li vir peyda kir û dest kar anîn kir, hemin ev li guherrên dengî ên Kurmancî dihat (*ebam > *ewam > *wam > vam; wek *ebaj- > {{q|ku|vajî}}). Min gotibû qey di zarawayê kesekî da hebûye û wî bi ser va kiriye û jixwe nepêkan nîn e ku di zimên da hebe îcar rind e, nê min jî serkanî tine ji bonê. [[Bikarhêner:Zerwanda|Zerwanda]] ([[Gotûbêja bikarhêner:Zerwanda|gotûbêj]]) 21:37, 23 nîsan 2025 (UTC) :::https://bnk.institutkurde.org/images/pdf/4UVB2YMZG3.pdf :::Di vê kitêbê de bi forma wam derbas dibe 1 Wam : qerz, dên. " dîsa jî gereg 3 çavkanî hebe. :::Lê di beşa etîmolojiyê de eger em karibin zimanekî yekgirtî biemilînin, dê baştir be. Wekî din "bi vê enflasyona kelîmeyan" em nikarin ti tiştî bidin fêmkirin. [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:54, 23 nîsan 2025 (UTC) == [[arvanê hûr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:48, 27 nîsan 2025 (UTC) == [[damezrak]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:47, 27 nîsan 2025 (UTC) == [[mezrak]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 13:49, 27 nîsan 2025 (UTC) == [[hevhemetî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:25, 6 gulan 2025 (UTC) == [[navhemetî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:25, 6 gulan 2025 (UTC) == [[entîte]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:08, 17 gulan 2025 (UTC) == [[agirvekujêner]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:35, 21 gulan 2025 (UTC) == [[progres]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:50, 23 gulan 2025 (UTC) == [[bûncî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 22:29, 28 gulan 2025 (UTC) == [[tasît]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:36, 31 gulan 2025 (UTC) == [[implîcît]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:37, 31 gulan 2025 (UTC) == [[hewedar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 19:14, 31 gulan 2025 (UTC) == [[destajo]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:38, 31 gulan 2025 (UTC) == [[binhimbank]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 01:23, 1 hezîran 2025 (UTC) == [[şîmane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:31, 2 hezîran 2025 (UTC) == [[materya]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:12, 5 hezîran 2025 (UTC) == [[bêtî]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 13:03, 7 hezîran 2025 (UTC) == [[rîbat]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:21, 9 hezîran 2025 (UTC) == [[hevtawan]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:26, 12 hezîran 2025 (UTC) :Pirsek: "Hevwate" kelîmeyên ku maneyan wan hev in. "hevtawan" çawa dibe "şirîkên sûcekê"? Gereg sûcên ku tiştê wan hev bin? Ew tişt çi ye? Çima dibe şirîk? [[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:32, 12 hezîran 2025 (UTC) ::Merheba! ::"Hevtawan" anku "şirîkên heman tawanê, kesên ku heman tawan kiriye/dikin", wek "hevkar = şirîkên heman karî, kesên ku heman karî dikin", "hevjîn = şirîkên heman jiyanê, kesên ku bi hev re dijîn"... [[Bikarhêner:Ferhengvan|Ferhengvan]] ([[Gotûbêja bikarhêner:Ferhengvan|gotûbêj]]) 06:11, 30 hezîran 2025 (UTC) == [[zanîş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:07, 14 hezîran 2025 (UTC) == [[zanîşwer]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:07, 14 hezîran 2025 (UTC) == [[zanmend]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 12:09, 14 hezîran 2025 (UTC) == [[zandar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:08, 14 hezîran 2025 (UTC) == [[zayîndar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:12, 14 hezîran 2025 (UTC) == [[zayindar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 21:12, 14 hezîran 2025 (UTC) == [[akund]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 01:16, 16 hezîran 2025 (UTC) == [[destbikar]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:41, 22 hezîran 2025 (UTC) == [[vekitandin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:DarkAngel2100|DarkAngel2100]] ([[Gotûbêja bikarhêner:DarkAngel2100|gotûbêj]]) 10:45, 2 tîrmeh 2025 (UTC) Çavkanî: Kurdish-English Dictionary by Baran Rizgar == [[peşarmend]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:54, 5 tîrmeh 2025 (UTC) == [[zaîd]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:59, 6 tîrmeh 2025 (UTC) == [[Xrîst]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 07:13, 10 tîrmeh 2025 (UTC) == [[hesibanî kirin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 09:48, 13 tîrmeh 2025 (UTC) == [[top danîn]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:08, 13 tîrmeh 2025 (UTC) == [[çûkger]] == @[[Bikarhêner:Dûrzan|Dûrzan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:49, 18 tîrmeh 2025 (UTC) == [[dûneçkar]] == @[[Bikarhêner:212.175.166.246|212.175.166.246]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:38, 10 tebax 2025 (UTC) == [[sermirov]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 15:22, 13 tebax 2025 (UTC) == [[nifira Esed]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 16:00, 19 tebax 2025 (UTC) == [[dilkrîz]] == @[[Bikarhêner:Kurd87612|Kurd87612]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:44, 23 tebax 2025 (UTC) == [[berxa Xwedê]] == @[[Bikarhêner:Kurd87612|Kurd87612]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 14:28, 31 tebax 2025 (UTC) == [[destmatî]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 17:47, 21 îlon 2025 (UTC) == [[sîbaq]] == @[[Bikarhêner:Ferhengvan|Ferhengvan]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 20:33, 27 îlon 2025 (UTC) == [[mirovê daristanê]] == @[[Bikarhêner:Hewarwîkîferheng|Hewarwîkîferheng]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 08:09, 18 çiriya pêşîn 2025 (UTC) == [[çavbijîşk]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 18:30, 24 çiriya pêşîn 2025 (UTC) == [[makeşar]] == @[[Bikarhêner:Avestaboy|Avestaboy]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 06:46, 14 kanûna pêşîn 2025 (UTC) :Silav @[[Bikarhêner:Bikarhêner|Bikarhêner]] min bi derew peyv çê nekir. Peyva makeşar di sepana O-ferheng û her wiha di ferhenga online ferhengkurdi.org ya '''Enstîtuya Kurdî ya Stenbolê''' tê xwendin. :https://ferhengkurdi.org/tr/kelime/make%C5%9Far-n [[Bikarhêner:Avestaboy|Avestaboy]] ([[Gotûbêja bikarhêner:Avestaboy|gotûbêj]]) 11:07, 18 kanûna pêşîn 2025 (UTC) ::Krîterên me yên tevlîkirina kelîmeyan heye. Ev made rîayeta wan krîteran nake. Lewma min vê kelîmeyê li vir bicih kir. -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 23:28, 18 kanûna pêşîn 2025 (UTC) == [[bihîstinzanî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 18:30, 23 hezîran 2026 (UTC) == [[hevdilî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:28, 24 hezîran 2026 (UTC) == [[kemisandin]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:45, 24 hezîran 2026 (UTC) == [[kexme]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:53, 24 hezîran 2026 (UTC) == [[lêpirsyarker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:32, 24 hezîran 2026 (UTC) == [[raypirs]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:34, 24 hezîran 2026 (UTC) == [[helwestpirs]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:34, 24 hezîran 2026 (UTC) == [[kopirî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' xuyaye maneyeke wekî pir jî heye dikare were zêdekirin —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:33, 25 hezîran 2026 (UTC) == [[merxeme]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:55, 25 hezîran 2026 (UTC) == [[mohl]] == @[[Bikarhêner:Far ati|Far ati]] ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:14, 25 hezîran 2026 (UTC) == [[irfandarî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:30, 26 hezîran 2026 (UTC) == [[axulme]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 00:20, 30 hezîran 2026 (UTC) == [[şewane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:26, 1 tîrmeh 2026 (UTC) == [[poezî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:27, 1 tîrmeh 2026 (UTC) == [[sebaxker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:20, 1 tîrmeh 2026 (UTC) == [[sebaxfiroş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:21, 1 tîrmeh 2026 (UTC) == [[siboxfiroş]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:21, 1 tîrmeh 2026 (UTC) == [[diyardenasîtî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:26, 1 tîrmeh 2026 (UTC) == [[dawxane]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:41, 3 tîrmeh 2026 (UTC) == [[pêşajotî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:15, 3 tîrmeh 2026 (UTC) == [[kontînentaltirîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:35, 3 tîrmeh 2026 (UTC) == [[azmayîşker]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:16, 3 tîrmeh 2026 (UTC) == [[ateşparêz]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 05:19, 4 tîrmeh 2026 (UTC) == [[kurtetarîx]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:52, 4 tîrmeh 2026 (UTC) == [[besayetî]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:57, 4 tîrmeh 2026 (UTC) == [[tawbijêr]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:45, 4 tîrmeh 2026 (UTC) == [[destbir]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 11:30, 5 tîrmeh 2026 (UTC) == [[nekider]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:56, 5 tîrmeh 2026 (UTC) == [[niqar]] == —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:39, 5 tîrmeh 2026 (UTC) == [[parêzîn]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' Ev form li ti derê peyda nabe. Berî çendîn salan hatîye çêkirin. Bi qenaeta min şaş e, lewma em jê bibin. — [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 10:29, 6 tîrmeh 2026 (UTC) == [[stêrfizîk]] == . —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:33, 6 tîrmeh 2026 (UTC) == [[pêçavik]] == . Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:59, 7 tîrmeh 2026 (UTC) == [[qerqef]] == . Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:17, 7 tîrmeh 2026 (UTC) == [[rakar]] == . Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:30, 7 tîrmeh 2026 (UTC) == [[remilîn]] == . Eger ev kelîmeyeke mehelî be, Jkx şablona {{şx|dever|cihê ku lê tê bikaranîn}} li madeyê zêde bike. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:36, 7 tîrmeh 2026 (UTC) == [[segurî]] == . —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:51, 7 tîrmeh 2026 (UTC) == [[serdev]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:10, 7 tîrmeh 2026 (UTC) == [[serziman]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 17:01, 7 tîrmeh 2026 (UTC) == [[tenîsk]] == di Înternetê de gelek netîce derdikevin lê ji bo ku dûre ez kontrol bikim û çavkaniyên sehîh binivîsim li vir îlawe dikim. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:53, 7 tîrmeh 2026 (UTC) == [[tertî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:58, 7 tîrmeh 2026 (UTC) == [[tirut]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:25, 7 tîrmeh 2026 (UTC) == [[tizqa]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:28, 7 tîrmeh 2026 (UTC) == [[têkilîdêr]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:31, 7 tîrmeh 2026 (UTC) == [[tîtalk]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:33, 7 tîrmeh 2026 (UTC) == [[vircoq]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:45, 7 tîrmeh 2026 (UTC) == [[xilêbat]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]]. Li gorî kurteya çêkirina sayfeyê li Qamişlo û Amûdê tê bikaranîn. —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:14, 7 tîrmeh 2026 (UTC) == [[xin_û_cûc]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:27, 7 tîrmeh 2026 (UTC) == [[çiteba]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:38, 7 tîrmeh 2026 (UTC) == [[desttêl]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:45, 8 tîrmeh 2026 (UTC) == [[Mîmedol]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 08:51, 8 tîrmeh 2026 (UTC) == [[alaf]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 14:01, 8 tîrmeh 2026 (UTC) == [[aşirme]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 10:13, 10 tîrmeh 2026 (UTC) == [[geledîmentî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 13 tîrmeh 2026 (UTC) == [[çendîmentî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 20:54, 13 tîrmeh 2026 (UTC) == [[rojeng]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:41, 18 tîrmeh 2026 (UTC) == [[bereyîşk]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 15:47, 19 tîrmeh 2026 (UTC) == [[wesekname]] == ''[[Wîkîferheng:Pîvekên tevlîkirinê|Çavkanî hewce ye]].'' —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:08, 22 tîrmeh 2026 (UTC) == [[cemaetgeh]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:17, 24 tîrmeh 2026 (UTC) == [[iblîskanî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:27, 30 tîrmeh 2026 (UTC) == [[pehnik]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:51, 4 tebax 2026 (UTC) :# Kamiran bedirxan û H. Muhammed bi maneya guwerte bi kar tînin. :# Navê Çiyayek e li Hawarê derbas dibe :# Farqînî tenê dibêje "yassı" :#* [https://usercontent.one/wp/portal.arsivakurd.org/wp-content/uploads/2021/08/Azadiya-welat_67.pdf?media=1709107483 Azadiya welat hj 67] Roşan Lezgîn kevirên pehnik :# Ferhenga destî pahnik pehnik dibêje :# Rojen barnas li vir bi çi mana bi kar tîne? :#* {{jêder-kitêb|ku|jêgirtin=... '''pehnika''' dirandar tê kişandin û ji nû ve bi mîxên têlkî ve tê girêdan ku firk û sistî nekevê. Piştî ku dirûtina rû bi binpiyê hundirîn ve xelas bû vêca dora binpiyê derva (binî) tê. Binpiyê binî li ser yê hun- dirîn an bitenê bi...|sal=2013|nivîskar=Rojen Barnas, Nûbihar|url=http://books.google.com.tr/books?id=pVDKEAAAQBAJ&pg=PA67&dq=%22wan+pehnikan%22+OR+%22pehnik%C3%AA%22+OR+%22pehnikin%22+OR+%22pehnikek%C3%AA%22+OR+%22pehnika%22+OR+%22w%C3%AA+pehnik%C3%AA%22+OR+%22pehnikino%22+OR+%22pehnikine%22&hl=&cd=4&source=gbs_api|sernav=Sîlvan/ Silîvan / Farqîn|weşanxane=PAK AJANS YAYINCILIK TURİZM VE DIŞ TİCARET LİMİTED ŞİRKETİ|ISBN=9786055402884|rûpel=67}} :[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:40, 6 tebax 2026 (UTC) == [[temirîndox]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 21:56, 6 tebax 2026 (UTC) == [[kansêrolojî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 22:17, 6 tebax 2026 (UTC) == [[navçeparêzî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:09, 6 tebax 2026 (UTC) == [[goganîbûnî]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 23:23, 15 tebax 2026 (UTC) == [[zewijandin]] == Bêyî çavkaniyan e. --[[Bikarhêner:Şêr|Şêr]] ([[Gotûbêja bikarhêner:Şêr|gotûbêj]]) 18:34, 22 tebax 2026 (UTC) == [[karbes]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 12:42, 29 tebax 2026 (UTC) == [[biehliyet]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 16:41, 31 tebax 2026 (UTC) == [[pofêldang]] == Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 07:09, 10 îlon 2026 (UTC) == [[jenk]] == Ji xeynî Farqînî ti çavkanî nîne. Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:29, 19 îlon 2026 (UTC) 8n48hn2nso5aoxw97lxzt35anvxwcle Gotûbêja bikarhêner:Avestaboy 3 864603 6532785 4037770 2026-09-19T09:29:58Z Wikihez 7344 [[Bikarhêner:Wikihez/skrîpt/js/şablon-lêke.js|T]]: Agahdarkirin: [[jenk]] 6532785 wikitext text/x-wiki {{xêrhatin}} == Xêrhatin == Merheba bikarhênerê me yê hêja: ''Avestaboy'', Bi xêr hatî ferhenga kurdî-kurdî WÎKÎFERHENGê {{=)}} Em hêvîdar in ku tu jî di avakirina vê ferhengê de alîkariya me bikî. Eger pirsên te hebin, xêra xwe ji me re binivîse. Xebatxweş. :::::: -- [[Bikarhêner:Bikarhêner|Bikarhêner]] ([[Gotûbêja bikarhêner:Bikarhêner|gotûbêj]]) 05:37, 20 tebax 2020 (UTC) == [[jenk]] == Merheba @[[Bikarhêner:Avestaboy|Avestaboy]], di madeya [[jenk]] de 3 çavkanî hewce ne. Ji xeynî Farqînî ti çavkanî nîne. Bnr. [[Wîkîferheng:Pîvekên tevlîkirinê|Krîterên tevlîkirinê]] —[[Bikarhêner:Wikihez|Wikihez]] ([[Gotûbêja bikarhêner:Wikihez|gotûbêj]]) 09:29, 19 îlon 2026 (UTC) 5saz898t9fd7fnfothzo2yc4g6zb34k Nimînok:Ferhengok 102 874342 6532059 6348072 2026-09-18T17:38:32Z Wikihez 7344 add the etymology terms Modul:etymon links to: akronîm, belavbûn ji zimanekî din, deynkirina neadaptekirî/ortografîk, elîpsîz, înîtîalîzm, metatez, nomînalîzasyon, redûblîkasyon, translîterasyon, ûnîverbasyon 6532059 wikitext text/x-wiki Ferhengokeke terimên di Wîkîferhengê de tên bikaranîn. Ji bo lînkkirina vê rûpelê şablona {{ş|ferhengok}} bi kar bînin. <div style="float:left;">{{TOC}}</div> {{bend}} == A == ; {{lenger|akronîm}}[[akronîm]], ''[[:en:Appendix:Glossary#acronym|acronym]]'' : Kurtenavê ku ji herfên pêşîn ên çend kelîmeyan çêdibe û wek kelîmeyeke serbixwe tê xwendin. Nimûne ''NATO'', ''UNESCO''. Bide ber: [[#înîtîalîzm]] ; {{lenger|artîkel}}[[artîkel]]{{nobold|, [[veqetandek]], [[zêder]]}} ; {{lenger|analîza şiklî}}[[analîz]]a [[şikl]]î :Etîmolojiya termekê ye ku li ser temela parçeyên wê yên nasbar ên di şiklê nûjen ê ziman de cih digirin hatiye avakirin; bêyî ku guherîna deng li ber çavan bê girtin, yanî pêkhateya wê ya senkronîk: :: {{qertaf|en|earth|-en|nocat=1}} ji bo {{q|en|earthen}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|ang}}) :: {{qertaf|en|bio-|-logy|nocat=1}} ji bo {{q|en|biology}} (deyn ji Latîniya nû) :: {{qertaf|en|circle|-ar|nocat=1}} ji bo {{q|en|circular}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|fro}} û latîniya dereng), bi guherîna {{IPAchar|/əl/}} ber bi {{IPAchar|/jəl/}} :Analîzên şiklî behsê vê yekê dike ku mirovên ku tarîxa kelîmeyekê nizanin, li xuyanga kelîmeyê ya îro dinêrin û wê li gorî parçeyên ku nas dikin tehlîl û ava dikin. == B == ; {{lenger|baneşan}}[[baneşan]], [[#nîda]] ; {{lenger|belavbûn ji zimanekî din}}[[belavbûn]] ji zimanekî din, ''[[:en:Appendix:Glossary#contamination|contamination]]'' : Guherîna şikl an maneya kelîmeyekê di bin tesîra kelîmeyeke din de. Nimûne bi îngilîzî {{q|en|female}} ji fransiya kevn ''femelle'' e, lê şiklê wê di bin tesîra {{q|en|male}} de guheriye. ; {{lenger|binavkirî}}[[binavkirî]] : Bi-nav-kirî. Formeke navdêrê ye. '''Kevirê''' min. '''Sêva''' te. ; {{lenger|biwêj}}[[biwêj]], [[#tebîr]] ; {{lenger|bireser}}[[bireser]], [[#mefûl]] : Pêkhateya ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de bireser e. Bide ber: [[#kirde]] == C == ; {{lenger|cînav}}[[cînav]], [[#zemîr]] ; {{lenger|cotreh}}[[cot]][[reh]] :Kelîmeyên ku ji eynî rehî çêbûne lê belê bi riyên cuda ketine zimanekî. Bi {{navê zimanî|en}} ''[[:en:Appendix:Glossary#doublet|doublet]]''. Bide ber [[#hevreh]] == Ç == == D == ; {{lenger|daçek}}[[daçek]], [[#edat]] ; {{lenger|dariştî}}[[dariştin]], ''dariştî'' :Çêkirina kelîmeyan bi [[#pêşgir|pêşgir]], [[#navgir|navgir]] û [[#paşgir|paşgir]]an. ; {{lenger|deynkirina neadaptekirî}}[[deynkirin]]a neadaptekirî, ''[[:en:Appendix:Glossary#unadapted borrowing|unadapted borrowing]]'' : Kelîmeya deynkirî ya ku bi şiklê zimanê jê hatiye girtin dimîne û li rêzik û bilêvkirina zimanê wergirtî nayê adaptekirin. Nimûne {{q|ku|laptop}}. ; {{lenger|deynkirina ortografîk}}[[deynkirin]]a ortografîk, ''[[:en:Appendix:Glossary#orthographic borrowing|orthographic borrowing]]'' : Kelîmeya ku bi şiklê xwe yê nivîsandinê ji zimanekî din tê deynkirin, lê li gorî herfên wê tê xwendin, ne li gorî bilêvkirina zimanê ku jê hatiye girtin. ; {{lenger|dijmane}}[[dijmane]], [[#dijwate]] : Kelîmeyên ku maneyan wan zidî hev in yanî %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijmaneyên hev in. ; {{lenger|dijwate}}[[dijwate]], [[#dijmane]] : Kelîmeyên ku maneyan wan %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijwateyên hev in. == E == ; {{lenger|edat}}[[edat]], [[#daçek]] ; {{lenger|elîpsîz}}[[elîpsîz]], ''[[:en:Appendix:Glossary#ellipsis|ellipsis]]'' : Avêtina kelîmeyekê ji tebîrekê, ku mana tebîra temam li kelîmeya mayî bar dibe. Nimûne {{q|en|private}} ji ''private soldier''. ; {{lenger|emilandinên_xelet}}[[emilandina]] [[xelet]], '''emilandinên xelet''' Kelîmeyên ku ji aliyê çavkaniyên preskrîptîv ve xelet tên qebûlkirin û dibêjin divê neyên emilandin. Bide ber {{navê zimanî|en}} ''[[:en:Appendix:Glossary#proscribed|proscribed]]''. == Ê == == F == ; {{lenger|fail}}[[fail]], [[#kirde]] : Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de fail e. Bide ber: [[#mefûl]] ; {{lenger|fiîl}}[[fiîl]], [[#lêker]] : Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" fiîl e ji ber ku karê xwarinê îfade dike. == G == ; {{lenger|girêdek}}[[girêdek]] ; {{lenger|gerguhêz}}{{lenger|gh}}[[gerguhêz]], ''gh'' : [[#Fiîl|Fiîl]]a ku [[#mefûl|mefûlê]] werdigire. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" gerguhêz e ji ber ku dikare bi "sêv" were bikaranîn. == H == ; {{lenger|hevmane}}[[hevmane]], [[#hevwate]] : Kelîmeyên ku maneya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}} ; {{lenger|hevdeng}}[[hevdeng]] : Kelîmeyên ku wekî kelîmeyeke din tên bilêvkirin lê nivîsîn, mane an jî rehê wan ji hev cuda ne. ; {{lenger|hevreh}}[[hevreh]] :Kelîmeyên ku ji heman kelîmeyê çêbûne. ; {{lenger|hevwate}}[[hevwate]], [[#hevmane]] : Kelîmeyên ku wateya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}} ; {{lenger|hoker}}[[hoker]], [[#zerf]] == I == == Î == ; {{lenger|înîtîalîzm}}[[înîtîalîzm]], ''[[:en:Appendix:Glossary#initialism|initialism]]'' : Kurtenavê ku herfên wê yek bi yek tên xwendin. Nimûne ''BBC''. Bide ber: [[#akronîm]] == J == == K == ; {{lenger|kirde}}[[kirde]], [[#fail]] : Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de kirde ye. Bide ber: [[#bireser]] ; {{lenger|keysa herfê}} [[keys]]a [[herf]]ê : Halê [[hûrdek]] an [[girdek]] ya peyvê. == L == ; {{lenger|lêker}}[[lêker]], [[#fiîl]] : Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" lêker e ji ber ku karê xwarinê îfade dike. == M == ; {{lenger|mefûl}}[[mefûl]], [[#bireser]] : Unsira ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de mefûl e. Bide ber: [[#fail|fail]] ; {{lenger|metatez}}[[metatez]], ''[[:en:Appendix:Glossary#metathesis|metathesis]]'' : Guherîna cihê dengên nav kelîmeyekê. Nimûne di kurmancî de ''berf'' û ''befr''. ; {{lenger|mê}}{{lenger|m}}[[mê]], ''m'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî mê ditewe. Herwiha bnr. [[#mn|mn]], [[#nêr|nêr]]. ; {{lenger|mê û nêr}}{{lenger|mn}}mê û nêr, ''mn'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî hem mê hem nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#nêr|nêr]]. == N == ; {{lenger|navdêr}}[[navdêr]] : Navên tişt (''sêv, heywan, qedeh'') yan mefhûman (''dilşadî, bextiyarî'' hwd.) di rêzimanê de. ; {{lenger|navgir}}[[navgir]] ; {{lenger|navmiletî}}[[navmiletî]] : Kelîmeyeke deynkirî ya ku di çend zimanan de bi mane û etîmolojiyeke eynî an jî nêzîkî hev derbas dibe, bi gelemperî ji ber peydabûna çend deynkirinên hevdem û/an zincîreyeke deynkirinên li pey hev ku zû diqewimin çêdibin. Di netîceyê de dibe ku peydakirina eslê rast a etîmolojîk a terimekê zimanekî zor an ne mimkûn be. Wek nimûne doktor, otêl, înternet, taksî, an televîzyon. ; {{lenger|nebinavkirî}}[[nebinavkirî]] ; {{lenger|negerguhêz}}{{lenger|ngh}}[[negerguhêz]], ''ngh'' : [[#lêker|Lêker]]a ku [[#bireser|bireserê]] wernagire. Nimûne: "Ez diçim mektebê" li vir çûn negerguhêz e. ; {{lenger|neqiyasbar}}[[neqiyasbar]] : [[#rengdêr|Rengdêrên]] ku formên wan yên bi ''-tir'', ''-tirîn'' an ''herî'' tune. ; {{lenger|n}}{{lenger|nêr}}[[nêr]], ''n'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#mn|mn]]. ; {{lenger|nêtar}}{{lenger|nt}}[[nêtar]], ''nt'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan ne [[#nêr|nêr]] û ne jî [[#mê|mê]] ye. ; {{lenger|nêzîkî}}[[nêzîkî]] ~ : Îşareta ~ (tîlde), wextê tê pêşiya salekê, tê maneyê ku ev sal tam ne belî ye. ; {{lenger|nîda}}[[nîda]] [[#baneşan|baneşan]] ; {{lenger|nomînalîzasyon}}[[nomînalîzasyon]], ''[[:en:Appendix:Glossary#nominalization|nominalization]]'' : Çêkirina îsmekê ji kelîmeyeke cureyeke din, bi taybetî ji fiîlekê an sifetekê. Nimûne ''[[xwendin]]'' ku hem fiîl e hem îsm. == O == == P == ; {{lenger|paşgir}}[[paşgir]] ; {{lenger|paşvesazî}}[[paşvesazî]] : Çêkirina peyvên nû bi kurtkirina peyvên heyî. Nimûne ''[[ajo]]'' ji ''[[ajotin]]''. ; {{lenger|pêk}}{{lenger|pêkhatî}}[[pêkhatî]], ''pêk'' : Çêkirina peyvên nû bi lihevanîna du an zêdetir peyvan. ; {{lenger|pêşgir}}[[pêşgir]] ; {{lenger|pirjimar}}[[pirjimar]] ; {{lenger|pirtik}}[[pirtik]] ; {{lenger|purîzm}}[[purîzm]] : Kelîmeyên ku bi armanca [[:w:purîzma zimanî|purîzma zimanî]] ji bo terikandina kelîmeyên qedîm û yên deynkirî tên bikaranîn. == Q == ; {{lenger|qusandin}}[[qusandin]] : Kurtkirina peyvekê bi avêtina çend herfan e û maneya peyvê naguherîne. Nimûne ''[[Miho]]'' ji ''[[Mihemmed]]''. == R == ; {{lenger|redûblîkasyon}}[[redûblîkasyon]], ''[[:en:Appendix:Glossary#reduplication|reduplication]]'' : Çêkirina kelîmeyekê bi dubarekirina kelîmeyekê an parçeyekî wê. Nimûne ''hêdî hêdî''. ; {{lenger|rengdêr}}[[rengdêr]] == S == ; {{lenger|serenav}}[[serenav]] : Cureyekî navdêran e ku îşaretê peyvên yekane mîna ''[[Iqlîdes]]'', ''[[Mihemed]]'' dike. Serenav di kurmancî de bi herfên [[girek]] tên nivîsîn. ; {{lenger|sic}}[[sic]] : Hokereke latînî ku tê maneya "lewma". Bi edetê di nav {{kod|<nowiki>[</nowiki>}} de tê nivîsin û mirov dixwaze bibêje ku ew peyv ne xeletiya kesa ku nivîsekê kopî dike ye, nivîs ji orîjînalê bêyî guhartinê hatiye wergirtin. ; {{lenger|sormancî}}[[sormancî]] : Tevlihevkirina soranî û kurmancî di zimanê nivîskî de, xisusen bikaranîna kelîmeyên soranî di kurmancî de yan jî yên kurmancî di soranî de ku xelkê kurmancîziman û soranîziman nizanin. == Ş == == T == ; {{lenger|tebîr}}[[tebîr]], [[#biwêj|biwêj]] ; {{lenger|tewandin}}[[tewandin]] ; {{lenger|tewîn}}[[tewîn]] ; {{lenger|têkilkirin}}[[têkilkirin]] : Çêkirina peyvekê bi riya tevlîkirina du peyvan. Nimûne ''[[tirkmancî]]'' ji ''[[tirkî]] + [[kurmancî]]''. ; {{lenger|translîterasyon}}[[translîterasyon]], ''[[:en:Appendix:Glossary#transliteration|transliteration]]'' : Veguhastina kelîmeyekê ji alfabeyekê bo alfabeyeke din, herf bi herf. Nimûne {{q|fa|خانه}} → ''xane''. == U == == Û == ; {{lenger|ûnîverbasyon}}[[ûnîverbasyon]], ''[[:en:Appendix:Glossary#univerbation|univerbation]]'' : Çêbûna çend kelîmeyên ku pir caran li pey hev tên wek kelîmeyeke yekane. Nimûne ''[[îro]]'' ji ''ev ro'', ''[[îsal]]'' ji ''ev sal''. == V == == W == ; {{lenger|wergirtin}}[[Wîkîferheng:Etîmolojî#Wergirtina wateyê|wergirtina wateyê]], ''wergirtin'' : Berfirehtirkirina wateya peyveke heyî bi riya wergerandina ji zimanekî din. == X == ; {{lenger|xweşbêjî}}[[xweşbêjî]] an {{mj|[[edeb]]î [[kelam]]}} : Peyv û derbirînên li şûna peyveke din ji bo veşartina maneya nexweş an bişerm tên bikaranîn. == Y == ; {{lenger|yekser}}[[wergerandina yekser]], ''yekser'' :Çêkirina peyveke nû bi riya wergerandina ji zimanekî din. == Z == ; {{lenger|zayend}}[[zayend]] : Awayekî sinifandina [[#navdêr|navdêran]] di zimanê kurdî û hin zimanên din de ye. Sê cure zayend ''[[#mê|mê]], [[#nêr|nêr]] û [[#mê û nêr|mê û nêr]]'' di zimanê kurdî de hene. Zayenda [[#nêtar|nêtar]] di hin zimanên din hene lê di kurdî de tune. ; {{lenger|zemîr}}[[zemîr]], [[#cînav|cînav]] ; {{lenger|zerf}}[[zerf]], [[#hoker]] 1p3c7qo6uca7p86db7pijyxytpp1udv 6532060 6532059 2026-09-18T17:39:07Z Wikihez 7344 blank line before the next heading 6532060 wikitext text/x-wiki Ferhengokeke terimên di Wîkîferhengê de tên bikaranîn. Ji bo lînkkirina vê rûpelê şablona {{ş|ferhengok}} bi kar bînin. <div style="float:left;">{{TOC}}</div> {{bend}} == A == ; {{lenger|akronîm}}[[akronîm]], ''[[:en:Appendix:Glossary#acronym|acronym]]'' : Kurtenavê ku ji herfên pêşîn ên çend kelîmeyan çêdibe û wek kelîmeyeke serbixwe tê xwendin. Nimûne ''NATO'', ''UNESCO''. Bide ber: [[#înîtîalîzm]] ; {{lenger|artîkel}}[[artîkel]]{{nobold|, [[veqetandek]], [[zêder]]}} ; {{lenger|analîza şiklî}}[[analîz]]a [[şikl]]î :Etîmolojiya termekê ye ku li ser temela parçeyên wê yên nasbar ên di şiklê nûjen ê ziman de cih digirin hatiye avakirin; bêyî ku guherîna deng li ber çavan bê girtin, yanî pêkhateya wê ya senkronîk: :: {{qertaf|en|earth|-en|nocat=1}} ji bo {{q|en|earthen}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|ang}}) :: {{qertaf|en|bio-|-logy|nocat=1}} ji bo {{q|en|biology}} (deyn ji Latîniya nû) :: {{qertaf|en|circle|-ar|nocat=1}} ji bo {{q|en|circular}} (mîrasmayî ji {{navê zimanî|enm}} ji {{navê zimanî|fro}} û latîniya dereng), bi guherîna {{IPAchar|/əl/}} ber bi {{IPAchar|/jəl/}} :Analîzên şiklî behsê vê yekê dike ku mirovên ku tarîxa kelîmeyekê nizanin, li xuyanga kelîmeyê ya îro dinêrin û wê li gorî parçeyên ku nas dikin tehlîl û ava dikin. == B == ; {{lenger|baneşan}}[[baneşan]], [[#nîda]] ; {{lenger|belavbûn ji zimanekî din}}[[belavbûn]] ji zimanekî din, ''[[:en:Appendix:Glossary#contamination|contamination]]'' : Guherîna şikl an maneya kelîmeyekê di bin tesîra kelîmeyeke din de. Nimûne bi îngilîzî {{q|en|female}} ji fransiya kevn ''femelle'' e, lê şiklê wê di bin tesîra {{q|en|male}} de guheriye. ; {{lenger|binavkirî}}[[binavkirî]] : Bi-nav-kirî. Formeke navdêrê ye. '''Kevirê''' min. '''Sêva''' te. ; {{lenger|biwêj}}[[biwêj]], [[#tebîr]] ; {{lenger|bireser}}[[bireser]], [[#mefûl]] : Pêkhateya ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de bireser e. Bide ber: [[#kirde]] == C == ; {{lenger|cînav}}[[cînav]], [[#zemîr]] ; {{lenger|cotreh}}[[cot]][[reh]] :Kelîmeyên ku ji eynî rehî çêbûne lê belê bi riyên cuda ketine zimanekî. Bi {{navê zimanî|en}} ''[[:en:Appendix:Glossary#doublet|doublet]]''. Bide ber [[#hevreh]] == Ç == == D == ; {{lenger|daçek}}[[daçek]], [[#edat]] ; {{lenger|dariştî}}[[dariştin]], ''dariştî'' :Çêkirina kelîmeyan bi [[#pêşgir|pêşgir]], [[#navgir|navgir]] û [[#paşgir|paşgir]]an. ; {{lenger|deynkirina neadaptekirî}}[[deynkirin]]a neadaptekirî, ''[[:en:Appendix:Glossary#unadapted borrowing|unadapted borrowing]]'' : Kelîmeya deynkirî ya ku bi şiklê zimanê jê hatiye girtin dimîne û li rêzik û bilêvkirina zimanê wergirtî nayê adaptekirin. Nimûne {{q|ku|laptop}}. ; {{lenger|deynkirina ortografîk}}[[deynkirin]]a ortografîk, ''[[:en:Appendix:Glossary#orthographic borrowing|orthographic borrowing]]'' : Kelîmeya ku bi şiklê xwe yê nivîsandinê ji zimanekî din tê deynkirin, lê li gorî herfên wê tê xwendin, ne li gorî bilêvkirina zimanê ku jê hatiye girtin. ; {{lenger|dijmane}}[[dijmane]], [[#dijwate]] : Kelîmeyên ku maneyan wan zidî hev in yanî %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijmaneyên hev in. ; {{lenger|dijwate}}[[dijwate]], [[#dijmane]] : Kelîmeyên ku maneyan wan %100 cuda ye. Nimûne [[mezin]] û [[biçûk]] dijwateyên hev in. == E == ; {{lenger|edat}}[[edat]], [[#daçek]] ; {{lenger|elîpsîz}}[[elîpsîz]], ''[[:en:Appendix:Glossary#ellipsis|ellipsis]]'' : Avêtina kelîmeyekê ji tebîrekê, ku mana tebîra temam li kelîmeya mayî bar dibe. Nimûne {{q|en|private}} ji ''private soldier''. ; {{lenger|emilandinên_xelet}}[[emilandina]] [[xelet]], '''emilandinên xelet''' Kelîmeyên ku ji aliyê çavkaniyên preskrîptîv ve xelet tên qebûlkirin û dibêjin divê neyên emilandin. Bide ber {{navê zimanî|en}} ''[[:en:Appendix:Glossary#proscribed|proscribed]]''. == Ê == == F == ; {{lenger|fail}}[[fail]], [[#kirde]] : Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de fail e. Bide ber: [[#mefûl]] ; {{lenger|fiîl}}[[fiîl]], [[#lêker]] : Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" fiîl e ji ber ku karê xwarinê îfade dike. == G == ; {{lenger|girêdek}}[[girêdek]] ; {{lenger|gerguhêz}}{{lenger|gh}}[[gerguhêz]], ''gh'' : [[#Fiîl|Fiîl]]a ku [[#mefûl|mefûlê]] werdigire. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" gerguhêz e ji ber ku dikare bi "sêv" were bikaranîn. == H == ; {{lenger|hevmane}}[[hevmane]], [[#hevwate]] : Kelîmeyên ku maneya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}} ; {{lenger|hevdeng}}[[hevdeng]] : Kelîmeyên ku wekî kelîmeyeke din tên bilêvkirin lê nivîsîn, mane an jî rehê wan ji hev cuda ne. ; {{lenger|hevreh}}[[hevreh]] :Kelîmeyên ku ji heman kelîmeyê çêbûne. ; {{lenger|hevwate}}[[hevwate]], [[#hevmane]] : Kelîmeyên ku wateya wan eynî ne. Nimûne {{q|ku|ciwan}} û {{q|ku|xweşik}} ; {{lenger|hoker}}[[hoker]], [[#zerf]] == I == == Î == ; {{lenger|înîtîalîzm}}[[înîtîalîzm]], ''[[:en:Appendix:Glossary#initialism|initialism]]'' : Kurtenavê ku herfên wê yek bi yek tên xwendin. Nimûne ''BBC''. Bide ber: [[#akronîm]] == J == == K == ; {{lenger|kirde}}[[kirde]], [[#fail]] : Unsira ku di cimleyekê de karî dike. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''Xecê'' di vê cimleyê de kirde ye. Bide ber: [[#bireser]] ; {{lenger|keysa herfê}} [[keys]]a [[herf]]ê : Halê [[hûrdek]] an [[girdek]] ya peyvê. == L == ; {{lenger|lêker}}[[lêker]], [[#fiîl]] : Kelîmeyên ku nîşanê kirinê an bûyînê dikin. Nimûne: ''Min sêv xwar.'' Li vir "xwarin" lêker e ji ber ku karê xwarinê îfade dike. == M == ; {{lenger|mefûl}}[[mefûl]], [[#bireser]] : Unsira ku kar lê tê kirin. Nimûne ''Xecê sêv xwar.'' Kelîmeya ''sêv'' di vê cimleyê de mefûl e. Bide ber: [[#fail|fail]] ; {{lenger|metatez}}[[metatez]], ''[[:en:Appendix:Glossary#metathesis|metathesis]]'' : Guherîna cihê dengên nav kelîmeyekê. Nimûne di kurmancî de ''berf'' û ''befr''. ; {{lenger|mê}}{{lenger|m}}[[mê]], ''m'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî mê ditewe. Herwiha bnr. [[#mn|mn]], [[#nêr|nêr]]. ; {{lenger|mê û nêr}}{{lenger|mn}}mê û nêr, ''mn'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî hem mê hem nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#nêr|nêr]]. == N == ; {{lenger|navdêr}}[[navdêr]] : Navên tişt (''sêv, heywan, qedeh'') yan mefhûman (''dilşadî, bextiyarî'' hwd.) di rêzimanê de. ; {{lenger|navgir}}[[navgir]] ; {{lenger|navmiletî}}[[navmiletî]] : Kelîmeyeke deynkirî ya ku di çend zimanan de bi mane û etîmolojiyeke eynî an jî nêzîkî hev derbas dibe, bi gelemperî ji ber peydabûna çend deynkirinên hevdem û/an zincîreyeke deynkirinên li pey hev ku zû diqewimin çêdibin. Di netîceyê de dibe ku peydakirina eslê rast a etîmolojîk a terimekê zimanekî zor an ne mimkûn be. Wek nimûne doktor, otêl, înternet, taksî, an televîzyon. ; {{lenger|nebinavkirî}}[[nebinavkirî]] ; {{lenger|negerguhêz}}{{lenger|ngh}}[[negerguhêz]], ''ngh'' : [[#lêker|Lêker]]a ku [[#bireser|bireserê]] wernagire. Nimûne: "Ez diçim mektebê" li vir çûn negerguhêz e. ; {{lenger|neqiyasbar}}[[neqiyasbar]] : [[#rengdêr|Rengdêrên]] ku formên wan yên bi ''-tir'', ''-tirîn'' an ''herî'' tune. ; {{lenger|n}}{{lenger|nêr}}[[nêr]], ''n'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan li gorî nêr ditewe. Herwiha bnr. [[#mê|mê]], [[#mn|mn]]. ; {{lenger|nêtar}}{{lenger|nt}}[[nêtar]], ''nt'' : [[#navdêr|Navdêrên]] ku [[#zayend|zayenda]] wan ne [[#nêr|nêr]] û ne jî [[#mê|mê]] ye. ; {{lenger|nêzîkî}}[[nêzîkî]] ~ : Îşareta ~ (tîlde), wextê tê pêşiya salekê, tê maneyê ku ev sal tam ne belî ye. ; {{lenger|nîda}}[[nîda]] [[#baneşan|baneşan]] ; {{lenger|nomînalîzasyon}}[[nomînalîzasyon]], ''[[:en:Appendix:Glossary#nominalization|nominalization]]'' : Çêkirina îsmekê ji kelîmeyeke cureyeke din, bi taybetî ji fiîlekê an sifetekê. Nimûne ''[[xwendin]]'' ku hem fiîl e hem îsm. == O == == P == ; {{lenger|paşgir}}[[paşgir]] ; {{lenger|paşvesazî}}[[paşvesazî]] : Çêkirina peyvên nû bi kurtkirina peyvên heyî. Nimûne ''[[ajo]]'' ji ''[[ajotin]]''. ; {{lenger|pêk}}{{lenger|pêkhatî}}[[pêkhatî]], ''pêk'' : Çêkirina peyvên nû bi lihevanîna du an zêdetir peyvan. ; {{lenger|pêşgir}}[[pêşgir]] ; {{lenger|pirjimar}}[[pirjimar]] ; {{lenger|pirtik}}[[pirtik]] ; {{lenger|purîzm}}[[purîzm]] : Kelîmeyên ku bi armanca [[:w:purîzma zimanî|purîzma zimanî]] ji bo terikandina kelîmeyên qedîm û yên deynkirî tên bikaranîn. == Q == ; {{lenger|qusandin}}[[qusandin]] : Kurtkirina peyvekê bi avêtina çend herfan e û maneya peyvê naguherîne. Nimûne ''[[Miho]]'' ji ''[[Mihemmed]]''. == R == ; {{lenger|redûblîkasyon}}[[redûblîkasyon]], ''[[:en:Appendix:Glossary#reduplication|reduplication]]'' : Çêkirina kelîmeyekê bi dubarekirina kelîmeyekê an parçeyekî wê. Nimûne ''hêdî hêdî''. ; {{lenger|rengdêr}}[[rengdêr]] == S == ; {{lenger|serenav}}[[serenav]] : Cureyekî navdêran e ku îşaretê peyvên yekane mîna ''[[Iqlîdes]]'', ''[[Mihemed]]'' dike. Serenav di kurmancî de bi herfên [[girek]] tên nivîsîn. ; {{lenger|sic}}[[sic]] : Hokereke latînî ku tê maneya "lewma". Bi edetê di nav {{kod|<nowiki>[</nowiki>}} de tê nivîsin û mirov dixwaze bibêje ku ew peyv ne xeletiya kesa ku nivîsekê kopî dike ye, nivîs ji orîjînalê bêyî guhartinê hatiye wergirtin. ; {{lenger|sormancî}}[[sormancî]] : Tevlihevkirina soranî û kurmancî di zimanê nivîskî de, xisusen bikaranîna kelîmeyên soranî di kurmancî de yan jî yên kurmancî di soranî de ku xelkê kurmancîziman û soranîziman nizanin. == Ş == == T == ; {{lenger|tebîr}}[[tebîr]], [[#biwêj|biwêj]] ; {{lenger|tewandin}}[[tewandin]] ; {{lenger|tewîn}}[[tewîn]] ; {{lenger|têkilkirin}}[[têkilkirin]] : Çêkirina peyvekê bi riya tevlîkirina du peyvan. Nimûne ''[[tirkmancî]]'' ji ''[[tirkî]] + [[kurmancî]]''. ; {{lenger|translîterasyon}}[[translîterasyon]], ''[[:en:Appendix:Glossary#transliteration|transliteration]]'' : Veguhastina kelîmeyekê ji alfabeyekê bo alfabeyeke din, herf bi herf. Nimûne {{q|fa|خانه}} → ''xane''. == U == == Û == ; {{lenger|ûnîverbasyon}}[[ûnîverbasyon]], ''[[:en:Appendix:Glossary#univerbation|univerbation]]'' : Çêbûna çend kelîmeyên ku pir caran li pey hev tên wek kelîmeyeke yekane. Nimûne ''[[îro]]'' ji ''ev ro'', ''[[îsal]]'' ji ''ev sal''. == V == == W == ; {{lenger|wergirtin}}[[Wîkîferheng:Etîmolojî#Wergirtina wateyê|wergirtina wateyê]], ''wergirtin'' : Berfirehtirkirina wateya peyveke heyî bi riya wergerandina ji zimanekî din. == X == ; {{lenger|xweşbêjî}}[[xweşbêjî]] an {{mj|[[edeb]]î [[kelam]]}} : Peyv û derbirînên li şûna peyveke din ji bo veşartina maneya nexweş an bişerm tên bikaranîn. == Y == ; {{lenger|yekser}}[[wergerandina yekser]], ''yekser'' :Çêkirina peyveke nû bi riya wergerandina ji zimanekî din. == Z == ; {{lenger|zayend}}[[zayend]] : Awayekî sinifandina [[#navdêr|navdêran]] di zimanê kurdî û hin zimanên din de ye. Sê cure zayend ''[[#mê|mê]], [[#nêr|nêr]] û [[#mê û nêr|mê û nêr]]'' di zimanê kurdî de hene. Zayenda [[#nêtar|nêtar]] di hin zimanên din hene lê di kurdî de tune. ; {{lenger|zemîr}}[[zemîr]], [[#cînav|cînav]] ; {{lenger|zerf}}[[zerf]], [[#hoker]] gz3pge6vxcui1x4o3cw43a8lzo70y43 Tickle 0 905187 6532653 6509413 2026-09-19T09:08:29Z Wikihez 7344 6532653 wikitext text/x-wiki == {{ziman|en}} == === Serenav === {{serenav|en}} # {{paşnav|en}} ==== Anagram ==== * {{anagram|en|a=ceiklt|Keltic}} st2vwptu25a6m2zgat4upqmlzukrap8 Modul:parameters/data 828 1324875 6532083 6531698 2026-09-18T19:07:55Z Wikihez 7344 Kurdish names for the parameters (tarîxa-etîm, niqtena, niqte, katna/nekat, darna) and for the modifiers (hrf, crztip, grdk, anlz, metn) 6532083 Scribunto text/plain local list_to_set = require("Module:table").listToSet local function process_set_param(param) param.set = list_to_set(param.set) param.converted_set = true return param end local boolean = {type = "boolean"} local empty_list = {} local list = {list = true} local list_allow_holes_separate_no_index = {list = true, allow_holes = true, separate_no_index = true} local required = {required = true} local required_default_ = {required = true, default = ""} local required_lang_default_und = {required = true, type = "language", default = "und"} local m = {} -- [[Module:anchors]] m["anchor"] = { [1] = {required = true, list = true, disallow_holes = true}, } m["senseid"] = { [1] = required_lang_default_und, [2] = required_default_, tag = process_set_param{set = {"li", "p"}, default = "li"}, } m["etymid"] = { [1] = required_lang_default_und, [2] = required_default_ } -- [[Module:etymon]] m["etymon"] = { [1] = required_lang_default_und, [2] = {list = true, disallow_holes = true}, id = true, title = true, tree = boolean, text = true, -- Kurdish names for the same two parameters. dar = {alias_of = "tree"}, metn = {alias_of = "text"}, exnihilo = boolean, etydate = true, doublet = {sublist = "comma without whitespace"}, -- Kurdish name for the same parameter, cf. Şablon:cotreh. cotreh = {alias_of = "doublet"}, rfe = true, etystub = true, nl = boolean, pos = true, -- Kurdish name for the same parameter; Modul:etymon maps its Kurdish values (reh, kelîme, ...). crz = {alias_of = "pos"}, notree = {default = false, type = "boolean"}, nocat = {default = false, type = "boolean"}, nodot = {default = false, type = "boolean"}, dot = true, -- Kurdish names for the same parameters. ["tarîxa-etîm"] = {alias_of = "etydate"}, darna = {alias_of = "notree"}, katna = {alias_of = "nocat"}, nekat = {alias_of = "nocat"}, niqtena = {alias_of = "nodot"}, niqte = {alias_of = "dot"}, json = {default = false, type = "boolean"}, } -- [[Module:translations]] m["translation"] = { [1] = required_lang_default_und, [2] = true, [3] = list, ["alt"] = true, ["id"] = true, ["sc"] = {type = "script"}, ["tr"] = true, ["ts"] = true, ["lit"] = true, } m["t-needed"] = { [1] = required_lang_default_und, [2] = process_set_param{set = {"usex", "quote"}}, ["nocat"] = boolean, ["sort"] = true, } m["trans-top"] = { [1] = true, ["id"] = true, ["column-width"] = true, } m["trans-top-also"] = { [1] = required, [2] = list, ["id"] = list_allow_holes_separate_no_index, ["column-width"] = true, } m["checktrans-top"] = { [1] = true, ["column-width"] = true, } m["trans-bottom"] = empty_list m["trans-see"] = { [1] = required, [2] = list, ["id"] = list_allow_holes_separate_no_index, } m["translation subpage"] = empty_list m["no equivalent translation"] = { [1] = required_lang_default_und, ["noend"] = boolean, } m["no attested translation"] = { [1] = required_lang_default_und, ["noend"] = boolean, ["sort"] = true, } m["not used"] = { [1] = required_lang_default_und, [2] = true, } return m 338lyfowsqvo2n7ky43h9frxqyo5oz6 Modul:etymon 828 1326097 6532061 6531695 2026-09-18T17:44:04Z Wikihez 7344 language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne 6532061 Scribunto text/plain --[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Authors: - Original implementation: [[User:Ioaxxere]] - Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]]) Modules: - [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping - [[Module:etymon/data]]: keyword definitions, configuration, and status constants - [[Module:etymon/tree]]: etymology tree rendering - [[Module:etymon/text]]: etymology text generation - [[Module:etymon/categories]]: category generation logic - [[Module:etymon/tracking]]: tracking ]=] local export = {} local __state = { cached_etymon_args = {}, cached_etymon_pages = {}, cached_descendants_checks = {}, senseid_parent_etymon = {}, available_etymon_ids = {}, single_etymons = {}, entry_title = nil, entry_lang_code = nil, current_page_has_inline_etymology = false, current_page_has_redundant_etymology = false, used_idless_etymon = false, toplevel_has_inline_etymology = false, toplevel_redundant_etymology = false, toplevel_idless_etymon = false, has_mismatched_id = false, linked_page_multiple_etymons_idless = false, linked_page_partial_etymology_sections = false, partial_etymology_targets = {}, skip_partial_etymology_category = false, max_depth_reached = 0, total_nodes = 0, language_count = {}, toplevel_keyword_stats = {}, id_stats = nil, warnings = {}, } local function reset_invocation_state() __state.current_page_has_inline_etymology = false __state.current_page_has_redundant_etymology = false __state.used_idless_etymon = false __state.toplevel_has_inline_etymology = false __state.toplevel_redundant_etymology = false __state.toplevel_idless_etymon = false __state.has_mismatched_id = false __state.linked_page_multiple_etymons_idless = false __state.linked_page_partial_etymology_sections = false __state.max_depth_reached = 0 __state.total_nodes = 0 __state.language_count = {} __state.toplevel_keyword_stats = {} __state.warnings = {} end local M = require("Module:module loader").init({ require = { data = "Module:etymon/data", tree = "Module:etymon/tree", text = "Module:etymon/text", categories = "Module:etymon/categories", tracking = "Module:etymon/tracking", descendants = "Module:etymon/descendants", anchors = "Module:anchors", etydate = "Module:etydate", etymology = "Module:etymology", families = "Module:families", languages = "Module:languages", languages_errorgetby = "Module:languages/errorGetBy", links = "Module:links", pages = "Module:pages", parameters = "Module:parameters", string_utilities = "Module:string utilities", template_parser = "Module:template parser", utilities = "Module:utilities", debug = "Module:debug", en_utilities = "Module:en-utilities", parse_utilities = "Module:parse utilities", references = "Module:references", template_styles = "Module:TemplateStyles", script_utilities = "Module:script utilities", JSON = "Module:JSON", yesno = "Module:yesno", }, loadData = { headword_data = "Module:headword/data", parameters_data = "Module:parameters/data", text_allowed = "Module:etymon/data/text_allowed", }, }) -- Template names that carry etymon data, and the heading that opens an etymology section. -- Pages are scraped for these, so both must match what ku.wiktionary actually uses: -- the section is "Etîmolojî", and the new template is "etîmon". -- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which -- this module would misparse into garbage node labels. Add "etymon" here only once -- Şablon:etymon itself invokes this module. local ETYMON_TEMPLATES = { ["etîmon"] = true, ["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out -- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax: -- this module would read those calls and parse the bare keyword ("inh") as a term. } local ETYMOLOGY_HEADING = "^Etîmolojî" -- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses -- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the -- leading "*" that Modul:links requires for reconstructed languages. local RECONSTRUCTION_NS_NAME = "Jinûvesazî" local RECONSTRUCTION_NS_ID = 108 local Util = {} function Util.format_error(message, preview_only) if preview_only and not M.pages.is_preview() then return nil end return '<span class="error">' .. message .. '</span>' end function Util.add_warning(message, preview_only) local formatted = Util.format_error(message, preview_only) if formatted then table.insert(__state.warnings, formatted) end end function Util.is_text_param_allowed_for_lang(lang) if not lang or type(lang) ~= "table" then return false end local types = lang.getTypes and lang:getTypes() if types and types.family then local code = lang.getCode and lang:getCode() return code and M.text_allowed.families[code] == true end local full_code = lang.getFullCode and lang:getFullCode() if full_code and M.text_allowed.langs[full_code] then return true end if lang.inFamily then for family_code in pairs(M.text_allowed.families) do if lang:inFamily(family_code) then return true end end end return false end function Util.get_lang(code, no_error) if no_error then return M.languages.getByCode(code, nil, true) end return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true) end -- Match a term language against a text=:lang stop target (supports etymology-only codes). function Util.lang_matches_stop_code(term_lang, stop_code) if not term_lang or not stop_code or stop_code == "" then return false end local stop_lang = Util.get_lang(stop_code, true) if not stop_lang then return false end if term_lang:getCode() == stop_lang:getCode() then return true end if stop_lang:getFullCode() == stop_lang:getCode() then return term_lang:getFullCode() == stop_lang:getCode() end return false end function Util.get_family(code) return M.families.getByCode(code) end function Util.get_lang_exception(lang) -- Families have no language-specific exceptions if lang.getTypes and lang:getTypes().family then return nil end local code = lang:getCode() local lang_exceptions = M.data.config.lang_exceptions if lang_exceptions[code] then return lang_exceptions[code] end for norm_code, exc in pairs(lang_exceptions) do if exc.normalize_to and code == exc.normalize_to then return exc end if exc.normalize_from_families then local should_normalize = false for _, family in ipairs(exc.normalize_from_families) do if lang:inFamily(family) then should_normalize = true break end end if should_normalize and exc.normalize_exclude_families then for _, family in ipairs(exc.normalize_exclude_families) do if lang:inFamily(family) then should_normalize = false break end end end if should_normalize then local ret = {} for k, v in pairs(exc) do ret[k] = v end ret.suppress_tr = nil return ret end end end return nil end function Util.get_norm_lang(lang) local exc = Util.get_lang_exception(lang) if exc and exc.normalize_to then return M.languages.getByCode(exc.normalize_to) end return lang end function Util.resolve_context_lang(lang, node_args) if type(node_args) ~= "table" then return lang end if node_args.status == M.data.STATUS.INLINE then return lang end if not (lang.hasType and lang:hasType("etymology-only")) then return lang end local full = lang.getFull and lang:getFull() if not full or full:getCode() == lang:getCode() then return lang end if full.hasAncestor and full:hasAncestor(lang) then return lang end return full end -- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>) -- This is needed because Module:parse utilities expects boolean modifiers to have explicit values function Util.add_boolean_defaults(str, param_mods) local result = str for name, spec in pairs(param_mods) do if spec.type == "boolean" then -- Replace <name> with <name:1> (but not <name:...> which already has a value) result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>") end end return result end local REQUEST_TEMPLATE_PARAM_MODS = { rfe = { nocat = { type = "boolean" }, sort = {}, y = {}, m = {}, fragment = {}, section = {}, box = { type = "boolean" }, noes = { type = "boolean" }, }, etystub = { nocat = { type = "boolean" }, sort = {}, nocap = { type = "boolean" }, nodot = { type = "boolean" }, }, } function Util.expand_request_template(frame, template_name, param_value, lang_code) local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name] local with_defaults = Util.add_boolean_defaults(param_value, param_mods) local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, { param_mods = param_mods, generate_obj = function(text) if M.yesno(text, false) then return { is_boolean = true } end return { text = text } end, }) local template_args = { [1] = lang_code } for name in pairs(param_mods) do template_args[name] = parsed[name] end if not parsed.is_boolean then template_args[2] = parsed.text end return " " .. frame:expandTemplate({ title = template_name, args = template_args, }) end -- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of -- the module compares against. local POS_ALIASES = { ["reh"] = "root", ["kelîme"] = "word", ["pêşgir"] = "prefix", ["paşgir"] = "suffix", ["navgir"] = "interfix", } function Util.normalize_pos(value) if type(value) ~= "string" then return value end value = mw.text.trim(value) return POS_ALIASES[value] or value end -- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish -- name of `pos`) and the Kurdish values are resolved here. function Util.normalize_raw_etymon_args(args) if args.pos == nil and args.crz ~= nil then args.pos = args.crz end args.pos = Util.normalize_pos(args.pos) return args end -- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms function Util.format_term(term, is_toplevel, opts) opts = opts or {} -- suppress_term (-) returns nil if term.suppress_term then return nil end local lang = term.lang local exc = Util.get_lang_exception(lang) if is_toplevel then local display_text = term.alt or term.title or "" local sc = term.sc or lang:findBestScript(display_text) local bold_text = tostring(mw.html.create("strong") :addClass("selflink") :wikitext(display_text)) return M.script_utilities.tag_text(bold_text, lang, sc, "term") end local link_params = { lang = lang } link_params.term = not term.unknown_term and term.title or nil link_params.alt = term.alt link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil if not (exc and exc.suppress_tr) then link_params.tr = term.tr link_params.ts = term.ts else link_params.suppress_tr = true end link_params.lit = (opts.lit ~= "suppress") and term.lit or nil -- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a -- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a -- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>. local t = (term.t and term.t ~= "") and term.t or nil local id_gloss = (term.id and term.id ~= "") and term.id or nil local gloss = t or id_gloss -- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so -- the tree can put it on its own line. if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then link_params.gloss = gloss end if term.g and term.g ~= "" then local genders = M.string_utilities.split(term.g, ",") for i = 1, #genders do genders[i] = M.string_utilities.trim(genders[i]) end link_params.genders = genders end if opts.pos ~= "suppress" then link_params.pos = term.pos link_params.ng = term.ng end if exc and exc.suppress_tr then link_params.lit = nil end local show_qualifiers if opts.tree_ql ~= "suppress" then if term.q then link_params.q = term.q end if term.qq then link_params.qq = term.qq end if term.l then link_params.l = term.l end if term.ll then link_params.ll = term.ll end show_qualifiers = term.q or term.qq or term.l or term.ll end local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil) if opts.gloss == "separate" then return link, gloss end return link end local __is_content_page_cached function Util.is_content_page() if __is_content_page_cached == nil then __is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle()) end return __is_content_page_cached end local __page_data_cached function Util.get_page_data() if not __page_data_cached then __page_data_cached = M.headword_data.page end return __page_data_cached end -- Extract base keyword from param (without modifiers) local function get_keyword_base(param) if type(param) ~= "string" then return nil end local base = param:match("^:?([^<]+)") or param:gsub("^:", "") return base end local function is_keyword(param, allow_colon_less) if type(param) ~= "string" then return false end local keywords = M.data.keywords if param:sub(1, 1) == ":" then local base = get_keyword_base(param) return keywords[base] ~= nil end if allow_colon_less then local base = get_keyword_base(param) return keywords[base] ~= nil end return false end local function get_keyword(param, allow_colon_less) if type(param) ~= "string" then return nil end local keywords = M.data.keywords if param:sub(1, 1) == ":" then return get_keyword_base(param) end if allow_colon_less then local base = get_keyword_base(param) if keywords[base] then return base end end return nil end local function normalize_keyword(keyword) if keyword:sub(1, 1) == ":" then return keyword end return ":" .. keyword end -- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries local function get_canonical_keyword(keyword) if not keyword then return keyword end return M.data.keyword_canonical[keyword] or keyword end local function is_affix_group_keyword(keyword) local config = keyword and M.data.keywords[keyword] return config and config.affix_categories or false end local function reject_removed_surf_keyword(param) local base = get_keyword_base(param) if base == "surf" then error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).") end end local function copy_keyword_info(source) local copy = {} for k, v in pairs(source) do copy[k] = v end return copy end local function lowercase_glossary_display(text) return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function surf_should_keep_formation_phrase(base) if not base.phrase then return false end if base.glossary then return true end return not (base.phrase == "from" and (base.text == "From" or base.text == "from")) end -- Runtime overrides when <surf> is present on a keyword. local function get_effective_keyword_info(keyword, modifiers) local base = M.data.keywords[keyword] if not base or not modifiers or not modifiers.surf then return base end local effective = copy_keyword_info(base) local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]]," local surf_phrase = "by surface analysis," effective.new_sentence = true effective.invisible = "tree" if surf_should_keep_formation_phrase(base) then effective.phrase = surf_phrase .. " " .. base.phrase if base.text then effective.text = surf_text .. " " .. lowercase_glossary_display(base.text) else effective.text = surf_text .. " " .. base.phrase end else effective.text = surf_text effective.phrase = surf_phrase end return effective end -- Build text/phrase for nominalization with <g:code> (uses data module for codes only). local function get_nominalization_label_for_g(code) if not code or code == "" then return nil end local codes = M.data.nominalization_g_codes local adj = codes[code] if not adj and code:find("-", 1, true) then -- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the -- letters together ("mp"); build the label from the parts. Splitting two-letter codes the -- en.wikt way would mislabel ku codes that are not combinations at all, such as "np" -- (nepersonel). local parts, all_known = {}, true for part in code:gmatch("[^-]+") do local part_adj = codes[part] if part_adj then table.insert(parts, part_adj) else all_known = false end end if all_known and parts[1] then adj = table.concat(parts, " ") end end if not adj then return nil end local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of" local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false) return { text = text, phrase = phrase } end local EtymonParser = {} -- Keyword modifier definitions EtymonParser.keyword_param_mods = { unc = { type = "boolean" }, ref = {}, text = { restrict = { keywords = { "from", "derived" } } }, lit = { restrict = { affix_group = true } }, conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc. g = { restrict = { keywords = { "nominalization" } } }, surf = { type = "boolean" }, senseid = { restrict = { keywords = { "semantic loan" } } }, -- Kurdish names, resolved by resolve_modifier_aliases() below. maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } }, } -- Term modifier definitions EtymonParser.etymon_param_mods = { id = {}, t = {}, tr = {}, ts = {}, q = {}, qq = {}, l = {}, ll = {}, pos = {}, ng = {}, alt = {}, g = {}, ety = {}, lit = {}, unc = { type = "boolean" }, ref = {}, aftype = { restrict = { affix_group = true } }, postype = {}, bor = { type = "boolean", restrict = { affix_group = true } }, slbor = { type = "boolean", restrict = { affix_group = true } }, lbor = { type = "boolean", restrict = { affix_group = true } }, -- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below. -- cuda/t/w/crz are the names ku's own templates already accept; the affix-group -- borrowing flags reuse the Kurdish keyword names. cuda = { alias_of = "alt" }, -- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):", -- so a name containing "î" can never be recognised as a prefix. etimon = { alias_of = "ety" }, w = { alias_of = "t" }, crz = { alias_of = "pos" }, nediyar = { type = "boolean", alias_of = "unc" }, deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } }, deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } }, deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } }, } --[==[ Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever sees the canonical set. Called right after the inline modifiers are parsed. ]==] function EtymonParser.resolve_modifier_aliases(obj, param_mods) for name, def in pairs(param_mods) do if def.alias_of and obj[name] ~= nil then if obj[def.alias_of] ~= nil then error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.") end obj[def.alias_of] = obj[name] obj[name] = nil end end return obj end local function get_clean_param_mods(param_mods) local clean = {} for mod_name, mod_def in pairs(param_mods) do clean[mod_name] = {} for key, value in pairs(mod_def) do if key ~= "restrict" and key ~= "alias_of" then clean[mod_name][key] = value end end end return clean end function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods) for mod_name, mod_value in pairs(modifiers) do -- Only check restrictions if the modifier has a non-false/nil value if mod_value then local mod_def = param_mods[mod_name] if mod_def and mod_def.restrict then if mod_def.restrict.affix_group then if not is_affix_group_keyword(current_keyword) then local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).") end elseif mod_def.restrict.keywords then local allowed_keywords = mod_def.restrict.keywords local is_allowed = false for _, allowed_keyword in ipairs(allowed_keywords) do if current_keyword == allowed_keyword then is_allowed = true break end end if not is_allowed then local keyword_list = {} for _, kw in ipairs(allowed_keywords) do table.insert(keyword_list, ":" .. kw) end local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ") if #keyword_list > 2 then -- Replace last comma with "or" keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1") end local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".") end end end end end end local TERM_RULE_DISALLOW = { suppress = { field = "suppress_term", label = "suppressed" }, unknown = { field = "unknown_term", label = "unknown" }, family = { field = "is_family", label = "family" }, } function EtymonParser.check_etymon_limits(count, limits, label, opts) if not limits then return end opts = opts or {} local min_etymons = limits.min_etymons if min_etymons == nil and not opts.skip_default_min then min_etymons = 1 end if min_etymons and count < min_etymons then if min_etymons > 1 then error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.") else error("Detected " .. label .. " with no etymons.") end end if limits.max_etymons and count > limits.max_etymons then local unit = (limits.max_etymons == 1) and "etymon" or "etymons" error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".") end end function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label) label = label or "term" if rules and rules.disallow then local disallowed = {} for _, typ in ipairs(rules.disallow) do local spec = TERM_RULE_DISALLOW[typ] if spec and etymon_data[spec.field] then table.insert(disallowed, spec.label) end end if #disallowed > 0 then error(label .. " does not support " .. mw.text.listToText(disallowed, "or") .. " etymons.") end end if etymon_data.is_family then if rules and rules.family == "disallowed" then error(label .. " does not support family codes" .. (rules.family_suffix or ".")) elseif not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end if rules then if rules.require_term and (not etymon_data.term or etymon_data.term == "") then error(label .. " requires a term for each listed form.") end if rules.entry_lang then if Util.get_norm_lang(etymon_data.lang):getFullCode() ~= Util.get_norm_lang(entry_lang):getFullCode() then error(label .. " terms must be in the entry language (" .. entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.") end end if rules.ancestor_check then M.etymology.check_ancestor(entry_lang, etymon_data.lang) end elseif etymon_data.is_family and not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword) local config = M.data.keywords[keyword] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`") end function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local config = M.data.supplements[supplement_type] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=") end -- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>") function EtymonParser.parse_keyword_modifiers(param) if type(param) ~= "string" then return nil, {} end local base_keyword = get_keyword_base(param) if not base_keyword then return nil, {} end local canonical_keyword = get_canonical_keyword(base_keyword) -- Check if there are any modifiers if not param:find("<", 1, true) then return canonical_keyword, {} end -- Parse modifiers using the same mechanism as etymon parsing local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods) local function generate_obj(ignored) return {} end local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""), { param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods) local modifiers = { unc = parsed.unc or false, ref = parsed.ref, text = parsed.text, lit = parsed.lit, conj = parsed.conj, g = parsed.g, surf = parsed.surf or false, senseid = parsed.senseid, } -- Validate modifiers against restrictions EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods) return canonical_keyword, modifiers end local function normalize_keyword_param(keyword_with_mods) local trimmed = M.string_utilities.trim(keyword_with_mods) reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed)) local base = get_keyword_base(trimmed) if not base or not M.data.keywords[base] then error("Invalid keyword '" .. trimmed .. "' in inline etymology") end local canonical_base = get_canonical_keyword(base) local without_colon = trimmed:gsub("^:", "") local mods_part = without_colon:sub(#base + 1) local kw_param = normalize_keyword(canonical_base .. mods_part) EtymonParser.parse_keyword_modifiers(kw_param) return kw_param end local function get_keyword_mod_names() local names = {} for mod_name in pairs(EtymonParser.keyword_param_mods) do names[mod_name] = true end return names end local function parse_inline_ety_run(ety_string) local body = ety_string or "" if body == "" then error("Empty inline etymology") end local keyword_mod_names = get_keyword_mod_names() local pos = 1 local len = #body local function parse_err(msg) error(msg .. " in inline etymology: '" .. body .. "'") end local function peek_double() return body:sub(pos, pos + 1) == "<<" end local function mod_name_from_unwrapped(unwrapped) return unwrapped:match("^<([^:>]+)") end local function is_keyword_mod(unwrapped) local name = mod_name_from_unwrapped(unwrapped) return name and keyword_mod_names[name] or false end local function read_double_bracket() if not peek_double() then return nil end local start = pos pos = pos + 2 while pos <= len - 1 do if body:sub(pos, pos + 1) == ">>" then local token = body:sub(start, pos + 1) pos = pos + 2 return token, token:sub(2, -2) end pos = pos + 1 end parse_err("Unmatched <<") end local function read_angle_cell() if body:sub(pos, pos) ~= "<" or peek_double() then return nil end local open = pos pos = pos + 1 local depth = 1 local i = pos while i <= len do local ch = body:sub(i, i) if ch == "<" then depth = depth + 1 elseif ch == ">" then depth = depth - 1 if depth == 0 then local inner = body:sub(open + 1, i - 1) pos = i + 1 return inner end end i = i + 1 end parse_err("Unmatched <") end local function read_bare_run() local start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end return body:sub(start, pos - 1) end local function absorb_double_keyword_mods(keyword_str) while peek_double() do local saved = pos local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then keyword_str = keyword_str .. unwrapped else pos = saved break end end return keyword_str end local kw_start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end local keyword = body:sub(kw_start, pos - 1) if keyword:match("^%s*$") then parse_err("Missing keyword") end keyword = absorb_double_keyword_mods(keyword) local cells = {} while pos <= len do if peek_double() then local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword") end table.insert(cells, "+" .. unwrapped) elseif body:sub(pos, pos) == "<" then local inner = read_angle_cell() if inner ~= "" then table.insert(cells, inner) end else local bare = read_bare_run() if bare ~= "" then if bare:sub(1, 1) ~= ":" then parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)") end if not is_keyword(bare, true) then parse_err("Invalid keyword '" .. bare .. "' in inline etymology") end table.insert(cells, absorb_double_keyword_mods(bare)) end end end return { keyword = keyword, cells = cells, } end function EtymonParser.inline_ety_to_pipe(ety_string) local run = parse_inline_ety_run(ety_string) if not run.keyword or run.keyword:match("^%s*$") then return "|" end local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(pipe_parts, normalize_keyword_param(segment)) else table.insert(pipe_parts, segment) end end return "|" .. table.concat(pipe_parts, "|") .. "|" end function EtymonParser.pipe_to_inline_ety(pipe_string) local cells = {} for cell in pipe_string:gmatch("([^|]+)") do if cell ~= "" then table.insert(cells, cell) end end if #cells == 0 then return "" end local inline_parts = {} for index, cell in ipairs(cells) do local base = get_keyword_base(cell) if base and M.data.keywords[base] then local without_colon = cell:gsub("^:", "") local kw_base, mods = without_colon:match("^([^<]+)(.*)$") local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>") if index > 1 then inline_kw = ":" .. inline_kw end table.insert(inline_parts, inline_kw) elseif cell:sub(1, 1) == "+" then local mod = cell:sub(2) if mod:match("^<.->$") then mod = mod:sub(2, -2) end table.insert(inline_parts, "<<" .. mod .. ">>") else table.insert(inline_parts, "<" .. cell .. ">") end end return table.concat(inline_parts, "") end function EtymonParser.parse_inline_ety(ety_string, context_lang) local run = parse_inline_ety_run(ety_string) local keyword = M.string_utilities.trim(run.keyword) reject_removed_surf_keyword(":" .. keyword) if not is_keyword(keyword, true) then error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>") end local args = { context_lang:getCode(), normalize_keyword_param(keyword) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(args, normalize_keyword_param(segment)) else table.insert(args, segment) end end return args end function EtymonParser.parse_etymon(param, context_lang) if is_keyword(param) then return nil end if type(param) ~= "string" then return nil end local lang, rest local is_family = false local before_bracket = param:match("^([^<]*)") or param local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$") if lang_code then local potential_lang = Util.get_lang(lang_code, true) if potential_lang then lang = potential_lang rest = param:sub(#lang_code + 2) else local potential_family = Util.get_family(lang_code) if potential_family then lang = potential_family rest = param:sub(#lang_code + 2) is_family = true else lang = context_lang rest = param end end else lang = context_lang rest = param end M.tracking.track_term(rest) if rest == "" or rest == "+" then return { lang = lang, term = nil, unknown_term = true, is_family = is_family, } end if rest == "-" then return { lang = lang, term = nil, suppress_term = true, is_family = is_family, } end if not rest:find("<", 1, true) then return { lang = lang, term = M.string_utilities.trim(rest), is_family = is_family, } end local term_text = rest:match("^([^<]*)") or "" local is_unknown = (term_text == "" or term_text == "+") local is_suppress = (term_text == "-") local function generate_obj(ignored_term) return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) } end local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods) local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults, { param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods) parsed_obj.postype = Util.normalize_pos(parsed_obj.postype) if parsed_obj.id and parsed_obj.id:match("^!") then parsed_obj.id = parsed_obj.id:sub(2) parsed_obj.override = true end parsed_obj.lang = lang parsed_obj.is_family = is_family if is_unknown then parsed_obj.unknown_term = true elseif is_suppress then parsed_obj.suppress_term = true end return parsed_obj end function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code) -- id is now optional, so only validate if provided if id then if mw.ustring.len(id) < 2 then error("The `id` parameter must have at least two characters.") end if id == title or id == Util.get_page_data().pagename then error("The `id` parameter must not be the same as the page title.") end end local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true } if pos and not valid_pos[pos] then error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").") end local current_keyword = "from" local current_keyword_explicit = false local keyword_etymons = {} local keywords = M.data.keywords local function checkKeyword() local config = keywords[current_keyword] if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then keyword_etymons = {} return end EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`") keyword_etymons = {} end local start_index = starts_with_lang_code and 2 or 1 for i = start_index, #args do local param = args[i] if type(param) ~= "string" then elseif param:sub(1, 1) == ":" and not is_keyword(param) then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif is_keyword(param) then checkKeyword() current_keyword = get_canonical_keyword(get_keyword(param)) current_keyword_explicit = true else local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then table.insert(keyword_etymons, param) EtymonParser.check_keyword_term(etymon_data, lang, current_keyword) -- Check modifier restrictions EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods) -- postype must be "root" or "word" local VALID_POSTYPES = { root = true, word = true } if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").") end if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true) end else table.insert(keyword_etymons, param) end end end checkKeyword() end local DataRetriever = {} local function format_etymon_id_hint(id_data, idx) local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then return '"' .. id .. '"' end if pos and pos ~= "" then return "unnamed (|pos=" .. pos .. "|)" end return "etymon #" .. idx .. " (no |id= on page)" end local function etymon_target_page_link(page, norm_lang) -- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it -- directly. Passing it back through full_link() with a reconstructed language raises an error, -- because the resolved name no longer carries the leading "*" those languages require -- and -- this link is built even when the warning it belongs to is later discarded outside preview. return "[[" .. page .. "]]" end -- Summarize {{etymon}} id slots on a linked page for preview warnings. local function summarize_available_etymon_ids(ids) local id_list = {} local all_idless = true local target_has_idless = false local any_pos = false for i, id_data in ipairs(ids) do local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then all_idless = false else target_has_idless = true end if pos and pos ~= "" then any_pos = true end table.insert(id_list, format_etymon_id_hint(id_data, i)) end return { id_list = id_list, all_idless = all_idless, target_has_idless = target_has_idless, any_pos = any_pos, count = #ids, options_text = mw.text.listToText(id_list), } end local function ambiguous_etymon_suggestion(page_link, summary) if summary.all_idless then if summary.any_pos then return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link .. ", then `<id:identifier>` after the term here. Section order / hints: " .. summary.options_text .. "." end return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)." end return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "." end local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(ids) if is_toplevel and summary.target_has_idless then __state.linked_page_multiple_etymons_idless = true end local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count .. " {{etymon}} templates for " .. lang_name .. ")." Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true) end local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon) return cached_args == M.data.STATUS.MISSING and not parent_etymon and #(__state.available_etymon_ids[base_key] or {}) > 0 end local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) if not is_toplevel or __state.skip_partial_etymology_category then return end if not __state.partial_etymology_targets[base_key] then return end if etymon_data.id and type(cached_args) == "table" then return end __state.linked_page_partial_etymology_sections = true end local function is_nonlemma_etymon_template(template_args) return template_args and M.yesno(template_args.nl, false) end local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {}) local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id .. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "." Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true) end -- Given an etymon data, scrape its page and cache the result in the global state object. function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel) local content = etymon_title:getContent() if not content then __state.cached_etymon_args[key] = M.data.STATUS.REDLINK return end -- Check if the linked page is a redirect. If it is, the template parsing -- code below will be effectively skipped, and `scrape_page` will be called -- again on the redirect target (see the bottom of this function) local lang_section_for_descendants = nil local redirect_target = etymon_title.redirect_target if not redirect_target then -- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language -- name, and this scrape runs on raw wikitext, so the template form has to be tried too. content = M.pages.get_section(content, etymon_lang:getFullName(), 2) or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2) if not content then __state.cached_etymon_args[key] = M.data.STATUS.MISSING return end lang_section_for_descendants = content end local etymon_lang_code = etymon_lang:getFullCode() local lang_page_key = etymon_lang_code .. ":" .. etymon_page local found_templates_for_lang = {} local found_ids = {} local get_node_class = M.template_parser.class_else_type -- Look for all {{etymon}} templates within the page content using the template parser -- This way the same page is never parsed more than once -- Build a map from senseids to their parent etymonids. local active_etymon_args = nil local etymology_section_count = 0 local etymology_sections_with_etymon = 0 local current_etymology_has_etymon = false local current_etymology_has_nonlemma = false local function finalize_current_etymology_section() if etymology_section_count == 0 then return end if current_etymology_has_etymon or current_etymology_has_nonlemma then etymology_sections_with_etymon = etymology_sections_with_etymon + 1 end current_etymology_has_etymon = false current_etymology_has_nonlemma = false end for node in M.template_parser.parse(content):iterate_nodes() do local node_class = get_node_class(node) if node_class == "heading" then -- A new L2 or etymology section acts as a barrier: an {{etymon}} usage -- used previously cannot be the parent of any subsequent senseids. -- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above. if node:get_name():find(ETYMOLOGY_HEADING) then finalize_current_etymology_section() etymology_section_count = etymology_section_count + 1 active_etymon_args = nil end elseif node_class == "template" then local template_name = node:get_name() if ETYMON_TEMPLATES[template_name] then local template_args = Util.normalize_raw_etymon_args(node:get_arguments()) -- Check if this etymon is for our language if template_args[1] == etymon_lang_code then if is_nonlemma_etymon_template(template_args) then if etymology_section_count > 0 then current_etymology_has_nonlemma = true end else if etymology_section_count > 0 then current_etymology_has_etymon = true end table.insert(found_templates_for_lang, template_args) if template_args.id then local etymon_key = lang_page_key .. ":" .. template_args.id __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, template_args.id) active_etymon_args = template_args else -- Store idless etymon with default key local etymon_key = lang_page_key .. ":*" __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, "*") active_etymon_args = template_args end end end elseif active_etymon_args and template_name == "senseid" then local template_args = node:get_arguments() -- This should always be true for proper usages of {{senseid}}. if template_args[1] == etymon_lang_code and template_args[2] then local sense_id_key = lang_page_key .. ":" .. template_args[2] __state.senseid_parent_etymon[sense_id_key] = active_etymon_args __state.cached_etymon_pages[sense_id_key] = tostring(etymon_page) end end end end finalize_current_etymology_section() if lang_section_for_descendants and etymology_section_count > 1 and etymology_sections_with_etymon > 0 and etymology_sections_with_etymon < etymology_section_count then __state.partial_etymology_targets[lang_page_key] = true end if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then M.descendants.cache_page_checks({ lang_section = lang_section_for_descendants, etymon_lang_code = etymon_lang_code, found_templates_for_lang = found_templates_for_lang, entry_title = __state.entry_title, entry_lang_code = __state.entry_lang_code, entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil, cached_descendants_checks = __state.cached_descendants_checks, lang_page_key = lang_page_key, redirected_from = redirected_from, }) end local id_data_list = {} for _, args in ipairs(found_templates_for_lang) do local id = args.id or "*" table.insert(id_data_list, { id = id, pos = args.pos }) end __state.available_etymon_ids[lang_page_key] = id_data_list if #found_templates_for_lang == 1 then __state.single_etymons[lang_page_key] = found_templates_for_lang[1] end if redirected_from and __state.available_etymon_ids[lang_page_key] then __state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {} for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do table.insert(__state.available_etymon_ids[redirected_from], id_data) end end if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then -- All done! return elseif redirect_target and not redirected_from then -- Try scraping the redirect. etymon_page = redirect_target.prefixedText DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel) __state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id] else __state.cached_etymon_args[key] = M.data.STATUS.MISSING end end local function has_linkable_term(etymon_data) if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then return false end local term = etymon_data.term if term == nil or term == "" then return false end return M.string_utilities.trim(term) ~= "" end local function record_term_id_tracking(etymon_data) if not has_linkable_term(etymon_data) then return end local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang) M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page) end -- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name. function DataRetriever.get_etymon_args(etymon_data, is_toplevel) if not has_linkable_term(etymon_data) then return M.data.STATUS.MISSING, nil, nil, nil end local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page if etymon_data.id then local key = base_key .. ":" .. etymon_data.id local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] if cached_args == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel) end cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh -- Get etymon_id from parent if this was resolved via senseid local parent_etymon = __state.senseid_parent_etymon[key] local resolved_etymon_id = parent_etymon and parent_etymon.id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) end end local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon) if mismatched_id and is_toplevel then __state.has_mismatched_id = true M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id) warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id) end maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check else __state.used_idless_etymon = true if is_toplevel then __state.toplevel_idless_etymon = true end if __state.available_etymon_ids[base_key] == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel) end local ids = __state.available_etymon_ids[base_key] or {} local count = #ids -- Try to filter by postype if available and we have multiple candidates if count > 1 and etymon_data.postype then local matching_ids = {} for _, id_data in ipairs(ids) do if id_data.pos == etymon_data.postype then table.insert(matching_ids, id_data) end end if #matching_ids == 1 then local matched_id = matching_ids[1].id local matched_key = base_key .. ":" .. matched_id M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id = matched_id }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id = matched_id }, }) end end local matched_args = __state.cached_etymon_args[matched_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel) return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check end end if count == 1 then local only_id_data = ids[1] local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*" M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id_data = only_id_data }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id_data = only_id_data }, }) end end local single_args = __state.single_etymons[base_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel) return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check elseif count > 1 then M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous") warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel) return M.data.STATUS.AMBIGUOUS, nil, nil, nil else M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing") maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel) return M.data.STATUS.MISSING, nil, nil, nil end end end local function keyword_invisible_in_tree(keyword_info) if not keyword_info then return false end local inv = keyword_info.invisible return inv == "all" or inv == true or inv == "tree" end -- True when the node has at least one top-level child container visible in the tree. local function node_has_visible_tree_children(node) for _, container in ipairs(node.children or {}) do if not keyword_invisible_in_tree(container.keyword_info) then return true end end return false end -- Count visible term nodes in the tree. local function get_visible_tree_depth(node, skip_child_rendering) local max_depth = 1 if skip_child_rendering or not node then return max_depth end for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if not keyword_invisible_in_tree(keyword_info) then local skip_grandchildren = keyword_info and keyword_info.no_child_categories for _, term in ipairs(container.terms or {}) do if term.is_duplicate then if term.original_has_children then max_depth = math.max(max_depth, 2) end else max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren)) end end end end return max_depth end local function as_param_list(val) if val == nil then return {} end if type(val) == "table" then return val end if type(val) == "string" and val ~= "" then return { val } end return {} end local TreeBuilder = {} local function parse_etymon_references(refs_text) if not refs_text or refs_text == "" then return "" end return M.references.parse_references(refs_text) end local function parse_tree_references(node) if node.ref then node.parsed_ref = parse_etymon_references(node.ref) end if node.children then for _, container in ipairs(node.children) do if container.terms then for _, term in ipairs(container.terms) do parse_tree_references(term) end end end end if node.supplements then for _, supplement in ipairs(node.supplements) do if supplement.terms then for _, term in ipairs(supplement.terms) do parse_tree_references(term) end end end end end -- Build a unique key for deduplication in the seen table function TreeBuilder.build_key(lang, title, args) local norm_lang_code = Util.get_norm_lang(lang):getFullCode() local is_table = type(args) == "table" local id = (is_table and args.id) or "" if title then return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id end if is_table and args.status == M.data.STATUS.INLINE then local content_parts = {} for i = 1, #args do content_parts[i] = tostring(args[i]) end return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0") end return norm_lang_code .. ":*:" .. id end -- Copy parsed etymon modifiers onto a tree/supplement term node. function TreeBuilder.apply_etymon_fields(term, etymon_data) -- A reference without <id:> still resolves when the target page has a single etymon, and the -- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows -- the target's id as the gloss without every reference having to repeat it. An explicit -- <id:...> still wins. term.id = etymon_data.id or term.id term.t = etymon_data.t term.tr = etymon_data.tr term.ts = etymon_data.ts term.alt = etymon_data.alt term.g = etymon_data.g term.pos = etymon_data.pos term.ng = etymon_data.ng term.ref = etymon_data.ref term.is_uncertain = etymon_data.unc term.lit = etymon_data.lit term.q = etymon_data.q term.qq = etymon_data.qq term.l = etymon_data.l term.ll = etymon_data.ll term.suppress_term = etymon_data.suppress_term term.unknown_term = etymon_data.unknown_term term.is_family = etymon_data.is_family term.override = etymon_data.override term.aftype = etymon_data.aftype term.postype = etymon_data.postype term.bor = etymon_data.bor term.lbor = etymon_data.lbor term.slbor = etymon_data.slbor end function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type) EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local term = { lang = etymon_data.lang, title = etymon_data.term, children = {}, status = M.data.STATUS.OK, } TreeBuilder.apply_etymon_fields(term, etymon_data) return term end function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) local terms = {} for _, term_param in ipairs(as_param_list(param_value)) do if type(term_param) == "string" and term_param ~= "" then local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang) if etymon_data then table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)) end end end return terms end -- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=). function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value) local config = M.data.supplements[supplement_type] if not config then error("Unknown supplement '" .. tostring(supplement_type) .. "'.") end local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) if #terms == 0 then return end data_tree.supplements = data_tree.supplements or {} table.insert(data_tree.supplements, { type = supplement_type, config = config, terms = terms, }) M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true) end function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion) seen = seen or {} depth = depth or 0 local is_toplevel = (depth == 0) if depth > __state.max_depth_reached then __state.max_depth_reached = depth end __state.total_nodes = __state.total_nodes + 1 local lang_code = lang:getCode() __state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1 local current_id = (type(args) == "table" and args.id) or "" local key = TreeBuilder.build_key(lang, title, args) local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK } if type(args) ~= "table" or seen[key] then node.status = args or M.data.STATUS.MISSING -- Mark as duplicate if we've seen this node before if seen[key] then node.is_duplicate = true node.duplicate_key = key local original_node = seen[key] if type(original_node) == "table" and original_node.children and #original_node.children > 0 then node.original_has_children = true end end return node end node.status = args.status or M.data.STATUS.OK seen[key] = node -- If stop_recursion is set, skip parsing children but check for visible children if stop_recursion then local keywords = M.data.keywords local has_visible_children = false for i = 2, #args do local param = args[i] if type(param) == "string" then local keyword_base = get_keyword_base(param) if keyword_base and keywords[keyword_base] then local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param)) if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then has_visible_children = true break end elseif param:sub(1, 1) ~= ":" then -- It's a term (not a keyword), so there are visible children has_visible_children = true break end end end node.has_visible_children = has_visible_children return node end -- Parse args into keyword containers local current_keyword = "from" local current_keyword_modifiers = {} local current_container = nil local function ensure_container() if not current_container or current_container.keyword ~= current_keyword then local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers) current_container = { keyword = current_keyword, keyword_info = keyword_info, keyword_modifiers = current_keyword_modifiers, terms = {}, } table.insert(node.children, current_container) -- Override keyword text/phrase for nominalization with <g:code> if current_keyword_modifiers.g and current_keyword == "nominalization" then local labels = get_nominalization_label_for_g(current_keyword_modifiers.g) if not labels then local codes = {} for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end table.sort(codes) error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", ")) end current_container.keyword_info = copy_keyword_info(keyword_info) current_container.keyword_info.text = labels.text current_container.keyword_info.phrase = labels.phrase end end return current_container end local parse_context_lang = Util.resolve_context_lang(lang, args) for i = 2, #args do local param = args[i] if is_keyword(param) then local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param) if not keyword then error("Invalid keyword '" .. param .. "'.") end current_keyword = keyword current_keyword_modifiers = modifiers current_container = nil -- Force new container for new keyword elseif type(param) == "string" and param:sub(1, 1) == ":" then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif type(param) == "string" then local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang) if etymon_data then -- Track keyword usage at top level M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel) local term_node = {} local container -- Handle suppress_term (-) and unknown_term (empty or +) directly if etymon_data.suppress_term or etymon_data.unknown_term then container = ensure_container() if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1) else term_node = { lang = etymon_data.lang, children = {}, status = M.data.STATUS.OK, } end TreeBuilder.apply_etymon_fields(term_node, etymon_data) else -- Regular term: fetch arguments from page record_term_id_tracking(etymon_data) local etymon_args, page_of, resolved_etymon_id, descendants_check = DataRetriever.get_etymon_args(etymon_data, is_toplevel) -- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing if etymon_data.ety then if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then __state.current_page_has_inline_etymology = true if is_toplevel then __state.toplevel_has_inline_etymology = true end local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) -- Track inline ety keywords too local inline_keyword = get_keyword(inline_args[2], true) if inline_keyword and #inline_args >= 3 then local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang) if inline_etymon then M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel) end end inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE etymon_args = inline_args term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent else -- Scraped arguments exist, <ety> is redundant and ignored __state.current_page_has_redundant_etymology = true if is_toplevel then __state.toplevel_redundant_etymology = true end end end -- Ensure container exists before checking keyword info container = ensure_container() -- Check if current keyword has no_child_categories - if so, stop recursion local keyword_info = container.keyword_info local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories)) term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion) term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() .. ":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang) term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid term_node.page_of = page_of TreeBuilder.apply_etymon_fields(term_node, etymon_data) term_node.missing_descendants_header, term_node.missing_descendants_entry = M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check) end table.insert(container.terms, term_node) end end end return node end -- Convert etymology tree to JSON-serializable table local function tree_to_json(node) local obj = { term = node.title, lang = node.lang:getCode(), lang_name = node.lang:getCanonicalName(), id = (node.id and node.id ~= "") and node.id or nil, status = node.status, is_uncertain = node.is_uncertain or nil, is_duplicate = node.is_duplicate or nil, gloss = node.t, transliteration = node.tr, transcription = node.ts, alt = node.alt, g = node.g, pos = node.pos, ng = node.ng, children = {}, } for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if keyword_info then local container_obj = { keyword = container.keyword, keyword_label = keyword_info.text, keyword_abbrev = keyword_info.abbrev, is_group = keyword_info.is_group or nil, is_invisible = keyword_info.invisible or nil, is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil, terms = {}, } for _, term in ipairs(container.terms or {}) do table.insert(container_obj.terms, tree_to_json(term)) end table.insert(obj.children, container_obj) end end return obj end -- Build and return the etymology data tree for a given term. function export.get_tree(lang, title, args, options) options = options or {} __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() __state.skip_partial_etymology_category = options.skip_partial_etymology_category == true if options.validate then EtymonParser.validate(lang, args, options.id, title, options.pos, false) end local lang_code = lang:getCode() local start_index = (args[1] == lang_code) and 2 or 1 local tree_args = { [1] = lang_code, id = options.id or args.id } for i = start_index, #args do table.insert(tree_args, args[i]) end __state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args local ety_data_tree = TreeBuilder.build(lang, title, tree_args) parse_tree_references(ety_data_tree) if options.json then return M.JSON.toJSON(tree_to_json(ety_data_tree)) end return ety_data_tree end -- Given a language code, page name and optionally the id= parameter, -- render the tree and only the etymology tree for the relevant page. -- Fetches and parses the corresponding {{etymon}} from the requested page, -- and any further pages needed to render the tree. -- Parameters can be passed either through the #invoke or as -- template parameters *through* an #invoke. function export.render_tree_for_etymon_on_page(frame) local frame_args = frame.args local parent_args = frame:getParent().args local langcode = frame_args[1] or parent_args[1] local pagename = frame_args[2] or parent_args[2] local id = frame_args["id"] or parent_args["id"] local display_title = frame_args["title"] or parent_args["title"] local parsed_title = mw.title.new(pagename, 0) local title if parsed_title.namespace == 0 then title = M.pages.safe_page_name(parsed_title) elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then title = "*" .. M.pages.safe_page_name(parsed_title) else error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace) end local lang = Util.get_lang(langcode) __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() -- Construct etymon_data for DataRetriever.get_args. local etymon_data = { lang = lang, term = title, id = id } local args, pagename = DataRetriever.get_etymon_args(etymon_data, true) if args == M.data.STATUS.MISSING then error("The etymon template was not found (language " .. langcode .. ", title '" .. title .. "'" .. (id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.") end local tree_title = display_title or title if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then M.tracking.track_title_pagename_mismatch(lang) end reset_invocation_state() local ety_data_tree = export.get_tree(lang, tree_title, args, { validate = true, id = id, }) local output = {} table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) return table.concat(output) end function export.main(frame) local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, M.parameters_data.etymon) args.pos = Util.normalize_pos(args.pos) local lang = args[1] local etymon_args = args[2] local id = args.id local title = args.title local text = args.text local tree = args.tree local etydate = args.etydate local doublet = args.doublet local rfe = args.rfe local etystub = args.etystub local is_nonlemma = M.yesno(args.nl, false) local page_data = Util.get_page_data() if not title then title = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end end local entry_pagename = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then entry_pagename = "*" .. entry_pagename end if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then M.tracking.track_title_pagename_mismatch(lang) end local current_L2 = M.pages.get_current_L2() if current_L2 then local norm_lang = Util.get_norm_lang(lang) local norm_name = norm_lang:getCanonicalName() if current_L2 ~= norm_name then local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if norm_lang:getCode() ~= lang:getCode() then lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")" end error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").") end end reset_invocation_state() local ety_data_tree = export.get_tree(lang, title, etymon_args, { validate = true, pos = args.pos, id = id, json = args.json, skip_partial_etymology_category = is_nonlemma, }) if args.json then return ety_data_tree end local output = {} local text_allowlist_mode = M.text_allowed.default_mode or "off" if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() .. "; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter." if text_allowlist_mode == "error" then error(msg) else Util.add_warning(msg, true) end end local lang_exc = Util.get_lang_exception(lang) if lang_exc and lang_exc.disallow then local disallow = lang_exc.disallow local error_text = " for " .. lang:getFullName() if disallow.ref then error_text = error_text .. "; see " .. disallow.ref else error_text = error_text .. "." end if tree and disallow.tree then error("Etymology trees are not allowed" .. error_text) end if text and disallow.text then error("Etymology texts are not allowed" .. error_text) end end if etydate then local etydate_param_mods = { ref = { list = true, type = "references", allow_holes = true }, refn = { list = true, allow_holes = true }, nocap = { type = "boolean" }, } local function generate_etydate_obj(etydate_text) local etydate_specs = {} for spec in etydate_text:gmatch("[^,]+") do table.insert(etydate_specs, mw.text.trim(spec)) end return { [1] = etydate_specs } end local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj }) local etydate_args = { [1] = parsed_etydate[1], nocap = parsed_etydate.nocap or false, } ety_data_tree.supplements = ety_data_tree.supplements or {} table.insert(ety_data_tree.supplements, { type = "etydate", etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }), etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil, }) end TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet) if ety_data_tree.supplements then parse_tree_references(ety_data_tree) end local has_visible_children = node_has_visible_tree_children(ety_data_tree) -- Suppress trees for multiword entries and one-step chains local visible_tree_depth = get_visible_tree_depth(ety_data_tree) local is_trivial_tree = visible_tree_depth <= 2 local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil if tree and (is_multiword or is_trivial_tree) then tree = false end if tree then table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) end local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree)) local anchor = M.anchors.etymonid(lang, id, { no_tree = args.notree, title = title, empty_tree = (not has_visible_children) or tree_disallowed, ety_tree_json = ety_tree_json, }) table.insert(output, anchor) local text_stop_lang_missing = nil if text then local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink if text == "++" then max_depth, stop_at_blue_link = false, false elseif text == "+" then max_depth, stop_at_blue_link = 1, false elseif text == "*" then max_depth, stop_at_blue_link = false, true elseif text:match("^:[^*]+%*$") then -- Stop at a specific language OR first bluelink after it, e.g., ":ota*" -- If the target language is a redlink, continue to the first bluelink local lang_code = text:match("^:([^*]+)%*$") if lang_code and lang_code ~= "" then local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang_or_bluelink = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end elseif text:sub(1, 1) == ":" then -- Stop at a specific language, e.g., ":ar" stops at first Arabic term local lang_code = text:sub(2) if lang_code ~= "" then -- Validate the language code local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else local num = tonumber(text) if num and num >= 1 then max_depth, stop_at_blue_link = num, false else error('Invalid text value "' .. text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)') end end local text_output, text_render_meta = M.text.render({ data_tree = ety_data_tree, format_term_func = Util.format_term, lang_matches_stop_code = Util.lang_matches_stop_code, max_depth = max_depth, stop_at_blue_link = stop_at_blue_link, curr_page = page_data.pagename, nodot = args.nodot, dot = args.dot, stop_at_lang = stop_at_lang, stop_at_lang_or_bluelink = stop_at_lang_or_bluelink, }) table.insert(output, text_output) if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then M.tracking.track_text_stop_lang_missing(lang, stop_at_lang) text_stop_lang_missing = stop_at_lang end end if rfe then table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode())) end if etystub then table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode())) end if is_nonlemma then table.insert(output, " " .. frame:expandTemplate({ title = "nonlemma", args = {}, })) end local categories = {} if Util.is_content_page() then M.tracking.track_tree_metrics({ max_depth_reached = __state.max_depth_reached, total_nodes = __state.total_nodes, language_count = __state.language_count, lang = lang, }) categories = M.categories.build({ data_tree = ety_data_tree, page_lang = lang, available_etymon_ids = __state.available_etymon_ids, senseid_parent_etymon = __state.senseid_parent_etymon, get_norm_lang_func = Util.get_norm_lang, lang_exc = lang_exc, suppress_categories = lang_exc and lang_exc.suppress_categories, nocat = args.nocat, tree = tree, text = text, exnihilo = args.exnihilo, toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology, toplevel_redundant_etymology = __state.toplevel_redundant_etymology, toplevel_idless_etymon = __state.toplevel_idless_etymon, has_mismatched_id = __state.has_mismatched_id, linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless, linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections, text_stop_lang_missing = text_stop_lang_missing, }) M.tracking.track_keywords(__state.toplevel_keyword_stats, lang) M.tracking.track_page_id(lang, id) M.tracking.track_ids(__state.id_stats, lang) end if #categories > 0 then table.insert(output, M.categories.format(categories, lang)) end if __state.warnings then for i, warning in ipairs(__state.warnings) do table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n") end end return table.concat(output) end return export j7eqppzoz3so9lb9jii1odz87o1mnkx 6532082 6532061 2026-09-18T19:07:46Z Wikihez 7344 Kurdish names for the parameters (tarîxa-etîm, niqtena, niqte, katna/nekat, darna) and for the modifiers (hrf, crztip, grdk, anlz, metn) 6532082 Scribunto text/plain --[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Authors: - Original implementation: [[User:Ioaxxere]] - Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]]) Modules: - [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping - [[Module:etymon/data]]: keyword definitions, configuration, and status constants - [[Module:etymon/tree]]: etymology tree rendering - [[Module:etymon/text]]: etymology text generation - [[Module:etymon/categories]]: category generation logic - [[Module:etymon/tracking]]: tracking ]=] local export = {} local __state = { cached_etymon_args = {}, cached_etymon_pages = {}, cached_descendants_checks = {}, senseid_parent_etymon = {}, available_etymon_ids = {}, single_etymons = {}, entry_title = nil, entry_lang_code = nil, current_page_has_inline_etymology = false, current_page_has_redundant_etymology = false, used_idless_etymon = false, toplevel_has_inline_etymology = false, toplevel_redundant_etymology = false, toplevel_idless_etymon = false, has_mismatched_id = false, linked_page_multiple_etymons_idless = false, linked_page_partial_etymology_sections = false, partial_etymology_targets = {}, skip_partial_etymology_category = false, max_depth_reached = 0, total_nodes = 0, language_count = {}, toplevel_keyword_stats = {}, id_stats = nil, warnings = {}, } local function reset_invocation_state() __state.current_page_has_inline_etymology = false __state.current_page_has_redundant_etymology = false __state.used_idless_etymon = false __state.toplevel_has_inline_etymology = false __state.toplevel_redundant_etymology = false __state.toplevel_idless_etymon = false __state.has_mismatched_id = false __state.linked_page_multiple_etymons_idless = false __state.linked_page_partial_etymology_sections = false __state.max_depth_reached = 0 __state.total_nodes = 0 __state.language_count = {} __state.toplevel_keyword_stats = {} __state.warnings = {} end local M = require("Module:module loader").init({ require = { data = "Module:etymon/data", tree = "Module:etymon/tree", text = "Module:etymon/text", categories = "Module:etymon/categories", tracking = "Module:etymon/tracking", descendants = "Module:etymon/descendants", anchors = "Module:anchors", etydate = "Module:etydate", etymology = "Module:etymology", families = "Module:families", languages = "Module:languages", languages_errorgetby = "Module:languages/errorGetBy", links = "Module:links", pages = "Module:pages", parameters = "Module:parameters", string_utilities = "Module:string utilities", template_parser = "Module:template parser", utilities = "Module:utilities", debug = "Module:debug", en_utilities = "Module:en-utilities", parse_utilities = "Module:parse utilities", references = "Module:references", template_styles = "Module:TemplateStyles", script_utilities = "Module:script utilities", JSON = "Module:JSON", yesno = "Module:yesno", }, loadData = { headword_data = "Module:headword/data", parameters_data = "Module:parameters/data", text_allowed = "Module:etymon/data/text_allowed", }, }) -- Template names that carry etymon data, and the heading that opens an etymology section. -- Pages are scraped for these, so both must match what ku.wiktionary actually uses: -- the section is "Etîmolojî", and the new template is "etîmon". -- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which -- this module would misparse into garbage node labels. Add "etymon" here only once -- Şablon:etymon itself invokes this module. local ETYMON_TEMPLATES = { ["etîmon"] = true, ["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out -- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax: -- this module would read those calls and parse the bare keyword ("inh") as a term. } local ETYMOLOGY_HEADING = "^Etîmolojî" -- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses -- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the -- leading "*" that Modul:links requires for reconstructed languages. local RECONSTRUCTION_NS_NAME = "Jinûvesazî" local RECONSTRUCTION_NS_ID = 108 local Util = {} function Util.format_error(message, preview_only) if preview_only and not M.pages.is_preview() then return nil end return '<span class="error">' .. message .. '</span>' end function Util.add_warning(message, preview_only) local formatted = Util.format_error(message, preview_only) if formatted then table.insert(__state.warnings, formatted) end end function Util.is_text_param_allowed_for_lang(lang) if not lang or type(lang) ~= "table" then return false end local types = lang.getTypes and lang:getTypes() if types and types.family then local code = lang.getCode and lang:getCode() return code and M.text_allowed.families[code] == true end local full_code = lang.getFullCode and lang:getFullCode() if full_code and M.text_allowed.langs[full_code] then return true end if lang.inFamily then for family_code in pairs(M.text_allowed.families) do if lang:inFamily(family_code) then return true end end end return false end function Util.get_lang(code, no_error) if no_error then return M.languages.getByCode(code, nil, true) end return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true) end -- Match a term language against a text=:lang stop target (supports etymology-only codes). function Util.lang_matches_stop_code(term_lang, stop_code) if not term_lang or not stop_code or stop_code == "" then return false end local stop_lang = Util.get_lang(stop_code, true) if not stop_lang then return false end if term_lang:getCode() == stop_lang:getCode() then return true end if stop_lang:getFullCode() == stop_lang:getCode() then return term_lang:getFullCode() == stop_lang:getCode() end return false end function Util.get_family(code) return M.families.getByCode(code) end function Util.get_lang_exception(lang) -- Families have no language-specific exceptions if lang.getTypes and lang:getTypes().family then return nil end local code = lang:getCode() local lang_exceptions = M.data.config.lang_exceptions if lang_exceptions[code] then return lang_exceptions[code] end for norm_code, exc in pairs(lang_exceptions) do if exc.normalize_to and code == exc.normalize_to then return exc end if exc.normalize_from_families then local should_normalize = false for _, family in ipairs(exc.normalize_from_families) do if lang:inFamily(family) then should_normalize = true break end end if should_normalize and exc.normalize_exclude_families then for _, family in ipairs(exc.normalize_exclude_families) do if lang:inFamily(family) then should_normalize = false break end end end if should_normalize then local ret = {} for k, v in pairs(exc) do ret[k] = v end ret.suppress_tr = nil return ret end end end return nil end function Util.get_norm_lang(lang) local exc = Util.get_lang_exception(lang) if exc and exc.normalize_to then return M.languages.getByCode(exc.normalize_to) end return lang end function Util.resolve_context_lang(lang, node_args) if type(node_args) ~= "table" then return lang end if node_args.status == M.data.STATUS.INLINE then return lang end if not (lang.hasType and lang:hasType("etymology-only")) then return lang end local full = lang.getFull and lang:getFull() if not full or full:getCode() == lang:getCode() then return lang end if full.hasAncestor and full:hasAncestor(lang) then return lang end return full end -- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>) -- This is needed because Module:parse utilities expects boolean modifiers to have explicit values function Util.add_boolean_defaults(str, param_mods) local result = str for name, spec in pairs(param_mods) do if spec.type == "boolean" then -- Replace <name> with <name:1> (but not <name:...> which already has a value) result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>") end end return result end local REQUEST_TEMPLATE_PARAM_MODS = { rfe = { nocat = { type = "boolean" }, sort = {}, y = {}, m = {}, fragment = {}, section = {}, box = { type = "boolean" }, noes = { type = "boolean" }, }, etystub = { nocat = { type = "boolean" }, sort = {}, nocap = { type = "boolean" }, nodot = { type = "boolean" }, }, } function Util.expand_request_template(frame, template_name, param_value, lang_code) local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name] local with_defaults = Util.add_boolean_defaults(param_value, param_mods) local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, { param_mods = param_mods, generate_obj = function(text) if M.yesno(text, false) then return { is_boolean = true } end return { text = text } end, }) local template_args = { [1] = lang_code } for name in pairs(param_mods) do template_args[name] = parsed[name] end if not parsed.is_boolean then template_args[2] = parsed.text end return " " .. frame:expandTemplate({ title = template_name, args = template_args, }) end -- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of -- the module compares against. local POS_ALIASES = { ["reh"] = "root", ["kelîme"] = "word", ["pêşgir"] = "prefix", ["paşgir"] = "suffix", ["navgir"] = "interfix", } function Util.normalize_pos(value) if type(value) ~= "string" then return value end value = mw.text.trim(value) return POS_ALIASES[value] or value end -- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish -- name of `pos`) and the Kurdish values are resolved here. function Util.normalize_raw_etymon_args(args) if args.pos == nil and args.crz ~= nil then args.pos = args.crz end args.pos = Util.normalize_pos(args.pos) return args end -- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms function Util.format_term(term, is_toplevel, opts) opts = opts or {} -- suppress_term (-) returns nil if term.suppress_term then return nil end local lang = term.lang local exc = Util.get_lang_exception(lang) if is_toplevel then local display_text = term.alt or term.title or "" local sc = term.sc or lang:findBestScript(display_text) local bold_text = tostring(mw.html.create("strong") :addClass("selflink") :wikitext(display_text)) return M.script_utilities.tag_text(bold_text, lang, sc, "term") end local link_params = { lang = lang } link_params.term = not term.unknown_term and term.title or nil link_params.alt = term.alt link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil if not (exc and exc.suppress_tr) then link_params.tr = term.tr link_params.ts = term.ts else link_params.suppress_tr = true end link_params.lit = (opts.lit ~= "suppress") and term.lit or nil -- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a -- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a -- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>. local t = (term.t and term.t ~= "") and term.t or nil local id_gloss = (term.id and term.id ~= "") and term.id or nil local gloss = t or id_gloss -- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so -- the tree can put it on its own line. if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then link_params.gloss = gloss end if term.g and term.g ~= "" then local genders = M.string_utilities.split(term.g, ",") for i = 1, #genders do genders[i] = M.string_utilities.trim(genders[i]) end link_params.genders = genders end if opts.pos ~= "suppress" then link_params.pos = term.pos link_params.ng = term.ng end if exc and exc.suppress_tr then link_params.lit = nil end local show_qualifiers if opts.tree_ql ~= "suppress" then if term.q then link_params.q = term.q end if term.qq then link_params.qq = term.qq end if term.l then link_params.l = term.l end if term.ll then link_params.ll = term.ll end show_qualifiers = term.q or term.qq or term.l or term.ll end local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil) if opts.gloss == "separate" then return link, gloss end return link end local __is_content_page_cached function Util.is_content_page() if __is_content_page_cached == nil then __is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle()) end return __is_content_page_cached end local __page_data_cached function Util.get_page_data() if not __page_data_cached then __page_data_cached = M.headword_data.page end return __page_data_cached end -- Extract base keyword from param (without modifiers) local function get_keyword_base(param) if type(param) ~= "string" then return nil end local base = param:match("^:?([^<]+)") or param:gsub("^:", "") return base end local function is_keyword(param, allow_colon_less) if type(param) ~= "string" then return false end local keywords = M.data.keywords if param:sub(1, 1) == ":" then local base = get_keyword_base(param) return keywords[base] ~= nil end if allow_colon_less then local base = get_keyword_base(param) return keywords[base] ~= nil end return false end local function get_keyword(param, allow_colon_less) if type(param) ~= "string" then return nil end local keywords = M.data.keywords if param:sub(1, 1) == ":" then return get_keyword_base(param) end if allow_colon_less then local base = get_keyword_base(param) if keywords[base] then return base end end return nil end local function normalize_keyword(keyword) if keyword:sub(1, 1) == ":" then return keyword end return ":" .. keyword end -- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries local function get_canonical_keyword(keyword) if not keyword then return keyword end return M.data.keyword_canonical[keyword] or keyword end local function is_affix_group_keyword(keyword) local config = keyword and M.data.keywords[keyword] return config and config.affix_categories or false end local function reject_removed_surf_keyword(param) local base = get_keyword_base(param) if base == "surf" then error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).") end end local function copy_keyword_info(source) local copy = {} for k, v in pairs(source) do copy[k] = v end return copy end local function lowercase_glossary_display(text) return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function surf_should_keep_formation_phrase(base) if not base.phrase then return false end if base.glossary then return true end return not (base.phrase == "from" and (base.text == "From" or base.text == "from")) end -- Runtime overrides when <surf> is present on a keyword. local function get_effective_keyword_info(keyword, modifiers) local base = M.data.keywords[keyword] if not base or not modifiers or not modifiers.surf then return base end local effective = copy_keyword_info(base) local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]]," local surf_phrase = "by surface analysis," effective.new_sentence = true effective.invisible = "tree" if surf_should_keep_formation_phrase(base) then effective.phrase = surf_phrase .. " " .. base.phrase if base.text then effective.text = surf_text .. " " .. lowercase_glossary_display(base.text) else effective.text = surf_text .. " " .. base.phrase end else effective.text = surf_text effective.phrase = surf_phrase end return effective end -- Build text/phrase for nominalization with <g:code> (uses data module for codes only). local function get_nominalization_label_for_g(code) if not code or code == "" then return nil end local codes = M.data.nominalization_g_codes local adj = codes[code] if not adj and code:find("-", 1, true) then -- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the -- letters together ("mp"); build the label from the parts. Splitting two-letter codes the -- en.wikt way would mislabel ku codes that are not combinations at all, such as "np" -- (nepersonel). local parts, all_known = {}, true for part in code:gmatch("[^-]+") do local part_adj = codes[part] if part_adj then table.insert(parts, part_adj) else all_known = false end end if all_known and parts[1] then adj = table.concat(parts, " ") end end if not adj then return nil end local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of" local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false) return { text = text, phrase = phrase } end local EtymonParser = {} -- Keyword modifier definitions EtymonParser.keyword_param_mods = { unc = { type = "boolean" }, ref = {}, text = { restrict = { keywords = { "from", "derived" } } }, lit = { restrict = { affix_group = true } }, conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc. g = { restrict = { keywords = { "nominalization" } } }, surf = { type = "boolean" }, senseid = { restrict = { keywords = { "semantic loan" } } }, -- Kurdish names, resolved by resolve_modifier_aliases() below. maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } }, grdk = { alias_of = "conj" }, anlz = { type = "boolean", alias_of = "surf" }, metn = { alias_of = "text", restrict = { keywords = { "from", "derived" } } }, } -- Term modifier definitions EtymonParser.etymon_param_mods = { id = {}, t = {}, tr = {}, ts = {}, q = {}, qq = {}, l = {}, ll = {}, pos = {}, ng = {}, alt = {}, g = {}, ety = {}, lit = {}, unc = { type = "boolean" }, ref = {}, aftype = { restrict = { affix_group = true } }, postype = {}, bor = { type = "boolean", restrict = { affix_group = true } }, slbor = { type = "boolean", restrict = { affix_group = true } }, lbor = { type = "boolean", restrict = { affix_group = true } }, -- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below. -- cuda/t/w/crz are the names ku's own templates already accept; the affix-group -- borrowing flags reuse the Kurdish keyword names. cuda = { alias_of = "alt" }, -- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):", -- so a name containing "î" can never be recognised as a prefix. etimon = { alias_of = "ety" }, w = { alias_of = "t" }, crz = { alias_of = "pos" }, crztip = { alias_of = "postype" }, hrf = { alias_of = "lit" }, nediyar = { type = "boolean", alias_of = "unc" }, deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } }, deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } }, deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } }, } --[==[ Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever sees the canonical set. Called right after the inline modifiers are parsed. ]==] function EtymonParser.resolve_modifier_aliases(obj, param_mods) for name, def in pairs(param_mods) do if def.alias_of and obj[name] ~= nil then if obj[def.alias_of] ~= nil then error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.") end obj[def.alias_of] = obj[name] obj[name] = nil end end return obj end local function get_clean_param_mods(param_mods) local clean = {} for mod_name, mod_def in pairs(param_mods) do clean[mod_name] = {} for key, value in pairs(mod_def) do if key ~= "restrict" and key ~= "alias_of" then clean[mod_name][key] = value end end end return clean end function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods) for mod_name, mod_value in pairs(modifiers) do -- Only check restrictions if the modifier has a non-false/nil value if mod_value then local mod_def = param_mods[mod_name] if mod_def and mod_def.restrict then if mod_def.restrict.affix_group then if not is_affix_group_keyword(current_keyword) then local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).") end elseif mod_def.restrict.keywords then local allowed_keywords = mod_def.restrict.keywords local is_allowed = false for _, allowed_keyword in ipairs(allowed_keywords) do if current_keyword == allowed_keyword then is_allowed = true break end end if not is_allowed then local keyword_list = {} for _, kw in ipairs(allowed_keywords) do table.insert(keyword_list, ":" .. kw) end local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ") if #keyword_list > 2 then -- Replace last comma with "or" keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1") end local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".") end end end end end end local TERM_RULE_DISALLOW = { suppress = { field = "suppress_term", label = "suppressed" }, unknown = { field = "unknown_term", label = "unknown" }, family = { field = "is_family", label = "family" }, } function EtymonParser.check_etymon_limits(count, limits, label, opts) if not limits then return end opts = opts or {} local min_etymons = limits.min_etymons if min_etymons == nil and not opts.skip_default_min then min_etymons = 1 end if min_etymons and count < min_etymons then if min_etymons > 1 then error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.") else error("Detected " .. label .. " with no etymons.") end end if limits.max_etymons and count > limits.max_etymons then local unit = (limits.max_etymons == 1) and "etymon" or "etymons" error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".") end end function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label) label = label or "term" if rules and rules.disallow then local disallowed = {} for _, typ in ipairs(rules.disallow) do local spec = TERM_RULE_DISALLOW[typ] if spec and etymon_data[spec.field] then table.insert(disallowed, spec.label) end end if #disallowed > 0 then error(label .. " does not support " .. mw.text.listToText(disallowed, "or") .. " etymons.") end end if etymon_data.is_family then if rules and rules.family == "disallowed" then error(label .. " does not support family codes" .. (rules.family_suffix or ".")) elseif not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end if rules then if rules.require_term and (not etymon_data.term or etymon_data.term == "") then error(label .. " requires a term for each listed form.") end if rules.entry_lang then if Util.get_norm_lang(etymon_data.lang):getFullCode() ~= Util.get_norm_lang(entry_lang):getFullCode() then error(label .. " terms must be in the entry language (" .. entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.") end end if rules.ancestor_check then M.etymology.check_ancestor(entry_lang, etymon_data.lang) end elseif etymon_data.is_family and not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword) local config = M.data.keywords[keyword] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`") end function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local config = M.data.supplements[supplement_type] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=") end -- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>") function EtymonParser.parse_keyword_modifiers(param) if type(param) ~= "string" then return nil, {} end local base_keyword = get_keyword_base(param) if not base_keyword then return nil, {} end local canonical_keyword = get_canonical_keyword(base_keyword) -- Check if there are any modifiers if not param:find("<", 1, true) then return canonical_keyword, {} end -- Parse modifiers using the same mechanism as etymon parsing local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods) local function generate_obj(ignored) return {} end local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""), { param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods) local modifiers = { unc = parsed.unc or false, ref = parsed.ref, text = parsed.text, lit = parsed.lit, conj = parsed.conj, g = parsed.g, surf = parsed.surf or false, senseid = parsed.senseid, } -- Validate modifiers against restrictions EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods) return canonical_keyword, modifiers end local function normalize_keyword_param(keyword_with_mods) local trimmed = M.string_utilities.trim(keyword_with_mods) reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed)) local base = get_keyword_base(trimmed) if not base or not M.data.keywords[base] then error("Invalid keyword '" .. trimmed .. "' in inline etymology") end local canonical_base = get_canonical_keyword(base) local without_colon = trimmed:gsub("^:", "") local mods_part = without_colon:sub(#base + 1) local kw_param = normalize_keyword(canonical_base .. mods_part) EtymonParser.parse_keyword_modifiers(kw_param) return kw_param end local function get_keyword_mod_names() local names = {} for mod_name in pairs(EtymonParser.keyword_param_mods) do names[mod_name] = true end return names end local function parse_inline_ety_run(ety_string) local body = ety_string or "" if body == "" then error("Empty inline etymology") end local keyword_mod_names = get_keyword_mod_names() local pos = 1 local len = #body local function parse_err(msg) error(msg .. " in inline etymology: '" .. body .. "'") end local function peek_double() return body:sub(pos, pos + 1) == "<<" end local function mod_name_from_unwrapped(unwrapped) return unwrapped:match("^<([^:>]+)") end local function is_keyword_mod(unwrapped) local name = mod_name_from_unwrapped(unwrapped) return name and keyword_mod_names[name] or false end local function read_double_bracket() if not peek_double() then return nil end local start = pos pos = pos + 2 while pos <= len - 1 do if body:sub(pos, pos + 1) == ">>" then local token = body:sub(start, pos + 1) pos = pos + 2 return token, token:sub(2, -2) end pos = pos + 1 end parse_err("Unmatched <<") end local function read_angle_cell() if body:sub(pos, pos) ~= "<" or peek_double() then return nil end local open = pos pos = pos + 1 local depth = 1 local i = pos while i <= len do local ch = body:sub(i, i) if ch == "<" then depth = depth + 1 elseif ch == ">" then depth = depth - 1 if depth == 0 then local inner = body:sub(open + 1, i - 1) pos = i + 1 return inner end end i = i + 1 end parse_err("Unmatched <") end local function read_bare_run() local start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end return body:sub(start, pos - 1) end local function absorb_double_keyword_mods(keyword_str) while peek_double() do local saved = pos local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then keyword_str = keyword_str .. unwrapped else pos = saved break end end return keyword_str end local kw_start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end local keyword = body:sub(kw_start, pos - 1) if keyword:match("^%s*$") then parse_err("Missing keyword") end keyword = absorb_double_keyword_mods(keyword) local cells = {} while pos <= len do if peek_double() then local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword") end table.insert(cells, "+" .. unwrapped) elseif body:sub(pos, pos) == "<" then local inner = read_angle_cell() if inner ~= "" then table.insert(cells, inner) end else local bare = read_bare_run() if bare ~= "" then if bare:sub(1, 1) ~= ":" then parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)") end if not is_keyword(bare, true) then parse_err("Invalid keyword '" .. bare .. "' in inline etymology") end table.insert(cells, absorb_double_keyword_mods(bare)) end end end return { keyword = keyword, cells = cells, } end function EtymonParser.inline_ety_to_pipe(ety_string) local run = parse_inline_ety_run(ety_string) if not run.keyword or run.keyword:match("^%s*$") then return "|" end local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(pipe_parts, normalize_keyword_param(segment)) else table.insert(pipe_parts, segment) end end return "|" .. table.concat(pipe_parts, "|") .. "|" end function EtymonParser.pipe_to_inline_ety(pipe_string) local cells = {} for cell in pipe_string:gmatch("([^|]+)") do if cell ~= "" then table.insert(cells, cell) end end if #cells == 0 then return "" end local inline_parts = {} for index, cell in ipairs(cells) do local base = get_keyword_base(cell) if base and M.data.keywords[base] then local without_colon = cell:gsub("^:", "") local kw_base, mods = without_colon:match("^([^<]+)(.*)$") local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>") if index > 1 then inline_kw = ":" .. inline_kw end table.insert(inline_parts, inline_kw) elseif cell:sub(1, 1) == "+" then local mod = cell:sub(2) if mod:match("^<.->$") then mod = mod:sub(2, -2) end table.insert(inline_parts, "<<" .. mod .. ">>") else table.insert(inline_parts, "<" .. cell .. ">") end end return table.concat(inline_parts, "") end function EtymonParser.parse_inline_ety(ety_string, context_lang) local run = parse_inline_ety_run(ety_string) local keyword = M.string_utilities.trim(run.keyword) reject_removed_surf_keyword(":" .. keyword) if not is_keyword(keyword, true) then error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>") end local args = { context_lang:getCode(), normalize_keyword_param(keyword) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(args, normalize_keyword_param(segment)) else table.insert(args, segment) end end return args end function EtymonParser.parse_etymon(param, context_lang) if is_keyword(param) then return nil end if type(param) ~= "string" then return nil end local lang, rest local is_family = false local before_bracket = param:match("^([^<]*)") or param local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$") if lang_code then local potential_lang = Util.get_lang(lang_code, true) if potential_lang then lang = potential_lang rest = param:sub(#lang_code + 2) else local potential_family = Util.get_family(lang_code) if potential_family then lang = potential_family rest = param:sub(#lang_code + 2) is_family = true else lang = context_lang rest = param end end else lang = context_lang rest = param end M.tracking.track_term(rest) if rest == "" or rest == "+" then return { lang = lang, term = nil, unknown_term = true, is_family = is_family, } end if rest == "-" then return { lang = lang, term = nil, suppress_term = true, is_family = is_family, } end if not rest:find("<", 1, true) then return { lang = lang, term = M.string_utilities.trim(rest), is_family = is_family, } end local term_text = rest:match("^([^<]*)") or "" local is_unknown = (term_text == "" or term_text == "+") local is_suppress = (term_text == "-") local function generate_obj(ignored_term) return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) } end local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods) local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults, { param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods) parsed_obj.postype = Util.normalize_pos(parsed_obj.postype) if parsed_obj.id and parsed_obj.id:match("^!") then parsed_obj.id = parsed_obj.id:sub(2) parsed_obj.override = true end parsed_obj.lang = lang parsed_obj.is_family = is_family if is_unknown then parsed_obj.unknown_term = true elseif is_suppress then parsed_obj.suppress_term = true end return parsed_obj end function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code) -- id is now optional, so only validate if provided if id then if mw.ustring.len(id) < 2 then error("The `id` parameter must have at least two characters.") end if id == title or id == Util.get_page_data().pagename then error("The `id` parameter must not be the same as the page title.") end end local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true } if pos and not valid_pos[pos] then error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").") end local current_keyword = "from" local current_keyword_explicit = false local keyword_etymons = {} local keywords = M.data.keywords local function checkKeyword() local config = keywords[current_keyword] if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then keyword_etymons = {} return end EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`") keyword_etymons = {} end local start_index = starts_with_lang_code and 2 or 1 for i = start_index, #args do local param = args[i] if type(param) ~= "string" then elseif param:sub(1, 1) == ":" and not is_keyword(param) then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif is_keyword(param) then checkKeyword() current_keyword = get_canonical_keyword(get_keyword(param)) current_keyword_explicit = true else local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then table.insert(keyword_etymons, param) EtymonParser.check_keyword_term(etymon_data, lang, current_keyword) -- Check modifier restrictions EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods) -- postype must be "root" or "word" local VALID_POSTYPES = { root = true, word = true } if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").") end if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true) end else table.insert(keyword_etymons, param) end end end checkKeyword() end local DataRetriever = {} local function format_etymon_id_hint(id_data, idx) local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then return '"' .. id .. '"' end if pos and pos ~= "" then return "unnamed (|pos=" .. pos .. "|)" end return "etymon #" .. idx .. " (no |id= on page)" end local function etymon_target_page_link(page, norm_lang) -- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it -- directly. Passing it back through full_link() with a reconstructed language raises an error, -- because the resolved name no longer carries the leading "*" those languages require -- and -- this link is built even when the warning it belongs to is later discarded outside preview. return "[[" .. page .. "]]" end -- Summarize {{etymon}} id slots on a linked page for preview warnings. local function summarize_available_etymon_ids(ids) local id_list = {} local all_idless = true local target_has_idless = false local any_pos = false for i, id_data in ipairs(ids) do local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then all_idless = false else target_has_idless = true end if pos and pos ~= "" then any_pos = true end table.insert(id_list, format_etymon_id_hint(id_data, i)) end return { id_list = id_list, all_idless = all_idless, target_has_idless = target_has_idless, any_pos = any_pos, count = #ids, options_text = mw.text.listToText(id_list), } end local function ambiguous_etymon_suggestion(page_link, summary) if summary.all_idless then if summary.any_pos then return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link .. ", then `<id:identifier>` after the term here. Section order / hints: " .. summary.options_text .. "." end return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)." end return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "." end local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(ids) if is_toplevel and summary.target_has_idless then __state.linked_page_multiple_etymons_idless = true end local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count .. " {{etymon}} templates for " .. lang_name .. ")." Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true) end local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon) return cached_args == M.data.STATUS.MISSING and not parent_etymon and #(__state.available_etymon_ids[base_key] or {}) > 0 end local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) if not is_toplevel or __state.skip_partial_etymology_category then return end if not __state.partial_etymology_targets[base_key] then return end if etymon_data.id and type(cached_args) == "table" then return end __state.linked_page_partial_etymology_sections = true end local function is_nonlemma_etymon_template(template_args) return template_args and M.yesno(template_args.nl, false) end local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {}) local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id .. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "." Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true) end -- Given an etymon data, scrape its page and cache the result in the global state object. function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel) local content = etymon_title:getContent() if not content then __state.cached_etymon_args[key] = M.data.STATUS.REDLINK return end -- Check if the linked page is a redirect. If it is, the template parsing -- code below will be effectively skipped, and `scrape_page` will be called -- again on the redirect target (see the bottom of this function) local lang_section_for_descendants = nil local redirect_target = etymon_title.redirect_target if not redirect_target then -- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language -- name, and this scrape runs on raw wikitext, so the template form has to be tried too. content = M.pages.get_section(content, etymon_lang:getFullName(), 2) or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2) if not content then __state.cached_etymon_args[key] = M.data.STATUS.MISSING return end lang_section_for_descendants = content end local etymon_lang_code = etymon_lang:getFullCode() local lang_page_key = etymon_lang_code .. ":" .. etymon_page local found_templates_for_lang = {} local found_ids = {} local get_node_class = M.template_parser.class_else_type -- Look for all {{etymon}} templates within the page content using the template parser -- This way the same page is never parsed more than once -- Build a map from senseids to their parent etymonids. local active_etymon_args = nil local etymology_section_count = 0 local etymology_sections_with_etymon = 0 local current_etymology_has_etymon = false local current_etymology_has_nonlemma = false local function finalize_current_etymology_section() if etymology_section_count == 0 then return end if current_etymology_has_etymon or current_etymology_has_nonlemma then etymology_sections_with_etymon = etymology_sections_with_etymon + 1 end current_etymology_has_etymon = false current_etymology_has_nonlemma = false end for node in M.template_parser.parse(content):iterate_nodes() do local node_class = get_node_class(node) if node_class == "heading" then -- A new L2 or etymology section acts as a barrier: an {{etymon}} usage -- used previously cannot be the parent of any subsequent senseids. -- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above. if node:get_name():find(ETYMOLOGY_HEADING) then finalize_current_etymology_section() etymology_section_count = etymology_section_count + 1 active_etymon_args = nil end elseif node_class == "template" then local template_name = node:get_name() if ETYMON_TEMPLATES[template_name] then local template_args = Util.normalize_raw_etymon_args(node:get_arguments()) -- Check if this etymon is for our language if template_args[1] == etymon_lang_code then if is_nonlemma_etymon_template(template_args) then if etymology_section_count > 0 then current_etymology_has_nonlemma = true end else if etymology_section_count > 0 then current_etymology_has_etymon = true end table.insert(found_templates_for_lang, template_args) if template_args.id then local etymon_key = lang_page_key .. ":" .. template_args.id __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, template_args.id) active_etymon_args = template_args else -- Store idless etymon with default key local etymon_key = lang_page_key .. ":*" __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, "*") active_etymon_args = template_args end end end elseif active_etymon_args and template_name == "senseid" then local template_args = node:get_arguments() -- This should always be true for proper usages of {{senseid}}. if template_args[1] == etymon_lang_code and template_args[2] then local sense_id_key = lang_page_key .. ":" .. template_args[2] __state.senseid_parent_etymon[sense_id_key] = active_etymon_args __state.cached_etymon_pages[sense_id_key] = tostring(etymon_page) end end end end finalize_current_etymology_section() if lang_section_for_descendants and etymology_section_count > 1 and etymology_sections_with_etymon > 0 and etymology_sections_with_etymon < etymology_section_count then __state.partial_etymology_targets[lang_page_key] = true end if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then M.descendants.cache_page_checks({ lang_section = lang_section_for_descendants, etymon_lang_code = etymon_lang_code, found_templates_for_lang = found_templates_for_lang, entry_title = __state.entry_title, entry_lang_code = __state.entry_lang_code, entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil, cached_descendants_checks = __state.cached_descendants_checks, lang_page_key = lang_page_key, redirected_from = redirected_from, }) end local id_data_list = {} for _, args in ipairs(found_templates_for_lang) do local id = args.id or "*" table.insert(id_data_list, { id = id, pos = args.pos }) end __state.available_etymon_ids[lang_page_key] = id_data_list if #found_templates_for_lang == 1 then __state.single_etymons[lang_page_key] = found_templates_for_lang[1] end if redirected_from and __state.available_etymon_ids[lang_page_key] then __state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {} for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do table.insert(__state.available_etymon_ids[redirected_from], id_data) end end if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then -- All done! return elseif redirect_target and not redirected_from then -- Try scraping the redirect. etymon_page = redirect_target.prefixedText DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel) __state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id] else __state.cached_etymon_args[key] = M.data.STATUS.MISSING end end local function has_linkable_term(etymon_data) if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then return false end local term = etymon_data.term if term == nil or term == "" then return false end return M.string_utilities.trim(term) ~= "" end local function record_term_id_tracking(etymon_data) if not has_linkable_term(etymon_data) then return end local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang) M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page) end -- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name. function DataRetriever.get_etymon_args(etymon_data, is_toplevel) if not has_linkable_term(etymon_data) then return M.data.STATUS.MISSING, nil, nil, nil end local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page if etymon_data.id then local key = base_key .. ":" .. etymon_data.id local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] if cached_args == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel) end cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh -- Get etymon_id from parent if this was resolved via senseid local parent_etymon = __state.senseid_parent_etymon[key] local resolved_etymon_id = parent_etymon and parent_etymon.id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) end end local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon) if mismatched_id and is_toplevel then __state.has_mismatched_id = true M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id) warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id) end maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check else __state.used_idless_etymon = true if is_toplevel then __state.toplevel_idless_etymon = true end if __state.available_etymon_ids[base_key] == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel) end local ids = __state.available_etymon_ids[base_key] or {} local count = #ids -- Try to filter by postype if available and we have multiple candidates if count > 1 and etymon_data.postype then local matching_ids = {} for _, id_data in ipairs(ids) do if id_data.pos == etymon_data.postype then table.insert(matching_ids, id_data) end end if #matching_ids == 1 then local matched_id = matching_ids[1].id local matched_key = base_key .. ":" .. matched_id M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id = matched_id }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id = matched_id }, }) end end local matched_args = __state.cached_etymon_args[matched_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel) return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check end end if count == 1 then local only_id_data = ids[1] local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*" M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id_data = only_id_data }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id_data = only_id_data }, }) end end local single_args = __state.single_etymons[base_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel) return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check elseif count > 1 then M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous") warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel) return M.data.STATUS.AMBIGUOUS, nil, nil, nil else M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing") maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel) return M.data.STATUS.MISSING, nil, nil, nil end end end local function keyword_invisible_in_tree(keyword_info) if not keyword_info then return false end local inv = keyword_info.invisible return inv == "all" or inv == true or inv == "tree" end -- True when the node has at least one top-level child container visible in the tree. local function node_has_visible_tree_children(node) for _, container in ipairs(node.children or {}) do if not keyword_invisible_in_tree(container.keyword_info) then return true end end return false end -- Count visible term nodes in the tree. local function get_visible_tree_depth(node, skip_child_rendering) local max_depth = 1 if skip_child_rendering or not node then return max_depth end for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if not keyword_invisible_in_tree(keyword_info) then local skip_grandchildren = keyword_info and keyword_info.no_child_categories for _, term in ipairs(container.terms or {}) do if term.is_duplicate then if term.original_has_children then max_depth = math.max(max_depth, 2) end else max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren)) end end end end return max_depth end local function as_param_list(val) if val == nil then return {} end if type(val) == "table" then return val end if type(val) == "string" and val ~= "" then return { val } end return {} end local TreeBuilder = {} local function parse_etymon_references(refs_text) if not refs_text or refs_text == "" then return "" end return M.references.parse_references(refs_text) end local function parse_tree_references(node) if node.ref then node.parsed_ref = parse_etymon_references(node.ref) end if node.children then for _, container in ipairs(node.children) do if container.terms then for _, term in ipairs(container.terms) do parse_tree_references(term) end end end end if node.supplements then for _, supplement in ipairs(node.supplements) do if supplement.terms then for _, term in ipairs(supplement.terms) do parse_tree_references(term) end end end end end -- Build a unique key for deduplication in the seen table function TreeBuilder.build_key(lang, title, args) local norm_lang_code = Util.get_norm_lang(lang):getFullCode() local is_table = type(args) == "table" local id = (is_table and args.id) or "" if title then return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id end if is_table and args.status == M.data.STATUS.INLINE then local content_parts = {} for i = 1, #args do content_parts[i] = tostring(args[i]) end return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0") end return norm_lang_code .. ":*:" .. id end -- Copy parsed etymon modifiers onto a tree/supplement term node. function TreeBuilder.apply_etymon_fields(term, etymon_data) -- A reference without <id:> still resolves when the target page has a single etymon, and the -- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows -- the target's id as the gloss without every reference having to repeat it. An explicit -- <id:...> still wins. term.id = etymon_data.id or term.id term.t = etymon_data.t term.tr = etymon_data.tr term.ts = etymon_data.ts term.alt = etymon_data.alt term.g = etymon_data.g term.pos = etymon_data.pos term.ng = etymon_data.ng term.ref = etymon_data.ref term.is_uncertain = etymon_data.unc term.lit = etymon_data.lit term.q = etymon_data.q term.qq = etymon_data.qq term.l = etymon_data.l term.ll = etymon_data.ll term.suppress_term = etymon_data.suppress_term term.unknown_term = etymon_data.unknown_term term.is_family = etymon_data.is_family term.override = etymon_data.override term.aftype = etymon_data.aftype term.postype = etymon_data.postype term.bor = etymon_data.bor term.lbor = etymon_data.lbor term.slbor = etymon_data.slbor end function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type) EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local term = { lang = etymon_data.lang, title = etymon_data.term, children = {}, status = M.data.STATUS.OK, } TreeBuilder.apply_etymon_fields(term, etymon_data) return term end function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) local terms = {} for _, term_param in ipairs(as_param_list(param_value)) do if type(term_param) == "string" and term_param ~= "" then local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang) if etymon_data then table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)) end end end return terms end -- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=). function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value) local config = M.data.supplements[supplement_type] if not config then error("Unknown supplement '" .. tostring(supplement_type) .. "'.") end local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) if #terms == 0 then return end data_tree.supplements = data_tree.supplements or {} table.insert(data_tree.supplements, { type = supplement_type, config = config, terms = terms, }) M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true) end function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion) seen = seen or {} depth = depth or 0 local is_toplevel = (depth == 0) if depth > __state.max_depth_reached then __state.max_depth_reached = depth end __state.total_nodes = __state.total_nodes + 1 local lang_code = lang:getCode() __state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1 local current_id = (type(args) == "table" and args.id) or "" local key = TreeBuilder.build_key(lang, title, args) local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK } if type(args) ~= "table" or seen[key] then node.status = args or M.data.STATUS.MISSING -- Mark as duplicate if we've seen this node before if seen[key] then node.is_duplicate = true node.duplicate_key = key local original_node = seen[key] if type(original_node) == "table" and original_node.children and #original_node.children > 0 then node.original_has_children = true end end return node end node.status = args.status or M.data.STATUS.OK seen[key] = node -- If stop_recursion is set, skip parsing children but check for visible children if stop_recursion then local keywords = M.data.keywords local has_visible_children = false for i = 2, #args do local param = args[i] if type(param) == "string" then local keyword_base = get_keyword_base(param) if keyword_base and keywords[keyword_base] then local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param)) if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then has_visible_children = true break end elseif param:sub(1, 1) ~= ":" then -- It's a term (not a keyword), so there are visible children has_visible_children = true break end end end node.has_visible_children = has_visible_children return node end -- Parse args into keyword containers local current_keyword = "from" local current_keyword_modifiers = {} local current_container = nil local function ensure_container() if not current_container or current_container.keyword ~= current_keyword then local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers) current_container = { keyword = current_keyword, keyword_info = keyword_info, keyword_modifiers = current_keyword_modifiers, terms = {}, } table.insert(node.children, current_container) -- Override keyword text/phrase for nominalization with <g:code> if current_keyword_modifiers.g and current_keyword == "nominalization" then local labels = get_nominalization_label_for_g(current_keyword_modifiers.g) if not labels then local codes = {} for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end table.sort(codes) error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", ")) end current_container.keyword_info = copy_keyword_info(keyword_info) current_container.keyword_info.text = labels.text current_container.keyword_info.phrase = labels.phrase end end return current_container end local parse_context_lang = Util.resolve_context_lang(lang, args) for i = 2, #args do local param = args[i] if is_keyword(param) then local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param) if not keyword then error("Invalid keyword '" .. param .. "'.") end current_keyword = keyword current_keyword_modifiers = modifiers current_container = nil -- Force new container for new keyword elseif type(param) == "string" and param:sub(1, 1) == ":" then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif type(param) == "string" then local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang) if etymon_data then -- Track keyword usage at top level M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel) local term_node = {} local container -- Handle suppress_term (-) and unknown_term (empty or +) directly if etymon_data.suppress_term or etymon_data.unknown_term then container = ensure_container() if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1) else term_node = { lang = etymon_data.lang, children = {}, status = M.data.STATUS.OK, } end TreeBuilder.apply_etymon_fields(term_node, etymon_data) else -- Regular term: fetch arguments from page record_term_id_tracking(etymon_data) local etymon_args, page_of, resolved_etymon_id, descendants_check = DataRetriever.get_etymon_args(etymon_data, is_toplevel) -- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing if etymon_data.ety then if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then __state.current_page_has_inline_etymology = true if is_toplevel then __state.toplevel_has_inline_etymology = true end local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) -- Track inline ety keywords too local inline_keyword = get_keyword(inline_args[2], true) if inline_keyword and #inline_args >= 3 then local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang) if inline_etymon then M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel) end end inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE etymon_args = inline_args term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent else -- Scraped arguments exist, <ety> is redundant and ignored __state.current_page_has_redundant_etymology = true if is_toplevel then __state.toplevel_redundant_etymology = true end end end -- Ensure container exists before checking keyword info container = ensure_container() -- Check if current keyword has no_child_categories - if so, stop recursion local keyword_info = container.keyword_info local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories)) term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion) term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() .. ":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang) term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid term_node.page_of = page_of TreeBuilder.apply_etymon_fields(term_node, etymon_data) term_node.missing_descendants_header, term_node.missing_descendants_entry = M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check) end table.insert(container.terms, term_node) end end end return node end -- Convert etymology tree to JSON-serializable table local function tree_to_json(node) local obj = { term = node.title, lang = node.lang:getCode(), lang_name = node.lang:getCanonicalName(), id = (node.id and node.id ~= "") and node.id or nil, status = node.status, is_uncertain = node.is_uncertain or nil, is_duplicate = node.is_duplicate or nil, gloss = node.t, transliteration = node.tr, transcription = node.ts, alt = node.alt, g = node.g, pos = node.pos, ng = node.ng, children = {}, } for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if keyword_info then local container_obj = { keyword = container.keyword, keyword_label = keyword_info.text, keyword_abbrev = keyword_info.abbrev, is_group = keyword_info.is_group or nil, is_invisible = keyword_info.invisible or nil, is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil, terms = {}, } for _, term in ipairs(container.terms or {}) do table.insert(container_obj.terms, tree_to_json(term)) end table.insert(obj.children, container_obj) end end return obj end -- Build and return the etymology data tree for a given term. function export.get_tree(lang, title, args, options) options = options or {} __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() __state.skip_partial_etymology_category = options.skip_partial_etymology_category == true if options.validate then EtymonParser.validate(lang, args, options.id, title, options.pos, false) end local lang_code = lang:getCode() local start_index = (args[1] == lang_code) and 2 or 1 local tree_args = { [1] = lang_code, id = options.id or args.id } for i = start_index, #args do table.insert(tree_args, args[i]) end __state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args local ety_data_tree = TreeBuilder.build(lang, title, tree_args) parse_tree_references(ety_data_tree) if options.json then return M.JSON.toJSON(tree_to_json(ety_data_tree)) end return ety_data_tree end -- Given a language code, page name and optionally the id= parameter, -- render the tree and only the etymology tree for the relevant page. -- Fetches and parses the corresponding {{etymon}} from the requested page, -- and any further pages needed to render the tree. -- Parameters can be passed either through the #invoke or as -- template parameters *through* an #invoke. function export.render_tree_for_etymon_on_page(frame) local frame_args = frame.args local parent_args = frame:getParent().args local langcode = frame_args[1] or parent_args[1] local pagename = frame_args[2] or parent_args[2] local id = frame_args["id"] or parent_args["id"] local display_title = frame_args["title"] or parent_args["title"] local parsed_title = mw.title.new(pagename, 0) local title if parsed_title.namespace == 0 then title = M.pages.safe_page_name(parsed_title) elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then title = "*" .. M.pages.safe_page_name(parsed_title) else error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace) end local lang = Util.get_lang(langcode) __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() -- Construct etymon_data for DataRetriever.get_args. local etymon_data = { lang = lang, term = title, id = id } local args, pagename = DataRetriever.get_etymon_args(etymon_data, true) if args == M.data.STATUS.MISSING then error("The etymon template was not found (language " .. langcode .. ", title '" .. title .. "'" .. (id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.") end local tree_title = display_title or title if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then M.tracking.track_title_pagename_mismatch(lang) end reset_invocation_state() local ety_data_tree = export.get_tree(lang, tree_title, args, { validate = true, id = id, }) local output = {} table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) return table.concat(output) end function export.main(frame) local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, M.parameters_data.etymon) args.pos = Util.normalize_pos(args.pos) local lang = args[1] local etymon_args = args[2] local id = args.id local title = args.title local text = args.text local tree = args.tree local etydate = args.etydate local doublet = args.doublet local rfe = args.rfe local etystub = args.etystub local is_nonlemma = M.yesno(args.nl, false) local page_data = Util.get_page_data() if not title then title = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end end local entry_pagename = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then entry_pagename = "*" .. entry_pagename end if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then M.tracking.track_title_pagename_mismatch(lang) end local current_L2 = M.pages.get_current_L2() if current_L2 then local norm_lang = Util.get_norm_lang(lang) local norm_name = norm_lang:getCanonicalName() if current_L2 ~= norm_name then local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if norm_lang:getCode() ~= lang:getCode() then lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")" end error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").") end end reset_invocation_state() local ety_data_tree = export.get_tree(lang, title, etymon_args, { validate = true, pos = args.pos, id = id, json = args.json, skip_partial_etymology_category = is_nonlemma, }) if args.json then return ety_data_tree end local output = {} local text_allowlist_mode = M.text_allowed.default_mode or "off" if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() .. "; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter." if text_allowlist_mode == "error" then error(msg) else Util.add_warning(msg, true) end end local lang_exc = Util.get_lang_exception(lang) if lang_exc and lang_exc.disallow then local disallow = lang_exc.disallow local error_text = " for " .. lang:getFullName() if disallow.ref then error_text = error_text .. "; see " .. disallow.ref else error_text = error_text .. "." end if tree and disallow.tree then error("Etymology trees are not allowed" .. error_text) end if text and disallow.text then error("Etymology texts are not allowed" .. error_text) end end if etydate then local etydate_param_mods = { ref = { list = true, type = "references", allow_holes = true }, refn = { list = true, allow_holes = true }, nocap = { type = "boolean" }, } local function generate_etydate_obj(etydate_text) local etydate_specs = {} for spec in etydate_text:gmatch("[^,]+") do table.insert(etydate_specs, mw.text.trim(spec)) end return { [1] = etydate_specs } end local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj }) local etydate_args = { [1] = parsed_etydate[1], nocap = parsed_etydate.nocap or false, } ety_data_tree.supplements = ety_data_tree.supplements or {} table.insert(ety_data_tree.supplements, { type = "etydate", etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }), etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil, }) end TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet) if ety_data_tree.supplements then parse_tree_references(ety_data_tree) end local has_visible_children = node_has_visible_tree_children(ety_data_tree) -- Suppress trees for multiword entries and one-step chains local visible_tree_depth = get_visible_tree_depth(ety_data_tree) local is_trivial_tree = visible_tree_depth <= 2 local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil if tree and (is_multiword or is_trivial_tree) then tree = false end if tree then table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) end local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree)) local anchor = M.anchors.etymonid(lang, id, { no_tree = args.notree, title = title, empty_tree = (not has_visible_children) or tree_disallowed, ety_tree_json = ety_tree_json, }) table.insert(output, anchor) local text_stop_lang_missing = nil if text then local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink if text == "++" then max_depth, stop_at_blue_link = false, false elseif text == "+" then max_depth, stop_at_blue_link = 1, false elseif text == "*" then max_depth, stop_at_blue_link = false, true elseif text:match("^:[^*]+%*$") then -- Stop at a specific language OR first bluelink after it, e.g., ":ota*" -- If the target language is a redlink, continue to the first bluelink local lang_code = text:match("^:([^*]+)%*$") if lang_code and lang_code ~= "" then local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang_or_bluelink = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end elseif text:sub(1, 1) == ":" then -- Stop at a specific language, e.g., ":ar" stops at first Arabic term local lang_code = text:sub(2) if lang_code ~= "" then -- Validate the language code local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else local num = tonumber(text) if num and num >= 1 then max_depth, stop_at_blue_link = num, false else error('Invalid text value "' .. text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)') end end local text_output, text_render_meta = M.text.render({ data_tree = ety_data_tree, format_term_func = Util.format_term, lang_matches_stop_code = Util.lang_matches_stop_code, max_depth = max_depth, stop_at_blue_link = stop_at_blue_link, curr_page = page_data.pagename, nodot = args.nodot, dot = args.dot, stop_at_lang = stop_at_lang, stop_at_lang_or_bluelink = stop_at_lang_or_bluelink, }) table.insert(output, text_output) if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then M.tracking.track_text_stop_lang_missing(lang, stop_at_lang) text_stop_lang_missing = stop_at_lang end end if rfe then table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode())) end if etystub then table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode())) end if is_nonlemma then table.insert(output, " " .. frame:expandTemplate({ title = "nonlemma", args = {}, })) end local categories = {} if Util.is_content_page() then M.tracking.track_tree_metrics({ max_depth_reached = __state.max_depth_reached, total_nodes = __state.total_nodes, language_count = __state.language_count, lang = lang, }) categories = M.categories.build({ data_tree = ety_data_tree, page_lang = lang, available_etymon_ids = __state.available_etymon_ids, senseid_parent_etymon = __state.senseid_parent_etymon, get_norm_lang_func = Util.get_norm_lang, lang_exc = lang_exc, suppress_categories = lang_exc and lang_exc.suppress_categories, nocat = args.nocat, tree = tree, text = text, exnihilo = args.exnihilo, toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology, toplevel_redundant_etymology = __state.toplevel_redundant_etymology, toplevel_idless_etymon = __state.toplevel_idless_etymon, has_mismatched_id = __state.has_mismatched_id, linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless, linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections, text_stop_lang_missing = text_stop_lang_missing, }) M.tracking.track_keywords(__state.toplevel_keyword_stats, lang) M.tracking.track_page_id(lang, id) M.tracking.track_ids(__state.id_stats, lang) end if #categories > 0 then table.insert(output, M.categories.format(categories, lang)) end if __state.warnings then for i, warning in ipairs(__state.warnings) do table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n") end end return table.concat(output) end return export bbnxhy9wlfwad1q8o7d3a58o7n3gta0 6533208 6532082 2026-09-19T10:37:02Z Wikihez 7344 Accept <c:> and <z:> for gender, the names ku's own templates use, as aliases of <g:> 6533208 Scribunto text/plain --[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Authors: - Original implementation: [[User:Ioaxxere]] - Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]]) Modules: - [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping - [[Module:etymon/data]]: keyword definitions, configuration, and status constants - [[Module:etymon/tree]]: etymology tree rendering - [[Module:etymon/text]]: etymology text generation - [[Module:etymon/categories]]: category generation logic - [[Module:etymon/tracking]]: tracking ]=] local export = {} local __state = { cached_etymon_args = {}, cached_etymon_pages = {}, cached_descendants_checks = {}, senseid_parent_etymon = {}, available_etymon_ids = {}, single_etymons = {}, entry_title = nil, entry_lang_code = nil, current_page_has_inline_etymology = false, current_page_has_redundant_etymology = false, used_idless_etymon = false, toplevel_has_inline_etymology = false, toplevel_redundant_etymology = false, toplevel_idless_etymon = false, has_mismatched_id = false, linked_page_multiple_etymons_idless = false, linked_page_partial_etymology_sections = false, partial_etymology_targets = {}, skip_partial_etymology_category = false, max_depth_reached = 0, total_nodes = 0, language_count = {}, toplevel_keyword_stats = {}, id_stats = nil, warnings = {}, } local function reset_invocation_state() __state.current_page_has_inline_etymology = false __state.current_page_has_redundant_etymology = false __state.used_idless_etymon = false __state.toplevel_has_inline_etymology = false __state.toplevel_redundant_etymology = false __state.toplevel_idless_etymon = false __state.has_mismatched_id = false __state.linked_page_multiple_etymons_idless = false __state.linked_page_partial_etymology_sections = false __state.max_depth_reached = 0 __state.total_nodes = 0 __state.language_count = {} __state.toplevel_keyword_stats = {} __state.warnings = {} end local M = require("Module:module loader").init({ require = { data = "Module:etymon/data", tree = "Module:etymon/tree", text = "Module:etymon/text", categories = "Module:etymon/categories", tracking = "Module:etymon/tracking", descendants = "Module:etymon/descendants", anchors = "Module:anchors", etydate = "Module:etydate", etymology = "Module:etymology", families = "Module:families", languages = "Module:languages", languages_errorgetby = "Module:languages/errorGetBy", links = "Module:links", pages = "Module:pages", parameters = "Module:parameters", string_utilities = "Module:string utilities", template_parser = "Module:template parser", utilities = "Module:utilities", debug = "Module:debug", en_utilities = "Module:en-utilities", parse_utilities = "Module:parse utilities", references = "Module:references", template_styles = "Module:TemplateStyles", script_utilities = "Module:script utilities", JSON = "Module:JSON", yesno = "Module:yesno", }, loadData = { headword_data = "Module:headword/data", parameters_data = "Module:parameters/data", text_allowed = "Module:etymon/data/text_allowed", }, }) -- Template names that carry etymon data, and the heading that opens an etymology section. -- Pages are scraped for these, so both must match what ku.wiktionary actually uses: -- the section is "Etîmolojî", and the new template is "etîmon". -- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which -- this module would misparse into garbage node labels. Add "etymon" here only once -- Şablon:etymon itself invokes this module. local ETYMON_TEMPLATES = { ["etîmon"] = true, ["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out -- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax: -- this module would read those calls and parse the bare keyword ("inh") as a term. } local ETYMOLOGY_HEADING = "^Etîmolojî" -- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses -- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the -- leading "*" that Modul:links requires for reconstructed languages. local RECONSTRUCTION_NS_NAME = "Jinûvesazî" local RECONSTRUCTION_NS_ID = 108 local Util = {} function Util.format_error(message, preview_only) if preview_only and not M.pages.is_preview() then return nil end return '<span class="error">' .. message .. '</span>' end function Util.add_warning(message, preview_only) local formatted = Util.format_error(message, preview_only) if formatted then table.insert(__state.warnings, formatted) end end function Util.is_text_param_allowed_for_lang(lang) if not lang or type(lang) ~= "table" then return false end local types = lang.getTypes and lang:getTypes() if types and types.family then local code = lang.getCode and lang:getCode() return code and M.text_allowed.families[code] == true end local full_code = lang.getFullCode and lang:getFullCode() if full_code and M.text_allowed.langs[full_code] then return true end if lang.inFamily then for family_code in pairs(M.text_allowed.families) do if lang:inFamily(family_code) then return true end end end return false end function Util.get_lang(code, no_error) if no_error then return M.languages.getByCode(code, nil, true) end return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true) end -- Match a term language against a text=:lang stop target (supports etymology-only codes). function Util.lang_matches_stop_code(term_lang, stop_code) if not term_lang or not stop_code or stop_code == "" then return false end local stop_lang = Util.get_lang(stop_code, true) if not stop_lang then return false end if term_lang:getCode() == stop_lang:getCode() then return true end if stop_lang:getFullCode() == stop_lang:getCode() then return term_lang:getFullCode() == stop_lang:getCode() end return false end function Util.get_family(code) return M.families.getByCode(code) end function Util.get_lang_exception(lang) -- Families have no language-specific exceptions if lang.getTypes and lang:getTypes().family then return nil end local code = lang:getCode() local lang_exceptions = M.data.config.lang_exceptions if lang_exceptions[code] then return lang_exceptions[code] end for norm_code, exc in pairs(lang_exceptions) do if exc.normalize_to and code == exc.normalize_to then return exc end if exc.normalize_from_families then local should_normalize = false for _, family in ipairs(exc.normalize_from_families) do if lang:inFamily(family) then should_normalize = true break end end if should_normalize and exc.normalize_exclude_families then for _, family in ipairs(exc.normalize_exclude_families) do if lang:inFamily(family) then should_normalize = false break end end end if should_normalize then local ret = {} for k, v in pairs(exc) do ret[k] = v end ret.suppress_tr = nil return ret end end end return nil end function Util.get_norm_lang(lang) local exc = Util.get_lang_exception(lang) if exc and exc.normalize_to then return M.languages.getByCode(exc.normalize_to) end return lang end function Util.resolve_context_lang(lang, node_args) if type(node_args) ~= "table" then return lang end if node_args.status == M.data.STATUS.INLINE then return lang end if not (lang.hasType and lang:hasType("etymology-only")) then return lang end local full = lang.getFull and lang:getFull() if not full or full:getCode() == lang:getCode() then return lang end if full.hasAncestor and full:hasAncestor(lang) then return lang end return full end -- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>) -- This is needed because Module:parse utilities expects boolean modifiers to have explicit values function Util.add_boolean_defaults(str, param_mods) local result = str for name, spec in pairs(param_mods) do if spec.type == "boolean" then -- Replace <name> with <name:1> (but not <name:...> which already has a value) result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>") end end return result end local REQUEST_TEMPLATE_PARAM_MODS = { rfe = { nocat = { type = "boolean" }, sort = {}, y = {}, m = {}, fragment = {}, section = {}, box = { type = "boolean" }, noes = { type = "boolean" }, }, etystub = { nocat = { type = "boolean" }, sort = {}, nocap = { type = "boolean" }, nodot = { type = "boolean" }, }, } function Util.expand_request_template(frame, template_name, param_value, lang_code) local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name] local with_defaults = Util.add_boolean_defaults(param_value, param_mods) local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, { param_mods = param_mods, generate_obj = function(text) if M.yesno(text, false) then return { is_boolean = true } end return { text = text } end, }) local template_args = { [1] = lang_code } for name in pairs(param_mods) do template_args[name] = parsed[name] end if not parsed.is_boolean then template_args[2] = parsed.text end return " " .. frame:expandTemplate({ title = template_name, args = template_args, }) end -- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of -- the module compares against. local POS_ALIASES = { ["reh"] = "root", ["kelîme"] = "word", ["pêşgir"] = "prefix", ["paşgir"] = "suffix", ["navgir"] = "interfix", } function Util.normalize_pos(value) if type(value) ~= "string" then return value end value = mw.text.trim(value) return POS_ALIASES[value] or value end -- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish -- name of `pos`) and the Kurdish values are resolved here. function Util.normalize_raw_etymon_args(args) if args.pos == nil and args.crz ~= nil then args.pos = args.crz end args.pos = Util.normalize_pos(args.pos) return args end -- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms function Util.format_term(term, is_toplevel, opts) opts = opts or {} -- suppress_term (-) returns nil if term.suppress_term then return nil end local lang = term.lang local exc = Util.get_lang_exception(lang) if is_toplevel then local display_text = term.alt or term.title or "" local sc = term.sc or lang:findBestScript(display_text) local bold_text = tostring(mw.html.create("strong") :addClass("selflink") :wikitext(display_text)) return M.script_utilities.tag_text(bold_text, lang, sc, "term") end local link_params = { lang = lang } link_params.term = not term.unknown_term and term.title or nil link_params.alt = term.alt link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil if not (exc and exc.suppress_tr) then link_params.tr = term.tr link_params.ts = term.ts else link_params.suppress_tr = true end link_params.lit = (opts.lit ~= "suppress") and term.lit or nil -- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a -- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a -- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>. local t = (term.t and term.t ~= "") and term.t or nil local id_gloss = (term.id and term.id ~= "") and term.id or nil local gloss = t or id_gloss -- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so -- the tree can put it on its own line. if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then link_params.gloss = gloss end if term.g and term.g ~= "" then local genders = M.string_utilities.split(term.g, ",") for i = 1, #genders do genders[i] = M.string_utilities.trim(genders[i]) end link_params.genders = genders end if opts.pos ~= "suppress" then link_params.pos = term.pos link_params.ng = term.ng end if exc and exc.suppress_tr then link_params.lit = nil end local show_qualifiers if opts.tree_ql ~= "suppress" then if term.q then link_params.q = term.q end if term.qq then link_params.qq = term.qq end if term.l then link_params.l = term.l end if term.ll then link_params.ll = term.ll end show_qualifiers = term.q or term.qq or term.l or term.ll end local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil) if opts.gloss == "separate" then return link, gloss end return link end local __is_content_page_cached function Util.is_content_page() if __is_content_page_cached == nil then __is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle()) end return __is_content_page_cached end local __page_data_cached function Util.get_page_data() if not __page_data_cached then __page_data_cached = M.headword_data.page end return __page_data_cached end -- Extract base keyword from param (without modifiers) local function get_keyword_base(param) if type(param) ~= "string" then return nil end local base = param:match("^:?([^<]+)") or param:gsub("^:", "") return base end local function is_keyword(param, allow_colon_less) if type(param) ~= "string" then return false end local keywords = M.data.keywords if param:sub(1, 1) == ":" then local base = get_keyword_base(param) return keywords[base] ~= nil end if allow_colon_less then local base = get_keyword_base(param) return keywords[base] ~= nil end return false end local function get_keyword(param, allow_colon_less) if type(param) ~= "string" then return nil end local keywords = M.data.keywords if param:sub(1, 1) == ":" then return get_keyword_base(param) end if allow_colon_less then local base = get_keyword_base(param) if keywords[base] then return base end end return nil end local function normalize_keyword(keyword) if keyword:sub(1, 1) == ":" then return keyword end return ":" .. keyword end -- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries local function get_canonical_keyword(keyword) if not keyword then return keyword end return M.data.keyword_canonical[keyword] or keyword end local function is_affix_group_keyword(keyword) local config = keyword and M.data.keywords[keyword] return config and config.affix_categories or false end local function reject_removed_surf_keyword(param) local base = get_keyword_base(param) if base == "surf" then error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).") end end local function copy_keyword_info(source) local copy = {} for k, v in pairs(source) do copy[k] = v end return copy end local function lowercase_glossary_display(text) return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function surf_should_keep_formation_phrase(base) if not base.phrase then return false end if base.glossary then return true end return not (base.phrase == "from" and (base.text == "From" or base.text == "from")) end -- Runtime overrides when <surf> is present on a keyword. local function get_effective_keyword_info(keyword, modifiers) local base = M.data.keywords[keyword] if not base or not modifiers or not modifiers.surf then return base end local effective = copy_keyword_info(base) local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]]," local surf_phrase = "by surface analysis," effective.new_sentence = true effective.invisible = "tree" if surf_should_keep_formation_phrase(base) then effective.phrase = surf_phrase .. " " .. base.phrase if base.text then effective.text = surf_text .. " " .. lowercase_glossary_display(base.text) else effective.text = surf_text .. " " .. base.phrase end else effective.text = surf_text effective.phrase = surf_phrase end return effective end -- Build text/phrase for nominalization with <g:code> (uses data module for codes only). local function get_nominalization_label_for_g(code) if not code or code == "" then return nil end local codes = M.data.nominalization_g_codes local adj = codes[code] if not adj and code:find("-", 1, true) then -- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the -- letters together ("mp"); build the label from the parts. Splitting two-letter codes the -- en.wikt way would mislabel ku codes that are not combinations at all, such as "np" -- (nepersonel). local parts, all_known = {}, true for part in code:gmatch("[^-]+") do local part_adj = codes[part] if part_adj then table.insert(parts, part_adj) else all_known = false end end if all_known and parts[1] then adj = table.concat(parts, " ") end end if not adj then return nil end local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of" local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false) return { text = text, phrase = phrase } end local EtymonParser = {} -- Keyword modifier definitions EtymonParser.keyword_param_mods = { unc = { type = "boolean" }, ref = {}, text = { restrict = { keywords = { "from", "derived" } } }, lit = { restrict = { affix_group = true } }, conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc. g = { restrict = { keywords = { "nominalization" } } }, surf = { type = "boolean" }, senseid = { restrict = { keywords = { "semantic loan" } } }, -- Kurdish names, resolved by resolve_modifier_aliases() below. maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } }, grdk = { alias_of = "conj" }, c = { alias_of = "g", restrict = { keywords = { "nominalization" } } }, z = { alias_of = "g", restrict = { keywords = { "nominalization" } } }, anlz = { type = "boolean", alias_of = "surf" }, metn = { alias_of = "text", restrict = { keywords = { "from", "derived" } } }, } -- Term modifier definitions EtymonParser.etymon_param_mods = { id = {}, t = {}, tr = {}, ts = {}, q = {}, qq = {}, l = {}, ll = {}, pos = {}, ng = {}, alt = {}, g = {}, ety = {}, lit = {}, unc = { type = "boolean" }, ref = {}, aftype = { restrict = { affix_group = true } }, postype = {}, bor = { type = "boolean", restrict = { affix_group = true } }, slbor = { type = "boolean", restrict = { affix_group = true } }, lbor = { type = "boolean", restrict = { affix_group = true } }, -- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below. -- cuda/t/w/crz are the names ku's own templates already accept; the affix-group -- borrowing flags reuse the Kurdish keyword names. cuda = { alias_of = "alt" }, -- Gender is "c" (cinsiyet) in ku's own templates, "z" (zayend) in the headword ones. c = { alias_of = "g" }, z = { alias_of = "g" }, -- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):", -- so a name containing "î" can never be recognised as a prefix. etimon = { alias_of = "ety" }, w = { alias_of = "t" }, crz = { alias_of = "pos" }, crztip = { alias_of = "postype" }, hrf = { alias_of = "lit" }, nediyar = { type = "boolean", alias_of = "unc" }, deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } }, deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } }, deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } }, } --[==[ Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever sees the canonical set. Called right after the inline modifiers are parsed. ]==] function EtymonParser.resolve_modifier_aliases(obj, param_mods) for name, def in pairs(param_mods) do if def.alias_of and obj[name] ~= nil then if obj[def.alias_of] ~= nil then error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.") end obj[def.alias_of] = obj[name] obj[name] = nil end end return obj end local function get_clean_param_mods(param_mods) local clean = {} for mod_name, mod_def in pairs(param_mods) do clean[mod_name] = {} for key, value in pairs(mod_def) do if key ~= "restrict" and key ~= "alias_of" then clean[mod_name][key] = value end end end return clean end function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods) for mod_name, mod_value in pairs(modifiers) do -- Only check restrictions if the modifier has a non-false/nil value if mod_value then local mod_def = param_mods[mod_name] if mod_def and mod_def.restrict then if mod_def.restrict.affix_group then if not is_affix_group_keyword(current_keyword) then local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).") end elseif mod_def.restrict.keywords then local allowed_keywords = mod_def.restrict.keywords local is_allowed = false for _, allowed_keyword in ipairs(allowed_keywords) do if current_keyword == allowed_keyword then is_allowed = true break end end if not is_allowed then local keyword_list = {} for _, kw in ipairs(allowed_keywords) do table.insert(keyword_list, ":" .. kw) end local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ") if #keyword_list > 2 then -- Replace last comma with "or" keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1") end local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".") end end end end end end local TERM_RULE_DISALLOW = { suppress = { field = "suppress_term", label = "suppressed" }, unknown = { field = "unknown_term", label = "unknown" }, family = { field = "is_family", label = "family" }, } function EtymonParser.check_etymon_limits(count, limits, label, opts) if not limits then return end opts = opts or {} local min_etymons = limits.min_etymons if min_etymons == nil and not opts.skip_default_min then min_etymons = 1 end if min_etymons and count < min_etymons then if min_etymons > 1 then error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.") else error("Detected " .. label .. " with no etymons.") end end if limits.max_etymons and count > limits.max_etymons then local unit = (limits.max_etymons == 1) and "etymon" or "etymons" error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".") end end function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label) label = label or "term" if rules and rules.disallow then local disallowed = {} for _, typ in ipairs(rules.disallow) do local spec = TERM_RULE_DISALLOW[typ] if spec and etymon_data[spec.field] then table.insert(disallowed, spec.label) end end if #disallowed > 0 then error(label .. " does not support " .. mw.text.listToText(disallowed, "or") .. " etymons.") end end if etymon_data.is_family then if rules and rules.family == "disallowed" then error(label .. " does not support family codes" .. (rules.family_suffix or ".")) elseif not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end if rules then if rules.require_term and (not etymon_data.term or etymon_data.term == "") then error(label .. " requires a term for each listed form.") end if rules.entry_lang then if Util.get_norm_lang(etymon_data.lang):getFullCode() ~= Util.get_norm_lang(entry_lang):getFullCode() then error(label .. " terms must be in the entry language (" .. entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.") end end if rules.ancestor_check then M.etymology.check_ancestor(entry_lang, etymon_data.lang) end elseif etymon_data.is_family and not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword) local config = M.data.keywords[keyword] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`") end function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local config = M.data.supplements[supplement_type] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=") end -- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>") function EtymonParser.parse_keyword_modifiers(param) if type(param) ~= "string" then return nil, {} end local base_keyword = get_keyword_base(param) if not base_keyword then return nil, {} end local canonical_keyword = get_canonical_keyword(base_keyword) -- Check if there are any modifiers if not param:find("<", 1, true) then return canonical_keyword, {} end -- Parse modifiers using the same mechanism as etymon parsing local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods) local function generate_obj(ignored) return {} end local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""), { param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods) local modifiers = { unc = parsed.unc or false, ref = parsed.ref, text = parsed.text, lit = parsed.lit, conj = parsed.conj, g = parsed.g, surf = parsed.surf or false, senseid = parsed.senseid, } -- Validate modifiers against restrictions EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods) return canonical_keyword, modifiers end local function normalize_keyword_param(keyword_with_mods) local trimmed = M.string_utilities.trim(keyword_with_mods) reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed)) local base = get_keyword_base(trimmed) if not base or not M.data.keywords[base] then error("Invalid keyword '" .. trimmed .. "' in inline etymology") end local canonical_base = get_canonical_keyword(base) local without_colon = trimmed:gsub("^:", "") local mods_part = without_colon:sub(#base + 1) local kw_param = normalize_keyword(canonical_base .. mods_part) EtymonParser.parse_keyword_modifiers(kw_param) return kw_param end local function get_keyword_mod_names() local names = {} for mod_name in pairs(EtymonParser.keyword_param_mods) do names[mod_name] = true end return names end local function parse_inline_ety_run(ety_string) local body = ety_string or "" if body == "" then error("Empty inline etymology") end local keyword_mod_names = get_keyword_mod_names() local pos = 1 local len = #body local function parse_err(msg) error(msg .. " in inline etymology: '" .. body .. "'") end local function peek_double() return body:sub(pos, pos + 1) == "<<" end local function mod_name_from_unwrapped(unwrapped) return unwrapped:match("^<([^:>]+)") end local function is_keyword_mod(unwrapped) local name = mod_name_from_unwrapped(unwrapped) return name and keyword_mod_names[name] or false end local function read_double_bracket() if not peek_double() then return nil end local start = pos pos = pos + 2 while pos <= len - 1 do if body:sub(pos, pos + 1) == ">>" then local token = body:sub(start, pos + 1) pos = pos + 2 return token, token:sub(2, -2) end pos = pos + 1 end parse_err("Unmatched <<") end local function read_angle_cell() if body:sub(pos, pos) ~= "<" or peek_double() then return nil end local open = pos pos = pos + 1 local depth = 1 local i = pos while i <= len do local ch = body:sub(i, i) if ch == "<" then depth = depth + 1 elseif ch == ">" then depth = depth - 1 if depth == 0 then local inner = body:sub(open + 1, i - 1) pos = i + 1 return inner end end i = i + 1 end parse_err("Unmatched <") end local function read_bare_run() local start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end return body:sub(start, pos - 1) end local function absorb_double_keyword_mods(keyword_str) while peek_double() do local saved = pos local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then keyword_str = keyword_str .. unwrapped else pos = saved break end end return keyword_str end local kw_start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end local keyword = body:sub(kw_start, pos - 1) if keyword:match("^%s*$") then parse_err("Missing keyword") end keyword = absorb_double_keyword_mods(keyword) local cells = {} while pos <= len do if peek_double() then local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword") end table.insert(cells, "+" .. unwrapped) elseif body:sub(pos, pos) == "<" then local inner = read_angle_cell() if inner ~= "" then table.insert(cells, inner) end else local bare = read_bare_run() if bare ~= "" then if bare:sub(1, 1) ~= ":" then parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)") end if not is_keyword(bare, true) then parse_err("Invalid keyword '" .. bare .. "' in inline etymology") end table.insert(cells, absorb_double_keyword_mods(bare)) end end end return { keyword = keyword, cells = cells, } end function EtymonParser.inline_ety_to_pipe(ety_string) local run = parse_inline_ety_run(ety_string) if not run.keyword or run.keyword:match("^%s*$") then return "|" end local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(pipe_parts, normalize_keyword_param(segment)) else table.insert(pipe_parts, segment) end end return "|" .. table.concat(pipe_parts, "|") .. "|" end function EtymonParser.pipe_to_inline_ety(pipe_string) local cells = {} for cell in pipe_string:gmatch("([^|]+)") do if cell ~= "" then table.insert(cells, cell) end end if #cells == 0 then return "" end local inline_parts = {} for index, cell in ipairs(cells) do local base = get_keyword_base(cell) if base and M.data.keywords[base] then local without_colon = cell:gsub("^:", "") local kw_base, mods = without_colon:match("^([^<]+)(.*)$") local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>") if index > 1 then inline_kw = ":" .. inline_kw end table.insert(inline_parts, inline_kw) elseif cell:sub(1, 1) == "+" then local mod = cell:sub(2) if mod:match("^<.->$") then mod = mod:sub(2, -2) end table.insert(inline_parts, "<<" .. mod .. ">>") else table.insert(inline_parts, "<" .. cell .. ">") end end return table.concat(inline_parts, "") end function EtymonParser.parse_inline_ety(ety_string, context_lang) local run = parse_inline_ety_run(ety_string) local keyword = M.string_utilities.trim(run.keyword) reject_removed_surf_keyword(":" .. keyword) if not is_keyword(keyword, true) then error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>") end local args = { context_lang:getCode(), normalize_keyword_param(keyword) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(args, normalize_keyword_param(segment)) else table.insert(args, segment) end end return args end function EtymonParser.parse_etymon(param, context_lang) if is_keyword(param) then return nil end if type(param) ~= "string" then return nil end local lang, rest local is_family = false local before_bracket = param:match("^([^<]*)") or param local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$") if lang_code then local potential_lang = Util.get_lang(lang_code, true) if potential_lang then lang = potential_lang rest = param:sub(#lang_code + 2) else local potential_family = Util.get_family(lang_code) if potential_family then lang = potential_family rest = param:sub(#lang_code + 2) is_family = true else lang = context_lang rest = param end end else lang = context_lang rest = param end M.tracking.track_term(rest) if rest == "" or rest == "+" then return { lang = lang, term = nil, unknown_term = true, is_family = is_family, } end if rest == "-" then return { lang = lang, term = nil, suppress_term = true, is_family = is_family, } end if not rest:find("<", 1, true) then return { lang = lang, term = M.string_utilities.trim(rest), is_family = is_family, } end local term_text = rest:match("^([^<]*)") or "" local is_unknown = (term_text == "" or term_text == "+") local is_suppress = (term_text == "-") local function generate_obj(ignored_term) return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) } end local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods) local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults, { param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods) parsed_obj.postype = Util.normalize_pos(parsed_obj.postype) if parsed_obj.id and parsed_obj.id:match("^!") then parsed_obj.id = parsed_obj.id:sub(2) parsed_obj.override = true end parsed_obj.lang = lang parsed_obj.is_family = is_family if is_unknown then parsed_obj.unknown_term = true elseif is_suppress then parsed_obj.suppress_term = true end return parsed_obj end function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code) -- id is now optional, so only validate if provided if id then if mw.ustring.len(id) < 2 then error("The `id` parameter must have at least two characters.") end if id == title or id == Util.get_page_data().pagename then error("The `id` parameter must not be the same as the page title.") end end local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true } if pos and not valid_pos[pos] then error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").") end local current_keyword = "from" local current_keyword_explicit = false local keyword_etymons = {} local keywords = M.data.keywords local function checkKeyword() local config = keywords[current_keyword] if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then keyword_etymons = {} return end EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`") keyword_etymons = {} end local start_index = starts_with_lang_code and 2 or 1 for i = start_index, #args do local param = args[i] if type(param) ~= "string" then elseif param:sub(1, 1) == ":" and not is_keyword(param) then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif is_keyword(param) then checkKeyword() current_keyword = get_canonical_keyword(get_keyword(param)) current_keyword_explicit = true else local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then table.insert(keyword_etymons, param) EtymonParser.check_keyword_term(etymon_data, lang, current_keyword) -- Check modifier restrictions EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods) -- postype must be "root" or "word" local VALID_POSTYPES = { root = true, word = true } if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").") end if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true) end else table.insert(keyword_etymons, param) end end end checkKeyword() end local DataRetriever = {} local function format_etymon_id_hint(id_data, idx) local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then return '"' .. id .. '"' end if pos and pos ~= "" then return "unnamed (|pos=" .. pos .. "|)" end return "etymon #" .. idx .. " (no |id= on page)" end local function etymon_target_page_link(page, norm_lang) -- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it -- directly. Passing it back through full_link() with a reconstructed language raises an error, -- because the resolved name no longer carries the leading "*" those languages require -- and -- this link is built even when the warning it belongs to is later discarded outside preview. return "[[" .. page .. "]]" end -- Summarize {{etymon}} id slots on a linked page for preview warnings. local function summarize_available_etymon_ids(ids) local id_list = {} local all_idless = true local target_has_idless = false local any_pos = false for i, id_data in ipairs(ids) do local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then all_idless = false else target_has_idless = true end if pos and pos ~= "" then any_pos = true end table.insert(id_list, format_etymon_id_hint(id_data, i)) end return { id_list = id_list, all_idless = all_idless, target_has_idless = target_has_idless, any_pos = any_pos, count = #ids, options_text = mw.text.listToText(id_list), } end local function ambiguous_etymon_suggestion(page_link, summary) if summary.all_idless then if summary.any_pos then return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link .. ", then `<id:identifier>` after the term here. Section order / hints: " .. summary.options_text .. "." end return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)." end return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "." end local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(ids) if is_toplevel and summary.target_has_idless then __state.linked_page_multiple_etymons_idless = true end local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count .. " {{etymon}} templates for " .. lang_name .. ")." Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true) end local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon) return cached_args == M.data.STATUS.MISSING and not parent_etymon and #(__state.available_etymon_ids[base_key] or {}) > 0 end local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) if not is_toplevel or __state.skip_partial_etymology_category then return end if not __state.partial_etymology_targets[base_key] then return end if etymon_data.id and type(cached_args) == "table" then return end __state.linked_page_partial_etymology_sections = true end local function is_nonlemma_etymon_template(template_args) return template_args and M.yesno(template_args.nl, false) end local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {}) local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id .. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "." Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true) end -- Given an etymon data, scrape its page and cache the result in the global state object. function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel) local content = etymon_title:getContent() if not content then __state.cached_etymon_args[key] = M.data.STATUS.REDLINK return end -- Check if the linked page is a redirect. If it is, the template parsing -- code below will be effectively skipped, and `scrape_page` will be called -- again on the redirect target (see the bottom of this function) local lang_section_for_descendants = nil local redirect_target = etymon_title.redirect_target if not redirect_target then -- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language -- name, and this scrape runs on raw wikitext, so the template form has to be tried too. content = M.pages.get_section(content, etymon_lang:getFullName(), 2) or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2) if not content then __state.cached_etymon_args[key] = M.data.STATUS.MISSING return end lang_section_for_descendants = content end local etymon_lang_code = etymon_lang:getFullCode() local lang_page_key = etymon_lang_code .. ":" .. etymon_page local found_templates_for_lang = {} local found_ids = {} local get_node_class = M.template_parser.class_else_type -- Look for all {{etymon}} templates within the page content using the template parser -- This way the same page is never parsed more than once -- Build a map from senseids to their parent etymonids. local active_etymon_args = nil local etymology_section_count = 0 local etymology_sections_with_etymon = 0 local current_etymology_has_etymon = false local current_etymology_has_nonlemma = false local function finalize_current_etymology_section() if etymology_section_count == 0 then return end if current_etymology_has_etymon or current_etymology_has_nonlemma then etymology_sections_with_etymon = etymology_sections_with_etymon + 1 end current_etymology_has_etymon = false current_etymology_has_nonlemma = false end for node in M.template_parser.parse(content):iterate_nodes() do local node_class = get_node_class(node) if node_class == "heading" then -- A new L2 or etymology section acts as a barrier: an {{etymon}} usage -- used previously cannot be the parent of any subsequent senseids. -- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above. if node:get_name():find(ETYMOLOGY_HEADING) then finalize_current_etymology_section() etymology_section_count = etymology_section_count + 1 active_etymon_args = nil end elseif node_class == "template" then local template_name = node:get_name() if ETYMON_TEMPLATES[template_name] then local template_args = Util.normalize_raw_etymon_args(node:get_arguments()) -- Check if this etymon is for our language if template_args[1] == etymon_lang_code then if is_nonlemma_etymon_template(template_args) then if etymology_section_count > 0 then current_etymology_has_nonlemma = true end else if etymology_section_count > 0 then current_etymology_has_etymon = true end table.insert(found_templates_for_lang, template_args) if template_args.id then local etymon_key = lang_page_key .. ":" .. template_args.id __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, template_args.id) active_etymon_args = template_args else -- Store idless etymon with default key local etymon_key = lang_page_key .. ":*" __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, "*") active_etymon_args = template_args end end end elseif active_etymon_args and template_name == "senseid" then local template_args = node:get_arguments() -- This should always be true for proper usages of {{senseid}}. if template_args[1] == etymon_lang_code and template_args[2] then local sense_id_key = lang_page_key .. ":" .. template_args[2] __state.senseid_parent_etymon[sense_id_key] = active_etymon_args __state.cached_etymon_pages[sense_id_key] = tostring(etymon_page) end end end end finalize_current_etymology_section() if lang_section_for_descendants and etymology_section_count > 1 and etymology_sections_with_etymon > 0 and etymology_sections_with_etymon < etymology_section_count then __state.partial_etymology_targets[lang_page_key] = true end if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then M.descendants.cache_page_checks({ lang_section = lang_section_for_descendants, etymon_lang_code = etymon_lang_code, found_templates_for_lang = found_templates_for_lang, entry_title = __state.entry_title, entry_lang_code = __state.entry_lang_code, entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil, cached_descendants_checks = __state.cached_descendants_checks, lang_page_key = lang_page_key, redirected_from = redirected_from, }) end local id_data_list = {} for _, args in ipairs(found_templates_for_lang) do local id = args.id or "*" table.insert(id_data_list, { id = id, pos = args.pos }) end __state.available_etymon_ids[lang_page_key] = id_data_list if #found_templates_for_lang == 1 then __state.single_etymons[lang_page_key] = found_templates_for_lang[1] end if redirected_from and __state.available_etymon_ids[lang_page_key] then __state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {} for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do table.insert(__state.available_etymon_ids[redirected_from], id_data) end end if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then -- All done! return elseif redirect_target and not redirected_from then -- Try scraping the redirect. etymon_page = redirect_target.prefixedText DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel) __state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id] else __state.cached_etymon_args[key] = M.data.STATUS.MISSING end end local function has_linkable_term(etymon_data) if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then return false end local term = etymon_data.term if term == nil or term == "" then return false end return M.string_utilities.trim(term) ~= "" end local function record_term_id_tracking(etymon_data) if not has_linkable_term(etymon_data) then return end local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang) M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page) end -- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name. function DataRetriever.get_etymon_args(etymon_data, is_toplevel) if not has_linkable_term(etymon_data) then return M.data.STATUS.MISSING, nil, nil, nil end local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page if etymon_data.id then local key = base_key .. ":" .. etymon_data.id local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] if cached_args == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel) end cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh -- Get etymon_id from parent if this was resolved via senseid local parent_etymon = __state.senseid_parent_etymon[key] local resolved_etymon_id = parent_etymon and parent_etymon.id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) end end local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon) if mismatched_id and is_toplevel then __state.has_mismatched_id = true M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id) warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id) end maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check else __state.used_idless_etymon = true if is_toplevel then __state.toplevel_idless_etymon = true end if __state.available_etymon_ids[base_key] == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel) end local ids = __state.available_etymon_ids[base_key] or {} local count = #ids -- Try to filter by postype if available and we have multiple candidates if count > 1 and etymon_data.postype then local matching_ids = {} for _, id_data in ipairs(ids) do if id_data.pos == etymon_data.postype then table.insert(matching_ids, id_data) end end if #matching_ids == 1 then local matched_id = matching_ids[1].id local matched_key = base_key .. ":" .. matched_id M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id = matched_id }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id = matched_id }, }) end end local matched_args = __state.cached_etymon_args[matched_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel) return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check end end if count == 1 then local only_id_data = ids[1] local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*" M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id_data = only_id_data }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id_data = only_id_data }, }) end end local single_args = __state.single_etymons[base_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel) return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check elseif count > 1 then M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous") warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel) return M.data.STATUS.AMBIGUOUS, nil, nil, nil else M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing") maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel) return M.data.STATUS.MISSING, nil, nil, nil end end end local function keyword_invisible_in_tree(keyword_info) if not keyword_info then return false end local inv = keyword_info.invisible return inv == "all" or inv == true or inv == "tree" end -- True when the node has at least one top-level child container visible in the tree. local function node_has_visible_tree_children(node) for _, container in ipairs(node.children or {}) do if not keyword_invisible_in_tree(container.keyword_info) then return true end end return false end -- Count visible term nodes in the tree. local function get_visible_tree_depth(node, skip_child_rendering) local max_depth = 1 if skip_child_rendering or not node then return max_depth end for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if not keyword_invisible_in_tree(keyword_info) then local skip_grandchildren = keyword_info and keyword_info.no_child_categories for _, term in ipairs(container.terms or {}) do if term.is_duplicate then if term.original_has_children then max_depth = math.max(max_depth, 2) end else max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren)) end end end end return max_depth end local function as_param_list(val) if val == nil then return {} end if type(val) == "table" then return val end if type(val) == "string" and val ~= "" then return { val } end return {} end local TreeBuilder = {} local function parse_etymon_references(refs_text) if not refs_text or refs_text == "" then return "" end return M.references.parse_references(refs_text) end local function parse_tree_references(node) if node.ref then node.parsed_ref = parse_etymon_references(node.ref) end if node.children then for _, container in ipairs(node.children) do if container.terms then for _, term in ipairs(container.terms) do parse_tree_references(term) end end end end if node.supplements then for _, supplement in ipairs(node.supplements) do if supplement.terms then for _, term in ipairs(supplement.terms) do parse_tree_references(term) end end end end end -- Build a unique key for deduplication in the seen table function TreeBuilder.build_key(lang, title, args) local norm_lang_code = Util.get_norm_lang(lang):getFullCode() local is_table = type(args) == "table" local id = (is_table and args.id) or "" if title then return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id end if is_table and args.status == M.data.STATUS.INLINE then local content_parts = {} for i = 1, #args do content_parts[i] = tostring(args[i]) end return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0") end return norm_lang_code .. ":*:" .. id end -- Copy parsed etymon modifiers onto a tree/supplement term node. function TreeBuilder.apply_etymon_fields(term, etymon_data) -- A reference without <id:> still resolves when the target page has a single etymon, and the -- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows -- the target's id as the gloss without every reference having to repeat it. An explicit -- <id:...> still wins. term.id = etymon_data.id or term.id term.t = etymon_data.t term.tr = etymon_data.tr term.ts = etymon_data.ts term.alt = etymon_data.alt term.g = etymon_data.g term.pos = etymon_data.pos term.ng = etymon_data.ng term.ref = etymon_data.ref term.is_uncertain = etymon_data.unc term.lit = etymon_data.lit term.q = etymon_data.q term.qq = etymon_data.qq term.l = etymon_data.l term.ll = etymon_data.ll term.suppress_term = etymon_data.suppress_term term.unknown_term = etymon_data.unknown_term term.is_family = etymon_data.is_family term.override = etymon_data.override term.aftype = etymon_data.aftype term.postype = etymon_data.postype term.bor = etymon_data.bor term.lbor = etymon_data.lbor term.slbor = etymon_data.slbor end function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type) EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local term = { lang = etymon_data.lang, title = etymon_data.term, children = {}, status = M.data.STATUS.OK, } TreeBuilder.apply_etymon_fields(term, etymon_data) return term end function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) local terms = {} for _, term_param in ipairs(as_param_list(param_value)) do if type(term_param) == "string" and term_param ~= "" then local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang) if etymon_data then table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)) end end end return terms end -- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=). function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value) local config = M.data.supplements[supplement_type] if not config then error("Unknown supplement '" .. tostring(supplement_type) .. "'.") end local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) if #terms == 0 then return end data_tree.supplements = data_tree.supplements or {} table.insert(data_tree.supplements, { type = supplement_type, config = config, terms = terms, }) M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true) end function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion) seen = seen or {} depth = depth or 0 local is_toplevel = (depth == 0) if depth > __state.max_depth_reached then __state.max_depth_reached = depth end __state.total_nodes = __state.total_nodes + 1 local lang_code = lang:getCode() __state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1 local current_id = (type(args) == "table" and args.id) or "" local key = TreeBuilder.build_key(lang, title, args) local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK } if type(args) ~= "table" or seen[key] then node.status = args or M.data.STATUS.MISSING -- Mark as duplicate if we've seen this node before if seen[key] then node.is_duplicate = true node.duplicate_key = key local original_node = seen[key] if type(original_node) == "table" and original_node.children and #original_node.children > 0 then node.original_has_children = true end end return node end node.status = args.status or M.data.STATUS.OK seen[key] = node -- If stop_recursion is set, skip parsing children but check for visible children if stop_recursion then local keywords = M.data.keywords local has_visible_children = false for i = 2, #args do local param = args[i] if type(param) == "string" then local keyword_base = get_keyword_base(param) if keyword_base and keywords[keyword_base] then local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param)) if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then has_visible_children = true break end elseif param:sub(1, 1) ~= ":" then -- It's a term (not a keyword), so there are visible children has_visible_children = true break end end end node.has_visible_children = has_visible_children return node end -- Parse args into keyword containers local current_keyword = "from" local current_keyword_modifiers = {} local current_container = nil local function ensure_container() if not current_container or current_container.keyword ~= current_keyword then local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers) current_container = { keyword = current_keyword, keyword_info = keyword_info, keyword_modifiers = current_keyword_modifiers, terms = {}, } table.insert(node.children, current_container) -- Override keyword text/phrase for nominalization with <g:code> if current_keyword_modifiers.g and current_keyword == "nominalization" then local labels = get_nominalization_label_for_g(current_keyword_modifiers.g) if not labels then local codes = {} for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end table.sort(codes) error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", ")) end current_container.keyword_info = copy_keyword_info(keyword_info) current_container.keyword_info.text = labels.text current_container.keyword_info.phrase = labels.phrase end end return current_container end local parse_context_lang = Util.resolve_context_lang(lang, args) for i = 2, #args do local param = args[i] if is_keyword(param) then local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param) if not keyword then error("Invalid keyword '" .. param .. "'.") end current_keyword = keyword current_keyword_modifiers = modifiers current_container = nil -- Force new container for new keyword elseif type(param) == "string" and param:sub(1, 1) == ":" then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif type(param) == "string" then local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang) if etymon_data then -- Track keyword usage at top level M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel) local term_node = {} local container -- Handle suppress_term (-) and unknown_term (empty or +) directly if etymon_data.suppress_term or etymon_data.unknown_term then container = ensure_container() if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1) else term_node = { lang = etymon_data.lang, children = {}, status = M.data.STATUS.OK, } end TreeBuilder.apply_etymon_fields(term_node, etymon_data) else -- Regular term: fetch arguments from page record_term_id_tracking(etymon_data) local etymon_args, page_of, resolved_etymon_id, descendants_check = DataRetriever.get_etymon_args(etymon_data, is_toplevel) -- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing if etymon_data.ety then if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then __state.current_page_has_inline_etymology = true if is_toplevel then __state.toplevel_has_inline_etymology = true end local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) -- Track inline ety keywords too local inline_keyword = get_keyword(inline_args[2], true) if inline_keyword and #inline_args >= 3 then local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang) if inline_etymon then M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel) end end inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE etymon_args = inline_args term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent else -- Scraped arguments exist, <ety> is redundant and ignored __state.current_page_has_redundant_etymology = true if is_toplevel then __state.toplevel_redundant_etymology = true end end end -- Ensure container exists before checking keyword info container = ensure_container() -- Check if current keyword has no_child_categories - if so, stop recursion local keyword_info = container.keyword_info local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories)) term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion) term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() .. ":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang) term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid term_node.page_of = page_of TreeBuilder.apply_etymon_fields(term_node, etymon_data) term_node.missing_descendants_header, term_node.missing_descendants_entry = M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check) end table.insert(container.terms, term_node) end end end return node end -- Convert etymology tree to JSON-serializable table local function tree_to_json(node) local obj = { term = node.title, lang = node.lang:getCode(), lang_name = node.lang:getCanonicalName(), id = (node.id and node.id ~= "") and node.id or nil, status = node.status, is_uncertain = node.is_uncertain or nil, is_duplicate = node.is_duplicate or nil, gloss = node.t, transliteration = node.tr, transcription = node.ts, alt = node.alt, g = node.g, pos = node.pos, ng = node.ng, children = {}, } for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if keyword_info then local container_obj = { keyword = container.keyword, keyword_label = keyword_info.text, keyword_abbrev = keyword_info.abbrev, is_group = keyword_info.is_group or nil, is_invisible = keyword_info.invisible or nil, is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil, terms = {}, } for _, term in ipairs(container.terms or {}) do table.insert(container_obj.terms, tree_to_json(term)) end table.insert(obj.children, container_obj) end end return obj end -- Build and return the etymology data tree for a given term. function export.get_tree(lang, title, args, options) options = options or {} __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() __state.skip_partial_etymology_category = options.skip_partial_etymology_category == true if options.validate then EtymonParser.validate(lang, args, options.id, title, options.pos, false) end local lang_code = lang:getCode() local start_index = (args[1] == lang_code) and 2 or 1 local tree_args = { [1] = lang_code, id = options.id or args.id } for i = start_index, #args do table.insert(tree_args, args[i]) end __state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args local ety_data_tree = TreeBuilder.build(lang, title, tree_args) parse_tree_references(ety_data_tree) if options.json then return M.JSON.toJSON(tree_to_json(ety_data_tree)) end return ety_data_tree end -- Given a language code, page name and optionally the id= parameter, -- render the tree and only the etymology tree for the relevant page. -- Fetches and parses the corresponding {{etymon}} from the requested page, -- and any further pages needed to render the tree. -- Parameters can be passed either through the #invoke or as -- template parameters *through* an #invoke. function export.render_tree_for_etymon_on_page(frame) local frame_args = frame.args local parent_args = frame:getParent().args local langcode = frame_args[1] or parent_args[1] local pagename = frame_args[2] or parent_args[2] local id = frame_args["id"] or parent_args["id"] local display_title = frame_args["title"] or parent_args["title"] local parsed_title = mw.title.new(pagename, 0) local title if parsed_title.namespace == 0 then title = M.pages.safe_page_name(parsed_title) elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then title = "*" .. M.pages.safe_page_name(parsed_title) else error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace) end local lang = Util.get_lang(langcode) __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() -- Construct etymon_data for DataRetriever.get_args. local etymon_data = { lang = lang, term = title, id = id } local args, pagename = DataRetriever.get_etymon_args(etymon_data, true) if args == M.data.STATUS.MISSING then error("The etymon template was not found (language " .. langcode .. ", title '" .. title .. "'" .. (id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.") end local tree_title = display_title or title if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then M.tracking.track_title_pagename_mismatch(lang) end reset_invocation_state() local ety_data_tree = export.get_tree(lang, tree_title, args, { validate = true, id = id, }) local output = {} table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) return table.concat(output) end function export.main(frame) local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, M.parameters_data.etymon) args.pos = Util.normalize_pos(args.pos) local lang = args[1] local etymon_args = args[2] local id = args.id local title = args.title local text = args.text local tree = args.tree local etydate = args.etydate local doublet = args.doublet local rfe = args.rfe local etystub = args.etystub local is_nonlemma = M.yesno(args.nl, false) local page_data = Util.get_page_data() if not title then title = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end end local entry_pagename = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then entry_pagename = "*" .. entry_pagename end if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then M.tracking.track_title_pagename_mismatch(lang) end local current_L2 = M.pages.get_current_L2() if current_L2 then local norm_lang = Util.get_norm_lang(lang) local norm_name = norm_lang:getCanonicalName() if current_L2 ~= norm_name then local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if norm_lang:getCode() ~= lang:getCode() then lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")" end error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").") end end reset_invocation_state() local ety_data_tree = export.get_tree(lang, title, etymon_args, { validate = true, pos = args.pos, id = id, json = args.json, skip_partial_etymology_category = is_nonlemma, }) if args.json then return ety_data_tree end local output = {} local text_allowlist_mode = M.text_allowed.default_mode or "off" if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() .. "; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter." if text_allowlist_mode == "error" then error(msg) else Util.add_warning(msg, true) end end local lang_exc = Util.get_lang_exception(lang) if lang_exc and lang_exc.disallow then local disallow = lang_exc.disallow local error_text = " for " .. lang:getFullName() if disallow.ref then error_text = error_text .. "; see " .. disallow.ref else error_text = error_text .. "." end if tree and disallow.tree then error("Etymology trees are not allowed" .. error_text) end if text and disallow.text then error("Etymology texts are not allowed" .. error_text) end end if etydate then local etydate_param_mods = { ref = { list = true, type = "references", allow_holes = true }, refn = { list = true, allow_holes = true }, nocap = { type = "boolean" }, } local function generate_etydate_obj(etydate_text) local etydate_specs = {} for spec in etydate_text:gmatch("[^,]+") do table.insert(etydate_specs, mw.text.trim(spec)) end return { [1] = etydate_specs } end local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj }) local etydate_args = { [1] = parsed_etydate[1], nocap = parsed_etydate.nocap or false, } ety_data_tree.supplements = ety_data_tree.supplements or {} table.insert(ety_data_tree.supplements, { type = "etydate", etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }), etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil, }) end TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet) if ety_data_tree.supplements then parse_tree_references(ety_data_tree) end local has_visible_children = node_has_visible_tree_children(ety_data_tree) -- Suppress trees for multiword entries and one-step chains local visible_tree_depth = get_visible_tree_depth(ety_data_tree) local is_trivial_tree = visible_tree_depth <= 2 local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil if tree and (is_multiword or is_trivial_tree) then tree = false end if tree then table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) end local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree)) local anchor = M.anchors.etymonid(lang, id, { no_tree = args.notree, title = title, empty_tree = (not has_visible_children) or tree_disallowed, ety_tree_json = ety_tree_json, }) table.insert(output, anchor) local text_stop_lang_missing = nil if text then local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink if text == "++" then max_depth, stop_at_blue_link = false, false elseif text == "+" then max_depth, stop_at_blue_link = 1, false elseif text == "*" then max_depth, stop_at_blue_link = false, true elseif text:match("^:[^*]+%*$") then -- Stop at a specific language OR first bluelink after it, e.g., ":ota*" -- If the target language is a redlink, continue to the first bluelink local lang_code = text:match("^:([^*]+)%*$") if lang_code and lang_code ~= "" then local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang_or_bluelink = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end elseif text:sub(1, 1) == ":" then -- Stop at a specific language, e.g., ":ar" stops at first Arabic term local lang_code = text:sub(2) if lang_code ~= "" then -- Validate the language code local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else local num = tonumber(text) if num and num >= 1 then max_depth, stop_at_blue_link = num, false else error('Invalid text value "' .. text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)') end end local text_output, text_render_meta = M.text.render({ data_tree = ety_data_tree, format_term_func = Util.format_term, lang_matches_stop_code = Util.lang_matches_stop_code, max_depth = max_depth, stop_at_blue_link = stop_at_blue_link, curr_page = page_data.pagename, nodot = args.nodot, dot = args.dot, stop_at_lang = stop_at_lang, stop_at_lang_or_bluelink = stop_at_lang_or_bluelink, }) table.insert(output, text_output) if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then M.tracking.track_text_stop_lang_missing(lang, stop_at_lang) text_stop_lang_missing = stop_at_lang end end if rfe then table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode())) end if etystub then table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode())) end if is_nonlemma then table.insert(output, " " .. frame:expandTemplate({ title = "nonlemma", args = {}, })) end local categories = {} if Util.is_content_page() then M.tracking.track_tree_metrics({ max_depth_reached = __state.max_depth_reached, total_nodes = __state.total_nodes, language_count = __state.language_count, lang = lang, }) categories = M.categories.build({ data_tree = ety_data_tree, page_lang = lang, available_etymon_ids = __state.available_etymon_ids, senseid_parent_etymon = __state.senseid_parent_etymon, get_norm_lang_func = Util.get_norm_lang, lang_exc = lang_exc, suppress_categories = lang_exc and lang_exc.suppress_categories, nocat = args.nocat, tree = tree, text = text, exnihilo = args.exnihilo, toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology, toplevel_redundant_etymology = __state.toplevel_redundant_etymology, toplevel_idless_etymon = __state.toplevel_idless_etymon, has_mismatched_id = __state.has_mismatched_id, linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless, linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections, text_stop_lang_missing = text_stop_lang_missing, }) M.tracking.track_keywords(__state.toplevel_keyword_stats, lang) M.tracking.track_page_id(lang, id) M.tracking.track_ids(__state.id_stats, lang) end if #categories > 0 then table.insert(output, M.categories.format(categories, lang)) end if __state.warnings then for i, warning in ipairs(__state.warnings) do table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n") end end return table.concat(output) end return export o0owhom4nesvcr3x3f2pgy9hbjm4yts Modul:etymon/styles.css 828 1326098 6532098 6435087 2026-09-18T20:10:54Z Wikihez 7344 etymology tree: the language label is a quiet dark-grey caption instead of a second blue link 6532098 sanitized-css text/css /* Main container. Follows the frame that {{tewandin-ser}} gives inflection tables (Şablon:tewandin-ser/style.css): pale-blue frame, rounded, soft shadow, white body. */ .etytree { width: max-content; max-width: 100%; overflow: hidden; box-sizing: border-box; padding: 3px; margin: 0.5em 0; background: var(--wikt-palette-paleblue); border: 1px solid var(--wikt-palette-grey); border-radius: 6px; box-shadow: 0 4px 15px var(--wikt-palette-grey-3); } /* Title bar, styled like the inflection-table caption. */ .etytree .NavHead { background: var(--wikt-palette-paleblue); text-align: left; font-size: 95%; font-weight: bold; padding: 0.1em 0.5em; box-sizing: border-box; } /* Was a fixed 25em, which stretched even a two-node tree to that width. */ .etytree .NavHead > div { min-width: 14em; } /* A fixed height; a taller tree scrolls (or drags, with the EtytreeZoom gadget) inside the box. The gadget's "Biçûk bike" lifts the limit and scales the whole tree into view. */ .etytree .NavContent { overflow: auto; max-height: 28em; background: var(--wikt-palette-white); border: 1px solid var(--wikt-palette-grey-6); border-radius: 4px; } .etytree-body { display: flex; flex-direction: column; align-items: center; padding: 0.75em 0.5em; margin: auto; width: fit-content; } .etytree-branch-group { display: flex; column-gap: 0.5em; align-items: end; position: relative; } .etytree-branch { display: flex; flex-direction: column; align-items: center; } /* Term blocks */ .etytree-block { position: relative; padding: 0.3em 0.7em; border: 1px solid var(--wikt-palette-lightgrey); border-radius: 4px; background: var(--wikt-palette-beige); text-align: center; line-height: 1.35; box-shadow: 0 1px 2px var(--wikt-palette-grey-3); } /* The language sits above the term, so give it the quieter weight of the two: smaller, grey and out of link blue, so only the term itself reads as a link. */ .etytree-block .etyl { font-size: 85%; letter-spacing: 0.02em; } .etytree-block .etyl a { color: var(--wikt-palette-darkgrey); text-decoration: none; } .etytree-block .etyl a:hover, .etytree-block .etyl a:focus { color: var(--wikt-palette-blue); text-decoration: underline; } /* Reconstructed languages: a cooler tint than the beige of attested terms. */ .etytree-block.etytree-reconstructed { background: var(--wikt-palette-grey-blue-1); /* the sanitiser rejects border-color with a var(), so set the shorthand */ border: 1px solid var(--wikt-palette-grey-blue-3); } /* Termless keyword blocks (invisible wrapper for positioning) */ .etytree-termless-block { height: 0 !important; padding: 0 !important; border: none !important; background: transparent !important; margin: 0 !important; overflow: visible; } .etytree-block.etytree-duplicate { border: 1px dashed var(--wikt-palette-grey); } .etytree-term { display: inline-block; } /* The meaning, on its own line under the term. */ .etytree-gloss { display: inline-block; max-width: 16em; font-size: 85%; font-style: italic; line-height: 1.25; color: var(--wikt-palette-grey-9); } /* Vertical connectors */ .etytree-connector-vertical, .etytree-connector-vertical-short { border-right: 2px solid var(--wikt-palette-grey); position: relative; transform: translateX(1px); } .etytree-connector-vertical { height: 20px; } .etytree-connector-vertical-short { height: 10px; } .etytree-connector-dotted { border-left: 2px dotted var(--wikt-palette-grey); height: 20px; display: block; margin-left: 50%; } /* Branch connectors */ .etytree-branch-left, .etytree-branch-right { height: 10px; width: calc(50% + 0.25em); border-bottom: 2px solid var(--wikt-palette-grey); } .etytree-branch-left { border-left: 2px solid var(--wikt-palette-grey); border-bottom-left-radius: 4px; transform: translateX(50%); } .etytree-branch-right { border-right: 2px solid var(--wikt-palette-grey); border-bottom-right-radius: 4px; transform: translateX(-50%); } .etytree-branch-mid { border-bottom: 2px solid var(--wikt-palette-grey); width: calc(100% + 0.5em); } /* Duplicate connector (L-shaped with arrow) */ .etytree-duplicate-connector { display: flex; justify-content: center; height: 20px; } .etytree-duplicate-connector > div { position: relative; width: 60px; height: 100%; } .etytree-duplicate-connector .etytree-dup-right { position: absolute; right: 0; top: 50%; bottom: 0; border-left: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-horiz { position: absolute; left: 0; right: 0; top: 50%; border-top: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-left { position: absolute; left: 0; top: 0; bottom: 50%; border-left: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-arrow { position: absolute; left: -5px; top: -5px; font-size: 10px; color: var(--wikt-palette-grey); } /* Label containers */ .etytree-label-container { z-index: 1; position: absolute; transform: translate(-50%); top: calc(100% + 5px); left: 50%; line-height: 10px; overflow: visible; } .etytree-group-label { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 2; height: 10px; line-height: 10px; } /* Labels */ .etytree-label abbr { font-size: 12px; font-style: italic; color: var(--wikt-palette-black); background: var(--wikt-palette-cyan); border-radius: 2px; text-decoration: none; } /* Uncertainty marker */ .etytree-unc { font-size: 10px; font-weight: bold; padding: 1px 2px; background: var(--wikt-palette-pink); border-radius: 2px; text-decoration: none; } .etytree-label + .etytree-unc { position: absolute; left: calc(100% + 3px); } /* Final marker (for termless keywords) */ .etytree-final { font-size: 10px; font-weight: bold; padding: 1px 2px; background: var(--wikt-palette-grey) !important; color: var(--wikt-palette-white) !important; border-radius: 2px; text-decoration: none; display: inline-block; line-height: 1; } .etytree-label-container .etytree-final { position: absolute; left: 50%; top: -12px; transform: translateX(-50%); z-index: 3; margin-left: 0; } d7wsfcirpqt63vplh60vc7778du531i Jinûvesazî:proto-hindûewropî/peh₂- 108 1326174 6532020 6369920 2026-09-18T15:33:22Z Wikihez 7344 Wikihez rûpela [[Jinûvesazî:proto-hindûewropî/peh₂]] bêyî beralîkirinek bar kir [[Jinûvesazî:proto-hindûewropî/peh₂-]] 6369920 wikitext text/x-wiki {{jinûvesazkirî}} == {{ziman|ine-pro}} == {{etîmon|ine-pro|pos=root|id=parastin}} === Reh === {{reh|ine-pro}}<ref>{{R:ine:IEW|page=787|cuda=pā-: pə-}}</ref><ref>{{R:ine:IEW|page=839|cuda=pō(i)-: (pəi- ?:) pī-}}</ref><ref>{{R:ine:LIV|cuda=*peh₂(i̯)-|page=460}}</ref> # [[parastin]] === Çavkanî === {{çavkanî}} oevuuqgbsft1pfoipl7bc236pobjk76 Modul:etymon/data 828 1357603 6532064 6531859 2026-09-18T17:44:33Z Wikihez 7344 language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne 6532064 Scribunto text/plain local export = {} export.STATUS = { OK = "ok", INLINE = "inline", MISSING = "missing", REDLINK = "redlink", AMBIGUOUS = "ambiguous", } export.TRANSITIVE = { ALWAYS = "always", -- always recurse into children NEVER = "never", -- never recurse into children CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues) CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context } -- Deep merge tables (nested tables are merged recursively, later values override earlier) local function deep_merge(...) local result = {} for _, t in ipairs({ ... }) do for k, v in pairs(t) do if type(v) == "table" and type(result[k]) == "table" then result[k] = deep_merge(result[k], v) else result[k] = v end end end return result end local glossary_page = "Nimînok:Ferhengok" -- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger". local function make_glossary_link(term, display_text) if not term then return display_text end local page, anchor = term:match("^(.-)#(.+)$") if not page then page, anchor = glossary_page, term end return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]" end -- Extract base word and connector from text like "Borrowed from" or "calque of" local function split_glossary_text(text) for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do local base, rest = text:match(pattern) if base then return base, rest end end return text, "" end local TRANSITIVE = export.TRANSITIVE local function create_keyword(opts) local entry = { is_group = opts.is_group or false, abbrev = opts.abbrev, glossary = opts.glossary, transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always" inherited_chain = opts.inherited_chain or false, affix_categories = opts.affix_categories or false, borrowing_type = opts.borrowing_type, specialized_borrowing = opts.specialized_borrowing, toplevel_category = opts.toplevel_category, no_child_categories = opts.no_child_categories or false, source_category_type = opts.source_category_type, invisible = (opts.invisible == true and "all") or opts.invisible or false, pos_override = opts.pos_override, new_sentence = opts.new_sentence or false, separate_clause = opts.separate_clause or false, default_conj = opts.default_conj, min_etymons = opts.min_etymons, max_etymons = opts.max_etymons, term_rules = opts.term_rules, aliases = opts.aliases, } -- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text") local inv = entry.invisible if inv ~= "all" and inv ~= "text" then entry.phrase = opts.phrase if opts.text then if opts.glossary then local base_word, rest = split_glossary_text(opts.text) entry.text = make_glossary_link(opts.glossary, base_word) .. rest else entry.text = opts.text end end end return entry end -- Shared defaults for keyword groups local DEFAULTS = { -- Keywords that pass through inheritance chain inheritance = { transitive = TRANSITIVE.ALWAYS, inherited_chain = true, }, -- Standard transitive derivation transitive = { transitive = TRANSITIVE.ALWAYS, }, -- Standard for internal derivations: transitive across languages, but not within them internal_derivation = { transitive = TRANSITIVE.CROSS_LANG, }, -- Borrowing keywords borrowing = { transitive = TRANSITIVE.ALWAYS, }, -- Affix group keywords (compound words, blends, etc.) affix_group = { is_group = true, min_etymons = 2, transitive = TRANSITIVE.CROSS_LANG, affix_categories = true, }, -- Calque-like keywords (calque, partial calque, semantic loan) calque_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, new_sentence = true, }, -- Non-transitive influence influence_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, }, } export.keywords = { -- -- Inheritance keywords -- ["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Ji", phrase = "ji", aliases = { "ji" }, term_rules = { entry_lang = true }, })), ["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Mîrasmayî ji", phrase = "mîrasmayî ji", glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî", aliases = { "inh", "mîrasmayî", "mîr" }, term_rules = { family = "disallowed", family_suffix = "; use a specific language.", ancestor_check = true, }, })), -- -- Basic derivation keywords -- ["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", aliases = { "drşnd" }, toplevel_category = "Dariştinên nediyar", })), ["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", abbrev = "drş.", glossary = "Nimînok:Ferhengok#dariştî", aliases = { "der", "dariştî", "drş" }, })), -- -- Affix/compound group keywords -- ["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", min_etymons = 1, aliases = { "af", "qertaf", "qf" }, })), ["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Têkilkirin ji", phrase = "têkilkirin ji", aliases = { "têkilkirin" }, abbrev = "blend", glossary = "Nimînok:Ferhengok#têkilkirin", toplevel_category = "Têkilkirin", })), ["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ûnîverbasyona", phrase = "ûnîverbasyona", abbrev = "ûnîv.", glossary = "ûnîverbasyon", toplevel_category = "univerbations", min_etymons = 1, aliases = { "univ", "ûnîverbasyon", "ûnîv" }, })), ["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "[[Sanskritic]] formation from", phrase = "a [[Sanskritic]] formation of", toplevel_category = "Sanskritic formations", })), -- -- Borrowing keywords -- ["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deyn ji", phrase = "deynkirî ji", abbrev = "deyn.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", borrowing_type = "borrowed", aliases = { "borrowed", "deyn" }, })), ["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ji", phrase = "deynkirina hînbûyî ji", aliases = { "deynh" }, abbrev = "deynh.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "learned", })), ["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina ortografîk ji", phrase = "deynkirina ortografîk ji", abbrev = "deynort.", glossary = "deynkirina ortografîk", specialized_borrowing = "orthographic", aliases = { "deynort" }, })), ["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ya qismî ji", phrase = "deynkirina hînbûyî ya qismî ji", aliases = { "deynhq" }, abbrev = "deynhq.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "semi-learned", })), ["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina neadaptekirî ji", phrase = "deynkirina neadaptekirî ji", abbrev = "deynne.", glossary = "deynkirina neadaptekirî", specialized_borrowing = "unadapted", aliases = { "deynne" }, })), -- -- Calque-like keywords (non-transitive, start new sentence) -- ["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser ji", phrase = "wergerandina yekser ji", abbrev = "yekser", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "calque", aliases = { "cal", "clq", "yekser" }, })), ["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser a qismî ji", phrase = "wergerandina yekser a qismî ji", abbrev = "yekserq.", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "partial-calque", aliases = { "pcal", "yekserqismî", "yekserq" }, })), ["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergirtina maneyê ji", phrase = "wergirtina maneyê ji", abbrev = "wer. mane", glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê", specialized_borrowing = "semantic-loan", aliases = { "sl", "wergirtin" }, })), ["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Lihevanîna dengî-maneyî ji", phrase = "lihevanîna dengî-maneyî ji", abbrev = "lihevanîn", glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî", specialized_borrowing = "phono-semantic-matching", aliases = { "phono-semantic matching", "lihevanîn" }, })), -- -- Influence keywords (non-transitive, separate clause) -- ["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, { text = "Di bin tesîra", phrase = "bin tesîra", aliases = { "tesîr" }, abbrev = "tesîr.", glossary = "belavbûn ji zimanekî din", separate_clause = true, })), -- -- Morphological derivation keywords -- ["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Qusandin ji", phrase = "qusandin ji", abbrev = "qusandin", glossary = "Nimînok:Ferhengok#qusandin", toplevel_category = "Qusandin", aliases = { "clip", "qusandin" }, })), ["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Elîpsîza", phrase = "elîpsîza", abbrev = "elîp.", glossary = "elîpsîz", toplevel_category = "ellipses", aliases = { "ellip", "elîpsîz", "elîp" }, })), ["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Paşvesazî ji", phrase = "paşvesazî ji", abbrev = "paşvesazî", glossary = "Nimînok:Ferhengok#paşvesazî", toplevel_category = "Paşvesazî", aliases = { "bf", "paşvesazî" }, })), ["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Nomînalîzasyona", phrase = "nomînalîzasyona", abbrev = "nomîn.", glossary = "nomînalîzasyon", toplevel_category = "nominalizations", aliases = { "nom", "nomînalîzasyon", "nomîn" }, })), ["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Translîterasyona", phrase = "translîterasyona", abbrev = "translît.", glossary = "translîterasyon", aliases = { "translit", "translîterasyon", "translît" }, })), ["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Apheretic form of", phrase = "an apheretic form of", abbrev = "aph.", glossary = "apheresis", aliases = { "apheresis", "aphetic" }, })), ["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Denominal verb from", phrase = "denominal verb from", abbrev = "denom.", glossary = "denominal", toplevel_category = "denominal verbs", aliases = { "denom" }, })), ["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Deverbal from", phrase = "deverbal from", abbrev = "deverb.", glossary = "deverbal", toplevel_category = "deverbals", })), ["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Redûblîkasyona", phrase = "redûblîkasyona", abbrev = "redûb.", glossary = "redûblîkasyon", toplevel_category = "reduplications", aliases = { "redup", "redûblîkasyon", "redûb" }, })), ["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Kurtkirina", phrase = "kurtkirina", abbrev = "kurt.", aliases = { "abbr", "abbrev", "kurtkirin" }, })), ["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Syllabic abbreviation of", phrase = "syllabic abbreviation of", abbrev = "syl. abbr.", glossary = "syllabic abbreviation", aliases = { "sylabbr", "sylabbrev" }, })), ["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Akronîma", phrase = "akronîma", abbrev = "akronîm", glossary = "akronîm", aliases = { "acro", "akronîm" }, })), ["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Înîtîalîzma", phrase = "înîtîalîzma", abbrev = "înît.", glossary = "înîtîalîzm", aliases = { "init", "înîtîalîzm", "înît" }, })), ["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Metateza", phrase = "metateza", abbrev = "meta.", glossary = "metatez", toplevel_category = "peyvên dariştî bi riya metatezê", aliases = { "meta", "metatez" }, })), -- -- Invisible keywords (no text output) -- ["root"] = create_keyword { transitive = TRANSITIVE.ALWAYS, invisible = "all", pos_override = "root", aliases = { "reh" }, }, ["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", transitive = TRANSITIVE.NEVER, min_etymons = 1, invisible = "all", })), } -- Template-parameter supplements. export.supplements = { doublet = { text = "Cotreha", phrase = "cotreha", glossary = "Nimînok:Ferhengok#cotreh", toplevel_category = "Cotreh", default_conj = "û", term_rules = { entry_lang = true, require_term = true, disallow = { "suppress", "unknown", "family" }, }, }, } local aliases_to_register = {} local canonical_aliases = {} -- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking. export.keyword_canonical = {} for name, keyword_data in pairs(export.keywords) do export.keyword_canonical[name] = name if keyword_data.aliases then canonical_aliases[name] = keyword_data.aliases for _, alias in ipairs(keyword_data.aliases) do if export.keywords[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.") end if aliases_to_register[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.") end aliases_to_register[alias] = keyword_data export.keyword_canonical[alias] = name end keyword_data.aliases = nil end end for alias, data in pairs(aliases_to_register) do export.keywords[alias] = data end -- -- Language exception presets -- local EXCEPTION_PRESETS = { -- Fully disallowed: no tree, no text, no categories disallowed = { disallow = { tree = true, text = true }, suppress_categories = true, }, -- Suppress transliteration only no_translit = { suppress_tr = true, }, -- Suppress all categories only no_categories = { suppress_categories = true, }, } --[=[ Available exception options: disallow = { Related options for disallowing output: tree Disallow etymology trees for this language text Disallow etymology text generation for this language ref Reference link shown when tree/text is disallowed } suppress_tr Suppress transliteration in links suppress_categories Suppress all category generation normalize_to Normalize language code to a different code normalize_from_families Apply normalization to languages in these families normalize_exclude_families Exclude these families from normalization keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } }) ]=] local function create_exception(preset, overrides) local base = preset and EXCEPTION_PRESETS[preset] or {} return deep_merge(base, overrides or {}) end export.config = { lang_exceptions = { ["zh"] = create_exception("disallowed", { disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" }, suppress_tr = true, normalize_to = "zh", normalize_from_families = { "zhx" }, normalize_exclude_families = { "qfa-cnt" }, }), }, } -- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes) -- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of -- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is -- passed through to it for the gender tag, so anything valid here is valid there. A two-letter -- gender+number code that is not listed ("np", "mp") is decomposed automatically below. export.nominalization_g_codes = { -- Cins ["n"] = "nêr", ["m"] = "mê", ["f"] = "mê", ["nt"] = "nêtar", ["c"] = "giştî", ["g"] = "giştî", ["cnt"] = "cinsê-notr", -- Hejmar ["y"] = "yekjimar", ["s"] = "yekjimar", ["p"] = "pirjimar", ["d"] = "dual", -- Kodên hevedudanî yên [[Modul:gender and number/data]] ["mf"] = "nêr an mê", ["mn"] = "mê an nêr", ["mnt"] = "mê an nêtar", } -- -- Propagate keyword overrides to aliases -- if export.config.lang_exceptions then for lang_code, exception in pairs(export.config.lang_exceptions) do if exception.keyword_overrides then for canonical, aliases in pairs(canonical_aliases) do if exception.keyword_overrides[canonical] then local override_data = exception.keyword_overrides[canonical] for _, alias in ipairs(aliases) do if not exception.keyword_overrides[alias] then exception.keyword_overrides[alias] = override_data end end end end end end end return export ccvtb8l8zkezxqph95plteme7ki8zxy Modul:etymon/tree 828 1357623 6532062 6433456 2026-09-18T17:44:13Z Wikihez 7344 language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne 6532062 Scribunto text/plain local export = {} local html_create = mw.html.create local max = math.max --[==[ The language label on a tree node: a link to the language's category with the first letter capitalised, the way Modul:etymon kevn rendered it. Families and anything without a category fall back to the plain canonical name. ]==] local function language_label(lang) if lang and lang.makeCategoryLink then local ok, link = pcall(lang.makeCategoryLink, lang) if ok and link and link ~= "" then return link end end local name = lang and lang:getCanonicalName() or "" return mw.ustring.upper(mw.ustring.sub(name, 1, 1)) .. mw.ustring.sub(name, 2) end local function create_vertical_connector() return html_create('span'):addClass('etytree-connector-vertical') end local function create_abbr(text, title, glossary) local abbr = html_create('abbr') :attr('title', title) :wikitext(text) if glossary then -- Like Modul:etymon/data: a bare anchor sits on the glossary page, "Rûpel#lenger" is a full target. local page, anchor = glossary:match("^(.-)#(.+)$") if not page then page, anchor = "Nimînok:Ferhengok", glossary end abbr = '[[' .. page .. '#' .. anchor:gsub(" ", "_") .. '|' .. tostring(abbr) .. ']]' end return html_create('span'):addClass('etytree-label'):node(abbr) end local function create_uncertainty_marker() return html_create('abbr') :addClass('etytree-unc') :attr('title', 'nediyar') :wikitext('?') end local function create_label_container() return html_create('span'):addClass('etytree-label-container') end local function invisible_in_tree(inv) return inv == "all" or inv == true or inv == "tree" end local function render_label(term_block, keyword_info, keyword_modifiers, is_uncertain, is_group_child, term_labels) -- Skip label when invisible in tree local has_label = keyword_info and keyword_info.abbrev and not is_group_child and not invisible_in_tree(keyword_info.invisible) -- For group children, keyword uncertainty is shown on the group label, not on individual terms local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc and not is_group_child local show_term_uncertainty = is_uncertain -- Check if we have term-specific labels local has_term_labels = term_labels and #term_labels > 0 if not has_label and not show_term_uncertainty and not keyword_uncertain and not has_term_labels then return end local label_span = create_label_container() if has_label then local glossary_title = keyword_info.glossary and keyword_info.glossary:gsub("_", " ") or keyword_info.abbrev label_span:node(create_abbr( keyword_info.abbrev, glossary_title, keyword_info.glossary )) -- Show uncertainty marker if term or keyword is uncertain if show_term_uncertainty or keyword_uncertain then label_span:node(create_uncertainty_marker()) end else -- No label, but term or keyword is uncertain if show_term_uncertainty or keyword_uncertain then label_span:node(create_uncertainty_marker()) end end -- Add term-specific labels if has_term_labels then for _, label_info in ipairs(term_labels) do label_span:node(create_abbr(label_info.abbrev, label_info.title, label_info.glossary)) end end term_block:node(label_span) end local function render_term_block(node_data, format_term_func, is_toplevel) local link_content = html_create() link_content :tag('span') :addClass('etyl') :wikitext(language_label(node_data.lang)) :done() local term_text, gloss = format_term_func(node_data, is_toplevel) if term_text then link_content :wikitext('<br>') :tag('span') :addClass('etytree-term') :wikitext(term_text) :done() end -- The meaning goes on its own line, smaller and in italics, instead of in (“...”) brackets. if gloss then link_content :wikitext('<br>') :tag('span') :addClass('etytree-gloss') :wikitext(gloss) :done() end local block = html_create('div'):addClass('etytree-block'):node(link_content) -- Reconstructed languages get their own tint, so an unattested step is obvious at a glance. local lang = node_data.lang if lang and lang.hasType then local ok, is_recon = pcall(lang.hasType, lang, "reconstructed") if ok and is_recon then block:addClass('etytree-reconstructed') end end -- Add duplicate styling if this is a duplicate node if node_data.is_duplicate then block:addClass('etytree-duplicate') end return block end local function create_dotted_connector() return html_create('span'):addClass('etytree-connector-dotted') end -- Create an L-shaped connector for nodes with hidden ancestry (duplicate or no_child_categories) local function create_duplicate_connector() local container = html_create('div'):addClass('etytree-duplicate-connector') local inner_wrapper = container:tag('div') inner_wrapper:tag('span'):addClass('etytree-dup-right') inner_wrapper:tag('span'):addClass('etytree-dup-horiz') inner_wrapper:tag('span'):addClass('etytree-dup-left') inner_wrapper:tag('span'):addClass('etytree-dup-arrow'):wikitext('▲') return container end local function render_group_label(connecting_line, keyword_info, keyword_modifiers) local has_abbrev = keyword_info and keyword_info.abbrev local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc -- Nothing to show if no abbrev and no uncertainty if not has_abbrev and not keyword_uncertain then return end local label_span = connecting_line:tag('span'):addClass('etytree-group-label') if has_abbrev then local glossary_title = keyword_info.glossary and keyword_info.glossary:gsub("_", " ") or keyword_info.abbrev label_span:node(create_abbr(keyword_info.abbrev, glossary_title, nil)) end -- Add uncertainty marker if keyword has <unc> modifier if keyword_uncertain then label_span:node(create_uncertainty_marker()) end end local function add_branch_connector(column, index, total) if index == 1 then column:tag('span'):addClass('etytree-branch-left') elseif index == total then column:tag('span'):addClass('etytree-branch-right') else column:tag('span'):addClass('etytree-connector-vertical-short') column:tag('span'):addClass('etytree-branch-mid') end end function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func -- Forward declaration local render_term -- Render a container (keyword + its terms) local function render_container(container, is_toplevel) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local is_group = keyword_info and keyword_info.is_group local terms = container.terms or {} -- Skip container entirely only when invisible = "all" (or true) if keyword_info and invisible_in_tree(keyword_info.invisible) then return nil, 0, 0 end if #terms == 0 then return nil, 0, 0 end -- For no_child_categories keywords (calque, semantic loan, etc.), don't render term's children local skip_child_rendering = keyword_info and keyword_info.no_child_categories -- Render each term in the container local rendered_terms = {} local container_height = 0 local container_width = 0 for _, term in ipairs(terms) do -- Collect term-specific labels local term_labels = {} if term.bor then table.insert(term_labels, { abbrev = "bor.", title = "borrowed", glossary = "loanword" }) end if term.slbor then table.insert(term_labels, { abbrev = "slbor.", title = "semi-learned borrowing", glossary = "semi-learned_borrowing" }) end if term.lbor then table.insert(term_labels, { abbrev = "lbor.", title = "learned borrowing", glossary = "learned_borrowing" }) end local term_tree, term_height, term_width = render_term(term, keyword_info, keyword_modifiers, is_group, false, skip_child_rendering, term_labels) table.insert(rendered_terms, { tree = term_tree, height = term_height, width = term_width, is_uncertain = term.is_uncertain, }) container_height = max(container_height, term_height) container_width = container_width + term_width end local rendered_html local has_connector = false if #rendered_terms == 1 then -- Single term: just return it directly rendered_html = rendered_terms[1].tree container_height = rendered_terms[1].height container_width = rendered_terms[1].width else -- Multiple terms: group them together local subtree_container = html_create('div'):addClass('etytree-branch-group') for i, term_data in ipairs(rendered_terms) do local column = html_create('div'):addClass('etytree-branch') column:node(term_data.tree) add_branch_connector(column, i, #rendered_terms) subtree_container:node(column) end local connecting_line = create_vertical_connector() -- Add group label for group keywords if is_group and not invisible_in_tree(keyword_info.invisible) then render_group_label(connecting_line, keyword_info, keyword_modifiers) end rendered_html = html_create() :node(subtree_container) :node(connecting_line) has_connector = true end return rendered_html, container_height, container_width, has_connector end -- Render a term node render_term = function(term_node, keyword_info, keyword_modifiers, is_group_child, is_toplevel_term, skip_child_rendering, term_labels) local tree_width, tree_height = 0, 0 local subtrees = {} -- Process term's children (which are containers) local has_hidden_children = false if not term_node.is_duplicate and not skip_child_rendering then for _, container in ipairs(term_node.children or {}) do local subtree, sub_height, sub_width, subtree_has_connector = render_container(container, is_toplevel_term) if subtree then table.insert(subtrees, { tree = subtree, height = sub_height, width = sub_width, has_connector = subtree_has_connector, }) tree_height = max(tree_height, sub_height) tree_width = tree_width + sub_width end end elseif skip_child_rendering then -- Check if there are any visible children -- When stop_recursion is true, children aren't parsed, but has_visible_children flag is set if term_node.has_visible_children then has_hidden_children = true elseif term_node.children and #term_node.children > 0 then -- Fallback: check parsed children for visibility for _, container in ipairs(term_node.children) do local child_keyword_info = container.keyword_info if not (child_keyword_info and (child_keyword_info.invisible == "all" or child_keyword_info.invisible == true)) then has_hidden_children = true break end end end end local is_toplevel_node = (keyword_info == nil) local term_block = render_term_block(term_node, format_term_func, is_toplevel_node) render_label(term_block, keyword_info, keyword_modifiers, term_node.is_uncertain, is_group_child, term_labels or {}) local term_html = html_create() if #subtrees == 0 then local show_connector = (term_node.is_duplicate and term_node.original_has_children) or has_hidden_children if show_connector then term_html:node(create_duplicate_connector()) end term_html:node(term_block) tree_width = tree_width + 1 elseif #subtrees == 1 then term_html:node(subtrees[1].tree) if not subtrees[1].has_connector then term_html:node(create_vertical_connector()) end term_html:node(term_block) else -- Multiple containers: need to merge them local subtree_container = html_create('div'):addClass('etytree-branch-group') for i, subtree_data in ipairs(subtrees) do local column = html_create('div'):addClass('etytree-branch') column:node(subtree_data.tree) add_branch_connector(column, i, #subtrees) subtree_container:node(column) end local connecting_line = create_vertical_connector() term_html :node(subtree_container) :node(connecting_line) :node(term_block) end return term_html, tree_height + 1, tree_width end local final_tree, final_height, final_width = render_term(data_tree, nil, nil, false, true) local container = html_create('div') :addClass('etytree-body') :node(final_tree) return tostring(html_create('div') :addClass('etytree NavFrame') :attr('data-etytree-height', final_height) :attr('data-etytree-width', final_width) :tag('div') :addClass('NavHead') :tag('div') :wikitext('Dara etîmolojiyê') :done() :done() :tag('div') :addClass('NavContent') :node(container) :done()) end return export g28ydu0v7itj59qfvz5j478j5n9s9qj Modul:etymon/text 828 1357626 6532063 6371307 2026-09-18T17:44:23Z Wikihez 7344 language and family names link to their category instead of Wikipedia; a family now reads "zimanên îranî"; glossary links point at Nimînok:Ferhengok (tree keeps a full "Rûpel#lenger" target); Kurdish names, shorthands and tree labels for nomînalîzasyon, ûnîverbasyon, translîterasyon, redûblîkasyon, elîpsîz, akronîm, înîtîalîzm, deynort, deynne 6532063 Scribunto text/plain local export = {} local loader = require("Module:module loader") local M = loader.init({ require = { en_utilities = "Module:en-utilities", references = "Module:references", senseno = "Module:senseno", }, loadData = { data = "Module:etymon/data", }, }) function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func local max_depth = opts.max_depth local stop_at_blue_link = opts.stop_at_blue_link local curr_page = opts.curr_page local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0" local function explicit_dot_override() if opts.dot == nil or opts.dot == false then return nil end local d = mw.text.trim(tostring(opts.dot)) if d == "" or d == "." then return nil end return d end local dot_override = explicit_dot_override() local function find_deepest_last_part(tree) if not tree or not tree.container_parts or #tree.container_parts == 0 then return nil end local last_part = tree.container_parts[#tree.container_parts] if last_part.continuation then return find_deepest_last_part(last_part.continuation) end return last_part end local function apply_final_punctuation_override(tree, punct) if not tree or punct == nil then return end local last_part = find_deepest_last_part(tree) if last_part then last_part.punctuation = punct end end local function apply_closing_punctuation_override(tree, is_last_segment) if not is_last_segment then return end local punct if nodot then punct = "" elseif dot_override ~= nil then punct = dot_override else return end apply_final_punctuation_override(tree, punct) end local function has_supplements() return data_tree.supplements and #data_tree.supplements > 0 end local stop_at_lang = opts.stop_at_lang local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink local lang_matches_stop_code = opts.lang_matches_stop_code local stop_lang_reached = false local function term_matches_stop_code(term_lang, stop_code) if lang_matches_stop_code then return lang_matches_stop_code(term_lang, stop_code) end return term_lang and term_lang:getCode() == stop_code end local children = data_tree.children local function has_text_supplements() if not data_tree.supplements then return false end for _, supplement in ipairs(data_tree.supplements) do if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then return true end if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then return true end end return false end if (not children or #children == 0) and not has_text_supplements() then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page local entry_lang = data_tree.lang local function lowercase_glossary_link_display(wikitext) return wikitext:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain) local senseids = mw.text.split(senseid, "!!", true) local senseno_parts = {} for i, id in ipairs(senseids) do id = mw.text.trim(id) if id ~= "" then table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, { title = curr_page, uc = (i == 1 and capitalize_senseno) or nil, })) end end if #senseno_parts == 0 then return keyword_text, keyword_phrase end local senseno_text = mw.text.listToText(senseno_parts) local glossary_link = (keyword_text or ""):gsub(" from$", "") local glossary_lower = lowercase_glossary_link_display(glossary_link) if #senseno_parts > 1 then local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]") if is_uncertain then return senseno_text .. " are possibly " .. plural_link .. " from", senseno_text .. " are possibly semantic loans from" end return senseno_text .. " are " .. plural_link .. " from", senseno_text .. " are semantic loans from" end if is_uncertain then return senseno_text .. " is possibly a " .. glossary_lower .. " from", senseno_text .. " is possibly a semantic loan from" end return senseno_text .. " is a " .. glossary_lower .. " from", senseno_text .. " is a semantic loan from" end -- Get refs for a term local function get_term_refs(term, term_lang, depth) local term_l2 = term_lang:getFullCode() .. ":" .. curr_page if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then return M.references.format_references(term.parsed_ref) end return "" end -- Build a text part for a single term local function build_term_part(term, current_lang, depth) local text = "" local new_lang = current_lang local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName() -- Use centralized format_term (handles suppress_term, unknown_term, and regular terms) local term_text = format_term_func(term) if lang_changed then new_lang = term.lang if term_text then text = term.lang:makeCategoryLink(true) .. " " .. term_text elseif term.is_family then text = term.lang:makeCategoryLink(true) -- a family: "zimanên îranî" else -- suppress_term with language change: show only language text = term.lang:makeCategoryLink(true) end else text = term_text or "" end return { type = "term", text = text, refs = get_term_refs(term, new_lang, depth), lang = new_lang, is_uncertain = term.is_uncertain or false, } end -- Build text parts for a container local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local terms = container.terms or {} if not keyword_info or #terms == 0 then return nil end -- Skip building text part when invisible in text ("all", "text", or true) local inv = keyword_info.invisible if inv == "all" or inv == true or inv == "text" then return nil end local is_group = keyword_info.is_group local keyword_uncertain = keyword_modifiers.unc or false -- Determine text and phrase (allowing for overrides) local intro_text = keyword_info.text local phrase = keyword_info.phrase local new_sentence = keyword_info.new_sentence or false if keyword_modifiers.text then -- User-provided override: assumed to be lowercase phrase = keyword_modifiers.text -- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from") intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2) end -- Get keyword references local keyword_refs = "" if keyword_modifiers.ref then local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref) if parsed_keyword_refs and parsed_keyword_refs ~= "" then keyword_refs = M.references.format_references(parsed_keyword_refs) end end -- Build term parts local term_parts = {} local current_lang = node.lang for _, term in ipairs(terms) do local term_part = build_term_part(term, current_lang, depth) if term_part.text ~= "" then table.insert(term_parts, term_part) current_lang = term_part.lang end end -- Check uncertainty distribution local uncertain_count = 0 for _, term_part in ipairs(term_parts) do if term_part.is_uncertain then uncertain_count = uncertain_count + 1 end end -- If keyword itself is uncertain, treat all terms as uncertain local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0) if is_group and uncertain_count > 0 then all_uncertain = true end local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0 -- Check if there are more steps (only if continuation is allowed) local has_more_steps = false local next_node = nil local first_term = terms[1] -- Check if we should stop at this language local reached_stop_lang = false if stop_at_lang then for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then reached_stop_lang = true stop_lang_reached = true break end end elseif stop_at_lang_or_bluelink then -- Check if we should stop at this language, or at the first bluelink if it's a redlink for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then if first_term.status == M.data.STATUS.OK then reached_stop_lang = true else fallback_to_bluelink = true end break end end if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then reached_stop_lang = true end end if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then local first_term_children = first_term.children if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then local next_container = first_term_children[1] local next_keyword_info = next_container and next_container.keyword_info if not (next_keyword_info and next_keyword_info.invisible) then if stop_at_blue_link then if first_term.status ~= M.data.STATUS.OK then has_more_steps = true next_node = first_term end else has_more_steps = true next_node = first_term end end end end return { type = "container", intro_text = intro_text, phrase = phrase, senseid = keyword_modifiers.senseid, sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil, is_uncertain = all_uncertain, has_mixed_uncertainty = has_mixed_uncertainty, term_parts = term_parts, is_group = is_group, has_more_steps = has_more_steps, next_node = next_node, new_sentence = new_sentence, separate_clause = keyword_info.separate_clause or false, conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc. lit = keyword_modifiers.lit, keyword_refs = keyword_refs, fallback_to_bluelink = fallback_to_bluelink, } end -- Build the full tree of text parts local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink) local containers = node.children if not containers or #containers == 0 then return nil end local container_parts = {} -- Count containers that get a text part (invisible in text = "all", "text", or true) local visible_container_count = 0 for _, container in ipairs(containers) do local keyword_info = container.keyword_info local inv = keyword_info and keyword_info.invisible if not (inv == "all" or inv == true or inv == "text") then visible_container_count = visible_container_count + 1 end end -- If there are multiple visible containers at this level, don't allow continuation for any local has_multiple_containers = visible_container_count > 1 local should_allow_continuation = allow_continuation and not has_multiple_containers for _, container in ipairs(containers) do local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink) if part then -- Recursively build children if there are more steps if part.has_more_steps and part.next_node then part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink) end table.insert(container_parts, part) end end if #container_parts == 0 then return nil end return { type = "tree", container_parts = container_parts, depth = depth, } end -- Check if tree has mixed joining types local function container_join_kind(part) if part.type == "etydate" then return nil end if part.new_sentence or part.separate_clause then return "supplement" end return "or_join" end local function check_complexity(tree) if not tree then return nil end local parts = tree.container_parts if #parts <= 1 then -- Single container if parts[1] and parts[1].continuation then return check_complexity(parts[1].continuation) end return nil end -- Or-join containers must precede any supplemental (calque-like / influence) containers. local seen_supplement = false for _, part in ipairs(parts) do local kind = container_join_kind(part) if kind == "supplement" then seen_supplement = true elseif kind == "or_join" and seen_supplement then error( "Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.") end end for _, part in ipairs(parts) do if part.continuation then check_complexity(part.continuation) end end return nil end -- Analyze tree and assign punctuation local function analyze_punctuation(tree, is_toplevel) if not tree then return end local parts = tree.container_parts local num_parts = #parts for i, part in ipairs(parts) do local is_first = (i == 1) local is_last = (i == num_parts) local next_part = parts[i + 1] -- Analyze term punctuation within container if part.term_parts then -- Terms use Oxford comma style: "A, B, yan jî C" -- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and") local num_terms = #part.term_parts local term_conj = part.conj or "yan jî" -- Kurdish default for j, term_part in ipairs(part.term_parts) do local is_last_term = (j == num_terms) if part.is_group then -- Group: terms joined with " + " term_part.joiner = is_last_term and "" or " + " elseif num_terms > 1 then -- Multiple terms not in a group: Oxford comma style if is_last_term then term_part.joiner = "" elseif j == num_terms - 1 then -- Second to last term if num_terms == 2 then term_part.joiner = " " .. term_conj .. " " else term_part.joiner = ", " .. term_conj .. " " end else term_part.joiner = ", " end else -- Single term term_part.joiner = "" end end end -- Determine container punctuation based on what comes next if part.continuation then -- Has continuation part.punctuation = "," -- Recursively analyze continuation analyze_punctuation(part.continuation, false) elseif is_last then -- Last container at this level (may still continue in part.continuation) part.punctuation = "." elseif next_part and next_part.new_sentence then -- Next container starts a new sentence part.punctuation = "." elseif next_part and next_part.separate_clause then -- Next container is a separate clause part.punctuation = "," else -- Not last, next is joined with the conjunction -- Containers use repeated conjunction style: "A, yan jî B, yan jî C" part.punctuation = "," end -- Determine joiner to next part -- Containers use the repeated conjunction between each -- Custom conjunction can be specified via conj modifier local container_conj = part.conj or "yan jî" -- Kurdish default if not is_last then if next_part and next_part.new_sentence then -- New sentence part.joiner = " " elseif next_part and next_part.separate_clause then -- Separate clause part.joiner = " " else -- Same sentence: use the custom conjunction, else the default part.joiner = " " .. container_conj .. " " end else part.joiner = "" end -- Determine intro formatting -- Capitalize if first at top level, OR if this container starts a new sentence if (is_first and is_toplevel) or part.new_sentence then part.intro_capitalized = true part.use_full_intro = true else part.intro_capitalized = false part.use_full_intro = false end end end -- Assemble text from analyzed tree local function assemble_text(tree) if not tree then return "" end local result = "" for i, part in ipairs(tree.container_parts) do if part.type == "etydate" then result = result .. part.etydate_text if part.punctuation and part.punctuation ~= "" then result = result .. part.punctuation end if part.etydate_refs and next(part.etydate_refs) then result = result .. M.references.format_references(part.etydate_refs) end if part.joiner and part.joiner ~= "" then result = result .. part.joiner end else -- Build intro local intro_text = part.intro_text local phrase = part.phrase if part.senseid then intro_text, phrase = format_sl_senseid_intro( part.senseid, part.sl_keyword_text, part.phrase, part.intro_capitalized, part.is_uncertain ) end local intro if part.use_full_intro then if part.is_uncertain and not part.senseid then intro = "Mihtemelen " .. phrase else intro = intro_text end else if part.is_uncertain and not part.senseid then intro = "mihtemelen " .. phrase else intro = phrase end end result = result .. intro -- Build terms if #part.term_parts > 0 then result = result .. " " for j, term_part in ipairs(part.term_parts) do -- Add "possibly" prefix for uncertain terms when there's mixed uncertainty if part.has_mixed_uncertainty and term_part.is_uncertain then result = result .. "mihtemelen " end result = result .. term_part.text -- Add joiner between terms if term_part.joiner ~= "" then -- Check if joiner contains comma (punctuation) local comma_pos = term_part.joiner:find(",") if comma_pos then -- Add up to and including comma result = result .. term_part.joiner:sub(1, comma_pos) -- Add refs after comma if term_part.refs ~= "" then result = result .. term_part.refs end -- Add rest of joiner result = result .. term_part.joiner:sub(comma_pos + 1) else -- No comma, add refs before joiner if term_part.refs ~= "" then result = result .. term_part.refs end result = result .. term_part.joiner end end end -- For the last term, add punctuation then refs local last_term = part.term_parts[#part.term_parts] if last_term and last_term.joiner == "" then if part.punctuation ~= "" then -- If we have literal text, punctuation goes AFTER it if part.lit then -- Add refs first (attached to term) if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text result = result .. ", literally “" .. part.lit .. "”" -- Add punctuation result = result .. part.punctuation else -- Normal behavior: punctuation then refs result = result .. part.punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs after term refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end else -- No punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text if present (even without punctuation) if part.lit then result = result .. ", literally “" .. part.lit .. "”" end end end else -- No terms, just add punctuation and keyword refs if part.punctuation ~= "" then result = result .. part.punctuation end -- Add keyword refs even when there are no terms if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end -- Add continuation if part.continuation then result = result .. " " .. assemble_text(part.continuation) end -- Add joiner to next container if part.joiner ~= "" then result = result .. part.joiner end end end return result end local text_tree = build_text_tree(data_tree, 1, true, false) -- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree. local function assemble_supplements() if not data_tree.supplements then return "" end local chunks = {} local pending_trees = {} local function flush_pending_trees() local num = #pending_trees for i, supplement_tree in ipairs(pending_trees) do analyze_punctuation(supplement_tree, true) apply_closing_punctuation_override(supplement_tree, i == num) local chunk = assemble_text(supplement_tree) if chunk ~= "" then table.insert(chunks, chunk) end end pending_trees = {} end for _, supplement in ipairs(data_tree.supplements) do local supplement_tree if supplement.type == "doublet" and supplement.config and supplement.terms and #supplement.terms > 0 then local config = supplement.config local term_parts = {} for _, term in ipairs(supplement.terms) do local term_part = build_term_part(term, entry_lang, 1) if term_part.text ~= "" then table.insert(term_parts, term_part) end end if #term_parts == 0 then supplement_tree = nil else supplement_tree = { type = "tree", container_parts = { { type = "doublet", intro_text = config.text, phrase = config.phrase, term_parts = term_parts, conj = config.default_conj or "û", new_sentence = true, }, }, depth = 1, } end elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then supplement_tree = { type = "tree", container_parts = { { type = "etydate", etydate_text = supplement.etydate_text, etydate_refs = supplement.etydate_refs, new_sentence = true, }, }, depth = 1, } end if supplement_tree then table.insert(pending_trees, supplement_tree) end end flush_pending_trees() return table.concat(chunks, " ") end if not text_tree then local supplement_text = assemble_supplements() if supplement_text == "" then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end if stop_at_lang then return supplement_text, { stop_lang_reached = false } end return supplement_text end local rendered = "" if text_tree then check_complexity(text_tree) analyze_punctuation(text_tree, true) apply_closing_punctuation_override(text_tree, not has_supplements()) rendered = assemble_text(text_tree) end local supplement_text = assemble_supplements() if supplement_text ~= "" then if rendered ~= "" then rendered = rendered .. " " .. supplement_text else rendered = supplement_text end end if stop_at_lang then return rendered, { stop_lang_reached = stop_lang_reached } end return rendered end return export pqx8yjht5pzl03xvsevt2srnfeaxp08 Bikarhêner:Wikihez/Gadget-test/loader.js 2 1358398 6532016 6531989 2026-09-18T14:21:24Z Wikihez 7344 Test loader: EtytreeZoom out again, its change is live 6532016 javascript text/javascript // <nowiki> // Test harness for the gadgets. Loaded from [[MediaWiki:Gadget-test.js]], which is one line: // mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-test/loader.js&action=raw&ctype=text/javascript'); // // Runs the userspace copies in place of the site's gadgets, under the same module names. A gadget the // wiki has registered but not yet loaded is implemented here from the test page instead, so its // dependencies are the real ones from [[MediaWiki:Gadgets-definition]]. One already loading from the wiki // cannot be replaced: turn the default gadgets that load it (start and wikt.dsb load wikt.core) off in // Special:Preferences while testing, and this names any that are still on. // // MODULES lists only the gadgets with changes not yet live; everything else runs the site's copy. A // gadget is added back when it is being changed, and taken out once that change is deployed. (function () { "use strict"; // Set synchronously, before add-examples' DOM-ready pass, so its own inline link is never built. window.wikt = window.wikt || {}; wikt.addExamples = wikt.addExamples || {}; wikt.addExamples.suppressLinks = true; // Subpage segments are case-sensitive, so BASE must match the pages exactly. var BASE = "Bikarhêner:Wikihez/Gadget-test"; // A value carrying a namespace is used as the whole title; anything else is appended to BASE. function pageTitle(suffix) { return suffix.indexOf(":") !== -1 ? suffix : BASE + suffix; } // module name -> package ({main, files}) or plain script ({script}), plus styles. // deferred held back until something asks for it, as production fetches it only then // start asked for on page load, as production loads a default gadget // deps only for a gadget not yet in Gadgets-definition; a registered one keeps the wiki's // actions with start, only on these wgAction values, as a definition's "actions=" does var MODULES = { "ext.gadget.wikt.core": { main: "wikt.core.js", files: { // Keyed exactly as Gadgets-definition names them, so a require that would fail in // production fails here first. "wikt.core.js": "/wikt-core.js", "wikt.core/sections.js": "/sections.js", "wikt.core/prefs.js": "/prefs.js", "wikt.core/data-sections.json": "/data-sections.json" }, styles: ["/tokens.css"] }, "ext.gadget.wikt.edit": { main: "wikt.edit.js", files: { "wikt.edit.js": "/wikt-edit.js", "wikt.edit/util.js": "/util.js", "wikt.edit/wikitext.js": "/wikitext.js", "wikt.edit/langs.js": "/langs.js", "wikt.edit/labels.js": "/labels.js", "wikt.edit/posparams.js": "/posparams.js", "wikt.edit/data-main.json": "/data-main.json", "wikt.edit/ziman-core.json": "/ziman-core.json" }, styles: ["/wikt-edit.css"] }, "ext.gadget.wikt.cite": { main: "wikt.cite.js", files: { "wikt.cite.js": "/cite.js" }, styles: ["/cite.css"] }, // Unchanged, but it is what loads the modules above and below, and it is off in Preferences while // they are tested. "ext.gadget.wikt.dsb": { start: true, main: "wikt.dsb.js", files: { "wikt.dsb.js": "/dsb.js" }, styles: ["/dsb.css"] }, "ext.gadget.wikt.dsb-panels": { deferred: true, main: "wikt.dsb-panels.js", files: { "wikt.dsb-panels.js": "/dsb-panels.js" }, styles: ["/dsb-panels.css"] } }; // Force dataType "text": otherwise jQuery sees action=raw's JavaScript Content-Type and runs it. function raw(suffix) { return $.get({ url: mw.util.getUrl(pageTitle(suffix), { action: "raw" }), dataType: "text" }); } function run() { var names = Object.keys(MODULES); // A module the wiki has started loading cannot be implemented a second time. var busy = names.filter(function (name) { var state = mw.loader.getState(name); return state !== null && state !== "registered"; }); if (busy.length) { console.warn("loader.js: already loaded from the wiki, so the site's copy runs: " + busy.join(", ")); mw.notify("loader.js: van amûran di Tercîhan de bigire, da ku kopiya ceribandinê bixebite: " + busy.map(function (n) { return n.replace("ext.gadget.", ""); }).join(", "), { type: "warn" }); } var ours = names.filter(function (name) { return busy.indexOf(name) === -1; }); // Every distinct page this harness needs, fetched once each. var suffixes = []; function need(suffix) { if (suffixes.indexOf(suffix) === -1) { suffixes.push(suffix); } } ours.forEach(function (name) { var m = MODULES[name]; if (m.script) { need(m.script); } else { Object.keys(m.files).forEach(function (key) { need(m.files[key]); }); } m.styles.forEach(need); }); if (!suffixes.length) { return; } $.when.apply($, suffixes.map(raw)).done(function () { var args = suffixes.length === 1 ? [arguments] : [].slice.call(arguments); var text = {}; suffixes.forEach(function (s, i) { text[s] = args[i][0]; }); // Styles go in directly: a stylesheet passed to implement() that never fires its load event // leaves the module stuck in "executing", and everything queued behind it with it. function addStyles(styles) { (styles || []).forEach(function (suffix) { if (text[suffix]) { mw.util.addCSS(text[suffix]); } }); } var bad = null; var payloads = {}; ours.forEach(function (name) { var m = MODULES[name]; if (m.script) { payloads[name] = new Function("$", "jQuery", "require", "module", text[m.script]); return; } var files = {}; Object.keys(m.files).forEach(function (key) { var src = text[m.files[key]]; if (key.slice(-5) === ".json") { try { files[key] = JSON.parse(src); } catch (e) { bad = m.files[key] + " nederbasdar e (JSON parse ket): " + e.message; } return; } files[key] = new Function("require", "module", "exports", src); }); payloads[name] = { main: m.main, files: files }; }); if (bad) { mw.notify(bad, { type: "error" }); return; } // implement() runs a module as soon as its dependencies are ready, so a deferred one is // handed over only when something asks for it. function implement(name) { if (!payloads[name]) { return; } var payload = payloads[name]; delete payloads[name]; if (mw.loader.getState(name) === null) { mw.loader.register(name, "0", MODULES[name].deps || []); } else if (mw.loader.getState(name) !== "registered") { console.warn("loader.js: " + name + " is already loading from the wiki; its copy runs."); return; } mw.loader.implement(name, payload); addStyles(MODULES[name].styles); } // A deferred module reached as another's dependency is handed over too, or ResourceLoader // fetches the site's copy of it instead. function withDeps(list) { var out = []; (function walk(items) { (items || []).forEach(function (n) { if (out.indexOf(n) !== -1) { return; } out.push(n); var entry = mw.loader.moduleRegistry[n]; walk(entry ? entry.dependencies : MODULES[n] && MODULES[n].deps); }); }(list)); return out; } var origUsing = mw.loader.using; mw.loader.using = function (modules) { withDeps([].concat(modules || [])).forEach(implement); return origUsing.apply(this, arguments); }; ours.forEach(function (name) { if (!MODULES[name].deferred) { implement(name); } }); var action = mw.config.get("wgAction"); var starting = ours.filter(function (name) { var m = MODULES[name]; return m.start && (!m.actions || m.actions.indexOf(action) !== -1); }); var settled = false; mw.loader.using(starting).then(function () { settled = true; console.log("loader.js: started " + starting.join(", ")); }, function (err) { settled = true; mw.notify("Xeta barkirinê: " + err, { type: "error" }); }); // A dependency stuck half-loaded leaves using() pending forever, with no error at all. setTimeout(function () { if (settled) { return; } var stuck = withDeps(starting) .filter(function (m) { return mw.loader.getState(m) !== "ready"; }) .map(function (m) { return m + "=" + mw.loader.getState(m); }); mw.notify("Barkirin asê ma: " + stuck.join(", "), { type: "warn" }); }, 10000); }).fail(function () { mw.notify("Nikare hemû rûpelên " + BASE + " bixwîne: " + suffixes.join(", "), { type: "error" }); }); } // The test gadget declares no dependencies, so mw.util is not there yet when this runs. mw.loader.using("mediawiki.util").then(run); })(); // </nowiki> jn6wse86lukvbpik28qkvn80n3jd0al 6532106 6532016 2026-09-18T20:35:19Z Wikihez 7344 Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json 6532106 javascript text/javascript // <nowiki> // Test harness for the gadgets. Loaded from [[MediaWiki:Gadget-test.js]], which is one line: // mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-test/loader.js&action=raw&ctype=text/javascript'); // // Runs the userspace copies in place of the site's gadgets, under the same module names. A gadget the // wiki has registered but not yet loaded is implemented here from the test page instead, so its // dependencies are the real ones from [[MediaWiki:Gadgets-definition]]. One already loading from the wiki // cannot be replaced: turn the default gadgets that load it (start and wikt.dsb load wikt.core) off in // Special:Preferences while testing, and this names any that are still on. // // MODULES lists only the gadgets with changes not yet live; everything else runs the site's copy. A // gadget is added back when it is being changed, and taken out once that change is deployed. (function () { "use strict"; // Set synchronously, before add-examples' DOM-ready pass, so its own inline link is never built. window.wikt = window.wikt || {}; wikt.addExamples = wikt.addExamples || {}; wikt.addExamples.suppressLinks = true; // Subpage segments are case-sensitive, so BASE must match the pages exactly. var BASE = "Bikarhêner:Wikihez/Gadget-test"; // A value carrying a namespace is used as the whole title; anything else is appended to BASE. function pageTitle(suffix) { return suffix.indexOf(":") !== -1 ? suffix : BASE + suffix; } // module name -> package ({main, files}) or plain script ({script}), plus styles. // deferred held back until something asks for it, as production fetches it only then // start asked for on page load, as production loads a default gadget // deps only for a gadget not yet in Gadgets-definition; a registered one keeps the wiki's // actions with start, only on these wgAction values, as a definition's "actions=" does var MODULES = { "ext.gadget.wikt.core": { main: "wikt.core.js", files: { // Keyed exactly as Gadgets-definition names them, so a require that would fail in // production fails here first. "wikt.core.js": "/wikt-core.js", "wikt.core/sections.js": "/sections.js", "wikt.core/prefs.js": "/prefs.js", "wikt.core/data-sections.json": "/data-sections.json" }, styles: ["/tokens.css"] }, "ext.gadget.wikt.edit": { main: "wikt.edit.js", files: { "wikt.edit.js": "/wikt-edit.js", "wikt.edit/util.js": "/util.js", "wikt.edit/wikitext.js": "/wikitext.js", "wikt.edit/langs.js": "/langs.js", "wikt.edit/labels.js": "/labels.js", "wikt.edit/posparams.js": "/posparams.js", "wikt.edit/data-main.json": "/data-main.json", "wikt.edit/ziman-core.json": "/ziman-core.json" }, styles: ["/wikt-edit.css"] }, "ext.gadget.wikt.cite": { main: "wikt.cite.js", files: { "wikt.cite.js": "/cite.js", "wikt.cite/etimon.js": "/etimon.js" }, styles: ["/cite.css"] }, // Unchanged, but it is what loads the modules above and below, and it is off in Preferences while // they are tested. "ext.gadget.wikt.dsb": { start: true, main: "wikt.dsb.js", files: { "wikt.dsb.js": "/dsb.js" }, styles: ["/dsb.css"] }, "ext.gadget.wikt.dsb-panels": { deferred: true, main: "wikt.dsb-panels.js", files: { "wikt.dsb-panels.js": "/dsb-panels.js" }, styles: ["/dsb-panels.css"] } }; // Force dataType "text": otherwise jQuery sees action=raw's JavaScript Content-Type and runs it. function raw(suffix) { return $.get({ url: mw.util.getUrl(pageTitle(suffix), { action: "raw" }), dataType: "text" }); } function run() { var names = Object.keys(MODULES); // A module the wiki has started loading cannot be implemented a second time. var busy = names.filter(function (name) { var state = mw.loader.getState(name); return state !== null && state !== "registered"; }); if (busy.length) { console.warn("loader.js: already loaded from the wiki, so the site's copy runs: " + busy.join(", ")); mw.notify("loader.js: van amûran di Tercîhan de bigire, da ku kopiya ceribandinê bixebite: " + busy.map(function (n) { return n.replace("ext.gadget.", ""); }).join(", "), { type: "warn" }); } var ours = names.filter(function (name) { return busy.indexOf(name) === -1; }); // Every distinct page this harness needs, fetched once each. var suffixes = []; function need(suffix) { if (suffixes.indexOf(suffix) === -1) { suffixes.push(suffix); } } ours.forEach(function (name) { var m = MODULES[name]; if (m.script) { need(m.script); } else { Object.keys(m.files).forEach(function (key) { need(m.files[key]); }); } m.styles.forEach(need); }); if (!suffixes.length) { return; } $.when.apply($, suffixes.map(raw)).done(function () { var args = suffixes.length === 1 ? [arguments] : [].slice.call(arguments); var text = {}; suffixes.forEach(function (s, i) { text[s] = args[i][0]; }); // Styles go in directly: a stylesheet passed to implement() that never fires its load event // leaves the module stuck in "executing", and everything queued behind it with it. function addStyles(styles) { (styles || []).forEach(function (suffix) { if (text[suffix]) { mw.util.addCSS(text[suffix]); } }); } var bad = null; var payloads = {}; ours.forEach(function (name) { var m = MODULES[name]; if (m.script) { payloads[name] = new Function("$", "jQuery", "require", "module", text[m.script]); return; } var files = {}; Object.keys(m.files).forEach(function (key) { var src = text[m.files[key]]; if (key.slice(-5) === ".json") { try { files[key] = JSON.parse(src); } catch (e) { bad = m.files[key] + " nederbasdar e (JSON parse ket): " + e.message; } return; } files[key] = new Function("require", "module", "exports", src); }); payloads[name] = { main: m.main, files: files }; }); if (bad) { mw.notify(bad, { type: "error" }); return; } // implement() runs a module as soon as its dependencies are ready, so a deferred one is // handed over only when something asks for it. function implement(name) { if (!payloads[name]) { return; } var payload = payloads[name]; delete payloads[name]; if (mw.loader.getState(name) === null) { mw.loader.register(name, "0", MODULES[name].deps || []); } else if (mw.loader.getState(name) !== "registered") { console.warn("loader.js: " + name + " is already loading from the wiki; its copy runs."); return; } mw.loader.implement(name, payload); addStyles(MODULES[name].styles); } // A deferred module reached as another's dependency is handed over too, or ResourceLoader // fetches the site's copy of it instead. function withDeps(list) { var out = []; (function walk(items) { (items || []).forEach(function (n) { if (out.indexOf(n) !== -1) { return; } out.push(n); var entry = mw.loader.moduleRegistry[n]; walk(entry ? entry.dependencies : MODULES[n] && MODULES[n].deps); }); }(list)); return out; } var origUsing = mw.loader.using; mw.loader.using = function (modules) { withDeps([].concat(modules || [])).forEach(implement); return origUsing.apply(this, arguments); }; ours.forEach(function (name) { if (!MODULES[name].deferred) { implement(name); } }); var action = mw.config.get("wgAction"); var starting = ours.filter(function (name) { var m = MODULES[name]; return m.start && (!m.actions || m.actions.indexOf(action) !== -1); }); var settled = false; mw.loader.using(starting).then(function () { settled = true; console.log("loader.js: started " + starting.join(", ")); }, function (err) { settled = true; mw.notify("Xeta barkirinê: " + err, { type: "error" }); }); // A dependency stuck half-loaded leaves using() pending forever, with no error at all. setTimeout(function () { if (settled) { return; } var stuck = withDeps(starting) .filter(function (m) { return mw.loader.getState(m) !== "ready"; }) .map(function (m) { return m + "=" + mw.loader.getState(m); }); mw.notify("Barkirin asê ma: " + stuck.join(", "), { type: "warn" }); }, 10000); }).fail(function () { mw.notify("Nikare hemû rûpelên " + BASE + " bixwîne: " + suffixes.join(", "), { type: "error" }); }); } // The test gadget declares no dependencies, so mw.util is not there yet when this runs. mw.loader.using("mediawiki.util").then(run); })(); // </nowiki> 890bn76hx85qj14qnudyebr3vwza360 6533100 6532106 2026-09-19T10:19:12Z Wikihez 7344 Test loader: empty the module list, everything in it is deployed 6533100 javascript text/javascript // <nowiki> // Test harness for the gadgets. Loaded from [[MediaWiki:Gadget-test.js]], which is one line: // mw.loader.load('//ku.wiktionary.org/w/index.php?title=Bikarhêner:Wikihez/Gadget-test/loader.js&action=raw&ctype=text/javascript'); // // Runs the userspace copies in place of the site's gadgets, under the same module names. A gadget the // wiki has registered but not yet loaded is implemented here from the test page instead, so its // dependencies are the real ones from [[MediaWiki:Gadgets-definition]]. One already loading from the wiki // cannot be replaced: turn the default gadgets that load it (start and wikt.dsb load wikt.core) off in // Special:Preferences while testing, and this names any that are still on. // // MODULES lists only the gadgets with changes not yet live; everything else runs the site's copy. A // gadget is added back when it is being changed, and taken out once that change is deployed. (function () { "use strict"; // Set synchronously, before add-examples' DOM-ready pass, so its own inline link is never built. window.wikt = window.wikt || {}; wikt.addExamples = wikt.addExamples || {}; wikt.addExamples.suppressLinks = true; // Subpage segments are case-sensitive, so BASE must match the pages exactly. var BASE = "Bikarhêner:Wikihez/Gadget-test"; // A value carrying a namespace is used as the whole title; anything else is appended to BASE. function pageTitle(suffix) { return suffix.indexOf(":") !== -1 ? suffix : BASE + suffix; } // module name -> package ({main, files}) or plain script ({script}), plus styles. // deferred held back until something asks for it, as production fetches it only then // start asked for on page load, as production loads a default gadget // deps only for a gadget not yet in Gadgets-definition; a registered one keeps the wiki's // actions with start, only on these wgAction values, as a definition's "actions=" does var MODULES = {}; // Force dataType "text": otherwise jQuery sees action=raw's JavaScript Content-Type and runs it. function raw(suffix) { return $.get({ url: mw.util.getUrl(pageTitle(suffix), { action: "raw" }), dataType: "text" }); } function run() { var names = Object.keys(MODULES); // A module the wiki has started loading cannot be implemented a second time. var busy = names.filter(function (name) { var state = mw.loader.getState(name); return state !== null && state !== "registered"; }); if (busy.length) { console.warn("loader.js: already loaded from the wiki, so the site's copy runs: " + busy.join(", ")); mw.notify("loader.js: van amûran di Tercîhan de bigire, da ku kopiya ceribandinê bixebite: " + busy.map(function (n) { return n.replace("ext.gadget.", ""); }).join(", "), { type: "warn" }); } var ours = names.filter(function (name) { return busy.indexOf(name) === -1; }); // Every distinct page this harness needs, fetched once each. var suffixes = []; function need(suffix) { if (suffixes.indexOf(suffix) === -1) { suffixes.push(suffix); } } ours.forEach(function (name) { var m = MODULES[name]; if (m.script) { need(m.script); } else { Object.keys(m.files).forEach(function (key) { need(m.files[key]); }); } m.styles.forEach(need); }); if (!suffixes.length) { return; } $.when.apply($, suffixes.map(raw)).done(function () { var args = suffixes.length === 1 ? [arguments] : [].slice.call(arguments); var text = {}; suffixes.forEach(function (s, i) { text[s] = args[i][0]; }); // Styles go in directly: a stylesheet passed to implement() that never fires its load event // leaves the module stuck in "executing", and everything queued behind it with it. function addStyles(styles) { (styles || []).forEach(function (suffix) { if (text[suffix]) { mw.util.addCSS(text[suffix]); } }); } var bad = null; var payloads = {}; ours.forEach(function (name) { var m = MODULES[name]; if (m.script) { payloads[name] = new Function("$", "jQuery", "require", "module", text[m.script]); return; } var files = {}; Object.keys(m.files).forEach(function (key) { var src = text[m.files[key]]; if (key.slice(-5) === ".json") { try { files[key] = JSON.parse(src); } catch (e) { bad = m.files[key] + " nederbasdar e (JSON parse ket): " + e.message; } return; } files[key] = new Function("require", "module", "exports", src); }); payloads[name] = { main: m.main, files: files }; }); if (bad) { mw.notify(bad, { type: "error" }); return; } // implement() runs a module as soon as its dependencies are ready, so a deferred one is // handed over only when something asks for it. function implement(name) { if (!payloads[name]) { return; } var payload = payloads[name]; delete payloads[name]; if (mw.loader.getState(name) === null) { mw.loader.register(name, "0", MODULES[name].deps || []); } else if (mw.loader.getState(name) !== "registered") { console.warn("loader.js: " + name + " is already loading from the wiki; its copy runs."); return; } mw.loader.implement(name, payload); addStyles(MODULES[name].styles); } // A deferred module reached as another's dependency is handed over too, or ResourceLoader // fetches the site's copy of it instead. function withDeps(list) { var out = []; (function walk(items) { (items || []).forEach(function (n) { if (out.indexOf(n) !== -1) { return; } out.push(n); var entry = mw.loader.moduleRegistry[n]; walk(entry ? entry.dependencies : MODULES[n] && MODULES[n].deps); }); }(list)); return out; } var origUsing = mw.loader.using; mw.loader.using = function (modules) { withDeps([].concat(modules || [])).forEach(implement); return origUsing.apply(this, arguments); }; ours.forEach(function (name) { if (!MODULES[name].deferred) { implement(name); } }); var action = mw.config.get("wgAction"); var starting = ours.filter(function (name) { var m = MODULES[name]; return m.start && (!m.actions || m.actions.indexOf(action) !== -1); }); var settled = false; mw.loader.using(starting).then(function () { settled = true; console.log("loader.js: started " + starting.join(", ")); }, function (err) { settled = true; mw.notify("Xeta barkirinê: " + err, { type: "error" }); }); // A dependency stuck half-loaded leaves using() pending forever, with no error at all. setTimeout(function () { if (settled) { return; } var stuck = withDeps(starting) .filter(function (m) { return mw.loader.getState(m) !== "ready"; }) .map(function (m) { return m + "=" + mw.loader.getState(m); }); mw.notify("Barkirin asê ma: " + stuck.join(", "), { type: "warn" }); }, 10000); }).fail(function () { mw.notify("Nikare hemû rûpelên " + BASE + " bixwîne: " + suffixes.join(", "), { type: "error" }); }); } // The test gadget declares no dependencies, so mw.util is not there yet when this runs. mw.loader.using("mediawiki.util").then(run); })(); // </nowiki> q22g3500tyhz08rh8i8ss1jd2lzgr20 Bikarhêner:Wikihez/Gadget-test/langs.js 2 1358900 6532104 6353105 2026-09-18T20:34:59Z Wikihez 7344 Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json 6532104 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.edit/langs.js]] */ // ~300 common languages ship with the gadget; the remaining ~3400 are fetched from the translation // editor's copy only when a search finds nothing in the short list. ( function () { "use strict"; var core = require( "./ziman-core.json" ); var FULL_PAGE = "MediaWiki:Gadget-translation editor.js/ziman.json"; var full = null; var pending = null; var listeners = []; // {code: name} -- the full list once it has arrived, the short one until then. function names() { return full || core; } function isFull() { return !!full; } // Resolves with the full list, fetched once; falls back to the short list rather than rejecting. function ensureFull() { if ( full ) { return $.Deferred().resolve( full ).promise(); } if ( pending ) { return pending; } pending = $.get( { url: mw.util.getUrl( FULL_PAGE, { action: "raw" } ), dataType: "text" } ).then( function ( text ) { try { full = $.extend( {}, core, JSON.parse( text ) ); } catch ( e ) { full = core; } pending = null; listeners.forEach( function ( fn ) { fn( full ); } ); return full; }, function () { pending = null; return core; } ); return pending; } // True when the text names no language the short list knows -- the cue to go and fetch the rest. function missingFromCore( query ) { var wanted = $.trim( query || "" ).toLowerCase(); if ( !wanted || full ) { return false; } var found = false; Object.keys( core ).some( function ( code ) { if ( code.toLowerCase().indexOf( wanted ) !== -1 || core[ code ].toLowerCase().indexOf( wanted ) !== -1 ) { found = true; return true; } return false; } ); return !found; } // Called with the full list when it lands, so a picker built from the short one can rebuild itself. function onFull( fn ) { if ( full ) { fn( full ); } else { listeners.push( fn ); } } // One <datalist> for the whole page: 3693 options are far too many to rebuild per form, and a list // can be shared by id, so every language box in every gadget points at this one. var DATALIST_ID = "dsb-language-list"; function fillDatalist( $list ) { var all = names(); $list.empty(); Object.keys( all ).forEach( function ( code ) { $list.append( $( "<option></option>" ).val( code ).attr( "label", all[ code ] ) ); } ); } function datalistId() { if ( !document.getElementById( DATALIST_ID ) ) { var $list = $( "<datalist></datalist>" ).attr( "id", DATALIST_ID ); fillDatalist( $list ); $( document.body ).append( $list ); // Refilled in place if the long list ever arrives, so every box using it grows at once. onFull( function () { fillDatalist( $( "#" + DATALIST_ID ) ); } ); } return DATALIST_ID; } module.exports = { names: names, isFull: isFull, ensureFull: ensureFull, missingFromCore: missingFromCore, onFull: onFull, datalistId: datalistId }; }() ); // </nowiki> gz0t5o06ruekajg8el6j72y3uqg5eo5 Bikarhêner:Wikihez/Gadget-test/data-main.json 2 1358901 6532105 6425742 2026-09-18T20:35:09Z Wikihez 7344 Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json 6532105 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîr", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîrasmayî", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "drş", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "dariştî", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qertaf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserq", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserqismî", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denom", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denominal" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "g", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag" }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text" }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } qfwpwpjexzcp34p790istw6qr2fe5i6 6532114 6532105 2026-09-18T20:45:35Z Wikihez 7344 Etymology: offer a modifier only under the keywords it applies to 6532114 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîr", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîrasmayî", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "drş", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "dariştî", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qertaf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserq", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserqismî", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denom", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denominal" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "g", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ], "only": [ "qf" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qf" ] }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qf" ] }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qf" ] } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ], "only": [ "qf" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ], "only": [ "wergirtin" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ], "only": [ "ji", "drş" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag" }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text" }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } q2u0343ttafvbuc3x5mvjn5z8bstyf1 6532549 6532114 2026-09-19T08:52:51Z Wikihez 7344 Etymology: keep dar= and id= in the open, below metn= 6532549 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîr", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîrasmayî", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "drş", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "dariştî", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qertaf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserq", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserqismî", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denom", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denominal" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "g", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ], "only": [ "qf" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qf" ] }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qf" ] }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qf" ] } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ], "only": [ "qf" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ], "only": [ "wergirtin" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ], "only": [ "ji", "drş" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag", "primary": true }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text", "primary": true }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } emnu99qcrdz1fvx2cfmo4lkwcfo9vo3 6532974 6532549 2026-09-19T10:00:46Z Wikihez 7344 Etymology: offer the spelled-out keyword names (qertaf, mîrasmayî, dariştî) instead of their short forms 6532974 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîrasmayî", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîr", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "dariştî", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "drş", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qertaf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserqismî", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserq", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denominal", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denom" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "g", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ], "only": [ "qertaf" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ], "only": [ "qertaf" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ], "only": [ "wergirtin" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ], "only": [ "ji", "dariştî" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag", "primary": true }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text", "primary": true }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } j4njrkz0my1aquhha40j6bfgz54a320 6533217 6532974 2026-09-19T10:38:27Z Wikihez 7344 Etymology: gender is c in the builder, with z and g as aliases 6533217 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîrasmayî", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîr", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "dariştî", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "drş", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qertaf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserqismî", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserq", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denominal", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denom" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "c", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ], "aliases": [ "z", "g" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ], "only": [ "qertaf" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ], "only": [ "qertaf" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ], "only": [ "wergirtin" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ], "only": [ "ji", "dariştî" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag", "primary": true }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text", "primary": true }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } oht8ebq2yw5xs1xmonu1ym66p79j5et Bikarhêner:Wikihez/Gadget-test/dsb-panels.js 2 1358909 6532017 6531987 2026-09-18T14:32:07Z Wikihez 7344 DefSideBoxes: fix the add-subsection form refusing to save with an empty-name error 6532017 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.dsb-panels.js]] * * Everything DefSideBoxes shows once you click: the per-sense advanced panel, the subsection editors, * the part-of-speech picker, the template dialogs, the preview and the queued save. * * Loaded on demand by wikt.dsb, never on a plain page view. It exports only what that half calls. */ (function () { "use strict"; var sections = require("ext.gadget.wikt.core").sections; var edit = require("ext.gadget.wikt.edit"); var cite = require("ext.gadget.wikt.cite"); var util = edit.util; var posparams = edit.posparams; var wt = edit.wt; var startData = edit.data; var langs = edit.langs; var escapeRegExp = util.escapeRegExp; // Local names for the shared wikitext layer, so every call site below reads as it always did. var langHeaderSource = wt.langHeaderSource; var canonicalTemplateKey = wt.canonicalTemplateKey; var aliasPattern = wt.aliasPattern; var splitLeadingCalls = wt.splitLeadingCalls; var splitTemplateParams = wt.splitTemplateParams; var parseTemplateCalls = wt.parseTemplateCalls; var splitCallParams = wt.splitCallParams; var buildTemplateCall = wt.buildTemplateCall; var tdText = wt.tdText; var fetchTemplateData = wt.fetchTemplateData; var parseWordListCall = wt.parseWordListCall; var parseWordListCalls = wt.parseWordListCalls; var namedParam = wt.namedParam; var withNamedParam = wt.withNamedParam; var buildWordListCall = wt.buildWordListCall; var parseBulletWordList = wt.parseBulletWordList; var sectionNames = sections.sectionNames; var MANE_SECTION = sections.MANE_SECTION; var PAGE_SUBSECTIONS = sections.PAGE_SUBSECTIONS; var headingOuter = sections.headingOuter; var headingText = sections.headingText; var isManeHeading = sections.isManeHeading; var sectionTypeOf = sections.sectionTypeOf; var sectionOrdinalWithinLanguage = sections.sectionOrdinalWithinLanguage; var isFormOfWrapper = sections.isFormOfWrapper; var eachLeafDefinition = sections.eachLeafDefinition; var api = new mw.Api(); // metadata[lang].g, minus the grammatical-number codes start.js filters out with isNumberCode(), rendered // the way its genderLabel() does ("m-p" -> "mê (pirjimar)"). // start.js asks transitivity and structural form as two questions and joins them as "<form>-<base>", so // "gerguhêz" alone is "gh" and "xwerû" + "gerguhêz" is "x-gh". // Template call convertSectionToPos() drops under a newly-chosen POS heading, e.g. "Hoker" -> "{{hoker|ku}}". // A "Formeke X" (form-of) heading uses the unchanged base pos template. Doubles as the list of template // calls a conversion may find under the OLD heading and replace, rather than leave stacked beside the new one. // A section's template call. "Formeke Xê" uses X's own template with form=erê. Biwêj is recognised so a // conversion can replace its {{biwêj}}, but never written: no new ones. function posTemplateFor(header) { var form = /^Formeke (.+)ê$/.exec(header || ""); if (form && startData.posChoices[form[1]] && sections.hasFormHeading(form[1])) { return { name: form[1], params: ["form=erê"] }; } var key = util.decapitalize(header || ""); return startData.posChoices[key] ? { name: key, params: [] } : null; } // convertSectionToPos() drops whichever of the tag's names is actually present. var MANE_TAG_REGEX = wt.MANE_TAG_REGEX; // The six per-sense groups start.js writes as "#: {{tpl|lang|word1|word2}}" sub-lines under a "#" definition. // Array order controls where a new group line lands relative to existing ones. Every group lives behind the // quick row's "Hevmane û Bêhtir" dropdown; only the gloss and Nimûne/jêgirtin links sit in the row itself. var SENSE_GROUPS = startData.senseGroups; // The column word-list template new sections are written with; the rest of wordlistTemplates are // spellings the parser also accepts. var WORDLIST_TEMPLATE = startData.wordlistTemplates[0]; // ---- {{werger-ser}} / {{werger-bin}}: one translation box ---- // The pair brackets the rows; the translation editor gadget writes the rows themselves onto the // rendered page, so this only ever builds (and reads back) the opening call. // Parameters, from [[Şablon:werger-ser]]: 1 = the sense shown in the box head, 2 = a note in // parentheses after it, id = anchor override (defaults to 1), stûn = column count, firehî = column // width (default 26em), bgcolor, valign (default top), align (default left). var WERGER_NAMED = ["id", "stûn", "firehî", "bgcolor", "valign", "align"]; function buildWergerBlock(params) { var parts = ["werger-ser"]; // Positional slots: 2 can only be reached past 1, so an empty 1 still has to be written. if (params["1"] || params["2"]) { parts.push(params["1"] || ""); } if (params["2"]) { parts.push(params["2"]); } WERGER_NAMED.forEach(function (key) { if (params[key]) { parts.push(key + "=" + params[key]); } }); return "{{" + parts.join("|") + "}}\n{{werger-bin}}"; } // The opening call of the first block in `text`, as the same {1, 2, id, ...} object. Empty object when // there is none, so a half-typed draft restores as an empty form rather than throwing. function parseWergerBlock(text) { var out = {}; var body = wergerSerBody(String(text || "")); if (!body) { return out; } var positional = 0; splitTemplateArgs(body).forEach(function (arg) { var eq = arg.indexOf("="); var name = eq === -1 ? "" : $.trim(arg.slice(0, eq)); if (eq !== -1 && WERGER_NAMED.indexOf(name) !== -1) { out[name] = $.trim(arg.slice(eq + 1)); } else { out[String(++positional)] = $.trim(arg); } }); return out; } // Everything after "{{werger-ser|" up to the "}}" that closes it, or "" when there is no call or it // takes no parameters. Scans for the matching close rather than the first one: a gloss can hold a // template of its own, and a lazy regex would stop inside it. function wergerSerBody(text) { var m = /\{\{\s*werger-ser\s*(?=[|}])/.exec(text); if (!m) { return ""; } var depth = 1; var start = m.index + m[0].length; for (var i = start; i < text.length - 1; i++) { var two = text.substr(i, 2); if (two === "{{") { depth++; i++; } else if (two === "}}") { depth--; i++; if (!depth) { return text.charAt(start) === "|" ? text.slice(start + 1, i - 1) : ""; } } } return ""; } // Splits on "|" at brace/bracket depth 0, so a value containing a template or a link stays whole. function splitTemplateArgs(body) { var args = []; var depth = 0; var current = ""; for (var i = 0; i < body.length; i++) { var two = body.substr(i, 2); if (two === "{{" || two === "[[") { depth++; current += two; i++; continue; } if (two === "}}" || two === "]]") { depth--; current += two; i++; continue; } if (body[i] === "|" && depth <= 0) { args.push(current); current = ""; continue; } current += body[i]; } args.push(current); return args; } // Canonical ku.wiktionary "====" subsection order, used only as insertPageSubsection()'s insertion rank // (see subsectionRankForHeader()). Wider than PAGE_SUBSECTIONS: it also covers subsections the gadget // cannot create but still has to order around. var SUBSECTION_ORDER = startData.subsectionOrder; // ---- searchable <select> ---------------------------------------------------------------------------- // Same widget start.js gets from its util.js wrapNativeSelect(): the native <select> stays as the value // holder (so .val() and "change" handlers keep working) but is hidden behind a text input that filters an // overlay list. Ported rather than required() because util.js is a file inside start.js's package module, // which another gadget cannot reach; the template-row decoration start.js uses is left out. // util.js's wrapNativeSelect(): the native <select> stays the value holder behind a filtering text input. // It reads its own placeholder off data-placeholder, and its wiktku-* styles ship in start.css, so both // gadgets get the identical widget instead of two lookalikes. function makeSearchable($select, placeholder) { $select.attr("data-placeholder", placeholder || "Lê bigere…"); return util.wrapNativeSelect($select); } // ---- small shared utilities ---- // The readable half of an mw.Api rejection. var apiErrorMessage = util.apiErrorMessage; // Thrown from inside an edit() transform to bail out with a specific message. var SubmitAbort = util.SubmitAbort; // A gloss is one field on the page: the sense, then {{îzah|…}} explaining it when there is one. function joinGloss(mane, izah) { return izah ? $.trim(mane + " {{îzah|" + izah + "}}") : $.trim(mane); } // The two halves are linked separately, never joined first: linkify leaves template calls alone by // design, so anything inside {{îzah|…}} would never be looked at. // // A half is skipped when there is nothing in it worth looking up, and -- when onlyUnlinked is set -- // when it already carries a link. Someone who has linked a word by hand has made that half theirs, and // a save must not go on linking the rest of it behind their back; "Oto-lînk bike" leaves the flag off // and still links on demand. function linkifyGlossParts(mane, izah, done, onlyUnlinked) { function needsLinking(text) { if (!$.trim(text) || !util.hasLinkableText(text)) { return false; } return !(onlyUnlinked && text.indexOf("[[") !== -1); } function step(text, next) { if (!needsLinking(text)) { next(text, null); return; } util.linkifyText(text, function (linked, error) { // An empty answer would wipe what the user typed, so only real text is taken. next(typeof linked === "string" && $.trim(linked) ? $.trim(linked) : text, error || null); }); } step(mane, function (linkedMane, maneError) { step(izah, function (linkedIzah, izahError) { done(linkedMane, linkedIzah, maneError || izahError); }); }); } // Runs transformFn(content) inside mw.Api().edit()'s own transform callback so one fetch covers both the // edit-conflict check and the content, preventing a stale overwrite of someone else's edit. // // No badtoken retry here on purpose: edit() posts through postWithEditToken -> postWithToken, which // already throws the cached token away and repeats the request once when the wiki says "badtoken". // A second retry of our own would only double it. function editPage(summary, transformFn, onSuccess, onError) { api.edit(mw.config.get("wgPageName"), function (revision) { return { text: transformFn(revision.content), summary: summary }; }).then(onSuccess, function (codeOrAbort, result) { if (codeOrAbort instanceof SubmitAbort) { onError(codeOrAbort.message); } else { onError(util.msg.saveFailed + apiErrorMessage(codeOrAbort, result)); } }); } // ---- rendered preview: wikitext through the parse API, so a preview shows what the templates // actually produce rather than a plain list standing in for them ---- // Same text is usually asked for twice (open the preview, close it, open it again), so the promise is // kept rather than the call repeated. var renderCache = {}; /** * Renders wikitext as this page would render it. Resolves with an HTML string. * * pst: 1 applies pre-save transform, so ~~~~ and subst: behave as they will once saved. The * modulestyles/modules the parse reports are loaded before resolving: without them TemplateStyles is * missing and the preview would show the right markup in the wrong clothes. */ function renderWikitext(wikitext) { if (renderCache[wikitext]) { return renderCache[wikitext]; } renderCache[wikitext] = api.post({ action: "parse", format: "json", formatversion: 2, title: mw.config.get("wgPageName"), text: wikitext, contentmodel: "wikitext", prop: "text|modules|jsconfigvars", pst: 1, disablelimitreport: 1, disableeditsection: 1, disabletoc: 1 }).then(function (data) { var parsed = (data && data.parse) || {}; if (parsed.modulestyles && parsed.modulestyles.length) { mw.loader.load(parsed.modulestyles); } if (parsed.modules && parsed.modules.length) { mw.loader.load(parsed.modules); } return parsed.text || ""; }, function () { // A failed render must not be remembered, or the next attempt gets the rejection back. delete renderCache[wikitext]; return $.Deferred().reject().promise(); }); return renderCache[wikitext]; } /** * Puts rendered wikitext into $target, replacing whatever placeholder is there. * * The site's own gadgets are told about it through the "wikipage.content" hook, the same way * MediaWiki announces real content, so collapsible lists and the like behave in the preview too. */ // MediaWiki warns when the hook is fired on content that is not in the document, and a gadget that // listens to it can do nothing useful with nodes nobody can see. function announceContent($el) { if ($el.closest("html").length) { mw.hook("wikipage.content").fire($el); } } function fillWithRendered($target, wikitext, onFail) { return renderWikitext(wikitext).then(function (html) { if (!$target.closest("body").length) { return; // the preview was dropped while the parse was in flight } $target.empty().append($("<div class='mw-parser-output'></div>").html(html)); announceContent($target); }, function () { if (onFail) onFail(); }); } /** * Puts a rendered sense in place of the one on the page, keeping this gadget's own furniture (the * pencil's toolbar, the quick row, any open panel) where it is. The page's own nodes are detached * rather than dropped, so the returned function can put them straight back when the change is * cancelled or superseded. * * Nothing labels the result: the change is shown by the sense simply reading the way it will read, * and the queue box is what says nothing is saved yet. */ function replaceSenseInPlace($li, item) { var html = item.html; var $anchor = $li.children(".dsb-toolbar").last(); // class/id/data-* off the parsed <li>, so a queued maneid shows its pill here exactly as it will // once saved. The old values are kept for the restore below. var node = $li.get(0); var before = {}; $.each(node.attributes, function (_, attr) { before[attr.name] = attr.value; }); $.each(item.attrs, function (name, value) { if (name !== "class") { $li.attr(name, value); } }); var addedClasses = (item.attrs["class"] || "").split(/\s+/).filter(function (c) { return c && !$li.hasClass(c); }); $li.addClass(addedClasses.join(" ")); // add-examples hangs its own <ul> off the sense and opens its form as that <ul>'s next sibling. // Detaching those leaves the form to open into a tree nobody can see -- "+ Nimune/jegirtin" takes // the click and shows nothing -- so they stay where they are. Only the rows already in that <ul> // are hidden, since the preview draws the examples itself; the tool's own title line stays. var $keep = $li.children("ul, .add-example-form"); var $hiddenRows = $keep.filter("ul").children("li").filter(function () { return !$(this).find(".add-example-form-title").length; }); $hiddenRows.addClass("dsb-preview-hidden"); var originals = $li.contents().filter(function () { return !$(this).is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-preview-block, .dsb-sense-preview"); }).not($keep).get(); // Where the sense's own nodes sat, so cancelling puts them back there rather than above the quick // row -- the row belongs between the sense and its examples. var backAfter = originals.length ? originals[0].previousSibling : null; var $rendered = $("<span class='dsb-sense-preview'></span>").html(html); if ($anchor.length) { $anchor.after($rendered); } else { $li.prepend($rendered); } $(originals).detach(); announceContent($rendered); // The id pill is drawn by the same code a page load uses, so a queued maneid looks like a saved // one rather than like something this gadget invented. if (window.wikt && wikt.showIDs && wikt.showIDs.process) { wikt.showIDs.process($li); } // dsb.js puts the example pencils back on the redrawn examples. The originals keep theirs. $li.triggerHandler("dsbSenseRedrawn"); return function () { $hiddenRows.removeClass("dsb-preview-hidden"); $li.removeClass(addedClasses.join(" ")); $.each(item.attrs, function (name) { if (name === "class") { return; } if (Object.prototype.hasOwnProperty.call(before, name)) { $li.attr(name, before[name]); } else { $li.removeAttr(name); } }); $li.children(".senseid-displayed, .etymid-displayed, .etymonid-displayed").remove(); if (backAfter && backAfter.parentNode === node) { $(backAfter).after(originals); } else if ($anchor.length) { $anchor.after(originals); } else { $li.prepend(originals); } $rendered.remove(); }; } /** * The <li> out of a parsed "#" block, and the attributes it carries. * * The parse wraps it in its own <ol>, which must not reach the page: the sense already has a number * from the list it lives in. A leading {{maneid}} also makes the parser emit an empty * "li.mw-empty-elt" ahead of the real one, so the first <li> is not necessarily the sense. * * The attributes matter as much as the content: {{maneid|ku|x}} renders as class="senseid" * data-id="x" on the <li> itself, which is what wikt.showids draws its pill from. */ function parsedSenseItem(html, depth) { var $item = $("<div></div>").html(html).find("ol > li").filter(function () { return !$(this).hasClass("mw-empty-elt"); }).first(); // A sub-sense parsed on its own comes back one <ol> deeper per "#": "##" is a list inside a list. // Descend as far as the sense's own depth, or its number would be drawn inside a second list -- // "2." with a "1." under it. for (var level = 1; level < (depth || 1) && $item.length; level++) { var $inner = $item.children("ol").children("li").filter(function () { return !$(this).hasClass("mw-empty-elt"); }).first(); if (!$inner.length) { break; } $item = $inner; } if (!$item.length) { return { html: html, attrs: {} }; } var attrs = {}; $.each($item.get(0).attributes, function (_, attr) { attrs[attr.name] = attr.value; }); return { html: $item.html(), attrs: attrs }; } // This gadget's own save queue + floating widget, separate from the shared Gadget-Editor queue. // Each entry keeps its own transformFn so saveQueueNow() can re-run all of them against one fresh fetch. var dsbQueue = { // [{key, summary, transformFn, runLast, removePreview}]; transformFn: baseContent -> {content, warnings}. // removePreview lives on the entry so replacing one entry takes its own live DOM preview with it. entries: [] }; var $queueBox = null; function dropPreview(entry) { if (typeof entry.removePreview === "function") { try { entry.removePreview(); } catch (e) { /* a preview failing to clean up should never block the queue itself */ } entry.removePreview = null; } } function clearAllPreviews() { dsbQueue.entries.forEach(dropPreview); } function clearQueue() { clearAllPreviews(); dsbQueue.entries = []; if ($queueBox) { $queueBox.$list.empty(); $queueBox.$box.hide(); } } // Closes every editor UI on the page. Each open box's own "x" clears its getter, restores its picker // link and updates the counter, so those are triggered rather than repeating that work here; hiding a // row alone would leave its fields populated and the next pencil click would reopen them half-filled. function closeAllPanels() { $(".dsb-open-boxes .dsb-box-remove").trigger("click"); $(".dsb-quick-note").hide().text(""); $(".dsb-more-menu").hide(); $(".dsb-subsection-panel, .dsb-convert-pos-panel").hide(); // dsb.js owns each pencil's pinned state; tell it rather than hiding behind its back, or the next // click on the pencil would only toggle "pinned" off and appear to do nothing. $(".dsb-quick-row").trigger("dsbCancel"); } function ensureQueueBox() { if ($queueBox) { return $queueBox; } var $box = $("<div class='dsb-queue-box'></div>").hide(); var $close = $("<a href='#' class='dsb-queue-close' title='Veşêre'>&#215;</a>"); var $title = $("<div class='dsb-queue-title'></div>").text("Guhartinên li benda qeydkirinê"); var $list = $("<ul class='dsb-queue-list'></ul>"); var $empty = $("<div class='dsb-queue-empty'></div>").text( "Guhartinên te dê li vir werin rêzkirin. Heta ku tu pêl «Guhartinan qeyd bike» nekî, " + "tiştek li ser rûpelê nayê weşandin." ); var $status = $("<div class='dsb-queue-status'></div>"); var $save = $("<button type='button' class='dsb-queue-save'>Guhartinan qeyd bike</button>"); var $cancel = $("<button type='button' class='dsb-queue-cancel'></button>").text(util.msg.cancel); var $actions = $("<div class='dsb-queue-actions'></div>").append($save, $cancel); $close.on("click", function (e) { e.preventDefault(); $box.hide(); }); $cancel.on("click", function () { clearQueue(); closeAllPanels(); }); $save.on("click", function () { saveQueueNow(); }); $box.append($close, $title, $empty, $list, $actions, $status); $(document.body).append($box); $queueBox = { $box: $box, $list: $list, $empty: $empty, $status: $status, $save: $save, $cancel: $cancel }; return $queueBox; } // Takes one change out of the queue and puts the page back as it was before it, its in-place preview // included. The queue is the only record of what "Guhartinan qeyd bike" will write, so every line in it // has to be removable on its own -- closing the panel that made a change does not unmake it. // Each preview draws the page the whole queue would save, so one entry leaving changes what all the // others should show. They are taken down and drawn again from what is left. function redrawPreviews() { dsbQueue.entries.forEach(function (entry) { if (typeof entry.previewFn !== "function") { return; } dropPreview(entry); try { var removePreview = entry.previewFn(); if (typeof removePreview === "function") { entry.removePreview = removePreview; } } catch (e) { /* a broken preview never stops the queue */ } }); } function dropQueueEntry(entry) { var at = dsbQueue.entries.indexOf(entry); if (at === -1) { return; } dropPreview(entry); dsbQueue.entries.splice(at, 1); redrawPreviews(); renderQueueBox(); hideQueueIfIdle(); } function renderQueueBox() { var box = ensureQueueBox(); box.$list.empty(); dsbQueue.entries.forEach(function (entry) { var $drop = $("<button type='button' class='dsb-queue-drop'>&#215;</button>") .attr("title", "Vê guhartinê ji rêzê derxe"); $drop.on("click", function () { dropQueueEntry(entry); }); box.$list.append($("<li></li>").text(entry.summary).append($drop)); }); box.$empty.toggle(!dsbQueue.entries.length); box.$status.removeClass("dsb-status-ok dsb-status-error").text(""); box.$save.prop("disabled", !dsbQueue.entries.length); box.$box.show(); } // Shown the moment a panel opens, empty, so it is clear before anything is typed that a change waits // for "Guhartinan qeyd bike" rather than publishing itself. function openQueueBox() { renderQueueBox(); } // Nothing queued and no form left open means nothing to save, so the box goes away rather than // lingering on an empty state. function hideQueueIfIdle() { if (dsbQueue.entries.length || !$queueBox) { return; } if ($(".dsb-quick-row:visible, .dsb-subsection-panel:visible, .dsb-convert-pos-panel:visible").length) { return; } $queueBox.$box.hide(); } // Asks core's postEdit module to show its toast on the next load (dsb.js loads it there), then reloads. // Loaded here rather than declared as a dependency, so a reload happens even if it fails. function reloadWithPostEditNotice() { mw.loader.using("mediawiki.action.view.postEdit").then(function (require) { require("mediawiki.action.view.postEdit").fireHookOnPageReload("saved"); }).always(function () { location.reload(); }); } // A transform returns either the new page text or {content, warnings}; both shapes are accepted. // One that returns neither stops the save, named, rather than writing a broken page. function transformedContent(entry, pageContent) { var result = entry.transformFn(pageContent); var next = typeof result === "string" ? result : (result && result.content); if (typeof next !== "string") { throw new SubmitAbort("Guhartin nehate sepandin: " + entry.summary); } return next; } // Queue order, except that runLast entries move to the end: converting "=== Mane ===" into a real POS // heading renames the very heading every other queued change locates itself by. // Those run from the bottom of the page up: a rename changes the ordinals of the sections after it // ("Mane 2" becomes "Mane 1"), never of the ones before. function orderedEntries() { var normal = []; var last = []; dsbQueue.entries.forEach(function (entry) { (entry.runLast ? last : normal).push(entry); }); last.sort(function (a, b) { return b.pagePosition - a.pagePosition; }); return normal.concat(last); } /** * The pending page as previews and example lookups need it: every queued transform, in save order, * except the runLast section renames. Those callers find their section under the heading it has on * the page now, which a queued "Mane" -> "Navdêr" would take away, and a rename leaves the senses as * they are. An entry that cannot apply is skipped -- the save reports that properly, and a preview * must not shout. */ function queuedContent(pageContent) { var content = pageContent; orderedEntries().filter(function (entry) { return !entry.runLast; }).forEach(function (entry) { try { content = transformedContent(entry, content); } catch (e) { // Left out of the preview; the save reports it properly. Named, so a change that fails to // draw is distinguishable from one with nothing to draw. mw.log.warn("wikt.dsb: pêşdîtin bêyî vê guhartinê hate xêzkirin — " + entry.summary, e); } }); return content; } /** * Redraws one sense where it sits, from the page the queue would save -- so a queued gloss edit, a * queued example and everything else pending on that sense are shown together, rendered by the parser * rather than described in a box. Returns the queue's own "take the preview down" function. * * One preview per sense: a second queued change takes the first drawing down and draws the queue. */ function previewSense($li, language, sectionType, sectionOrdinal, definitionLevel) { var cancelled = false; var restore = null; function undo() { cancelled = true; if (restore) { restore(); restore = null; } if ($li.data("dsbPreview") === undo) { $li.removeData("dsbPreview"); } } var previous = $li.data("dsbPreview"); if (typeof previous === "function") { previous(); } $li.data("dsbPreview", undo); fetchPageContent().then(function (pageContent) { if (cancelled) { return; } var wikitext; try { wikitext = senseBlockWikitext(queuedContent(pageContent), language, sectionType, sectionOrdinal, definitionLevel); } catch (e) { return; } renderWikitext(wikitext).then(function (html) { if (cancelled || $li.data("dsbPreview") !== undo || !$li.closest("body").length) { return; } restore = replaceSenseInPlace($li, parsedSenseItem(html, definitionLevel.length - 1)); }); }); return undo; } // The real save: re-runs every queued transformFn, in order, against one freshly-fetched revision and // posts the result as a single edit with a combined summary. function saveQueueNow() { if (!dsbQueue.entries.length) { return; } var box = ensureQueueBox(); box.$save.prop("disabled", true); box.$cancel.prop("disabled", true); box.$status.removeClass("dsb-status-ok dsb-status-error").text("Tê qeydkirin…"); var entries = orderedEntries(); // Grouped by place, in the order the places were first queued: several changes to one section read // as "Kurmancî/Navdêr 2: a, b, c" rather than repeating the section name in front of each of them. var order = []; var byPlace = {}; entries.forEach(function (entry) { if (!Object.prototype.hasOwnProperty.call(byPlace, entry.place)) { byPlace[entry.place] = []; order.push(entry.place); } byPlace[entry.place].push(entry.action); }); var combinedSummary = order.map(function (place) { var actions = byPlace[place].join(", "); return place ? place + ": " + actions : actions; }).join("; ") + " (DefSideBoxes)"; editPage( combinedSummary, function (pageContent) { var content = pageContent; entries.forEach(function (entry) { content = transformedContent(entry, content); }); return content; }, function (data) { forgetPageContent(); clearAllPreviews(); dsbQueue.entries = []; box.$list.empty(); box.$status .removeClass("dsb-status-error") .addClass("dsb-status-ok") .text("✓ Hemû guhartin hatin qeydkirin."); box.$save.prop("disabled", true); box.$cancel.prop("disabled", false); // A real edit reloads the page and gets MediaWiki's own "Guhartina te hat weşandin." toast, the // one a normal save shows. A null edit changed nothing, so the page stays as it is. if (data && data.newrevid) { reloadWithPostEditNotice(); } }, function (message) { box.$save.prop("disabled", false); box.$cancel.prop("disabled", false); box.$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message); } ); } // "Kurmancî/Navdêr" -- where a queued change lands, for its summary. The language name comes from the // shipped list; an unknown code is left as the code itself. // "Kurmancî/Navdêr", or "Kurmancî/Navdêr 2" where the language has more than one section of that // type. Without the number a summary on a page with two Navdêr sections named neither of them. // Numbered only when it disambiguates: on the usual page "Navdêr 1" would just be noise. function placeLabel(language, sectionType, $h3) { return langLabel(language) + "/" + sectionLabel(sectionType, $h3); } // Bilêvkirin sits above the parts of speech and belongs to the whole language, so naming the section // it was opened from would say something untrue about what the edit touches. function subsectionPlaceLabel(subsection, language, sectionType, $h3) { if (subsection && subsection.free) { return langLabel(language) + "/" + subsection.header; } return subsection && subsection.place === "pron" ? langLabel(language) : placeLabel(language, sectionType, $h3); } function sectionLabel(sectionType, $h3) { if ($h3 && $h3.length && sections.sectionTypeCountWithinLanguage($h3) > 1) { return sectionType + " " + sections.sectionOrdinalWithinLanguage($h3); } return sectionType; } // Capitalised because it opens the summary; Kurdish otherwise writes language names lower-case. function langLabel(language) { var names = langs.names(); return util.capitalize(names[language] || language); } // The parts of a sense the form actually changed, so the summary lists them instead of saying nothing. function senseChangeLabels(changes) { var parts = []; var changed = changes.changed || {}; if (changes.gloss) { parts.push("mane"); } if (changes.newSense) { parts.push("maneyeke nû"); } SENSE_GROUPS.forEach(function (group) { if (changed["word:" + group.key]) { parts.push(group.label.toLowerCase()); } }); if (changed.maneid) { parts.push("id"); } if (changed.etiket) { parts.push("etîket"); } if (changed.kategori) { parts.push("kategorî"); } return parts; } // Queues transformFn(baseWikitext) -> {content, warnings} for the real save to run later against fresh // content (see saveQueueNow()); nothing here touches the page yet. Also runs previewFn(), which drops a // small "not saved yet" preview into the live DOM at the change's own spot on the page. Shared by every // panel that queues a wikitext change: buildAdvancedPanel, buildSubsectionPanel, buildConvertPosPanel. // place is what the change is being made to ("Kurmancî/Navdêr 2"), action is what is being done to it. // Kept apart rather than pre-joined so saveQueueNow() can name a section once and list everything // queued against it after it, instead of repeating the place before every item. function queueChange(place, action, transformFn, $save, $status, previewFn, opts) { opts = opts || {}; var entry = { key: opts.key || null, place: place || "", action: action, summary: place ? place + ": " + action : action, transformFn: transformFn, runLast: !!opts.runLast, pagePosition: opts.pagePosition || 0, // Kept, not just run: redrawPreviews() calls it again when another entry leaves the queue. previewFn: typeof previewFn === "function" ? previewFn : null, removePreview: null }; // Queuing the same target twice replaces the pending change rather than stacking a second one -- // two "+Têkildar" entries would both run, and the second would abort on "Ev beş jixwe heye". var superseded = false; if (entry.key) { for (var i = dsbQueue.entries.length - 1; i >= 0; i--) { if (dsbQueue.entries[i].key === entry.key) { dropPreview(dsbQueue.entries[i]); dsbQueue.entries.splice(i, 1); superseded = true; } } } dsbQueue.entries.push(entry); $status.removeClass("dsb-status-error").addClass("dsb-status-ok").text( "✓ li rêza guhartinan hate zêdekirin — pêl «Guhartinan qeyd bike» bike da ku bi cih bibe." ); $save.prop("disabled", false); if (previewFn) { try { var removePreview = previewFn(); if (typeof removePreview === "function") { entry.removePreview = removePreview; } } catch (e) { /* a broken preview should never stop the change from being queued */ } } // What the superseded entry drew is gone from the queue, so whatever else is drawn from it is stale. if (superseded) { dsbQueue.entries.forEach(function (other) { if (other !== entry) { dropPreview(other); } }); redrawPreviews(); } renderQueueBox(); } // Runs text through the ext.gadget.linkify gadget ($.kuLinkify) and calls back with the linkified result. // Passes the text through unchanged if the gadget can't be loaded, so it never blocks a save. var linkifyText = util.linkifyText; // ---- wikitext location ---- // // One copy for both editing gadgets, in wikt.edit: add-examples writes into the same places. var langSectionRange = wt.langSectionRange; var locateSection = wt.locateSection; var findDefinitionLine = wt.findDefinitionLine; /** * The wikitext of one sense's own block: its "#" line plus everything nested under it -- the "#:" word * lines, the "#*" citations and any sub-senses -- stopping at the next line of the same depth that * starts a new sense. Parsed on its own that block renders as exactly the <li> the page shows. */ function senseBlockWikitext(pageContent, language, sectionType, sectionOrdinal, definitionLevel) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var depth = definitionLevel.length - 1; var out = [lines[defLine]]; for (var i = defLine + 1; i < lines.length; i++) { var m = /^(#+)([:*]?)/.exec(lines[i]); if (!m || m[1].length < depth) { break; } // Same depth and no ":" or "*" after the hashes is the next sense, not part of this one. if (m[1].length === depth && !m[2]) { break; } out.push(lines[i]); } return out.join("\n"); } // Inserts or extends a "#: {{tplKey|lang|word1|word2}}" sub-line for one sense (start.js's wordLine() // format). If a line for this tplKey already exists under the definition, missing words are appended to // it; otherwise a new line lands after the last existing group line, always before any "#*" citation lines. function insertSenseWords(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, words, opts) { opts = opts || {}; var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = new Array(definitionLevel.length).join("#"); // definitionLevel.length - 1 "#" characters // Group 1 is the spelling the page uses, group 2 the parameters: an existing {{hevwate}} stays // {{hevwate}} rather than being silently renamed to {{hevmane}}. var tplLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + aliasPattern(tplKey) + ")\\s*\\|([^}]*)\\}\\}\\s*$"); var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|"); var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|"); var anyBlockLineRegex = new RegExp("^" + marker + "[:*]"); var lastGroupLine = -1; for (var i = defLine + 1; i < lines.length; i++) { if (!anyBlockLineRegex.test(lines[i])) { break; } var tplMatch = tplLineRegex.exec(lines[i]); if (tplMatch) { var foundKey = tplMatch[1]; if (opts.replace) { // Editing an existing list: an empty result means the user cleared it, so drop the line. if (words.length) { lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + words.join("|") + "}}"; } else { lines.splice(i, 1); } return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } var params = tplMatch[2].split("|"); // [lang, word1, word2, ...] var existingWords = params.slice(1); words.forEach(function (w) { if (existingWords.indexOf(w) === -1) { existingWords.push(w); } }); lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + existingWords.join("|") + "}}"; return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } if (groupLineRegex.test(lines[i])) { lastGroupLine = i; } } var insertAt = lastGroupLine >= 0 ? lastGroupLine + 1 : defLine + 1; lines.splice(insertAt, 0, marker + ": {{" + tplKey + "|" + language + "|" + words.join("|") + "}}"); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Canonical left-to-right order of the small templates that can prefix a definition line's gloss text: // maneid, then kategori (K), then etîket (e). var LEADING_TPL_ORDER = startData.leadingTplOrder; // True for a leading call the advanced panel edits in a box of its own -- those are kept out of the // gloss box so the same template is never editable in two places at once. Redirect spellings count: // {{f}} and {{etîket}} are {{e}}. function hasOwnFieldBox(key) { return LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(key)) !== -1; } // Inserts, extends, or (with opts.replace) overwrites one of the small templates that prefix a definition // line's gloss text -- {{maneid|lang|id}}, {{K|lang|kat1|...}} or {{e|lang|etîket1|...}}. Under // opts.replace an empty values list removes the call rather than writing an empty one. function insertLeadingSenseTpl(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, values, opts) { opts = opts || {}; var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, ""); // Collecting the whole leading-call run means an existing tplKey call is found and merged wherever it // already sits, not just when it happens to be first. var split = splitLeadingCalls(afterMarker); var calls = split.calls; var rest = split.rest; var existing = null; calls.forEach(function (c) { if (canonicalTemplateKey(c.key) === tplKey) { existing = c; } }); if (existing) { if (opts.replace) { // Editing an existing call: an empty result means the user cleared it, so drop the call. if (values.length) { existing.params = [language].concat(values); } else { calls = calls.filter(function (c) { return c !== existing; }); } } else { var existingVals = existing.params.slice(1); values.forEach(function (v) { if (existingVals.indexOf(v) === -1) { existingVals.push(v); } }); existing.params = [language].concat(existingVals); } } else if (!values.length) { return pageContent; // nothing to add, and nothing there to clear } else { // Not present yet -- insert right before the first existing call that outranks tplKey in // LEADING_TPL_ORDER (an unrecognized call always outranks everything), or at the end of the run. var myRank = LEADING_TPL_ORDER.indexOf(tplKey); var insertAt = calls.length; for (var i = 0; i < calls.length; i++) { var otherRank = LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(calls[i].key)); if (otherRank === -1 || otherRank > myRank) { insertAt = i; break; } } calls.splice(insertAt, 0, { key: tplKey, params: [language].concat(values) }); } var rebuilt = calls.map(function (c) { return "{{" + c.key + "|" + c.params.join("|") + "}}"; }).join(" "); lines[defLine] = marker + " " + (rebuilt ? rebuilt + " " : "") + rest; return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Replaces just the gloss text of a definition line, leaving any leading template calls untouched -- // the save half of "Maneyê biguhêre" (edit sense). function updateSenseGloss(pageContent, language, sectionType, sectionOrdinal, definitionLevel, newGloss) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, ""); // The box holds everything except the calls with their own field, so those are put back in front. // Dropping "{{mane?}}" here is what clears start.js's placeholder once a real gloss is written. var kept = splitLeadingCalls(afterMarker).calls.filter(function (c) { return hasOwnFieldBox(c.key); }); var leadingText = kept.map(function (c) { return "{{" + c.key + "|" + c.params.join("|") + "}}"; }).join(" "); lines[defLine] = marker + " " + (leadingText ? leadingText + " " : "") + newGloss; return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Deletes one sense: its definition line plus everything indented under it (its "#:" groups, "#*" // citations, any sub-senses). Refuses to empty a section, since a POS heading with no senses is worse // than the sense the user wanted gone. // A new sense goes directly below the one whose pencil asked for it -- after the lines that sense owns // (its "#:" examples, "#*" citations and "##" sub-senses), so it reads as the next sense rather than // landing at the foot of the section. It takes the same marker depth as its neighbour, so asking from // a "##" sub-sense adds a sibling sub-sense. function insertNewSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel, text) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var end = defLine + 1; var ownedRegex = new RegExp("^" + marker + "[#:*]"); while (end < lines.length && ownedRegex.test(lines[end])) { end++; } lines.splice(end, 0, marker + " " + text); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } function removeSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var end = defLine + 1; var ownedRegex = new RegExp("^" + marker + "[#:*]"); while (end < lines.length && ownedRegex.test(lines[end])) { end++; } // Top-level senses of this section only -- "##" sub-senses go with their parent either way. if (definitionLevel.length === 2) { var siblings = 0; for (var i = loc.posLineIndex + 1; i < lines.length && !/^==/.test(lines[i]); i++) { if (/^#[^*#:]/.test(lines[i])) { siblings++; } } if (siblings < 2) { throw new SubmitAbort("Ev maneya dawî ya vê beşê ye. Ji bo rakirinê divê tu tevahiya beşê rakî."); } } lines.splice(defLine, end - defLine); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Fetches the page's current wikitext and pulls out just this sense's gloss text to prefill the "Maneyê // biguhêre" form. A plain read, not part of the hardened save path -- the actual save still re-fetches // fresh content, so only the prefilled text itself could be a little stale. // Current contents of one existing subsection, for prefilling the edit form. // This page's current wikitext. // One fetch for the whole queue: every preview reads the same revision, and asking per preview meant // downloading the page again for each queued change. Dropped after a save, when the page has moved on. var pageContentPromise = null; function forgetPageContent() { pageContentPromise = null; } function fetchPageContent() { if (pageContentPromise) { return pageContentPromise; } pageContentPromise = rawPageContent(); // A failed read must not be remembered as the answer. pageContentPromise.fail(forgetPageContent); return pageContentPromise; } function rawPageContent() { return api.get({ action: "query", prop: "revisions", rvprop: "content", titles: mw.config.get("wgPageName"), formatversion: 2 }).then(function (data) { var page = data.query && data.query.pages && data.query.pages[0]; var content = page && !page.missing && page.revisions && page.revisions[0] && page.revisions[0].content; if (!content) { throw new SubmitAbort("Nikare muhtewaya rûpelê bixwîne."); } return content; }); } function fetchPageSubsection(language, sectionType, sectionOrdinal, subsection) { return fetchPageContent().then(function (content) { return readPageSubsection(content, language, sectionType, sectionOrdinal, subsection); }); } function fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel) { return fetchPageContent().then(function (content) { return readSenseFields(content, language, sectionType, sectionOrdinal, definitionLevel); }); } // Everything the advanced panel can edit about one sense, read off its definition line and the "#:" lines // under it: the raw gloss (templates included), the leading maneid/K/e values, and each word-list group. function readSenseFields(pageContent, language, sectionType, sectionOrdinal, definitionLevel) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var defMarker = /^#+/.exec(lines[defLine])[0]; var afterMarker = lines[defLine].slice(defMarker.length).replace(/^\s+/, ""); var leading = {}; splitLeadingCalls(afterMarker).calls.forEach(function (c) { leading[canonicalTemplateKey(c.key)] = c.params.slice(1); }); // Only start.js's "{{mane?|lang}}" placeholder is hidden; every other template stays visible so it can // be edited by hand in the gloss box. // The gloss box shows the line minus the calls that have their own box ({{maneid}}, {{K}}, {{e}} and // their redirects) and minus start.js's "{{mane?}}" placeholder. Everything else -- a {{g}} link, a // {{guharto}} -- stays visible and editable there. var split = splitLeadingCalls(afterMarker); var glossCalls = split.calls.filter(function (c) { return !hasOwnFieldBox(c.key) && canonicalTemplateKey(c.key) !== "mane?"; }); var glossLead = glossCalls.map(function (c) { return "{{" + c.key + "|" + c.params.join("|") + "}}"; }).join(" "); var gloss = $.trim((glossLead ? glossLead + " " : "") + split.rest); var marker = new Array(definitionLevel.length).join("#"); var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|"); var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|([^}]*)\\}\\}\\s*$"); var anyBlockLineRegex = new RegExp("^" + marker + "[:*]"); var words = {}; for (var i = defLine + 1; i < lines.length; i++) { if (!anyBlockLineRegex.test(lines[i])) { break; } var m = groupLineRegex.exec(lines[i]); if (m) { words[canonicalTemplateKey(m[1])] = m[2].split("|").slice(1); } } return { gloss: gloss, maneid: leading.maneid ? leading.maneid[0] : "", etiket: leading.e || [], kategori: leading.K || [], words: words }; } // Finds a POS block's body range (up to, but not including, the next heading of level <= 3), and the // header text + line index of any "====" subsections it already contains. // depth is the part-of-speech heading's own ("===" on most entries, "====" where the senses are // grouped under numbered etymologies). Its block runs to the next heading at that depth or shallower, // and its subsections are the headings one deeper. function posBlockBounds(lines, posLineIndex, depth) { depth = depth || 3; var blockEnd = wt.headingAtOrAbove(depth); var subsectionHeading = wt.headingAtDepth(depth + 1); var end = lines.length; var existingHeaders = []; for (var i = posLineIndex + 1; i < lines.length; i++) { if (blockEnd.test(lines[i])) { end = i; break; } var sub = subsectionHeading.exec(lines[i]); if (sub) { existingHeaders.push({ header: $.trim(sub[1]), lineIndex: i }); } } return { end: end, existingHeaders: existingHeaders, depth: depth }; } // Looks up a header's rank in SUBSECTION_ORDER. -1 for a header that isn't one of ours; such a header is // never used as an insertion anchor. function subsectionRankForHeader(header) { return SUBSECTION_ORDER.indexOf(header); } // Body line range of one "====" subsection inside a POS block: everything after its heading up to the next // "====" heading, or the end of the block. Null if the block has no such subsection. function subsectionBodyRange(bounds, header) { var headers = bounds.existingHeaders; for (var i = 0; i < headers.length; i++) { if (headers[i].header === header) { return { start: headers[i].lineIndex + 1, end: i + 1 < headers.length ? headers[i + 1].lineIndex : bounds.end }; } } return null; } // ---- template-parameter editing ------------------------------------------------------------------- // A gloss that is nothing but one template call gets a labelled box per parameter instead of a raw // wikitext line, the way VisualEditor's template dialog works. // The single template call a gloss is made of, or null when the line is anything less tidy. {{g|...}} is a // link inside the gloss rather than the gloss itself, so it neither disqualifies the line nor gets a form. function glossTemplateTarget(gloss) { var parsed = parseTemplateCalls(gloss || ""); if (parsed.otherContent) { return null; } var editable = parsed.calls.filter(function (c) { return canonicalTemplateKey(c.name) !== "g"; }); return editable.length === 1 ? editable[0] : null; } // ---- the three places that carry no "====" heading of their own ---------------------------------- // Bilêvkirin is a "===" section above the POS blocks, images sit at the top of a POS block, and the // h-bnr hatnote goes above the first language heading. Each is located here and then read, written or // inserted through the same three lines of splice, so nothing below needs to know about them. var IMAGE_LINE = /^\[\[\s*(?:Wêne|File|Image|Dosya)\s*:/i; /** * {lines, langSectionIndex, exists, start, end, insertAt} for a subsection carrying a "place", or null * for an ordinary one. start..end is the body as it stands; insertAt is where a missing one goes. */ function locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection) { var place = subsection.place; if (!place) { return null; } var i, end; if (place === "page-top") { // Above every language section, so the whole page is the search space. The call is found under // any of its names, and its own name is carried back so a save never renames it. var pageLines = pageContent.split("\n"); var call = wt.findHbnrCall(pageContent); if (call) { return { lines: pageLines, langSectionIndex: 0, exists: true, call: call, start: call.lineIndex, end: call.lineIndex + 1, insertAt: call.lineIndex }; } return { lines: pageLines, langSectionIndex: 0, exists: false, start: 0, end: 0, insertAt: 0 }; } var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; if (place === "pron") { // One per language, not one per part of speech, so it is looked for above the POS heading. for (i = 0; i < loc.posLineIndex; i++) { var h3 = /^===\s*([^=]+?)\s*===/.exec(lines[i]); if (h3 && $.trim(h3[1]) === subsection.header) { end = i + 1; while (end < lines.length && !/^==/.test(lines[end])) { end++; } return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: true, start: i + 1, end: end, insertAt: i }; } } // Straight after the language heading, which puts it before every POS block. return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: false, start: 1, end: 1, insertAt: 1 }; } if (place === "pos-top") { // Between the conjugation line and the headword template -- where the wizard writes them. var at = loc.posLineIndex + 1; while (at < lines.length && /^\{\{\s*ku-tewîn/.test($.trim(lines[at]))) { at++; } var from = at; while (at < lines.length && IMAGE_LINE.test($.trim(lines[at]))) { at++; } return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: at > from, start: from, end: at, insertAt: from }; } return null; } // The wikitext a "place" section's content becomes. A word list there is one template call, not a // {{kol3}} block, so the words are joined into it -- and any ⊕ modifier a row picked up is dropped, // since a page name is all the call can carry. function loosePlaceBody(subsection, content, language) { if (subsection.kind === "images") { return $.grep($.map(content || [], function (image) { return wt.buildImageLine({ file: image.file, caption: wt.captionForLang(image.caption, language), alt: image.alt, size: image.size, extra: image.extra }); }), Boolean).join("\n"); } return content; } // The words a "place" word list holds, flattened out of its single group. Any ⊕ modifier a row picked // up is dropped: a page name is all the call can carry. function loosePlaceWords(content) { var words = []; $.each(content || [], function (_, group) { $.each(group.words || [], function (_, raw) { var plain = $.trim(util.parseWordValue(raw).word); if (plain && $.inArray(plain, words) === -1) { words.push(plain); } }); }); return words; } // Writes one of those places, inserting it when it is not there yet and replacing it when it is. Only // Bilêvkirin carries a heading; the other two are bare lines. function writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection, content) { var at = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection); if (!at) { throw new SubmitAbort("Cih nehate dîtin: " + subsection.header); } // A call naming a subpage -- "{{h-bnr/-ane}}" -- holds a list shared by every page transcluding // it. Writing here would change this page alone and desync the rest, so the edit is refused and // the template that actually owns the list is named instead. if (at.call && at.call.subpage) { throw new SubmitAbort("Ev rûpel «{{" + at.call.name + "}}» bi kar tîne — lîste li " + "[[Şablon:" + at.call.subpage + "]] ye, lê wê zêde bike, ne li vê rûpelê."); } // A word list here is one template call, so it is built where the existing call's own name is // known -- editing "{{bnr-h|...}}" must not turn it into "{{h-bnr|...}}". var body = subsection.kind === "wordlist" ? wt.buildHbnrCall(loosePlaceWords(content), at.call && at.call.name) : $.trim(content || ""); // A "===" section is separated from what is above and below it by a blank line, the way the rest // of an entry is written. The other two places are bare lines inside a block and take none. var heading = subsection.place === "pron"; function blank(index) { return $.trim(at.lines[index] || "") === ""; } if (at.exists) { if (body) { var replacement = [body]; // end is the next "==" heading; the blank line before it is inside the range being replaced. if (heading && /^==/.test(at.lines[at.end] || "")) { replacement.push(""); } at.lines.splice.apply(at.lines, [at.start, at.end - at.start].concat(replacement)); } else { // Emptying the box removes the section rather than leaving an empty heading behind. at.lines.splice(at.start, at.end - at.start); if (heading) { at.lines.splice(at.insertAt, 1); // The blank line that separated it goes with it, rather than doubling up. if (blank(at.insertAt) && blank(at.insertAt - 1)) { at.lines.splice(at.insertAt, 1); } } } } else { if (!body) { throw new SubmitAbort("Tiştek nehate nivîsandin."); } var block = heading ? ["=== " + subsection.header + " ===", body] : [body]; if (heading) { if (!blank(at.insertAt - 1)) { block.unshift(""); } if (!blank(at.insertAt)) { block.push(""); } } at.lines.splice.apply(at.lines, [at.insertAt, 0].concat(block)); } return pageContent.slice(0, at.langSectionIndex) + at.lines.join("\n"); } // What a section body holds: its {{kol3}} groups, the plain bullet list that stands in for them, or // the raw wikitext when it is neither. A free section is read this way before its kind is known. function readSubsectionBody(body, subsection) { if (subsection.kind === "wordlist" || subsection.free) { var calls = parseWordListCalls(body); if (calls.length) { return { kind: "wordlist", groups: calls.map(function (call) { return { sernav: namedParam(call.named, "sernav"), words: call.words }; }) }; } var bullets = parseBulletWordList(body); if (bullets) { // Editable as a word list; saving rewrites the bullets as {{kol3}}. return { kind: "wordlist", groups: [{ sernav: "", words: bullets }], fromBullets: true }; } } return { kind: "text", text: $.trim(body) }; } // The wikitext a section body becomes after an edit. A wordlist keeps its own template name, language // and named params ("cure=Jê", ...) and only has its positional words replaced; a text one is // replaced whole. function rewriteSubsectionBody(body, language, subsection, content) { if (subsection.kind !== "wordlist") { // Replacing the body wholesale drops that separator, so put it back. return content + (/\n\s*$/.test(body) ? "\n" : ""); } var calls = parseWordListCalls(body); if (calls.length) { // Each call is rewritten where it stands, so text between and around them survives untouched. // Last to first, so the offsets of the earlier ones stay valid as we go. var replacement = body; for (var gi = calls.length - 1; gi >= 0; gi--) { var call = calls[gi]; var group = content[gi]; // A group emptied in the form drops its call entirely rather than leaving "{{kol3|ku}}". var rebuilt = group && group.words.length ? buildWordListCall(call.name, call.lang, withNamedParam(call.named, "sernav", group.sernav), group.words) : ""; replacement = replacement.slice(0, call.start) + rebuilt + replacement.slice(call.end); } // Groups the form added beyond the ones already there go after the last of them. var added = content.slice(calls.length).filter(function (group) { return group.words.length; }).map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words); }); if (added.length) { replacement = replacement.replace(/\s*$/, "") + "\n\n" + added.join("\n\n") + "\n"; } return replacement.replace(/\n{3,}/g, "\n\n"); // gaps left by any dropped call } if (parseBulletWordList(body)) { // A plain bullet list is replaced wholesale by a real {{kol3}} on its first edit. return content.map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words); }).join("\n\n") + (/\n\s*$/.test(body) ? "\n" : ""); } throw new SubmitAbort("Nikare lîsteya vê beşê bixwîne: " + subsection.header); } // ---- sections that are not subsections of a part of speech ---- // A "=== Etîmolojî ===" that the parts of speech hang under, a "=== Çavkanî ===" at the foot of a // language, a heading nobody planned for. Located by its own text, and edited as the wikitext under // it -- or as a {{kol3}} list when that is what it holds. function freeSectionBody(pageContent, language, subsection) { var loc = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal); return { loc: loc, body: loc.lines.slice(loc.bodyStart, loc.bodyEnd).join("\n") }; } function readFreeSection(pageContent, language, subsection) { var at = freeSectionBody(pageContent, language, subsection); return readSubsectionBody(at.body, subsection); } function updateFreeSection(pageContent, language, subsection, content) { var at = freeSectionBody(pageContent, language, subsection); at.loc.lines.splice(at.loc.bodyStart, at.loc.bodyEnd - at.loc.bodyStart, rewriteSubsectionBody(at.body, language, subsection, content)); return pageContent.slice(0, at.loc.langSectionIndex) + at.loc.lines.join("\n"); } // ---- removing and renaming a heading ---- // A subsection's heading line and the end of what it owns, as {loc, heading, end, depth, bounds}. A // "====" subsection runs to the next one, taking deeper headings with it. A free section owns only its // own text: what sits under it belongs to the parts of speech (see removeSubsection). function headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection) { if (subsection.free) { var free = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal); return { loc: free, heading: free.headingLineIndex, end: free.bodyEnd, depth: free.depth }; } var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth); var range = subsectionBodyRange(bounds, subsection.header); if (!range) { throw new SubmitAbort(util.msg.sectionMissing + subsection.header); } return { loc: loc, heading: range.start - 1, end: range.end, depth: bounds.depth + 1, bounds: bounds }; } // A free section with deeper headings under it is refused: removing it would leave them under the // section before, and taking them along would remove whole parts of speech. function hasDeeperHeadingAfter(lines, index, depth) { var m = /^(=+)[^=]/.exec(lines[index] || ""); return !!m && m[1].length > depth; } function removeSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) { var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection); var lines = span.loc.lines; if (subsection.free && hasDeeperHeadingAfter(lines, span.end, span.depth)) { throw new SubmitAbort("Di bin «" + subsection.header + "» de beşên din hene; pêşî wan jê bibe."); } lines.splice(span.heading, span.end - span.heading); // The blank line that separated it goes with it, rather than doubling up. if (span.heading > 0 && !$.trim(lines[span.heading - 1]) && !$.trim(lines[span.heading] || "x")) { lines.splice(span.heading, 1); } return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n"); } function renameSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, newHeader) { var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection); var lines = span.loc.lines; if (span.bounds && span.bounds.existingHeaders.some(function (h) { return h.header === newHeader; })) { throw new SubmitAbort("Ev beş jixwe heye: " + newHeader); } var marks = wt.headingMarks(span.depth); lines[span.heading] = marks + " " + newHeader + " " + marks; // A {{kol3}} names its section in cure=, which follows the heading. Read across lines: a call is // often written one parameter per line. var cure = new RegExp("(\\|\\s*cure\\s*=\\s*)" + escapeRegExp(subsection.header) + "(\\s*[|}])", "g"); var body = lines.slice(span.heading + 1, span.end).join("\n").replace(cure, "$1" + newHeader + "$2"); lines.splice.apply(lines, [span.heading + 1, span.end - span.heading - 1].concat(body.split("\n"))); return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n"); } // Current contents of an existing "====" subsection. A wordlist one whose template can't be parsed comes // back as {kind: "text"} so the caller can still edit it as raw wikitext instead of refusing outright. function readPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) { if (subsection.free) { return readFreeSection(pageContent, language, subsection); } var loose = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection); if (loose) { if (!loose.exists) { return null; } if (loose.call) { return { kind: "wordlist", groups: [{ sernav: "", words: loose.call.words }] }; } var looseBody = $.trim(loose.lines.slice(loose.start, loose.end).join("\n")); if (subsection.kind === "images") { return { kind: "images", images: $.grep($.map(looseBody.split("\n"), wt.parseImageLine), Boolean) }; } if (subsection.kind !== "wordlist") { return { kind: "text", text: looseBody }; } // One template call rather than a {{kol3}} block: its positional parameters are the words. var looseCall = parseTemplateCalls(looseBody).calls[0]; return { kind: "wordlist", groups: [{ sernav: "", words: (looseCall && looseCall.params) || [] }] }; } var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth); var range = subsectionBodyRange(bounds, subsection.header); if (!range) { return null; } return readSubsectionBody(loc.lines.slice(range.start, range.end).join("\n"), subsection); } // Rewrites an existing "====" subsection in place. A wordlist one keeps its own template name, language and // named params ("cure=Jê", ...) and only has its positional words replaced; a text one is replaced whole. function updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth); var range = subsectionBodyRange(bounds, subsection.header); if (!range) { throw new SubmitAbort(util.msg.sectionMissing + subsection.header); } var body = lines.slice(range.start, range.end).join("\n"); lines.splice(range.start, range.end - range.start, rewriteSubsectionBody(body, language, subsection, content)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Inserts a new "==== Header ====" subsection into its SUBSECTION_ORDER position within a POS block, right // before the first ranked subsection that outranks it, or at the end if none does. Either a // {{kol3|...}} word list or a plain paragraph, matching start.js's own subsection formats. function insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth); var alreadyThere = false; bounds.existingHeaders.forEach(function (h) { if (h.header === subsection.header) { alreadyThere = true; } }); if (alreadyThere) { throw new SubmitAbort("Ev beş jixwe heye: " + subsection.header); } var body = subsection.kind === "wordlist" ? content.map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words); }).join("\n\n") : content; var myRank = subsectionRankForHeader(subsection.header); var headers = bounds.existingHeaders; var insertAt = bounds.end; for (var i = 0; i < headers.length; i++) { var otherRank = subsectionRankForHeader(headers[i].header); if (otherRank !== -1 && otherRank > myRank) { insertAt = headers[i].lineIndex; break; } } // Exactly one blank line on each side: the line before the insertion point is normally already blank // (it separated the previous subsection from the next heading), so only add one where there isn't one. var block = []; if (insertAt > 0 && $.trim(lines[insertAt - 1]) !== "") { block.push(""); } var marks = wt.headingMarks(bounds.depth + 1); block.push(marks + " " + subsection.header + " " + marks, body); if (insertAt < lines.length) { block.push(""); } lines.splice.apply(lines, [insertAt, 0].concat(block)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // ---- converting an unclassified "=== Mane ===" placeholder heading into a real POS heading ---- // Some pages carry a heading literally named "Mane" (optionally "Mane 2" etc.) instead of a real // part-of-speech name, tagged right below with {{cure?|<lang>}} (ku.wiktionary's "part of speech not yet // determined" maintenance flag). It is a section key of its own (sections.MANE_SECTION), so the shared // locator finds it like any other heading; only the rewriting below is particular to it. // Renames the "=== Mane ===" placeholder to the chosen POS heading, drops the maintenance tag line right // after it if present (MANE_TAG_REGEX -- cure? or any of its known aliases), and inserts the matching // "{{<pos>|<lang>}}" call in its place (skipped when the section has no template of its own). // Other content under the heading is left untouched. /** * Where a section's own headword template sits, as {index, text}, or {index: -1} when it has none. * * Not always the line under the heading: a "{{ku-tewîn-lk}}" line and any number of "[[Wêne:...]]" * images can come first. Everything down to the first definition line is searched, and index doubles * as the slot a new call belongs in when there is no old one. */ function findPosTemplateLine(lines, headingLine, sectionType) { var oldSpec = posTemplateFor(sectionType); var oldTemplate = oldSpec ? oldSpec.name : (sectionType === "Biwêj" ? "biwêj" : null); var oldTemplateRegex = oldTemplate && new RegExp("^\\{\\{\\s*" + escapeRegExp(oldTemplate) + "\\s*[|}]"); var at = headingLine + 1; while (at < lines.length && !/^#/.test(lines[at]) && !/^==/.test(lines[at])) { if (MANE_TAG_REGEX.test(lines[at]) || (oldTemplateRegex && oldTemplateRegex.test(lines[at]))) { return { index: at, text: lines[at], end: at }; } at++; } return { index: -1, text: "", end: at }; } // Named parameters merged in order, each written once: a later value replaces an earlier one of the // same name. Positional values are kept as they come. function mergeCallParams() { var out = []; var seen = {}; $.each(Array.prototype.slice.call(arguments), function (_, list) { $.each(list || [], function (__, param) { var m = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(param); if (!m) { out.push(param); return; } // "z" and "c" are one name to Modul:rêziman, so the form's "c=m" meets the page's "z=". var key = wt.canonicalParamName(m[1]); if (!Object.prototype.hasOwnProperty.call(seen, key)) { seen[key] = out.length; out.push(param); return; } // The page's own spelling stays when it carried a value; an empty one gives way entirely. var earlier = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(out[seen[key]]); // "?" asks for a value, so it never replaces one the page already has. if ($.trim(earlier[2]) && $.trim(m[2]) === "?") { return; } out[seen[key]] =$.trim(earlier[2]) ? earlier[1] + "=" + m[2] : param; }); }); return out; } // What the call on the page already says, minus its language. Carried over only when the new section // uses that same template -- "z=m" survives Navdêr becoming Formeke navdêrê, while a verb's "c=h-gh" // has no meaning on a noun and is left behind. function keptCallParams(line, templateName) { var call = parseTemplateCalls($.trim(line || "")).calls[0]; if (!call || canonicalTemplateKey(call.name) !== canonicalTemplateKey(templateName)) { return []; } return call.params.slice(1).filter(function (param) { return /=/.test(param); }); } // The headword call a converted section gets, or "" when the new section has none. What the old call // (found, from findPosTemplateLine) said keeps its place, then the section's own defaults, then what the // form was filled in with -- each name written once, the last value winning, so a converted call reads // as small a change from the old one as it can. function posCallLine(found, language, newSectionType, posParams) { var spec = posTemplateFor(newSectionType); if (!spec) { return ""; } var kept = found.index !== -1 ? keptCallParams(found.text, spec.name) : []; // A lemma is not an inflected form, so the old section's form=erê stays behind. if (spec.params.indexOf("form=erê") === -1) { kept = kept.filter(function (param) { return !/^\s*form\s*=\s*erê\s*$/.test(param); }); } var params = mergeCallParams(kept, spec.params, posParams ? posParams.split("|") : []); return "{{" + spec.name + "|" + language + (params.length ? "|" + params.join("|") : "") + "}}"; } function convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, newSectionType, posParams) { if (!sectionNames[newSectionType]) { throw new SubmitAbort("Navê cureyê rêzimanî yê hilbijartî nediyar e."); } // locateSection() already handles the "Mane" placeholder as a section type of its own. var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var headingLine = loc.posLineIndex; var depth = loc.depth; // A section straight under a numbered group heading takes that heading's place: the group heading // held nothing but its gloss. var group = depth > 3 ? wt.numberedGroupAbove(lines, headingLine, depth) : -1; if (group !== -1) { lines.splice(group, headingLine - group); headingLine = group; depth--; } // At the heading's own depth. Written without a number: the renumbering pass below decides every // number in this language section at once, so one carried over from the old name would just be // overwritten. var marks = wt.headingMarks(depth); lines[headingLine] = marks + " " + newSectionType + " " + marks; // The line under the heading is either the old section's own template call ("{{biwêj|ku}}") or, for a // Mane placeholder, the "needs a POS" maintenance tag. Both are replaced by the new POS's call. // The new call takes the old one's own place -- or, when there was none, the slot just above the // definitions, which is where the wizard writes it. var found = findPosTemplateLine(lines, headingLine, sectionType); var insertAt = found.index !== -1 ? found.index : found.end; if (found.index !== -1) { lines.splice(found.index, 1); } var call = posCallLine(found, language, newSectionType, posParams); if (call) { lines.splice(insertAt, 0, call); } // Renaming a section can make it repeat one the page already had, and can equally leave a name that // is no longer repeated. Both are settled by renumbering the whole language section: a "Rengdêr" // beside a new "Rengdêr" becomes "Rengdêr 1" and "Rengdêr 2", and a number left behind by a name // that is now unique is dropped. var body = lines.join("\n"); var nextLang = body.indexOf("\n== ", 1); var end = nextLang === -1 ? body.length : nextLang; body = wt.numberRepeatedPosHeadings(body.slice(0, end)) + body.slice(end); return pageContent.slice(0, loc.langSectionIndex) + body; } // ---- "guhartina pêşketî" (advanced editing): combine several independent per-sense edits into ONE save ---- // Threads pageContent through the same pure functions every single-field form uses, applying only the // pieces the caller actually filled in. A piece that conflicts with the page (maneid already set, a // subsection that's already there) is skipped with a warning rather than failing the whole save. Throws // SubmitAbort if nothing was filled in, so this can never turn into a no-op save. function applyAdvancedChanges(pageContent, language, sectionType, sectionOrdinal, definitionLevel, changes) { var content = pageContent; var warnings = []; var appliedAnything = false; if (changes.gloss) { content = updateSenseGloss(content, language, sectionType, sectionOrdinal, definitionLevel, changes.gloss); appliedAnything = true; } if (changes.newSense) { content = insertNewSense(content, language, sectionType, sectionOrdinal, definitionLevel, changes.newSense); appliedAnything = true; } // Every box below is prefilled with what the sense already has, so a save replaces that value rather // than merging into it -- and clearing a box removes the template. changes.changed marks the boxes // whose contents actually differ from the page, so an opened-but-untouched box writes nothing. var replace = { replace: true }; if (changes.changed.maneid) { content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "maneid", changes.maneid ? [changes.maneid] : [], replace); appliedAnything = true; } if (changes.changed.etiket) { content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "e", changes.etiket, replace); appliedAnything = true; } if (changes.changed.kategori) { content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "K", changes.kategori, replace); appliedAnything = true; } SENSE_GROUPS.forEach(function (group) { if (changes.changed["word:" + group.key]) { content = insertSenseWords(content, language, sectionType, sectionOrdinal, definitionLevel, group.key, changes.words[group.key], replace); appliedAnything = true; } }); if (!appliedAnything) { throw new SubmitAbort("Tiştek nehat guhartin."); } return { content: content, warnings: warnings }; } // ---- per-definition UI: a small always-visible "+" toggle (no hover, so it works on mobile/touch too) ---- // A growing list of word rows. The row itself is util.js's, shared with the wizard; this owns the list: // typing in the last row appends a fresh empty one, so there is always somewhere to type. var WORDLIST_COLUMN_THRESHOLD = 6; function buildWordListField(placeholder, opts) { opts = opts || {}; var $list = $("<ol class='dsb-wordlist'></ol>"); // One column is a long scroll once a list gets past a handful of words. The class only asks for // two; the stylesheet still gives one on a narrow screen. Two columns inside the panel's usual // 520px would leave each word about 250px, so the panel drops its width cap for as long as any // list in it is in two columns -- checked across the whole panel, since a "Herwiha binêre" holds // several groups and one of them going wide settles it for all. function updateColumns() { $list.toggleClass("dsb-wordlist-2col", $list.children("li").length > WORDLIST_COLUMN_THRESHOLD); var $panel = $list.closest(".dsb-subsection-panel"); $panel.toggleClass("dsb-panel-wide", !!$panel.find(".dsb-wordlist-2col").length); } function makeRow() { var row = util.makeModifierRow({ prefix: "dsb-", placeholder: placeholder, modTitle: util.msg.addModifier, removeTitle: util.msg.removeWord, removeModTitle: util.msg.removeModifier, modifiers: opts.modifiers, // "bixe qutiyan" puts each comma-separated word in a row of its own, right after the row it // was typed in, and the caret follows to the last of them. One word per row is also one // word per template parameter, which both {{hevmane}} and {{kol3}} read the same way -- // a comma left inside a parameter would not be. onSplit: function (rest) { var $after = row.$li; var last = null; rest.forEach(function (raw) { var extra = makeRow(); $after.after(extra.$li); $after = extra.$li; if (raw) extra.setRaw(raw); last = extra; }); // Always an empty row at the end to type the next word into. var $tail = $list.children("li").last(); if ($.trim($tail.data("row").getRaw())) { last = makeRow(); $list.append(last.$li); } updateColumns(); if (last) last.focus(); }, // raw === null means the row removed itself, so the count has changed either way. onChange: function (raw) { if (raw !== null) { var isLast = row.$li.is($list.children("li").last()); if (isLast && raw) $list.append(makeRow().$li); } updateColumns(); } }); row.$li.data("row", row); return row; } $list.append(makeRow().$li); return { $element: $list, values: function () { var vals = []; $list.children("li").each(function () { var raw = $(this).data("row").getRaw(); if (raw) vals.push(raw); }); return vals; }, // Replaces the whole list, keeping one empty trailing row to type into. setValues: function (raws) { $list.empty(); raws.forEach(function (raw) { var row = makeRow(); $list.append(row.$li); row.setRaw(raw); }); $list.append(makeRow().$li); updateColumns(); }, focus: function () { $list.children("li").first().data("row").focus(); } }; } // Plain removable-tag field, used for Etîket and Kategorî (simple value lists with no per-word modifiers). // Enter or "," commits the current text as a tag; Backspace on an empty input removes the last tag; // values() also commits whatever is still typed but not yet confirmed. function buildTagField(placeholder) { var $input = $("<input type='text' class='dsb-input dsb-tag-input'>").attr("placeholder", placeholder); var $element = $("<span class='dsb-tagfield'></span>").append($input); function currentValues() { var vals = []; $element.children(".dsb-tag").each(function () { vals.push($(this).data("value")); }); return vals; } function addTag(val) { val = $.trim(val || ""); if (!val || currentValues().indexOf(val) !== -1) { return; } var $tag = $("<span class='dsb-tag'></span>").text(val).data("value", val); var $remove = $("<button type='button' class='dsb-tag-remove' title='Jê bibe'>&#215;</button>"); $remove.on("click", function () { $tag.remove(); $input.trigger("focus"); }); $tag.append($remove); $tag.insertBefore($input); } $input.on("keydown", function (e) { if (e.which === 13 || e.which === 188) { // Enter or comma e.preventDefault(); addTag($input.val()); $input.val(""); } else if (e.which === 8 && !$input.val()) { $element.children(".dsb-tag").last().remove(); } }); $input.on("blur", function () { addTag($input.val()); $input.val(""); }); return { $element: $element, // Replaces every tag, for prefilling from what the sense already has. setValues: function (vals) { $element.children(".dsb-tag").remove(); vals.forEach(function (v) { addTag(v); }); $input.val(""); }, values: function () { addTag($input.val()); $input.val(""); return currentValues(); }, focus: function () { $input.trigger("focus"); } }; } // The wizard's own etymology templates, straight out of data-main.json's "etymTpls" -- the same list start.js's // insert menu offers, so the two can never drift apart. CODE/SOURCELANG are its placeholders. // The wizard's own template lists, straight out of data-main.json, so both gadgets offer the same // templates in the same order. A pronunciation template names the languages it is for; one that names // none is offered everywhere. function templateChoices(pool, language) { var defs = startData[pool] || {}; return Object.keys(defs).filter(function (name) { var langs = defs[name].langs; return !langs || !langs.length || $.inArray(language, langs) !== -1; }).map(function (name) { return { name: name, desc: defs[name].desc, snippet: defs[name].snippet }; }); } // One template call inside the surface: shown as its own wikitext, but atomic -- contenteditable="false" // keeps the caret out of it, so it can only be changed through the dialog. function makeTemplateChip(wikitext) { // The × is its own element rather than the chip's only way out: on a phone there is no reliable // backspace onto a contenteditable="false" span, so without it the dialog is the only way to take // a call off the line. readChipSurface() reads chips from data-wikitext, so the extra child does // not reach the saved text. var $remove = $("<span class='dsb-tpl-chip-remove' contenteditable='false'>&#215;</span>") .attr("title", "Vê şablonê jê bibe"); return $("<span class='dsb-tpl-chip' contenteditable='false' role='button' tabindex='0'></span>") .attr("data-wikitext", wikitext) .attr("title", "Bitikîne da ku parametreyan biguhêrî") .text(wikitext) .append($remove); } // wikitext -> surface DOM: template calls become chips, everything else stays plain editable text. function renderChipSurface($surface, wikitext) { var text = wikitext || ""; var calls = parseTemplateCalls(text).calls; var pos = 0; $surface.empty(); calls.forEach(function (call) { if (call.start > pos) { $surface.append(document.createTextNode(text.slice(pos, call.start))); } $surface.append(makeTemplateChip(text.slice(call.start, call.end))); pos = call.end; }); if (pos < text.length) { $surface.append(document.createTextNode(text.slice(pos))); } } // surface DOM -> wikitext. Chips give back their stored call; anything the browser inserted while typing // (a <br>, a wrapper <div>) degrades to its text, so the result is always plain wikitext. function readChipSurface(node) { var out = ""; $(node).contents().each(function () { if (this.nodeType === 3) { out += this.nodeValue; return; } var $el = $(this); if ($el.hasClass("dsb-tpl-chip")) { out += $el.attr("data-wikitext"); return; } if (this.nodeName === "BR") { out += "\n"; return; } if (this.nodeName === "DIV" || this.nodeName === "P") { out += "\n" + readChipSurface(this); return; } out += readChipSurface(this); }); return out; } // Drops a node in at the caret, or at the end when the caret is not inside the surface. function insertAtCaret($surface, node) { var sel = window.getSelection(); if (sel && sel.rangeCount && $.contains($surface.get(0), sel.getRangeAt(0).commonAncestorContainer)) { var range = sel.getRangeAt(0); range.deleteContents(); range.insertNode(node); range.setStartAfter(node); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } else { $surface.append(node); } } // The template-param dialog (openTemplateDialog/buildTemplateParamForm) moved to wikt.cite, shared with // start.js's own Etîmolojî and Çavkanî pickers: cite.openTemplateDialog / cite.buildTemplateParamForm. // Each new example queued is its own entry, so several can be waiting at once. var exampleSeq = 0; // Takes the save over from add-examples while its form is open for one sense: its "Qeyd bike" becomes // "Lê zêde bike" and the edit joins the pending queue instead of publishing on its own, so examples and // whatever else is queued go up as one edit. Installed on every open, so the handler always closes over // the sense whose form is actually open. ctx: {$li, $h3, language, sectionType, sectionOrdinal, // definitionLevel, $save, $status, afterQueue}. function takeOverExampleSave(ctx) { if (!(wikt.addExamples && wikt.addExamples.setSubmitHandler)) { return; // older add-examples: it publishes on its own, as before } // Lets the form read an example as the queue has already changed it. wikt.addExamples.pendingContent = queuedContent; wikt.addExamples.setSubmitHandler(function (job) { exampleSeq++; queueChange( placeLabel(ctx.language, ctx.sectionType, ctx.$h3), // add-examples' own summary, so the combined edit still credits the tool and names its // version. The trailing stop goes: this is one item in a list, not a sentence of its own. (job.summary || "nimûne/jêgirtin hate zêdekirin").replace(/\.\s*$/, ""), function (pageContent) { // add-examples builds against a revision object, and returns {text, summary}. var built = job.transform({ content: pageContent }); return { content: built.text, warnings: [] }; }, ctx.$save, ctx.$status, // Drawn like any other queued change, in the sense it belongs to. function () { return previewSense(ctx.$li, ctx.language, ctx.sectionType, ctx.sectionOrdinal, ctx.definitionLevel); }, // An edit to an example already on the page brings its own key, so editing it again replaces it. { key: job.key || ("example:" + ctx.sectionType + "|" + ctx.sectionOrdinal + "|" + ctx.definitionLevel.join(".") + "|" + exampleSeq) } ); job.done(); if (ctx.afterQueue) { ctx.afterQueue(); } }); } // Opens add-examples' form on one example already under a sense -- dsb.js's pencil on it. Its save joins // the queue like any other change. function editExample($li, $h3, language, sectionType, sectionOrdinal, definitionLevel, itemEl) { takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType, sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $(), $status: $(), afterQueue: openQueueBox }); if (!(wikt.addExamples && wikt.addExamples.editFor && wikt.addExamples.editFor($li.get(0), itemEl))) { mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin."); } } // Builds the whole "guhartina pêşketî" panel into $quickRow: gloss and the two most-used word lists // (Hevmane/Dijmane) sit directly in the picker row; the remaining word lists, maneid, etîket, kategorî // and Nimûne/jêgirtin live behind a "Hevmane û Bêhtir" dropdown; one shared "Lê zêde bike" queues everything the // user filled in as a single edit via applyAdvancedChanges() and queueChange(). Nimûne/jêgirtin is an // immediate proxy-click into a different gadget's own form, not part of this combined save. function buildAdvancedPanel($quickRow, $li, $h3, language, sectionType, sectionOrdinal, definitionLevel, isLastSense) { // "+" marks the actions that add something, matching the dropdown's own "+ Hevmane" labels. var $nimune = $("<a href='#' class='dsb-quick-link'></a>").text("+ Nimûne/jêgirtin"); $nimune.on("click", function (e) { e.preventDefault(); takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType, sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $save, $status: $status }); // Toggle, so clicking this a second time closes the form again. add-examples builds nothing // on the page of its own, so this is the only way its form opens. var drive = wikt.addExamples.toggleFor || wikt.addExamples.openFor; if (!(drive && drive($li.get(0)))) { mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin."); } $moreMenu.slideUp(); }); // getters holds one function per currently-open box (key -> () => value); collectChanges() only ever // reads from a box the user actually clicked to open. var getters = {}; // What the sense currently holds, fetched once and shared by every box that prefills from it. // collectChanges() also diffs against it, so an untouched box never queues a change. var original = null; var sensePromise = null; function loadSense() { if (!sensePromise) { sensePromise = fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel).then(function (fields) { original = fields; return fields; }); } return sensePromise; } function sameList(a, b) { return (a || []).join("\u0000") === (b || []).join("\u0000"); } // -- gloss ("Maneyê biguhêre" -- the one box that EDITS the sense's wording; everything else here only ADDS) -- function addGlossField() { var $fields = $("<div class='dsb-gloss-fields'></div>"); var $textarea = $("<textarea class='dsb-input dsb-edit-gloss' rows='2'></textarea>") .attr("placeholder", util.msg.loading).prop("disabled", true); var $autoLink = $("<button type='button' class='dsb-autolink'>Oto-lînk bike</button>").prop("disabled", true); var $toRaw = $("<a href='#' class='dsb-quick-link dsb-gloss-raw'>Wekî wîkîtekst biguhêre</a>").hide(); var $status = $("<span class='dsb-status'></span>"); var originalGloss = null; var tplForm = null; // set while the parameter boxes are showing instead of the raw line var tplCall = null; // The gloss of a non-Kurdish entry is a translation followed by {{îzah|…}} explaining it. That // is one field on the page, so it stays one box here; the explanation opens beside it only when // asked for, and the two are joined back into a single gloss on save. A Kurdish sense is its // own definition, so it is never offered one -- though a ku gloss that somehow already carries // an {{îzah}} still opens its box below, rather than being edited blind. var offerIzah = language !== "ku"; var $izah = $("<textarea class='dsb-input dsb-edit-izah' rows='2'></textarea>") .attr("placeholder", "Îzaha maneyî… ji bo school-a îngilîzî 'cihê tehsîlgirtinê'"); // A non-Kurdish gloss is a translation and its explanation, so both boxes open together. A Kurdish // sense is its own definition and gets no îzah box, unless its gloss already carries one. var $izahWrap = $("<div class='dsb-izah-wrap'></div>") .append($("<label class='dsb-adv-label'>Îzaha maneyî</label>").append($izah)) .toggle(offerIzah); $fields.append($textarea); // The template form edits one call inside the line, so its result is spliced back into the rest. function currentGloss() { if (tplForm) { return $.trim(originalGloss.slice(0, tplCall.start) + tplForm.values() + originalGloss.slice(tplCall.end)); } return joinGloss($.trim($textarea.val()), $.trim($izah.val())); } function showRaw() { tplForm = null; tplCall = null; $fields.empty().append($textarea); $autoLink.show(); $toRaw.hide(); } loadSense().then( function (fields) { originalGloss = fields.gloss; // An existing gloss that already ends in {{îzah|…}} comes apart into the two boxes, so // editing it does not mean editing template syntax by hand. var parts = util.splitTercimeIzah(fields.gloss); $textarea.val(parts ? $.trim(parts.tercime) : fields.gloss) .prop("disabled", false) // A non-Kurdish gloss is a translation; the box under it takes the explanation. .attr("placeholder", offerIzah ? util.msg.tercimePrompt : "Maneyê binivîse…"); if (parts) { $izah.val($.trim(parts.izah)); $izahWrap.show(); } $autoLink.prop("disabled", false); var target = glossTemplateTarget(fields.gloss); if (!target) { return; } fetchTemplateData(target.name).then(function (td) { // The fetch is async; leave the raw box alone if it has already been typed into. if ($.trim($textarea.val()) !== $.trim(originalGloss)) { return; } tplCall = target; tplForm = cite.buildTemplateParamForm(target, td); $fields.empty().append(tplForm.$element); $autoLink.hide(); // linkifying a bare template call makes no sense // A gloss that is one template call carries no separate explanation. $izahWrap.hide(); $toRaw.show(); }); }, function (codeOrAbort, result) { $textarea.attr("placeholder", ""); var message = codeOrAbort instanceof SubmitAbort ? codeOrAbort.message : "Nikare maneya heyî bar bike: " + apiErrorMessage(codeOrAbort, result); $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message); } ); $autoLink.on("click", function () { var mane = $.trim($textarea.val()); var izah = $.trim($izah.val()); if (!mane && !izah) { return; } $autoLink.prop("disabled", true); $status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…"); linkifyGlossParts(mane, izah, function (linkedMane, linkedIzah, error) { $textarea.val(linkedMane); $izah.val(linkedIzah); $autoLink.prop("disabled", false); if (error) { $status.addClass("dsb-status-error").text(error); } else { $status.text(""); } }); }); $toRaw.on("click", function (e) { e.preventDefault(); $textarea.val(currentGloss()); // read the form before showRaw() discards it showRaw(); }); getters.gloss = function () { var v = currentGloss(); return (v && v !== originalGloss) ? v : null; }; return $("<div class='dsb-adv-group'></div>").append( $("<div class='dsb-adv-label'></div>").text("Mane"), $fields, $izahWrap, $("<div class='dsb-form-actions'></div>").append($autoLink, $toRaw, $status) ); } // -- one SENSE_GROUPS word-list box (Hevmane/Dijmane/etc.) -- function addWordField(group) { var field = buildWordListField(group.label + "…"); loadSense().then(function (fields) { var current = fields.words[group.key]; if (current && current.length) { field.setValues(current); } }); getters["word:" + group.key] = function () { return field.values(); }; // The hint is senseGroups' own, so the box carries the same example sentence the wizard puts // beside its copy of this list. var $label = $("<div class='dsb-adv-label'></div>").text(group.label); if (group.hint) { $label.append($("<span class='dsb-adv-hint'></span>").text(group.hint)); } return $("<div class='dsb-adv-group'></div>").append($label, field.$element); } // -- maneid (single value; re-adding one that already exists is rejected -- see applyAdvancedChanges) -- function addNewSenseField() { var $textarea = $("<textarea class='dsb-input' rows='2'></textarea>").attr("placeholder", "Maneya nû binivîse…"); getters.newSense = function () { return $.trim($textarea.val()); }; return $("<div class='dsb-adv-group'></div>").append( $("<div class='dsb-adv-label'></div>").text(util.msg.anotherSense), $textarea ); } function addManeidField() { var $input = $("<input type='text' class='dsb-input' placeholder='id…'>"); loadSense().then(function (fields) { $input.val(fields.maneid); }); getters.maneid = function () { return $.trim($input.val()); }; return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Maneid"), $input); } // -- etîket / kategorî -- function addEtiketField() { var field = buildTagField("Etîket…"); loadSense().then(function (fields) { field.setValues(fields.etiket); }); getters.etiket = function () { return field.values(); }; return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Etîket"), field.$element); } function addKategoriField() { var field = buildTagField("Kategorî…"); loadSense().then(function (fields) { field.setValues(fields.kategori); }); getters.kategori = function () { return field.values(); }; return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Kategorî"), field.$element); } // -- the picker row: the gloss and Nimûne/jêgirtin links sit directly in the row; every word group and // the rest live behind a "Hevmane û Bêhtir" dropdown. Clicking any link builds and appends its box // to $openBoxes and hides that link; the box's own "×" removes it, clears its getter, and un-hides the // link -- several boxes can be open at once. No "Beşek (====)" entry here: buildSubsectionPanel()'s // own "+ Beşek lê zêde bike" trigger already covers page-level subsections. ---- var FIELD_DEFS = [{ key: "gloss", label: "Maneyê biguhêre", build: addGlossField, primary: true }] .concat(SENSE_GROUPS.map(function (group) { return { key: "word:" + group.key, label: group.label, build: function () { return addWordField(group); }, primary: false }; })) .concat([ { key: "maneid", label: "Maneid", build: addManeidField, primary: false }, { key: "etiket", label: "Etîket", build: addEtiketField, primary: false }, { key: "kategori", label: "Kategorî", build: addKategoriField, primary: false } ]); // Every sense offers this: the new one lands directly below whichever sense asked for it (see // insertNewSense), so it is no longer only the last one that can add to the end. FIELD_DEFS.push({ key: "newSense", label: util.msg.addAnotherSense, build: addNewSenseField, primary: false }); var $picker = $("<div class='dsb-field-picker'></div>"); var $moreMenu = $("<div class='dsb-more-menu'></div>").hide(); var $openBoxes = $("<div class='dsb-open-boxes'></div>"); // $actions (built below) stays hidden until at least one field box is actually open -- otherwise // "Lê zêde bike" sits there enabled with nothing to queue, which just produces an empty no-op change. var openBoxCount = 0; function updateActionsVisibility() { $actions.toggle(openBoxCount > 0); } function makeFieldLink(def) { var $link = $("<a href='#' class='dsb-quick-link dsb-field-pick'></a>").text(def.key === "gloss" ? def.label : "+ " + def.label); $link.on("click", function (e) { e.preventDefault(); openQueueBox(); var $box = def.build(); var $remove = $("<a href='#' class='dsb-box-remove' title='Rake'>×</a>"); $remove.on("click", function (e2) { e2.preventDefault(); delete getters[def.key]; $box.remove(); $link.show(); openBoxCount--; updateActionsVisibility(); }); $box.prepend($remove); $openBoxes.append($box); util.initManualResize($box); $link.hide(); $moreMenu.slideUp(); openBoxCount++; updateActionsVisibility(); }); return $link; } // Destructive, so it lives at the bottom of the dropdown behind a confirmation, and shares the // sense's queue key: deleting supersedes any edit still pending on the same sense. function makeDeleteLink() { var $link = $("<a href='#' class='dsb-quick-link dsb-field-delete'>Maneyê rake</a>"); $link.on("click", function (e) { e.preventDefault(); $moreMenu.slideUp(); OO.ui.confirm("Ev mane û hemû rêzên bin wê dê werin rakirin. Dewam bike?").done(function (ok) { if (!ok) { return; } queueChange( placeLabel(language, sectionType, $h3), "maneyek hate rakirin", function (baseContent) { return removeSense(baseContent, language, sectionType, sectionOrdinal, definitionLevel); }, $save, $note, function () { $li.addClass("dsb-sense-doomed"); return function () { $li.removeClass("dsb-sense-doomed"); }; }, { key: senseQueueKey() } ); $note.show(); }); }); return $link; } // Only the links the row actually shows are built now; the dropdown's nine are 43% of the work and // nobody sees them until "Hevmane û Bêhtir" is clicked, so buildMenuLinks() waits for that. FIELD_DEFS.forEach(function (def) { if (!def.primary) { return; } $picker.append(makeFieldLink(def)); if (def.key === "gloss") { $picker.append($nimune); // directly after "Maneyê biguhêre" } }); // Three sections, ruled apart: what labels this sense, the word lists that hang off it, and adding // another sense. "Maneyê rake" is appended after these by makeDeleteLink() and so closes the last // one. The word lists follow senseGroups' "order" -- that array's own order is the order the "#:" // lines are written to the page in, which is not a reading order; the wizard's boxes read the same // field, so both gadgets list them alike. Anything not named here still appears, after these, so a // field added later is never silently dropped from the menu. var MENU_GROUPS = [ ["etiket", "kategori", "maneid"], SENSE_GROUPS.slice().sort(function (a, b) { return (a.order || 0) - (b.order || 0); }).map(function (g) { return "word:" + g.key; }), ["newSense"] ]; var menuBuilt = false; function buildMenuLinks() { if (menuBuilt) { return; } menuBuilt = true; var byKey = {}; FIELD_DEFS.forEach(function (def) { if (!def.primary) { byKey[def.key] = def; } }); var placed = {}; MENU_GROUPS.forEach(function (group, groupIndex) { var defs = group.map(function (key) { return byKey[key]; }).filter(Boolean); defs.forEach(function (def, i) { placed[def.key] = true; var $link = makeFieldLink(def); // The rule goes on the first entry of every group after the first. if (groupIndex > 0 && i === 0) { $link.addClass("dsb-menu-group-start"); } $moreMenu.append($link); }); }); FIELD_DEFS.forEach(function (def) { if (!def.primary && !placed[def.key]) { $moreMenu.append(makeFieldLink(def)); } }); $moreMenu.append(makeDeleteLink()); } // Lives inside $picker (not appended straight to $quickRow) so .dsb-more-menu's CSS can position it as // an overlay anchored to $picker, instead of pushing $openBoxes/the rest of the page down when it opens. var $moreArrow = $("<span class='dsb-more-arrow'></span>").text("▸"); var $moreToggle = $("<a href='#' class='dsb-quick-link dsb-more-toggle'></a>") .text(util.msg.moreMenu + " ").append($moreArrow); $moreToggle.on("click", function (e) { e.preventDefault(); buildMenuLinks(); $moreMenu.slideToggle(function () { $moreArrow.text($moreMenu.is(":visible") ? "▾" : "▸"); }); }); $picker.append($moreToggle, $moreMenu); // Outside clicks are handled by one shared document listener (see closeMoreMenus), not one per panel: // hovering a sense builds its panel, so a long entry would otherwise accumulate dozens of them. $moreMenu.data("dsbArrow", $moreArrow); // -- combined save: whatever boxes are open right now, queued together via queueChange(); the actual // save happens when the user clicks "Guhartinan qeyd bike" on the floating queue box. ---- // Small "not saved yet" preview of everything this queued change will do, appended right under the // sense's gloss (plain text, not a real render of {{hevmane}}/etc.). function collectChanges() { var base = original || { maneid: "", etiket: [], kategori: [], words: {} }; var changed = {}; var words = {}; SENSE_GROUPS.forEach(function (group) { var getter = getters["word:" + group.key]; words[group.key] = getter ? getter() : []; if (getter && !sameList(words[group.key], base.words[group.key])) { changed["word:" + group.key] = true; } }); var maneid = getters.maneid ? getters.maneid() : ""; var etiket = getters.etiket ? getters.etiket() : []; var kategori = getters.kategori ? getters.kategori() : []; if (getters.maneid && maneid !== (base.maneid || "")) { changed.maneid = true; } if (getters.etiket && !sameList(etiket, base.etiket)) { changed.etiket = true; } if (getters.kategori && !sameList(kategori, base.kategori)) { changed.kategori = true; } return { gloss: getters.gloss ? getters.gloss() : null, newSense: getters.newSense ? getters.newSense() : null, maneid: maneid, etiket: etiket, kategori: kategori, words: words, changed: changed }; } // Both the field save and "Maneyê rake" queue under this, so the later one supersedes the earlier. function senseQueueKey() { return "sense:" + sectionType + "|" + sectionOrdinal + "|" + definitionLevel.join("."); } var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add); // Where queueChange() writes its confirmation for actions that have no box of their own. var $note = $("<div class='dsb-status dsb-quick-note'></div>").hide(); var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel); var $status = $("<span class='dsb-status'></span>"); var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status).hide(); $cancel.on("click", function () { // Close the boxes too, not just the row. Hiding alone left every field still open with its // text in it, so the next click on the pencil reopened the half-filled panel that had just // been cancelled. Each box's own "x" already clears its getter, restores its link and updates // the counter, so those are triggered rather than repeating the teardown here. $openBoxes.find(".dsb-box-remove").trigger("click"); $note.hide().text(""); // dsb.js owns the pencil's pinned state; tell it rather than hiding behind its back, or the // next click on the pencil would only toggle "pinned" off and appear to do nothing. $quickRow.trigger("dsbCancel"); hideQueueIfIdle(); }); $save.on("click", function () { var changes = collectChanges(); function afterLinkify() { var parts = senseChangeLabels(changes); queueChange( placeLabel(language, sectionType, $h3), parts.length ? parts.join(", ") + (parts.length > 1 ? " hatin guhartin" : " hate guhartin") : "mane hate guhartin", function (baseContent) { return applyAdvancedChanges(baseContent, language, sectionType, sectionOrdinal, definitionLevel, changes); }, $save, $status, function () { var undoPreview = previewSense($li, language, sectionType, sectionOrdinal, definitionLevel); // A new sense has no place on the page yet, so it gets a row of its own directly // after this one -- the list numbers it, so where it will land is visible. var $newSense = null; if (changes.newSense) { $newSense = $("<li class='dsb-sense-preview'></li>"); $li.after($newSense); fillWithRendered($newSense, changes.newSense, function () { $newSense.text(changes.newSense); }); } return function () { undoPreview(); if ($newSense) { $newSense.remove(); } }; }, // Re-saving this same sense supersedes its pending change rather than queuing another. { key: senseQueueKey() } ); } $save.prop("disabled", true); // Auto-linkify the gloss as part of this save, but only a half nobody has linked by hand. // Split back into its two halves first, so the explanation is linked on its own rather than // sitting unseen inside {{îzah|…}}. if (changes.gloss) { $status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…"); var glossParts = util.splitTercimeIzah(changes.gloss); linkifyGlossParts( glossParts ? $.trim(glossParts.tercime) : changes.gloss, glossParts ? $.trim(glossParts.izah) : "", function (linkedMane, linkedIzah, error) { // The change is queued either way, so a gloss that came back empty is not written // back -- that would save the sense with its wording gone. var joined = joinGloss(linkedMane, linkedIzah); if ($.trim(joined)) { changes.gloss = joined; } if (error) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(error); } afterLinkify(); }, true ); } else { afterLinkify(); } }); // The links sit under the buttons, so each open box pushes them down rather than leaving them far above. $quickRow.empty().append($openBoxes, $actions, $picker, $note); } // Attaches the pencil toggle to one leaf definition <li> -- clicking it reveals the "guhartina pêşketî" // (advanced editing) panel built by buildAdvancedPanel() above. // ---- per-section UI: "+ Beşek lê zêde bike" after a POS block's own content ---- // Reads the header text of "====" subsections already rendered under this POS heading, straight from the DOM. // The subsections of a part of speech are the headings one deeper than it is. function subsectionDepthFor($h3) { return (sections.headingDepth($h3) || 3) + 1; } function isSubsectionHeading($el, depth) { return sections.headingDepth($el) === depth; } function existingSubsectionHeadersInDom($h3) { var depth = subsectionDepthFor($h3); var headers = []; for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && here < depth) { break; // out of this part of speech } if (isSubsectionHeading($cursor, depth)) { var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first(); headers.push(headingText($hh)); } } return headers; } // Finds where a new "====" subsection preview belongs in the live DOM, using the same SUBSECTION_ORDER rank // insertPageSubsection() uses. Returns {insertBefore: $el} (a ranked subsection that outranks this one) or // {insertAfter: $el} (goes at the end of the block). function domSubsectionInsertAnchor($h3, header) { var depth = subsectionDepthFor($h3); var myRank = subsectionRankForHeader(header); var $last = headingOuter($h3); for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && here < depth) { break; // out of this part of speech } if (isSubsectionHeading($cursor, depth)) { var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first(); var otherRank = subsectionRankForHeader(headingText($hh)); if (otherRank !== -1 && otherRank > myRank) { return { insertBefore: $cursor }; } } $last = $cursor; } return { insertAfter: $last }; } // The wikitext one subsection's content becomes, exactly as insertPageSubsection() writes it -- so the // preview parses the same string the save will produce. function subsectionBodyWikitext(language, s, content) { if (s.kind !== "wordlist") { return content; } return content.filter(function (group) { return group.words.length; }).map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + s.header], "sernav", group.sernav), group.words); }).join("\n\n"); } // The plain word list this preview falls back to when the parse fails: the values that were typed, // without the template around them. Right, but not what the page will look like. function subsectionPlainDom($wrap, s, content) { if (s.kind !== "wordlist") { $wrap.append($("<p class='dsb-preview-text'></p>").text(content)); return; } content.forEach(function (group) { if (group.sernav) { $wrap.append($("<div class='dsb-preview-subheading'></div>").text(group.sernav)); } var $list = $("<ul class='dsb-preview-list'></ul>"); group.words.forEach(function (w) { $list.append($("<li></li>").text(w.replace(/<[^<>]*>/g, ""))); }); $wrap.append($list); }); } // A "not saved yet" preview of a page-level "====" subsection, dropped into the live page at the // position the save will put it, with its body rendered the way the page renders it -- real {{kol3}} // columns and real links, not a list of the words that went into them. Returns the inserted element so // the caller can remove it again. function buildSubsectionPreviewDom($h3, s, content, language) { var $wrap = $("<div class='dsb-preview-block'></div>"); // A styled <div>, not a real <h4>, so existingSubsectionHeadersInDom() never mistakes this live-only // preview for an actual subsection already on the page. $wrap.append($("<div class='dsb-preview-heading' role='heading' aria-level='4'></div>").text(s.header)); $wrap.append($("<span class='dsb-preview-badge'></span>").text("nû — hîn nehatiye qeydkirin")); // Placed before it is filled: a cached render resolves almost at once, and filling a wrap that is // still detached would announce content nobody can see. var anchor = domSubsectionInsertAnchor($h3, s.header); if (anchor.insertBefore) { anchor.insertBefore.before($wrap); } else { anchor.insertAfter.after($wrap); } var wikitext = language ? subsectionBodyWikitext(language, s, content) : ""; if ($.trim(wikitext)) { var $body = $("<div class='dsb-preview-rendered'></div>").appendTo($wrap); fillWithRendered($body, wikitext, function () { $body.remove(); subsectionPlainDom($wrap, s, content); }); } else { subsectionPlainDom($wrap, s, content); } return $wrap; } // A free section owns what lies between its own heading and the next heading of any depth, matching // the range locateHeadingByText() edits. Returns a function that puts the page back, or null. function replaceFreeSectionInPlace($heading, wikitext) { var $start = headingOuter($heading); var body = []; for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) { if (sections.headingDepth($cursor)) { break; } if (!isOwnFurniture($cursor)) { body.push($cursor.get(0)); } } if (!body.length) { return null; } var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start); var $body = $(body).detach(); fillWithRendered($slot, wikitext, function () { $slot.remove(); $slot = null; $body.insertAfter($start); }); return function () { if ($slot) { $body.insertAfter($start); $slot.remove(); $slot = null; } }; } /** * Redraws a subsection that is already on the page with the content this edit would give it. * * The section's own nodes -- everything between its heading and the next heading of the same rank or * higher -- are detached rather than dropped, so the returned function puts the page back exactly as it * was when the change is cancelled or superseded. */ function replaceSubsectionInPlace($h3, header, wikitext) { var depth = subsectionDepthFor($h3); // Walked the same way existingSubsectionHeadersInDom() walks it, so "which nodes are this // subsection" is decided once and the same way everywhere. var $start = null; var body = []; for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && here < depth) { break; // out of this part of speech } if (isSubsectionHeading($cursor, depth)) { if ($start) { break; // the next subsection starts here } var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first(); if (headingText($hh) === header) { $start = $cursor; } continue; } // This gadget's own furniture stays where it is: the subsection's editing panel is the sibling // right after its heading, so sweeping it into the body would detach the very panel the change // was made in and leave the pencil toggling an element that is no longer on the page. if ($start && !isOwnFurniture($cursor)) { body.push($cursor.get(0)); } } if (!$start || !body.length) { return null; } var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start); var $body = $(body).detach(); fillWithRendered($slot, wikitext, function () { $slot.remove(); $slot = null; $body.insertAfter($start); }); return function () { if ($slot) { $body.insertAfter($start); $slot.remove(); $slot = null; } }; } /** * The live DOM one "place" section occupies: {nodes, insert}. nodes are what a render replaces -- * empty when the section is not on the page yet -- and insert() puts an element where the section * belongs, so a new one appears exactly where the save will put it. */ // This gadget's own panels sit between a heading and the page's content, so every walk steps over // them rather than counting one as content. function isOwnFurniture($el) { return $el.is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-convert-pos-panel," + " .dsb-preview-block, .dsb-sense-preview, .dsb-preview-inline"); } // A heading's place in the page, which orders queued renames and removals bottom-up. function headingPosition($el) { var $h = $el.is("h2, h3, h4, h5, h6") ? $el : $el.find("h2, h3, h4, h5, h6").first(); return $("h2, h3, h4, h5, h6").index($h); } // One subsection's own nodes on the page, read the way headingSpan() reads the wikitext: a "====" // subsection down to the next heading at its depth or shallower, a free section ($h3 is its heading) // down to the next heading of any depth. hasDeeper says a free section has headings under it. function subsectionDom($h3, s) { var $start = null; var depth; if (s.free) { $start = headingOuter($h3); depth = sections.headingDepth($start) || sections.headingDepth($h3); } else { depth = subsectionDepthFor($h3); for (var $c = headingOuter($h3).next(); $c.length; $c = $c.next()) { var d = sections.headingDepth($c); if (d && d < depth) { break; } if (d === depth) { var $hh = $c.is("h2, h3, h4, h5, h6") ? $c : $c.find("h2, h3, h4, h5, h6").first(); if (headingText($hh) === s.header) { $start = $c; break; } } } } if (!$start) { return null; } var body = []; var hasDeeper = false; for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && (s.free || here <= depth)) { hasDeeper = !!s.free && here > depth; break; } if (!isOwnFurniture($cursor)) { body.push($cursor.get(0)); } } return { $heading: $start, $body: $(body), hasDeeper: hasDeeper }; } function loosePlaceDom($h3, subsection) { var place = subsection.place; var nodes = []; var $cursor; if (place === "page-top") { // Şablon:herwiha binêre renders as <div class="rellink binere"> at the head of the content. var $out = $("#mw-content-text .mw-parser-output").first(); var $hat = $out.children(".binere, .rellink").first(); if ($hat.length) { return { nodes: $hat.get(), insert: function ($el) { $hat.before($el); } }; } return { nodes: [], insert: function ($el) { $out.prepend($el); } }; } var $start = headingOuter($h3); if (place === "pron") { // A "===" heading above this POS block, under the language one. for (var $back = $start.prev(); $back.length; $back = $back.prev()) { if ($back.is(".mw-heading2, h2")) { break; } if ($back.is(".mw-heading3, h3")) { var $hh = $back.is("h3") ? $back : $back.find("h3").first(); if (headingText($hh) === subsection.header) { for ($cursor = $back.next(); $cursor.length && !$cursor.is(".mw-heading2, .mw-heading3, h2, h3"); $cursor = $cursor.next()) { if (!isOwnFurniture($cursor)) { nodes.push($cursor.get(0)); } } return { nodes: nodes, insert: function ($el) { $back.after($el); } }; } } } return { nodes: [], insert: function ($el) { $start.before($el); } }; } if (place === "pos-top") { // The thumbnails between the heading and the headword line. for ($cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) { if (isOwnFurniture($cursor)) { continue; } if (!$cursor.is(".thumb, figure, .floatright, .floatleft")) { break; } nodes.push($cursor.get(0)); } return { nodes: nodes, insert: function ($el) { $start.after($el); } }; } return null; } // The wikitext a "place" section's pending content renders as. A word list is its one call; everything // else is already the body that will be written. function loosePlacePreviewWikitext(subsection, content, language) { return subsection.kind === "wordlist" ? wt.buildHbnrCall(loosePlaceWords(content)) : loosePlaceBody(subsection, content, language); } // Draws a section's headword line from wikitext where the page's own line stands, or above the // definitions when the section has none. The page's line is detached rather than dropped, so the // returned function puts it back. function replaceHeadwordInPlace($h3, wikitext) { if (!$.trim(wikitext || "")) { return null; } var $old = $(); var $at = $(); for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { if ($cursor.is("p")) { $old = $cursor; break; } if (sections.headingDepth($cursor) || $cursor.is("ol")) { $at = $cursor; break; } } var $slot = $("<div class='dsb-sense-preview'></div>"); if ($old.length) { $old.before($slot); } else if ($at.length) { $at.before($slot); } else { return null; } var $body = $old.detach(); function restore() { if (!$slot) { return; } $body.insertBefore($slot); $slot.remove(); $slot = null; } fillWithRendered($slot, wikitext, restore); return restore; } // Redraws one of those places where it stands, the same way replaceSubsectionInPlace() redraws a // "====" one. The page's own nodes are detached rather than dropped, so cancelling puts them back. function replaceLoosePlaceInPlace($h3, subsection, wikitext) { if (!$.trim(wikitext || "")) { return null; } var at = loosePlaceDom($h3, subsection); if (!at) { return null; } var $slot = $("<div class='dsb-sense-preview'></div>"); at.insert($slot); var $body = $(at.nodes).detach(); function restore() { if (!$slot) { return; } $body.insertBefore($slot); $slot.remove(); $slot = null; } fillWithRendered($slot, wikitext, restore); return restore; } // Builds the subsection picker + its word-list/text field. A subsection that isn't on the page yet is saved // via insertPageSubsection(); one that already is gets prefilled and saved via updatePageSubsection(). // onlyHeader pins the panel to a single subsection (the per-heading pencil); omit it for the full picker. // free pins the panel to a heading that is not a subsection of a part of speech, located by its own // text: {header, ordinal}. function buildSubsectionPanel($panel, $h3, language, sectionType, sectionOrdinal, onlyHeader, free) { var existing = existingSubsectionHeadersInDom($h3); // A heading the data does not name is still editable. It is declared a word list so the reader // tries, in order, its {{kol3}} calls and then a plain bullet list; anything else falls through to // raw wikitext, which is what prefill() does with a list it cannot read. // Hidden counts as unknown here: the picker does not offer to build a Werger box, but one already // on the page still opens, as the wikitext it is. var unknown = onlyHeader && !PAGE_SUBSECTIONS.some(function (s) { return s.header === onlyHeader && !s.hidden; }); // A free section starts as wikitext: what it holds is only known once it has been read, and // prefill() swaps in the {{kol3}} form there if it turns out to be a list. var available = free ? [{ header: onlyHeader, id: "free", kind: "text", free: free, existing: true }] : unknown ? [{ header: onlyHeader, id: "unknown", kind: "wordlist", unknown: true, existing: true }] : PAGE_SUBSECTIONS.filter(function (s) { // "hidden" takes a section out of the picker without removing it: Werger waits for the // translation tools it belongs to, and offering a box those cannot yet fill misleads. // Werger also carries lang: "ku" -- it is a Kurdish-entry section, so it is not offered // elsewhere either. return !s.hidden && (!s.lang || s.lang === language) && (!onlyHeader || s.header === onlyHeader); }).map(function (s) { return $.extend({}, s, { existing: existing.indexOf(s.header) !== -1 }); }); if (!available.length) { $panel.text("Ji bo vê beşê guhartin tune."); return; } var $select = $("<select class='dsb-subsection-select'></select>"); if (!onlyHeader) { // Label-less on purpose: it holds the "nothing chosen yet" value without becoming a row in the // list (makeSearchable() skips a blank option that has no label), so the prompt lives in the // input's placeholder instead. $select.append($("<option value=''></option>")); } available.forEach(function (s) { // A "place" entry has no "====" heading of its own, so it is marked rather than left looking // like the subsections around it. var label = s.place ? s.header + " (ne binebeş e)" : (s.existing ? s.header + " (biguhêre)" : s.header); $select.append($("<option></option>").val(s.id).text(label)); }); var $selectWrap = makeSearchable($select, "Binebeşek hilbijêre"); if (onlyHeader) { $selectWrap.hide(); // pinned to one subsection: nothing to choose } var $fieldWrap = $("<div class='dsb-subsection-field'></div>"); var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add); var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel); var $status = $("<span class='dsb-status'></span>"); var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status); $cancel.on("click", function () { resetForm(); $panel.hide(); hideQueueIfIdle(); }); // A panel pinned to a heading on the page can rename or remove it. Bilêvkirin and the other places // have no heading of their own to change. var headingEditable = !!onlyHeader && available.length === 1 && available[0].existing && !available[0].place; var $nameWrap = null; // Only a panel pinned to one heading renames it; elsewhere the name is the picked subsection's own. var readName = function (s) { return s.header; }; if (headingEditable) { var subject = available[0]; var $nameLabel = $("<div class='dsb-adv-label'>Nav</div>"); if (subject.free) { var $nameInput = $("<input type='text' class='dsb-input dsb-heading-name'>").val(onlyHeader); readName = function () { return $.trim($nameInput.val()); }; $nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameInput); } else { // The names the gadget knows, for a subsection of a part of speech; one this part of speech // already has is left out. var $nameSelect = $("<select class='dsb-heading-name'></select>"); var names = [onlyHeader]; PAGE_SUBSECTIONS.forEach(function (s) { if (!s.place && !s.hidden && (!s.lang || s.lang === language) && names.indexOf(s.header) === -1 && existing.indexOf(s.header) === -1) { names.push(s.header); } }); names.forEach(function (name) { $nameSelect.append($("<option></option>").val(name).text(name)); }); var $nameSearch = makeSearchable($nameSelect, "Nav"); $nameSelect.val(onlyHeader).trigger("wiktku:refresh"); readName = function () { return $nameSelect.val() || onlyHeader; }; $nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameSearch); } var subjectDom = subsectionDom($h3, subject); if (!(subjectDom && subjectDom.hasDeeper)) { var $delete = $("<button type='button' class='dsb-delete'>Beşê jê bibe</button>"); $cancel.after($delete); $delete.on("click", function () { OO.ui.confirm("Beşa «" + subject.header + "» dê were rakirin. Dewam bike?").done(function (ok) { if (!ok) { return; } queueHeadingChange(subject, "beşa «" + subject.header + "» hate rakirin", function (pageContent) { return removeSubsection(pageContent, language, sectionType, sectionOrdinal, subject); }, function () { var dom = subsectionDom($h3, subject); if (!dom) { return null; } var $doomed = dom.$heading.add(dom.$body).addClass("dsb-preview-removed"); return function () { $doomed.removeClass("dsb-preview-removed"); }; }); }); }); } } // Renaming and removing share one queue key, so the later choice replaces the earlier one. Both run // last and bottom-up, since other queued changes find the section by the heading they change. function queueHeadingChange(s, action, transform, previewFn) { var dom = subsectionDom($h3, s); queueChange(subsectionPlaceLabel(s, language, sectionType, $h3), action, function (pageContent) { return { content: transform(pageContent), warnings: [] }; }, $save, $status, previewFn, { runLast: true, key: "heading:" + (s.free ? s.header + "|" + s.free.ordinal : sectionType + "|" + sectionOrdinal + "|" + s.header), pagePosition: dom ? headingPosition(dom.$heading) : 0 }); } function queueRename(s, newName) { queueHeadingChange(s, "beşa «" + s.header + "» bû «" + newName + "»", function (pageContent) { return renameSubsection(pageContent, language, sectionType, sectionOrdinal, s, newName); }, function () { var dom = subsectionDom($h3, s); if (!dom) { return null; } var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>") .text("→ " + newName + " — nû, hîn nehatiye qeydkirin"); dom.$heading.after($note); return function () { $note.remove(); }; }); } // Undefined while the placeholder option is selected. function currentSubsection() { var id = $select.val(); return id ? available.filter(function (s) { return s.id === id; })[0] : undefined; } // One entry per "{{kol3}}" group in the current wordlist section; empty for any other kind. var groupFields = []; var $groups = null; var editAsText = false; // set when an existing wordlist section turns out to be unparseable // Whatever has been typed into each subsection's box, so switching the picker away and back restores it // instead of rebuilding an empty field. Keyed by subsection id; lastId is whichever box is on screen. var drafts = {}; var lastId = null; // Called before renderField() rebuilds, while the group fields still hold the outgoing box. function captureDraft() { if (!lastId) { return; } drafts[lastId] = imagesField ? { asText: false, images: imagesField.values() } : (groupFields.length ? { asText: false, groups: readGroups() } : { asText: editAsText, text: fieldText() }); } function restoreDraft(s, draft) { // An existing wordlist we previously fell back to raw wikitext for stays in that mode. if (draft.asText && s.kind === "wordlist") { editAsText = true; groupFields = []; renderTextArea(s, 6); } if (imagesField) { imagesField.setValues(draft.images); } else if (groupFields.length) { setGroups(s, draft.groups); } else { setFieldText(draft.text); } } // Etîmolojî is edited on a live surface (see renderChipSurface) rather than in a textarea, so every // read and write of the field goes through these two instead of touching .dsb-subsection-text. var chipSurface = null; function fieldText() { if (wergerForm) { return buildWergerBlock(wergerForm.read()); } return chipSurface ? $.trim(readChipSurface(chipSurface.get(0))) : $.trim($fieldWrap.find(".dsb-subsection-text").val() || ""); } function setFieldText(value) { if (wergerForm) { wergerForm.set(parseWergerBlock(value)); return; } if (chipSurface) { renderChipSurface(chipSurface, value || ""); var schedule = chipSurface.data("dsbSchedulePreview"); if (schedule) { schedule(); // show what the loaded etymology renders as } } else { $fieldWrap.find(".dsb-subsection-text").val(value || ""); } } // The contenteditable surface: text typed directly, template calls as chips that open the dialog, // plus start.js's etymology templates in a searchable insert menu. // A live surface where a template shows as a chip, with a menu that inserts one. Etîmolojî and // Bilêvkirin are both written this way; they differ only in which templates the menu offers. function renderTemplateEditor(s, templates) { $fieldWrap.empty(); var $select = $("<select class='dsb-subsection-select'></select>"); $select.append($("<option value=''></option>")); templates.forEach(function (t) { $select.append($("<option></option>").val(t.snippet).text(t.name + " — " + t.desc)); }); var $surface = $("<div class='dsb-tpl-surface' contenteditable='true'></div>") .attr("role", "textbox") .attr("aria-multiline", "true"); chipSurface = $surface; // Clicking the insert menu moves focus out of the surface and the browser forgets the caret, so // the last caret position inside the surface is kept and restored before inserting -- otherwise // focus() drops it back to the very start and every template lands at the beginning of the line. var savedRange = null; function rememberCaret() { var sel = window.getSelection(); if (!sel || !sel.rangeCount) { return; } var range = sel.getRangeAt(0); var root = $surface.get(0); if (range.commonAncestorContainer === root || $.contains(root, range.commonAncestorContainer)) { savedRange = range.cloneRange(); } } $surface.on("keyup mouseup focusout", rememberCaret); function restoreCaret() { if (!savedRange) { return; } var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(savedRange); } $select.on("change", function () { var snippet = $select.val(); if (!snippet) { return; } // Same substitution start.js makes: CODE is this section's language, SOURCELANG is left for // the user to fill in. snippet = snippet.replace(/CODE/g, language).replace(/SOURCELANG/g, "?"); // A pronunciation template is a bullet of its own ("* {{ku-IPA}}"), so it starts a line // rather than landing in the middle of one. var ownLine = /^\*\s/.test(snippet); if (ownLine) { snippet = $.trim(snippet.replace(/^\*\s*/, "")); } $surface.focus(); restoreCaret(); var $chip = makeTemplateChip(snippet); var piece = document.createDocumentFragment(); if (ownLine) { // The bullet, and a line of its own unless the caret already starts one. var at = caretOffset(); var before = at >= 0 ? readChipSurface($surface.get(0)).slice(0, at) : ""; piece.appendChild(document.createTextNode(!before || /\n$/.test(before) ? "* " : "\n* ")); } piece.appendChild($chip.get(0)); insertAtCaret($surface, piece); rememberCaret(); // so a second insert lands after the first, not back at the old spot $select.val(""); // Straight into the dialog: the snippet is placeholders ("?", "…") until someone fills it in. cite.openTemplateDialog(snippet).then(function (edited) { applyChipEdit($chip, edited); syncPanelWidth(); }); }); // Paste as plain text: pasted markup would otherwise become real nodes in the surface. $surface.on("paste", function (e) { var clip = e.originalEvent && e.originalEvent.clipboardData; if (!clip) { return; } e.preventDefault(); document.execCommand("insertText", false, clip.getData("text/plain")); }); // The chip the dialog was opened for, or the one that has taken its place. renderChipSurface() // rebuilds the surface from its wikitext whenever a call is typed in as text, which throws away // the element this closure is holding; without this, "Jê bibe" would remove a node that is no // longer on screen and appear to do nothing. function liveChip($chip, wikitext) { if ($.contains($surface.get(0), $chip.get(0))) { return $chip; } return $surface.find(".dsb-tpl-chip").filter(function () { return $(this).attr("data-wikitext") === wikitext; }).first(); } function applyChipEdit($chip, edited) { if (edited === null || !$chip.length) { return; } if (!$.trim(edited)) { $chip.remove(); return; } // Edited into something that is no longer one template call: let it fall back to plain text // rather than keeping a chip that lies about its contents. var call = parseTemplateCalls(edited); if (call.otherContent || call.calls.length !== 1) { $chip.replaceWith(document.createTextNode(edited)); return; } $chip.replaceWith(makeTemplateChip(edited)); } // Double-click edits the call's wikitext in place; single click opens the parameter dialog. The // click is held back briefly so the first of a double-click does not open the dialog underneath. var chipClickTimer = null; var lastChipTap = 0; var lastChipNode = null; var DOUBLE_TAP_MS = 300; // Double-tap drops the chip back to plain wikitext in the surface, rather than making the chip // itself editable: a contenteditable inside a contenteditable gives Android a selection handle and // no usable caret. As plain text the browser's own editing works, and chipifyTyped() puts the chip // back once the caret leaves the call. // A collapsed caret inside the text just inserted: at the character tapped where the browser can // say which that is, otherwise just inside the closing braces so the caret stays within the call // (which is what stops chipifyTyped putting the chip straight back). function caretRangeIn(node, event) { var range; var x = event && event.clientX; var y = event && event.clientY; if (x !== undefined && document.caretRangeFromPoint) { range = document.caretRangeFromPoint(x, y); } else if (x !== undefined && document.caretPositionFromPoint) { var pos = document.caretPositionFromPoint(x, y); if (pos) { range = document.createRange(); range.setStart(pos.offsetNode, pos.offset); } } if (range && range.startContainer === node) { range.collapse(true); return range; } var text = node.nodeValue; range = document.createRange(); range.setStart(node, /\}\}$/.test(text) ? text.length - 2 : text.length); range.collapse(true); return range; } function startInlineEdit($chip, event) { if (!$.contains($surface.get(0), $chip.get(0))) { return; // the tap timer and dblclick can both fire; only the first one has a chip left } var node = document.createTextNode($chip.attr("data-wikitext")); $chip.replaceWith(node); $surface.get(0).focus(); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(caretRangeIn(node, event)); } // Bound before the chip's own handler and stopping there, so removing a call never opens the // dialog for it on the way out. $surface.on("click", ".dsb-tpl-chip-remove", function (e) { e.preventDefault(); e.stopImmediatePropagation(); clearTimeout(chipClickTimer); lastChipNode = null; $(this).closest(".dsb-tpl-chip").remove(); syncPanelWidth(); }); $surface.on("click keydown", ".dsb-tpl-chip", function (e) { if (e.type === "keydown" && e.which !== 13 && e.which !== 32) { return; } e.preventDefault(); var $chip = $(this); clearTimeout(chipClickTimer); // A second tap on the same chip edits it inline. Timed here rather than left to "dblclick", // which mobile browsers fire unreliably or not at all for a double-tap. var now = new Date().getTime(); if (lastChipNode === this && now - lastChipTap < DOUBLE_TAP_MS) { lastChipNode = null; startInlineEdit($chip, e); return; } lastChipTap = now; lastChipNode = this; var wikitext = $chip.attr("data-wikitext"); chipClickTimer = setTimeout(function () { cite.openTemplateDialog(wikitext).then(function (edited) { applyChipEdit(liveChip($chip, wikitext), edited); syncPanelWidth(); }); }, DOUBLE_TAP_MS); }); $surface.on("dblclick", ".dsb-tpl-chip", function (e) { e.preventDefault(); clearTimeout(chipClickTimer); startInlineEdit($(this), e); }); // A long etymology cannot be read in the panel's usual 520px column, so the panel drops its // width cap once there is enough text to need it. What it will look like is shown by the // in-place render on the page itself, not by a second copy inside the form. var WIDE_AT = 240; // characters function syncPanelWidth() { var wikitext = readChipSurface($surface.get(0)); if (wikitext.length > WIDE_AT || wikitext.indexOf("\n") !== -1) { $surface.closest(".dsb-subsection-panel").addClass("dsb-panel-wide"); } } // A template typed by hand becomes a chip once typing settles, so it behaves like an inserted one: // click for the parameter dialog, double-click for its raw wikitext. var composing = false; // The caret as an offset into the surface's wikitext, which is what survives rebuilding the DOM. function caretOffset() { var sel = window.getSelection(); var root = $surface.get(0); if (!sel || !sel.rangeCount) { return -1; } var range = sel.getRangeAt(0); if (range.startContainer !== root && !$.contains(root, range.startContainer)) { return -1; // caret is somewhere else on the page } var pre = document.createRange(); pre.selectNodeContents(root); pre.setEnd(range.startContainer, range.startOffset); var holder = document.createElement("div"); holder.appendChild(pre.cloneContents()); return readChipSurface(holder).length; } // Puts the caret back at that wikitext offset. Only runs straight after a rebuild, so the surface // holds nothing but text nodes and chips. function placeCaret(offset) { var root = $surface.get(0); var range = document.createRange(); var nodes = root.childNodes; root.focus(); for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var len = node.nodeType === 3 ? node.nodeValue.length : ($(node).attr("data-wikitext") || $(node).text()).length; if (offset <= len) { if (node.nodeType === 3) { range.setStart(node, offset); } else { range.setStartAfter(node); // a chip is atomic; the caret goes after it } break; } offset -= len; } if (!range.startContainer || range.startContainer === document) { range.selectNodeContents(root); } range.collapse(true); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } // True when the selection overlaps the inside of a template call. A caret resting exactly at the // closing "}}" does not count -- that is someone who has just finished typing one. function selectionTouchesCall(wikitext) { var sel = window.getSelection(); if (!sel || !sel.rangeCount) { return false; } var range = sel.getRangeAt(0); var root = $surface.get(0); if (range.startContainer !== root && !$.contains(root, range.startContainer)) { return false; } var from = caretOffset(); var to = from; if (!range.collapsed) { var pre = document.createRange(); pre.selectNodeContents(root); pre.setEnd(range.endContainer, range.endOffset); var holder = document.createElement("div"); holder.appendChild(pre.cloneContents()); to = readChipSurface(holder).length; } return parseTemplateCalls(wikitext).calls.some(function (call) { return from < call.end && to > call.start; }); } function chipifyTyped() { if (composing) { return; // never rebuild under an IME } var wikitext = readChipSurface($surface.get(0)); // Chips already hold one call each, so a higher call count means one was typed in as text. if (parseTemplateCalls(wikitext).calls.length <= $surface.find(".dsb-tpl-chip").length) { return; } var offset = caretOffset(); if (selectionTouchesCall(wikitext)) { return; // still inside a call: leave it as text until the caret moves out } renderChipSurface($surface, wikitext); savedRange = null; // the old range points at nodes that no longer exist if (offset >= 0) { placeCaret(offset); rememberCaret(); } } $surface.on("compositionstart", function () { composing = true; }); $surface.on("compositionend", function () { composing = false; schedulePreview(); }); var previewTimer = null; function schedulePreview() { clearTimeout(previewTimer); previewTimer = setTimeout(function () { chipifyTyped(); syncPanelWidth(); }, 700); } $surface.on("input", schedulePreview); $surface.data("dsbSchedulePreview", schedulePreview); $fieldWrap.append(makeSearchable($select, util.msg.addTemplate), $surface); // Bilêvkirin is written in IPA, so it gets the same character palette the wizard shows. Its // characters go in as text and its two template buttons as chips, which is what the rest of // this surface is made of. if (s.place === "pron") { $fieldWrap.append(util.buildIpaPalette({ insertText: function (text) { $surface.focus(); restoreCaret(); insertAtCaret($surface, document.createTextNode(text)); rememberCaret(); schedulePreview(); }, insertTemplate: function (snippet) { $surface.focus(); restoreCaret(); var $chip = makeTemplateChip(snippet.replace(/\|\s*\}\}$/, "}}")); insertAtCaret($surface, $chip.get(0)); rememberCaret(); cite.openTemplateDialog($chip.attr("data-wikitext")).then(function (edited) { applyChipEdit($chip, edited); syncPanelWidth(); }); } })); } } // The three "place" sections are wikitext with a shape worth spelling out, since nothing on screen // says what belongs in the box. var PLACE_PLACEHOLDERS = { "page-top": "{{h-bnr|Kelîme|Kelîmeyeke din}} an jî {{herwiha binêre/ane}}", "pos-top": "[[Wêne:Navê pelî.jpg|thumb|Binnivîs]]", "pron": "* {{ku-IPA}}" }; function renderTextArea(s, rows) { $fieldWrap.empty().append( $("<textarea class='dsb-input dsb-subsection-text'></textarea>") .attr("rows", rows) .attr("placeholder", PLACE_PLACEHOLDERS[s.place] || (s.header + "…")) ); util.initManualResize($fieldWrap); } // A translation box: the {{werger-ser}}/{{werger-bin}} pair, with the sense it covers and the // layout parameters that template accepts. The rows in between are left to the translation editor // gadget, which is what edits them on the rendered page. // Reads and writes through fieldText()/setFieldText() as wikitext, so drafts, save and the queue // need no special case beyond the append below. var wergerForm = null; var imagesField = null; function renderWergerField(s) { var inputs = {}; // Its own row class rather than .dsb-tpl-param-row: that one is styled in cite.css, which is // only on the page when wikt.cite happens to be loaded, and without it the label falls back to // sitting inline and a short one ("id") is overlapped by its own box. function row(key, label, placeholder) { inputs[key] = $("<input type='text' class='dsb-input'>").attr("placeholder", placeholder || ""); return $("<div class='dsb-werger-row'></div>").append( $("<label class='dsb-adv-label'></label>").text(label).append(inputs[key]) ); } // {{werger-ser}} also takes stûn, firehî, bgcolor, valign and align, but they only restyle the // box and its defaults are what these pages use, so the form does not offer them. They are // still in WERGER_NAMED, so a block that already sets one is read back correctly. var $main = $("<div class='dsb-werger-main'></div>").append( row("1", "Mane", "ava vexwarinê"), row("2", "Mane no", "ne mecbûrî — di parantezê de xuya dike"), row("id", "id", "ne mecbûrî — IDya tercimeyê") ); var $note = $("<p class='dsb-werger-note'></p>").text( "Qutiyeke Wergerê ya vala lê zêde dikî. Tercimeyan bi amûra wergerê dûre binivîse." ); wergerForm = { read: function () { var out = {}; $.each(inputs, function (key, $input) { var value = $.trim($input.val() || ""); if (value) { out[key] = value; } }); return out; }, set: function (params) { $.each(inputs, function (key, $input) { $input.val((params && params[key]) || ""); }); } }; $fieldWrap.empty().append($note, $main); } // Same [[Kategorî:Çavkanî]] search widget start.js's own picker uses: choosing an entry inserts // "* {{Target}}" at the cursor. The field itself stays the plain ".dsb-subsection-text" textarea // every other "kind: text" subsection already uses, so save/prefill/drafts need no changes. function renderCavkaniField(s) { var $ta = $("<textarea class='dsb-input dsb-subsection-text'></textarea>") .attr("rows", 4) .attr("placeholder", util.msg.pickOrTypeTemplate); var picker = cite.buildCategoryTemplateSearch({ placeholder: util.msg.addTemplate, describe: true, // Same param dialog Etîmolojî opens on a fresh insert: filled from the picked template's own // TemplateData, so the user adds "rûpel=", "sernav=", ... before anything lands in the field // rather than typing a bare {{Target}} and going back to fill params in by hand. onPick: function (entry) { cite.openTemplateDialog("{{" + entry.target + "}}").then(function (edited) { if (!edited) { return; // cancelled, or "Jê bibe" on a call that was never inserted } util.insertAtCursor($ta.get(0), "* " + edited + "\n"); $ta.trigger("focus"); }); } }); var $picker = $("<div class='dsb-cavkani-picker'></div>").append(picker.$element); $fieldWrap.empty().append($picker, $ta); } // One "{{kol3}}" group: its "sernav=" heading and its words. Several of these make up one section -- // "Herwiha binêre" typically carries an unheaded list plus a few headed ones. function addGroup(s, group) { var $sernav = $("<input type='text' class='dsb-input'>").attr("placeholder", "ne mecbûrî…"); // {{h-bnr}} takes bare page names, so its rows carry no ⊕: there is nowhere in the call for a // modifier to go. var words = buildWordListField(s.header + "…", { modifiers: !s.single }); var $remove = $("<a href='#' class='dsb-quick-link dsb-group-remove'>Komê rake</a>"); var $element = $("<div class='dsb-wordgroup'></div>").append( // Label beside the box, not above it: stacked, "Sernav" read as a heading for the whole // group rather than as the name of the field under it. The input is nested in the label so // clicking the word focuses the box, without needing an id per group. // A single-call list has no "sernav=" to carry, so the row is built (readGroups still reads // it) but never shown. Hidden here rather than in renderField: setGroups() rebuilds every // group on prefill, which would put a visible one back. $("<div class='dsb-tpl-param-row dsb-param-row-inline'></div>").append( $("<label class='dsb-adv-label'></label>").text("Sernav").append($sernav) ).toggle(!s.single), words.$element, $remove ); var field = { $element: $element, read: function () { return { sernav: $.trim($sernav.val()), words: words.values() }; }, set: function (g) { $sernav.val((g && g.sernav) || ""); words.setValues((g && g.words) || []); } }; $remove.on("click", function (e) { e.preventDefault(); var at = $.inArray(field, groupFields); if (at !== -1) { groupFields.splice(at, 1); } $element.remove(); updateGroupChrome(); }); field.set(group); groupFields.push(field); $groups.append($element); updateGroupChrome(); return field; } // With a single group there is nothing to tell apart, so it needs neither a remove link nor a label. function updateGroupChrome() { var many = groupFields.length > 1; $groups.toggleClass("dsb-wordgroups-many", many); $groups.find(".dsb-group-remove").toggle(many); } function readGroups() { return groupFields.map(function (field) { return field.read(); }); } // Rebuilds the blocks to match what the page (or the draft) holds, always leaving at least one. function setGroups(s, groups) { groupFields = []; $groups.empty(); (groups && groups.length ? groups : [null]).forEach(function (group) { addGroup(s, group); }); } // Loads what the page already has into the form, so an edit starts from the current list rather than // from an empty one. A wordlist section we can't parse degrades to raw wikitext editing. function prefill(s) { $status.removeClass("dsb-status-error dsb-status-ok").text("Tê barkirin…"); $save.prop("disabled", true); fetchPageSubsection(language, sectionType, sectionOrdinal, s).then(function (current) { $save.prop("disabled", false); $status.text(""); if (!current) { return; } // A "place" section has no heading of its own, so whether the page already has one cannot // be seen in the DOM the way a "====" subsection can -- it is known only once its content // has been read. That is what decides "nûkirin" or "zêdekirin" in the edit summary. if (s.place) { s.existing = !!(current.images ? current.images.length : $.trim(current.text || "")); // The label was set before this content arrived, when nothing yet said one was there. $save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add); } if (current.kind === "images" && imagesField) { imagesField.setValues(current.images); return; } // A free section's field was built before its content was known: a list turns it into the // {{kol3}} form, anything else leaves it the wikitext box it already is. if (s.free && current.kind === "wordlist" && !groupFields.length) { s.kind = "wordlist"; renderWordListField(s); setGroups(s, current.groups); if (current.fromBullets) { $status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}."); } return; } if (current.kind === "wordlist" && groupFields.length) { setGroups(s, current.groups); if (current.fromBullets) { $status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}."); } return; } if (s.kind === "wordlist") { editAsText = true; groupFields = []; renderTextArea(s, 6); $status.text(s.unknown ? "Ev beş nayê naskirin — wekî wîkîtekst tê guhartin." : "Şablona vê lîsteyê nehate naskirin — wekî wîkîtekst biguhêre."); } setFieldText(current.text); }, function () { $save.prop("disabled", false); $status.addClass("dsb-status-error").text("Nikare muhtewaya heyî bixwîne."); }).then(function () { if (currentSubsection() === s) { loadedSnapshot = contentSnapshot(); } }); } // What the box held when the page's content was put in it, so a save that changed nothing queues // nothing -- renaming a heading does not also rewrite its body. var loadedSnapshot = null; function contentSnapshot() { if (imagesField) { return JSON.stringify(imagesField.values()); } return JSON.stringify(groupFields.length ? readGroups() : fieldText()); } // One "{{kol3}}" group per block, plus a way out to raw wikitext for a list no row can express -- // a shared subpage list like {{herwiha binêre/ane}}, say. function renderWordListField(s) { $fieldWrap.empty(); chipSurface = null; editAsText = false; var $addGroup = $("<a href='#' class='dsb-quick-link'>+ Komek lê zêde bike</a>"); $addGroup.on("click", function (e) { e.preventDefault(); addGroup(s, null); }); $groups = $("<div class='dsb-wordgroups'></div>"); $fieldWrap.append($groups, $addGroup); addGroup(s, null); // One call takes one flat list of names, so there is no second group to add. if (s.single) { $addGroup.hide(); } var $toRaw = $("<a href='#' class='dsb-quick-link'>Wekî wîkîtext biguhêre</a>"); $toRaw.on("click", function (e) { e.preventDefault(); var current = s.place ? wt.buildHbnrCall(loosePlaceWords(readGroups())) : subsectionBodyWikitext(language, s, readGroups()); editAsText = true; groupFields = []; $groups = null; renderTextArea(s, 3); setFieldText(current); util.initManualResize($fieldWrap); }); $fieldWrap.append($toRaw); util.initManualResize($fieldWrap); } function renderField() { var s = currentSubsection(); loadedSnapshot = null; $fieldWrap.empty(); groupFields = []; $groups = null; editAsText = false; chipSurface = null; wergerForm = null; imagesField = null; $status.removeClass("dsb-status-error dsb-status-ok").text(""); // Save stays disabled (but "Betal bike" usable) until something is actually chosen. $save.prop("disabled", !s); if (!s) { $save.text(util.msg.add); lastId = null; return; // still on "Binebeşekê hilbijêre" } if (s.kind === "wordlist") { renderWordListField(s); } else if (s.kind === "images") { imagesField = util.buildImageListField({ prefix: "dsb-", rowClass: "dsb-tpl-param-row dsb-param-row-inline", inputClass: "dsb-input", addClass: "dsb-quick-link", pageName: mw.config.get("wgTitle") }); $fieldWrap.append(imagesField.$element); } else if (s.header === "Etîmolojî") { renderTemplateEditor(s, templateChoices("etymTpls", language)); } else if (s.place === "pron") { renderTemplateEditor(s, templateChoices("pronTpls", language)); } else if (s.kind === "werger") { renderWergerField(s); } else if (s.header === "Çavkanî") { renderCavkaniField(s); } else { renderTextArea(s, 3); } // Werger always adds a box, even to a section that is already there, so its button never says // "Biguhêre". $save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add); // Covers whichever branch above built the field. Idempotent, so a textarea already carrying a // grip is skipped. util.initManualResize($fieldWrap); lastId = s.id; // A draft always wins over re-reading the page: it is the newer, unsaved state. if (drafts[s.id]) { restoreDraft(s, drafts[s.id]); } else if ((s.existing || s.place) && s.kind !== "werger") { prefill(s); } } $select.on("change", function () { captureDraft(); renderField(); }); renderField(); // Back to the state a fresh open would show: no draft, no picked subsection. Called directly // rather than through the "change" handler above, so the discarded draft is never captured first. function resetForm() { drafts = {}; if (!onlyHeader) { $select.val("").trigger("wiktku:refresh"); } renderField(); } $save.on("click", function () { var s = currentSubsection(); if (!s) { return; } var newName = readName(s); if (!newName) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Navê beşê vala ye."); return; } var asText = editAsText || (s.kind !== "wordlist" && s.kind !== "images"); var effective = asText ? $.extend({}, s, { kind: "text" }) : s; var content; var hasContent; if (asText) { content = fieldText(); hasContent = !!content; } else if (s.kind === "images") { content = imagesField ? imagesField.values() : []; hasContent = content.length > 0; } else { content = readGroups(); hasContent = content.some(function (group) { return group.words.length; }); } var renaming = newName !== s.header; if (renaming) { queueRename(s, newName); } var unchanged = loadedSnapshot !== null && contentSnapshot() === loadedSnapshot; if (!hasContent || unchanged) { if (unchanged && !renaming) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Tiştek nehatiye guhartin."); } return; } $save.prop("disabled", true); // A Werger section holds any number of boxes, so an existing one is appended to rather than // replaced; every other kind edits the single body it owns. var appending = s.kind === "werger" && s.existing; queueChange( subsectionPlaceLabel(s, language, sectionType, $h3), s.kind === "werger" ? "qutiyeke wergerê hate zêdekirin" : "beşa «" + s.header + "» hate " + (s.existing ? "nûkirin" : "zêdekirin"), function (pageContent) { var body = content; if (appending) { var current = readPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective); var existingText = current ? $.trim(current.text || "") : ""; body = existingText ? existingText + "\n\n" + content : content; } return { content: s.free ? updateFreeSection(pageContent, language, effective, body) : (s.place ? writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, effective, loosePlaceBody(effective, body, language)) : (s.existing ? updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body) : insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body))), warnings: [] }; }, $save, $status, // Werger is a box the translation tools fill in afterwards, so there is nothing to draw for // it. A new subsection gets a block of its own at the position it will land in; one already // on the page is redrawn where it stands. s.kind === "werger" ? null : function () { // A free section is redrawn under its own heading, which is the element the panel hangs // on. if (s.free) { var restoreFree = replaceFreeSectionInPlace($h3, subsectionBodyWikitext(language, effective, content)); return function () { if (restoreFree) { restoreFree(); restoreFree = null; } }; } // A "place" section has no heading to redraw between, so it is found in the DOM by what // it renders as and replaced there. if (s.place) { var restoreLoose = replaceLoosePlaceInPlace($h3, effective, loosePlacePreviewWikitext(effective, content, language)); return function () { if (restoreLoose) { restoreLoose(); restoreLoose = null; } }; } if (!s.existing) { var $preview = buildSubsectionPreviewDom($h3, s, content, language); return function () { $preview.remove(); }; } var restore = replaceSubsectionInPlace($h3, effective.header, subsectionBodyWikitext(language, effective, content)); return function () { if (restore) { restore(); restore = null; } }; }, { key: s.free ? "section:" + s.header + "|" + s.free.ordinal : "subsection:" + sectionType + "|" + sectionOrdinal + "|" + s.header } ); }); $panel.empty().append($selectWrap, $nameWrap, $fieldWrap, $actions); } // Builds the "choose a part of speech" picker that reclassifies a section -- an unclassified // "=== Mane ===" placeholder, or a "=== Biwêj ===" that turns out to be a real part of speech. Saved via // convertSectionToPos(); lists every name from sectionNames except the one the section already is. function buildConvertPosPanel($panel, $h3, language, sectionType, sectionOrdinal) { var $select = $("<select class='dsb-convert-pos-select'></select>"); // Label-less, like the subsection picker's: it holds the "nothing chosen yet" value without showing // up as a row, so the prompt lives in the input's placeholder instead. $select.append($("<option value=''></option>")); Object.keys(sectionNames).forEach(function (name) { // The section's own part of speech is listed too, marked: picking it changes nothing about the // heading and leaves the parameters below to be edited on their own. $select.append($("<option></option>").val(name) .text(name === sectionType ? name + " (ya niha)" : name)); }); var $selectWrap = makeSearchable($select, "Li cureyekî rêzimanî bigere"); // Opens on the section's own part of speech, so editing only its parameters needs no pick. if (sectionNames[sectionType]) { $select.val(sectionType).trigger("wiktku:refresh"); } // The same card the entry wizard shows under its part-of-speech question -- gender, transitivity, // the transliteration boxes and everything behind "Tercîhên pêşketî". Shared from // wikt.edit/posparams.js, so reclassifying a section here offers exactly what creating one in the // wizard does. var card = posparams.build({ lang: language, pos: "" }); // Opened on the call the section already has, so this edits the current template rather than // starting from a blank line. setContext() rebuilds the line whenever the part of speech moves, // so the prefill is only the starting point. var spec0 = posTemplateFor(sectionType); card.setContext(language, spec0 ? spec0.name : "", /^Formeke /.test(sectionType)); fetchPageContent().then(function (pageContent) { try { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var found = findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType); if (found.index !== -1 && ($select.val() || sectionType) === sectionType) { card.setWikitext(found.text); } } catch (e) { /* an unreadable section just leaves the card as it was */ } }); $select.on("change", function () { var spec = posTemplateFor($select.val()); card.setContext(language, spec ? spec.name : "", /^Formeke /.test($select.val() || "")); }); // "gh" on its own, or "<form>-<base>" once a structural form is picked -- start.js's own composition. // convertSectionToPos() writes the template itself, so only what follows "{{pos|lang" is wanted // from the card's line. function posParams() { var m = /^\{\{[^|}]*\|[^|}]*\|?([\s\S]*)\}\}$/.exec(card.wikitext()); return m ? m[1] : ""; } var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add); var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel); var $status = $("<span class='dsb-status'></span>"); var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status); // dsb.js owns the pencil and the panel's built state, so it does the closing. $cancel.on("click", function () { $panel.trigger("dsbCancel"); hideQueueIfIdle(); }); $save.on("click", function () { var chosen = $select.val(); if (!chosen) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Pêşî cureyekî rêzimanî hilbijêre."); return; } var params = posParams(); $save.prop("disabled", true); $status.removeClass("dsb-status-error").text(""); queueChange( langLabel(language), "beşa «" + sectionLabel(sectionType, $h3) + "» bû «" + chosen + "»", function (pageContent) { return { content: convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, chosen, params), warnings: [] }; }, $save, $status, function () { // The heading keeps its text, which every other queued change finds the section by; a // note under it names the new one. The headword line is drawn as the save will write it. var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>") .text("→ " + chosen + (params ? " (" + params + ")" : "") + " — nû, hîn nehatiye qeydkirin"); headingOuter($h3).after($note); var dropped = false; var restoreHeadword = null; fetchPageContent().then(function (pageContent) { if (dropped) { return; } var call; try { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); call = posCallLine(findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType), language, chosen, params); } catch (e) { return; } restoreHeadword = replaceHeadwordInPlace($h3, call); }); return function () { dropped = true; $note.remove(); if (restoreHeadword) { restoreHeadword(); restoreHeadword = null; } }; }, // Runs after every other queued change: it renames the "Mane" heading those changes locate // themselves by, so anything edited on this section has to be applied first. { runLast: true, key: "convert:" + sectionType + "|" + sectionOrdinal, pagePosition: headingPosition($h3) } ); }); $panel.empty().append($selectWrap, card.$element, $actions); } // Attaches the "+ Beşek lê zêde bike" trigger right after a POS block's own last element. // Puts the same pencil the definitions use on every existing "====" subsection heading the gadget knows how // to edit, opening buildSubsectionPanel() pinned to that one subsection. module.exports = { buildAdvancedPanel: buildAdvancedPanel, buildSubsectionPanel: buildSubsectionPanel, buildConvertPosPanel: buildConvertPosPanel, editExample: editExample, clearQueue: clearQueue, closeAllPanels: closeAllPanels, openQueueBox: openQueueBox }; }()); // </nowiki> fynxq22uwjg4hvllodyqzzjbn8dxcd1 Bikarhêner:Wikihez/Gadget-test/dsb-panels.css 2 1358910 6532599 6531986 2026-09-19T09:00:27Z Wikihez 7344 DefSideBoxes: keep the pending-changes box under an open dialog 6532599 css text/css /* <nowiki> */ /* * Page: [[MediaWiki:Gadget-wikt.dsb-panels.css]] */ /* ── Searchable select ─────────────────────────────────────────────── The native <select> is hidden inside the wrapper and still holds the value; the input filters the list. */ .dsb-ac-wrap { position: relative; display: block; } .dsb-ac-input { width: 100%; box-sizing: border-box; } .dsb-ac-results { position: absolute; z-index: 30; top: 100%; left: 0; right: 0; max-height: 260px; margin: 2px 0 0; padding: 4px; overflow-y: auto; list-style: none; font-family: var(--wikt-sans); font-size: 13px; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12); } .dsb-ac-results li { padding: 6px 8px; border-radius: 6px; cursor: pointer; } .dsb-ac-results li:hover, .dsb-ac-results li.dsb-ac-active { background: var(--wikt-accent-tint); } /* ── Etîmolojî editing surface ─────────────────────────────────────── A contenteditable line of wikitext: text is typed straight into it, template calls sit in it as chips. */ .dsb-tpl-surface { min-height: 72px; margin-top: 6px; padding: 8px 10px; font-family: var(--wikt-sans); font-size: 14px; line-height: 1.6; color: var(--wikt-ink); white-space: pre-wrap; word-wrap: break-word; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); } .dsb-tpl-surface:focus { outline: none; border-color: var(--wikt-accent); box-shadow: 0 0 0 2px var(--wikt-accent-tint); } /* The chips: visibly not prose, and atomic to the caret. */ /* Takes the call off the line without going through the parameter dialog -- on a phone there is no reliable backspace onto a contenteditable="false" chip. */ .dsb-tpl-chip-remove { position: relative; margin-left: 5px; padding: 0 2px; font-family: var(--wikt-sans); font-size: 13px; line-height: 1; color: var(--wikt-accent-deep); opacity: 0.6; cursor: pointer; } .dsb-tpl-chip-remove:hover { color: var(--wikt-danger); opacity: 1; } /* The glyph stays small; the tap target grows invisibly around it. */ @media (max-width: 720px), (pointer: coarse) { .dsb-tpl-chip-remove { opacity: 1; } .dsb-tpl-chip-remove::after { content: ""; position: absolute; inset: -10px -8px; } } .dsb-tpl-chip { display: inline-block; margin: 0 1px; padding: 1px 6px; font-family: var(--wikt-mono); font-size: 12.5px; color: var(--wikt-accent-deep); max-width: 100%; white-space: normal; overflow-wrap: anywhere; vertical-align: baseline; background: var(--wikt-accent-tint); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); touch-action: manipulation; cursor: pointer; user-select: none; } .dsb-tpl-chip:hover, .dsb-tpl-chip:focus { background: var(--wikt-field-bg); border-color: var(--wikt-accent); outline: none; } /* ── Template parameter form ───────────────────────────────────────── .dsb-tpl-name/-desc/-param-row/-help/-undocumented/-modifier-list and the deprecated-label override now live in cite.css (wikt.cite's own stylesheet): buildTemplateParamForm() moved there so start.js's own Etîmolojî/Çavkanî pickers can open the same dialog. */ /* One-line variant: label beside its box rather than above it, for a single field whose name would otherwise read as a heading for everything below it (the word groups' "Sernav"). */ .dsb-param-row-inline > .dsb-adv-label { display: flex; gap: 8px; align-items: center; } /* Sernav is optional and names the group; the word boxes under it are what the form is actually for. Letting it stretch to the full row made the one thing you may leave blank the widest box on the card, so it takes only the space its own content needs. */ .dsb-param-row-inline .dsb-input { flex: 0 1 auto; width: 12em; max-width: 40%; /* .dsb-input's own 16em floor would win over the width above and make this the widest box on the card, which is the opposite of the point. */ min-width: 0; max-width: 100%; min-width: 0; } .dsb-gloss-raw { font-size: 12px; } /* Disclosure arrow on "Hevmane û Bêhtir", flipped when the menu is open. */ .dsb-more-arrow { font-size: 10px; vertical-align: 1px; } /* The POS panel's follow-up questions (cinsiyet / lektur): label above its select, like the field boxes. */ .dsb-pos-param-row { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; } /* ── "Guhartina pêşketî" (advanced editing) panel ────────────────────── Revealed by the pencil toggle above: every per-sense action this gadget offers, queued together with one "Lê zêde bike". A plain inline row, not a bordered/background card. */ .dsb-quick-row { display: flex; flex-direction: column; align-items: stretch; gap: 4px; box-sizing: border-box; max-width: 520px; margin: 4px 0 0 16px; font-family: var(--wikt-sans); font-size: 12px; color: var(--wikt-ink-2); } .dsb-quick-link { align-self: flex-start; margin-bottom: 10px; font-size: 12px; color: var(--wikt-accent); text-decoration: none; white-space: nowrap; cursor: pointer; } /* The links under a word list ("+ Komek lê zêde bike", "Wekî wîkîtext biguhêre") sit in the field wrap rather than in a flex column, so they need their own spacing or they run together. */ .dsb-subsection-field > .dsb-quick-link { display: inline-block; margin-right: 14px; } .dsb-quick-link:hover, .dsb-quick-link:focus { color: var(--wikt-accent-deep); text-decoration: underline; } /* The picker row: gloss + the two primary word groups as direct "+ <field>" links, plus a "Hevmane û Bêhtir" toggle for the rest -- clicking a link opens its box above the buttons and hides the link; .dsb-box-remove un-hides it. position: relative anchors .dsb-more-menu's overlay below (see there). */ .dsb-field-picker { position: relative; display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; } .dsb-field-picker .dsb-quick-link { margin-bottom: 0; } /* Under the buttons once a box is open: a little space so the links do not read as part of the buttons. */ .dsb-open-boxes:not(:empty) ~ .dsb-field-picker { margin-top: 8px; } /* The "Hevmane û Bêhtir" dropdown: every non-primary field link (plus Nimûne/jêgirtin, which sits first) stacked as a plain vertical list. Floats over the page as an overlay (positioned against .dsb-field-picker) instead of pushing $openBoxes/the rest of the definition down when it opens. */ .dsb-more-menu { position: absolute; top: 100%; left: 0; z-index: 10; display: flex; flex-direction: column; align-items: flex-start; width: max-content; max-width: min(320px, calc(100vw - 40px)); gap: 6px; margin: 2px 0 0 4px; padding: 8px 12px; background: var(--wikt-card); border: 1px solid var(--wikt-rule); border-radius: var(--wikt-r-field); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06); } .dsb-more-menu .dsb-quick-link { margin-bottom: 0; } /* Boxes the user has actually opened, stacked in the order they were added -- several can be open at once. */ .dsb-open-boxes { display: flex; flex-direction: column; } /* Nothing open: take it out of the flow so the links do not sit above an empty gap. */ .dsb-open-boxes:empty { display: none; } /* One field (its label + input) within the panel -- always a currently-open, removable box. */ .dsb-adv-group { position: relative; margin-bottom: 14px; padding-right: 20px; } .dsb-adv-label { margin-bottom: 4px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } /* The example sentence beside a word list's name: same text the wizard shows, so it reads as the quieter half of the label rather than a second heading. */ .dsb-adv-hint { margin-left: 6px; font-weight: 400; font-style: italic; color: var(--wikt-muted); } /* The shared image rows (util.js's buildImageListField): one label + box per line, like the parameter rows above them. Three identical boxes twice over is unreadable without a break between them, so each image is its own block with its own name. */ .dsb-resim-list { margin: 0; padding-left: 0; } .dsb-resim-item { list-style: none; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--wikt-rule-soft); } .dsb-resim-item:first-child { margin-top: 0; padding-top: 0; border-top: 0; } .dsb-resim-index { margin-bottom: 6px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } .dsb-box-remove { position: absolute; top: 0; right: 0; color: var(--wikt-ink-3); text-decoration: none; font-size: 14px; line-height: 1; cursor: pointer; } .dsb-box-remove:hover, .dsb-box-remove:focus { color: var(--wikt-accent-deep); } .dsb-form-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .dsb-input { box-sizing: border-box; min-width: 16em; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } /* The native corner is replaced by util.js's grip (see wikt-edit.css), which drags vertically only and remembers the height. */ .dsb-subsection-panel textarea.dsb-input, .dsb-adv-group textarea.dsb-input { resize: none; } .dsb-input::placeholder { color: var(--wikt-placeholder); opacity: 1; } .dsb-input:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } /* ── Plain tag field (Etîket, Kategorî) ──────────────────────────────── Plain type-and-commit tags with no suggestion panel; unlike Hevmane/Dijmane/etc., these carry no modifiers. */ .dsb-tagfield { box-sizing: border-box; display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 16em; padding: 4px 6px; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } .dsb-tagfield:focus-within { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); } .dsb-tag { display: inline-flex; align-items: center; gap: 6px; background: var(--wikt-accent-tint); color: var(--wikt-accent-deep); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); font-size: 12px; padding: 3px 6px 3px 10px; } .dsb-tag-remove { border: 0; background: transparent; color: var(--wikt-muted); font-size: 13px; line-height: 1; cursor: pointer; padding: 0 2px; } .dsb-tag-remove:hover { color: var(--wikt-danger); } .dsb-tagfield .dsb-input { flex: 1 1 8em; min-width: 8em; border: 0; padding: 3px 2px; background: transparent; box-shadow: none; } .dsb-tagfield .dsb-input:focus { box-shadow: none; } .dsb-save, .dsb-cancel, .dsb-delete, .dsb-autolink { font-family: var(--wikt-sans); font-size: 13px; font-weight: 500; padding: 6px 14px; border-radius: var(--wikt-r-pill); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } /* One filled pill per row — the same rule the form's footer follows. */ .dsb-save { background: var(--wikt-accent); border: 1px solid var(--wikt-accent); color: #fff; } .dsb-save:hover { background: var(--wikt-accent-deep); border-color: var(--wikt-accent-deep); } .dsb-save:disabled { opacity: 0.55; cursor: progress; } .dsb-cancel { background: transparent; border: 1px solid transparent; color: var(--wikt-ink-3); } .dsb-cancel:hover { border-color: var(--wikt-field-edge); color: var(--wikt-ink); } /* Removing a heading: plain like Betal bike, in the danger colour, pushed to the far end of the row. */ .dsb-delete { margin-left: auto; background: transparent; border: 1px solid transparent; color: var(--wikt-danger); } .dsb-delete:hover { border-color: var(--wikt-danger); } /* The heading's name, above the section's own box. */ .dsb-heading-name-wrap { margin-bottom: 10px; } /* A heading queued for removal, with everything it owns, until the queue is saved or the change dropped. */ .dsb-preview-removed { opacity: 0.5; text-decoration: line-through; text-decoration-color: var(--wikt-danger); } /* An outline pill, distinct from both the filled .dsb-save and the plain-text .dsb-cancel -- a secondary utility action, not the primary save nor a dismissal. */ .dsb-autolink { background: transparent; border: 1px solid var(--wikt-accent-edge); color: var(--wikt-accent); } .dsb-autolink:hover { border-color: var(--wikt-accent); color: var(--wikt-accent-deep); } .dsb-autolink:disabled { opacity: 0.55; cursor: progress; } /* Status line. Color comes from .dsb-status-ok/.dsb-status-error (added by the .js on success/failure) rather than an inline style, so these tokens (and dark mode) apply. */ .dsb-status { font-family: var(--wikt-sans); font-size: 12.5px; color: var(--wikt-muted); } .dsb-status-ok { color: var(--wikt-ok); } .dsb-status-error { color: var(--wikt-danger); } /* ── "+ Beşek lê zêde bike" ────────────────────────────────────────── An accent-coloured action link, like the form's .wiktku-adv-toggle: it opens something, so it is not muted grey. */ /* iOS Safari zooms the page in whenever a field it focuses has text under 16px, and everything here is 12-13px for density. On touch the form controls go up to the size that stops it; the pointer query leaves the desktop layout alone. */ @media (pointer: coarse) { .dsb-input, .dsb-tag-input, .dsb-subsection-select, .dsb-convert-pos-select { font-size: 16px; } /* Full width, whatever the viewport reports: a phone asked to render the desktop site says ~980px and would otherwise leave these at their desktop size. */ .dsb-subsection-panel .dsb-input, .dsb-subsection-panel .dsb-subsection-select, .dsb-convert-pos-panel .dsb-convert-pos-select { width: 100%; max-width: 100%; } /* Sernav is the exception: it names the group, so it stays visibly smaller than the boxes it heads. The cap matters more than the em width -- at 16px, 12em came out the same size as a word box. */ .dsb-subsection-panel .dsb-param-row-inline .dsb-input { width: 8em; max-width: 40%; } } /* The image rows reuse the inline row, but nothing here is optional the way a group's "Sernav" is: a file name and a caption want the whole row. */ .dsb-resim-list .dsb-param-row-inline > .dsb-adv-label, .dsb-resim-list .dsb-tpl-param-row > label { display: flex; gap: 8px; align-items: center; } .dsb-resim-list .dsb-param-row-inline .dsb-input, .dsb-resim-list .dsb-tpl-param-row .dsb-input { flex: 1 1 auto; width: auto; max-width: 100%; } /* ── Subsection panel ──────────────────────────────────────────────── A sunken card rather than a grey utility box; fields stack so the picker and its input are not competing for one narrow row. */ .dsb-subsection-select, .dsb-convert-pos-select { box-sizing: border-box; width: 100%; max-width: 100%; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); } .dsb-subsection-select:focus, .dsb-convert-pos-select:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } /* The template-insert picker sits above the Çavkanî textarea, not in place of it -- a little breathing room so the two don't read as one control. */ .dsb-cavkani-picker { margin-bottom: 6px; } .dsb-subsection-field { min-width: 0; } .dsb-subsection-words, .dsb-subsection-text { box-sizing: border-box; width: 100%; min-width: 0; } .dsb-subsection-text { line-height: 1.6; resize: vertical; } /* ── Gloss field inside the advanced-editing panel ──────────────────── Same shape as .dsb-subsection-text. */ .dsb-edit-gloss { width: 100%; line-height: 1.6; resize: vertical; } /* ── Live "not saved yet" previews ───────────────────────────────────── Dropped into the rendered page at the change's own spot. Dashed edge + a small badge mark them as pending, not real content; they disappear on "Betal bike" or once the real save lands. */ .dsb-preview-block, .dsb-preview-inline { margin: 8px 0; padding: 8px 12px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink-2); background: var(--wikt-accent-tint); border: 1px dashed var(--wikt-accent-edge); border-radius: var(--wikt-r-field); } .dsb-preview-inline { margin-left: 26px; max-width: 520px; } .dsb-preview-heading { margin: 0 0 4px; font-size: 15px; font-weight: 600; color: var(--wikt-ink); } .dsb-preview-badge { display: inline-block; margin-bottom: 6px; padding: 1px 8px; font-size: 11px; font-weight: 500; color: var(--wikt-accent-deep); background: var(--wikt-card); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); } /* Parser output goes in here, so it drops the panel's own font and colour and takes the page's \u2014 the point of the box is that what is inside it looks exactly like what will be saved. */ .dsb-preview-rendered, .dsb-preview-rendered-inline { font-family: inherit; font-size: 14px; color: var(--wikt-ink); } .dsb-preview-rendered-inline { display: inline; } .dsb-preview-rendered-inline .mw-parser-output, .dsb-preview-rendered-inline .mw-parser-output > p { display: inline; } .dsb-preview-list, .dsb-preview-text { margin: 0; padding-left: 18px; } .dsb-preview-text { padding-left: 0; } /* ── Floating save-queue widget ───────────────────────────────────── This gadget's own small floating box. One "Lê zêde bike" click anywhere on the page adds a line here; "Guhertinan qeyd bike" makes the one real save; "Betal bike" drops everything queued without touching the page. */ .dsb-queue-box { position: fixed; top: 60px; right: 16px; /* Under an OOUI dialog (z-index 450), which on a phone fills the screen: above it, this box sat over the form it belongs to. Still over everything in the article. */ z-index: 400; box-sizing: border-box; width: 280px; max-width: calc(100vw - 32px); max-height: calc(100vh - 90px); overflow-y: auto; padding: 12px 14px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink-2); background: var(--wikt-card); border: 1px solid var(--wikt-accent); border-radius: var(--wikt-r-card); box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16); } .dsb-queue-title { margin-right: 20px; font-size: 13px; font-weight: 600; color: var(--wikt-ink); } .dsb-queue-close { float: right; color: var(--wikt-ink-3); text-decoration: none; font-size: 14px; line-height: 1; cursor: pointer; } .dsb-queue-close:hover, .dsb-queue-close:focus { color: var(--wikt-accent-deep); } /* Stands in for the list before anything is queued, saying what the save button is for. */ .dsb-queue-empty { margin: 8px 0; font-size: 12px; line-height: 1.5; color: var(--wikt-ink-3); } .dsb-queue-list { margin: 8px 0; padding-left: 18px; max-height: 160px; overflow-y: auto; } .dsb-queue-list li { margin-bottom: 4px; } /* Drops one queued change. Dim until its line is hovered, so the list stays a list and not a row of buttons. */ .dsb-queue-drop { margin-left: 6px; padding: 0 3px; border: 0; background: transparent; color: var(--wikt-muted); font-size: 13px; line-height: 1; cursor: pointer; opacity: 0; transition: opacity 0.12s ease, color 0.12s ease; } .dsb-queue-list li:hover .dsb-queue-drop, .dsb-queue-drop:focus { opacity: 1; } .dsb-queue-drop:hover { color: var(--wikt-danger); opacity: 1; } /* No hover on touch, so the button is simply there. */ @media (hover: none), (pointer: coarse) { .dsb-queue-drop { opacity: 1; } } .dsb-queue-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; } .dsb-queue-save, .dsb-queue-cancel { font-family: var(--wikt-sans); font-size: 13px; font-weight: 500; padding: 6px 14px; border-radius: var(--wikt-r-pill); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } .dsb-queue-save { background: var(--wikt-accent); border: 1px solid var(--wikt-accent); color: #fff; } .dsb-queue-save:hover { background: var(--wikt-accent-deep); border-color: var(--wikt-accent-deep); } .dsb-queue-save:disabled { opacity: 0.55; cursor: progress; } .dsb-queue-cancel { background: transparent; border: 1px solid var(--wikt-field-edge); color: var(--wikt-ink-3); } .dsb-queue-cancel:hover { border-color: var(--wikt-ink-3); color: var(--wikt-ink); } .dsb-queue-status { margin-top: 6px; font-size: 12.5px; color: var(--wikt-muted); } .dsb-queue-status.dsb-status-ok { color: var(--wikt-ok); } .dsb-queue-status.dsb-status-error { color: var(--wikt-danger); } /* ── Minerva (mobile) ──────────────────────────────────────────────── Narrower viewport: keep the panel on screen and give every tap target the form's 44px minimum. */ @media (max-width: 720px), (pointer: coarse) { .dsb-quick-row { font-size: 13px; margin-left: 20px; } .dsb-input, .dsb-subsection-select, .dsb-convert-pos-select { min-height: 40px; /* >=16px stops iOS Safari zooming the page on focus. */ font-size: 16px; } .dsb-tagfield .dsb-input { min-height: 32px; } .dsb-tag-remove { padding: 0 6px; } .dsb-save, .dsb-cancel, .dsb-autolink, .dsb-queue-save, .dsb-queue-cancel { min-height: 40px; padding: 8px 16px; } .dsb-queue-box { top: auto; bottom: 8px; right: 8px; left: 8px; width: auto; } } /* ── Dark mode ─────────────────────────────────────────────────────── Same warm dark palette and same explicit-signal-only rule as the form's stylesheet: no bare prefers-color-scheme fallback, since legacy Vector sets no theme class and would go dark on its own. */ html.skin-theme-clientpref-night .dsb-save, html.skin-nightmode .dsb-save, html.skin-theme-clientpref-night .dsb-queue-save, html.skin-nightmode .dsb-queue-save { color: #14213a; } @media screen and (prefers-color-scheme: dark) { html.skin-theme-clientpref-os .dsb-save, html.skin-theme-clientpref-os .dsb-queue-save { color: #14213a; } } /* Rules the menu's three sections apart (see MENU_GROUPS). */ .dsb-more-menu .dsb-menu-group-start { margin-top: 7px; padding-top: 7px; border-top: 1px solid var(--wikt-rule-soft); } /* Deleting a sense is destructive, so it reads in the danger colour -- but it shares the last section with "Maneyeke din zêde bike" (both act on the sense itself), so it carries no rule of its own. */ .dsb-more-menu .dsb-field-delete { color: var(--wikt-danger); } .dsb-more-menu .dsb-field-delete:hover, .dsb-more-menu .dsb-field-delete:focus { color: var(--wikt-danger); text-decoration: underline; } /* A sense queued for deletion, struck through until the queue is saved or the change dropped. */ li.dsb-sense-doomed { text-decoration: line-through; text-decoration-color: var(--wikt-danger); } li.dsb-sense-doomed .dsb-quick-row { text-decoration: none; } /* Queue confirmation for row actions that have no field box of their own. */ .dsb-quick-note { display: block; margin-top: 6px; } /* Dropped by anything that cannot live in a 520px column: a long etymology, and a word list wide enough to have gone to two columns. */ .dsb-subsection-panel.dsb-panel-wide { max-width: none; } /* Word-list groups: one "{{kol3}}" per block, told apart only when there is more than one. */ .dsb-wordgroups-many .dsb-wordgroup { padding-top: 10px; border-top: 1px solid var(--wikt-rule-soft); } .dsb-wordgroups-many .dsb-wordgroup:first-child { padding-top: 0; border-top: 0; } .dsb-group-remove { color: var(--wikt-danger); } /* A sernav-headed group inside an unsaved-section preview. */ .dsb-preview-subheading { margin-top: 6px; font-weight: 600; } /* ── Werger box form ── The {{werger-ser}} parameters. Reuses .dsb-input / .dsb-adv-label from the other panels; only the note and the disclosure body need anything of their own. */ .dsb-werger-note { margin: 0 0 10px; color: var(--wikt-muted); font-size: 12px; line-height: 1.5; } .dsb-werger-main { display: flex; flex-direction: column; gap: 10px; } /* The box is nested inside its label, so it is made a block to sit under the label text instead of beside it -- inline, a short label like "id" ends up behind its own box. */ .dsb-werger-row .dsb-adv-label { display: block; margin-bottom: 0; } .dsb-werger-row .dsb-input { display: block; width: 100%; margin-top: 4px; } /* ── Îzaha maneyî ── Opens under the Mane box; the two are one gloss, so it sits tight against it. */ .dsb-izah-wrap { margin-top: 6px; } .dsb-izah-wrap .dsb-adv-label { display: block; } .dsb-izah-wrap .dsb-input { display: block; width: 100%; margin-top: 4px; } /* A sense redrawn from the change that is queued for it, or a whole new sense waiting in the list's own numbering. No badge and no frame: the point is that it reads the way it will read once saved. The tint is the only sign, and the queue box is what actually says nothing is published yet. */ .dsb-sense-preview { background: var(--wikt-accent-tint); box-shadow: -3px 0 0 var(--wikt-accent-edge); } /* Kept in the tree so another gadget's form still has somewhere to open, but out of sight while the preview above draws the same content. */ .dsb-preview-hidden { display: none !important; } li.dsb-sense-preview { display: list-item; padding-left: 4px; } /* </nowiki> */ p8dbwob7q5n7bkiq7k6vrcu3ejrxemk 6532616 6532599 2026-09-19T09:02:47Z Wikihez 7344 DefSideBoxes: hide the pending-changes box while a dialog is open 6532616 css text/css /* <nowiki> */ /* * Page: [[MediaWiki:Gadget-wikt.dsb-panels.css]] */ /* ── Searchable select ─────────────────────────────────────────────── The native <select> is hidden inside the wrapper and still holds the value; the input filters the list. */ .dsb-ac-wrap { position: relative; display: block; } .dsb-ac-input { width: 100%; box-sizing: border-box; } .dsb-ac-results { position: absolute; z-index: 30; top: 100%; left: 0; right: 0; max-height: 260px; margin: 2px 0 0; padding: 4px; overflow-y: auto; list-style: none; font-family: var(--wikt-sans); font-size: 13px; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12); } .dsb-ac-results li { padding: 6px 8px; border-radius: 6px; cursor: pointer; } .dsb-ac-results li:hover, .dsb-ac-results li.dsb-ac-active { background: var(--wikt-accent-tint); } /* ── Etîmolojî editing surface ─────────────────────────────────────── A contenteditable line of wikitext: text is typed straight into it, template calls sit in it as chips. */ .dsb-tpl-surface { min-height: 72px; margin-top: 6px; padding: 8px 10px; font-family: var(--wikt-sans); font-size: 14px; line-height: 1.6; color: var(--wikt-ink); white-space: pre-wrap; word-wrap: break-word; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); } .dsb-tpl-surface:focus { outline: none; border-color: var(--wikt-accent); box-shadow: 0 0 0 2px var(--wikt-accent-tint); } /* The chips: visibly not prose, and atomic to the caret. */ /* Takes the call off the line without going through the parameter dialog -- on a phone there is no reliable backspace onto a contenteditable="false" chip. */ .dsb-tpl-chip-remove { position: relative; margin-left: 5px; padding: 0 2px; font-family: var(--wikt-sans); font-size: 13px; line-height: 1; color: var(--wikt-accent-deep); opacity: 0.6; cursor: pointer; } .dsb-tpl-chip-remove:hover { color: var(--wikt-danger); opacity: 1; } /* The glyph stays small; the tap target grows invisibly around it. */ @media (max-width: 720px), (pointer: coarse) { .dsb-tpl-chip-remove { opacity: 1; } .dsb-tpl-chip-remove::after { content: ""; position: absolute; inset: -10px -8px; } } .dsb-tpl-chip { display: inline-block; margin: 0 1px; padding: 1px 6px; font-family: var(--wikt-mono); font-size: 12.5px; color: var(--wikt-accent-deep); max-width: 100%; white-space: normal; overflow-wrap: anywhere; vertical-align: baseline; background: var(--wikt-accent-tint); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); touch-action: manipulation; cursor: pointer; user-select: none; } .dsb-tpl-chip:hover, .dsb-tpl-chip:focus { background: var(--wikt-field-bg); border-color: var(--wikt-accent); outline: none; } /* ── Template parameter form ───────────────────────────────────────── .dsb-tpl-name/-desc/-param-row/-help/-undocumented/-modifier-list and the deprecated-label override now live in cite.css (wikt.cite's own stylesheet): buildTemplateParamForm() moved there so start.js's own Etîmolojî/Çavkanî pickers can open the same dialog. */ /* One-line variant: label beside its box rather than above it, for a single field whose name would otherwise read as a heading for everything below it (the word groups' "Sernav"). */ .dsb-param-row-inline > .dsb-adv-label { display: flex; gap: 8px; align-items: center; } /* Sernav is optional and names the group; the word boxes under it are what the form is actually for. Letting it stretch to the full row made the one thing you may leave blank the widest box on the card, so it takes only the space its own content needs. */ .dsb-param-row-inline .dsb-input { flex: 0 1 auto; width: 12em; max-width: 40%; /* .dsb-input's own 16em floor would win over the width above and make this the widest box on the card, which is the opposite of the point. */ min-width: 0; max-width: 100%; min-width: 0; } .dsb-gloss-raw { font-size: 12px; } /* Disclosure arrow on "Hevmane û Bêhtir", flipped when the menu is open. */ .dsb-more-arrow { font-size: 10px; vertical-align: 1px; } /* The POS panel's follow-up questions (cinsiyet / lektur): label above its select, like the field boxes. */ .dsb-pos-param-row { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; } /* ── "Guhartina pêşketî" (advanced editing) panel ────────────────────── Revealed by the pencil toggle above: every per-sense action this gadget offers, queued together with one "Lê zêde bike". A plain inline row, not a bordered/background card. */ .dsb-quick-row { display: flex; flex-direction: column; align-items: stretch; gap: 4px; box-sizing: border-box; max-width: 520px; margin: 4px 0 0 16px; font-family: var(--wikt-sans); font-size: 12px; color: var(--wikt-ink-2); } .dsb-quick-link { align-self: flex-start; margin-bottom: 10px; font-size: 12px; color: var(--wikt-accent); text-decoration: none; white-space: nowrap; cursor: pointer; } /* The links under a word list ("+ Komek lê zêde bike", "Wekî wîkîtext biguhêre") sit in the field wrap rather than in a flex column, so they need their own spacing or they run together. */ .dsb-subsection-field > .dsb-quick-link { display: inline-block; margin-right: 14px; } .dsb-quick-link:hover, .dsb-quick-link:focus { color: var(--wikt-accent-deep); text-decoration: underline; } /* The picker row: gloss + the two primary word groups as direct "+ <field>" links, plus a "Hevmane û Bêhtir" toggle for the rest -- clicking a link opens its box above the buttons and hides the link; .dsb-box-remove un-hides it. position: relative anchors .dsb-more-menu's overlay below (see there). */ .dsb-field-picker { position: relative; display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; } .dsb-field-picker .dsb-quick-link { margin-bottom: 0; } /* Under the buttons once a box is open: a little space so the links do not read as part of the buttons. */ .dsb-open-boxes:not(:empty) ~ .dsb-field-picker { margin-top: 8px; } /* The "Hevmane û Bêhtir" dropdown: every non-primary field link (plus Nimûne/jêgirtin, which sits first) stacked as a plain vertical list. Floats over the page as an overlay (positioned against .dsb-field-picker) instead of pushing $openBoxes/the rest of the definition down when it opens. */ .dsb-more-menu { position: absolute; top: 100%; left: 0; z-index: 10; display: flex; flex-direction: column; align-items: flex-start; width: max-content; max-width: min(320px, calc(100vw - 40px)); gap: 6px; margin: 2px 0 0 4px; padding: 8px 12px; background: var(--wikt-card); border: 1px solid var(--wikt-rule); border-radius: var(--wikt-r-field); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06); } .dsb-more-menu .dsb-quick-link { margin-bottom: 0; } /* Boxes the user has actually opened, stacked in the order they were added -- several can be open at once. */ .dsb-open-boxes { display: flex; flex-direction: column; } /* Nothing open: take it out of the flow so the links do not sit above an empty gap. */ .dsb-open-boxes:empty { display: none; } /* One field (its label + input) within the panel -- always a currently-open, removable box. */ .dsb-adv-group { position: relative; margin-bottom: 14px; padding-right: 20px; } .dsb-adv-label { margin-bottom: 4px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } /* The example sentence beside a word list's name: same text the wizard shows, so it reads as the quieter half of the label rather than a second heading. */ .dsb-adv-hint { margin-left: 6px; font-weight: 400; font-style: italic; color: var(--wikt-muted); } /* The shared image rows (util.js's buildImageListField): one label + box per line, like the parameter rows above them. Three identical boxes twice over is unreadable without a break between them, so each image is its own block with its own name. */ .dsb-resim-list { margin: 0; padding-left: 0; } .dsb-resim-item { list-style: none; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--wikt-rule-soft); } .dsb-resim-item:first-child { margin-top: 0; padding-top: 0; border-top: 0; } .dsb-resim-index { margin-bottom: 6px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } .dsb-box-remove { position: absolute; top: 0; right: 0; color: var(--wikt-ink-3); text-decoration: none; font-size: 14px; line-height: 1; cursor: pointer; } .dsb-box-remove:hover, .dsb-box-remove:focus { color: var(--wikt-accent-deep); } .dsb-form-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .dsb-input { box-sizing: border-box; min-width: 16em; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } /* The native corner is replaced by util.js's grip (see wikt-edit.css), which drags vertically only and remembers the height. */ .dsb-subsection-panel textarea.dsb-input, .dsb-adv-group textarea.dsb-input { resize: none; } .dsb-input::placeholder { color: var(--wikt-placeholder); opacity: 1; } .dsb-input:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } /* ── Plain tag field (Etîket, Kategorî) ──────────────────────────────── Plain type-and-commit tags with no suggestion panel; unlike Hevmane/Dijmane/etc., these carry no modifiers. */ .dsb-tagfield { box-sizing: border-box; display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 16em; padding: 4px 6px; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } .dsb-tagfield:focus-within { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); } .dsb-tag { display: inline-flex; align-items: center; gap: 6px; background: var(--wikt-accent-tint); color: var(--wikt-accent-deep); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); font-size: 12px; padding: 3px 6px 3px 10px; } .dsb-tag-remove { border: 0; background: transparent; color: var(--wikt-muted); font-size: 13px; line-height: 1; cursor: pointer; padding: 0 2px; } .dsb-tag-remove:hover { color: var(--wikt-danger); } .dsb-tagfield .dsb-input { flex: 1 1 8em; min-width: 8em; border: 0; padding: 3px 2px; background: transparent; box-shadow: none; } .dsb-tagfield .dsb-input:focus { box-shadow: none; } .dsb-save, .dsb-cancel, .dsb-delete, .dsb-autolink { font-family: var(--wikt-sans); font-size: 13px; font-weight: 500; padding: 6px 14px; border-radius: var(--wikt-r-pill); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } /* One filled pill per row — the same rule the form's footer follows. */ .dsb-save { background: var(--wikt-accent); border: 1px solid var(--wikt-accent); color: #fff; } .dsb-save:hover { background: var(--wikt-accent-deep); border-color: var(--wikt-accent-deep); } .dsb-save:disabled { opacity: 0.55; cursor: progress; } .dsb-cancel { background: transparent; border: 1px solid transparent; color: var(--wikt-ink-3); } .dsb-cancel:hover { border-color: var(--wikt-field-edge); color: var(--wikt-ink); } /* Removing a heading: plain like Betal bike, in the danger colour, pushed to the far end of the row. */ .dsb-delete { margin-left: auto; background: transparent; border: 1px solid transparent; color: var(--wikt-danger); } .dsb-delete:hover { border-color: var(--wikt-danger); } /* The heading's name, above the section's own box. */ .dsb-heading-name-wrap { margin-bottom: 10px; } /* A heading queued for removal, with everything it owns, until the queue is saved or the change dropped. */ .dsb-preview-removed { opacity: 0.5; text-decoration: line-through; text-decoration-color: var(--wikt-danger); } /* An outline pill, distinct from both the filled .dsb-save and the plain-text .dsb-cancel -- a secondary utility action, not the primary save nor a dismissal. */ .dsb-autolink { background: transparent; border: 1px solid var(--wikt-accent-edge); color: var(--wikt-accent); } .dsb-autolink:hover { border-color: var(--wikt-accent); color: var(--wikt-accent-deep); } .dsb-autolink:disabled { opacity: 0.55; cursor: progress; } /* Status line. Color comes from .dsb-status-ok/.dsb-status-error (added by the .js on success/failure) rather than an inline style, so these tokens (and dark mode) apply. */ .dsb-status { font-family: var(--wikt-sans); font-size: 12.5px; color: var(--wikt-muted); } .dsb-status-ok { color: var(--wikt-ok); } .dsb-status-error { color: var(--wikt-danger); } /* ── "+ Beşek lê zêde bike" ────────────────────────────────────────── An accent-coloured action link, like the form's .wiktku-adv-toggle: it opens something, so it is not muted grey. */ /* iOS Safari zooms the page in whenever a field it focuses has text under 16px, and everything here is 12-13px for density. On touch the form controls go up to the size that stops it; the pointer query leaves the desktop layout alone. */ @media (pointer: coarse) { .dsb-input, .dsb-tag-input, .dsb-subsection-select, .dsb-convert-pos-select { font-size: 16px; } /* Full width, whatever the viewport reports: a phone asked to render the desktop site says ~980px and would otherwise leave these at their desktop size. */ .dsb-subsection-panel .dsb-input, .dsb-subsection-panel .dsb-subsection-select, .dsb-convert-pos-panel .dsb-convert-pos-select { width: 100%; max-width: 100%; } /* Sernav is the exception: it names the group, so it stays visibly smaller than the boxes it heads. The cap matters more than the em width -- at 16px, 12em came out the same size as a word box. */ .dsb-subsection-panel .dsb-param-row-inline .dsb-input { width: 8em; max-width: 40%; } } /* The image rows reuse the inline row, but nothing here is optional the way a group's "Sernav" is: a file name and a caption want the whole row. */ .dsb-resim-list .dsb-param-row-inline > .dsb-adv-label, .dsb-resim-list .dsb-tpl-param-row > label { display: flex; gap: 8px; align-items: center; } .dsb-resim-list .dsb-param-row-inline .dsb-input, .dsb-resim-list .dsb-tpl-param-row .dsb-input { flex: 1 1 auto; width: auto; max-width: 100%; } /* ── Subsection panel ──────────────────────────────────────────────── A sunken card rather than a grey utility box; fields stack so the picker and its input are not competing for one narrow row. */ .dsb-subsection-select, .dsb-convert-pos-select { box-sizing: border-box; width: 100%; max-width: 100%; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); } .dsb-subsection-select:focus, .dsb-convert-pos-select:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } /* The template-insert picker sits above the Çavkanî textarea, not in place of it -- a little breathing room so the two don't read as one control. */ .dsb-cavkani-picker { margin-bottom: 6px; } .dsb-subsection-field { min-width: 0; } .dsb-subsection-words, .dsb-subsection-text { box-sizing: border-box; width: 100%; min-width: 0; } .dsb-subsection-text { line-height: 1.6; resize: vertical; } /* ── Gloss field inside the advanced-editing panel ──────────────────── Same shape as .dsb-subsection-text. */ .dsb-edit-gloss { width: 100%; line-height: 1.6; resize: vertical; } /* ── Live "not saved yet" previews ───────────────────────────────────── Dropped into the rendered page at the change's own spot. Dashed edge + a small badge mark them as pending, not real content; they disappear on "Betal bike" or once the real save lands. */ .dsb-preview-block, .dsb-preview-inline { margin: 8px 0; padding: 8px 12px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink-2); background: var(--wikt-accent-tint); border: 1px dashed var(--wikt-accent-edge); border-radius: var(--wikt-r-field); } .dsb-preview-inline { margin-left: 26px; max-width: 520px; } .dsb-preview-heading { margin: 0 0 4px; font-size: 15px; font-weight: 600; color: var(--wikt-ink); } .dsb-preview-badge { display: inline-block; margin-bottom: 6px; padding: 1px 8px; font-size: 11px; font-weight: 500; color: var(--wikt-accent-deep); background: var(--wikt-card); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); } /* Parser output goes in here, so it drops the panel's own font and colour and takes the page's \u2014 the point of the box is that what is inside it looks exactly like what will be saved. */ .dsb-preview-rendered, .dsb-preview-rendered-inline { font-family: inherit; font-size: 14px; color: var(--wikt-ink); } .dsb-preview-rendered-inline { display: inline; } .dsb-preview-rendered-inline .mw-parser-output, .dsb-preview-rendered-inline .mw-parser-output > p { display: inline; } .dsb-preview-list, .dsb-preview-text { margin: 0; padding-left: 18px; } .dsb-preview-text { padding-left: 0; } /* ── Floating save-queue widget ───────────────────────────────────── This gadget's own small floating box. One "Lê zêde bike" click anywhere on the page adds a line here; "Guhertinan qeyd bike" makes the one real save; "Betal bike" drops everything queued without touching the page. */ .dsb-queue-box { position: fixed; top: 60px; right: 16px; z-index: 1000; box-sizing: border-box; width: 280px; max-width: calc(100vw - 32px); max-height: calc(100vh - 90px); overflow-y: auto; padding: 12px 14px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink-2); background: var(--wikt-card); border: 1px solid var(--wikt-accent); border-radius: var(--wikt-r-card); box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16); } /* An OOUI dialog sits low in the page's stacking order (z-index 4), so no z-index here can go under it without dropping behind the article as well. While one is open -- on a phone it fills the screen -- the box is taken off instead; wikt.cite puts the class on while its dialogs are showing. */ body.wikt-dialog-open .dsb-queue-box { display: none; } .dsb-queue-title { margin-right: 20px; font-size: 13px; font-weight: 600; color: var(--wikt-ink); } .dsb-queue-close { float: right; color: var(--wikt-ink-3); text-decoration: none; font-size: 14px; line-height: 1; cursor: pointer; } .dsb-queue-close:hover, .dsb-queue-close:focus { color: var(--wikt-accent-deep); } /* Stands in for the list before anything is queued, saying what the save button is for. */ .dsb-queue-empty { margin: 8px 0; font-size: 12px; line-height: 1.5; color: var(--wikt-ink-3); } .dsb-queue-list { margin: 8px 0; padding-left: 18px; max-height: 160px; overflow-y: auto; } .dsb-queue-list li { margin-bottom: 4px; } /* Drops one queued change. Dim until its line is hovered, so the list stays a list and not a row of buttons. */ .dsb-queue-drop { margin-left: 6px; padding: 0 3px; border: 0; background: transparent; color: var(--wikt-muted); font-size: 13px; line-height: 1; cursor: pointer; opacity: 0; transition: opacity 0.12s ease, color 0.12s ease; } .dsb-queue-list li:hover .dsb-queue-drop, .dsb-queue-drop:focus { opacity: 1; } .dsb-queue-drop:hover { color: var(--wikt-danger); opacity: 1; } /* No hover on touch, so the button is simply there. */ @media (hover: none), (pointer: coarse) { .dsb-queue-drop { opacity: 1; } } .dsb-queue-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; } .dsb-queue-save, .dsb-queue-cancel { font-family: var(--wikt-sans); font-size: 13px; font-weight: 500; padding: 6px 14px; border-radius: var(--wikt-r-pill); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } .dsb-queue-save { background: var(--wikt-accent); border: 1px solid var(--wikt-accent); color: #fff; } .dsb-queue-save:hover { background: var(--wikt-accent-deep); border-color: var(--wikt-accent-deep); } .dsb-queue-save:disabled { opacity: 0.55; cursor: progress; } .dsb-queue-cancel { background: transparent; border: 1px solid var(--wikt-field-edge); color: var(--wikt-ink-3); } .dsb-queue-cancel:hover { border-color: var(--wikt-ink-3); color: var(--wikt-ink); } .dsb-queue-status { margin-top: 6px; font-size: 12.5px; color: var(--wikt-muted); } .dsb-queue-status.dsb-status-ok { color: var(--wikt-ok); } .dsb-queue-status.dsb-status-error { color: var(--wikt-danger); } /* ── Minerva (mobile) ──────────────────────────────────────────────── Narrower viewport: keep the panel on screen and give every tap target the form's 44px minimum. */ @media (max-width: 720px), (pointer: coarse) { .dsb-quick-row { font-size: 13px; margin-left: 20px; } .dsb-input, .dsb-subsection-select, .dsb-convert-pos-select { min-height: 40px; /* >=16px stops iOS Safari zooming the page on focus. */ font-size: 16px; } .dsb-tagfield .dsb-input { min-height: 32px; } .dsb-tag-remove { padding: 0 6px; } .dsb-save, .dsb-cancel, .dsb-autolink, .dsb-queue-save, .dsb-queue-cancel { min-height: 40px; padding: 8px 16px; } .dsb-queue-box { top: auto; bottom: 8px; right: 8px; left: 8px; width: auto; } } /* ── Dark mode ─────────────────────────────────────────────────────── Same warm dark palette and same explicit-signal-only rule as the form's stylesheet: no bare prefers-color-scheme fallback, since legacy Vector sets no theme class and would go dark on its own. */ html.skin-theme-clientpref-night .dsb-save, html.skin-nightmode .dsb-save, html.skin-theme-clientpref-night .dsb-queue-save, html.skin-nightmode .dsb-queue-save { color: #14213a; } @media screen and (prefers-color-scheme: dark) { html.skin-theme-clientpref-os .dsb-save, html.skin-theme-clientpref-os .dsb-queue-save { color: #14213a; } } /* Rules the menu's three sections apart (see MENU_GROUPS). */ .dsb-more-menu .dsb-menu-group-start { margin-top: 7px; padding-top: 7px; border-top: 1px solid var(--wikt-rule-soft); } /* Deleting a sense is destructive, so it reads in the danger colour -- but it shares the last section with "Maneyeke din zêde bike" (both act on the sense itself), so it carries no rule of its own. */ .dsb-more-menu .dsb-field-delete { color: var(--wikt-danger); } .dsb-more-menu .dsb-field-delete:hover, .dsb-more-menu .dsb-field-delete:focus { color: var(--wikt-danger); text-decoration: underline; } /* A sense queued for deletion, struck through until the queue is saved or the change dropped. */ li.dsb-sense-doomed { text-decoration: line-through; text-decoration-color: var(--wikt-danger); } li.dsb-sense-doomed .dsb-quick-row { text-decoration: none; } /* Queue confirmation for row actions that have no field box of their own. */ .dsb-quick-note { display: block; margin-top: 6px; } /* Dropped by anything that cannot live in a 520px column: a long etymology, and a word list wide enough to have gone to two columns. */ .dsb-subsection-panel.dsb-panel-wide { max-width: none; } /* Word-list groups: one "{{kol3}}" per block, told apart only when there is more than one. */ .dsb-wordgroups-many .dsb-wordgroup { padding-top: 10px; border-top: 1px solid var(--wikt-rule-soft); } .dsb-wordgroups-many .dsb-wordgroup:first-child { padding-top: 0; border-top: 0; } .dsb-group-remove { color: var(--wikt-danger); } /* A sernav-headed group inside an unsaved-section preview. */ .dsb-preview-subheading { margin-top: 6px; font-weight: 600; } /* ── Werger box form ── The {{werger-ser}} parameters. Reuses .dsb-input / .dsb-adv-label from the other panels; only the note and the disclosure body need anything of their own. */ .dsb-werger-note { margin: 0 0 10px; color: var(--wikt-muted); font-size: 12px; line-height: 1.5; } .dsb-werger-main { display: flex; flex-direction: column; gap: 10px; } /* The box is nested inside its label, so it is made a block to sit under the label text instead of beside it -- inline, a short label like "id" ends up behind its own box. */ .dsb-werger-row .dsb-adv-label { display: block; margin-bottom: 0; } .dsb-werger-row .dsb-input { display: block; width: 100%; margin-top: 4px; } /* ── Îzaha maneyî ── Opens under the Mane box; the two are one gloss, so it sits tight against it. */ .dsb-izah-wrap { margin-top: 6px; } .dsb-izah-wrap .dsb-adv-label { display: block; } .dsb-izah-wrap .dsb-input { display: block; width: 100%; margin-top: 4px; } /* A sense redrawn from the change that is queued for it, or a whole new sense waiting in the list's own numbering. No badge and no frame: the point is that it reads the way it will read once saved. The tint is the only sign, and the queue box is what actually says nothing is published yet. */ .dsb-sense-preview { background: var(--wikt-accent-tint); box-shadow: -3px 0 0 var(--wikt-accent-edge); } /* Kept in the tree so another gadget's form still has somewhere to open, but out of sight while the preview above draws the same content. */ .dsb-preview-hidden { display: none !important; } li.dsb-sense-preview { display: list-item; padding-left: 4px; } /* </nowiki> */ g70qepztny4ega5cqy8kvkuiulpq7ou Bikarhêner:Wikihez/Gadget-test/cite.js 2 1358913 6532102 6531967 2026-09-18T20:34:39Z Wikihez 7344 Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json 6532102 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite.js]] * * Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates, * Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two * callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the * template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js. * * The only caller of window.wikt.citoid, which the citoid-helper gadget owns. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var wt = edit.wt; var langs = edit.langs; var escapeRegExp = util.escapeRegExp; var tdText = wt.tdText; var parseTemplateCalls = wt.parseTemplateCalls; var splitCallParams = wt.splitCallParams; var buildTemplateCall = wt.buildTemplateCall; var jederDefs = edit.data.jederDefs || {}; var etimon = require("./wikt.cite/etimon.js"); var api = new mw.Api(); // Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real // jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other. var CATEGORY_KEY = "__category__"; // Sentinel for "the example box holds a finished template; write it out untouched". var RAW_KEY = "__raw__"; // Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields. var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"]; // A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language // from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has // no "parameter 1 is the language" convention, so nothing is assumed positionally. var LANG_LABEL = "koda zimanî"; // Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most // Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out // full-width and multiline there too rather than as a generic one-line box. var SIZE_BY_KEY = {}; Object.keys(jederDefs).forEach(function (jederKey) { (jederDefs[jederKey].fields || []).forEach(function (field) { if (!SIZE_BY_KEY[field.key]) { SIZE_BY_KEY[field.key] = { span: field.span || 4, multiline: !!field.multiline, width: field.width || "" }; } }); }); // Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full // date and a bare year say the same thing twice. Both are offered because either may be all a source // gives, so the forms clear one when the other is filled rather than letting the citation break. var EXCLUSIVE_PAIRS = [["sal", "tarîx"]]; function exclusivePartner(key) { var found = null; EXCLUSIVE_PAIRS.forEach(function (pair) { if (pair[0] === key) { found = pair[1]; } else if (pair[1] === key) { found = pair[0]; } }); return found; } function fieldSize(key) { return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" }; } // ---- text helpers ------------------------------------------------------------------------------- // The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is // attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling -- // otherwise the name is simply never found in the quotation. function titlePattern(title) { var escaped = escapeRegExp(String(title || "")); return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped; } // Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are // written here, and reports whether the name ends up bold so a caller can say so. // // The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word // ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from // bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish // words like "me’şûq". function boldenPageTitle(text, title) { var source = String(text || ""); var escapedTitle = titlePattern(title); var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?"; var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig"); var titleAnywhere = new RegExp(escapedTitle, "i"); // Whatever already sits between ''' marks is copied through untouched, so a quotation somebody // bolded by hand -- or one an earlier run bolded -- never collects a second pair. var boldSpan = /'''[\s\S]*?'''/g; var out = ""; var last = 0; var alreadyBold = false; var span; while ((span = boldSpan.exec(source)) !== null) { out += source.slice(last, span.index).replace(titleRe, "'''$1'''"); if (titleAnywhere.test(span[0])) { alreadyBold = true; } out += span[0]; last = span.index + span[0].length; } out += source.slice(last).replace(titleRe, "'''$1'''"); return { text: out, bolded: out !== source || alreadyBold }; } // A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>... function nlToBr(text) { return String(text || "").replace(/\r\n|\r|\n/g, "<br>"); } // ...while a plain parameter value (an author, a title) just loses it. function nlToSpace(text) { return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " "); } // Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author // containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder // over wikitext would wrap the braces too. function boldQuoteParam(text, title) { var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text); if (!match) { return text; } var bolded = boldenPageTitle(match[2], title).text; return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length); } // "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of // the same TemplateData every citation picker already fetches -- so a search box built over these // options can also match on what a template documents itself as doing, not only its name. An // undescribed option, or a failed fetch, just keeps its plain label; never blocks on this. // A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching // add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's // label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry) // fires when a row is chosen; the input is then left holding the plain label, not "label → target", so // re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in // each visible row's own TemplateData description once it loads (batched, so scrolling through matches // costs a handful of requests, not one per row). function buildCategoryTemplateSearch(opts) { opts = opts || {}; var shell = util.buildSearchList({ placeholder: opts.placeholder || util.msg.searchTemplate }); var $input = shell.$input; var $results = shell.$results; var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading); var list = []; function decorate($text, target, wanted) { if (!wanted) { return; } edit.wt.fetchTemplateData(target).then(function (doc) { var desc = doc && edit.wt.tdText(doc.description); if (desc && $text.closest("body").length) { $text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc))); } }); } function showResults(query) { var q = $.trim(query || "").toLowerCase(); $results.empty(); var matched = q ? list.filter(function (entry) { return entry.label.toLowerCase().indexOf(q) !== -1; }) : list; if (!matched.length) { shell.close(); return; } var shown = matched.slice(0, 50); // Only what a search has narrowed to: an empty box is the whole category, and describing its // first fifty would ask the wiki about templates nobody has looked for. var describing = !!opts.describe && !!q; if (describing) { edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; })); } shown.forEach(function (entry) { var $li = $("<li class='wiktku-cat-tpl-row'></li>"); var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label); if (entry.label !== entry.target) { $text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target)); } decorate($text, entry.target, describing); var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>") .attr("title", util.msg.openTemplatePage) .attr("href", util.tplPageUrl(entry.target)); // stopPropagation only -- preventDefault would stop the link from actually navigating. $link.on("mousedown click", function (e) { e.stopPropagation(); }); $li.append($text, $link); shell.bindPick($li, function () { shell.close(); $input.val(entry.label); opts.onPick(entry); }); $results.append($li); }); shell.open(); } $input.on("input focus", function () { showResults($(this).val()); }); $input.on("blur", function () { setTimeout(shell.close, 200); // lets the pick handler fire first }); fetchCategoryTemplates().then(function (l) { list = l; $status.text(""); }, function () { $status.text(util.msg.templatesFailed); }); return { $element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status), $input: $input, $status: $status }; } // ---- Kategorî:Çavkanî ----------------------------------------------------------------------------- // The category's template members plus their redirects, each redirect its own searchable entry pointing // at the same canonical target, so a template is findable by any of its names. Cached for the session. var catTemplatesPromise = null; function fetchCategoryTemplates() { if (catTemplatesPromise) { return catTemplatesPromise; } catTemplatesPromise = api.get({ action: "query", generator: "categorymembers", gcmtitle: "Kategorî:Çavkanî", gcmnamespace: 10, gcmlimit: "max", prop: "redirects", rdnamespace: 10, rdlimit: "max", formatversion: 2 }).then(function (data) { var list = []; ((data.query && data.query.pages) || []).forEach(function (page) { var target = page.title.replace(/^[^:]+:/, ""); list.push({ label: target, target: target }); (page.redirects || []).forEach(function (redirect) { list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target }); }); }); list.sort(function (a, b) { return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage")); }); return list; }, function () { return []; }); return catTemplatesPromise; } // ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData ------------------- // Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip // to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same // TemplateData the same way. // OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on. var citeWindowManager = null; function templateDialogManager() { if (!citeWindowManager) { citeWindowManager = new OO.ui.WindowManager(); $(document.body).append(citeWindowManager.$element); } return citeWindowManager; } // Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or // null when the user cancels. // One at a time: a second open while one is loading or showing (a chip clicked again before its dialog // appeared) stacks a window the manager does not track, and that window's buttons do nothing. The // second call resolves null, as a cancel does. var templateDialogBusy = false; function openTemplateDialog(callWikitext) { var done = $.Deferred(); var call = parseTemplateCalls(callWikitext).calls[0]; if (!call || templateDialogBusy) { return done.resolve(null).promise(); } // {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words // and their own modifiers -- so it has a builder of its own, on the same contract as this dialog. if (etimon.isEtimonName(call.name)) { return etimon.openDialog(callWikitext); } templateDialogBusy = true; done.always(function () { templateDialogBusy = false; }); $.when( mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]), edit.wt.fetchTemplateData(call.name) ).then(function (_loaded, td) { var result = null; // The parent is captured rather than reached through TplDialog.super: "super" is a reserved word, // and OOjs has moved between .super and .parent for it over the years. var ParentDialog = OO.ui.ProcessDialog; function TplDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(TplDialog, ParentDialog); TplDialog.static.name = "citeTemplateDialog"; TplDialog.static.title = "{{" + call.name + "}}"; TplDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; TplDialog.prototype.initialize = function () { ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildTemplateParamForm(call, td); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; TplDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; TplDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; var manager = templateDialogManager(); var dialog = new TplDialog({ size: "medium" }); manager.addWindows([dialog]); var instance = manager.openWindow(dialog); instance.closed.then(function () { manager.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { manager.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } // TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links. function tdDescription(text) { var $out = $("<span></span>"); var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g; var last = 0; var m; while ((m = re.exec(text)) !== null) { if (m.index > last) { $out.append(document.createTextNode(text.slice(last, m.index))); } $out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1])); last = re.lastIndex; } if (last < text.length) { $out.append(document.createTextNode(text.slice(last))); } return $out; } // A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill // widget instead of a plain box. TemplateData has no field for this, hence the marker in the description. var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê"; function acceptsInlineModifiers(doc) { return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1; } // A language-code parameter, per its own label. function isLanguageParam(doc) { return /ziman/i.test(tdText(doc && doc.label)); } function buildTemplateParamForm(call, td) { var parsed = splitCallParams(call.params); var docParams = (td && td.params) || {}; var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams); parsed.used.forEach(function (k) { if (keys.indexOf(k) === -1) { keys.push(k); } }); var $element = $("<div class='dsb-tpl-form'></div>"); var readers = {}; // key -> () => the parameter's current text $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name)) .attr("target", "_blank").text("{{" + call.name + "}}") )); var desc = tdText(td && td.description); if (desc) { $element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc))); } keys.forEach(function (key) { var doc = docParams[key] || {}; var value = parsed.values[key] || ""; var $field; if (acceptsInlineModifiers(doc)) { // The same word row the sense lists use: plain text plus removable "<t:...>" pills. var row = util.makeModifierRow({ prefix: "dsb-", placeholder: tdText(doc.label) || key, modTitle: util.msg.addModifier, removeTitle: "Vê nirxê jê bibe", removeModTitle: util.msg.removeModifier }); row.setRaw(value); // A <ul> so the row's own "close other pickers" lookup has something to scope to. $field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li); readers[key] = row.getRaw; } else { var $input = $("<input type='text' class='dsb-input'>").val(value); if (isLanguageParam(doc)) { $input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…"); // Typing a language the short list does not have is the cue to fetch the rest. $input.on("input", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } }); } else { var suggested = doc.suggestedvalues || []; if (suggested.length) { var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key; var $list = $("<datalist></datalist>").attr("id", listId); suggested.forEach(function (v) { $list.append($("<option></option>").val(v)); }); $input.attr("list", listId); $element.append($list); } } $field = $input; readers[key] = function () { return $input.val(); }; } var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key); if (!docParams[key]) { $label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)")); } var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field); var help = tdText(doc.description); if (help) { $row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help))); } if (doc.deprecated) { $row.addClass("dsb-tpl-deprecated"); } $element.append($row); }); return { $element: $element, values: function () { var vals = {}; keys.forEach(function (k) { vals[k] = $.trim(readers[k]() || ""); }); return buildTemplateCall(call.name, vals, keys); } }; } // The documented parameters of one template (name without the "Şablon:" prefix), in its own // paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in // wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template. // // The key stands in for a missing label, because these become form fields and a field needs something // written on it. // A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî // templates -- every {{{name}}} its own source reads. function templateParams(name) { return edit.wt.templateDoc(name).then(function (td) { var params = ((td && td.params) || []).map(function (p) { return { key: p.key, label: p.label || p.key, required: p.required, deprecated: p.deprecated }; }); return params.length ? params : sourceParams(name); }); } var sourceParamsCache = {}; function sourceParams(name) { if (!sourceParamsCache[name]) { sourceParamsCache[name] = new mw.Api().get({ action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main", redirects: 1, formatversion: 2 }).then(function (data) { var page = data.query.pages[0]; var source = page.revisions ? page.revisions[0].slots.main.content : ""; var keys = []; var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g; var m; while ((m = re.exec(source)) !== null) { if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) { keys.push(m[1]); } } return keys.map(function (key) { return { key: key, label: key, required: false, deprecated: false }; }); }, function () { return []; }); } return sourceParamsCache[name]; } // alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked // of the wiki itself: the parameter lists baked into data-main.json carry no aliases. var aliasCache = {}; function templateAliases(name) { if (!aliasCache[name]) { aliasCache[name] = new mw.Api().get({ action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2 }).then(function (data) { var map = {}; $.each(data.pages || {}, function (_, page) { $.each(page.params || {}, function (key, p) { (p.aliases || []).forEach(function (alias) { map[alias] = key; }); }); }); return map; }, function () { return {}; }); } return aliasCache[name]; } // What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the // form already has boxes for and minus the language parameter, which is filled from the dropdown. // A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations // almost always need ({{Şablon|rûpel=12|jêgirtin=…}}). function fieldSpecs(name) { return templateParams(name).then(function (params) { var langParamKey = null; (params || []).forEach(function (p) { if ((p.label || "").trim().toLowerCase() === LANG_LABEL) { langParamKey = p.key; } }); var filtered = (params || []).filter(function (p) { return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey; }); var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }]; return { langParamKey: langParamKey, fields: list.map(function (p) { var size = fieldSize(p.key); return { key: p.key, label: p.label, required: p.required, span: size.span, width: size.width, multiline: size.multiline }; }) }; }); } // The same list for a jêder-* template, straight out of the shared table. function jederFieldSpecs(jederKey) { var def = jederDefs[jederKey]; return def ? (def.fields || []).slice() : []; } // ---- Citoid -------------------------------------------------------------------------------------- // Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024"). function today() { var d = new Date(); function pad(n) { return (n < 10 ? "0" : "") + n; } return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()); } // Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date // and the identifiers for the fields the forms have only just gained. Applied here rather than in // citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page. function enrichCitoidFields(fields, raw) { fields = fields || {}; if (fields.url && !fields["tarîxa-gihiştinê"]) { // Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that // rather than the clock -- they differ whenever the answer came from a cache. today() is only // the fallback for a result that carries no accessDate. var accessed = raw && (raw.accessDate || raw.accessdate); fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today(); } if (raw) { var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN; if (issn && !fields.issn) { fields.issn = issn; } var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI; if (doi && !fields.doi) { fields.doi = doi; } if (raw.volume && !fields.cild) { fields.cild = raw.volume; } } return fields; } // One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this // wrapper exists so neither caller has to know that, and so a missing gadget fails in one place. function fetchFromCitoid(query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) { return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise(); } return window.wikt.citoid.fetchJederFields(query).then(function (result) { result.fields = enrichCitoidFields(result.fields, result.raw); return result; }); } // Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the // same way -- used when the person had already chosen a template and we keep their choice. // The form's link box stands in for a jêder-* template's own url= when that is left empty. function withLinkAsUrl(jederKey, fields, link) { var def = jederDefs[jederKey]; var hasUrl = !!def && (def.fields || []).some(function (field) { return field.key === "url"; }); if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) { fields.url = link; } return fields; } function citoidFieldsFor(jederKey, raw, query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) { return {}; } return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw); } // ---- the "#*" line ------------------------------------------------------------------------------ // One finished citation line. Modes: // "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}} // "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}} // "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}} // "raw" a finished template, passed through with only the entry name bolded // opts: {mode, template, language, fields, langParamKey, quote, translation, transcription, // source, sourceURL, title, marker, keepTranslation, extra} function buildCitation(opts) { var marker = opts.marker || "#*"; var title = opts.title || mw.config.get("wgTitle"); var quote = boldenPageTitle(String(opts.quote || ""), title).text; if (opts.mode === "raw") { // Written as given: the point is to paste a citation built elsewhere and have it survive intact. // A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added // back below, so strip it rather than emitting "#* #* {{...}}". var pasted = String(opts.quote || "").replace(LIST_MARKER, ""); return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim(); } var isCategory = opts.mode === "category"; var isTemplate = isCategory || opts.mode === "jeder"; var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne"); var line = marker + " {{" + name; // jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only // gets one when its own TemplateData names it, under its own key -- never assumed positionally. if (!isCategory) { line += "|" + opts.language; } if (isTemplate) { var fields = opts.fields || {}; Object.keys(fields).forEach(function (key) { var value = nlToSpace(String(fields[key] || "").trim()); if (value) { line += "|" + key + "=" + value; } }); if (isCategory && opts.langParamKey) { line += "|" + opts.langParamKey + "=" + opts.language; } // "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote). if (isCategory && /^Ç:/.test(name)) { line += "|wekjêgirtin=1"; } } else { if (opts.source) { // A positional value containing "=" would be read as its own key=value pair, so name it. line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source; } if (opts.sourceURL) { line += "|url=" + opts.sourceURL; } } var isUsex = name === "nimûne"; var translation = nlToBr(String(opts.translation || "").trim()); // {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out // for Kurmancî unless the edited line already had one (keepTranslation). var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation); // {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value // containing "=" would be read as key=value, so then both are named: naming only the example would // slide the translation into slot 2. var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1)); line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote); if (writeTranslation) { // Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=". line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation; } var transcription = nlToBr(String(opts.transcription || "").trim()); if (transcription) { line += "|tr=" + transcription; } // Parameters the form has no box for, carried through from the line being edited. (opts.extra || []).forEach(function (param) { line += "|" + param; }); // A short example and its translation read best on one line, which {{nimûne}} does only when told. // Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them. if (isUsex && writeTranslation && !hasInlineParam(opts.extra) && shownLength(quote) + shownLength(translation) <= 100) { line += "|rêz=1"; } return line + "}}"; } // True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names. function hasInlineParam(params) { return (params || []).some(function (param) { return /^\s*(?:rêz|birêz|inline)\s*=/.test(param); }); } // How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count. function shownLength(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/'{2,}/g, "") .replace(/<[^>]*>/g, " ") .length; } // A leading "#*" / "#:" / "##*" ... list marker. var LIST_MARKER = /^\s*#+[*:]\s*/; // True when the text is a whole citation line copied from somewhere else: its own list marker followed // by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}}, // {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked // against a list, which could never cover every citation template on the wiki. // // Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the // dropdown would otherwise wrap it in a second {{nimûne}}. function looksLikeCitationLine(text) { var trimmed = String(text || ""); if (!LIST_MARKER.test(trimmed)) { return false; } return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{"; } // True when the example box holds nothing but one finished template call -- the cue to offer, or to // switch to, the "write it out as-is" mode. function looksLikeTemplate(text) { var trimmed = String(text || "").trim(); if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") { return false; } var parsed = edit.wt.parseTemplateCalls(trimmed); return parsed.calls.length === 1 && !parsed.otherContent; } // ---- reading a finished line back -------------------------------------------------------------- // [[Şablon:nimûne]] and every redirect to it. var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"]; var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"]; var USEX_TRANSCRIPTION = ["tr", "transliteration"]; // A quotation template's translation, under the name Modul:quote documents and its aliases. var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"]; // [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language. var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i; // The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens // with both), or null. function italicRun(text) { var t = $.trim(text || ""); var opening = /^'*/.exec(t)[0].length; var m = /^''([\s\S]+)''$/.exec(t); if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) { return null; } return m[1]; } // "''…'' (…)": an italic example with its explanation in brackets on the same line, as // {text, translation}, or null. One level of brackets inside the explanation is allowed. function italicWithGloss(text) { var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || "")); var italic = m && italicRun(m[1]); if (italic === null || !m) { return null; } var gloss = $.trim(m[2]); return { text: italic, translation: italicRun(gloss) || gloss }; } function brToNl(text) { return String(text || "").replace(/<br\s*\/?>/gi, "\n"); } /** * One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when * it is not an example: a word list, the "no example yet" placeholder, a plain note. * {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription, * source, sourceURL, fields, extra} * extra is every parameter the form has no box for, to be written back as it was. A "raw" block is * edited as written: text is the whole block, list markers included. */ function parseCitationLine(block) { var all = String(block || "").split("\n"); var k = 1; while (k < all.length && !/^#/.test(all[k])) { k++; } var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n")); var sub = all.slice(k); if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) { return null; } var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "", source: "", sourceURL: "", fields: {}, extra: [] }; var body = $.trim(head[2]); var parsed = edit.wt.parseTemplateCalls(body); var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null; var name = call ? edit.wt.canonicalTemplateKey(call.name) : ""; name = name.charAt(0).toLowerCase() + name.slice(1); var isUsex = USEX_NAMES.indexOf(name) !== -1; var def = call && jederDefs[name]; if (call && !sub.length && (isUsex || def || name === "jêder")) { var split = edit.wt.splitCallParams(call.params); var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : []; out.mode = isUsex ? "nimune" : def ? "jeder" : "source"; out.template = def ? name : ""; split.used.forEach(function (key, i) { var value = brToNl(split.values[key]); if (key === "1") { return; // the language, which the section already says } if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) { out.text = value; } else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) { out.translation = value; } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = value; } else if (def && fieldKeys.indexOf(key) !== -1) { out.fields[key] = split.values[key]; } else if (name === "jêder" && key === "2") { out.source = split.values[key]; } else if (name === "jêder" && key === "url") { out.sourceURL = split.values[key]; } else { // Named when it was positional, so it cannot shift into a slot the form now fills. out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i])); } }); return out; } // Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} -- // reads into the category mode: quote, translation and transcription in their boxes, every other // named parameter as a field. Which of those get a box is known once the template's parameters // are fetched (see applyAliases). if (call && !sub.length && out.marker === "*" && (/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) { var catSplit = edit.wt.splitCallParams(call.params); out.mode = "category"; out.template = $.trim(call.name); catSplit.used.forEach(function (key, i) { var value = catSplit.values[key]; if (key === "jêgirtin" || key === "jg") { out.text = brToNl(value); } else if (QUOTE_TRANSLATION.indexOf(key) !== -1) { out.translation = brToNl(value); } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = brToNl(value); } else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) { return; // buildCitation() writes it for every "Ç:" template } else if (/^\d+$/.test(key)) { out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i])); } else { out.fields[key] = value; } }); return out; } if (out.marker === ":") { // The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it. var italic = italicRun(body); var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null; if (italic !== null && (!sub.length || translationLine)) { out.mode = "nimune"; out.text = brToNl(italic); out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : ""; return out; } var withGloss = sub.length ? null : italicWithGloss(body); if (withGloss) { out.mode = "nimune"; out.text = brToNl(withGloss.text); out.translation = brToNl(withGloss.translation); return out; } if (!isUsex) { return null; } } out.text = all.join("\n"); return out; } /** * Settles which parameters of a read line get a box. aliases maps an alias to its documented name * (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r=" * for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was. */ function applyAliases(example, aliases, fieldKeys) { var pending = example.extra.slice(); Object.keys(example.fields).forEach(function (key) { if (fieldKeys.indexOf(key) === -1) { pending.push(key + "=" + example.fields[key]); delete example.fields[key]; } }); example.extra = []; pending.forEach(function (param) { var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param); var key = m ? (aliases[m[1]] || m[1]) : null; var value = m ? $.trim(m[2]) : ""; if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) { example.fields[key] = value; } else if (m && key === "jêgirtin" && !example.text) { example.text = brToNl(value); } else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) { example.translation = brToNl(value); } else { example.extra.push(param); } }); return example; } /** * newLine with its parameters in the order originalLine had them, so an edit's diff shows only what * changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from * templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own * order. A line that is not one template call on either side comes back as it was. */ function keepOrder(newLine, originalLine, aliases) { aliases = aliases || {}; var marker = /^#+[:*]\s*/.exec(newLine || ""); var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || ""); if (!marker || !oldBody) { return newLine; } var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length)); var old = edit.wt.parseTemplateCalls($.trim(oldBody[1])); if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) { return newLine; } function keyed(params) { var positional = 0; return params.map(function (raw) { var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw); var key = m ? m[1] : String(++positional); return { key: aliases[key] || key, raw: raw }; }); } var rest = keyed(fresh.calls[0].params); var ordered = []; keyed(old.calls[0].params).forEach(function (o) { for (var i = 0; i < rest.length; i++) { if (rest[i].key === o.key) { ordered.push(rest.splice(i, 1)[0]); return; } } }); return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) { return "|" + p.raw; }).join("") + "}}"; } // Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole. function braceEnd(lines, start) { var depth = 0; for (var i = start; i < lines.length; i++) { depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length; if (depth <= 0) { return i; } } return lines.length - 1; } // The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}: // example is parseCitationLine's reading, or null for a block that is not an example. function exampleBlocks(lines, defIndex) { var depth = /^#+/.exec(lines[defIndex])[0].length; var own = new RegExp("^#{" + depth + "}[:*]"); var deeper = new RegExp("^#{" + depth + "}[:*][:*]"); var blocks = []; var i = defIndex + 1; while (i < lines.length && own.test(lines[i])) { var start = i; var end = braceEnd(lines, i); while (end + 1 < lines.length && deeper.test(lines[end + 1])) { end = braceEnd(lines, end + 1); } var text = lines.slice(start, end + 1).join("\n"); blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) }); i = end + 1; } return blocks; } /** * Replaces the index-th example under a definition with code, or removes it when code is null. * original is the block as it read when the form opened. When the index no longer holds it (an earlier * queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched. */ function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) { var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var examples = exampleBlocks(lines, defIndex).filter(function (b) { return b.example; }); var block = examples[index] && examples[index].text === original ? examples[index] : null; if (!block) { var same = examples.filter(function (b) { return b.text === original; }); block = same.length === 1 ? same[0] : null; } if (!block) { throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne."); } var replacement = code === null ? [] : String(code).split("\n"); lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the // line's wikitext can be compared. function normalizeWords(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/\{\{[^{}]*\}\}/g, " ") .replace(/<[^>]*>/g, " ") .replace(/'{2,}/g, "") .toLowerCase() .replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, ""); } // True when the text a page draws for an example comes from this line. function exampleMatches(drawnText, example) { var source = example.text; if (example.mode === "raw") { var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source); source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, ""); } var drawn = normalizeWords(drawnText); var written = normalizeWords(source); if (!drawn || !written) { return false; } return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1; } module.exports = { CATEGORY_KEY: CATEGORY_KEY, RAW_KEY: RAW_KEY, COVERED_PARAMS: COVERED_PARAMS, LANG_LABEL: LANG_LABEL, jederDefs: jederDefs, fieldSize: fieldSize, exclusivePartner: exclusivePartner, boldenPageTitle: boldenPageTitle, nlToBr: nlToBr, nlToSpace: nlToSpace, fetchCategoryTemplates: fetchCategoryTemplates, buildCategoryTemplateSearch: buildCategoryTemplateSearch, openTemplateDialog: openTemplateDialog, buildTemplateParamForm: buildTemplateParamForm, templateParams: templateParams, fieldSpecs: fieldSpecs, jederFieldSpecs: jederFieldSpecs, fetchFromCitoid: fetchFromCitoid, citoidFieldsFor: citoidFieldsFor, withLinkAsUrl: withLinkAsUrl, today: today, buildCitation: buildCitation, looksLikeTemplate: looksLikeTemplate, looksLikeCitationLine: looksLikeCitationLine, USEX_NAMES: USEX_NAMES, EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER, parseCitationLine: parseCitationLine, applyAliases: applyAliases, keepOrder: keepOrder, templateAliases: templateAliases, exampleBlocks: exampleBlocks, replaceExample: replaceExample, exampleMatches: exampleMatches }; }()); // </nowiki> 559iftd4dpsbd51hzusaz9ydqn2oryu 6532612 6532102 2026-09-19T09:02:27Z Wikihez 7344 DefSideBoxes: hide the pending-changes box while a dialog is open 6532612 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite.js]] * * Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates, * Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two * callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the * template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js. * * The only caller of window.wikt.citoid, which the citoid-helper gadget owns. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var wt = edit.wt; var langs = edit.langs; var escapeRegExp = util.escapeRegExp; var tdText = wt.tdText; var parseTemplateCalls = wt.parseTemplateCalls; var splitCallParams = wt.splitCallParams; var buildTemplateCall = wt.buildTemplateCall; var jederDefs = edit.data.jederDefs || {}; var etimon = require("./wikt.cite/etimon.js"); var api = new mw.Api(); // Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real // jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other. var CATEGORY_KEY = "__category__"; // Sentinel for "the example box holds a finished template; write it out untouched". var RAW_KEY = "__raw__"; // Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields. var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"]; // A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language // from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has // no "parameter 1 is the language" convention, so nothing is assumed positionally. var LANG_LABEL = "koda zimanî"; // Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most // Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out // full-width and multiline there too rather than as a generic one-line box. var SIZE_BY_KEY = {}; Object.keys(jederDefs).forEach(function (jederKey) { (jederDefs[jederKey].fields || []).forEach(function (field) { if (!SIZE_BY_KEY[field.key]) { SIZE_BY_KEY[field.key] = { span: field.span || 4, multiline: !!field.multiline, width: field.width || "" }; } }); }); // Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full // date and a bare year say the same thing twice. Both are offered because either may be all a source // gives, so the forms clear one when the other is filled rather than letting the citation break. var EXCLUSIVE_PAIRS = [["sal", "tarîx"]]; function exclusivePartner(key) { var found = null; EXCLUSIVE_PAIRS.forEach(function (pair) { if (pair[0] === key) { found = pair[1]; } else if (pair[1] === key) { found = pair[0]; } }); return found; } function fieldSize(key) { return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" }; } // ---- text helpers ------------------------------------------------------------------------------- // The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is // attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling -- // otherwise the name is simply never found in the quotation. function titlePattern(title) { var escaped = escapeRegExp(String(title || "")); return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped; } // Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are // written here, and reports whether the name ends up bold so a caller can say so. // // The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word // ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from // bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish // words like "me’şûq". function boldenPageTitle(text, title) { var source = String(text || ""); var escapedTitle = titlePattern(title); var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?"; var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig"); var titleAnywhere = new RegExp(escapedTitle, "i"); // Whatever already sits between ''' marks is copied through untouched, so a quotation somebody // bolded by hand -- or one an earlier run bolded -- never collects a second pair. var boldSpan = /'''[\s\S]*?'''/g; var out = ""; var last = 0; var alreadyBold = false; var span; while ((span = boldSpan.exec(source)) !== null) { out += source.slice(last, span.index).replace(titleRe, "'''$1'''"); if (titleAnywhere.test(span[0])) { alreadyBold = true; } out += span[0]; last = span.index + span[0].length; } out += source.slice(last).replace(titleRe, "'''$1'''"); return { text: out, bolded: out !== source || alreadyBold }; } // A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>... function nlToBr(text) { return String(text || "").replace(/\r\n|\r|\n/g, "<br>"); } // ...while a plain parameter value (an author, a title) just loses it. function nlToSpace(text) { return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " "); } // Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author // containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder // over wikitext would wrap the braces too. function boldQuoteParam(text, title) { var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text); if (!match) { return text; } var bolded = boldenPageTitle(match[2], title).text; return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length); } // "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of // the same TemplateData every citation picker already fetches -- so a search box built over these // options can also match on what a template documents itself as doing, not only its name. An // undescribed option, or a failed fetch, just keeps its plain label; never blocks on this. // A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching // add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's // label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry) // fires when a row is chosen; the input is then left holding the plain label, not "label → target", so // re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in // each visible row's own TemplateData description once it loads (batched, so scrolling through matches // costs a handful of requests, not one per row). function buildCategoryTemplateSearch(opts) { opts = opts || {}; var shell = util.buildSearchList({ placeholder: opts.placeholder || util.msg.searchTemplate }); var $input = shell.$input; var $results = shell.$results; var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading); var list = []; function decorate($text, target, wanted) { if (!wanted) { return; } edit.wt.fetchTemplateData(target).then(function (doc) { var desc = doc && edit.wt.tdText(doc.description); if (desc && $text.closest("body").length) { $text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc))); } }); } function showResults(query) { var q = $.trim(query || "").toLowerCase(); $results.empty(); var matched = q ? list.filter(function (entry) { return entry.label.toLowerCase().indexOf(q) !== -1; }) : list; if (!matched.length) { shell.close(); return; } var shown = matched.slice(0, 50); // Only what a search has narrowed to: an empty box is the whole category, and describing its // first fifty would ask the wiki about templates nobody has looked for. var describing = !!opts.describe && !!q; if (describing) { edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; })); } shown.forEach(function (entry) { var $li = $("<li class='wiktku-cat-tpl-row'></li>"); var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label); if (entry.label !== entry.target) { $text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target)); } decorate($text, entry.target, describing); var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>") .attr("title", util.msg.openTemplatePage) .attr("href", util.tplPageUrl(entry.target)); // stopPropagation only -- preventDefault would stop the link from actually navigating. $link.on("mousedown click", function (e) { e.stopPropagation(); }); $li.append($text, $link); shell.bindPick($li, function () { shell.close(); $input.val(entry.label); opts.onPick(entry); }); $results.append($li); }); shell.open(); } $input.on("input focus", function () { showResults($(this).val()); }); $input.on("blur", function () { setTimeout(shell.close, 200); // lets the pick handler fire first }); fetchCategoryTemplates().then(function (l) { list = l; $status.text(""); }, function () { $status.text(util.msg.templatesFailed); }); return { $element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status), $input: $input, $status: $status }; } // ---- Kategorî:Çavkanî ----------------------------------------------------------------------------- // The category's template members plus their redirects, each redirect its own searchable entry pointing // at the same canonical target, so a template is findable by any of its names. Cached for the session. var catTemplatesPromise = null; function fetchCategoryTemplates() { if (catTemplatesPromise) { return catTemplatesPromise; } catTemplatesPromise = api.get({ action: "query", generator: "categorymembers", gcmtitle: "Kategorî:Çavkanî", gcmnamespace: 10, gcmlimit: "max", prop: "redirects", rdnamespace: 10, rdlimit: "max", formatversion: 2 }).then(function (data) { var list = []; ((data.query && data.query.pages) || []).forEach(function (page) { var target = page.title.replace(/^[^:]+:/, ""); list.push({ label: target, target: target }); (page.redirects || []).forEach(function (redirect) { list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target }); }); }); list.sort(function (a, b) { return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage")); }); return list; }, function () { return []; }); return catTemplatesPromise; } // ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData ------------------- // Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip // to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same // TemplateData the same way. // OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on. var citeWindowManager = null; function templateDialogManager() { if (!citeWindowManager) { citeWindowManager = new OO.ui.WindowManager(); $(document.body).append(citeWindowManager.$element); } return citeWindowManager; } // Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or // null when the user cancels. // One at a time: a second open while one is loading or showing (a chip clicked again before its dialog // appeared) stacks a window the manager does not track, and that window's buttons do nothing. The // second call resolves null, as a cancel does. var templateDialogBusy = false; function openTemplateDialog(callWikitext) { var done = $.Deferred(); var call = parseTemplateCalls(callWikitext).calls[0]; if (!call || templateDialogBusy) { return done.resolve(null).promise(); } // {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words // and their own modifiers -- so it has a builder of its own, on the same contract as this dialog. if (etimon.isEtimonName(call.name)) { return etimon.openDialog(callWikitext); } templateDialogBusy = true; done.always(function () { templateDialogBusy = false; }); $.when( mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]), edit.wt.fetchTemplateData(call.name) ).then(function (_loaded, td) { var result = null; // The parent is captured rather than reached through TplDialog.super: "super" is a reserved word, // and OOjs has moved between .super and .parent for it over the years. var ParentDialog = OO.ui.ProcessDialog; function TplDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(TplDialog, ParentDialog); TplDialog.static.name = "citeTemplateDialog"; TplDialog.static.title = "{{" + call.name + "}}"; TplDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; TplDialog.prototype.initialize = function () { ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildTemplateParamForm(call, td); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; TplDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; TplDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; // Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does // not sit over a dialog the page's stacking order puts underneath it. $(document.body).addClass("wikt-dialog-open"); done.always(function () { $(document.body).removeClass("wikt-dialog-open"); }); var manager = templateDialogManager(); var dialog = new TplDialog({ size: "medium" }); manager.addWindows([dialog]); var instance = manager.openWindow(dialog); instance.closed.then(function () { manager.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { manager.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } // TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links. function tdDescription(text) { var $out = $("<span></span>"); var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g; var last = 0; var m; while ((m = re.exec(text)) !== null) { if (m.index > last) { $out.append(document.createTextNode(text.slice(last, m.index))); } $out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1])); last = re.lastIndex; } if (last < text.length) { $out.append(document.createTextNode(text.slice(last))); } return $out; } // A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill // widget instead of a plain box. TemplateData has no field for this, hence the marker in the description. var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê"; function acceptsInlineModifiers(doc) { return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1; } // A language-code parameter, per its own label. function isLanguageParam(doc) { return /ziman/i.test(tdText(doc && doc.label)); } function buildTemplateParamForm(call, td) { var parsed = splitCallParams(call.params); var docParams = (td && td.params) || {}; var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams); parsed.used.forEach(function (k) { if (keys.indexOf(k) === -1) { keys.push(k); } }); var $element = $("<div class='dsb-tpl-form'></div>"); var readers = {}; // key -> () => the parameter's current text $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name)) .attr("target", "_blank").text("{{" + call.name + "}}") )); var desc = tdText(td && td.description); if (desc) { $element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc))); } keys.forEach(function (key) { var doc = docParams[key] || {}; var value = parsed.values[key] || ""; var $field; if (acceptsInlineModifiers(doc)) { // The same word row the sense lists use: plain text plus removable "<t:...>" pills. var row = util.makeModifierRow({ prefix: "dsb-", placeholder: tdText(doc.label) || key, modTitle: util.msg.addModifier, removeTitle: "Vê nirxê jê bibe", removeModTitle: util.msg.removeModifier }); row.setRaw(value); // A <ul> so the row's own "close other pickers" lookup has something to scope to. $field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li); readers[key] = row.getRaw; } else { var $input = $("<input type='text' class='dsb-input'>").val(value); if (isLanguageParam(doc)) { $input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…"); // Typing a language the short list does not have is the cue to fetch the rest. $input.on("input", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } }); } else { var suggested = doc.suggestedvalues || []; if (suggested.length) { var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key; var $list = $("<datalist></datalist>").attr("id", listId); suggested.forEach(function (v) { $list.append($("<option></option>").val(v)); }); $input.attr("list", listId); $element.append($list); } } $field = $input; readers[key] = function () { return $input.val(); }; } var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key); if (!docParams[key]) { $label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)")); } var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field); var help = tdText(doc.description); if (help) { $row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help))); } if (doc.deprecated) { $row.addClass("dsb-tpl-deprecated"); } $element.append($row); }); return { $element: $element, values: function () { var vals = {}; keys.forEach(function (k) { vals[k] = $.trim(readers[k]() || ""); }); return buildTemplateCall(call.name, vals, keys); } }; } // The documented parameters of one template (name without the "Şablon:" prefix), in its own // paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in // wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template. // // The key stands in for a missing label, because these become form fields and a field needs something // written on it. // A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî // templates -- every {{{name}}} its own source reads. function templateParams(name) { return edit.wt.templateDoc(name).then(function (td) { var params = ((td && td.params) || []).map(function (p) { return { key: p.key, label: p.label || p.key, required: p.required, deprecated: p.deprecated }; }); return params.length ? params : sourceParams(name); }); } var sourceParamsCache = {}; function sourceParams(name) { if (!sourceParamsCache[name]) { sourceParamsCache[name] = new mw.Api().get({ action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main", redirects: 1, formatversion: 2 }).then(function (data) { var page = data.query.pages[0]; var source = page.revisions ? page.revisions[0].slots.main.content : ""; var keys = []; var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g; var m; while ((m = re.exec(source)) !== null) { if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) { keys.push(m[1]); } } return keys.map(function (key) { return { key: key, label: key, required: false, deprecated: false }; }); }, function () { return []; }); } return sourceParamsCache[name]; } // alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked // of the wiki itself: the parameter lists baked into data-main.json carry no aliases. var aliasCache = {}; function templateAliases(name) { if (!aliasCache[name]) { aliasCache[name] = new mw.Api().get({ action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2 }).then(function (data) { var map = {}; $.each(data.pages || {}, function (_, page) { $.each(page.params || {}, function (key, p) { (p.aliases || []).forEach(function (alias) { map[alias] = key; }); }); }); return map; }, function () { return {}; }); } return aliasCache[name]; } // What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the // form already has boxes for and minus the language parameter, which is filled from the dropdown. // A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations // almost always need ({{Şablon|rûpel=12|jêgirtin=…}}). function fieldSpecs(name) { return templateParams(name).then(function (params) { var langParamKey = null; (params || []).forEach(function (p) { if ((p.label || "").trim().toLowerCase() === LANG_LABEL) { langParamKey = p.key; } }); var filtered = (params || []).filter(function (p) { return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey; }); var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }]; return { langParamKey: langParamKey, fields: list.map(function (p) { var size = fieldSize(p.key); return { key: p.key, label: p.label, required: p.required, span: size.span, width: size.width, multiline: size.multiline }; }) }; }); } // The same list for a jêder-* template, straight out of the shared table. function jederFieldSpecs(jederKey) { var def = jederDefs[jederKey]; return def ? (def.fields || []).slice() : []; } // ---- Citoid -------------------------------------------------------------------------------------- // Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024"). function today() { var d = new Date(); function pad(n) { return (n < 10 ? "0" : "") + n; } return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()); } // Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date // and the identifiers for the fields the forms have only just gained. Applied here rather than in // citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page. function enrichCitoidFields(fields, raw) { fields = fields || {}; if (fields.url && !fields["tarîxa-gihiştinê"]) { // Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that // rather than the clock -- they differ whenever the answer came from a cache. today() is only // the fallback for a result that carries no accessDate. var accessed = raw && (raw.accessDate || raw.accessdate); fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today(); } if (raw) { var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN; if (issn && !fields.issn) { fields.issn = issn; } var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI; if (doi && !fields.doi) { fields.doi = doi; } if (raw.volume && !fields.cild) { fields.cild = raw.volume; } } return fields; } // One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this // wrapper exists so neither caller has to know that, and so a missing gadget fails in one place. function fetchFromCitoid(query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) { return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise(); } return window.wikt.citoid.fetchJederFields(query).then(function (result) { result.fields = enrichCitoidFields(result.fields, result.raw); return result; }); } // Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the // same way -- used when the person had already chosen a template and we keep their choice. // The form's link box stands in for a jêder-* template's own url= when that is left empty. function withLinkAsUrl(jederKey, fields, link) { var def = jederDefs[jederKey]; var hasUrl = !!def && (def.fields || []).some(function (field) { return field.key === "url"; }); if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) { fields.url = link; } return fields; } function citoidFieldsFor(jederKey, raw, query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) { return {}; } return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw); } // ---- the "#*" line ------------------------------------------------------------------------------ // One finished citation line. Modes: // "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}} // "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}} // "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}} // "raw" a finished template, passed through with only the entry name bolded // opts: {mode, template, language, fields, langParamKey, quote, translation, transcription, // source, sourceURL, title, marker, keepTranslation, extra} function buildCitation(opts) { var marker = opts.marker || "#*"; var title = opts.title || mw.config.get("wgTitle"); var quote = boldenPageTitle(String(opts.quote || ""), title).text; if (opts.mode === "raw") { // Written as given: the point is to paste a citation built elsewhere and have it survive intact. // A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added // back below, so strip it rather than emitting "#* #* {{...}}". var pasted = String(opts.quote || "").replace(LIST_MARKER, ""); return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim(); } var isCategory = opts.mode === "category"; var isTemplate = isCategory || opts.mode === "jeder"; var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne"); var line = marker + " {{" + name; // jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only // gets one when its own TemplateData names it, under its own key -- never assumed positionally. if (!isCategory) { line += "|" + opts.language; } if (isTemplate) { var fields = opts.fields || {}; Object.keys(fields).forEach(function (key) { var value = nlToSpace(String(fields[key] || "").trim()); if (value) { line += "|" + key + "=" + value; } }); if (isCategory && opts.langParamKey) { line += "|" + opts.langParamKey + "=" + opts.language; } // "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote). if (isCategory && /^Ç:/.test(name)) { line += "|wekjêgirtin=1"; } } else { if (opts.source) { // A positional value containing "=" would be read as its own key=value pair, so name it. line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source; } if (opts.sourceURL) { line += "|url=" + opts.sourceURL; } } var isUsex = name === "nimûne"; var translation = nlToBr(String(opts.translation || "").trim()); // {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out // for Kurmancî unless the edited line already had one (keepTranslation). var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation); // {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value // containing "=" would be read as key=value, so then both are named: naming only the example would // slide the translation into slot 2. var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1)); line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote); if (writeTranslation) { // Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=". line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation; } var transcription = nlToBr(String(opts.transcription || "").trim()); if (transcription) { line += "|tr=" + transcription; } // Parameters the form has no box for, carried through from the line being edited. (opts.extra || []).forEach(function (param) { line += "|" + param; }); // A short example and its translation read best on one line, which {{nimûne}} does only when told. // Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them. if (isUsex && writeTranslation && !hasInlineParam(opts.extra) && shownLength(quote) + shownLength(translation) <= 100) { line += "|rêz=1"; } return line + "}}"; } // True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names. function hasInlineParam(params) { return (params || []).some(function (param) { return /^\s*(?:rêz|birêz|inline)\s*=/.test(param); }); } // How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count. function shownLength(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/'{2,}/g, "") .replace(/<[^>]*>/g, " ") .length; } // A leading "#*" / "#:" / "##*" ... list marker. var LIST_MARKER = /^\s*#+[*:]\s*/; // True when the text is a whole citation line copied from somewhere else: its own list marker followed // by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}}, // {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked // against a list, which could never cover every citation template on the wiki. // // Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the // dropdown would otherwise wrap it in a second {{nimûne}}. function looksLikeCitationLine(text) { var trimmed = String(text || ""); if (!LIST_MARKER.test(trimmed)) { return false; } return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{"; } // True when the example box holds nothing but one finished template call -- the cue to offer, or to // switch to, the "write it out as-is" mode. function looksLikeTemplate(text) { var trimmed = String(text || "").trim(); if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") { return false; } var parsed = edit.wt.parseTemplateCalls(trimmed); return parsed.calls.length === 1 && !parsed.otherContent; } // ---- reading a finished line back -------------------------------------------------------------- // [[Şablon:nimûne]] and every redirect to it. var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"]; var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"]; var USEX_TRANSCRIPTION = ["tr", "transliteration"]; // A quotation template's translation, under the name Modul:quote documents and its aliases. var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"]; // [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language. var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i; // The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens // with both), or null. function italicRun(text) { var t = $.trim(text || ""); var opening = /^'*/.exec(t)[0].length; var m = /^''([\s\S]+)''$/.exec(t); if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) { return null; } return m[1]; } // "''…'' (…)": an italic example with its explanation in brackets on the same line, as // {text, translation}, or null. One level of brackets inside the explanation is allowed. function italicWithGloss(text) { var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || "")); var italic = m && italicRun(m[1]); if (italic === null || !m) { return null; } var gloss = $.trim(m[2]); return { text: italic, translation: italicRun(gloss) || gloss }; } function brToNl(text) { return String(text || "").replace(/<br\s*\/?>/gi, "\n"); } /** * One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when * it is not an example: a word list, the "no example yet" placeholder, a plain note. * {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription, * source, sourceURL, fields, extra} * extra is every parameter the form has no box for, to be written back as it was. A "raw" block is * edited as written: text is the whole block, list markers included. */ function parseCitationLine(block) { var all = String(block || "").split("\n"); var k = 1; while (k < all.length && !/^#/.test(all[k])) { k++; } var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n")); var sub = all.slice(k); if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) { return null; } var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "", source: "", sourceURL: "", fields: {}, extra: [] }; var body = $.trim(head[2]); var parsed = edit.wt.parseTemplateCalls(body); var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null; var name = call ? edit.wt.canonicalTemplateKey(call.name) : ""; name = name.charAt(0).toLowerCase() + name.slice(1); var isUsex = USEX_NAMES.indexOf(name) !== -1; var def = call && jederDefs[name]; if (call && !sub.length && (isUsex || def || name === "jêder")) { var split = edit.wt.splitCallParams(call.params); var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : []; out.mode = isUsex ? "nimune" : def ? "jeder" : "source"; out.template = def ? name : ""; split.used.forEach(function (key, i) { var value = brToNl(split.values[key]); if (key === "1") { return; // the language, which the section already says } if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) { out.text = value; } else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) { out.translation = value; } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = value; } else if (def && fieldKeys.indexOf(key) !== -1) { out.fields[key] = split.values[key]; } else if (name === "jêder" && key === "2") { out.source = split.values[key]; } else if (name === "jêder" && key === "url") { out.sourceURL = split.values[key]; } else { // Named when it was positional, so it cannot shift into a slot the form now fills. out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i])); } }); return out; } // Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} -- // reads into the category mode: quote, translation and transcription in their boxes, every other // named parameter as a field. Which of those get a box is known once the template's parameters // are fetched (see applyAliases). if (call && !sub.length && out.marker === "*" && (/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) { var catSplit = edit.wt.splitCallParams(call.params); out.mode = "category"; out.template = $.trim(call.name); catSplit.used.forEach(function (key, i) { var value = catSplit.values[key]; if (key === "jêgirtin" || key === "jg") { out.text = brToNl(value); } else if (QUOTE_TRANSLATION.indexOf(key) !== -1) { out.translation = brToNl(value); } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = brToNl(value); } else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) { return; // buildCitation() writes it for every "Ç:" template } else if (/^\d+$/.test(key)) { out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i])); } else { out.fields[key] = value; } }); return out; } if (out.marker === ":") { // The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it. var italic = italicRun(body); var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null; if (italic !== null && (!sub.length || translationLine)) { out.mode = "nimune"; out.text = brToNl(italic); out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : ""; return out; } var withGloss = sub.length ? null : italicWithGloss(body); if (withGloss) { out.mode = "nimune"; out.text = brToNl(withGloss.text); out.translation = brToNl(withGloss.translation); return out; } if (!isUsex) { return null; } } out.text = all.join("\n"); return out; } /** * Settles which parameters of a read line get a box. aliases maps an alias to its documented name * (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r=" * for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was. */ function applyAliases(example, aliases, fieldKeys) { var pending = example.extra.slice(); Object.keys(example.fields).forEach(function (key) { if (fieldKeys.indexOf(key) === -1) { pending.push(key + "=" + example.fields[key]); delete example.fields[key]; } }); example.extra = []; pending.forEach(function (param) { var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param); var key = m ? (aliases[m[1]] || m[1]) : null; var value = m ? $.trim(m[2]) : ""; if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) { example.fields[key] = value; } else if (m && key === "jêgirtin" && !example.text) { example.text = brToNl(value); } else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) { example.translation = brToNl(value); } else { example.extra.push(param); } }); return example; } /** * newLine with its parameters in the order originalLine had them, so an edit's diff shows only what * changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from * templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own * order. A line that is not one template call on either side comes back as it was. */ function keepOrder(newLine, originalLine, aliases) { aliases = aliases || {}; var marker = /^#+[:*]\s*/.exec(newLine || ""); var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || ""); if (!marker || !oldBody) { return newLine; } var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length)); var old = edit.wt.parseTemplateCalls($.trim(oldBody[1])); if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) { return newLine; } function keyed(params) { var positional = 0; return params.map(function (raw) { var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw); var key = m ? m[1] : String(++positional); return { key: aliases[key] || key, raw: raw }; }); } var rest = keyed(fresh.calls[0].params); var ordered = []; keyed(old.calls[0].params).forEach(function (o) { for (var i = 0; i < rest.length; i++) { if (rest[i].key === o.key) { ordered.push(rest.splice(i, 1)[0]); return; } } }); return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) { return "|" + p.raw; }).join("") + "}}"; } // Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole. function braceEnd(lines, start) { var depth = 0; for (var i = start; i < lines.length; i++) { depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length; if (depth <= 0) { return i; } } return lines.length - 1; } // The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}: // example is parseCitationLine's reading, or null for a block that is not an example. function exampleBlocks(lines, defIndex) { var depth = /^#+/.exec(lines[defIndex])[0].length; var own = new RegExp("^#{" + depth + "}[:*]"); var deeper = new RegExp("^#{" + depth + "}[:*][:*]"); var blocks = []; var i = defIndex + 1; while (i < lines.length && own.test(lines[i])) { var start = i; var end = braceEnd(lines, i); while (end + 1 < lines.length && deeper.test(lines[end + 1])) { end = braceEnd(lines, end + 1); } var text = lines.slice(start, end + 1).join("\n"); blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) }); i = end + 1; } return blocks; } /** * Replaces the index-th example under a definition with code, or removes it when code is null. * original is the block as it read when the form opened. When the index no longer holds it (an earlier * queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched. */ function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) { var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var examples = exampleBlocks(lines, defIndex).filter(function (b) { return b.example; }); var block = examples[index] && examples[index].text === original ? examples[index] : null; if (!block) { var same = examples.filter(function (b) { return b.text === original; }); block = same.length === 1 ? same[0] : null; } if (!block) { throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne."); } var replacement = code === null ? [] : String(code).split("\n"); lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the // line's wikitext can be compared. function normalizeWords(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/\{\{[^{}]*\}\}/g, " ") .replace(/<[^>]*>/g, " ") .replace(/'{2,}/g, "") .toLowerCase() .replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, ""); } // True when the text a page draws for an example comes from this line. function exampleMatches(drawnText, example) { var source = example.text; if (example.mode === "raw") { var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source); source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, ""); } var drawn = normalizeWords(drawnText); var written = normalizeWords(source); if (!drawn || !written) { return false; } return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1; } module.exports = { CATEGORY_KEY: CATEGORY_KEY, RAW_KEY: RAW_KEY, COVERED_PARAMS: COVERED_PARAMS, LANG_LABEL: LANG_LABEL, jederDefs: jederDefs, fieldSize: fieldSize, exclusivePartner: exclusivePartner, boldenPageTitle: boldenPageTitle, nlToBr: nlToBr, nlToSpace: nlToSpace, fetchCategoryTemplates: fetchCategoryTemplates, buildCategoryTemplateSearch: buildCategoryTemplateSearch, openTemplateDialog: openTemplateDialog, buildTemplateParamForm: buildTemplateParamForm, templateParams: templateParams, fieldSpecs: fieldSpecs, jederFieldSpecs: jederFieldSpecs, fetchFromCitoid: fetchFromCitoid, citoidFieldsFor: citoidFieldsFor, withLinkAsUrl: withLinkAsUrl, today: today, buildCitation: buildCitation, looksLikeTemplate: looksLikeTemplate, looksLikeCitationLine: looksLikeCitationLine, USEX_NAMES: USEX_NAMES, EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER, parseCitationLine: parseCitationLine, applyAliases: applyAliases, keepOrder: keepOrder, templateAliases: templateAliases, exampleBlocks: exampleBlocks, replaceExample: replaceExample, exampleMatches: exampleMatches }; }()); // </nowiki> sgqg27epdxpguj1acadgcaeifuq88sl 6533049 6532612 2026-09-19T10:12:40Z Wikihez 7344 Etymology: guard the etimon.js require so a stale package definition cannot break the gadget 6533049 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite.js]] * * Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates, * Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two * callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the * template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js. * * The only caller of window.wikt.citoid, which the citoid-helper gadget owns. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var wt = edit.wt; var langs = edit.langs; var escapeRegExp = util.escapeRegExp; var tdText = wt.tdText; var parseTemplateCalls = wt.parseTemplateCalls; var splitCallParams = wt.splitCallParams; var buildTemplateCall = wt.buildTemplateCall; var jederDefs = edit.data.jederDefs || {}; // Guarded: between deploying this file and the Gadgets-definition line that adds etimon.js to the // package, a cached startup module would have this require throw and take the whole gadget with it. // Without the builder, an {{etîmon}} call falls through to the generic dialog below. var etimon = null; try { etimon = require("./wikt.cite/etimon.js"); } catch (e) { etimon = null; } var api = new mw.Api(); // Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real // jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other. var CATEGORY_KEY = "__category__"; // Sentinel for "the example box holds a finished template; write it out untouched". var RAW_KEY = "__raw__"; // Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields. var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"]; // A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language // from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has // no "parameter 1 is the language" convention, so nothing is assumed positionally. var LANG_LABEL = "koda zimanî"; // Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most // Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out // full-width and multiline there too rather than as a generic one-line box. var SIZE_BY_KEY = {}; Object.keys(jederDefs).forEach(function (jederKey) { (jederDefs[jederKey].fields || []).forEach(function (field) { if (!SIZE_BY_KEY[field.key]) { SIZE_BY_KEY[field.key] = { span: field.span || 4, multiline: !!field.multiline, width: field.width || "" }; } }); }); // Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full // date and a bare year say the same thing twice. Both are offered because either may be all a source // gives, so the forms clear one when the other is filled rather than letting the citation break. var EXCLUSIVE_PAIRS = [["sal", "tarîx"]]; function exclusivePartner(key) { var found = null; EXCLUSIVE_PAIRS.forEach(function (pair) { if (pair[0] === key) { found = pair[1]; } else if (pair[1] === key) { found = pair[0]; } }); return found; } function fieldSize(key) { return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" }; } // ---- text helpers ------------------------------------------------------------------------------- // The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is // attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling -- // otherwise the name is simply never found in the quotation. function titlePattern(title) { var escaped = escapeRegExp(String(title || "")); return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped; } // Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are // written here, and reports whether the name ends up bold so a caller can say so. // // The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word // ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from // bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish // words like "me’şûq". function boldenPageTitle(text, title) { var source = String(text || ""); var escapedTitle = titlePattern(title); var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?"; var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig"); var titleAnywhere = new RegExp(escapedTitle, "i"); // Whatever already sits between ''' marks is copied through untouched, so a quotation somebody // bolded by hand -- or one an earlier run bolded -- never collects a second pair. var boldSpan = /'''[\s\S]*?'''/g; var out = ""; var last = 0; var alreadyBold = false; var span; while ((span = boldSpan.exec(source)) !== null) { out += source.slice(last, span.index).replace(titleRe, "'''$1'''"); if (titleAnywhere.test(span[0])) { alreadyBold = true; } out += span[0]; last = span.index + span[0].length; } out += source.slice(last).replace(titleRe, "'''$1'''"); return { text: out, bolded: out !== source || alreadyBold }; } // A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>... function nlToBr(text) { return String(text || "").replace(/\r\n|\r|\n/g, "<br>"); } // ...while a plain parameter value (an author, a title) just loses it. function nlToSpace(text) { return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " "); } // Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author // containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder // over wikitext would wrap the braces too. function boldQuoteParam(text, title) { var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text); if (!match) { return text; } var bolded = boldenPageTitle(match[2], title).text; return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length); } // "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of // the same TemplateData every citation picker already fetches -- so a search box built over these // options can also match on what a template documents itself as doing, not only its name. An // undescribed option, or a failed fetch, just keeps its plain label; never blocks on this. // A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching // add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's // label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry) // fires when a row is chosen; the input is then left holding the plain label, not "label → target", so // re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in // each visible row's own TemplateData description once it loads (batched, so scrolling through matches // costs a handful of requests, not one per row). function buildCategoryTemplateSearch(opts) { opts = opts || {}; var shell = util.buildSearchList({ placeholder: opts.placeholder || util.msg.searchTemplate }); var $input = shell.$input; var $results = shell.$results; var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading); var list = []; function decorate($text, target, wanted) { if (!wanted) { return; } edit.wt.fetchTemplateData(target).then(function (doc) { var desc = doc && edit.wt.tdText(doc.description); if (desc && $text.closest("body").length) { $text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc))); } }); } function showResults(query) { var q = $.trim(query || "").toLowerCase(); $results.empty(); var matched = q ? list.filter(function (entry) { return entry.label.toLowerCase().indexOf(q) !== -1; }) : list; if (!matched.length) { shell.close(); return; } var shown = matched.slice(0, 50); // Only what a search has narrowed to: an empty box is the whole category, and describing its // first fifty would ask the wiki about templates nobody has looked for. var describing = !!opts.describe && !!q; if (describing) { edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; })); } shown.forEach(function (entry) { var $li = $("<li class='wiktku-cat-tpl-row'></li>"); var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label); if (entry.label !== entry.target) { $text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target)); } decorate($text, entry.target, describing); var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>") .attr("title", util.msg.openTemplatePage) .attr("href", util.tplPageUrl(entry.target)); // stopPropagation only -- preventDefault would stop the link from actually navigating. $link.on("mousedown click", function (e) { e.stopPropagation(); }); $li.append($text, $link); shell.bindPick($li, function () { shell.close(); $input.val(entry.label); opts.onPick(entry); }); $results.append($li); }); shell.open(); } $input.on("input focus", function () { showResults($(this).val()); }); $input.on("blur", function () { setTimeout(shell.close, 200); // lets the pick handler fire first }); fetchCategoryTemplates().then(function (l) { list = l; $status.text(""); }, function () { $status.text(util.msg.templatesFailed); }); return { $element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status), $input: $input, $status: $status }; } // ---- Kategorî:Çavkanî ----------------------------------------------------------------------------- // The category's template members plus their redirects, each redirect its own searchable entry pointing // at the same canonical target, so a template is findable by any of its names. Cached for the session. var catTemplatesPromise = null; function fetchCategoryTemplates() { if (catTemplatesPromise) { return catTemplatesPromise; } catTemplatesPromise = api.get({ action: "query", generator: "categorymembers", gcmtitle: "Kategorî:Çavkanî", gcmnamespace: 10, gcmlimit: "max", prop: "redirects", rdnamespace: 10, rdlimit: "max", formatversion: 2 }).then(function (data) { var list = []; ((data.query && data.query.pages) || []).forEach(function (page) { var target = page.title.replace(/^[^:]+:/, ""); list.push({ label: target, target: target }); (page.redirects || []).forEach(function (redirect) { list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target }); }); }); list.sort(function (a, b) { return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage")); }); return list; }, function () { return []; }); return catTemplatesPromise; } // ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData ------------------- // Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip // to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same // TemplateData the same way. // OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on. var citeWindowManager = null; function templateDialogManager() { if (!citeWindowManager) { citeWindowManager = new OO.ui.WindowManager(); $(document.body).append(citeWindowManager.$element); } return citeWindowManager; } // Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or // null when the user cancels. // One at a time: a second open while one is loading or showing (a chip clicked again before its dialog // appeared) stacks a window the manager does not track, and that window's buttons do nothing. The // second call resolves null, as a cancel does. var templateDialogBusy = false; function openTemplateDialog(callWikitext) { var done = $.Deferred(); var call = parseTemplateCalls(callWikitext).calls[0]; if (!call || templateDialogBusy) { return done.resolve(null).promise(); } // {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words // and their own modifiers -- so it has a builder of its own, on the same contract as this dialog. if (etimon && etimon.isEtimonName(call.name)) { return etimon.openDialog(callWikitext); } templateDialogBusy = true; done.always(function () { templateDialogBusy = false; }); $.when( mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]), edit.wt.fetchTemplateData(call.name) ).then(function (_loaded, td) { var result = null; // The parent is captured rather than reached through TplDialog.super: "super" is a reserved word, // and OOjs has moved between .super and .parent for it over the years. var ParentDialog = OO.ui.ProcessDialog; function TplDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(TplDialog, ParentDialog); TplDialog.static.name = "citeTemplateDialog"; TplDialog.static.title = "{{" + call.name + "}}"; TplDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; TplDialog.prototype.initialize = function () { ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildTemplateParamForm(call, td); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; TplDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; TplDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; // Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does // not sit over a dialog the page's stacking order puts underneath it. $(document.body).addClass("wikt-dialog-open"); done.always(function () { $(document.body).removeClass("wikt-dialog-open"); }); var manager = templateDialogManager(); var dialog = new TplDialog({ size: "medium" }); manager.addWindows([dialog]); var instance = manager.openWindow(dialog); instance.closed.then(function () { manager.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { manager.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } // TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links. function tdDescription(text) { var $out = $("<span></span>"); var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g; var last = 0; var m; while ((m = re.exec(text)) !== null) { if (m.index > last) { $out.append(document.createTextNode(text.slice(last, m.index))); } $out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1])); last = re.lastIndex; } if (last < text.length) { $out.append(document.createTextNode(text.slice(last))); } return $out; } // A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill // widget instead of a plain box. TemplateData has no field for this, hence the marker in the description. var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê"; function acceptsInlineModifiers(doc) { return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1; } // A language-code parameter, per its own label. function isLanguageParam(doc) { return /ziman/i.test(tdText(doc && doc.label)); } function buildTemplateParamForm(call, td) { var parsed = splitCallParams(call.params); var docParams = (td && td.params) || {}; var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams); parsed.used.forEach(function (k) { if (keys.indexOf(k) === -1) { keys.push(k); } }); var $element = $("<div class='dsb-tpl-form'></div>"); var readers = {}; // key -> () => the parameter's current text $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name)) .attr("target", "_blank").text("{{" + call.name + "}}") )); var desc = tdText(td && td.description); if (desc) { $element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc))); } keys.forEach(function (key) { var doc = docParams[key] || {}; var value = parsed.values[key] || ""; var $field; if (acceptsInlineModifiers(doc)) { // The same word row the sense lists use: plain text plus removable "<t:...>" pills. var row = util.makeModifierRow({ prefix: "dsb-", placeholder: tdText(doc.label) || key, modTitle: util.msg.addModifier, removeTitle: "Vê nirxê jê bibe", removeModTitle: util.msg.removeModifier }); row.setRaw(value); // A <ul> so the row's own "close other pickers" lookup has something to scope to. $field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li); readers[key] = row.getRaw; } else { var $input = $("<input type='text' class='dsb-input'>").val(value); if (isLanguageParam(doc)) { $input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…"); // Typing a language the short list does not have is the cue to fetch the rest. $input.on("input", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } }); } else { var suggested = doc.suggestedvalues || []; if (suggested.length) { var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key; var $list = $("<datalist></datalist>").attr("id", listId); suggested.forEach(function (v) { $list.append($("<option></option>").val(v)); }); $input.attr("list", listId); $element.append($list); } } $field = $input; readers[key] = function () { return $input.val(); }; } var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key); if (!docParams[key]) { $label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)")); } var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field); var help = tdText(doc.description); if (help) { $row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help))); } if (doc.deprecated) { $row.addClass("dsb-tpl-deprecated"); } $element.append($row); }); return { $element: $element, values: function () { var vals = {}; keys.forEach(function (k) { vals[k] = $.trim(readers[k]() || ""); }); return buildTemplateCall(call.name, vals, keys); } }; } // The documented parameters of one template (name without the "Şablon:" prefix), in its own // paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in // wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template. // // The key stands in for a missing label, because these become form fields and a field needs something // written on it. // A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî // templates -- every {{{name}}} its own source reads. function templateParams(name) { return edit.wt.templateDoc(name).then(function (td) { var params = ((td && td.params) || []).map(function (p) { return { key: p.key, label: p.label || p.key, required: p.required, deprecated: p.deprecated }; }); return params.length ? params : sourceParams(name); }); } var sourceParamsCache = {}; function sourceParams(name) { if (!sourceParamsCache[name]) { sourceParamsCache[name] = new mw.Api().get({ action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main", redirects: 1, formatversion: 2 }).then(function (data) { var page = data.query.pages[0]; var source = page.revisions ? page.revisions[0].slots.main.content : ""; var keys = []; var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g; var m; while ((m = re.exec(source)) !== null) { if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) { keys.push(m[1]); } } return keys.map(function (key) { return { key: key, label: key, required: false, deprecated: false }; }); }, function () { return []; }); } return sourceParamsCache[name]; } // alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked // of the wiki itself: the parameter lists baked into data-main.json carry no aliases. var aliasCache = {}; function templateAliases(name) { if (!aliasCache[name]) { aliasCache[name] = new mw.Api().get({ action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2 }).then(function (data) { var map = {}; $.each(data.pages || {}, function (_, page) { $.each(page.params || {}, function (key, p) { (p.aliases || []).forEach(function (alias) { map[alias] = key; }); }); }); return map; }, function () { return {}; }); } return aliasCache[name]; } // What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the // form already has boxes for and minus the language parameter, which is filled from the dropdown. // A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations // almost always need ({{Şablon|rûpel=12|jêgirtin=…}}). function fieldSpecs(name) { return templateParams(name).then(function (params) { var langParamKey = null; (params || []).forEach(function (p) { if ((p.label || "").trim().toLowerCase() === LANG_LABEL) { langParamKey = p.key; } }); var filtered = (params || []).filter(function (p) { return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey; }); var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }]; return { langParamKey: langParamKey, fields: list.map(function (p) { var size = fieldSize(p.key); return { key: p.key, label: p.label, required: p.required, span: size.span, width: size.width, multiline: size.multiline }; }) }; }); } // The same list for a jêder-* template, straight out of the shared table. function jederFieldSpecs(jederKey) { var def = jederDefs[jederKey]; return def ? (def.fields || []).slice() : []; } // ---- Citoid -------------------------------------------------------------------------------------- // Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024"). function today() { var d = new Date(); function pad(n) { return (n < 10 ? "0" : "") + n; } return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()); } // Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date // and the identifiers for the fields the forms have only just gained. Applied here rather than in // citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page. function enrichCitoidFields(fields, raw) { fields = fields || {}; if (fields.url && !fields["tarîxa-gihiştinê"]) { // Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that // rather than the clock -- they differ whenever the answer came from a cache. today() is only // the fallback for a result that carries no accessDate. var accessed = raw && (raw.accessDate || raw.accessdate); fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today(); } if (raw) { var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN; if (issn && !fields.issn) { fields.issn = issn; } var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI; if (doi && !fields.doi) { fields.doi = doi; } if (raw.volume && !fields.cild) { fields.cild = raw.volume; } } return fields; } // One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this // wrapper exists so neither caller has to know that, and so a missing gadget fails in one place. function fetchFromCitoid(query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) { return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise(); } return window.wikt.citoid.fetchJederFields(query).then(function (result) { result.fields = enrichCitoidFields(result.fields, result.raw); return result; }); } // Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the // same way -- used when the person had already chosen a template and we keep their choice. // The form's link box stands in for a jêder-* template's own url= when that is left empty. function withLinkAsUrl(jederKey, fields, link) { var def = jederDefs[jederKey]; var hasUrl = !!def && (def.fields || []).some(function (field) { return field.key === "url"; }); if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) { fields.url = link; } return fields; } function citoidFieldsFor(jederKey, raw, query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) { return {}; } return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw); } // ---- the "#*" line ------------------------------------------------------------------------------ // One finished citation line. Modes: // "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}} // "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}} // "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}} // "raw" a finished template, passed through with only the entry name bolded // opts: {mode, template, language, fields, langParamKey, quote, translation, transcription, // source, sourceURL, title, marker, keepTranslation, extra} function buildCitation(opts) { var marker = opts.marker || "#*"; var title = opts.title || mw.config.get("wgTitle"); var quote = boldenPageTitle(String(opts.quote || ""), title).text; if (opts.mode === "raw") { // Written as given: the point is to paste a citation built elsewhere and have it survive intact. // A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added // back below, so strip it rather than emitting "#* #* {{...}}". var pasted = String(opts.quote || "").replace(LIST_MARKER, ""); return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim(); } var isCategory = opts.mode === "category"; var isTemplate = isCategory || opts.mode === "jeder"; var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne"); var line = marker + " {{" + name; // jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only // gets one when its own TemplateData names it, under its own key -- never assumed positionally. if (!isCategory) { line += "|" + opts.language; } if (isTemplate) { var fields = opts.fields || {}; Object.keys(fields).forEach(function (key) { var value = nlToSpace(String(fields[key] || "").trim()); if (value) { line += "|" + key + "=" + value; } }); if (isCategory && opts.langParamKey) { line += "|" + opts.langParamKey + "=" + opts.language; } // "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote). if (isCategory && /^Ç:/.test(name)) { line += "|wekjêgirtin=1"; } } else { if (opts.source) { // A positional value containing "=" would be read as its own key=value pair, so name it. line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source; } if (opts.sourceURL) { line += "|url=" + opts.sourceURL; } } var isUsex = name === "nimûne"; var translation = nlToBr(String(opts.translation || "").trim()); // {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out // for Kurmancî unless the edited line already had one (keepTranslation). var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation); // {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value // containing "=" would be read as key=value, so then both are named: naming only the example would // slide the translation into slot 2. var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1)); line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote); if (writeTranslation) { // Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=". line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation; } var transcription = nlToBr(String(opts.transcription || "").trim()); if (transcription) { line += "|tr=" + transcription; } // Parameters the form has no box for, carried through from the line being edited. (opts.extra || []).forEach(function (param) { line += "|" + param; }); // A short example and its translation read best on one line, which {{nimûne}} does only when told. // Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them. if (isUsex && writeTranslation && !hasInlineParam(opts.extra) && shownLength(quote) + shownLength(translation) <= 100) { line += "|rêz=1"; } return line + "}}"; } // True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names. function hasInlineParam(params) { return (params || []).some(function (param) { return /^\s*(?:rêz|birêz|inline)\s*=/.test(param); }); } // How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count. function shownLength(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/'{2,}/g, "") .replace(/<[^>]*>/g, " ") .length; } // A leading "#*" / "#:" / "##*" ... list marker. var LIST_MARKER = /^\s*#+[*:]\s*/; // True when the text is a whole citation line copied from somewhere else: its own list marker followed // by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}}, // {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked // against a list, which could never cover every citation template on the wiki. // // Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the // dropdown would otherwise wrap it in a second {{nimûne}}. function looksLikeCitationLine(text) { var trimmed = String(text || ""); if (!LIST_MARKER.test(trimmed)) { return false; } return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{"; } // True when the example box holds nothing but one finished template call -- the cue to offer, or to // switch to, the "write it out as-is" mode. function looksLikeTemplate(text) { var trimmed = String(text || "").trim(); if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") { return false; } var parsed = edit.wt.parseTemplateCalls(trimmed); return parsed.calls.length === 1 && !parsed.otherContent; } // ---- reading a finished line back -------------------------------------------------------------- // [[Şablon:nimûne]] and every redirect to it. var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"]; var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"]; var USEX_TRANSCRIPTION = ["tr", "transliteration"]; // A quotation template's translation, under the name Modul:quote documents and its aliases. var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"]; // [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language. var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i; // The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens // with both), or null. function italicRun(text) { var t = $.trim(text || ""); var opening = /^'*/.exec(t)[0].length; var m = /^''([\s\S]+)''$/.exec(t); if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) { return null; } return m[1]; } // "''…'' (…)": an italic example with its explanation in brackets on the same line, as // {text, translation}, or null. One level of brackets inside the explanation is allowed. function italicWithGloss(text) { var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || "")); var italic = m && italicRun(m[1]); if (italic === null || !m) { return null; } var gloss = $.trim(m[2]); return { text: italic, translation: italicRun(gloss) || gloss }; } function brToNl(text) { return String(text || "").replace(/<br\s*\/?>/gi, "\n"); } /** * One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when * it is not an example: a word list, the "no example yet" placeholder, a plain note. * {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription, * source, sourceURL, fields, extra} * extra is every parameter the form has no box for, to be written back as it was. A "raw" block is * edited as written: text is the whole block, list markers included. */ function parseCitationLine(block) { var all = String(block || "").split("\n"); var k = 1; while (k < all.length && !/^#/.test(all[k])) { k++; } var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n")); var sub = all.slice(k); if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) { return null; } var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "", source: "", sourceURL: "", fields: {}, extra: [] }; var body = $.trim(head[2]); var parsed = edit.wt.parseTemplateCalls(body); var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null; var name = call ? edit.wt.canonicalTemplateKey(call.name) : ""; name = name.charAt(0).toLowerCase() + name.slice(1); var isUsex = USEX_NAMES.indexOf(name) !== -1; var def = call && jederDefs[name]; if (call && !sub.length && (isUsex || def || name === "jêder")) { var split = edit.wt.splitCallParams(call.params); var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : []; out.mode = isUsex ? "nimune" : def ? "jeder" : "source"; out.template = def ? name : ""; split.used.forEach(function (key, i) { var value = brToNl(split.values[key]); if (key === "1") { return; // the language, which the section already says } if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) { out.text = value; } else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) { out.translation = value; } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = value; } else if (def && fieldKeys.indexOf(key) !== -1) { out.fields[key] = split.values[key]; } else if (name === "jêder" && key === "2") { out.source = split.values[key]; } else if (name === "jêder" && key === "url") { out.sourceURL = split.values[key]; } else { // Named when it was positional, so it cannot shift into a slot the form now fills. out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i])); } }); return out; } // Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} -- // reads into the category mode: quote, translation and transcription in their boxes, every other // named parameter as a field. Which of those get a box is known once the template's parameters // are fetched (see applyAliases). if (call && !sub.length && out.marker === "*" && (/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) { var catSplit = edit.wt.splitCallParams(call.params); out.mode = "category"; out.template = $.trim(call.name); catSplit.used.forEach(function (key, i) { var value = catSplit.values[key]; if (key === "jêgirtin" || key === "jg") { out.text = brToNl(value); } else if (QUOTE_TRANSLATION.indexOf(key) !== -1) { out.translation = brToNl(value); } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = brToNl(value); } else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) { return; // buildCitation() writes it for every "Ç:" template } else if (/^\d+$/.test(key)) { out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i])); } else { out.fields[key] = value; } }); return out; } if (out.marker === ":") { // The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it. var italic = italicRun(body); var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null; if (italic !== null && (!sub.length || translationLine)) { out.mode = "nimune"; out.text = brToNl(italic); out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : ""; return out; } var withGloss = sub.length ? null : italicWithGloss(body); if (withGloss) { out.mode = "nimune"; out.text = brToNl(withGloss.text); out.translation = brToNl(withGloss.translation); return out; } if (!isUsex) { return null; } } out.text = all.join("\n"); return out; } /** * Settles which parameters of a read line get a box. aliases maps an alias to its documented name * (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r=" * for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was. */ function applyAliases(example, aliases, fieldKeys) { var pending = example.extra.slice(); Object.keys(example.fields).forEach(function (key) { if (fieldKeys.indexOf(key) === -1) { pending.push(key + "=" + example.fields[key]); delete example.fields[key]; } }); example.extra = []; pending.forEach(function (param) { var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param); var key = m ? (aliases[m[1]] || m[1]) : null; var value = m ? $.trim(m[2]) : ""; if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) { example.fields[key] = value; } else if (m && key === "jêgirtin" && !example.text) { example.text = brToNl(value); } else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) { example.translation = brToNl(value); } else { example.extra.push(param); } }); return example; } /** * newLine with its parameters in the order originalLine had them, so an edit's diff shows only what * changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from * templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own * order. A line that is not one template call on either side comes back as it was. */ function keepOrder(newLine, originalLine, aliases) { aliases = aliases || {}; var marker = /^#+[:*]\s*/.exec(newLine || ""); var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || ""); if (!marker || !oldBody) { return newLine; } var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length)); var old = edit.wt.parseTemplateCalls($.trim(oldBody[1])); if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) { return newLine; } function keyed(params) { var positional = 0; return params.map(function (raw) { var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw); var key = m ? m[1] : String(++positional); return { key: aliases[key] || key, raw: raw }; }); } var rest = keyed(fresh.calls[0].params); var ordered = []; keyed(old.calls[0].params).forEach(function (o) { for (var i = 0; i < rest.length; i++) { if (rest[i].key === o.key) { ordered.push(rest.splice(i, 1)[0]); return; } } }); return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) { return "|" + p.raw; }).join("") + "}}"; } // Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole. function braceEnd(lines, start) { var depth = 0; for (var i = start; i < lines.length; i++) { depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length; if (depth <= 0) { return i; } } return lines.length - 1; } // The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}: // example is parseCitationLine's reading, or null for a block that is not an example. function exampleBlocks(lines, defIndex) { var depth = /^#+/.exec(lines[defIndex])[0].length; var own = new RegExp("^#{" + depth + "}[:*]"); var deeper = new RegExp("^#{" + depth + "}[:*][:*]"); var blocks = []; var i = defIndex + 1; while (i < lines.length && own.test(lines[i])) { var start = i; var end = braceEnd(lines, i); while (end + 1 < lines.length && deeper.test(lines[end + 1])) { end = braceEnd(lines, end + 1); } var text = lines.slice(start, end + 1).join("\n"); blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) }); i = end + 1; } return blocks; } /** * Replaces the index-th example under a definition with code, or removes it when code is null. * original is the block as it read when the form opened. When the index no longer holds it (an earlier * queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched. */ function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) { var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var examples = exampleBlocks(lines, defIndex).filter(function (b) { return b.example; }); var block = examples[index] && examples[index].text === original ? examples[index] : null; if (!block) { var same = examples.filter(function (b) { return b.text === original; }); block = same.length === 1 ? same[0] : null; } if (!block) { throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne."); } var replacement = code === null ? [] : String(code).split("\n"); lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the // line's wikitext can be compared. function normalizeWords(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/\{\{[^{}]*\}\}/g, " ") .replace(/<[^>]*>/g, " ") .replace(/'{2,}/g, "") .toLowerCase() .replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, ""); } // True when the text a page draws for an example comes from this line. function exampleMatches(drawnText, example) { var source = example.text; if (example.mode === "raw") { var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source); source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, ""); } var drawn = normalizeWords(drawnText); var written = normalizeWords(source); if (!drawn || !written) { return false; } return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1; } module.exports = { CATEGORY_KEY: CATEGORY_KEY, RAW_KEY: RAW_KEY, COVERED_PARAMS: COVERED_PARAMS, LANG_LABEL: LANG_LABEL, jederDefs: jederDefs, fieldSize: fieldSize, exclusivePartner: exclusivePartner, boldenPageTitle: boldenPageTitle, nlToBr: nlToBr, nlToSpace: nlToSpace, fetchCategoryTemplates: fetchCategoryTemplates, buildCategoryTemplateSearch: buildCategoryTemplateSearch, openTemplateDialog: openTemplateDialog, buildTemplateParamForm: buildTemplateParamForm, templateParams: templateParams, fieldSpecs: fieldSpecs, jederFieldSpecs: jederFieldSpecs, fetchFromCitoid: fetchFromCitoid, citoidFieldsFor: citoidFieldsFor, withLinkAsUrl: withLinkAsUrl, today: today, buildCitation: buildCitation, looksLikeTemplate: looksLikeTemplate, looksLikeCitationLine: looksLikeCitationLine, USEX_NAMES: USEX_NAMES, EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER, parseCitationLine: parseCitationLine, applyAliases: applyAliases, keepOrder: keepOrder, templateAliases: templateAliases, exampleBlocks: exampleBlocks, replaceExample: replaceExample, exampleMatches: exampleMatches }; }()); // </nowiki> ercf8tbbun9mc0gl0czwwtjdgds7ar1 Bikarhêner:Wikihez/Gadget-test/cite.css 2 1358918 6532103 6353121 2026-09-18T20:34:49Z Wikihez 7344 Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json 6532103 css text/css /* <nowiki> */ /* * Page: [[MediaWiki:Gadget-wikt.cite.css]] * * Styles cite.js's own DOM: the Kategorî:Çavkanî search rows (buildCategoryTemplateSearch) and the * template-param dialog (openTemplateDialog/buildTemplateParamForm) it shares with DefSideBoxes and * start.js. .dsb-input and .dsb-adv-label also exist in dsb-panels.css for its own unrelated fields -- * duplicated here, not moved, since those other uses have nothing to do with this module. */ /* ── Template parameter form ───────────────────────────────────────── Built by buildTemplateParamForm(): a fresh insert from Etîmolojî/Çavkanî, editing an existing chip, or a gloss line that turns out to be one template call. */ .dsb-input { box-sizing: border-box; min-width: 16em; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } .dsb-input::placeholder { color: var(--wikt-placeholder); opacity: 1; } .dsb-input:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } .dsb-adv-label { margin-bottom: 4px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } .dsb-tpl-name { font-family: var(--wikt-mono); font-size: 12px; color: var(--wikt-ink-3); } .dsb-tpl-name a { color: inherit; text-decoration: none; border-bottom: 1px dotted var(--wikt-ink-3); } .dsb-tpl-name a:hover { color: var(--wikt-accent-deep); } .dsb-tpl-desc { margin-top: 2px; font-size: 12px; color: var(--wikt-muted); } .dsb-tpl-param-row { display: flex; flex-direction: column; gap: 3px; margin-top: 8px; } .dsb-tpl-help { font-size: 11.5px; color: var(--wikt-muted); } .dsb-tpl-undocumented { font-weight: 400; color: var(--wikt-muted); } .dsb-tpl-deprecated .dsb-adv-label { text-decoration: line-through; color: var(--wikt-muted); } /* A parameter that takes inline modifiers reuses the word row, so strip the list styling. */ .dsb-tpl-modifier-list { margin: 0; padding: 0; list-style: none; } /* ---- the {{etîmon}} builder --------------------------------------------------------------------- */ .dsb-etimon { display: flex; flex-direction: column; gap: 10px; } .dsb-etimon-pagelang, .dsb-etimon-metn { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .dsb-etimon-lang { max-width: 11em; } /* One step of the chain: its keyword, that keyword's modifiers, and the words it applies to. */ .dsb-etimon-step { border: 1px solid var(--wikt-card-edge); border-radius: var(--wikt-r-card); padding: 8px 10px; background: var(--wikt-code-bg); } .dsb-etimon-step-head { display: flex; align-items: flex-start; gap: 8px; flex-wrap: wrap; } .dsb-etimon-words { margin: 6px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 6px; } .dsb-etimon-word-row { display: flex; align-items: flex-start; gap: 6px; flex-wrap: wrap; } .dsb-etimon-word-input { flex: 1 1 12em; min-width: 10em; } /* The modifier chips and their ⊕ sit together, the picker drops out underneath. */ .dsb-etimon-mods { position: relative; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; } /* An inline <etimon:…>: the same blocks again, one step deeper. */ .dsb-etimon-nested { margin: 6px 0 0 14px; padding-left: 10px; border-left: 2px solid var(--wikt-accent-edge); } .dsb-etimon-nested-head { display: flex; align-items: center; gap: 6px; } .dsb-etimon-add { align-self: flex-start; margin-top: 6px; border: 0; padding: 2px 0; background: none; color: var(--wikt-accent); font-size: 12.5px; cursor: pointer; } .dsb-etimon-add:hover { text-decoration: underline; } .dsb-etimon-remove { border: 0; background: none; padding: 0 4px; color: var(--wikt-muted); font-size: 15px; line-height: 1.4; cursor: pointer; } .dsb-etimon-remove:hover { color: var(--wikt-danger); } .dsb-etimon-metn-free { max-width: 9em; } .dsb-etimon-more summary { cursor: pointer; font-size: 12.5px; color: var(--wikt-ink-3); } .dsb-etimon-param { display: flex; flex-direction: column; gap: 3px; margin-top: 8px; } /* A flag is a checkbox with its explanation on the label, so it reads as one line. */ .dsb-etimon-param-flag { flex-direction: row; align-items: center; gap: 6px; } /* What the form will write, so the wikitext is never a surprise. */ .dsb-etimon-preview { display: block; padding: 6px 8px; border-radius: var(--wikt-r-field); background: var(--wikt-code-bg); border: 1px solid var(--wikt-card-edge); font-family: var(--wikt-mono); font-size: 11.5px; color: var(--wikt-ink-2); word-break: break-all; } /* Touch: >=16px stops iOS Safari zooming the page when a field is focused, and the taller box clears the 44px tap minimum. dsb-panels.css says the same for its own fields; the dialog opens on the wizard too, which never loads that sheet. */ @media (max-width: 720px), (pointer: coarse) { .dsb-input { min-height: 40px; font-size: 16px; } } /* </nowiki> */ 9c5va6tn6231msv5c9nf4zzebglswqv Modul:parameters/data/ceribandin 828 1359050 6532074 6531682 2026-09-18T18:40:29Z Wikihez 7344 sync test copy 6532074 Scribunto text/plain local list_to_set = require("Module:table").listToSet local function process_set_param(param) param.set = list_to_set(param.set) param.converted_set = true return param end local boolean = {type = "boolean"} local empty_list = {} local list = {list = true} local list_allow_holes_separate_no_index = {list = true, allow_holes = true, separate_no_index = true} local required = {required = true} local required_default_ = {required = true, default = ""} local required_lang_default_und = {required = true, type = "language", default = "und"} local m = {} -- [[Module:anchors]] m["anchor"] = { [1] = {required = true, list = true, disallow_holes = true}, } m["senseid"] = { [1] = required_lang_default_und, [2] = required_default_, tag = process_set_param{set = {"li", "p"}, default = "li"}, } m["etymid"] = { [1] = required_lang_default_und, [2] = required_default_ } -- [[Module:etymon]] m["etymon"] = { [1] = required_lang_default_und, [2] = {list = true, disallow_holes = true}, id = true, title = true, tree = boolean, text = true, -- Kurdish names for the same two parameters. dar = {alias_of = "tree"}, metn = {alias_of = "text"}, exnihilo = boolean, etydate = true, doublet = {sublist = "comma without whitespace"}, -- Kurdish name for the same parameter, cf. Şablon:cotreh. cotreh = {alias_of = "doublet"}, rfe = true, etystub = true, nl = boolean, pos = true, -- Kurdish name for the same parameter; Modul:etymon maps its Kurdish values (reh, kelîme, ...). crz = {alias_of = "pos"}, notree = {default = false, type = "boolean"}, nocat = {default = false, type = "boolean"}, nodot = {default = false, type = "boolean"}, dot = true, -- Kurdish names for the same parameters. ["tarîxa-etîm"] = {alias_of = "etydate"}, darna = {alias_of = "notree"}, katna = {alias_of = "nocat"}, nekat = {alias_of = "nocat"}, niqtena = {alias_of = "nodot"}, niqte = {alias_of = "dot"}, json = {default = false, type = "boolean"}, } -- [[Module:translations]] m["translation"] = { [1] = required_lang_default_und, [2] = true, [3] = list, ["alt"] = true, ["id"] = true, ["sc"] = {type = "script"}, ["tr"] = true, ["ts"] = true, ["lit"] = true, } m["t-needed"] = { [1] = required_lang_default_und, [2] = process_set_param{set = {"usex", "quote"}}, ["nocat"] = boolean, ["sort"] = true, } m["trans-top"] = { [1] = true, ["id"] = true, ["column-width"] = true, } m["trans-top-also"] = { [1] = required, [2] = list, ["id"] = list_allow_holes_separate_no_index, ["column-width"] = true, } m["checktrans-top"] = { [1] = true, ["column-width"] = true, } m["trans-bottom"] = empty_list m["trans-see"] = { [1] = required, [2] = list, ["id"] = list_allow_holes_separate_no_index, } m["translation subpage"] = empty_list m["no equivalent translation"] = { [1] = required_lang_default_und, ["noend"] = boolean, } m["no attested translation"] = { [1] = required_lang_default_und, ["noend"] = boolean, ["sort"] = true, } m["not used"] = { [1] = required_lang_default_und, [2] = true, } return m 338lyfowsqvo2n7ky43h9frxqyo5oz6 Modul:etydate 828 1359081 6532081 6370545 2026-09-18T19:07:30Z Wikihez 7344 Kurdish wording: "Cara ewil di 1900an de hatiye peyitandin"; Kurdish endings on years (-ê after a final 1, -î for decades, -an otherwise) 6532081 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts, tail = {}, {} local specs = args[1] local target = parts local function ins(txt) insert(target, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(num) if num:find("11$") then return num .. "an" elseif num:find("1$") then return num .. "ê" end return num .. "an" end -- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an", -- with "early"/"mid"/"late" in front where they are given. local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " } local function period(arg) arg = arg:gsub("^!", "") local prefix = "" local word, rest = arg:match("^(%a+)[ %-](.+)$") if word and period_prefixes[word] then prefix, arg = period_prefixes[word], rest end local decade = arg:match("^(%d+)s$") if decade then return prefix .. "salên " .. decade .. "î" end local century = arg:match("^(%d+)c$") if century then return prefix .. "sedsala " .. oblique(century) end if arg:find("^%d+$") then return prefix .. oblique(arg) end return prefix .. arg end local process_common_usage local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2)) return poff + 3 end ins(period(year)) return poff + 1 end local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end -- The second date goes after the main clause, as a sentence of its own. process_common_usage = function(offset) target = tail ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") target = parts end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(period(specs[2])) if specs[3] then process_common_usage(3) end ins(" hatiye peyitandin") else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end for _, part in ipairs(tail) do insert(parts, part) end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then insert(parts, M.references.format_references(flattened_refs)) end end return concat(parts) end return export q0rpkr9bn4b2ronjkx2u27tdfblmzeh 6532091 6532081 2026-09-18T19:17:39Z Wikihez 7344 Kurdish wording: "Cara ewil di 1900an de hatiye peyitandin"; Kurdish endings on years (-ê after a final 1, -î for decades, -an otherwise) 6532091 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts, tail = {}, {} local specs = args[1] local target = parts local function ins(txt) insert(target, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(num) if num:find("11$") then return num .. "an" elseif num:find("1$") then return num .. "ê" end return num .. "an" end -- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an", -- with "early"/"mid"/"late" in front where they are given. local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " } local function period(arg) if arg:find("^!") then -- "!" means: print it exactly as it was typed return (arg:gsub("^!", "")) end local prefix = "" local word, rest = arg:match("^(%a+)[ %-](.+)$") if word and period_prefixes[word] then prefix, arg = period_prefixes[word], rest end -- An ending the editor typed already ("1900î", "1901ê", "1900an") is kept as it is. if arg:find("^%d+[îê]$") or arg:find("^%d+an$") then return prefix .. arg end local decade = arg:match("^(%d+)s$") if decade then return prefix .. "salên " .. decade .. "î" end local century = arg:match("^(%d+)c$") if century then return prefix .. "sedsala " .. oblique(century) end if arg:find("^%d+$") then return prefix .. oblique(arg) end return prefix .. arg end local process_common_usage local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2)) return poff + 3 end ins(period(year)) return poff + 1 end local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end -- The second date goes after the main clause, as a sentence of its own. process_common_usage = function(offset) target = tail ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") target = parts end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(period(specs[2])) if specs[3] then process_common_usage(3) end ins(" hatiye peyitandin") else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end for _, part in ipairs(tail) do insert(parts, part) end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then insert(parts, M.references.format_references(flattened_refs)) end end return concat(parts) end return export ljm1hlpw1vnhhwzm66nabwf3vuj5oxu MediaWiki:Gadget-wikt.core/sections.js 8 1359153 6533069 6529960 2026-09-19T10:14:46Z Wikihez 7344 DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix 6533069 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.core/sections.js]] */ (function () { "use strict"; var startData = require("./data-sections.json"); // Inlined so the view path does not pull in util.js. function capitalize(str) { return str ? str[0].toUpperCase() + str.substr(1) : str; } // Recognized part-of-speech section headings, exported for the wizard, DefSideBoxes and add-examples. // Section titles: posChoices' keys capitalised, plus a "Formeke Xê" for each POS that has forms, plus Biwêj. var POS_KEYS = Object.keys(startData.posChoices); var NO_FORM_HEADING = ["gotineke pêşiyan", "îfade"]; function hasFormHeading(pos) { return NO_FORM_HEADING.indexOf(pos) === -1; } var sectionNames = {}; POS_KEYS.forEach(function (key) { var title = capitalize(key); sectionNames[title] = [title]; if (hasFormHeading(key)) { sectionNames["Formeke " + key + "ê"] = ["Formeke " + key + "ê"]; } }); sectionNames["Biwêj"] = ["Biwêj"]; // Page-level (per part-of-speech, "====" heading) subsections start.js can also build from scratch. // "kind: wordlist" ones use {{kol3|lang|cure=Header|word1|word2}}; "kind: text" ones are a plain paragraph. // Only steps with a confirmed wikitext format are included; insertion rank comes from SUBSECTION_ORDER below. var PAGE_SUBSECTIONS = startData.pageSubsections; // ---- section/language helpers (document-order based, immune to mobile's per-section DOM wrapping and // MediaWiki's page-wide heading-id collisions) ---- // MediaWiki wraps each heading in a "mw-heading2/3/.../" div in current skin output. function headingOuter($h) { var $wrap = $h.closest(".mw-heading2, .mw-heading3, .mw-heading4, .mw-heading5, .mw-heading6"); return $wrap.length ? $wrap : $h; } // Section's language code: nearest preceding .besazimani[id] by document order, not sibling-walking. function languageCodeForOl($ol) { var $marks = $(".besazimani[id]").add($ol); var ol = $ol.get(0); var idx = $marks.index(ol); for (var i = idx - 1; i >= 0; i--) { var el = $marks.get(i); if (el.id) { return el.id; } } return null; } // Pseudo section type for start.js's unclassified "=== Mane ===" / "=== Mane 2 ===" placeholder heading, so // locateSection() (and everything built on it) can target one before a real POS has been chosen. var MANE_SECTION = "Mane"; // A heading's depth, from its own tag or the wrapper the skin puts around it. 0 for anything that is // not a heading. function headingDepth($el) { var m = /(?:^|\s)mw-heading([2-6])(?:\s|$)/.exec($el.attr("class") || ""); if (m) { return Number(m[1]); } var tag = ($el.prop("tagName") || "").toLowerCase(); return /^h[2-6]$/.test(tag) ? Number(tag.slice(1)) : 0; } // Every part-of-speech heading on the page, at either depth it is written at: "===" on most entries, // "====" where the senses are grouped under numbered etymologies. Called back with the heading, its // section key and its depth. function eachPosHeading(callback) { $("h3, h4").each(function () { var $h = $(this); var key = sectionKeyOf($h); if (key) { callback($h, key, headingDepth($h) || 3); } }); } // A heading's own text, with the pencil/convert-trigger this gadget injects into it filtered out -- // otherwise attaching one would change what sectionTypeOf() and the ordinal counter see. function headingText($h) { return $h.clone().find(".dsb-toolbar").remove().end().text().trim(); } // An older layout heads each sense group with a number and a short gloss: "=== 2. dîn, bêhiş ===". function isNumberedHeadingText(text) { return /^\d+\.\s+\S/.test(text); } // "Mane", or a numbered group heading with {{cure?}} straight under it -- the same unsorted section under // another name. {{cure?}} and its aliases render an anchor with data-id="bekatrez". Read once per heading // and kept: a queued conversion's preview replaces that line, and the heading must not change kind. function isManeHeading($h) { var text = headingText($h); if (/^Mane(\s+\d+)?$/.test(text)) { return true; } if (!isNumberedHeadingText(text)) { return false; } var known = $h.data("dsbNumberedMane"); if (typeof known === "boolean") { return known; } var found = false; for (var $cursor = headingOuter($h).next(); $cursor.length; $cursor = $cursor.next()) { if (headingDepth($cursor) || $cursor.is("ol")) { break; } if ($cursor.is("[data-id='bekatrez']") || $cursor.find("[data-id='bekatrez']").length) { found = true; break; } } $h.data("dsbNumberedMane", found); return found; } // Canonical section-type key for a heading, stripping a page author's own disambiguating trailing number. function sectionTypeOf($h3) { var text = headingText($h3); if (sectionNames[text]) { return text; } var stripped = text.replace(/\s*\d+$/, ""); // \s* not \s+: locateSection() also accepts "Navdêr2" return sectionNames[stripped] ? stripped : null; } // A heading's section key: its part of speech, or the wizard's "Mane" placeholder, which is a real // section holding real definitions but not a part of speech. Everything that locates a section by // heading goes through here, so the placeholder is never half-supported. function sectionKeyOf($h3) { return sectionTypeOf($h3) || (isManeHeading($h3) ? MANE_SECTION : null); } // The heading texts a section key accepts, or null when the key names no section at all. What the // wikitext locator matches "=== ... ===" against. function headingNamesFor(sectionType) { return sectionNames[sectionType] || (sectionType === MANE_SECTION ? [MANE_SECTION] : null); } // This heading's 1-based position among same-type headings within its own language block. // How many sections of one type this language has. A summary only needs to number a section when // there is more than one of its kind -- "Navdêr" alone is unambiguous, "Navdêr" out of two is not. // Same walk as sectionOrdinalWithinLanguage below: language marks reset the count, headings add to it. function sectionTypeCountWithinLanguage($h3) { var h3El = $h3.get(0); var wanted = sectionKeyOf($h3) || headingText($h3); var $all = $(".besazimani[id]").add($("h3, h4")); var count = 0; var seen = false; $all.each(function () { if ($(this).is(".besazimani[id]")) { // A new language starts: whatever was counted belonged to the previous one. if (seen) { return false; } count = 0; return; } var type = sectionKeyOf($(this)) || headingText($(this)); if (type === wanted) { count++; } if (this === h3El) { seen = true; } }); return count; } function sectionOrdinalWithinLanguage($h3) { var h3El = $h3.get(0); var $all = $(".besazimani[id]").add($("h3, h4")); var counts = {}; var result = 1; $all.each(function () { if ($(this).is(".besazimani[id]")) { counts = {}; return; } var type = sectionKeyOf($(this)) || headingText($(this)); counts[type] = (counts[type] || 0) + 1; if (this === h3El) { result = counts[type]; return false; } }); return result; } // This heading's 1-based position among headings carrying the same text in its own language block, // at any depth. What locateHeadingByText() counts in the wikitext, so the two agree. function headingTextOrdinalWithinLanguage($h) { var el = $h.get(0); var wanted = headingText($h); var $all = $(".besazimani[id]").add($("h3, h4, h5, h6")); var count = 0; var result = 1; $all.each(function () { if ($(this).is(".besazimani[id]")) { count = 0; return; } if (headingText($(this)) === wanted) { count++; } if (this === el) { result = count; return false; } }); return result; } // A "form of"-template-generated <li> wraps its own content; its nested <ol> isn't real "##" senses. function isFormOfWrapper($li) { return $li.children(".form-of-definition").length > 0; } // Recurse into a <li>'s nested <ol> unless it's a form-of wrapper. function eachLeafDefinition($ol, fn) { $ol.children("li").each(function () { var $li = $(this); var $childOl = $li.children("ol"); if ($childOl.length && !isFormOfWrapper($li)) { $childOl.each(function () { eachLeafDefinition($(this), fn); }); } else { fn($li); } }); } /** * Whether the gadgets should run on this page at all: an entry, a reconstruction (ns 108), or a * sandbox -- a user's own /ceribandin or /test subpage, and the project's own [[WF:ceribandin]]. * * Shared because dsb.js and start-launch.js each gate on it, and a sandbox added to one but not the * other is a gadget that half-works there. */ function isEntryPage() { var ns = mw.config.get("wgNamespaceNumber"); var page = mw.config.get("wgPageName") || ""; if (!ns || ns === 108) { return true; } // A sandbox and anything under it: [[Bikarhêner:X/ceribandin]] and its own subpages. if (ns === 2 && /\/(ceribandin|test)(\/|$)/.test(page)) { return true; } // The project namespace has one sandbox, not one per page, so it is matched by name. return ns === 4 && /^[^:]+:(ceribandin|test)(\/|$)/i.test(page); } // The examples and quotations drawn under one definition, in page order: a "#:" line is a <dd> and a "#*" // line an <li>. A <dd> counts when it is a usage example or a plain italic sentence, never a word list; // the "no example yet" placeholder and add-examples' own form row never count. While DefSideBoxes shows a // queued change, the sense is drawn inside its preview, and the examples are read from there. function exampleItemsOf($li) { var $root = $li.children(".dsb-sense-preview").last(); if (!$root.length) { $root = $li; } return $root.children("dl").children("dd").add($root.children("ul").children("li")).filter(function () { var $item = $(this); if (this.style.display === "none" || $item.hasClass("mw-empty-elt")) { return false; } if ($item.is("li")) { return !$item.find(".benimune").length && !$item.children(".add-example-form-title").length; } if ($item.children(".h-usage-example").length) { return true; } var first = this.firstChild; while (first && first.nodeType === 3 && !$.trim(first.nodeValue)) { first = first.nextSibling; } return !!first && first.nodeType === 1 && first.tagName === "I"; }); } module.exports = { // posChoices and pageSubsections: wikt.edit hands these on as part of its own data. data: startData, isEntryPage: isEntryPage, hasFormHeading: hasFormHeading, sectionNames: sectionNames, MANE_SECTION: MANE_SECTION, PAGE_SUBSECTIONS: PAGE_SUBSECTIONS, headingOuter: headingOuter, headingText: headingText, isManeHeading: isManeHeading, isNumberedHeadingText: isNumberedHeadingText, sectionTypeOf: sectionTypeOf, sectionKeyOf: sectionKeyOf, headingDepth: headingDepth, eachPosHeading: eachPosHeading, headingNamesFor: headingNamesFor, sectionOrdinalWithinLanguage: sectionOrdinalWithinLanguage, headingTextOrdinalWithinLanguage: headingTextOrdinalWithinLanguage, sectionTypeCountWithinLanguage: sectionTypeCountWithinLanguage, languageCodeForOl: languageCodeForOl, isFormOfWrapper: isFormOfWrapper, exampleItemsOf: exampleItemsOf, eachLeafDefinition: eachLeafDefinition }; }()); // </nowiki> 1fcj0v4xpgwr3aukbgh0j7ruoob57sb MediaWiki:Gadget-wikt.edit/wikitext.js 8 1359159 6533071 6426108 2026-09-19T10:14:56Z Wikihez 7344 DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix 6533071 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.edit/wikitext.js]] * */ // Wikitext parsing and serialisation: template calls, kol/col word lists, template redirects and // TemplateData lookups. No DOM, no wizard state. (function () { "use strict"; var util = require("./util.js"); var sections = require("ext.gadget.wikt.core").sections; var startData = require("./data-main.json"); var escapeRegExp = util.escapeRegExp; var SubmitAbort = util.SubmitAbort; var MANE_SECTION = sections.MANE_SECTION; // The "needs a POS" maintenance tag under a placeholder "Mane" heading, under every name it is called by // on real pages (data-main.json's maneTags). A space inside a tag name matches any run of whitespace. var MANE_TAG_REGEX = new RegExp( "^\\{\\{\\s*(?:" + startData.maneTags.map(function (tag) { return escapeRegExp(tag).replace(/ +/g, "\\s+"); }).join("|") + ")\\s*(?:\\|[^{}]*)?\\}\\}\\s*$", "i"); var HEADING_LINE = /^(={3,6})[ ]*(.+?)[ ]*\1\s*$/; // A numbered group heading ("=== 3. roj ===") with the maintenance tag before its first definition is a // "Mane" section under another name, as sections.isManeHeading() reads it on the page. Its depth, or 0. function numberedManeDepth(lines, index) { var m = HEADING_LINE.exec(lines[index] || ""); if (!m || !sections.isNumberedHeadingText(m[2])) { return 0; } for (var i = index + 1; i < lines.length && !/^[#=]/.test(lines[i]); i++) { if (MANE_TAG_REGEX.test(lines[i])) { return m[1].length; } } return 0; } // The numbered group heading one level up that a section sits straight under, blank lines aside // ("=== 2. dîn ===" then "==== Mane ===="), as a line index; -1 when there is none. function numberedGroupAbove(lines, index, depth) { var at = index - 1; while (at >= 0 && !$.trim(lines[at])) { at--; } var m = at >= 0 && HEADING_LINE.exec(lines[at]); return m && m[1].length === depth - 1 && sections.isNumberedHeadingText(m[2]) ? at : -1; } var templateDataApi = new mw.Api(); // Templates that mean the same thing. The first entry of each row is what gets written; every entry is // recognised when reading, so an existing call keeps the spelling the page already uses. // Matched differently, so listed separately: WORDLIST_TEMPLATES and MANE_TAG_REGEX. var TEMPLATE_ALIASES = startData.templateAliases; // Every alias -> the name this gadget uses for it. var TEMPLATE_CANONICAL = {}; Object.keys(TEMPLATE_ALIASES).forEach(function (key) { TEMPLATE_ALIASES[key].forEach(function (alias) { TEMPLATE_CANONICAL[alias] = key; }); }); function canonicalTemplateKey(name) { var trimmed = $.trim(name || ""); return TEMPLATE_CANONICAL[trimmed] || trimmed; } // Regex alternation matching any spelling of one key. Callers wrap it in their own group. function aliasPattern(key) { return (TEMPLATE_ALIASES[key] || [key]).map(escapeRegExp).join("|"); } // {{kol}}, {{kol2}}, {{kol3}} and their col* spellings are the same column word-list template. New sections // are written as kol3; any of the six is recognized when parsing an existing one. var WORDLIST_TEMPLATES = startData.wordlistTemplates; // The leading run of "{{...}}" calls on a definition line; "rest" is the gloss text after them. function splitLeadingCalls(afterMarker) { var calls = []; var rest = afterMarker; var leadingRegex = /^\{\{\s*([^{}|]+?)\s*\|([^{}]*)\}\}\s*/; var m; while ((m = leadingRegex.exec(rest)) !== null) { calls.push({ key: m[1], params: m[2].split("|") }); rest = rest.slice(m[0].length); } return { calls: calls, rest: rest }; } // Splits a template call's inner text on its top-level "|", ignoring pipes nested in {{...}} or [[...]]. function splitTemplateParams(inner) { var parts = []; var buf = ""; var tpl = 0; var link = 0; for (var i = 0; i < inner.length; i++) { var two = inner.substr(i, 2); if (two === "{{" || two === "}}" || two === "[[" || two === "]]") { if (two === "{{") { tpl++; } else if (two === "}}") { tpl--; } else if (two === "[[") { link++; } else { link--; } buf += two; i++; continue; } if (inner.charAt(i) === "|" && tpl === 0 && link === 0) { parts.push(buf); buf = ""; continue; } buf += inner.charAt(i); } parts.push(buf); return parts; } // Every top-level "{{...}}" call in a string, and whether anything else (bar whitespace) sits between them. function parseTemplateCalls(text) { var calls = []; var otherContent = false; var plainFrom = 0; var i = 0; while (i < text.length) { if (text.substr(i, 2) !== "{{") { i++; continue; } if ($.trim(text.slice(plainFrom, i))) { otherContent = true; } var depth = 0; var close = -1; for (var j = i; j < text.length - 1; j++) { var two = text.substr(j, 2); if (two === "{{") { depth++; j++; } else if (two === "}}") { depth--; j++; if (depth === 0) { close = j + 1; break; } } } if (close === -1) { otherContent = true; // unbalanced braces: not something to offer a form for break; } var parts = splitTemplateParams(text.slice(i + 2, close - 2)); calls.push({ name: $.trim(parts[0]), params: parts.slice(1), start: i, end: close }); i = close; plainFrom = close; } if ($.trim(text.slice(plainFrom))) { otherContent = true; } return { calls: calls, otherContent: otherContent }; } // "ku", "îngilîzî", "id=ziman" -> positional values in order plus a named map, keeping the keys the call // actually uses (a positional value is keyed by its 1-based position, matching TemplateData). function splitCallParams(params) { var values = {}; var used = []; var positional = 0; params.forEach(function (raw) { // Anything but | = { } can be a parameter name; Kurdish ones carry diacritics ("rêz=", "jêder="). var m = /^\s*([^|={}\n]+?)\s*=([\s\S]*)$/.exec(raw); var key; if (m) { key = m[1]; values[key] = $.trim(m[2]); } else { positional++; key = String(positional); values[key] = $.trim(raw); } used.push(key); }); return { values: values, used: used }; } // Rebuilds a call from the form's values. Positional parameters keep their slots even when blanked -- // dropping "1" would silently promote "2" into its place. function buildTemplateCall(name, values, keys) { var numeric = keys.filter(function (k) { return /^\d+$/.test(k); }).sort(function (a, b) { return a - b; }); var lastFilled = 0; numeric.forEach(function (k) { if ($.trim(values[k] || "")) { lastFilled = Math.max(lastFilled, parseInt(k, 10)); } }); var out = "{{" + name; numeric.forEach(function (k) { if (parseInt(k, 10) <= lastFilled) { out += "|" + $.trim(values[k] || ""); } }); keys.forEach(function (k) { if (/^\d+$/.test(k)) { return; } var v = $.trim(values[k] || ""); if (v) { out += "|" + k + "=" + v; } }); return out + "}}"; } // TemplateData labels and descriptions are {langCode: text} objects; prefer Kurdish, then the wiki's own // content language, then whatever is present. function tdText(value) { if (!value) { return ""; } if (typeof value === "string") { return value; } return value.ku || value[mw.config.get("wgContentLanguage")] || value[Object.keys(value)[0]] || ""; } // Cached per template name. A template with no TemplateData resolves to null, not an error -- the form // still renders, just with raw parameter names for labels. var templateDataCache = {}; // Fetches TemplateData for many templates in as few requests as the API's 50-title cap allows, filling // the same cache fetchTemplateData() reads -- so a picker with hundreds of entries (Kategorî:Çavkanî, // say) costs a handful of requests instead of one per template. Every requested name is cached (a miss // as null) by the time this resolves; a name already cached, pending or not, is left untouched. function fetchTemplateDataBatch(names) { var missing = []; (names || []).forEach(function (name) { if (!name || templateDataCache[name] || missing.indexOf(name) !== -1) { return; } // Baked-in entries answer here too, so a picker row for one costs nothing. var baked = bakedTemplateData(name); if (baked) { templateDataCache[name] = $.Deferred().resolve(baked).promise(); return; } missing.push(name); }); if (!missing.length) { return $.Deferred().resolve().promise(); } var chunks = []; for (var i = 0; i < missing.length; i += 50) { chunks.push(missing.slice(i, i + 50)); } function fetchChunk(chunk) { return templateDataApi.get({ action: "templatedata", titles: chunk.map(function (n) { return "Şablon:" + n; }).join("|"), redirects: 1, formatversion: 2 }).then(function (data) { // "pages" is an object keyed by page id even under formatversion=2 -- this endpoint (a // third-party extension, not a core action) doesn't follow the "pages as array" convention // core actions do -- and a title with no TemplateData at all is simply absent, not listed // with an empty entry. var byTitle = {}; $.each((data && data.pages) || {}, function (_, page) { if (page && page.title) { byTitle[page.title] = page; } }); // A redirect's/normalization's own target may itself need one more hop. ((data && data.redirects) || []).forEach(function (r) { if (byTitle[r.to] && !byTitle[r.from]) { byTitle[r.from] = byTitle[r.to]; } }); ((data && data.normalized) || []).forEach(function (n) { if (byTitle[n.to] && !byTitle[n.from]) { byTitle[n.from] = byTitle[n.to]; } }); chunk.forEach(function (name) { templateDataCache[name] = $.Deferred().resolve(byTitle["Şablon:" + name] || null).promise(); }); }, function () { chunk.forEach(function (name) { templateDataCache[name] = $.Deferred().resolve(null).promise(); }); }); } return $.when.apply($, chunks.map(fetchChunk)); } // data-main.json's own copy of the parameter lists for the templates whose dialogs open constantly, so // those need no request at all. Shaped like the API's own answer, so nothing downstream can tell the // difference; a template that is not in the table is fetched as before. function bakedTemplateData(name) { var baked = (startData.templateParams || {})[name]; if (!baked) { return null; } var params = {}; (baked.order || []).forEach(function (key) { params[key] = { label: (baked.labels || {})[key] || null }; }); return { title: "Şablon:" + name, params: params, paramOrder: baked.order || [] }; } function fetchTemplateData(name) { if (!templateDataCache[name]) { var baked = bakedTemplateData(name); if (baked) { templateDataCache[name] = $.Deferred().resolve(baked).promise(); return templateDataCache[name]; } } if (!templateDataCache[name]) { templateDataCache[name] = templateDataApi.get({ action: "templatedata", titles: "Şablon:" + name, redirects: 1, formatversion: 2 }).then(function (data) { var pages = data && data.pages; var key = pages && Object.keys(pages)[0]; return key ? pages[key] : null; }, function () { return null; }); } return templateDataCache[name]; } // One line of a TemplateData description, capped so a picker row stays a picker row rather than // wrapping. Shared so every picker that shows descriptions trims them the same way. // Numbers repeated part-of-speech headings inside one language section: two "=== Rengdêr ===" are // indistinguishable on the page, in the table of contents and to anything linking at one. Every // repeated heading is numbered 1..n, so an existing lone "Rengdêr" becomes "Rengdêr 1" the moment a // second is added, and a heading that stops being repeated loses its number again. // // Numbers already on a heading are stripped before counting, so the result depends only on what is // there now -- removing the middle one of three closes the gap instead of leaving 1, 3. // Only "===" headings are touched: "====" subsections and the "==" language header are left alone. function numberRepeatedPosHeadings(sectionText) { var HEADING = /^(===[ \t]*)([^=\n]+?)([ \t]*===)[ \t]*$/gm; function base(name) { return name.replace(/\s+\d+$/, ""); } var counts = {}; var m; HEADING.lastIndex = 0; while ((m = HEADING.exec(sectionText)) !== null) { var b = base(m[2]); counts[b] = (counts[b] || 0) + 1; } var seen = {}; HEADING.lastIndex = 0; return sectionText.replace(HEADING, function (all, open, name, close) { var key = base(name); if (counts[key] < 2) { return open + key + close; } seen[key] = (seen[key] || 0) + 1; return open + key + " " + seen[key] + close; }); } function shortDesc(text, maxLen) { maxLen = maxLen || 90; var line = $.trim(String(text || "").split("\n")[0]); return line.length > maxLen ? line.slice(0, maxLen) + "…" : line; } // Pulls a {{kol3|ku|cure=Jê|word|word}}-style call apart into the bits an edit has to preserve (template // name, language, named params) plus the positional word list. Null if the body has no such call. // Every word-list call in a section body, in order with absolute offsets. A section commonly holds // several: one per "sernav=" group, often alongside an unheaded one. function parseWordListCalls(text) { var calls = []; var offset = 0; for (;;) { var call = parseWordListCall(text.slice(offset)); if (!call) { return calls; } call.start += offset; call.end += offset; calls.push(call); offset = call.end; } } function parseWordListCall(text) { var m = new RegExp("\\{\\{\\s*(" + WORDLIST_TEMPLATES.join("|") + ")\\s*[|}]", "i").exec(text); if (!m) { return null; } var open = m.index; var depth = 0; var close = -1; for (var i = open; i < text.length - 1; i++) { var two = text.substr(i, 2); if (two === "{{") { depth++; i++; } else if (two === "}}") { depth--; i++; if (depth === 0) { close = i + 1; break; } } } if (close === -1) { return null; } var parts = splitTemplateParams(text.slice(open + 2, close - 2)); var named = []; var words = []; for (var pi = 2; pi < parts.length; pi++) { var val = $.trim(parts[pi]); if (!val) { continue; } if (/^[A-Za-z][A-Za-z0-9_-]*\s*=/.test(val)) { named.push(val); } else { words.push(val); } } return { name: $.trim(parts[0]), lang: parts.length > 1 ? $.trim(parts[1]) : "", named: named, words: words, start: open, end: close }; } // Named parameters of a kol/col call are carried around as raw "key=value" strings ("cure=Jê"). // Modul:columns declares sernav alongside cure, so it round-trips like any other named parameter. function namedParam(named, key) { var prefix = new RegExp("^" + escapeRegExp(key) + "\s*="); for (var i = 0; i < named.length; i++) { if (prefix.test(named[i])) { return $.trim(named[i].replace(prefix, "")); } } return ""; } // A copy of `named` with key set, or with it removed when the value is blank. function withNamedParam(named, key, value) { var prefix = new RegExp("^" + escapeRegExp(key) + "\s*="); var out = named.filter(function (param) { return !prefix.test(param); }); if ($.trim(value || "")) { out.push(key + "=" + $.trim(value)); } return out; } // Canonical multi-line layout, matching how existing ku.wiktionary lists are written (one word per line). function buildWordListCall(name, lang, named, words) { var head = "{{" + name + "|" + lang; named.forEach(function (n) { head += "|" + n; }); return words.length ? head + "\n|" + words.join("\n|") + "\n}}" : head + "\n}}"; } // A word-list section body written as plain bullets -- "* [[kelîme]]" or "* {{g|ku|kelîme}}" -- read as a word // list so it can be edited in the normal widget and saved back as a real {{kol3}}. Null for anything // richer (a piped link, a {{g}} carrying extra parameters, prose between the bullets), which is left as // raw wikitext rather than guessed at. // A "{{mj|a|b}}" label at one end of a bullet. Several labels become one comma-joined modifier value, // which is how the word-list templates read "<e:...>" anyway. var MJ_LEADING = /^\{\{\s*mj\s*\|([^{}]*)\}\}\s*/; var MJ_TRAILING = /\s*\{\{\s*mj\s*\|([^{}]*)\}\}$/; function mjValue(params) { return params.split("|").map(function (part) { return $.trim(part); }).filter(Boolean).join(", "); } /** * One bullet's word, or null if the line is carrying something this cannot express. * * "[[kelîme]]" and "{{g|ku|kelîme}}" are the plain forms. A "{{mj|...}}" label in front of the word becomes * an "<e:...>" modifier and one after it "<ee:...>" -- the same distinction the label templates make * between a label that reads before the word and one that reads after it. */ function parseBulletWord(item) { var lead = ""; var tail = ""; var m = MJ_LEADING.exec(item); if (m) { lead = mjValue(m[1]); item = $.trim(item.slice(m[0].length)); } m = MJ_TRAILING.exec(item); if (m) { tail = mjValue(m[1]); item = $.trim(item.slice(0, item.length - m[0].length)); } var word = null; var link = /^\[\[([^\[\]|]+)\]\]$/.exec(item); if (link) { word = $.trim(link[1]); } else { var parsed = parseTemplateCalls(item); if (parsed.otherContent || parsed.calls.length !== 1) { return null; } var call = parsed.calls[0]; // {{g|lang|kelîme}} exactly: a third parameter means it is carrying something this cannot express. if (canonicalTemplateKey(call.name) !== "g" || call.params.length !== 2) { return null; } word = $.trim(call.params[1]); } if (!word) { return null; } return word + (lead ? "<e:" + lead + ">" : "") + (tail ? "<ee:" + tail + ">" : ""); } function parseBulletWordList(body) { var lines = (body || "").split("\n"); var words = []; for (var i = 0; i < lines.length; i++) { var line = $.trim(lines[i]); if (!line) { continue; } var bullet = /^\*\s*(.+)$/.exec(line); if (!bullet) { return null; } var word = parseBulletWord($.trim(bullet[1])); if (word === null) { return null; } words.push(word); } return words.length ? words : null; } // "{{h-bnr|a|b}}" — the "herwiha binêre" hatnote that sits above the first language heading. Empty // entries are dropped; an empty list has no call at all. name keeps whichever of the seven spellings // the page already uses, so editing one never renames it. function buildHbnrCall(pages, name) { var kept = $.grep(pages || [], function (p) { return !!$.trim(p); }); return kept.length ? "{{" + (name || "h-bnr") + "|" + $.map(kept, $.trim).join("|") + "}}" : ""; } // The "{{herwiha binêre|...}}" call on a page, under any of its names, or null. subpage is set when // the call names one -- "{{h-bnr/-ane}}" -- because those hold a list shared by every page that // transcludes them, which lives on the template rather than here. function findHbnrCall(pageContent) { var lines = (pageContent || "").split("\n"); var pattern = new RegExp("^\\{\\{\\s*(" + aliasPattern("h-bnr") + ")(/[^|}]*)?\\s*([|}])", "i"); for (var i = 0; i < lines.length; i++) { if (/^==[^=]/.test(lines[i])) { break; // the hatnote sits above the first language heading } var m = pattern.exec($.trim(lines[i])); if (m) { var call = parseTemplateCalls($.trim(lines[i])).calls[0]; return { lineIndex: i, name: m[1] + (m[2] || ""), subpage: m[2] ? m[1] + m[2] : null, words: (call && call.params) || [] }; } } return null; } // One "[[Wêne:...|thumb|...]]" line. alt is left out when it is empty rather than written blank. // extra is the line's own display keywords ("thumb", "left", "frameless", ...) in the order it had them, // kept so editing a caption never drops them; a new image gets "thumb". size ("250px", "upright=1.2") // has its own box, so it is written after them. function buildImageLine(image) { var file = $.trim((image && image.file) || ""); if (!file) { return ""; } var extra = (image.extra && image.extra.length) ? image.extra : ["thumb"]; var size = $.trim(image.size || ""); var alt = $.trim(image.alt || ""); return "[[Wêne:" + file + "|" + extra.join("|") + (size ? "|" + size : "") + (alt ? "|alt=" + alt : "") + "|" + $.trim(image.caption || "") + "]]"; } var IMAGE_SIZE = /^\s*(?:\d+\s*px|x\s*\d+\s*px|\d+\s*x\s*\d+\s*px|upright(?:\s*=\s*[\d.]+)?)\s*$/i; var IMAGE_KEYWORD = /^\s*(?:thumb|thumbnail|frame|framed|frameless|border|right|left|center|centre|none|baseline|middle|top|bottom)\s*$/i; // The {file, caption, alt} behind one "[[Wêne:...|thumb|...]]" line, or null for anything else. The // caption is the last parameter; "alt=" and the sizing/placement keywords are read off the ones before // it, so a hand-written line with "|left|200px" still comes back editable. // // Split on top-level pipes only: a caption routinely holds "{{w|Riya Teze (rojname)|Riya Teze}}" or // "[[kaxiz|kaxizên]]", and a plain split would take their pipes for the image's own. function parseImageLine(line) { var m = /^\[\[\s*(?:Wêne|File|Image|Dosya)\s*:([\s\S]*)\]\]$/i.exec($.trim(line || "")); if (!m || !closesOnlyAtEnd(m[1])) { return null; } var parts = splitTemplateParams(m[1]); var file = $.trim(parts.shift()); if (!file) { return null; } var alt = ""; var caption = ""; var size = ""; var extra = []; $.each(parts, function (_, part) { var altMatch = /^\s*alt\s*=\s*([\s\S]*)$/i.exec(part); if (altMatch) { alt = $.trim(altMatch[1]); return; } if (IMAGE_SIZE.test(part)) { size = $.trim(part); return; } if (IMAGE_KEYWORD.test(part)) { extra.push($.trim(part)); return; } caption = $.trim(part); }); return { file: file, caption: caption, alt: alt, size: size, extra: extra }; } // Whether a link's inner text never closes the link early: "a.jpg|x]] [[Wêne:b.jpg|y" would otherwise // pass for one image holding the text of two. function closesOnlyAtEnd(inner) { var depth = 0; for (var i = 0; i < inner.length; i++) { var two = inner.substr(i, 2); if (two === "[[") { depth++; i++; } else if (two === "]]") { depth--; i++; if (depth < 0) { return false; } } } return depth === 0; } // A caption on a non-Kurdish entry is written in that language, so it is wrapped for the reader -- // unless whoever typed it already wrapped it themselves. function captionForLang(caption, lang) { var text = $.trim(caption || ""); if (!text || !lang || lang === "ku" || /^\{\{\s*zim\s*\|/i.test(text)) { return text; } return "{{zim|" + lang + "|" + text + "}}"; } // One "* {{dû|lang|kelîme|kelîme}}" line of a Dûnde list. function buildDundeLine(lang, words) { var kept = $.grep(words || [], function (w) { return !!$.trim(w); }); return kept.length ? "* {{dû|" + lang + "|" + $.map(kept, $.trim).join("|") + "}}" : ""; } // Regex source for a "== {{ziman|CODE}} ==" heading; codePattern is a regex fragment. No leading // newline: callers that want one prepend it, and callers that index into the page must not have it. function langHeaderSource(codePattern) { return "==\\s*\\{\\{\\s*ziman\\s*\\|\\s*(" + codePattern + ")\\s*\\}\\}\\s*=="; } /** * One TemplateData page in the shape the pickers actually want: the description, and one entry per * documented parameter in the template's own paramOrder. Labels and descriptions can be language maps, * so tdText picks the right one; null when the template has no TemplateData at all, which is common. * * Shaped once and kept, so the wizard's ⓘ popup, the citation form and DefSideBoxes' template dialog * share one request and one copy per template. */ var shapedCache = {}; function shapeTemplateDoc(doc) { if (!doc) { return null; } var params = []; (doc.paramOrder || Object.keys(doc.params || {})).forEach(function (key) { var p = (doc.params || {})[key]; if (!p) { return; } params.push({ key: key, label: tdText(p.label) || "", required: !!p.required, deprecated: !!p.deprecated }); }); return { desc: tdText(doc.description) || "", params: params }; } function templateDoc(name) { if (Object.prototype.hasOwnProperty.call(shapedCache, name)) { return $.Deferred().resolve(shapedCache[name]).promise(); } return fetchTemplateData(name).then(function (doc) { shapedCache[name] = shapeTemplateDoc(doc); return shapedCache[name]; }); } // Many at once, so a picker full of rows costs one request. Resolves once every name is shaped and in // the cache, which is what a caller that then reads templateDocNow() depends on. function templateDocBatch(names) { var wanted = $.grep(names || [], function (n) { return n && !Object.prototype.hasOwnProperty.call(shapedCache, n); }); if (!wanted.length) { return $.Deferred().resolve().promise(); } return fetchTemplateDataBatch(wanted).then(function () { return $.when.apply($, wanted.map(function (n) { return templateDoc(n); })); }); } // What is already known, without asking: null for a template nobody has fetched yet. For drawing a // list that must not wait, after templateDocBatch() has filled the cache. function templateDocNow(name) { return Object.prototype.hasOwnProperty.call(shapedCache, name) ? shapedCache[name] : null; } // ---- locating a section, and a definition inside it ---- // // One copy, shared: DefSideBoxes and add-examples both write into a numbered sense of a numbered // section, and both find it here. // Start and end offsets of one language section within the page. Throws when the page has no such // section, naming the code that was looked for. function langSectionRange(pageContent, language) { var langSectionIndex = pageContent.search(new RegExp(langHeaderSource(escapeRegExp(language)))); if (langSectionIndex === -1) { // Quoted: a stray space or wrong case in the code is invisible otherwise. throw new SubmitAbort("Xetayeke bi koda zimanî heye. Koda zimanî: " + JSON.stringify(language)); } var afterLangHeading = pageContent.indexOf("\n", langSectionIndex); afterLangHeading = afterLangHeading === -1 ? pageContent.length : afterLangHeading + 1; var nextLangSectionMatch = /\n==[^=\n][^\n]*==/.exec(pageContent.slice(afterLangHeading)); return { start: langSectionIndex, end: nextLangSectionMatch ? afterLangHeading + nextLangSectionMatch.index : pageContent.length }; } /** * The line index of one "=== ... ===" heading, and the lines to read it from. * * The heading is found by section key + ordinal, never by a DOM id number: MediaWiki's page-wide * anchor uniquification can attach a number to a heading that has nothing to do with its position. * The closing run is anchored to the opening one, or "=== Navdêra pirjimar ===" would count as a * "Navdêr" here while sectionTypeOf() rejects it, and the two ordinals would drift apart. * * A part of speech is usually "===", but an entry that groups its senses under numbered etymologies * writes it one level deeper ("=== Etîmolojî 1 ===" then "==== Lêker ===="). The depth is read off * the heading rather than assumed, and comes back with it: a subsection of that section is one * deeper again. * * lines covers the whole rest of the page from the language heading onward, not just this language's * own section: callers rebuild the saved page out of it, and truncating here would drop every later * language. Only the heading search itself is bounded, so a same-named heading in the next language * can never be matched by mistake. */ function locateSection(pageContent, language, sectionType, sectionOrdinal) { var headingNames = sections.headingNamesFor(sectionType); if (!headingNames) { throw new SubmitAbort("Navê beşê xelet e: " + JSON.stringify(sectionType)); } var langRange = langSectionRange(pageContent, language); var langSectionIndex = langRange.start; var lines = pageContent.slice(langSectionIndex).split("\n"); var searchEndLine = pageContent.slice(langSectionIndex, langRange.end).split("\n").length; // Every recognised heading name, so the ordinal counts headings of this kind and no others. var namePattern = Object.keys(sections.sectionNames).concat([MANE_SECTION]) .map(escapeRegExp).join("|"); var headingRegex = new RegExp("^(={3,6})[ ]*(" + namePattern + ")\\s*(\\d+)?[ ]*\\1"); var posLineIndex; var occurrence = 0; var depth = 3; for (posLineIndex = 0; posLineIndex < searchEndLine; posLineIndex++) { var m = headingRegex.exec(lines[posLineIndex]); var numbered = m ? 0 : numberedManeDepth(lines, posLineIndex); var name = m ? m[2] : (numbered ? MANE_SECTION : null); if (name && headingNames.indexOf(name) !== -1) { occurrence++; if (occurrence === sectionOrdinal) { depth = m ? m[1].length : numbered; break; } } } if (posLineIndex === searchEndLine) { throw new SubmitAbort("Di navê beşê de xetayek heye. Mihtemelen çend beş bi vî navî hene."); } return { langSectionIndex: langSectionIndex, lines: lines, posLineIndex: posLineIndex, depth: depth }; } // The "=" run for a heading depth, and a matcher for any heading at or above one (a smaller run is a // bigger section, so "at or above" means "this deep or shallower"). function headingMarks(depth) { return new Array(depth + 1).join("="); } function headingAtOrAbove(depth) { return new RegExp("^={2," + depth + "}[^=]"); } function headingAtDepth(depth) { var marks = headingMarks(depth); return new RegExp("^" + marks + "\\s*([^=]+?)\\s*" + marks + "\\s*$"); } /** * One heading found by its own text, and the lines around it. * * The section keys locateSection() knows cover the parts of speech; a heading like * "=== Etîmolojî ===" that sits beside them rather than under one is matched by its own text * instead, at any depth from "===" down. The ordinal counts headings carrying that same text within * the language, which is what the DOM side counts too. * * bodyEnd is the next heading of any depth: a section's own text is what lies between its heading and * the next one, so editing "=== Etîmolojî 1 ===" never reaches the parts of speech under it. */ function locateHeadingByText(pageContent, language, header, ordinal) { var langRange = langSectionRange(pageContent, language); var langSectionIndex = langRange.start; var lines = pageContent.slice(langSectionIndex).split("\n"); var searchEndLine = pageContent.slice(langSectionIndex, langRange.end).split("\n").length; var headingRegex = /^(={3,6})[ ]*(.+?)[ ]*\1\s*$/; var nextHeading = headingAtOrAbove(6); var occurrence = 0; for (var i = 0; i < searchEndLine; i++) { var m = headingRegex.exec(lines[i]); if (!m || m[2] !== header) { continue; } occurrence++; if (occurrence !== (ordinal || 1)) { continue; } var end = lines.length; for (var j = i + 1; j < lines.length; j++) { if (nextHeading.test(lines[j])) { end = j; break; } } return { langSectionIndex: langSectionIndex, lines: lines, headingLineIndex: i, depth: m[1].length, bodyStart: i + 1, bodyEnd: end }; } throw new SubmitAbort(util.msg.sectionMissing + header); } /** * The line index of one definition under a section heading. * * definitionLevel is the shape both gadgets already pass around: element 0 is the "type|ordinal" * string locateSection() has resolved, and the rest are 0-based indices, one per nesting level, so * ["Navdêr|1", 1, 0] is the first sub-sense of the second sense. Only "#" lines count -- "#:", "#*" * and "##" belong to a sense rather than starting one. */ function findDefinitionLine(lines, posLineIndex, definitionLevel) { var defIndex = -1; var level = 1; for (var i = posLineIndex; i < lines.length; i++) { var m = /^(#+)[^*#:]/.exec(lines[i]); if (m && m[1].length === level) { defIndex++; if (definitionLevel[level] === defIndex) { if (level === definitionLevel.length - 1) { return i; } level++; defIndex = -1; } } } throw new SubmitAbort("Nikare rêza vê maneyê di metnê de bibîne."); } // Parameter names a headword template reads as another: Modul:rêziman declares "z" alias_of "c", so // "z=m" and "c=m" are one gender. A numbered one maps the same way ("z2" is "c2"). var PARAM_ALIASES = { z: "c" }; function canonicalParamName(name) { var trimmed = $.trim(name || ""); var m = /^([a-z]+)(\d*)$/i.exec(trimmed); return m && Object.prototype.hasOwnProperty.call(PARAM_ALIASES, m[1]) ? PARAM_ALIASES[m[1]] + m[2] : trimmed; } // A named parameter of the first call in a line, read with the parser above rather than a pattern, so // a "c=" inside a nested template is never taken for the call's own. Names match canonically, so // asking for "c" also finds "z=". Empty when the line holds no closed call or the parameter is unset. function callParamValue(text, name) { var call = parseTemplateCalls($.trim(text || "")).calls[0]; if (!call) { return ""; } var values = splitCallParams(call.params).values; var want = canonicalParamName(name); var found = ""; Object.keys(values).forEach(function (key) { if (!found && values[key] && canonicalParamName(key) === want) { found = values[key]; } }); return found; } module.exports = { canonicalParamName: canonicalParamName, callParamValue: callParamValue, langHeaderSource: langHeaderSource, langSectionRange: langSectionRange, MANE_TAG_REGEX: MANE_TAG_REGEX, locateSection: locateSection, numberedGroupAbove: numberedGroupAbove, locateHeadingByText: locateHeadingByText, headingMarks: headingMarks, headingAtOrAbove: headingAtOrAbove, headingAtDepth: headingAtDepth, findDefinitionLine: findDefinitionLine, canonicalTemplateKey: canonicalTemplateKey, aliasPattern: aliasPattern, splitLeadingCalls: splitLeadingCalls, splitTemplateParams: splitTemplateParams, parseTemplateCalls: parseTemplateCalls, splitCallParams: splitCallParams, buildTemplateCall: buildTemplateCall, buildHbnrCall: buildHbnrCall, findHbnrCall: findHbnrCall, buildImageLine: buildImageLine, parseImageLine: parseImageLine, captionForLang: captionForLang, buildDundeLine: buildDundeLine, tdText: tdText, fetchTemplateData: fetchTemplateData, templateDoc: templateDoc, templateDocBatch: templateDocBatch, templateDocNow: templateDocNow, fetchTemplateDataBatch: fetchTemplateDataBatch, shortDesc: shortDesc, numberRepeatedPosHeadings: numberRepeatedPosHeadings, parseWordListCall: parseWordListCall, parseWordListCalls: parseWordListCalls, namedParam: namedParam, withNamedParam: withNamedParam, buildWordListCall: buildWordListCall, parseBulletWordList: parseBulletWordList }; // </nowiki> }()); 92ug9k8y6u2czgpy61dhv68mtao7eni MediaWiki:Gadget-wikt.edit/langs.js 8 1359160 6533063 6414254 2026-09-19T10:14:03Z Wikihez 7344 Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js 6533063 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.edit/langs.js]] */ // ~300 common languages ship with the gadget; the remaining ~3400 are fetched from the translation // editor's copy only when a search finds nothing in the short list. ( function () { "use strict"; var core = require( "./ziman-core.json" ); var FULL_PAGE = "MediaWiki:Gadget-translation editor.js/ziman.json"; var full = null; var pending = null; var listeners = []; // {code: name} -- the full list once it has arrived, the short one until then. function names() { return full || core; } function isFull() { return !!full; } // Resolves with the full list, fetched once; falls back to the short list rather than rejecting. function ensureFull() { if ( full ) { return $.Deferred().resolve( full ).promise(); } if ( pending ) { return pending; } pending = $.get( { url: mw.util.getUrl( FULL_PAGE, { action: "raw" } ), dataType: "text" } ).then( function ( text ) { try { full = $.extend( {}, core, JSON.parse( text ) ); } catch ( e ) { full = core; } pending = null; listeners.forEach( function ( fn ) { fn( full ); } ); return full; }, function () { pending = null; return core; } ); return pending; } // True when the text names no language the short list knows -- the cue to go and fetch the rest. function missingFromCore( query ) { var wanted = $.trim( query || "" ).toLowerCase(); if ( !wanted || full ) { return false; } var found = false; Object.keys( core ).some( function ( code ) { if ( code.toLowerCase().indexOf( wanted ) !== -1 || core[ code ].toLowerCase().indexOf( wanted ) !== -1 ) { found = true; return true; } return false; } ); return !found; } // Called with the full list when it lands, so a picker built from the short one can rebuild itself. function onFull( fn ) { if ( full ) { fn( full ); } else { listeners.push( fn ); } } // One <datalist> for the whole page: 3693 options are far too many to rebuild per form, and a list // can be shared by id, so every language box in every gadget points at this one. var DATALIST_ID = "dsb-language-list"; function fillDatalist( $list ) { var all = names(); $list.empty(); Object.keys( all ).forEach( function ( code ) { $list.append( $( "<option></option>" ).val( code ).attr( "label", all[ code ] ) ); } ); } function datalistId() { if ( !document.getElementById( DATALIST_ID ) ) { var $list = $( "<datalist></datalist>" ).attr( "id", DATALIST_ID ); fillDatalist( $list ); $( document.body ).append( $list ); // Refilled in place if the long list ever arrives, so every box using it grows at once. onFull( function () { fillDatalist( $( "#" + DATALIST_ID ) ); } ); } return DATALIST_ID; } module.exports = { names: names, isFull: isFull, ensureFull: ensureFull, missingFromCore: missingFromCore, onFull: onFull, datalistId: datalistId }; }() ); // </nowiki> gz0t5o06ruekajg8el6j72y3uqg5eo5 MediaWiki:Gadget-wikt.edit/data-main.json 8 1359163 6533065 6426116 2026-09-19T10:14:14Z Wikihez 7344 Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js 6533065 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîrasmayî", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîr", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "dariştî", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "drş", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qertaf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserqismî", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserq", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denominal", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denom" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "g", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ], "only": [ "qertaf" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ], "only": [ "qertaf" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ], "only": [ "wergirtin" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ], "only": [ "ji", "dariştî" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag", "primary": true }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text", "primary": true }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } j4njrkz0my1aquhha40j6bfgz54a320 6533230 6533065 2026-09-19T10:40:20Z Wikihez 7344 Etymology: gender is c in the builder, with z and g as aliases 6533230 json application/json { "langChoices": { "ku": "kurmancî", "zza": "zazakî", "ckb": "soranî", "sdh": "kurdiya başûrî", "hac": "hewramî", "de": "almanî", "ar": "erebî", "fa": "farisî", "fr": "fransî", "fi": "fînî", "en": "îngilîzî", "ja": "japonî", "sv": "swêdî", "tr": "tirkî" }, "posExamples": { "navdêr": "Kelîmeyên ji bo tiştan (sêv, heywan, qedeh) yan terman (dilşadî, bextiyarî hwd.) di rêzimanê de.", "lêker": "Kelîmeyên ji bo kirin an bûyînê wekî 'nivîsîn' yan 'xeber dan'.", "rengdêr": "Kelîmeyên ku wesfa navdêran nîşan didin wekî 'sêva sor' yan 'xwarina şîrîn'.", "hoker": "Kelîmeyên ku dem, cih yan awayê kirinê diyar dikin wekî 'bi vî awayî' yan 'demkî'.", "daçek": "Kelîmeyên ku cih, dem yan hereketê diyar dikin wekî 'di.. de' yan 'ji'.", "cînav": "Kelîmeyên ku li şûna navdêran tên bikaranîn daku navdêr neyên dubarekirin wekî 'ew' yan 'em'.", "baneşan": "Kelîmeyên ku hest, deng hwd. îfade dikin wekî 'noşî!' yan 'aferîn'.", "serenav": "Navdêrên ku şexsiyetên ferdî nîşan didin, wek navên kes, cih an organîzasyonan nimûne 'London' yan 'Diyarbekir'.", "gotineke pêşiyan": "Gotinên ku di nav xelkê de bi berbelavî tên bikaranîn bo nimûne 'Serê neêşe ne hewceyî destmalê ye'." }, "genderLabels": { "m": "mê", "n": "nêr", "nt": "nêtar", "mn": "mê yan nêr", "mnmane": "mê yan nêr li gorî maneyê", "mndudil": "mê yan nêr bikaranîn dudil e", "g": "giştî", "y": "yekjimar", "p": "pirjimar" }, "tplDefs": { "rastnivîs": { "langs": [ "ku" ], "noLang": true }, "ku-Latn": { "langs": [ "ku" ], "noLang": true }, "ku-tewîna-nav": { "langs": [ "ku" ], "noLang": true }, "sdh-Arab": { "langs": [ "sdh" ], "noLang": true }, "hac-Arab": { "langs": [ "hac" ], "noLang": true }, "ja-romanîzekirin": { "langs": [ "ja" ], "noLang": true }, "ckb-Arab": { "langs": [ "ckb" ], "noLang": true }, "zza-awayê-Jacobsonê": { "langs": [ "zza" ] }, "awayekî din": { "langs": null }, "guharto": { "langs": null }, "hevmaneya": { "langs": null }, "kevnbûyî": { "langs": null }, "kêmpeyda": { "langs": null }, "kurtkirin": { "langs": null }, "paşnav": { "langs": null }, "şaşnivîs": { "langs": null } }, "jederDefs": { "jêder-kitêb": { "label": "Kitêb", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "beş", "label": "Beş", "span": 3, "width": "medium" }, { "key": "cih", "label": "Cih", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "sala-weşandinê", "label": "Sala weşandinê", "span": 2, "width": "narrow" }, { "key": "çap", "label": "Çap", "span": 1, "width": "narrow" }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "rûpel", "label": "Rûpel", "span": 1, "width": "narrow" }, { "key": "isbn", "label": "ISBN", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-kovar": { "label": "Kovar", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 3 }, { "key": "terciman", "label": "Terciman", "span": 3 }, { "key": "amadekar", "label": "Amadekar", "span": 3 }, { "key": "weşanxane", "label": "Weşanxane", "span": 3 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "kovar", "label": "Kovar", "span": 4 }, { "key": "cild", "label": "Cild", "span": 2, "width": "narrow" }, { "key": "hejmar", "label": "Hejmar", "span": 2, "width": "narrow" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" }, { "key": "rûpel", "label": "Rûpel", "span": 2, "width": "narrow" }, { "key": "issn", "label": "ISSN", "span": 2, "width": "narrow" }, { "key": "doi", "label": "DOI", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ] }, "jêder-websîte": { "label": "Websîte", "fields": [ { "key": "nivîskar", "label": "Nivîskar", "span": 4 }, { "key": "terciman", "label": "Terciman", "span": 4 }, { "key": "websîte", "label": "Websîte", "span": 4 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "url", "label": "URL", "span": 5 }, { "key": "urlya-arşîvê", "label": "URLya Arşîvê", "span": 5 }, { "key": "roja-arşîvê", "label": "Roja arşîvê", "span": 3, "width": "medium" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" }, { "key": "sal", "label": "Sal", "span": 1, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3, "width": "medium" } ] }, "jêder-vîdeo": { "fields": [ { "key": "hunermend", "label": "Hunermend", "span": 6 }, { "key": "platform", "label": "Platform", "span": 6 }, { "key": "sernav", "label": "Sernav", "multiline": true, "span": 12, "width": "wide" }, { "key": "sal", "label": "Sal", "span": 2, "width": "narrow" }, { "key": "tarîx", "label": "Tarîx", "span": 3 }, { "key": "dem", "label": "Dem", "span": 2, "width": "narrow" }, { "key": "url", "label": "URL", "span": 12, "width": "wide" }, { "key": "tarîxa-gihiştinê", "label": "Tarîxa gihiştinê", "span": 3, "width": "medium" } ], "label": "Vîdeo" } }, "pronTpls": { "ku-IPA": { "desc": "IPAya otomatîk ji bo kurmancî (kontrol hewce ye)", "snippet": "* {{ku-IPA}}", "langs": [ "ku" ], "noLang": true }, "ku-kîte": { "desc": "Hecekirina otomatîk ji bo kurmancî", "snippet": "* {{ku-kîte}}", "langs": [ "ku" ], "noLang": true }, "zza-IPA": { "desc": "IPAya otomatîk ji bo zazakî", "snippet": "* {{zza-IPA}}", "langs": [ "zza" ], "noLang": true }, "zza-kîte": { "desc": "Hecekirina otomatîk ji bo zazakî", "snippet": "* {{zza-kîte}}", "langs": [ "zza" ], "noLang": true }, "IPA": { "desc": "Alfabeya fonetîk a navmiletî (IPA)", "snippet": "* {{IPA|CODE|/…/}}" }, "deng": { "desc": "Nimûneya telafûzê bi dosyeya dengî", "snippet": "* {{deng|CODE|navê_dosyayê.ogg|dever=}}" }, "bilêv": { "desc": "{{bilêv|herf|nerm, req|hejmar}}", "snippet": "* {{bilêv|herf|cure|hejmar}}" }, "kîte": { "desc": "Şablona hecekirinê", "snippet": "* {{kîte|CODE|he|ce}}" }, "hevdeng": { "desc": "Hevdeng — gotinên bi heman dengî", "snippet": "* {{hevdeng|CODE|…}}" } }, "etymTpls": { "etîmon": { "desc": "Etîmolojiya birêkûpêk: zincîr, dar û kategorî — {{etîmon|ku|:deyn|fa:پنجه\u003Ct:dest\u003E|metn=++}}", "snippet": "{{etîmon|CODE}}" }, "ji": { "desc": "Ji zimanekî din hatiye — {{ji|en|ku|anatomy|tr=|t=}}", "snippet": "{{ji|SOURCELANG|CODE|…}}" }, "deyn": { "desc": "Deynkirî — {{deyn|lang|kod|kelîme}}", "snippet": "{{deyn|SOURCELANG|CODE|…}}" }, "mîr": { "desc": "Mîrasmayî — {{mîr|lang|kod|kelîme}}", "snippet": "{{mîr|SOURCELANG|CODE|…}}" }, "qertaf": { "desc": "Ji bo pêşgir, paşgir û hevedudanî — {{qertaf|kod|pêşgir-|reh}}", "snippet": "{{qertaf|CODE|…|…}}" }, "anlz": { "desc": "Wekî qertaf lê dibêje analîza şiklî — {{anlz|kod|pêşgir-|reh}}", "snippet": "{{anlz|CODE|…|…}}" }, "q": { "desc": "Referans bo rûpelekê — {{q|kod|kelîme}} navê zimanî dernakeve", "snippet": "{{q|CODE|…}}" }, "hv": { "desc": "Hevreh — {{hv|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{hv|SOURCELANG|…}}" }, "nh": { "desc": "Nehevreh — {{nh|lang|kelîme}} navê zimanî derdikeve", "snippet": "{{nh|SOURCELANG|…}}" }, "cotreh": { "desc": "Cotreh — teror {{cotreh|ku|tirs}}", "snippet": "{{cotreh|CODE|…}}" }, "yekser": { "desc": "tercimeya yekser — {{yekser|lang|kod|kelîme}}", "snippet": "{{yekser|SOURCELANG|CODE|…}}" }, "wergirtin": { "desc": "Wergirtina maneyê — {{wergirtin|lang|kod|kelîme}}", "snippet": "{{wergirtin|SOURCELANG|CODE|…}}" }, "paşvesazî": { "desc": "Paşvesazî — greed {{paşvesazî|en|greedy}}", "snippet": "{{paşvesazî|CODE|…}}" }, "qusandin": { "desc": "Qusandin — Miho {{qusandin|ku|Mihemmed}}", "snippet": "{{qusandin|CODE|…}}" }, "têkilkirin": { "desc": "Têkilkirin — sormancî {{têkilkirin|ku|soranî|kurmancî}}", "snippet": "{{têkilkirin|CODE|…}}" }, "nyz": { "desc": "Nayê zanîn — {{nyz|ku|hûr=1}}", "snippet": "{{nyz|CODE}}" }, "onom": { "desc": "Onomatopoetîk — {{onom|ku|hûr=1}}", "snippet": "{{onom|CODE}}" }, "navmiletî": { "desc": "Navmiletî — {{navmiletî|ku|hûr=1}}", "snippet": "{{navmiletî|CODE}}" }, "neo": { "desc": "neolojîzm — {{neolojîzm|ku|hûr=1}}", "snippet": "{{neolojîzm|CODE}}" } }, "etimon": { "keywords": [ { "key": "mîrasmayî", "desc": "Kelîmeya ku ji zimanê bav û kalan maye", "aliases": [ "mîr", "inh" ] }, { "key": "deyn", "desc": "Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin", "aliases": [ "bor", "borrowed" ] }, { "key": "deynh", "desc": "Deynkirina hînbûyî: ne bi riya têkiliya rojane, bi qesd hatiye girtin", "aliases": [ "lbor" ] }, { "key": "deynhq", "desc": "Deynkirina hînbûyî ya ku hinekî hatiye guhertin", "aliases": [ "slbor" ] }, { "key": "deynort", "desc": "Deynkirina ortografîk", "aliases": [ "obor" ] }, { "key": "deynne", "desc": "Deynkirina neadaptekirî", "aliases": [ "ubor" ] }, { "key": "dariştî", "desc": "Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be", "aliases": [ "drş", "der" ] }, { "key": "ji", "desc": "Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e", "aliases": [ "from" ] }, { "key": "drşnd", "desc": "Dariştin heye lê cureyê wê ne diyar e", "aliases": [ "uder" ] }, { "key": "qertaf", "desc": "Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e", "aliases": [ "qf", "af" ] }, { "key": "reh", "desc": "Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e (\"Peyvên … yên aîdî rehê …\") û di metn û darê de xuya nabe", "aliases": [ "root" ], "invisible": true }, { "key": "yekser", "desc": "Wergerandina yekser; zincîr li vir disekine", "aliases": [ "cal", "clq" ] }, { "key": "yekserqismî", "desc": "Wergerandina yekser a qismî; zincîr li vir disekine", "aliases": [ "yekserq", "pcal" ] }, { "key": "wergirtin", "desc": "Wergirtina maneyê; mana wergirtî bi \u003Cmaneid:…\u003E tê nîşankirin", "aliases": [ "sl" ] }, { "key": "lihevanîn", "desc": "Lihevanîna dengî-maneyî", "aliases": [ "psm" ] }, { "key": "tesîr", "desc": "Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine", "aliases": [ "influence" ] }, { "key": "têkilkirin", "desc": "Têkilkirina du kelîmeyan", "aliases": [ "blend" ], "min": 2 }, { "key": "ûnîverbasyon", "desc": "Ûnîverbasyon", "aliases": [ "ûnîv", "univ" ] }, { "key": "qusandin", "desc": "Qusandin", "aliases": [ "clip" ] }, { "key": "paşvesazî", "desc": "Paşvesazî", "aliases": [ "bf" ] }, { "key": "elîpsîz", "desc": "Elîpsîz", "aliases": [ "elîp", "ellip" ] }, { "key": "nomînalîzasyon", "desc": "Nomînalîzasyon", "aliases": [ "nomîn", "nom" ] }, { "key": "translîterasyon", "desc": "Translîterasyon", "aliases": [ "translît", "translit" ] }, { "key": "redûblîkasyon", "desc": "Redûblîkasyon", "aliases": [ "redûb", "redup" ] }, { "key": "kurtkirin", "desc": "Kurtkirina kelîmeyekê", "aliases": [ "abbr" ] }, { "key": "sylabbr", "desc": "Kurtkirin li gorî kîteyan", "aliases": [ "syllabic abbreviation", "sylabbrev" ] }, { "key": "akronîm", "desc": "Akronîm", "aliases": [ "acro" ] }, { "key": "înîtîalîzm", "desc": "Înîtîalîzm", "aliases": [ "înît", "init" ] }, { "key": "metatez", "desc": "Metatez", "aliases": [ "meta" ] }, { "key": "afeq", "desc": "Wek :qf, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike", "invisible": true }, { "key": "apheresis", "desc": "Şiklê ku dengê destpêkê winda kiriye", "aliases": [ "apheretic", "aphetic" ] }, { "key": "denominal", "desc": "Fiîla ji îsmekê çêbûyî", "aliases": [ "denom" ] }, { "key": "deverbal", "desc": "Kelîmeya ji fiîlekê çêbûyî" }, { "key": "vrd", "desc": "Dariştina vṛddhî (sanskrîtî); bi qertaf: :vrd-af" }, { "key": "sa-af", "desc": "Pêkhateya sanskrîtî", "min": 2 } ], "wordMods": [ { "key": "t", "desc": "Tercimeya kelîmeyê bi kurmancî", "aliases": [ "w" ] }, { "key": "tr", "desc": "Translîterasyon" }, { "key": "ts", "desc": "Transkrîpsiyon" }, { "key": "cuda", "desc": "Şiklê ku tê nîşandan, eger ne wek navê rûpelê be", "aliases": [ "alt" ] }, { "key": "id", "desc": "Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê", "aliases": [ "pos" ], "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "c", "desc": "Cinsiyet: n (nêr), m (mê), nt (nêtar)", "values": [ "n", "m", "nt" ], "aliases": [ "z", "g" ] }, { "key": "q", "desc": "Wesf li pêşiyê kelîmeyê" }, { "key": "qq", "desc": "Wesf li pey kelîmeyê" }, { "key": "hrf", "desc": "Mana herfiyen", "aliases": [ "lit" ] }, { "key": "ref", "desc": "Çavkanî; binêre #Çavkanî" }, { "key": "nediyar", "desc": "Ev gav ne teqez e", "flag": true, "aliases": [ "unc" ] }, { "key": "crztip", "desc": "Kelîme ji bo kategoriyan wek reh yan kelîme tê hesibandin", "aliases": [ "postype" ], "values": [ "reh", "kelîme" ] }, { "key": "etimon", "desc": "Etîmolojiya di cih de; binêre jor", "aliases": [ "ety" ] }, { "key": "aftype", "desc": "Di nav :qf de: cureyê qertafê; binêre #Cureyên qertafan", "values": [ "pêşgir", "paşgir", "navgir", "circumfix", "infix", "non-affix", "root" ], "only": [ "qertaf" ] }, { "key": "deyn", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynh", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] }, { "key": "deynhq", "desc": "Di nav :qf de: ev parçe deynkirî ye", "flag": true, "only": [ "qertaf" ] } ], "keywordMods": [ { "key": "unc", "desc": "Ev gav ne teqez e: \"Mihtemelen…\"", "flag": true }, { "key": "grdk", "desc": "Girêdeka di navbera kelîmeyên jêder de, li şûna \"yan jî\"", "aliases": [ "conj" ] }, { "key": "anlz", "desc": "Analîza şiklî", "flag": true, "aliases": [ "surf" ] }, { "key": "hrf", "desc": "Di nav :qf de: mana herfiyen", "aliases": [ "lit" ], "only": [ "qertaf" ] }, { "key": "maneid", "desc": "Di nav :wergirtin de: nasnameya maneya wergirtî", "aliases": [ "senseid" ], "only": [ "wergirtin" ] }, { "key": "metn", "desc": "Di nav :ji û :drş de: metnekî din li şûna \"Ji\"", "aliases": [ "text" ], "only": [ "ji", "dariştî" ] }, { "key": "ref", "desc": "Çavkaniya vê gavê" } ], "metnChoices": [ { "value": "++", "desc": "Tevahiya zincîrê" }, { "value": "+", "desc": "Tenê gava pêşîn" }, { "value": "*", "desc": "Heta kelîmeya pêşîn a ku rûpela wê heye" }, { "value": "1", "desc": "Ewqas gav (hejmarek)", "free": true }, { "value": ":", "desc": "Heta zimanê bi wê kodê (:kod)", "free": true }, { "value": ":*", "desc": "Heta wî zimanî, eger rûpela wî tune be heta ya pêşîn a heyî (:kod*)", "free": true } ], "afTypes": [ { "key": "pêşgir", "desc": "Pêşgir" }, { "key": "paşgir", "desc": "Paşgir" }, { "key": "navgir", "desc": "Navgir" }, { "key": "circumfix", "desc": "Dorgir" }, { "key": "infix", "desc": "Nawgir (infix)" }, { "key": "non-affix", "desc": "Ne qertaf" }, { "key": "root", "desc": "Reh" } ], "params": [ { "key": "dar", "desc": "Bi 1 dara etîmolojiyê nîşan dide.", "type": "flag", "primary": true }, { "key": "id", "desc": "Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan.", "type": "text", "primary": true }, { "key": "title", "desc": "Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be.", "type": "text" }, { "key": "crz", "desc": "Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: reh, kelîme, pêşgir, paşgir, navgir.", "type": "select", "values": [ "reh", "kelîme", "pêşgir", "paşgir", "navgir" ] }, { "key": "cotreh", "desc": "Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda.", "type": "text" }, { "key": "tarîxa-etîm", "desc": "Tarîxa peyitandina pêşîn, wek 1901, 1500s, 14c, c,1900, before,1850, r,1501,1558.", "type": "text" }, { "key": "niqtena", "desc": "Bi 1 niqteya dawiyê nayê zêdekirin.", "type": "flag" }, { "key": "niqte", "desc": "Li şûna niqteya dawiyê nîşaneke din.", "type": "text" }, { "key": "katna", "desc": "Bi 1 kategorî nayên zêdekirin. Herwiha {{para|nekat}}.", "type": "flag" }, { "key": "darna", "desc": "Bi 1 ev etîmolojî di dara rûpelên din de dernakeve.", "type": "flag" }, { "key": "exnihilo", "desc": "Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin.", "type": "flag" } ] }, "metadata": { "aa": { "haswikt": 1, "sc": [ "Latn", "Ethi" ] }, "ab": { "haswikt": 1, "sc": [ "Cyrl", "Latn", "Geor" ] }, "aer": { "sc": "Latn" }, "af": { "g": [ "y", "p" ], "haswikt": 1 }, "ak": { "haswikt": 1 }, "akk": { "g": [ "n", "m", "n-p", "m-p" ], "sc": "Xsux" }, "als": { "haswikt": 1 }, "am": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1, "sc": "Ethi" }, "an": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ang": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "ar": { "g": [ "n", "m", "n-p", "m-p", "p" ], "alt": 1, "haswikt": 1, "sc": "Arab" }, "arc": { "g": [ "n", "m", "n-p", "m-p" ], "sc": [ "Hebr", "Syrc" ] }, "are": {}, "arz": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "sc": "Arab" }, "as": { "haswikt": 1, "sc": "Beng" }, "ast": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "av": { "haswikt": 1 }, "ay": { "haswikt": 1 }, "az": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl", "Arab" ] }, "ba": { "g": [ "y", "p" ], "sc": "Cyrl" }, "bar": {}, "bat-smg": { "g": [ "n", "m", "n-p", "m-p" ] }, "bbl": { "sc": "Geor" }, "be": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "be-x-old": { "sc": "Cyrl" }, "bg": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "bh": { "haswikt": 1, "sc": "Deva" }, "bhb": { "sc": "Deva" }, "bi": { "haswikt": 1 }, "blt": { "sc": "Tavt" }, "bm": { "haswikt": 1, "sc": [ "Latn", "Nkoo", "Arab" ] }, "bn": { "haswikt": 1, "sc": "Beng" }, "bo": { "haswikt": 1, "sc": "Tibt" }, "br": { "g": [ "n", "m" ], "haswikt": 1 }, "ca": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "cdo": { "sc": "Hani" }, "ce": { "sc": "Cyrl" }, "ch": { "haswikt": 1 }, "chr": { "haswikt": 1, "sc": "Cher" }, "cjy": { "sc": "Hani" }, "ckb": { "haswikt": 1, "sc": "Arab", "wsc": "ku-Arab" }, "cmn": { "sc": "Hani", "wiktprefix": "zh" }, "co": { "haswikt": 1 }, "cpx": { "sc": "Hani" }, "cr": { "haswikt": 1, "sc": "Cans" }, "crh": {}, "cs": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "csb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "cu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": [ "Cyrs", "Glag" ] }, "cv": { "sc": "Cyrl" }, "cy": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "czh": { "sc": "Hani" }, "czo": { "sc": "Hani" }, "da": { "g": [ "g", "nt", "g-p", "nt-p", "p" ], "haswikt": 1 }, "dax": {}, "de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "allowCaps": 1 }, "dhg": {}, "djb": {}, "dji": {}, "djr": {}, "dng": { "sc": "Cyrl" }, "dsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "dsx": {}, "duj": {}, "dv": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Thaa" }, "dz": { "haswikt": 1, "sc": "Tibt" }, "el": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "en": { "g": [ "y", "p" ], "haswikt": 1 }, "eo": { "g": [ "y", "p" ], "haswikt": 1 }, "es": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "et": { "g": [ "y", "p" ], "haswikt": 1 }, "ett": { "g": [ "y", "p" ], "sc": "Ital" }, "eu": { "g": [ "y", "p" ], "haswikt": 1 }, "fa": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Arab", "wsc": "fa-Arab" }, "fa-cls": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fa-ira": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "fi": { "g": [ "y", "p" ], "haswikt": 1 }, "fil": {}, "fj": { "haswikt": 1 }, "fo": { "g": [ "n", "m", "nt" ], "haswikt": 1 }, "fr": { "g": [ "n", "m", "mnmane", "n-p", "m-p", "p" ], "haswikt": 1 }, "frm": { "g": [ "n", "m", "n-p", "m-p" ] }, "fro": { "g": [ "n", "m", "n-p", "m-p" ] }, "fur": { "g": [ "n", "m", "n-p", "m-p" ] }, "fy": { "g": [ "g", "nt", "p" ], "haswikt": 1 }, "ga": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "gan": { "sc": "Hani" }, "gd": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gez": { "sc": "Ethi" }, "gl": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "gmw-ecg": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gmy": { "sc": "Linb" }, "gn": { "haswikt": 1 }, "gnn": { "sc": "Latn" }, "got": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "sc": "Goth" }, "grc": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ] }, "gsw": { "g": [ "n", "m", "nt", "p" ], "allowCaps": 1 }, "gu": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Gujr" }, "guf": { "sc": "Latn" }, "gv": { "haswikt": 1 }, "ha": { "haswikt": 1 }, "hak": { "sc": "Hani" }, "har": { "sc": "Ethi" }, "he": { "alt": 1, "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "hi": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Deva" }, "hif": { "sc": [ "Latn", "Deva" ] }, "hit": { "sc": "Xsux" }, "hrx": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "hsb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "hsn": { "sc": "Hani" }, "hu": { "g": [ "y", "p" ], "haswikt": 1 }, "hy": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Armn" }, "ia": { "haswikt": 1 }, "id": { "haswikt": 1 }, "ie": { "haswikt": 1 }, "ik": { "haswikt": 1 }, "ike": { "sc": "Cans" }, "ikt": { "sc": "Cans" }, "io": { "haswikt": 1 }, "is": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "it": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "iu": { "haswikt": 1, "sc": "Cans" }, "ja": { "haswikt": 1, "sc": "Jpan" }, "jay": { "sc": "Latn" }, "jbo": { "haswikt": 1 }, "jv": { "haswikt": 1 }, "ka": { "g": [ "y", "p" ], "haswikt": 1 }, "khb": { "sc": [ "Talu", "Lana", "Thai" ] }, "kjh": { "sc": "Cyrl" }, "kk": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "kkh": { "sc": [ "Lana", "Thai" ] }, "kl": { "haswikt": 1 }, "km": { "haswikt": 1, "sc": "Khmr" }, "kn": { "haswikt": 1, "sc": "Knda" }, "ku": { "g": [ "n", "m", "mnmane", "mndudil", "n-p", "m-p", "p" ], "wiktprefix": "ku" }, "ko": { "haswikt": 1, "sc": "Kore" }, "krc": { "g": [ "y", "p" ], "sc": "Cyrl" }, "ks": { "haswikt": 1, "sc": [ "Arab", "Deva" ], "wsc": "ks-Arab" }, "kw": { "haswikt": 1 }, "ky": { "haswikt": 1, "g": [ "y", "p" ], "sc": "Cyrl" }, "la": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "lb": { "g": [ "n", "m", "nt", "p" ], "haswikt": 1, "allowCaps": 1 }, "lez": { "sc": "Cyrl" }, "li": { "haswikt": 1 }, "lki": { "wiktprefix": "ku" }, "lld": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lmo": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "ln": { "haswikt": 1 }, "lo": { "haswikt": 1, "sc": "Laoo" }, "lt": { "alt": 1, "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lv": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "lzz": { "sc": "Geor" }, "mg": { "haswikt": 1 }, "mh": { "haswikt": 1 }, "mi": { "g": 0, "haswikt": 1 }, "mk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ml": { "haswikt": 1, "sc": "Mlym" }, "mn": { "g": [ "y", "p" ], "haswikt": 1, "sc": [ "Cyrl", "Mong" ] }, "mnp": { "sc": "Hani" }, "mo": { "haswikt": 1, "sc": "Cyrl" }, "mol": { "sc": "Cyrl" }, "mr": { "g": [ "n", "m", "nt" ], "haswikt": 1, "sc": "Deva" }, "ms": { "haswikt": 1, "sc": [ "Latn", "Arab" ] }, "mt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "mwp": { "sc": "Latn" }, "my": { "haswikt": 1, "sc": "Mymr" }, "na": { "haswikt": 1 }, "nah": { "haswikt": 1 }, "nan": { "wiktprefix": "zh-min-nan", "sc": "Hani" }, "nb": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "wiktprefix": "no" }, "nds-de": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "nds-nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "ne": { "haswikt": 1, "sc": "Deva" }, "nl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nn": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "no": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1 }, "nod": { "sc": "Lana" }, "non": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "oc": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "om": { "haswikt": 1 }, "or": { "haswikt": 1, "sc": "Orya" }, "orv": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrs" }, "osc": { "sc": "Ital" }, "ota": { "g": [ "y", "p" ], "sc": "Arab", "wsc": "ota-Arab" }, "pa": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": [ "Guru", "Arab" ] }, "pdt": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "nds" }, "peo": { "sc": "Xpeo" }, "phn": { "sc": "Phnx" }, "pi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1 }, "pjt": { "sc": "Latn" }, "pl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "pms": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "pox": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "împf", "pf" ] }, "prs": { "wiktprefix": "fa", "sc": "Arab", "wsc": "fa-Arab" }, "ps": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ps-Arab" }, "pt": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1 }, "qu": { "haswikt": 1 }, "rgn": { "g": [ "n", "m", "n-p", "m-p" ] }, "rit": { "sc": "Latn" }, "rm": { "g": [ "n", "m" ], "haswikt": 1 }, "rn": { "haswikt": 1 }, "ro": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "roa-rup": { "haswikt": 1 }, "ru": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "rue": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "sc": "Cyrl" }, "ruo": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rup": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "wiktprefix": "roa-rup" }, "ruq": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "rw": { "haswikt": 1 }, "sa": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ], "haswikt": 1, "sc": "Deva" }, "sah": { "sc": "Cyrl" }, "sc": { "haswikt": 1 }, "scn": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "sco": { "sc": "Latn" }, "sd": { "haswikt": 1, "sc": "Arab", "wsc": "sd-Arab" }, "sdh": { "sc": "Arab", "wiktprefix": "ku" }, "sg": { "haswikt": 1 }, "sh": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": [ "Latn", "Cyrl" ] }, "si": { "haswikt": 1, "sc": "Sinh" }, "simple": { "haswikt": 1 }, "sk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sl": { "alt": 1, "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1 }, "sm": { "haswikt": 1 }, "sn": { "haswikt": 1 }, "so": { "haswikt": 1 }, "spx": { "sc": "Ital" }, "sq": { "g": [ "n", "m" ], "haswikt": 1 }, "ss": { "haswikt": 1 }, "st": { "haswikt": 1 }, "su": { "haswikt": 1 }, "sux": { "sc": "Xsux" }, "sv": { "g": [ "g", "nt", "g-p", "nt-p" ], "haswikt": 1 }, "sva": { "sc": "Geor" }, "sw": { "nclass": 1, "haswikt": 1 }, "syc": { "sc": "Syrc" }, "syr": { "sc": "Syrc" }, "szl": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ] }, "ta": { "haswikt": 1, "sc": "Taml" }, "tdd": { "sc": "Tale" }, "te": { "haswikt": 1, "sc": "Telu" }, "tg": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Cyrl" }, "th": { "haswikt": 1, "sc": "Thai" }, "ti": { "haswikt": 1, "sc": "Ethi" }, "tig": { "sc": "Ethi" }, "tiw": { "sc": "Latn" }, "tk": { "g": [ "y", "p" ], "haswikt": 1 }, "tl": { "haswikt": 1, "sc": [ "Latn", "Tglg" ] }, "tmr": { "sc": "Hebr" }, "tn": { "haswikt": 1 }, "to": { "haswikt": 1 }, "tpi": { "haswikt": 1 }, "tr": { "g": [ "y", "p" ], "alt": 1, "haswikt": 1 }, "ts": { "haswikt": 1 }, "tt": { "g": [ "y", "p" ], "haswikt": 1 }, "tts": { "sc": "Thai" }, "tw": { "haswikt": 1 }, "udi": { "sc": [ "Cyrl", "Latn", "Armn", "Geor" ] }, "ug": { "g": [ "y", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ug-Arab" }, "uga": { "sc": "Ugar" }, "uk": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p", "împf", "pf" ], "haswikt": 1, "sc": "Cyrl" }, "ulk": { "sc": "Latn" }, "ur": { "g": [ "n", "m", "n-p", "m-p", "p" ], "haswikt": 1, "sc": "Arab", "wsc": "ur-Arab" }, "uz": { "g": [ "y", "p" ], "haswikt": 1 }, "vec": { "g": [ "n", "m", "n-p", "m-p" ], "haswikt": 1 }, "vi": { "haswikt": 1 }, "vls": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p" ] }, "vo": { "haswikt": 1 }, "wa": { "haswikt": 1 }, "wbp": { "sc": "Latn" }, "wo": { "haswikt": 1 }, "wuu": { "sc": "Hani" }, "xae": { "sc": "Ital" }, "xcr": { "sc": "Cari" }, "xfa": { "sc": "Ital" }, "xh": { "alt": 1, "nclass": 1, "haswikt": 1 }, "xlc": { "sc": "Lyci" }, "xld": { "sc": "Lydi" }, "xlu": { "sc": "Xsux" }, "xmf": { "sc": "Geor" }, "xno": { "g": [ "n", "m", "n-p", "m-p" ] }, "xrr": { "sc": "Ital" }, "xst": { "sc": "Ethi" }, "xum": { "sc": "Ital" }, "xve": { "sc": "Ital" }, "xvo": { "sc": "Ital" }, "yi": { "g": [ "n", "m", "nt", "n-p", "m-p", "nt-p", "p" ], "haswikt": 1, "sc": "Hebr" }, "yo": { "haswikt": 1 }, "yua": { "g": [ "y", "p" ], "alt": 1 }, "yue": { "sc": "Hani" }, "za": { "haswikt": 1, "sc": "Latn" }, "zh-classical": { "sc": "Hani" }, "zh-min-nan": { "haswikt": 1 }, "zh-yue": { "sc": "Hani" }, "zu": { "alt": 1, "nclass": 1, "haswikt": 1 }, "zza": { "g": [ "n", "m", "mn", "n-p", "m-p", "p" ], "wiktprefix": "diq" } }, "numberLabels": { "y": { "display": "yekjimar" }, "d": { "display": "hejmar dual" }, "p": { "display": "pirjimar" }, "p+": { "display": "axlebî pirjimar" }, "tp": { "display": "tenê pirjimar" }, "j": { "display": "jimarbar" }, "j+": { "display": "axlebî jimarbar" }, "j/nj": { "display": "jimarbar û nejimarbar" }, "nj": { "display": "nejimarbar" }, "nj+": { "display": "axlebî nejimarbar" }, "hj!": { "display": "hejmar nepeyitandî ye" }, "hj?": { "display": "hejmar hewce ye" } }, "leadingTplOrder": [ "maneid", "K", "e" ], "lekturChoices": [ { "code": "gh", "label": "gerguhêz (îsmî mefûl digire)" }, { "code": "ngh", "label": "negerguhêz (îsmî mefûl nagire)" } ], "lekturFormChoices": [ { "code": "x", "label": "xwerû" }, { "code": "p", "label": "pêkhatî" }, { "code": "h", "label": "hevedudanî" } ], "deverQuickPicks": [ "kurmanciya rojavayî", "kurmanciya merkezî", "kurmanciya rojhilatî", "Badînî", "Botî", "Serhedî", "Bakur", "Amed", "Riha" ], "maneTags": [ "cure?", "rêziman?", "kat-rêziman", "kategoriya rêzimanê?", "bêcure" ], "senseGroups": [ { "key": "alt-r", "label": "Formên alternatîv", "field": "alternativ", "order": 3, "hint": "Varyantên vê kelîmeyê" }, { "key": "hevmane", "label": "Hevmane", "field": "hevmane", "order": 1, "hint": "Spehî hevmaneya Bedew e." }, { "key": "dijmane", "label": "Dijmane", "field": "dijmane", "order": 2, "hint": "Zengîn dijmaneya feqîr e." }, { "key": "koordîne", "label": "Termên koordîne", "field": "koordine", "order": 4, "hint": "Pisîk û kûçik termên koordîne ne çunkî Jornavên wan gelek in" }, { "key": "jornav", "label": "Jornav", "field": "jornav", "order": 5, "hint": "Heywan jornavê guhandar e" }, { "key": "jêrnav", "label": "Jêrnav", "field": "jernav", "order": 6, "hint": "Guhandar jêrnavê heywan e" } ], "subsectionOrder": [ "Bilêvkirin", "Ji wêjeya klasîk", "Ji wêjeyê", "Tewandin", "Notên bikaranînê", "Bi alfabeyên din", "Formên alternatîv", "Kurtkirin", "Sembol", "Navê zanistî", "Hevmane", "Nêzîk", "Dijmane", "Jornav", "Jêrnav", "Jê", "Têkildar", "Etîmolojî", "Dûnde", "Bide ber", "Herwiha binêre", "Bêhtir bixwîne", "Bi zaravayên din", "Werger", "Qafiye", "Anagram", "Çavkanî" ], "templateAliases": { "K": [ "K", "kategorîzebike", "mijar" ], "alt-r": [ "alt-r", "forma alt di rêzê de", "herwiha-rêz", "herwiha di rêza maneyê de" ], "dijmane": [ "dijmane", "dijwate", "dijmaneyên peyvê" ], "e": [ "e", "etîket", "f", "lb" ], "g": [ "g", "girêdan", "l", "link" ], "hevmane": [ "hevmane", "hevwate", "hevmaneya peyvê", "hevmaneyên peyvê", "synonyms" ], "jornav": [ "jornav", "hîpernîm" ], "jêrnav": [ "jêrnav", "hîponîm" ], "koordîne": [ "koordîne", "termên koordîne", "peyvên koordîneyî" ], "mane?": [ "mane?", "wate?", "bêmane", "bêwate" ], "maneid": [ "maneid", "senseid" ], "h-bnr": [ "h-bnr", "bnr-h", "bnr h", "bnr-hrw", "bnr herwiha", "herwiha binêre", "binêre herwiha" ] }, "wordlistTemplates": [ "kol3", "kol2", "kol", "col3", "col2", "col" ], "templateParams": { "deyn": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "sc", "id" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya kelîmeyê", "tr": "Transliterasyon", "ts": "Transkîpsiyon", "sc": "Koda skrîptê", "id": "IDya maneyê" } }, "hv": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "ji": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "jêder-kitêb": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "nivîskar2", "nivîskar3", "amadekar", "terciman", "sernav", "url", "weşanxane", "cih", "cild", "sal", "sala-weşandinê", "çap", "rûpel", "isbn", "nekat", "nivîskar4", "nivîskar5", "issn", "oclc", "serî", "doi" ], "labels": { "1": "koda zimanî", "sc": "koda skrîptê eger hewce be", "tr": "translîterasyon", "t": "tercime", "rûpel": "rûpel" } }, "jêder-kovar": { "order": [ "1", "jêgirtin", "sc", "tr", "werger", "kovar", "sernav", "wergêr", "nivîskar", "nivîskar2", "url", "weşanxane", "cîld", "hejmar", "sal", "tarîx", "rûpel" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê", "tr": "Translîterasyon", "werger": "Tercimeya kurmancî ya jêgirtinê" } }, "jêder-vîdeo": { "order": [ "1", "title", "year", "date", "author", "authorlink", "actor", "role", "time", "at", "medium", "network", "text", "translation", "season", "number", "episode", "publisher", "url", "director", "brackets" ], "labels": { "1": "Language", "title": "Title", "year": "Year of release", "date": "Date of release", "author": "Writer (screenplay)", "authorlink": "Wikipedia author page", "actor": "Actor (speaker)", "role": "Role", "time": "Timecode", "at": "Context", "medium": "Recording medium", "network": "Network", "text": "Quoted line", "translation": "Translation", "season": "Season number (series)", "number": "Episode number (series)", "episode": "Episode title (series)", "publisher": "Publisher", "url": "URL", "director": "Director", "brackets": "Brackets" } }, "jêder-websîte": { "order": [ "1", "jêgirtin", "sc", "tr", "t", "nivîskar", "terciman", "sernav", "url", "urlya-arşîvê", "websîte", "tarîx", "sal" ], "labels": { "1": "Koda zimanî", "sc": "Koda skrîptê ya jêgirtinê", "tr": "Translîterasyona jêgirtinê", "t": "Tercimeya kurmancî ya jêgirtinê" } }, "mîr": { "order": [ "1", "2", "3", "4", "5", "tr", "ts", "id", "sc" ], "labels": { "1": "Zimanê jêder", "2": "Zimanê wergir", "3": "Kelîme", "4": "Xuyakirina alternatîv", "5": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "id": "IDya maneyê", "sc": "Koda skrîptê" } }, "nh": { "order": [ "1", "2", "3", "4", "tr", "ts", "sc" ], "labels": { "1": "Koda zimanî", "2": "Kelîme", "3": "Xuyakirina alternatîv", "4": "Maneya peyvê", "tr": "Transliterasyon", "ts": "Transkrîpsiyon", "sc": "Koda skrîptê" } }, "qertaf": { "order": [ "1", "2", "3", "sc", "cuda1", "cuda2", "t1", "t2", "tr1", "tr2" ], "labels": { "1": "language code", "2": "first part", "3": "second part", "sc": "script code", "cuda1": "first part alternate text", "cuda2": "second part alternate text", "w1": "first gloss", "w2": "second gloss", "tr1": "first part transliteration", "tr2": "second part transliteration" } }, "yekser": { "order": [ "1", "2", "3", "hûr", "nekat" ] } } } oht8ebq2yw5xs1xmonu1ym66p79j5et MediaWiki:Gadget-wikt.cite.js 8 1359166 6533059 6531674 2026-09-19T10:13:44Z Wikihez 7344 Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js 6533059 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite.js]] * * Citations for both add-examples and the wizard: jêder-* templates, [[Kategorî:Çavkanî]] templates, * Citoid, and the "#*" line they become. fieldSpecs() returns plain field descriptions because the two * callers draw them differently (OOUI vs the wizard's own grid); everything else is shared. Also the * template-param dialog (openTemplateDialog), used the same way by DefSideBoxes and start.js. * * The only caller of window.wikt.citoid, which the citoid-helper gadget owns. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var wt = edit.wt; var langs = edit.langs; var escapeRegExp = util.escapeRegExp; var tdText = wt.tdText; var parseTemplateCalls = wt.parseTemplateCalls; var splitCallParams = wt.splitCallParams; var buildTemplateCall = wt.buildTemplateCall; var jederDefs = edit.data.jederDefs || {}; // Guarded: between deploying this file and the Gadgets-definition line that adds etimon.js to the // package, a cached startup module would have this require throw and take the whole gadget with it. // Without the builder, an {{etîmon}} call falls through to the generic dialog below. var etimon = null; try { etimon = require("./wikt.cite/etimon.js"); } catch (e) { etimon = null; } var api = new mw.Api(); // Sentinel _currentJederKey / dropdown value for "pick a template from Kategorî:Çavkanî". Not a real // jederDefs key. Both gadgets use this same string, so a draft saved by one is read by the other. var CATEGORY_KEY = "__category__"; // Sentinel for "the example box holds a finished template; write it out untouched". var RAW_KEY = "__raw__"; // Covered by the form's own dedicated boxes, so they are never drawn again as generic template fields. var COVERED_PARAMS = ["jêgirtin", "jg", "t", "tr"]; // A Kategorî:Çavkanî template whose TemplateData labels a parameter exactly this is fed the language // from the language dropdown instead of showing a box for it. Unlike jêder-*, an arbitrary template has // no "parameter 1 is the language" convention, so nothing is assumed positionally. var LANG_LABEL = "koda zimanî"; // Field key -> {span, multiline}, taken from whichever jêder-* template defines it first. Most // Kategorî:Çavkanî templates reuse the same bibliographic parameter names, so "sernav" comes out // full-width and multiline there too rather than as a generic one-line box. var SIZE_BY_KEY = {}; Object.keys(jederDefs).forEach(function (jederKey) { (jederDefs[jederKey].fields || []).forEach(function (field) { if (!SIZE_BY_KEY[field.key]) { SIZE_BY_KEY[field.key] = { span: field.span || 4, multiline: !!field.multiline, width: field.width || "" }; } }); }); // Field pairs Modul:quote refuses together ("Divê tenê yek ji |tarîx= an |sal= were dayîn"): a full // date and a bare year say the same thing twice. Both are offered because either may be all a source // gives, so the forms clear one when the other is filled rather than letting the citation break. var EXCLUSIVE_PAIRS = [["sal", "tarîx"]]; function exclusivePartner(key) { var found = null; EXCLUSIVE_PAIRS.forEach(function (pair) { if (pair[0] === key) { found = pair[1]; } else if (pair[1] === key) { found = pair[0]; } }); return found; } function fieldSize(key) { return SIZE_BY_KEY[key] || { span: 4, multiline: false, width: "" }; } // ---- text helpers ------------------------------------------------------------------------------- // The entry name as a pattern. A Kurdish word ending in -î loses the circumflex once something is // attached to it ("safî" is written "safiye"), so a title ending that way matches either spelling -- // otherwise the name is simply never found in the quotation. function titlePattern(title) { var escaped = escapeRegExp(String(title || "")); return /î$/i.test(escaped) ? escaped.slice(0, -1) + "[îi]" : escaped; } // Wraps the entry's own name in bold wherever it appears in the quotation, which is how quotations are // written here, and reports whether the name ends up bold so a caller can say so. // // The name may carry an attached suffix ("celbê"), so the match runs on to the end of the word. A word // ends at whitespace, punctuation or markup: excluding markup is what keeps "celb<br>me’şûq" from // bolding as one lump. The typographic apostrophe stays a word character -- it is one inside Kurdish // words like "me’şûq". function boldenPageTitle(text, title) { var source = String(text || ""); var escapedTitle = titlePattern(title); var suffixPattern = "([^\\s.,;:?!()'\"<>\\[\\]{}|=/\\\\«»„“”–—]+)?"; var titleRe = new RegExp("(" + escapedTitle + suffixPattern + ")", "ig"); var titleAnywhere = new RegExp(escapedTitle, "i"); // Whatever already sits between ''' marks is copied through untouched, so a quotation somebody // bolded by hand -- or one an earlier run bolded -- never collects a second pair. var boldSpan = /'''[\s\S]*?'''/g; var out = ""; var last = 0; var alreadyBold = false; var span; while ((span = boldSpan.exec(source)) !== null) { out += source.slice(last, span.index).replace(titleRe, "'''$1'''"); if (titleAnywhere.test(span[0])) { alreadyBold = true; } out += span[0]; last = span.index + span[0].length; } out += source.slice(last).replace(titleRe, "'''$1'''"); return { text: out, bolded: out !== source || alreadyBold }; } // A literal newline would end the single-line "#*" wikitext, so display text keeps its break as <br>... function nlToBr(text) { return String(text || "").replace(/\r\n|\r|\n/g, "<br>"); } // ...while a plain parameter value (an author, a title) just loses it. function nlToSpace(text) { return String(text || "").replace(/\s*(?:\r\n|\r|\n)\s*/g, " "); } // Bolds the entry name inside a pasted citation's jêgirtin=/jg= value only, so a book title or author // containing it is left alone. With no such parameter nothing is bolded: running the plain-text bolder // over wikitext would wrap the braces too. function boldQuoteParam(text, title) { var match = /(\|\s*(?:jêgirtin|jg)\s*=)([\s\S]*?)(?=\|[^|=]*=|\}\}\s*$)/.exec(text); if (!match) { return text; } var bolded = boldenPageTitle(match[2], title).text; return text.slice(0, match.index) + match[1] + bolded + text.slice(match.index + match[0].length); } // "name — description" for each Kategorî:Çavkanî option in a <select>, from the description half of // the same TemplateData every citation picker already fetches -- so a search box built over these // options can also match on what a template documents itself as doing, not only its name. An // undescribed option, or a failed fetch, just keeps its plain label; never blocks on this. // A self-contained "search Kategorî:Çavkanî" combo: a text input plus its own results list, matching // add-examples' own jêgirtin picker -- each row shows its label, a " → target" arrow when a redirect's // label differs from its target, and a 🔗 link to the canonical template's own page. opts.onPick(entry) // fires when a row is chosen; the input is then left holding the plain label, not "label → target", so // re-focusing it to search again doesn't start from that arrow text. opts.describe: true also fills in // each visible row's own TemplateData description once it loads (batched, so scrolling through matches // costs a handful of requests, not one per row). function buildCategoryTemplateSearch(opts) { opts = opts || {}; var shell = util.buildSearchList({ placeholder: opts.placeholder || util.msg.searchTemplate }); var $input = shell.$input; var $results = shell.$results; var $status = $("<span class='wiktku-cat-tpl-status'></span>").text(util.msg.templatesLoading); var list = []; function decorate($text, target, wanted) { if (!wanted) { return; } edit.wt.fetchTemplateData(target).then(function (doc) { var desc = doc && edit.wt.tdText(doc.description); if (desc && $text.closest("body").length) { $text.append(document.createTextNode(" — " + edit.wt.shortDesc(desc))); } }); } function showResults(query) { var q = $.trim(query || "").toLowerCase(); $results.empty(); var matched = q ? list.filter(function (entry) { return entry.label.toLowerCase().indexOf(q) !== -1; }) : list; if (!matched.length) { shell.close(); return; } var shown = matched.slice(0, 50); // Only what a search has narrowed to: an empty box is the whole category, and describing its // first fifty would ask the wiki about templates nobody has looked for. var describing = !!opts.describe && !!q; if (describing) { edit.wt.fetchTemplateDataBatch(shown.map(function (entry) { return entry.target; })); } shown.forEach(function (entry) { var $li = $("<li class='wiktku-cat-tpl-row'></li>"); var $text = $("<span class='wiktku-cat-tpl-text'></span>").text(entry.label); if (entry.label !== entry.target) { $text.append($("<span class='wiktku-cat-tpl-arrow'></span>").text(" → " + entry.target)); } decorate($text, entry.target, describing); var $link = $("<a class='wiktku-cat-tpl-link' target='_blank' rel='noopener'>🔗</a>") .attr("title", util.msg.openTemplatePage) .attr("href", util.tplPageUrl(entry.target)); // stopPropagation only -- preventDefault would stop the link from actually navigating. $link.on("mousedown click", function (e) { e.stopPropagation(); }); $li.append($text, $link); shell.bindPick($li, function () { shell.close(); $input.val(entry.label); opts.onPick(entry); }); $results.append($li); }); shell.open(); } $input.on("input focus", function () { showResults($(this).val()); }); $input.on("blur", function () { setTimeout(shell.close, 200); // lets the pick handler fire first }); fetchCategoryTemplates().then(function (l) { list = l; $status.text(""); }, function () { $status.text(util.msg.templatesFailed); }); return { $element: $("<span class='wiktku-native-select-wrap wiktku-cat-tpl-picker'></span>").append($input, $results, $status), $input: $input, $status: $status }; } // ---- Kategorî:Çavkanî ----------------------------------------------------------------------------- // The category's template members plus their redirects, each redirect its own searchable entry pointing // at the same canonical target, so a template is findable by any of its names. Cached for the session. var catTemplatesPromise = null; function fetchCategoryTemplates() { if (catTemplatesPromise) { return catTemplatesPromise; } catTemplatesPromise = api.get({ action: "query", generator: "categorymembers", gcmtitle: "Kategorî:Çavkanî", gcmnamespace: 10, gcmlimit: "max", prop: "redirects", rdnamespace: 10, rdlimit: "max", formatversion: 2 }).then(function (data) { var list = []; ((data.query && data.query.pages) || []).forEach(function (page) { var target = page.title.replace(/^[^:]+:/, ""); list.push({ label: target, target: target }); (page.redirects || []).forEach(function (redirect) { list.push({ label: redirect.title.replace(/^[^:]+:/, ""), target: target }); }); }); list.sort(function (a, b) { return a.label.localeCompare(b.label, mw.config.get("wgUserLanguage")); }); return list; }, function () { return []; }); return catTemplatesPromise; } // ---- template-param dialog: fills a {{Name|...}} call from its own TemplateData ------------------- // Shared by DefSideBoxes (a fresh insert from Etîmolojî/Çavkanî, or double-clicking an existing chip // to edit it) and start.js's own Etîmolojî/Çavkanî pickers -- one dialog, so all of them read the same // TemplateData the same way. // OOUI's own dialog stack -- the same widgetry VisualEditor's template dialog is built on. var citeWindowManager = null; function templateDialogManager() { if (!citeWindowManager) { citeWindowManager = new OO.ui.WindowManager(); $(document.body).append(citeWindowManager.$element); } return citeWindowManager; } // Opens one template call in a modal built from its TemplateData. Resolves with the edited wikitext, or // null when the user cancels. // One at a time: a second open while one is loading or showing (a chip clicked again before its dialog // appeared) stacks a window the manager does not track, and that window's buttons do nothing. The // second call resolves null, as a cancel does. var templateDialogBusy = false; function openTemplateDialog(callWikitext) { var done = $.Deferred(); var call = parseTemplateCalls(callWikitext).calls[0]; if (!call || templateDialogBusy) { return done.resolve(null).promise(); } // {{etîmon}} has no form TemplateData can describe -- a chain of steps, each with its own words // and their own modifiers -- so it has a builder of its own, on the same contract as this dialog. if (etimon && etimon.isEtimonName(call.name)) { return etimon.openDialog(callWikitext); } templateDialogBusy = true; done.always(function () { templateDialogBusy = false; }); $.when( mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]), edit.wt.fetchTemplateData(call.name) ).then(function (_loaded, td) { var result = null; // The parent is captured rather than reached through TplDialog.super: "super" is a reserved word, // and OOjs has moved between .super and .parent for it over the years. var ParentDialog = OO.ui.ProcessDialog; function TplDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(TplDialog, ParentDialog); TplDialog.static.name = "citeTemplateDialog"; TplDialog.static.title = "{{" + call.name + "}}"; TplDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; TplDialog.prototype.initialize = function () { ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildTemplateParamForm(call, td); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; TplDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; TplDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; // Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does // not sit over a dialog the page's stacking order puts underneath it. $(document.body).addClass("wikt-dialog-open"); done.always(function () { $(document.body).removeClass("wikt-dialog-open"); }); var manager = templateDialogManager(); var dialog = new TplDialog({ size: "medium" }); manager.addWindows([dialog]); var instance = manager.openWindow(dialog); instance.closed.then(function () { manager.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { manager.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } // TemplateData descriptions are plain text, but authors write wikilinks in them; render those as links. function tdDescription(text) { var $out = $("<span></span>"); var re = /\[\[([^\[\]|]+)(?:\|([^\[\]]*))?\]\]/g; var last = 0; var m; while ((m = re.exec(text)) !== null) { if (m.index > last) { $out.append(document.createTextNode(text.slice(last, m.index))); } $out.append($("<a></a>").attr("href", mw.util.getUrl(m[1])).text(m[2] || m[1])); last = re.lastIndex; } if (last < text.length) { $out.append(document.createTextNode(text.slice(last))); } return $out; } // A parameter whose documentation says so takes "kelîme<t:...>" inline modifiers, so it gets the pill // widget instead of a plain box. TemplateData has no field for this, hence the marker in the description. var INLINE_MODIFIER_MARKER = "WF:Guherkerên rêzê"; function acceptsInlineModifiers(doc) { return tdText(doc && doc.description).indexOf(INLINE_MODIFIER_MARKER) !== -1; } // A language-code parameter, per its own label. function isLanguageParam(doc) { return /ziman/i.test(tdText(doc && doc.label)); } function buildTemplateParamForm(call, td) { var parsed = splitCallParams(call.params); var docParams = (td && td.params) || {}; var keys = (td && td.paramOrder) ? td.paramOrder.slice() : Object.keys(docParams); parsed.used.forEach(function (k) { if (keys.indexOf(k) === -1) { keys.push(k); } }); var $element = $("<div class='dsb-tpl-form'></div>"); var readers = {}; // key -> () => the parameter's current text $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + call.name)) .attr("target", "_blank").text("{{" + call.name + "}}") )); var desc = tdText(td && td.description); if (desc) { $element.append($("<div class='dsb-tpl-desc'></div>").append(tdDescription(desc))); } keys.forEach(function (key) { var doc = docParams[key] || {}; var value = parsed.values[key] || ""; var $field; if (acceptsInlineModifiers(doc)) { // The same word row the sense lists use: plain text plus removable "<t:...>" pills. var row = util.makeModifierRow({ prefix: "dsb-", placeholder: tdText(doc.label) || key, modTitle: util.msg.addModifier, removeTitle: "Vê nirxê jê bibe", removeModTitle: util.msg.removeModifier }); row.setRaw(value); // A <ul> so the row's own "close other pickers" lookup has something to scope to. $field = $("<ul class='dsb-wordlist dsb-tpl-modifier-list'></ul>").append(row.$li); readers[key] = row.getRaw; } else { var $input = $("<input type='text' class='dsb-input'>").val(value); if (isLanguageParam(doc)) { $input.attr("list", langs.datalistId()).attr("placeholder", "koda zimanî…"); // Typing a language the short list does not have is the cue to fetch the rest. $input.on("input", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } }); } else { var suggested = doc.suggestedvalues || []; if (suggested.length) { var listId = "dsb-sv-" + call.name.replace(/[^A-Za-z0-9]/g, "") + "-" + key; var $list = $("<datalist></datalist>").attr("id", listId); suggested.forEach(function (v) { $list.append($("<option></option>").val(v)); }); $input.attr("list", listId); $element.append($list); } } $field = $input; readers[key] = function () { return $input.val(); }; } var $label = $("<label class='dsb-adv-label'></label>").text(tdText(doc.label) || key); if (!docParams[key]) { $label.append($("<span class='dsb-tpl-undocumented'></span>").text(" (ne di belgeyê de)")); } var $row = $("<div class='dsb-tpl-param-row'></div>").append($label, $field); var help = tdText(doc.description); if (help) { $row.append($("<div class='dsb-tpl-help'></div>").append(tdDescription(help))); } if (doc.deprecated) { $row.addClass("dsb-tpl-deprecated"); } $element.append($row); }); return { $element: $element, values: function () { var vals = {}; keys.forEach(function (k) { vals[k] = $.trim(readers[k]() || ""); }); return buildTemplateCall(call.name, vals, keys); } }; } // The documented parameters of one template (name without the "Şablon:" prefix), in its own // paramOrder; [] when it has no TemplateData. The fetch, the shaping and the cache all live in // wikt.edit, so the wizard, DefSideBoxes and this module share one request and one copy per template. // // The key stands in for a missing label, because these become form fields and a field needs something // written on it. // A template's parameters: its TemplateData, or -- for one with none, like most Kategorî:Çavkanî // templates -- every {{{name}}} its own source reads. function templateParams(name) { return edit.wt.templateDoc(name).then(function (td) { var params = ((td && td.params) || []).map(function (p) { return { key: p.key, label: p.label || p.key, required: p.required, deprecated: p.deprecated }; }); return params.length ? params : sourceParams(name); }); } var sourceParamsCache = {}; function sourceParams(name) { if (!sourceParamsCache[name]) { sourceParamsCache[name] = new mw.Api().get({ action: "query", prop: "revisions", titles: "Template:" + name, rvprop: "content", rvslots: "main", redirects: 1, formatversion: 2 }).then(function (data) { var page = data.query.pages[0]; var source = page.revisions ? page.revisions[0].slots.main.content : ""; var keys = []; var re = /\{\{\{\s*([^{}|]+?)\s*[|}]/g; var m; while ((m = re.exec(source)) !== null) { if (!/^\d+$/.test(m[1]) && keys.indexOf(m[1]) === -1) { keys.push(m[1]); } } return keys.map(function (key) { return { key: key, label: key, required: false, deprecated: false }; }); }, function () { return []; }); } return sourceParamsCache[name]; } // alias -> the name a template's TemplateData documents it under ({r: "rûpel"} for jêder-kitêb). Asked // of the wiki itself: the parameter lists baked into data-main.json carry no aliases. var aliasCache = {}; function templateAliases(name) { if (!aliasCache[name]) { aliasCache[name] = new mw.Api().get({ action: "templatedata", titles: "Template:" + name, redirects: 1, formatversion: 2 }).then(function (data) { var map = {}; $.each(data.pages || {}, function (_, page) { $.each(page.params || {}, function (key, p) { (p.aliases || []).forEach(function (alias) { map[alias] = key; }); }); }); return map; }, function () { return {}; }); } return aliasCache[name]; } // What to draw for one Kategorî:Çavkanî template: a field per documented parameter, minus the ones the // form already has boxes for and minus the language parameter, which is filled from the dropdown. // A template with no TemplateData at all falls back to a lone "Rûpel" box, which is what such citations // almost always need ({{Şablon|rûpel=12|jêgirtin=…}}). function fieldSpecs(name) { return templateParams(name).then(function (params) { var langParamKey = null; (params || []).forEach(function (p) { if ((p.label || "").trim().toLowerCase() === LANG_LABEL) { langParamKey = p.key; } }); var filtered = (params || []).filter(function (p) { return COVERED_PARAMS.indexOf(p.key) === -1 && p.key !== langParamKey; }); var list = filtered.length ? filtered : [{ key: "rûpel", label: "Rûpel", required: false }]; return { langParamKey: langParamKey, fields: list.map(function (p) { var size = fieldSize(p.key); return { key: p.key, label: p.label, required: p.required, span: size.span, width: size.width, multiline: size.multiline }; }) }; }); } // The same list for a jêder-* template, straight out of the shared table. function jederFieldSpecs(jederKey) { var def = jederDefs[jederKey]; return def ? (def.fields || []).slice() : []; } // ---- Citoid -------------------------------------------------------------------------------------- // Today, as Modul:quote wants it (it renders "2024-05-05" as "5 gulan 2024"). function today() { var d = new Date(); function pad(n) { return (n < 10 ? "0" : "") + n; } return d.getFullYear() + "-" + pad(d.getMonth() + 1) + "-" + pad(d.getDate()); } // Carries across the parts of a Citoid result that citoid-helper's own mapping drops: the access date // and the identifiers for the fields the forms have only just gained. Applied here rather than in // citoid-helper so it reaches both gadgets without an edit to the MediaWiki: gadget page. function enrichCitoidFields(fields, raw) { fields = fields || {}; if (fields.url && !fields["tarîxa-gihiştinê"]) { // Citoid reports when it actually fetched the page ("accessDate": "2026-09-03"), so use that // rather than the clock -- they differ whenever the answer came from a cache. today() is only // the fallback for a result that carries no accessDate. var accessed = raw && (raw.accessDate || raw.accessdate); fields["tarîxa-gihiştinê"] = (accessed && String(accessed).slice(0, 10)) || today(); } if (raw) { var issn = Array.isArray(raw.ISSN) ? raw.ISSN[0] : raw.ISSN; if (issn && !fields.issn) { fields.issn = issn; } var doi = Array.isArray(raw.DOI) ? raw.DOI[0] : raw.DOI; if (doi && !fields.doi) { fields.doi = doi; } if (raw.volume && !fields.cild) { fields.cild = raw.volume; } } return fields; } // One URL/DOI/ISBN -> {jederKey, fields}. The lookup itself lives in the citoid-helper gadget; this // wrapper exists so neither caller has to know that, and so a missing gadget fails in one place. function fetchFromCitoid(query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.fetchJederFields)) { return $.Deferred().reject("Amûra Citoidê ne barkirî ye.").promise(); } return window.wikt.citoid.fetchJederFields(query).then(function (result) { result.fields = enrichCitoidFields(result.fields, result.raw); return result; }); } // Re-derives the fields for a different jêder-* template than the one citoid detected, enriched the // same way -- used when the person had already chosen a template and we keep their choice. // The form's link box stands in for a jêder-* template's own url= when that is left empty. function withLinkAsUrl(jederKey, fields, link) { var def = jederDefs[jederKey]; var hasUrl = !!def && (def.fields || []).some(function (field) { return field.key === "url"; }); if (hasUrl && !fields.url && /^https?:\/\//.test(link || "")) { fields.url = link; } return fields; } function citoidFieldsFor(jederKey, raw, query) { if (!(window.wikt && window.wikt.citoid && window.wikt.citoid.dataToJederFields)) { return {}; } return enrichCitoidFields(window.wikt.citoid.dataToJederFields(jederKey, raw, query), raw); } // ---- the "#*" line ------------------------------------------------------------------------------ // One finished citation line. Modes: // "jeder" {{jêder-kitêb|ku|sernav=…|jêgirtin=…}} // "category" the Kategorî:Çavkanî template as the citation template: {{Ç:Kitêb|rûpel=12|…}} // "plain" free-text source, or none: {{jêder|ku|2=…|jêgirtin=…}} / {{nimûne|ku|…}} // "raw" a finished template, passed through with only the entry name bolded // opts: {mode, template, language, fields, langParamKey, quote, translation, transcription, // source, sourceURL, title, marker, keepTranslation, extra} function buildCitation(opts) { var marker = opts.marker || "#*"; var title = opts.title || mw.config.get("wgTitle"); var quote = boldenPageTitle(String(opts.quote || ""), title).text; if (opts.mode === "raw") { // Written as given: the point is to paste a citation built elsewhere and have it survive intact. // A line copied off another entry usually still carries its own "#*"/"#:" -- the marker is added // back below, so strip it rather than emitting "#* #* {{...}}". var pasted = String(opts.quote || "").replace(LIST_MARKER, ""); return marker + " " + nlToBr(boldQuoteParam(pasted, title)).trim(); } var isCategory = opts.mode === "category"; var isTemplate = isCategory || opts.mode === "jeder"; var name = isTemplate ? opts.template : (opts.source || opts.sourceURL ? "jêder" : "nimûne"); var line = marker + " {{" + name; // jêder-*, jêder and nimûne all take the language as parameter 1. A Kategorî:Çavkanî template only // gets one when its own TemplateData names it, under its own key -- never assumed positionally. if (!isCategory) { line += "|" + opts.language; } if (isTemplate) { var fields = opts.fields || {}; Object.keys(fields).forEach(function (key) { var value = nlToSpace(String(fields[key] || "").trim()); if (value) { line += "|" + key + "=" + value; } }); if (isCategory && opts.langParamKey) { line += "|" + opts.langParamKey + "=" + opts.language; } // "Ç:" templates are quotation-equivalents rather than usage examples (see Modul:quote). if (isCategory && /^Ç:/.test(name)) { line += "|wekjêgirtin=1"; } } else { if (opts.source) { // A positional value containing "=" would be read as its own key=value pair, so name it. line += (String(opts.source).indexOf("=") !== -1 ? "|2=" : "|") + opts.source; } if (opts.sourceURL) { line += "|url=" + opts.sourceURL; } } var isUsex = name === "nimûne"; var translation = nlToBr(String(opts.translation || "").trim()); // {{nimûne}} always takes one, a Kurmancî example's being its explanation; a quotation's is left out // for Kurmancî unless the edited line already had one (keepTranslation). var writeTranslation = !!translation && (isUsex || opts.language !== "ku" || opts.keepTranslation); // {{nimûne}}'s example is parameter 2 and its translation parameter 3, both positional. A value // containing "=" would be read as key=value, so then both are named: naming only the example would // slide the translation into slot 2. var namedSlots = isUsex && (quote.indexOf("=") !== -1 || (writeTranslation && translation.indexOf("=") !== -1)); line += "|" + (isUsex ? (namedSlots ? "2=" : "") : "jêgirtin=") + nlToBr(quote); if (writeTranslation) { // Kategorî:Çavkanî templates route through Modul:quote and take its "t="; jêder-* uses "tercime=". line += "|" + (isUsex ? (namedSlots ? "3=" : "") : isCategory ? "t=" : "tercime=") + translation; } var transcription = nlToBr(String(opts.transcription || "").trim()); if (transcription) { line += "|tr=" + transcription; } // Parameters the form has no box for, carried through from the line being edited. (opts.extra || []).forEach(function (param) { line += "|" + param; }); // A short example and its translation read best on one line, which {{nimûne}} does only when told. // Short is Modul:usex's own measure for "rêz=auto": at most 100 characters shown between them. if (isUsex && writeTranslation && !hasInlineParam(opts.extra) && shownLength(quote) + shownLength(translation) <= 100) { line += "|rêz=1"; } return line + "}}"; } // True when the parameters already say inline or not: {{nimûne}}'s rêz=, under any of its names. function hasInlineParam(params) { return (params || []).some(function (param) { return /^\s*(?:rêz|birêz|inline)\s*=/.test(param); }); } // How many characters a bit of wikitext shows: link targets, bold/italic marks and tags don't count. function shownLength(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/'{2,}/g, "") .replace(/<[^>]*>/g, " ") .length; } // A leading "#*" / "#:" / "##*" ... list marker. var LIST_MARKER = /^\s*#+[*:]\s*/; // True when the text is a whole citation line copied from somewhere else: its own list marker followed // by a template call. That is the shape of every line this family writes -- {{jêder}}, {{jêder-kitêb}}, // {{nm}}, {{nimûne}}, {{mk}}, any Kategorî:Çavkanî template -- so the template name is not checked // against a list, which could never cover every citation template on the wiki. // // Used to switch the form into raw mode by itself: pasting a finished line and forgetting to change the // dropdown would otherwise wrap it in a second {{nimûne}}. function looksLikeCitationLine(text) { var trimmed = String(text || ""); if (!LIST_MARKER.test(trimmed)) { return false; } return trimmed.replace(LIST_MARKER, "").slice(0, 2) === "{{"; } // True when the example box holds nothing but one finished template call -- the cue to offer, or to // switch to, the "write it out as-is" mode. function looksLikeTemplate(text) { var trimmed = String(text || "").trim(); if (trimmed.slice(0, 2) !== "{{" || trimmed.slice(-2) !== "}}") { return false; } var parsed = edit.wt.parseTemplateCalls(trimmed); return parsed.calls.length === 1 && !parsed.otherContent; } // ---- reading a finished line back -------------------------------------------------------------- // [[Şablon:nimûne]] and every redirect to it. var USEX_NAMES = ["nimûne", "mk", "ux", "mînak", "nim", "nm"]; var USEX_TRANSLATION = ["3", "t", "tercime", "translation", "w", "werger"]; var USEX_TRANSCRIPTION = ["tr", "transliteration"]; // A quotation template's translation, under the name Modul:quote documents and its aliases. var QUOTE_TRANSLATION = ["t", "tercime", "werger", "w"]; // [[Şablon:bênimûne]] and its redirects: the "no example yet" placeholder, with or without a language. var EMPTY_EXAMPLE_MARKER = /^#+\*\s*\{\{\s*(?:bênimûne|bêmînak|mînak\?|nimûne\?)\s*(?:\|[^{}]*)?\}\}\s*$/i; // The text of a line written as one italic run ("''…''", bold inside allowed -- "'''''X''' …''" opens // with both), or null. function italicRun(text) { var t = $.trim(text || ""); var opening = /^'*/.exec(t)[0].length; var m = /^''([\s\S]+)''$/.exec(t); if ((opening !== 2 && opening !== 5) || !m || /''/.test(m[1].replace(/'''/g, ""))) { return null; } return m[1]; } // "''…'' (…)": an italic example with its explanation in brackets on the same line, as // {text, translation}, or null. One level of brackets inside the explanation is allowed. function italicWithGloss(text) { var m = /^([\s\S]*'')\s*\(([^()]*(?:\([^()]*\)[^()]*)*)\)$/.exec($.trim(text || "")); var italic = m && italicRun(m[1]); if (italic === null || !m) { return null; } var gloss = $.trim(m[2]); return { text: italic, translation: italicRun(gloss) || gloss }; } function brToNl(text) { return String(text || "").replace(/<br\s*\/?>/gi, "\n"); } /** * One "#:"/"#*" block -- its line plus any deeper "#::"/"#*:" lines -- as the form's values, or null when * it is not an example: a word list, the "no example yet" placeholder, a plain note. * {mode: "nimune"|"jeder"|"source"|"raw", marker, template, text, translation, transcription, * source, sourceURL, fields, extra} * extra is every parameter the form has no box for, to be written back as it was. A "raw" block is * edited as written: text is the whole block, list markers included. */ function parseCitationLine(block) { var all = String(block || "").split("\n"); var k = 1; while (k < all.length && !/^#/.test(all[k])) { k++; } var head = /^#+([:*])\s*([\s\S]*)$/.exec(all.slice(0, k).join("\n")); var sub = all.slice(k); if (!head || EMPTY_EXAMPLE_MARKER.test(all[0])) { return null; } var out = { mode: "raw", marker: head[1], template: "", text: "", translation: "", transcription: "", source: "", sourceURL: "", fields: {}, extra: [] }; var body = $.trim(head[2]); var parsed = edit.wt.parseTemplateCalls(body); var call = parsed.calls.length === 1 && !parsed.otherContent ? parsed.calls[0] : null; var name = call ? edit.wt.canonicalTemplateKey(call.name) : ""; name = name.charAt(0).toLowerCase() + name.slice(1); var isUsex = USEX_NAMES.indexOf(name) !== -1; var def = call && jederDefs[name]; if (call && !sub.length && (isUsex || def || name === "jêder")) { var split = edit.wt.splitCallParams(call.params); var fieldKeys = def ? def.fields.map(function (f) { return f.key; }) : []; out.mode = isUsex ? "nimune" : def ? "jeder" : "source"; out.template = def ? name : ""; split.used.forEach(function (key, i) { var value = brToNl(split.values[key]); if (key === "1") { return; // the language, which the section already says } if (isUsex ? key === "2" : (key === "jêgirtin" || key === "jg")) { out.text = value; } else if ((isUsex ? USEX_TRANSLATION : QUOTE_TRANSLATION).indexOf(key) !== -1) { out.translation = value; } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = value; } else if (def && fieldKeys.indexOf(key) !== -1) { out.fields[key] = split.values[key]; } else if (name === "jêder" && key === "2") { out.source = split.values[key]; } else if (name === "jêder" && key === "url") { out.sourceURL = split.values[key]; } else { // Named when it was positional, so it cannot shift into a slot the form now fills. out.extra.push(/^\d+$/.test(key) && !/=/.test(call.params[i]) ? key + "=" + split.values[key] : $.trim(call.params[i])); } }); return out; } // Any other citation template on a "#*" line -- the Kategorî:Çavkanî ones, {{J:…}} and {{Ç:…}} -- // reads into the category mode: quote, translation and transcription in their boxes, every other // named parameter as a field. Which of those get a box is known once the template's parameters // are fetched (see applyAliases). if (call && !sub.length && out.marker === "*" && (/^[JÇ]:/.test($.trim(call.name)) || /(?:^|\|)\s*(?:jêgirtin|jg)\s*=/.test(call.params.join("|")))) { var catSplit = edit.wt.splitCallParams(call.params); out.mode = "category"; out.template = $.trim(call.name); catSplit.used.forEach(function (key, i) { var value = catSplit.values[key]; if (key === "jêgirtin" || key === "jg") { out.text = brToNl(value); } else if (QUOTE_TRANSLATION.indexOf(key) !== -1) { out.translation = brToNl(value); } else if (USEX_TRANSCRIPTION.indexOf(key) !== -1) { out.transcription = brToNl(value); } else if (key === "wekjêgirtin" && /^Ç:/.test(out.template)) { return; // buildCitation() writes it for every "Ç:" template } else if (/^\d+$/.test(key)) { out.extra.push(!/=/.test(call.params[i]) ? key + "=" + value : $.trim(call.params[i])); } else { out.fields[key] = value; } }); return out; } if (out.marker === ":") { // The hand-written kind: "#: ''…''", its translation, if any, on a "#::" line under it. var italic = italicRun(body); var translationLine = sub.length === 1 ? /^#+::\s*([\s\S]*)$/.exec(sub[0]) : null; if (italic !== null && (!sub.length || translationLine)) { out.mode = "nimune"; out.text = brToNl(italic); out.translation = translationLine ? brToNl(italicRun(translationLine[1]) || $.trim(translationLine[1])) : ""; return out; } var withGloss = sub.length ? null : italicWithGloss(body); if (withGloss) { out.mode = "nimune"; out.text = brToNl(withGloss.text); out.translation = brToNl(withGloss.translation); return out; } if (!isUsex) { return null; } } out.text = all.join("\n"); return out; } /** * Settles which parameters of a read line get a box. aliases maps an alias to its documented name * (templateAliases); fieldKeys are the boxes the form drew. A parameter written under an alias -- "r=" * for "rûpel=" -- goes to its box; one with no box goes to extra, written back as it was. */ function applyAliases(example, aliases, fieldKeys) { var pending = example.extra.slice(); Object.keys(example.fields).forEach(function (key) { if (fieldKeys.indexOf(key) === -1) { pending.push(key + "=" + example.fields[key]); delete example.fields[key]; } }); example.extra = []; pending.forEach(function (param) { var m = /^\s*([^=]+?)\s*=([\s\S]*)$/.exec(param); var key = m ? (aliases[m[1]] || m[1]) : null; var value = m ? $.trim(m[2]) : ""; if (m && fieldKeys.indexOf(key) !== -1 && !example.fields[key]) { example.fields[key] = value; } else if (m && key === "jêgirtin" && !example.text) { example.text = brToNl(value); } else if (m && QUOTE_TRANSLATION.indexOf(key) !== -1 && !example.translation) { example.translation = brToNl(value); } else { example.extra.push(param); } }); return example; } /** * newLine with its parameters in the order originalLine had them, so an edit's diff shows only what * changed. Parameters match by name -- an alias counting as the name it stands for (aliases, from * templateAliases) -- and positional ones by position; any the original lacked follow in newLine's own * order. A line that is not one template call on either side comes back as it was. */ function keepOrder(newLine, originalLine, aliases) { aliases = aliases || {}; var marker = /^#+[:*]\s*/.exec(newLine || ""); var oldBody = /^#+[:*]\s*([\s\S]*)$/.exec(originalLine || ""); if (!marker || !oldBody) { return newLine; } var fresh = edit.wt.parseTemplateCalls(newLine.slice(marker[0].length)); var old = edit.wt.parseTemplateCalls($.trim(oldBody[1])); if (fresh.calls.length !== 1 || fresh.otherContent || old.calls.length !== 1 || old.otherContent) { return newLine; } function keyed(params) { var positional = 0; return params.map(function (raw) { var m = /^\s*([^|={}\n]+?)\s*=/.exec(raw); var key = m ? m[1] : String(++positional); return { key: aliases[key] || key, raw: raw }; }); } var rest = keyed(fresh.calls[0].params); var ordered = []; keyed(old.calls[0].params).forEach(function (o) { for (var i = 0; i < rest.length; i++) { if (rest[i].key === o.key) { ordered.push(rest.splice(i, 1)[0]); return; } } }); return marker[0] + "{{" + fresh.calls[0].name + ordered.concat(rest).map(function (p) { return "|" + p.raw; }).join("") + "}}"; } // Where the {{ … }} opened on lines[start] closes, so a template written over several lines stays whole. function braceEnd(lines, start) { var depth = 0; for (var i = start; i < lines.length; i++) { depth += (lines[i].match(/\{\{/g) || []).length - (lines[i].match(/\}\}/g) || []).length; if (depth <= 0) { return i; } } return lines.length - 1; } // The "#:"/"#*" blocks right under the definition on lines[defIndex], each {start, end, text, example}: // example is parseCitationLine's reading, or null for a block that is not an example. function exampleBlocks(lines, defIndex) { var depth = /^#+/.exec(lines[defIndex])[0].length; var own = new RegExp("^#{" + depth + "}[:*]"); var deeper = new RegExp("^#{" + depth + "}[:*][:*]"); var blocks = []; var i = defIndex + 1; while (i < lines.length && own.test(lines[i])) { var start = i; var end = braceEnd(lines, i); while (end + 1 < lines.length && deeper.test(lines[end + 1])) { end = braceEnd(lines, end + 1); } var text = lines.slice(start, end + 1).join("\n"); blocks.push({ start: start, end: end, text: text, example: parseCitationLine(text) }); i = end + 1; } return blocks; } /** * Replaces the index-th example under a definition with code, or removes it when code is null. * original is the block as it read when the form opened. When the index no longer holds it (an earlier * queued change moved it) the one block still reading exactly that is used; otherwise nothing is touched. */ function replaceExample(pageContent, language, sectionType, sectionOrdinal, definitionLevel, index, original, code) { var loc = edit.wt.locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defIndex = edit.wt.findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var examples = exampleBlocks(lines, defIndex).filter(function (b) { return b.example; }); var block = examples[index] && examples[index].text === original ? examples[index] : null; if (!block) { var same = examples.filter(function (b) { return b.text === original; }); block = same.length === 1 ? same[0] : null; } if (!block) { throw new edit.util.SubmitAbort("Ev nimûne ji dema vekirina formê ve hatiye guhartin — rûpelê nû bike û dîsa biceribîne."); } var replacement = code === null ? [] : String(code).split("\n"); lines.splice.apply(lines, [block.start, block.end - block.start + 1].concat(replacement)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Words only, lower-cased: links, templates, tags and quote marks out, so the page's drawn text and the // line's wikitext can be compared. function normalizeWords(text) { return String(text || "") .replace(/\[\[(?:[^\]|]*\|)?([^\]]*)\]\]/g, "$1") .replace(/\{\{[^{}]*\}\}/g, " ") .replace(/<[^>]*>/g, " ") .replace(/'{2,}/g, "") .toLowerCase() .replace(/[\s.,;:!?"'“”‘’«»()\[\]\-–—…\/]+/g, ""); } // True when the text a page draws for an example comes from this line. function exampleMatches(drawnText, example) { var source = example.text; if (example.mode === "raw") { var quote = /\|\s*(?:jêgirtin|jg)\s*=([^|}]*)/.exec(source); source = quote ? quote[1] : source.replace(/^#+[:*]\s*/, ""); } var drawn = normalizeWords(drawnText); var written = normalizeWords(source); if (!drawn || !written) { return false; } return drawn === written || written.indexOf(drawn.slice(0, 24)) !== -1; } module.exports = { CATEGORY_KEY: CATEGORY_KEY, RAW_KEY: RAW_KEY, COVERED_PARAMS: COVERED_PARAMS, LANG_LABEL: LANG_LABEL, jederDefs: jederDefs, fieldSize: fieldSize, exclusivePartner: exclusivePartner, boldenPageTitle: boldenPageTitle, nlToBr: nlToBr, nlToSpace: nlToSpace, fetchCategoryTemplates: fetchCategoryTemplates, buildCategoryTemplateSearch: buildCategoryTemplateSearch, openTemplateDialog: openTemplateDialog, buildTemplateParamForm: buildTemplateParamForm, templateParams: templateParams, fieldSpecs: fieldSpecs, jederFieldSpecs: jederFieldSpecs, fetchFromCitoid: fetchFromCitoid, citoidFieldsFor: citoidFieldsFor, withLinkAsUrl: withLinkAsUrl, today: today, buildCitation: buildCitation, looksLikeTemplate: looksLikeTemplate, looksLikeCitationLine: looksLikeCitationLine, USEX_NAMES: USEX_NAMES, EMPTY_EXAMPLE_MARKER: EMPTY_EXAMPLE_MARKER, parseCitationLine: parseCitationLine, applyAliases: applyAliases, keepOrder: keepOrder, templateAliases: templateAliases, exampleBlocks: exampleBlocks, replaceExample: replaceExample, exampleMatches: exampleMatches }; }()); // </nowiki> ercf8tbbun9mc0gl0czwwtjdgds7ar1 MediaWiki:Gadget-wikt.cite.css 8 1359167 6533061 6414278 2026-09-19T10:13:53Z Wikihez 7344 Etymology: route {{etîmon}} to its own builder; keyword, modifier and metn= tables in data-main.json; language datalist moved to langs.js 6533061 css text/css /* <nowiki> */ /* * Page: [[MediaWiki:Gadget-wikt.cite.css]] * * Styles cite.js's own DOM: the Kategorî:Çavkanî search rows (buildCategoryTemplateSearch) and the * template-param dialog (openTemplateDialog/buildTemplateParamForm) it shares with DefSideBoxes and * start.js. .dsb-input and .dsb-adv-label also exist in dsb-panels.css for its own unrelated fields -- * duplicated here, not moved, since those other uses have nothing to do with this module. */ /* ── Template parameter form ───────────────────────────────────────── Built by buildTemplateParamForm(): a fresh insert from Etîmolojî/Çavkanî, editing an existing chip, or a gloss line that turns out to be one template call. */ .dsb-input { box-sizing: border-box; min-width: 16em; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } .dsb-input::placeholder { color: var(--wikt-placeholder); opacity: 1; } .dsb-input:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } .dsb-adv-label { margin-bottom: 4px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } .dsb-tpl-name { font-family: var(--wikt-mono); font-size: 12px; color: var(--wikt-ink-3); } .dsb-tpl-name a { color: inherit; text-decoration: none; border-bottom: 1px dotted var(--wikt-ink-3); } .dsb-tpl-name a:hover { color: var(--wikt-accent-deep); } .dsb-tpl-desc { margin-top: 2px; font-size: 12px; color: var(--wikt-muted); } .dsb-tpl-param-row { display: flex; flex-direction: column; gap: 3px; margin-top: 8px; } .dsb-tpl-help { font-size: 11.5px; color: var(--wikt-muted); } .dsb-tpl-undocumented { font-weight: 400; color: var(--wikt-muted); } .dsb-tpl-deprecated .dsb-adv-label { text-decoration: line-through; color: var(--wikt-muted); } /* A parameter that takes inline modifiers reuses the word row, so strip the list styling. */ .dsb-tpl-modifier-list { margin: 0; padding: 0; list-style: none; } /* ---- the {{etîmon}} builder --------------------------------------------------------------------- */ .dsb-etimon { display: flex; flex-direction: column; gap: 10px; } .dsb-etimon-pagelang, .dsb-etimon-metn { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; } .dsb-etimon-lang { max-width: 11em; } /* One step of the chain: its keyword, that keyword's modifiers, and the words it applies to. */ .dsb-etimon-step { border: 1px solid var(--wikt-card-edge); border-radius: var(--wikt-r-card); padding: 8px 10px; background: var(--wikt-code-bg); } .dsb-etimon-step-head { display: flex; align-items: flex-start; gap: 8px; flex-wrap: wrap; } .dsb-etimon-words { margin: 6px 0 0; padding: 0; list-style: none; display: flex; flex-direction: column; gap: 6px; } .dsb-etimon-word-row { display: flex; align-items: flex-start; gap: 6px; flex-wrap: wrap; } .dsb-etimon-word-input { flex: 1 1 12em; min-width: 10em; } /* The modifier chips and their ⊕ sit together, the picker drops out underneath. */ .dsb-etimon-mods { position: relative; display: flex; align-items: center; gap: 4px; flex-wrap: wrap; } /* An inline <etimon:…>: the same blocks again, one step deeper. */ .dsb-etimon-nested { margin: 6px 0 0 14px; padding-left: 10px; border-left: 2px solid var(--wikt-accent-edge); } .dsb-etimon-nested-head { display: flex; align-items: center; gap: 6px; } .dsb-etimon-add { align-self: flex-start; margin-top: 6px; border: 0; padding: 2px 0; background: none; color: var(--wikt-accent); font-size: 12.5px; cursor: pointer; } .dsb-etimon-add:hover { text-decoration: underline; } .dsb-etimon-remove { border: 0; background: none; padding: 0 4px; color: var(--wikt-muted); font-size: 15px; line-height: 1.4; cursor: pointer; } .dsb-etimon-remove:hover { color: var(--wikt-danger); } .dsb-etimon-metn-free { max-width: 9em; } .dsb-etimon-more summary { cursor: pointer; font-size: 12.5px; color: var(--wikt-ink-3); } .dsb-etimon-param { display: flex; flex-direction: column; gap: 3px; margin-top: 8px; } /* A flag is a checkbox with its explanation on the label, so it reads as one line. */ .dsb-etimon-param-flag { flex-direction: row; align-items: center; gap: 6px; } /* What the form will write, so the wikitext is never a surprise. */ .dsb-etimon-preview { display: block; padding: 6px 8px; border-radius: var(--wikt-r-field); background: var(--wikt-code-bg); border: 1px solid var(--wikt-card-edge); font-family: var(--wikt-mono); font-size: 11.5px; color: var(--wikt-ink-2); word-break: break-all; } /* Touch: >=16px stops iOS Safari zooming the page when a field is focused, and the taller box clears the 44px tap minimum. dsb-panels.css says the same for its own fields; the dialog opens on the wizard too, which never loads that sheet. */ @media (max-width: 720px), (pointer: coarse) { .dsb-input { min-height: 40px; font-size: 16px; } } /* </nowiki> */ 9c5va6tn6231msv5c9nf4zzebglswqv MediaWiki:Gadget-EtytreeZoom.js 8 1359170 6532015 6531936 2026-09-18T14:20:57Z Wikihez 7344 Zoom button: icon-only, in the box's top right corner; a tree that doesn't fit starts zoomed out; Codex zoomIn/zoomOut icons from Commons 6532015 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-EtytreeZoom.js]] * * Ji [[:en:MediaWiki:Gadget-EtytreeZoom.js]] hatiye wergirtin (guhartoya 88543908, 2025-12-11). * * The etymology tree box has a fixed height (Module:etymon/styles.css) and scrolls. For a tree that doesn't * fit, this gadget: * - starts zoomed out: the whole tree scaled down to the box's width, with the box as tall as the tree; * - adds an icon button in the box's top right corner that zooms in to the full-size, scrolling box * (opened on the entry, the bottom of the tree) and back; * - lets the zoomed-in tree be dragged with the mouse (touch screens already move it by swiping). * It works on the ".etytree" markup the tree template renders; without that on the page it does nothing. */ const elem = s => document.createRange().createContextualFragment(s).firstChild; // helper const ZOOM_IN = "Mezin bike"; const ZOOM_OUT = "Biçûk bike"; // Codex icons from Commons, drawn as masks in the text colour so they follow light and dark mode. const ZOOM_IN_ICON = "https://upload.wikimedia.org/wikipedia/commons/0/0d/Codex_icon_zoomIn_%28v2.6%29.svg"; const ZOOM_OUT_ICON = "https://upload.wikimedia.org/wikipedia/commons/2/26/Codex_icon_zoomOut_%28v2.6%29.svg"; mw.util.addCSS(` .etytree { position: relative; } .etytree-scale { position: absolute; z-index: 1; padding: 0.3em; } .etytree-scale-toggle.cdx-button { min-width: 0; min-height: 0; padding: 0.3em; opacity: 0.85; } .etytree-scale-toggle.cdx-button:hover { opacity: 1; } .etytree-zoom-icon { display: block; width: 1.1em; height: 1.1em; background-color: currentColor; -webkit-mask: var(--etytree-icon) center / contain no-repeat; mask: var(--etytree-icon) center / contain no-repeat; } .etytree-body { transform-origin: top left; } .etytree .NavContent.etytree-pannable { cursor: grab; } .etytree .NavContent.etytree-panning { cursor: grabbing; user-select: none; } `); // Scroll to the entry: the last block, at the bottom of the tree. function showEntry(navContent, tree) { navContent.scrollTop = navContent.scrollHeight; const blocks = tree.querySelectorAll(".etytree-block"); if (blocks.length) { const b = blocks[blocks.length - 1].getBoundingClientRect(); const n = navContent.getBoundingClientRect(); navContent.scrollLeft += (b.left + b.width / 2) - (n.left + n.width / 2); } } function zoomOut(tree) { const navContent = tree.parentElement; if (!navContent.clientWidth) // collapsed return; tree.style.transform = ""; navContent.style.overflow = "hidden"; // hide scrollbars navContent.style.maxHeight = "none"; // let the box grow to the whole tree const scale = Math.min(1, navContent.clientWidth / tree.scrollWidth); tree.style.transform = `scale(${scale})`; navContent.scrollLeft = 0; navContent.scrollTop = 0; navContent.style.height = `${tree.scrollHeight * scale}px`; } function zoomIn(tree) { const navContent = tree.parentElement; tree.style.transform = ""; navContent.style.overflow = ""; navContent.style.maxHeight = ""; navContent.style.height = ""; showEntry(navContent, tree); } // Drag to move around the tree. A drag shorter than a few pixels stays a click, so links still work. function makeDraggable(navContent) { let startX = 0, startY = 0, left = 0, top = 0, down = false, moved = false; navContent.addEventListener("mousedown", e => { if (e.button !== 0 || !navContent.classList.contains("etytree-pannable")) return; down = true; moved = false; startX = e.clientX; startY = e.clientY; left = navContent.scrollLeft; top = navContent.scrollTop; }); window.addEventListener("mousemove", e => { if (!down) return; const dx = e.clientX - startX, dy = e.clientY - startY; if (!moved && Math.abs(dx) + Math.abs(dy) < 5) return; moved = true; navContent.classList.add("etytree-panning"); navContent.scrollLeft = left - dx; navContent.scrollTop = top - dy; e.preventDefault(); }); window.addEventListener("mouseup", () => { if (!down) return; down = false; navContent.classList.remove("etytree-panning"); // The click that ends a drag fires before this timer; after it, clicks count again. Without // this, a drag released outside the box would swallow the next real click in it. setTimeout(() => { moved = false; }, 0); }); // A drag that ends on a link must not follow it. navContent.addEventListener("click", e => { if (moved) { e.preventDefault(); e.stopPropagation(); moved = false; } }, true); } mw.hook("wikipage.content").add(function($content) { for (let etytree of $(".etytree", $content).toArray()) { if (etytree.dataset.etytreeZoom) // already set up continue; etytree.dataset.etytreeZoom = "1"; let navContent = etytree.querySelector(".NavContent"); let tree = navContent.querySelector(".etytree-body"); let etytreeScale = elem(`<div class="etytree-scale"><button class="etytree-scale-toggle cdx-button cdx-button--icon-only"><span class="etytree-zoom-icon"></span></button></div>`); let toggle = etytreeScale.querySelector(".etytree-scale-toggle"); let maxHeight = parseFloat(getComputedStyle(navContent).maxHeight); // the fixed height, from the stylesheet let started = false; // A sibling of the box, placed over its top right corner, so it doesn't scroll with the tree. navContent.before(etytreeScale); etytree.treeZoomedOut = false; // Whether the full-size tree is wider or taller than the box. function tooBig() { return tree.scrollWidth > navContent.clientWidth + 1 || tree.scrollHeight > maxHeight + 1; } function setIcon() { const label = etytree.treeZoomedOut ? ZOOM_IN : ZOOM_OUT; const icon = etytree.treeZoomedOut ? ZOOM_IN_ICON : ZOOM_OUT_ICON; toggle.title = label; toggle.setAttribute("aria-label", label); toggle.firstElementChild.style.setProperty("--etytree-icon", `url("${icon}")`); } function update() { const open = navContent.clientHeight > 0; etytreeScale.style.display = open && tooBig() ? "" : "none"; if (open) { // Inside the box's border and clear of its scrollbar. etytreeScale.style.top = `${navContent.offsetTop + navContent.clientTop}px`; etytreeScale.style.right = `${etytree.clientWidth - navContent.offsetLeft - navContent.clientLeft - navContent.clientWidth}px`; } navContent.classList.toggle("etytree-pannable", !etytree.treeZoomedOut && open && tooBig()); } toggle.addEventListener("click", () => { etytree.treeZoomedOut = !etytree.treeZoomedOut; if (etytree.treeZoomedOut) zoomOut(tree); else zoomIn(tree); setIcon(); update(); }); // The box may start collapsed; zoom out the first time it has a size. function refresh() { if (!started && navContent.clientHeight > 0) { started = true; etytree.treeZoomedOut = tooBig(); setIcon(); } if (etytree.treeZoomedOut) // redo the zoom out zoomOut(tree); update(); } makeDraggable(navContent); setIcon(); refresh(); (new ResizeObserver(refresh)).observe(navContent); } }); // </nowiki> lbhh96sp2d69uj6lwi4gm4aatteby3n MediaWiki:Gadget-wikt.dsb-panels.js 8 1359173 6533073 6529971 2026-09-19T10:15:06Z Wikihez 7344 DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix 6533073 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.dsb-panels.js]] * * Everything DefSideBoxes shows once you click: the per-sense advanced panel, the subsection editors, * the part-of-speech picker, the template dialogs, the preview and the queued save. * * Loaded on demand by wikt.dsb, never on a plain page view. It exports only what that half calls. */ (function () { "use strict"; var sections = require("ext.gadget.wikt.core").sections; var edit = require("ext.gadget.wikt.edit"); var cite = require("ext.gadget.wikt.cite"); var util = edit.util; var posparams = edit.posparams; var wt = edit.wt; var startData = edit.data; var langs = edit.langs; var escapeRegExp = util.escapeRegExp; // Local names for the shared wikitext layer, so every call site below reads as it always did. var langHeaderSource = wt.langHeaderSource; var canonicalTemplateKey = wt.canonicalTemplateKey; var aliasPattern = wt.aliasPattern; var splitLeadingCalls = wt.splitLeadingCalls; var splitTemplateParams = wt.splitTemplateParams; var parseTemplateCalls = wt.parseTemplateCalls; var splitCallParams = wt.splitCallParams; var buildTemplateCall = wt.buildTemplateCall; var tdText = wt.tdText; var fetchTemplateData = wt.fetchTemplateData; var parseWordListCall = wt.parseWordListCall; var parseWordListCalls = wt.parseWordListCalls; var namedParam = wt.namedParam; var withNamedParam = wt.withNamedParam; var buildWordListCall = wt.buildWordListCall; var parseBulletWordList = wt.parseBulletWordList; var sectionNames = sections.sectionNames; var MANE_SECTION = sections.MANE_SECTION; var PAGE_SUBSECTIONS = sections.PAGE_SUBSECTIONS; var headingOuter = sections.headingOuter; var headingText = sections.headingText; var isManeHeading = sections.isManeHeading; var sectionTypeOf = sections.sectionTypeOf; var sectionOrdinalWithinLanguage = sections.sectionOrdinalWithinLanguage; var isFormOfWrapper = sections.isFormOfWrapper; var eachLeafDefinition = sections.eachLeafDefinition; var api = new mw.Api(); // metadata[lang].g, minus the grammatical-number codes start.js filters out with isNumberCode(), rendered // the way its genderLabel() does ("m-p" -> "mê (pirjimar)"). // start.js asks transitivity and structural form as two questions and joins them as "<form>-<base>", so // "gerguhêz" alone is "gh" and "xwerû" + "gerguhêz" is "x-gh". // Template call convertSectionToPos() drops under a newly-chosen POS heading, e.g. "Hoker" -> "{{hoker|ku}}". // A "Formeke X" (form-of) heading uses the unchanged base pos template. Doubles as the list of template // calls a conversion may find under the OLD heading and replace, rather than leave stacked beside the new one. // A section's template call. "Formeke Xê" uses X's own template with form=erê. Biwêj is recognised so a // conversion can replace its {{biwêj}}, but never written: no new ones. function posTemplateFor(header) { var form = /^Formeke (.+)ê$/.exec(header || ""); if (form && startData.posChoices[form[1]] && sections.hasFormHeading(form[1])) { return { name: form[1], params: ["form=erê"] }; } var key = util.decapitalize(header || ""); return startData.posChoices[key] ? { name: key, params: [] } : null; } // convertSectionToPos() drops whichever of the tag's names is actually present. var MANE_TAG_REGEX = wt.MANE_TAG_REGEX; // The six per-sense groups start.js writes as "#: {{tpl|lang|word1|word2}}" sub-lines under a "#" definition. // Array order controls where a new group line lands relative to existing ones. Every group lives behind the // quick row's "Hevmane û Bêhtir" dropdown; only the gloss and Nimûne/jêgirtin links sit in the row itself. var SENSE_GROUPS = startData.senseGroups; // The column word-list template new sections are written with; the rest of wordlistTemplates are // spellings the parser also accepts. var WORDLIST_TEMPLATE = startData.wordlistTemplates[0]; // ---- {{werger-ser}} / {{werger-bin}}: one translation box ---- // The pair brackets the rows; the translation editor gadget writes the rows themselves onto the // rendered page, so this only ever builds (and reads back) the opening call. // Parameters, from [[Şablon:werger-ser]]: 1 = the sense shown in the box head, 2 = a note in // parentheses after it, id = anchor override (defaults to 1), stûn = column count, firehî = column // width (default 26em), bgcolor, valign (default top), align (default left). var WERGER_NAMED = ["id", "stûn", "firehî", "bgcolor", "valign", "align"]; function buildWergerBlock(params) { var parts = ["werger-ser"]; // Positional slots: 2 can only be reached past 1, so an empty 1 still has to be written. if (params["1"] || params["2"]) { parts.push(params["1"] || ""); } if (params["2"]) { parts.push(params["2"]); } WERGER_NAMED.forEach(function (key) { if (params[key]) { parts.push(key + "=" + params[key]); } }); return "{{" + parts.join("|") + "}}\n{{werger-bin}}"; } // The opening call of the first block in `text`, as the same {1, 2, id, ...} object. Empty object when // there is none, so a half-typed draft restores as an empty form rather than throwing. function parseWergerBlock(text) { var out = {}; var body = wergerSerBody(String(text || "")); if (!body) { return out; } var positional = 0; splitTemplateArgs(body).forEach(function (arg) { var eq = arg.indexOf("="); var name = eq === -1 ? "" : $.trim(arg.slice(0, eq)); if (eq !== -1 && WERGER_NAMED.indexOf(name) !== -1) { out[name] = $.trim(arg.slice(eq + 1)); } else { out[String(++positional)] = $.trim(arg); } }); return out; } // Everything after "{{werger-ser|" up to the "}}" that closes it, or "" when there is no call or it // takes no parameters. Scans for the matching close rather than the first one: a gloss can hold a // template of its own, and a lazy regex would stop inside it. function wergerSerBody(text) { var m = /\{\{\s*werger-ser\s*(?=[|}])/.exec(text); if (!m) { return ""; } var depth = 1; var start = m.index + m[0].length; for (var i = start; i < text.length - 1; i++) { var two = text.substr(i, 2); if (two === "{{") { depth++; i++; } else if (two === "}}") { depth--; i++; if (!depth) { return text.charAt(start) === "|" ? text.slice(start + 1, i - 1) : ""; } } } return ""; } // Splits on "|" at brace/bracket depth 0, so a value containing a template or a link stays whole. function splitTemplateArgs(body) { var args = []; var depth = 0; var current = ""; for (var i = 0; i < body.length; i++) { var two = body.substr(i, 2); if (two === "{{" || two === "[[") { depth++; current += two; i++; continue; } if (two === "}}" || two === "]]") { depth--; current += two; i++; continue; } if (body[i] === "|" && depth <= 0) { args.push(current); current = ""; continue; } current += body[i]; } args.push(current); return args; } // Canonical ku.wiktionary "====" subsection order, used only as insertPageSubsection()'s insertion rank // (see subsectionRankForHeader()). Wider than PAGE_SUBSECTIONS: it also covers subsections the gadget // cannot create but still has to order around. var SUBSECTION_ORDER = startData.subsectionOrder; // ---- searchable <select> ---------------------------------------------------------------------------- // Same widget start.js gets from its util.js wrapNativeSelect(): the native <select> stays as the value // holder (so .val() and "change" handlers keep working) but is hidden behind a text input that filters an // overlay list. Ported rather than required() because util.js is a file inside start.js's package module, // which another gadget cannot reach; the template-row decoration start.js uses is left out. // util.js's wrapNativeSelect(): the native <select> stays the value holder behind a filtering text input. // It reads its own placeholder off data-placeholder, and its wiktku-* styles ship in start.css, so both // gadgets get the identical widget instead of two lookalikes. function makeSearchable($select, placeholder) { $select.attr("data-placeholder", placeholder || "Lê bigere…"); return util.wrapNativeSelect($select); } // ---- small shared utilities ---- // The readable half of an mw.Api rejection. var apiErrorMessage = util.apiErrorMessage; // Thrown from inside an edit() transform to bail out with a specific message. var SubmitAbort = util.SubmitAbort; // A gloss is one field on the page: the sense, then {{îzah|…}} explaining it when there is one. function joinGloss(mane, izah) { return izah ? $.trim(mane + " {{îzah|" + izah + "}}") : $.trim(mane); } // The two halves are linked separately, never joined first: linkify leaves template calls alone by // design, so anything inside {{îzah|…}} would never be looked at. // // A half is skipped when there is nothing in it worth looking up, and -- when onlyUnlinked is set -- // when it already carries a link. Someone who has linked a word by hand has made that half theirs, and // a save must not go on linking the rest of it behind their back; "Oto-lînk bike" leaves the flag off // and still links on demand. function linkifyGlossParts(mane, izah, done, onlyUnlinked) { function needsLinking(text) { if (!$.trim(text) || !util.hasLinkableText(text)) { return false; } return !(onlyUnlinked && text.indexOf("[[") !== -1); } function step(text, next) { if (!needsLinking(text)) { next(text, null); return; } util.linkifyText(text, function (linked, error) { // An empty answer would wipe what the user typed, so only real text is taken. next(typeof linked === "string" && $.trim(linked) ? $.trim(linked) : text, error || null); }); } step(mane, function (linkedMane, maneError) { step(izah, function (linkedIzah, izahError) { done(linkedMane, linkedIzah, maneError || izahError); }); }); } // Runs transformFn(content) inside mw.Api().edit()'s own transform callback so one fetch covers both the // edit-conflict check and the content, preventing a stale overwrite of someone else's edit. // // No badtoken retry here on purpose: edit() posts through postWithEditToken -> postWithToken, which // already throws the cached token away and repeats the request once when the wiki says "badtoken". // A second retry of our own would only double it. function editPage(summary, transformFn, onSuccess, onError) { api.edit(mw.config.get("wgPageName"), function (revision) { return { text: transformFn(revision.content), summary: summary }; }).then(onSuccess, function (codeOrAbort, result) { if (codeOrAbort instanceof SubmitAbort) { onError(codeOrAbort.message); } else { onError(util.msg.saveFailed + apiErrorMessage(codeOrAbort, result)); } }); } // ---- rendered preview: wikitext through the parse API, so a preview shows what the templates // actually produce rather than a plain list standing in for them ---- // Same text is usually asked for twice (open the preview, close it, open it again), so the promise is // kept rather than the call repeated. var renderCache = {}; /** * Renders wikitext as this page would render it. Resolves with an HTML string. * * pst: 1 applies pre-save transform, so ~~~~ and subst: behave as they will once saved. The * modulestyles/modules the parse reports are loaded before resolving: without them TemplateStyles is * missing and the preview would show the right markup in the wrong clothes. */ function renderWikitext(wikitext) { if (renderCache[wikitext]) { return renderCache[wikitext]; } renderCache[wikitext] = api.post({ action: "parse", format: "json", formatversion: 2, title: mw.config.get("wgPageName"), text: wikitext, contentmodel: "wikitext", prop: "text|modules|jsconfigvars", pst: 1, disablelimitreport: 1, disableeditsection: 1, disabletoc: 1 }).then(function (data) { var parsed = (data && data.parse) || {}; if (parsed.modulestyles && parsed.modulestyles.length) { mw.loader.load(parsed.modulestyles); } if (parsed.modules && parsed.modules.length) { mw.loader.load(parsed.modules); } return parsed.text || ""; }, function () { // A failed render must not be remembered, or the next attempt gets the rejection back. delete renderCache[wikitext]; return $.Deferred().reject().promise(); }); return renderCache[wikitext]; } /** * Puts rendered wikitext into $target, replacing whatever placeholder is there. * * The site's own gadgets are told about it through the "wikipage.content" hook, the same way * MediaWiki announces real content, so collapsible lists and the like behave in the preview too. */ // MediaWiki warns when the hook is fired on content that is not in the document, and a gadget that // listens to it can do nothing useful with nodes nobody can see. function announceContent($el) { if ($el.closest("html").length) { mw.hook("wikipage.content").fire($el); } } function fillWithRendered($target, wikitext, onFail) { return renderWikitext(wikitext).then(function (html) { if (!$target.closest("body").length) { return; // the preview was dropped while the parse was in flight } $target.empty().append($("<div class='mw-parser-output'></div>").html(html)); announceContent($target); }, function () { if (onFail) onFail(); }); } /** * Puts a rendered sense in place of the one on the page, keeping this gadget's own furniture (the * pencil's toolbar, the quick row, any open panel) where it is. The page's own nodes are detached * rather than dropped, so the returned function can put them straight back when the change is * cancelled or superseded. * * Nothing labels the result: the change is shown by the sense simply reading the way it will read, * and the queue box is what says nothing is saved yet. */ function replaceSenseInPlace($li, item) { var html = item.html; var $anchor = $li.children(".dsb-toolbar").last(); // class/id/data-* off the parsed <li>, so a queued maneid shows its pill here exactly as it will // once saved. The old values are kept for the restore below. var node = $li.get(0); var before = {}; $.each(node.attributes, function (_, attr) { before[attr.name] = attr.value; }); $.each(item.attrs, function (name, value) { if (name !== "class") { $li.attr(name, value); } }); var addedClasses = (item.attrs["class"] || "").split(/\s+/).filter(function (c) { return c && !$li.hasClass(c); }); $li.addClass(addedClasses.join(" ")); // add-examples hangs its own <ul> off the sense and opens its form as that <ul>'s next sibling. // Detaching those leaves the form to open into a tree nobody can see -- "+ Nimune/jegirtin" takes // the click and shows nothing -- so they stay where they are. Only the rows already in that <ul> // are hidden, since the preview draws the examples itself; the tool's own title line stays. var $keep = $li.children("ul, .add-example-form"); var $hiddenRows = $keep.filter("ul").children("li").filter(function () { return !$(this).find(".add-example-form-title").length; }); $hiddenRows.addClass("dsb-preview-hidden"); var originals = $li.contents().filter(function () { return !$(this).is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-preview-block, .dsb-sense-preview"); }).not($keep).get(); // Where the sense's own nodes sat, so cancelling puts them back there rather than above the quick // row -- the row belongs between the sense and its examples. var backAfter = originals.length ? originals[0].previousSibling : null; var $rendered = $("<span class='dsb-sense-preview'></span>").html(html); if ($anchor.length) { $anchor.after($rendered); } else { $li.prepend($rendered); } $(originals).detach(); announceContent($rendered); // The id pill is drawn by the same code a page load uses, so a queued maneid looks like a saved // one rather than like something this gadget invented. if (window.wikt && wikt.showIDs && wikt.showIDs.process) { wikt.showIDs.process($li); } // dsb.js puts the example pencils back on the redrawn examples. The originals keep theirs. $li.triggerHandler("dsbSenseRedrawn"); return function () { $hiddenRows.removeClass("dsb-preview-hidden"); $li.removeClass(addedClasses.join(" ")); $.each(item.attrs, function (name) { if (name === "class") { return; } if (Object.prototype.hasOwnProperty.call(before, name)) { $li.attr(name, before[name]); } else { $li.removeAttr(name); } }); $li.children(".senseid-displayed, .etymid-displayed, .etymonid-displayed").remove(); if (backAfter && backAfter.parentNode === node) { $(backAfter).after(originals); } else if ($anchor.length) { $anchor.after(originals); } else { $li.prepend(originals); } $rendered.remove(); }; } /** * The <li> out of a parsed "#" block, and the attributes it carries. * * The parse wraps it in its own <ol>, which must not reach the page: the sense already has a number * from the list it lives in. A leading {{maneid}} also makes the parser emit an empty * "li.mw-empty-elt" ahead of the real one, so the first <li> is not necessarily the sense. * * The attributes matter as much as the content: {{maneid|ku|x}} renders as class="senseid" * data-id="x" on the <li> itself, which is what wikt.showids draws its pill from. */ function parsedSenseItem(html, depth) { var $item = $("<div></div>").html(html).find("ol > li").filter(function () { return !$(this).hasClass("mw-empty-elt"); }).first(); // A sub-sense parsed on its own comes back one <ol> deeper per "#": "##" is a list inside a list. // Descend as far as the sense's own depth, or its number would be drawn inside a second list -- // "2." with a "1." under it. for (var level = 1; level < (depth || 1) && $item.length; level++) { var $inner = $item.children("ol").children("li").filter(function () { return !$(this).hasClass("mw-empty-elt"); }).first(); if (!$inner.length) { break; } $item = $inner; } if (!$item.length) { return { html: html, attrs: {} }; } var attrs = {}; $.each($item.get(0).attributes, function (_, attr) { attrs[attr.name] = attr.value; }); return { html: $item.html(), attrs: attrs }; } // This gadget's own save queue + floating widget, separate from the shared Gadget-Editor queue. // Each entry keeps its own transformFn so saveQueueNow() can re-run all of them against one fresh fetch. var dsbQueue = { // [{key, summary, transformFn, runLast, removePreview}]; transformFn: baseContent -> {content, warnings}. // removePreview lives on the entry so replacing one entry takes its own live DOM preview with it. entries: [] }; var $queueBox = null; function dropPreview(entry) { if (typeof entry.removePreview === "function") { try { entry.removePreview(); } catch (e) { /* a preview failing to clean up should never block the queue itself */ } entry.removePreview = null; } } function clearAllPreviews() { dsbQueue.entries.forEach(dropPreview); } function clearQueue() { clearAllPreviews(); dsbQueue.entries = []; if ($queueBox) { $queueBox.$list.empty(); $queueBox.$box.hide(); } } // Closes every editor UI on the page. Each open box's own "x" clears its getter, restores its picker // link and updates the counter, so those are triggered rather than repeating that work here; hiding a // row alone would leave its fields populated and the next pencil click would reopen them half-filled. function closeAllPanels() { $(".dsb-open-boxes .dsb-box-remove").trigger("click"); $(".dsb-quick-note").hide().text(""); $(".dsb-more-menu").hide(); $(".dsb-subsection-panel, .dsb-convert-pos-panel").hide(); // dsb.js owns each pencil's pinned state; tell it rather than hiding behind its back, or the next // click on the pencil would only toggle "pinned" off and appear to do nothing. $(".dsb-quick-row").trigger("dsbCancel"); } function ensureQueueBox() { if ($queueBox) { return $queueBox; } var $box = $("<div class='dsb-queue-box'></div>").hide(); var $close = $("<a href='#' class='dsb-queue-close' title='Veşêre'>&#215;</a>"); var $title = $("<div class='dsb-queue-title'></div>").text("Guhartinên li benda qeydkirinê"); var $list = $("<ul class='dsb-queue-list'></ul>"); var $empty = $("<div class='dsb-queue-empty'></div>").text( "Guhartinên te dê li vir werin rêzkirin. Heta ku tu pêl «Guhartinan qeyd bike» nekî, " + "tiştek li ser rûpelê nayê weşandin." ); var $status = $("<div class='dsb-queue-status'></div>"); var $save = $("<button type='button' class='dsb-queue-save'>Guhartinan qeyd bike</button>"); var $cancel = $("<button type='button' class='dsb-queue-cancel'></button>").text(util.msg.cancel); var $actions = $("<div class='dsb-queue-actions'></div>").append($save, $cancel); $close.on("click", function (e) { e.preventDefault(); $box.hide(); }); $cancel.on("click", function () { clearQueue(); closeAllPanels(); }); $save.on("click", function () { saveQueueNow(); }); $box.append($close, $title, $empty, $list, $actions, $status); $(document.body).append($box); $queueBox = { $box: $box, $list: $list, $empty: $empty, $status: $status, $save: $save, $cancel: $cancel }; return $queueBox; } // Takes one change out of the queue and puts the page back as it was before it, its in-place preview // included. The queue is the only record of what "Guhartinan qeyd bike" will write, so every line in it // has to be removable on its own -- closing the panel that made a change does not unmake it. // Each preview draws the page the whole queue would save, so one entry leaving changes what all the // others should show. They are taken down and drawn again from what is left. function redrawPreviews() { dsbQueue.entries.forEach(function (entry) { if (typeof entry.previewFn !== "function") { return; } dropPreview(entry); try { var removePreview = entry.previewFn(); if (typeof removePreview === "function") { entry.removePreview = removePreview; } } catch (e) { /* a broken preview never stops the queue */ } }); } function dropQueueEntry(entry) { var at = dsbQueue.entries.indexOf(entry); if (at === -1) { return; } dropPreview(entry); dsbQueue.entries.splice(at, 1); redrawPreviews(); renderQueueBox(); hideQueueIfIdle(); } function renderQueueBox() { var box = ensureQueueBox(); box.$list.empty(); dsbQueue.entries.forEach(function (entry) { var $drop = $("<button type='button' class='dsb-queue-drop'>&#215;</button>") .attr("title", "Vê guhartinê ji rêzê derxe"); $drop.on("click", function () { dropQueueEntry(entry); }); box.$list.append($("<li></li>").text(entry.summary).append($drop)); }); box.$empty.toggle(!dsbQueue.entries.length); box.$status.removeClass("dsb-status-ok dsb-status-error").text(""); box.$save.prop("disabled", !dsbQueue.entries.length); box.$box.show(); } // Shown the moment a panel opens, empty, so it is clear before anything is typed that a change waits // for "Guhartinan qeyd bike" rather than publishing itself. function openQueueBox() { renderQueueBox(); } // Nothing queued and no form left open means nothing to save, so the box goes away rather than // lingering on an empty state. function hideQueueIfIdle() { if (dsbQueue.entries.length || !$queueBox) { return; } if ($(".dsb-quick-row:visible, .dsb-subsection-panel:visible, .dsb-convert-pos-panel:visible").length) { return; } $queueBox.$box.hide(); } // Asks core's postEdit module to show its toast on the next load (dsb.js loads it there), then reloads. // Loaded here rather than declared as a dependency, so a reload happens even if it fails. function reloadWithPostEditNotice() { mw.loader.using("mediawiki.action.view.postEdit").then(function (require) { require("mediawiki.action.view.postEdit").fireHookOnPageReload("saved"); }).always(function () { location.reload(); }); } // A transform returns either the new page text or {content, warnings}; both shapes are accepted. // One that returns neither stops the save, named, rather than writing a broken page. function transformedContent(entry, pageContent) { var result = entry.transformFn(pageContent); var next = typeof result === "string" ? result : (result && result.content); if (typeof next !== "string") { throw new SubmitAbort("Guhartin nehate sepandin: " + entry.summary); } return next; } // Queue order, except that runLast entries move to the end: converting "=== Mane ===" into a real POS // heading renames the very heading every other queued change locates itself by. // Those run from the bottom of the page up: a rename changes the ordinals of the sections after it // ("Mane 2" becomes "Mane 1"), never of the ones before. function orderedEntries() { var normal = []; var last = []; dsbQueue.entries.forEach(function (entry) { (entry.runLast ? last : normal).push(entry); }); last.sort(function (a, b) { return b.pagePosition - a.pagePosition; }); return normal.concat(last); } /** * The pending page as previews and example lookups need it: every queued transform, in save order, * except the runLast section renames. Those callers find their section under the heading it has on * the page now, which a queued "Mane" -> "Navdêr" would take away, and a rename leaves the senses as * they are. An entry that cannot apply is skipped -- the save reports that properly, and a preview * must not shout. */ function queuedContent(pageContent) { var content = pageContent; orderedEntries().filter(function (entry) { return !entry.runLast; }).forEach(function (entry) { try { content = transformedContent(entry, content); } catch (e) { // Left out of the preview; the save reports it properly. Named, so a change that fails to // draw is distinguishable from one with nothing to draw. mw.log.warn("wikt.dsb: pêşdîtin bêyî vê guhartinê hate xêzkirin — " + entry.summary, e); } }); return content; } /** * Redraws one sense where it sits, from the page the queue would save -- so a queued gloss edit, a * queued example and everything else pending on that sense are shown together, rendered by the parser * rather than described in a box. Returns the queue's own "take the preview down" function. * * One preview per sense: a second queued change takes the first drawing down and draws the queue. */ function previewSense($li, language, sectionType, sectionOrdinal, definitionLevel) { var cancelled = false; var restore = null; function undo() { cancelled = true; if (restore) { restore(); restore = null; } if ($li.data("dsbPreview") === undo) { $li.removeData("dsbPreview"); } } var previous = $li.data("dsbPreview"); if (typeof previous === "function") { previous(); } $li.data("dsbPreview", undo); fetchPageContent().then(function (pageContent) { if (cancelled) { return; } var wikitext; try { wikitext = senseBlockWikitext(queuedContent(pageContent), language, sectionType, sectionOrdinal, definitionLevel); } catch (e) { return; } renderWikitext(wikitext).then(function (html) { if (cancelled || $li.data("dsbPreview") !== undo || !$li.closest("body").length) { return; } restore = replaceSenseInPlace($li, parsedSenseItem(html, definitionLevel.length - 1)); }); }); return undo; } // The real save: re-runs every queued transformFn, in order, against one freshly-fetched revision and // posts the result as a single edit with a combined summary. function saveQueueNow() { if (!dsbQueue.entries.length) { return; } var box = ensureQueueBox(); box.$save.prop("disabled", true); box.$cancel.prop("disabled", true); box.$status.removeClass("dsb-status-ok dsb-status-error").text("Tê qeydkirin…"); var entries = orderedEntries(); // Grouped by place, in the order the places were first queued: several changes to one section read // as "Kurmancî/Navdêr 2: a, b, c" rather than repeating the section name in front of each of them. var order = []; var byPlace = {}; entries.forEach(function (entry) { if (!Object.prototype.hasOwnProperty.call(byPlace, entry.place)) { byPlace[entry.place] = []; order.push(entry.place); } byPlace[entry.place].push(entry.action); }); var combinedSummary = order.map(function (place) { var actions = byPlace[place].join(", "); return place ? place + ": " + actions : actions; }).join("; ") + " (DefSideBoxes)"; editPage( combinedSummary, function (pageContent) { var content = pageContent; entries.forEach(function (entry) { content = transformedContent(entry, content); }); return content; }, function (data) { forgetPageContent(); clearAllPreviews(); dsbQueue.entries = []; box.$list.empty(); box.$status .removeClass("dsb-status-error") .addClass("dsb-status-ok") .text("✓ Hemû guhartin hatin qeydkirin."); box.$save.prop("disabled", true); box.$cancel.prop("disabled", false); // A real edit reloads the page and gets MediaWiki's own "Guhartina te hat weşandin." toast, the // one a normal save shows. A null edit changed nothing, so the page stays as it is. if (data && data.newrevid) { reloadWithPostEditNotice(); } }, function (message) { box.$save.prop("disabled", false); box.$cancel.prop("disabled", false); box.$status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message); } ); } // "Kurmancî/Navdêr" -- where a queued change lands, for its summary. The language name comes from the // shipped list; an unknown code is left as the code itself. // "Kurmancî/Navdêr", or "Kurmancî/Navdêr 2" where the language has more than one section of that // type. Without the number a summary on a page with two Navdêr sections named neither of them. // Numbered only when it disambiguates: on the usual page "Navdêr 1" would just be noise. function placeLabel(language, sectionType, $h3) { return langLabel(language) + "/" + sectionLabel(sectionType, $h3); } // Bilêvkirin sits above the parts of speech and belongs to the whole language, so naming the section // it was opened from would say something untrue about what the edit touches. function subsectionPlaceLabel(subsection, language, sectionType, $h3) { if (subsection && subsection.free) { return langLabel(language) + "/" + subsection.header; } return subsection && subsection.place === "pron" ? langLabel(language) : placeLabel(language, sectionType, $h3); } function sectionLabel(sectionType, $h3) { if ($h3 && $h3.length && sections.sectionTypeCountWithinLanguage($h3) > 1) { return sectionType + " " + sections.sectionOrdinalWithinLanguage($h3); } return sectionType; } // Capitalised because it opens the summary; Kurdish otherwise writes language names lower-case. function langLabel(language) { var names = langs.names(); return util.capitalize(names[language] || language); } // The parts of a sense the form actually changed, so the summary lists them instead of saying nothing. function senseChangeLabels(changes) { var parts = []; var changed = changes.changed || {}; if (changes.gloss) { parts.push("mane"); } if (changes.newSense) { parts.push("maneyeke nû"); } SENSE_GROUPS.forEach(function (group) { if (changed["word:" + group.key]) { parts.push(group.label.toLowerCase()); } }); if (changed.maneid) { parts.push("id"); } if (changed.etiket) { parts.push("etîket"); } if (changed.kategori) { parts.push("kategorî"); } return parts; } // Queues transformFn(baseWikitext) -> {content, warnings} for the real save to run later against fresh // content (see saveQueueNow()); nothing here touches the page yet. Also runs previewFn(), which drops a // small "not saved yet" preview into the live DOM at the change's own spot on the page. Shared by every // panel that queues a wikitext change: buildAdvancedPanel, buildSubsectionPanel, buildConvertPosPanel. // place is what the change is being made to ("Kurmancî/Navdêr 2"), action is what is being done to it. // Kept apart rather than pre-joined so saveQueueNow() can name a section once and list everything // queued against it after it, instead of repeating the place before every item. function queueChange(place, action, transformFn, $save, $status, previewFn, opts) { opts = opts || {}; var entry = { key: opts.key || null, place: place || "", action: action, summary: place ? place + ": " + action : action, transformFn: transformFn, runLast: !!opts.runLast, pagePosition: opts.pagePosition || 0, // Kept, not just run: redrawPreviews() calls it again when another entry leaves the queue. previewFn: typeof previewFn === "function" ? previewFn : null, removePreview: null }; // Queuing the same target twice replaces the pending change rather than stacking a second one -- // two "+Têkildar" entries would both run, and the second would abort on "Ev beş jixwe heye". var superseded = false; if (entry.key) { for (var i = dsbQueue.entries.length - 1; i >= 0; i--) { if (dsbQueue.entries[i].key === entry.key) { dropPreview(dsbQueue.entries[i]); dsbQueue.entries.splice(i, 1); superseded = true; } } } dsbQueue.entries.push(entry); $status.removeClass("dsb-status-error").addClass("dsb-status-ok").text( "✓ li rêza guhartinan hate zêdekirin — pêl «Guhartinan qeyd bike» bike da ku bi cih bibe." ); $save.prop("disabled", false); if (previewFn) { try { var removePreview = previewFn(); if (typeof removePreview === "function") { entry.removePreview = removePreview; } } catch (e) { /* a broken preview should never stop the change from being queued */ } } // What the superseded entry drew is gone from the queue, so whatever else is drawn from it is stale. if (superseded) { dsbQueue.entries.forEach(function (other) { if (other !== entry) { dropPreview(other); } }); redrawPreviews(); } renderQueueBox(); } // Runs text through the ext.gadget.linkify gadget ($.kuLinkify) and calls back with the linkified result. // Passes the text through unchanged if the gadget can't be loaded, so it never blocks a save. var linkifyText = util.linkifyText; // ---- wikitext location ---- // // One copy for both editing gadgets, in wikt.edit: add-examples writes into the same places. var langSectionRange = wt.langSectionRange; var locateSection = wt.locateSection; var findDefinitionLine = wt.findDefinitionLine; /** * The wikitext of one sense's own block: its "#" line plus everything nested under it -- the "#:" word * lines, the "#*" citations and any sub-senses -- stopping at the next line of the same depth that * starts a new sense. Parsed on its own that block renders as exactly the <li> the page shows. */ function senseBlockWikitext(pageContent, language, sectionType, sectionOrdinal, definitionLevel) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var depth = definitionLevel.length - 1; var out = [lines[defLine]]; for (var i = defLine + 1; i < lines.length; i++) { var m = /^(#+)([:*]?)/.exec(lines[i]); if (!m || m[1].length < depth) { break; } // Same depth and no ":" or "*" after the hashes is the next sense, not part of this one. if (m[1].length === depth && !m[2]) { break; } out.push(lines[i]); } return out.join("\n"); } // Inserts or extends a "#: {{tplKey|lang|word1|word2}}" sub-line for one sense (start.js's wordLine() // format). If a line for this tplKey already exists under the definition, missing words are appended to // it; otherwise a new line lands after the last existing group line, always before any "#*" citation lines. function insertSenseWords(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, words, opts) { opts = opts || {}; var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = new Array(definitionLevel.length).join("#"); // definitionLevel.length - 1 "#" characters // Group 1 is the spelling the page uses, group 2 the parameters: an existing {{hevwate}} stays // {{hevwate}} rather than being silently renamed to {{hevmane}}. var tplLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + aliasPattern(tplKey) + ")\\s*\\|([^}]*)\\}\\}\\s*$"); var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|"); var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|"); var anyBlockLineRegex = new RegExp("^" + marker + "[:*]"); var lastGroupLine = -1; for (var i = defLine + 1; i < lines.length; i++) { if (!anyBlockLineRegex.test(lines[i])) { break; } var tplMatch = tplLineRegex.exec(lines[i]); if (tplMatch) { var foundKey = tplMatch[1]; if (opts.replace) { // Editing an existing list: an empty result means the user cleared it, so drop the line. if (words.length) { lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + words.join("|") + "}}"; } else { lines.splice(i, 1); } return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } var params = tplMatch[2].split("|"); // [lang, word1, word2, ...] var existingWords = params.slice(1); words.forEach(function (w) { if (existingWords.indexOf(w) === -1) { existingWords.push(w); } }); lines[i] = marker + ": {{" + foundKey + "|" + language + "|" + existingWords.join("|") + "}}"; return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } if (groupLineRegex.test(lines[i])) { lastGroupLine = i; } } var insertAt = lastGroupLine >= 0 ? lastGroupLine + 1 : defLine + 1; lines.splice(insertAt, 0, marker + ": {{" + tplKey + "|" + language + "|" + words.join("|") + "}}"); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Canonical left-to-right order of the small templates that can prefix a definition line's gloss text: // maneid, then kategori (K), then etîket (e). var LEADING_TPL_ORDER = startData.leadingTplOrder; // True for a leading call the advanced panel edits in a box of its own -- those are kept out of the // gloss box so the same template is never editable in two places at once. Redirect spellings count: // {{f}} and {{etîket}} are {{e}}. function hasOwnFieldBox(key) { return LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(key)) !== -1; } // Inserts, extends, or (with opts.replace) overwrites one of the small templates that prefix a definition // line's gloss text -- {{maneid|lang|id}}, {{K|lang|kat1|...}} or {{e|lang|etîket1|...}}. Under // opts.replace an empty values list removes the call rather than writing an empty one. function insertLeadingSenseTpl(pageContent, language, sectionType, sectionOrdinal, definitionLevel, tplKey, values, opts) { opts = opts || {}; var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, ""); // Collecting the whole leading-call run means an existing tplKey call is found and merged wherever it // already sits, not just when it happens to be first. var split = splitLeadingCalls(afterMarker); var calls = split.calls; var rest = split.rest; var existing = null; calls.forEach(function (c) { if (canonicalTemplateKey(c.key) === tplKey) { existing = c; } }); if (existing) { if (opts.replace) { // Editing an existing call: an empty result means the user cleared it, so drop the call. if (values.length) { existing.params = [language].concat(values); } else { calls = calls.filter(function (c) { return c !== existing; }); } } else { var existingVals = existing.params.slice(1); values.forEach(function (v) { if (existingVals.indexOf(v) === -1) { existingVals.push(v); } }); existing.params = [language].concat(existingVals); } } else if (!values.length) { return pageContent; // nothing to add, and nothing there to clear } else { // Not present yet -- insert right before the first existing call that outranks tplKey in // LEADING_TPL_ORDER (an unrecognized call always outranks everything), or at the end of the run. var myRank = LEADING_TPL_ORDER.indexOf(tplKey); var insertAt = calls.length; for (var i = 0; i < calls.length; i++) { var otherRank = LEADING_TPL_ORDER.indexOf(canonicalTemplateKey(calls[i].key)); if (otherRank === -1 || otherRank > myRank) { insertAt = i; break; } } calls.splice(insertAt, 0, { key: tplKey, params: [language].concat(values) }); } var rebuilt = calls.map(function (c) { return "{{" + c.key + "|" + c.params.join("|") + "}}"; }).join(" "); lines[defLine] = marker + " " + (rebuilt ? rebuilt + " " : "") + rest; return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Replaces just the gloss text of a definition line, leaving any leading template calls untouched -- // the save half of "Maneyê biguhêre" (edit sense). function updateSenseGloss(pageContent, language, sectionType, sectionOrdinal, definitionLevel, newGloss) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var afterMarker = lines[defLine].slice(marker.length).replace(/^\s+/, ""); // The box holds everything except the calls with their own field, so those are put back in front. // Dropping "{{mane?}}" here is what clears start.js's placeholder once a real gloss is written. var kept = splitLeadingCalls(afterMarker).calls.filter(function (c) { return hasOwnFieldBox(c.key); }); var leadingText = kept.map(function (c) { return "{{" + c.key + "|" + c.params.join("|") + "}}"; }).join(" "); lines[defLine] = marker + " " + (leadingText ? leadingText + " " : "") + newGloss; return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Deletes one sense: its definition line plus everything indented under it (its "#:" groups, "#*" // citations, any sub-senses). Refuses to empty a section, since a POS heading with no senses is worse // than the sense the user wanted gone. // A new sense goes directly below the one whose pencil asked for it -- after the lines that sense owns // (its "#:" examples, "#*" citations and "##" sub-senses), so it reads as the next sense rather than // landing at the foot of the section. It takes the same marker depth as its neighbour, so asking from // a "##" sub-sense adds a sibling sub-sense. function insertNewSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel, text) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var end = defLine + 1; var ownedRegex = new RegExp("^" + marker + "[#:*]"); while (end < lines.length && ownedRegex.test(lines[end])) { end++; } lines.splice(end, 0, marker + " " + text); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } function removeSense(pageContent, language, sectionType, sectionOrdinal, definitionLevel) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var marker = /^#+/.exec(lines[defLine])[0]; var end = defLine + 1; var ownedRegex = new RegExp("^" + marker + "[#:*]"); while (end < lines.length && ownedRegex.test(lines[end])) { end++; } // Top-level senses of this section only -- "##" sub-senses go with their parent either way. if (definitionLevel.length === 2) { var siblings = 0; for (var i = loc.posLineIndex + 1; i < lines.length && !/^==/.test(lines[i]); i++) { if (/^#[^*#:]/.test(lines[i])) { siblings++; } } if (siblings < 2) { throw new SubmitAbort("Ev maneya dawî ya vê beşê ye. Ji bo rakirinê divê tu tevahiya beşê rakî."); } } lines.splice(defLine, end - defLine); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Fetches the page's current wikitext and pulls out just this sense's gloss text to prefill the "Maneyê // biguhêre" form. A plain read, not part of the hardened save path -- the actual save still re-fetches // fresh content, so only the prefilled text itself could be a little stale. // Current contents of one existing subsection, for prefilling the edit form. // This page's current wikitext. // One fetch for the whole queue: every preview reads the same revision, and asking per preview meant // downloading the page again for each queued change. Dropped after a save, when the page has moved on. var pageContentPromise = null; function forgetPageContent() { pageContentPromise = null; } function fetchPageContent() { if (pageContentPromise) { return pageContentPromise; } pageContentPromise = rawPageContent(); // A failed read must not be remembered as the answer. pageContentPromise.fail(forgetPageContent); return pageContentPromise; } function rawPageContent() { return api.get({ action: "query", prop: "revisions", rvprop: "content", titles: mw.config.get("wgPageName"), formatversion: 2 }).then(function (data) { var page = data.query && data.query.pages && data.query.pages[0]; var content = page && !page.missing && page.revisions && page.revisions[0] && page.revisions[0].content; if (!content) { throw new SubmitAbort("Nikare muhtewaya rûpelê bixwîne."); } return content; }); } function fetchPageSubsection(language, sectionType, sectionOrdinal, subsection) { return fetchPageContent().then(function (content) { return readPageSubsection(content, language, sectionType, sectionOrdinal, subsection); }); } function fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel) { return fetchPageContent().then(function (content) { return readSenseFields(content, language, sectionType, sectionOrdinal, definitionLevel); }); } // Everything the advanced panel can edit about one sense, read off its definition line and the "#:" lines // under it: the raw gloss (templates included), the leading maneid/K/e values, and each word-list group. function readSenseFields(pageContent, language, sectionType, sectionOrdinal, definitionLevel) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var defLine = findDefinitionLine(lines, loc.posLineIndex, definitionLevel); var defMarker = /^#+/.exec(lines[defLine])[0]; var afterMarker = lines[defLine].slice(defMarker.length).replace(/^\s+/, ""); var leading = {}; splitLeadingCalls(afterMarker).calls.forEach(function (c) { leading[canonicalTemplateKey(c.key)] = c.params.slice(1); }); // Only start.js's "{{mane?|lang}}" placeholder is hidden; every other template stays visible so it can // be edited by hand in the gloss box. // The gloss box shows the line minus the calls that have their own box ({{maneid}}, {{K}}, {{e}} and // their redirects) and minus start.js's "{{mane?}}" placeholder. Everything else -- a {{g}} link, a // {{guharto}} -- stays visible and editable there. var split = splitLeadingCalls(afterMarker); var glossCalls = split.calls.filter(function (c) { return !hasOwnFieldBox(c.key) && canonicalTemplateKey(c.key) !== "mane?"; }); var glossLead = glossCalls.map(function (c) { return "{{" + c.key + "|" + c.params.join("|") + "}}"; }).join(" "); var gloss = $.trim((glossLead ? glossLead + " " : "") + split.rest); var marker = new Array(definitionLevel.length).join("#"); var groupKeysPattern = SENSE_GROUPS.map(function (g) { return aliasPattern(g.key); }).join("|"); var groupLineRegex = new RegExp("^" + marker + ":\\s*\\{\\{\\s*(" + groupKeysPattern + ")\\s*\\|([^}]*)\\}\\}\\s*$"); var anyBlockLineRegex = new RegExp("^" + marker + "[:*]"); var words = {}; for (var i = defLine + 1; i < lines.length; i++) { if (!anyBlockLineRegex.test(lines[i])) { break; } var m = groupLineRegex.exec(lines[i]); if (m) { words[canonicalTemplateKey(m[1])] = m[2].split("|").slice(1); } } return { gloss: gloss, maneid: leading.maneid ? leading.maneid[0] : "", etiket: leading.e || [], kategori: leading.K || [], words: words }; } // Finds a POS block's body range (up to, but not including, the next heading of level <= 3), and the // header text + line index of any "====" subsections it already contains. // depth is the part-of-speech heading's own ("===" on most entries, "====" where the senses are // grouped under numbered etymologies). Its block runs to the next heading at that depth or shallower, // and its subsections are the headings one deeper. function posBlockBounds(lines, posLineIndex, depth) { depth = depth || 3; var blockEnd = wt.headingAtOrAbove(depth); var subsectionHeading = wt.headingAtDepth(depth + 1); var end = lines.length; var existingHeaders = []; for (var i = posLineIndex + 1; i < lines.length; i++) { if (blockEnd.test(lines[i])) { end = i; break; } var sub = subsectionHeading.exec(lines[i]); if (sub) { existingHeaders.push({ header: $.trim(sub[1]), lineIndex: i }); } } return { end: end, existingHeaders: existingHeaders, depth: depth }; } // Looks up a header's rank in SUBSECTION_ORDER. -1 for a header that isn't one of ours; such a header is // never used as an insertion anchor. function subsectionRankForHeader(header) { return SUBSECTION_ORDER.indexOf(header); } // Body line range of one "====" subsection inside a POS block: everything after its heading up to the next // "====" heading, or the end of the block. Null if the block has no such subsection. function subsectionBodyRange(bounds, header) { var headers = bounds.existingHeaders; for (var i = 0; i < headers.length; i++) { if (headers[i].header === header) { return { start: headers[i].lineIndex + 1, end: i + 1 < headers.length ? headers[i + 1].lineIndex : bounds.end }; } } return null; } // ---- template-parameter editing ------------------------------------------------------------------- // A gloss that is nothing but one template call gets a labelled box per parameter instead of a raw // wikitext line, the way VisualEditor's template dialog works. // The single template call a gloss is made of, or null when the line is anything less tidy. {{g|...}} is a // link inside the gloss rather than the gloss itself, so it neither disqualifies the line nor gets a form. function glossTemplateTarget(gloss) { var parsed = parseTemplateCalls(gloss || ""); if (parsed.otherContent) { return null; } var editable = parsed.calls.filter(function (c) { return canonicalTemplateKey(c.name) !== "g"; }); return editable.length === 1 ? editable[0] : null; } // ---- the three places that carry no "====" heading of their own ---------------------------------- // Bilêvkirin is a "===" section above the POS blocks, images sit at the top of a POS block, and the // h-bnr hatnote goes above the first language heading. Each is located here and then read, written or // inserted through the same three lines of splice, so nothing below needs to know about them. var IMAGE_LINE = /^\[\[\s*(?:Wêne|File|Image|Dosya)\s*:/i; /** * {lines, langSectionIndex, exists, start, end, insertAt} for a subsection carrying a "place", or null * for an ordinary one. start..end is the body as it stands; insertAt is where a missing one goes. */ function locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection) { var place = subsection.place; if (!place) { return null; } var i, end; if (place === "page-top") { // Above every language section, so the whole page is the search space. The call is found under // any of its names, and its own name is carried back so a save never renames it. var pageLines = pageContent.split("\n"); var call = wt.findHbnrCall(pageContent); if (call) { return { lines: pageLines, langSectionIndex: 0, exists: true, call: call, start: call.lineIndex, end: call.lineIndex + 1, insertAt: call.lineIndex }; } return { lines: pageLines, langSectionIndex: 0, exists: false, start: 0, end: 0, insertAt: 0 }; } var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; if (place === "pron") { // One per language, not one per part of speech, so it is looked for above the POS heading. for (i = 0; i < loc.posLineIndex; i++) { var h3 = /^===\s*([^=]+?)\s*===/.exec(lines[i]); if (h3 && $.trim(h3[1]) === subsection.header) { end = i + 1; while (end < lines.length && !/^==/.test(lines[end])) { end++; } return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: true, start: i + 1, end: end, insertAt: i }; } } // Straight after the language heading, which puts it before every POS block. return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: false, start: 1, end: 1, insertAt: 1 }; } if (place === "pos-top") { // Between the conjugation line and the headword template -- where the wizard writes them. var at = loc.posLineIndex + 1; while (at < lines.length && /^\{\{\s*ku-tewîn/.test($.trim(lines[at]))) { at++; } var from = at; while (at < lines.length && IMAGE_LINE.test($.trim(lines[at]))) { at++; } return { lines: lines, langSectionIndex: loc.langSectionIndex, exists: at > from, start: from, end: at, insertAt: from }; } return null; } // The wikitext a "place" section's content becomes. A word list there is one template call, not a // {{kol3}} block, so the words are joined into it -- and any ⊕ modifier a row picked up is dropped, // since a page name is all the call can carry. function loosePlaceBody(subsection, content, language) { if (subsection.kind === "images") { return $.grep($.map(content || [], function (image) { return wt.buildImageLine({ file: image.file, caption: wt.captionForLang(image.caption, language), alt: image.alt, size: image.size, extra: image.extra }); }), Boolean).join("\n"); } return content; } // The words a "place" word list holds, flattened out of its single group. Any ⊕ modifier a row picked // up is dropped: a page name is all the call can carry. function loosePlaceWords(content) { var words = []; $.each(content || [], function (_, group) { $.each(group.words || [], function (_, raw) { var plain = $.trim(util.parseWordValue(raw).word); if (plain && $.inArray(plain, words) === -1) { words.push(plain); } }); }); return words; } // Writes one of those places, inserting it when it is not there yet and replacing it when it is. Only // Bilêvkirin carries a heading; the other two are bare lines. function writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection, content) { var at = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection); if (!at) { throw new SubmitAbort("Cih nehate dîtin: " + subsection.header); } // A call naming a subpage -- "{{h-bnr/-ane}}" -- holds a list shared by every page transcluding // it. Writing here would change this page alone and desync the rest, so the edit is refused and // the template that actually owns the list is named instead. if (at.call && at.call.subpage) { throw new SubmitAbort("Ev rûpel «{{" + at.call.name + "}}» bi kar tîne — lîste li " + "[[Şablon:" + at.call.subpage + "]] ye, lê wê zêde bike, ne li vê rûpelê."); } // A word list here is one template call, so it is built where the existing call's own name is // known -- editing "{{bnr-h|...}}" must not turn it into "{{h-bnr|...}}". var body = subsection.kind === "wordlist" ? wt.buildHbnrCall(loosePlaceWords(content), at.call && at.call.name) : $.trim(content || ""); // A "===" section is separated from what is above and below it by a blank line, the way the rest // of an entry is written. The other two places are bare lines inside a block and take none. var heading = subsection.place === "pron"; function blank(index) { return $.trim(at.lines[index] || "") === ""; } if (at.exists) { if (body) { var replacement = [body]; // end is the next "==" heading; the blank line before it is inside the range being replaced. if (heading && /^==/.test(at.lines[at.end] || "")) { replacement.push(""); } at.lines.splice.apply(at.lines, [at.start, at.end - at.start].concat(replacement)); } else { // Emptying the box removes the section rather than leaving an empty heading behind. at.lines.splice(at.start, at.end - at.start); if (heading) { at.lines.splice(at.insertAt, 1); // The blank line that separated it goes with it, rather than doubling up. if (blank(at.insertAt) && blank(at.insertAt - 1)) { at.lines.splice(at.insertAt, 1); } } } } else { if (!body) { throw new SubmitAbort("Tiştek nehate nivîsandin."); } var block = heading ? ["=== " + subsection.header + " ===", body] : [body]; if (heading) { if (!blank(at.insertAt - 1)) { block.unshift(""); } if (!blank(at.insertAt)) { block.push(""); } } at.lines.splice.apply(at.lines, [at.insertAt, 0].concat(block)); } return pageContent.slice(0, at.langSectionIndex) + at.lines.join("\n"); } // What a section body holds: its {{kol3}} groups, the plain bullet list that stands in for them, or // the raw wikitext when it is neither. A free section is read this way before its kind is known. function readSubsectionBody(body, subsection) { if (subsection.kind === "wordlist" || subsection.free) { var calls = parseWordListCalls(body); if (calls.length) { return { kind: "wordlist", groups: calls.map(function (call) { return { sernav: namedParam(call.named, "sernav"), words: call.words }; }) }; } var bullets = parseBulletWordList(body); if (bullets) { // Editable as a word list; saving rewrites the bullets as {{kol3}}. return { kind: "wordlist", groups: [{ sernav: "", words: bullets }], fromBullets: true }; } } return { kind: "text", text: $.trim(body) }; } // The wikitext a section body becomes after an edit. A wordlist keeps its own template name, language // and named params ("cure=Jê", ...) and only has its positional words replaced; a text one is // replaced whole. function rewriteSubsectionBody(body, language, subsection, content) { if (subsection.kind !== "wordlist") { // Replacing the body wholesale drops that separator, so put it back. return content + (/\n\s*$/.test(body) ? "\n" : ""); } var calls = parseWordListCalls(body); if (calls.length) { // Each call is rewritten where it stands, so text between and around them survives untouched. // Last to first, so the offsets of the earlier ones stay valid as we go. var replacement = body; for (var gi = calls.length - 1; gi >= 0; gi--) { var call = calls[gi]; var group = content[gi]; // A group emptied in the form drops its call entirely rather than leaving "{{kol3|ku}}". var rebuilt = group && group.words.length ? buildWordListCall(call.name, call.lang, withNamedParam(call.named, "sernav", group.sernav), group.words) : ""; replacement = replacement.slice(0, call.start) + rebuilt + replacement.slice(call.end); } // Groups the form added beyond the ones already there go after the last of them. var added = content.slice(calls.length).filter(function (group) { return group.words.length; }).map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words); }); if (added.length) { replacement = replacement.replace(/\s*$/, "") + "\n\n" + added.join("\n\n") + "\n"; } return replacement.replace(/\n{3,}/g, "\n\n"); // gaps left by any dropped call } if (parseBulletWordList(body)) { // A plain bullet list is replaced wholesale by a real {{kol3}} on its first edit. return content.map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words); }).join("\n\n") + (/\n\s*$/.test(body) ? "\n" : ""); } throw new SubmitAbort("Nikare lîsteya vê beşê bixwîne: " + subsection.header); } // ---- sections that are not subsections of a part of speech ---- // A "=== Etîmolojî ===" that the parts of speech hang under, a "=== Çavkanî ===" at the foot of a // language, a heading nobody planned for. Located by its own text, and edited as the wikitext under // it -- or as a {{kol3}} list when that is what it holds. function freeSectionBody(pageContent, language, subsection) { var loc = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal); return { loc: loc, body: loc.lines.slice(loc.bodyStart, loc.bodyEnd).join("\n") }; } function readFreeSection(pageContent, language, subsection) { var at = freeSectionBody(pageContent, language, subsection); return readSubsectionBody(at.body, subsection); } function updateFreeSection(pageContent, language, subsection, content) { var at = freeSectionBody(pageContent, language, subsection); at.loc.lines.splice(at.loc.bodyStart, at.loc.bodyEnd - at.loc.bodyStart, rewriteSubsectionBody(at.body, language, subsection, content)); return pageContent.slice(0, at.loc.langSectionIndex) + at.loc.lines.join("\n"); } // ---- removing and renaming a heading ---- // A subsection's heading line and the end of what it owns, as {loc, heading, end, depth, bounds}. A // "====" subsection runs to the next one, taking deeper headings with it. A free section owns only its // own text: what sits under it belongs to the parts of speech (see removeSubsection). function headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection) { if (subsection.free) { var free = wt.locateHeadingByText(pageContent, language, subsection.header, subsection.free.ordinal); return { loc: free, heading: free.headingLineIndex, end: free.bodyEnd, depth: free.depth }; } var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth); var range = subsectionBodyRange(bounds, subsection.header); if (!range) { throw new SubmitAbort(util.msg.sectionMissing + subsection.header); } return { loc: loc, heading: range.start - 1, end: range.end, depth: bounds.depth + 1, bounds: bounds }; } // A free section with deeper headings under it is refused: removing it would leave them under the // section before, and taking them along would remove whole parts of speech. function hasDeeperHeadingAfter(lines, index, depth) { var m = /^(=+)[^=]/.exec(lines[index] || ""); return !!m && m[1].length > depth; } function removeSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) { var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection); var lines = span.loc.lines; if (subsection.free && hasDeeperHeadingAfter(lines, span.end, span.depth)) { throw new SubmitAbort("Di bin «" + subsection.header + "» de beşên din hene; pêşî wan jê bibe."); } lines.splice(span.heading, span.end - span.heading); // The blank line that separated it goes with it, rather than doubling up. if (span.heading > 0 && !$.trim(lines[span.heading - 1]) && !$.trim(lines[span.heading] || "x")) { lines.splice(span.heading, 1); } return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n"); } function renameSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, newHeader) { var span = headingSpan(pageContent, language, sectionType, sectionOrdinal, subsection); var lines = span.loc.lines; if (span.bounds && span.bounds.existingHeaders.some(function (h) { return h.header === newHeader; })) { throw new SubmitAbort("Ev beş jixwe heye: " + newHeader); } var marks = wt.headingMarks(span.depth); lines[span.heading] = marks + " " + newHeader + " " + marks; // A {{kol3}} names its section in cure=, which follows the heading. Read across lines: a call is // often written one parameter per line. var cure = new RegExp("(\\|\\s*cure\\s*=\\s*)" + escapeRegExp(subsection.header) + "(\\s*[|}])", "g"); var body = lines.slice(span.heading + 1, span.end).join("\n").replace(cure, "$1" + newHeader + "$2"); lines.splice.apply(lines, [span.heading + 1, span.end - span.heading - 1].concat(body.split("\n"))); return pageContent.slice(0, span.loc.langSectionIndex) + lines.join("\n"); } // Current contents of an existing "====" subsection. A wordlist one whose template can't be parsed comes // back as {kind: "text"} so the caller can still edit it as raw wikitext instead of refusing outright. function readPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection) { if (subsection.free) { return readFreeSection(pageContent, language, subsection); } var loose = locateLoosePlace(pageContent, language, sectionType, sectionOrdinal, subsection); if (loose) { if (!loose.exists) { return null; } if (loose.call) { return { kind: "wordlist", groups: [{ sernav: "", words: loose.call.words }] }; } var looseBody = $.trim(loose.lines.slice(loose.start, loose.end).join("\n")); if (subsection.kind === "images") { return { kind: "images", images: $.grep($.map(looseBody.split("\n"), wt.parseImageLine), Boolean) }; } if (subsection.kind !== "wordlist") { return { kind: "text", text: looseBody }; } // One template call rather than a {{kol3}} block: its positional parameters are the words. var looseCall = parseTemplateCalls(looseBody).calls[0]; return { kind: "wordlist", groups: [{ sernav: "", words: (looseCall && looseCall.params) || [] }] }; } var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var bounds = posBlockBounds(loc.lines, loc.posLineIndex, loc.depth); var range = subsectionBodyRange(bounds, subsection.header); if (!range) { return null; } return readSubsectionBody(loc.lines.slice(range.start, range.end).join("\n"), subsection); } // Rewrites an existing "====" subsection in place. A wordlist one keeps its own template name, language and // named params ("cure=Jê", ...) and only has its positional words replaced; a text one is replaced whole. function updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth); var range = subsectionBodyRange(bounds, subsection.header); if (!range) { throw new SubmitAbort(util.msg.sectionMissing + subsection.header); } var body = lines.slice(range.start, range.end).join("\n"); lines.splice(range.start, range.end - range.start, rewriteSubsectionBody(body, language, subsection, content)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // Inserts a new "==== Header ====" subsection into its SUBSECTION_ORDER position within a POS block, right // before the first ranked subsection that outranks it, or at the end if none does. Either a // {{kol3|...}} word list or a plain paragraph, matching start.js's own subsection formats. function insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, subsection, content) { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var bounds = posBlockBounds(lines, loc.posLineIndex, loc.depth); var alreadyThere = false; bounds.existingHeaders.forEach(function (h) { if (h.header === subsection.header) { alreadyThere = true; } }); if (alreadyThere) { throw new SubmitAbort("Ev beş jixwe heye: " + subsection.header); } var body = subsection.kind === "wordlist" ? content.map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + subsection.header], "sernav", group.sernav), group.words); }).join("\n\n") : content; var myRank = subsectionRankForHeader(subsection.header); var headers = bounds.existingHeaders; var insertAt = bounds.end; for (var i = 0; i < headers.length; i++) { var otherRank = subsectionRankForHeader(headers[i].header); if (otherRank !== -1 && otherRank > myRank) { insertAt = headers[i].lineIndex; break; } } // Exactly one blank line on each side: the line before the insertion point is normally already blank // (it separated the previous subsection from the next heading), so only add one where there isn't one. var block = []; if (insertAt > 0 && $.trim(lines[insertAt - 1]) !== "") { block.push(""); } var marks = wt.headingMarks(bounds.depth + 1); block.push(marks + " " + subsection.header + " " + marks, body); if (insertAt < lines.length) { block.push(""); } lines.splice.apply(lines, [insertAt, 0].concat(block)); return pageContent.slice(0, loc.langSectionIndex) + lines.join("\n"); } // ---- converting an unclassified "=== Mane ===" placeholder heading into a real POS heading ---- // Some pages carry a heading literally named "Mane" (optionally "Mane 2" etc.) instead of a real // part-of-speech name, tagged right below with {{cure?|<lang>}} (ku.wiktionary's "part of speech not yet // determined" maintenance flag). It is a section key of its own (sections.MANE_SECTION), so the shared // locator finds it like any other heading; only the rewriting below is particular to it. // Renames the "=== Mane ===" placeholder to the chosen POS heading, drops the maintenance tag line right // after it if present (MANE_TAG_REGEX -- cure? or any of its known aliases), and inserts the matching // "{{<pos>|<lang>}}" call in its place (skipped when the section has no template of its own). // Other content under the heading is left untouched. /** * Where a section's own headword template sits, as {index, text}, or {index: -1} when it has none. * * Not always the line under the heading: a "{{ku-tewîn-lk}}" line and any number of "[[Wêne:...]]" * images can come first. Everything down to the first definition line is searched, and index doubles * as the slot a new call belongs in when there is no old one. */ function findPosTemplateLine(lines, headingLine, sectionType) { var oldSpec = posTemplateFor(sectionType); var oldTemplate = oldSpec ? oldSpec.name : (sectionType === "Biwêj" ? "biwêj" : null); var oldTemplateRegex = oldTemplate && new RegExp("^\\{\\{\\s*" + escapeRegExp(oldTemplate) + "\\s*[|}]"); var at = headingLine + 1; while (at < lines.length && !/^#/.test(lines[at]) && !/^==/.test(lines[at])) { if (MANE_TAG_REGEX.test(lines[at]) || (oldTemplateRegex && oldTemplateRegex.test(lines[at]))) { return { index: at, text: lines[at], end: at }; } at++; } return { index: -1, text: "", end: at }; } // Named parameters merged in order, each written once: a later value replaces an earlier one of the // same name. Positional values are kept as they come. function mergeCallParams() { var out = []; var seen = {}; $.each(Array.prototype.slice.call(arguments), function (_, list) { $.each(list || [], function (__, param) { var m = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(param); if (!m) { out.push(param); return; } // "z" and "c" are one name to Modul:rêziman, so the form's "c=m" meets the page's "z=". var key = wt.canonicalParamName(m[1]); if (!Object.prototype.hasOwnProperty.call(seen, key)) { seen[key] = out.length; out.push(param); return; } // The page's own spelling stays when it carried a value; an empty one gives way entirely. var earlier = /^\s*([^=|]+?)\s*=([\s\S]*)$/.exec(out[seen[key]]); // "?" asks for a value, so it never replaces one the page already has. if ($.trim(earlier[2]) && $.trim(m[2]) === "?") { return; } out[seen[key]] =$.trim(earlier[2]) ? earlier[1] + "=" + m[2] : param; }); }); return out; } // What the call on the page already says, minus its language. Carried over only when the new section // uses that same template -- "z=m" survives Navdêr becoming Formeke navdêrê, while a verb's "c=h-gh" // has no meaning on a noun and is left behind. function keptCallParams(line, templateName) { var call = parseTemplateCalls($.trim(line || "")).calls[0]; if (!call || canonicalTemplateKey(call.name) !== canonicalTemplateKey(templateName)) { return []; } return call.params.slice(1).filter(function (param) { return /=/.test(param); }); } // The headword call a converted section gets, or "" when the new section has none. What the old call // (found, from findPosTemplateLine) said keeps its place, then the section's own defaults, then what the // form was filled in with -- each name written once, the last value winning, so a converted call reads // as small a change from the old one as it can. function posCallLine(found, language, newSectionType, posParams) { var spec = posTemplateFor(newSectionType); if (!spec) { return ""; } var kept = found.index !== -1 ? keptCallParams(found.text, spec.name) : []; // A lemma is not an inflected form, so the old section's form=erê stays behind. if (spec.params.indexOf("form=erê") === -1) { kept = kept.filter(function (param) { return !/^\s*form\s*=\s*erê\s*$/.test(param); }); } var params = mergeCallParams(kept, spec.params, posParams ? posParams.split("|") : []); return "{{" + spec.name + "|" + language + (params.length ? "|" + params.join("|") : "") + "}}"; } function convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, newSectionType, posParams) { if (!sectionNames[newSectionType]) { throw new SubmitAbort("Navê cureyê rêzimanî yê hilbijartî nediyar e."); } // locateSection() already handles the "Mane" placeholder as a section type of its own. var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var lines = loc.lines; var headingLine = loc.posLineIndex; var depth = loc.depth; // A section straight under a numbered group heading takes that heading's place: the group heading // held nothing but its gloss. var group = depth > 3 ? wt.numberedGroupAbove(lines, headingLine, depth) : -1; if (group !== -1) { lines.splice(group, headingLine - group); headingLine = group; depth--; } // At the heading's own depth. Written without a number: the renumbering pass below decides every // number in this language section at once, so one carried over from the old name would just be // overwritten. var marks = wt.headingMarks(depth); lines[headingLine] = marks + " " + newSectionType + " " + marks; // The line under the heading is either the old section's own template call ("{{biwêj|ku}}") or, for a // Mane placeholder, the "needs a POS" maintenance tag. Both are replaced by the new POS's call. // The new call takes the old one's own place -- or, when there was none, the slot just above the // definitions, which is where the wizard writes it. var found = findPosTemplateLine(lines, headingLine, sectionType); var insertAt = found.index !== -1 ? found.index : found.end; if (found.index !== -1) { lines.splice(found.index, 1); } var call = posCallLine(found, language, newSectionType, posParams); if (call) { lines.splice(insertAt, 0, call); } // Renaming a section can make it repeat one the page already had, and can equally leave a name that // is no longer repeated. Both are settled by renumbering the whole language section: a "Rengdêr" // beside a new "Rengdêr" becomes "Rengdêr 1" and "Rengdêr 2", and a number left behind by a name // that is now unique is dropped. var body = lines.join("\n"); var nextLang = body.indexOf("\n== ", 1); var end = nextLang === -1 ? body.length : nextLang; body = wt.numberRepeatedPosHeadings(body.slice(0, end)) + body.slice(end); return pageContent.slice(0, loc.langSectionIndex) + body; } // ---- "guhartina pêşketî" (advanced editing): combine several independent per-sense edits into ONE save ---- // Threads pageContent through the same pure functions every single-field form uses, applying only the // pieces the caller actually filled in. A piece that conflicts with the page (maneid already set, a // subsection that's already there) is skipped with a warning rather than failing the whole save. Throws // SubmitAbort if nothing was filled in, so this can never turn into a no-op save. function applyAdvancedChanges(pageContent, language, sectionType, sectionOrdinal, definitionLevel, changes) { var content = pageContent; var warnings = []; var appliedAnything = false; if (changes.gloss) { content = updateSenseGloss(content, language, sectionType, sectionOrdinal, definitionLevel, changes.gloss); appliedAnything = true; } if (changes.newSense) { content = insertNewSense(content, language, sectionType, sectionOrdinal, definitionLevel, changes.newSense); appliedAnything = true; } // Every box below is prefilled with what the sense already has, so a save replaces that value rather // than merging into it -- and clearing a box removes the template. changes.changed marks the boxes // whose contents actually differ from the page, so an opened-but-untouched box writes nothing. var replace = { replace: true }; if (changes.changed.maneid) { content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "maneid", changes.maneid ? [changes.maneid] : [], replace); appliedAnything = true; } if (changes.changed.etiket) { content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "e", changes.etiket, replace); appliedAnything = true; } if (changes.changed.kategori) { content = insertLeadingSenseTpl(content, language, sectionType, sectionOrdinal, definitionLevel, "K", changes.kategori, replace); appliedAnything = true; } SENSE_GROUPS.forEach(function (group) { if (changes.changed["word:" + group.key]) { content = insertSenseWords(content, language, sectionType, sectionOrdinal, definitionLevel, group.key, changes.words[group.key], replace); appliedAnything = true; } }); if (!appliedAnything) { throw new SubmitAbort("Tiştek nehat guhartin."); } return { content: content, warnings: warnings }; } // ---- per-definition UI: a small always-visible "+" toggle (no hover, so it works on mobile/touch too) ---- // A growing list of word rows. The row itself is util.js's, shared with the wizard; this owns the list: // typing in the last row appends a fresh empty one, so there is always somewhere to type. var WORDLIST_COLUMN_THRESHOLD = 6; function buildWordListField(placeholder, opts) { opts = opts || {}; var $list = $("<ol class='dsb-wordlist'></ol>"); // One column is a long scroll once a list gets past a handful of words. The class only asks for // two; the stylesheet still gives one on a narrow screen. Two columns inside the panel's usual // 520px would leave each word about 250px, so the panel drops its width cap for as long as any // list in it is in two columns -- checked across the whole panel, since a "Herwiha binêre" holds // several groups and one of them going wide settles it for all. function updateColumns() { $list.toggleClass("dsb-wordlist-2col", $list.children("li").length > WORDLIST_COLUMN_THRESHOLD); var $panel = $list.closest(".dsb-subsection-panel"); $panel.toggleClass("dsb-panel-wide", !!$panel.find(".dsb-wordlist-2col").length); } function makeRow() { var row = util.makeModifierRow({ prefix: "dsb-", placeholder: placeholder, modTitle: util.msg.addModifier, removeTitle: util.msg.removeWord, removeModTitle: util.msg.removeModifier, modifiers: opts.modifiers, // "bixe qutiyan" puts each comma-separated word in a row of its own, right after the row it // was typed in, and the caret follows to the last of them. One word per row is also one // word per template parameter, which both {{hevmane}} and {{kol3}} read the same way -- // a comma left inside a parameter would not be. onSplit: function (rest) { var $after = row.$li; var last = null; rest.forEach(function (raw) { var extra = makeRow(); $after.after(extra.$li); $after = extra.$li; if (raw) extra.setRaw(raw); last = extra; }); // Always an empty row at the end to type the next word into. var $tail = $list.children("li").last(); if ($.trim($tail.data("row").getRaw())) { last = makeRow(); $list.append(last.$li); } updateColumns(); if (last) last.focus(); }, // raw === null means the row removed itself, so the count has changed either way. onChange: function (raw) { if (raw !== null) { var isLast = row.$li.is($list.children("li").last()); if (isLast && raw) $list.append(makeRow().$li); } updateColumns(); } }); row.$li.data("row", row); return row; } $list.append(makeRow().$li); return { $element: $list, values: function () { var vals = []; $list.children("li").each(function () { var raw = $(this).data("row").getRaw(); if (raw) vals.push(raw); }); return vals; }, // Replaces the whole list, keeping one empty trailing row to type into. setValues: function (raws) { $list.empty(); raws.forEach(function (raw) { var row = makeRow(); $list.append(row.$li); row.setRaw(raw); }); $list.append(makeRow().$li); updateColumns(); }, focus: function () { $list.children("li").first().data("row").focus(); } }; } // Plain removable-tag field, used for Etîket and Kategorî (simple value lists with no per-word modifiers). // Enter or "," commits the current text as a tag; Backspace on an empty input removes the last tag; // values() also commits whatever is still typed but not yet confirmed. function buildTagField(placeholder) { var $input = $("<input type='text' class='dsb-input dsb-tag-input'>").attr("placeholder", placeholder); var $element = $("<span class='dsb-tagfield'></span>").append($input); function currentValues() { var vals = []; $element.children(".dsb-tag").each(function () { vals.push($(this).data("value")); }); return vals; } function addTag(val) { val = $.trim(val || ""); if (!val || currentValues().indexOf(val) !== -1) { return; } var $tag = $("<span class='dsb-tag'></span>").text(val).data("value", val); var $remove = $("<button type='button' class='dsb-tag-remove' title='Jê bibe'>&#215;</button>"); $remove.on("click", function () { $tag.remove(); $input.trigger("focus"); }); $tag.append($remove); $tag.insertBefore($input); } $input.on("keydown", function (e) { if (e.which === 13 || e.which === 188) { // Enter or comma e.preventDefault(); addTag($input.val()); $input.val(""); } else if (e.which === 8 && !$input.val()) { $element.children(".dsb-tag").last().remove(); } }); $input.on("blur", function () { addTag($input.val()); $input.val(""); }); return { $element: $element, // Replaces every tag, for prefilling from what the sense already has. setValues: function (vals) { $element.children(".dsb-tag").remove(); vals.forEach(function (v) { addTag(v); }); $input.val(""); }, values: function () { addTag($input.val()); $input.val(""); return currentValues(); }, focus: function () { $input.trigger("focus"); } }; } // The wizard's own etymology templates, straight out of data-main.json's "etymTpls" -- the same list start.js's // insert menu offers, so the two can never drift apart. CODE/SOURCELANG are its placeholders. // The wizard's own template lists, straight out of data-main.json, so both gadgets offer the same // templates in the same order. A pronunciation template names the languages it is for; one that names // none is offered everywhere. function templateChoices(pool, language) { var defs = startData[pool] || {}; return Object.keys(defs).filter(function (name) { var langs = defs[name].langs; return !langs || !langs.length || $.inArray(language, langs) !== -1; }).map(function (name) { return { name: name, desc: defs[name].desc, snippet: defs[name].snippet }; }); } // One template call inside the surface: shown as its own wikitext, but atomic -- contenteditable="false" // keeps the caret out of it, so it can only be changed through the dialog. function makeTemplateChip(wikitext) { // The × is its own element rather than the chip's only way out: on a phone there is no reliable // backspace onto a contenteditable="false" span, so without it the dialog is the only way to take // a call off the line. readChipSurface() reads chips from data-wikitext, so the extra child does // not reach the saved text. var $remove = $("<span class='dsb-tpl-chip-remove' contenteditable='false'>&#215;</span>") .attr("title", "Vê şablonê jê bibe"); return $("<span class='dsb-tpl-chip' contenteditable='false' role='button' tabindex='0'></span>") .attr("data-wikitext", wikitext) .attr("title", "Bitikîne da ku parametreyan biguhêrî") .text(wikitext) .append($remove); } // wikitext -> surface DOM: template calls become chips, everything else stays plain editable text. function renderChipSurface($surface, wikitext) { var text = wikitext || ""; var calls = parseTemplateCalls(text).calls; var pos = 0; $surface.empty(); calls.forEach(function (call) { if (call.start > pos) { $surface.append(document.createTextNode(text.slice(pos, call.start))); } $surface.append(makeTemplateChip(text.slice(call.start, call.end))); pos = call.end; }); if (pos < text.length) { $surface.append(document.createTextNode(text.slice(pos))); } } // surface DOM -> wikitext. Chips give back their stored call; anything the browser inserted while typing // (a <br>, a wrapper <div>) degrades to its text, so the result is always plain wikitext. function readChipSurface(node) { var out = ""; $(node).contents().each(function () { if (this.nodeType === 3) { out += this.nodeValue; return; } var $el = $(this); if ($el.hasClass("dsb-tpl-chip")) { out += $el.attr("data-wikitext"); return; } if (this.nodeName === "BR") { out += "\n"; return; } if (this.nodeName === "DIV" || this.nodeName === "P") { out += "\n" + readChipSurface(this); return; } out += readChipSurface(this); }); return out; } // Drops a node in at the caret, or at the end when the caret is not inside the surface. function insertAtCaret($surface, node) { var sel = window.getSelection(); if (sel && sel.rangeCount && $.contains($surface.get(0), sel.getRangeAt(0).commonAncestorContainer)) { var range = sel.getRangeAt(0); range.deleteContents(); range.insertNode(node); range.setStartAfter(node); range.collapse(true); sel.removeAllRanges(); sel.addRange(range); } else { $surface.append(node); } } // The template-param dialog (openTemplateDialog/buildTemplateParamForm) moved to wikt.cite, shared with // start.js's own Etîmolojî and Çavkanî pickers: cite.openTemplateDialog / cite.buildTemplateParamForm. // Each new example queued is its own entry, so several can be waiting at once. var exampleSeq = 0; // Takes the save over from add-examples while its form is open for one sense: its "Qeyd bike" becomes // "Lê zêde bike" and the edit joins the pending queue instead of publishing on its own, so examples and // whatever else is queued go up as one edit. Installed on every open, so the handler always closes over // the sense whose form is actually open. ctx: {$li, $h3, language, sectionType, sectionOrdinal, // definitionLevel, $save, $status, afterQueue}. function takeOverExampleSave(ctx) { if (!(wikt.addExamples && wikt.addExamples.setSubmitHandler)) { return; // older add-examples: it publishes on its own, as before } // Lets the form read an example as the queue has already changed it. wikt.addExamples.pendingContent = queuedContent; wikt.addExamples.setSubmitHandler(function (job) { exampleSeq++; queueChange( placeLabel(ctx.language, ctx.sectionType, ctx.$h3), // add-examples' own summary, so the combined edit still credits the tool and names its // version. The trailing stop goes: this is one item in a list, not a sentence of its own. (job.summary || "nimûne/jêgirtin hate zêdekirin").replace(/\.\s*$/, ""), function (pageContent) { // add-examples builds against a revision object, and returns {text, summary}. var built = job.transform({ content: pageContent }); return { content: built.text, warnings: [] }; }, ctx.$save, ctx.$status, // Drawn like any other queued change, in the sense it belongs to. function () { return previewSense(ctx.$li, ctx.language, ctx.sectionType, ctx.sectionOrdinal, ctx.definitionLevel); }, // An edit to an example already on the page brings its own key, so editing it again replaces it. { key: job.key || ("example:" + ctx.sectionType + "|" + ctx.sectionOrdinal + "|" + ctx.definitionLevel.join(".") + "|" + exampleSeq) } ); job.done(); if (ctx.afterQueue) { ctx.afterQueue(); } }); } // Opens add-examples' form on one example already under a sense -- dsb.js's pencil on it. Its save joins // the queue like any other change. function editExample($li, $h3, language, sectionType, sectionOrdinal, definitionLevel, itemEl) { takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType, sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $(), $status: $(), afterQueue: openQueueBox }); if (!(wikt.addExamples && wikt.addExamples.editFor && wikt.addExamples.editFor($li.get(0), itemEl))) { mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin."); } } // Builds the whole "guhartina pêşketî" panel into $quickRow: gloss and the two most-used word lists // (Hevmane/Dijmane) sit directly in the picker row; the remaining word lists, maneid, etîket, kategorî // and Nimûne/jêgirtin live behind a "Hevmane û Bêhtir" dropdown; one shared "Lê zêde bike" queues everything the // user filled in as a single edit via applyAdvancedChanges() and queueChange(). Nimûne/jêgirtin is an // immediate proxy-click into a different gadget's own form, not part of this combined save. function buildAdvancedPanel($quickRow, $li, $h3, language, sectionType, sectionOrdinal, definitionLevel, isLastSense) { // "+" marks the actions that add something, matching the dropdown's own "+ Hevmane" labels. var $nimune = $("<a href='#' class='dsb-quick-link'></a>").text("+ Nimûne/jêgirtin"); $nimune.on("click", function (e) { e.preventDefault(); takeOverExampleSave({ $li: $li, $h3: $h3, language: language, sectionType: sectionType, sectionOrdinal: sectionOrdinal, definitionLevel: definitionLevel, $save: $save, $status: $status }); // Toggle, so clicking this a second time closes the form again. add-examples builds nothing // on the page of its own, so this is the only way its form opens. var drive = wikt.addExamples.toggleFor || wikt.addExamples.openFor; if (!(drive && drive($li.get(0)))) { mw.notify("Amûra nimûneyan li vê maneyê nehat dîtin."); } $moreMenu.slideUp(); }); // getters holds one function per currently-open box (key -> () => value); collectChanges() only ever // reads from a box the user actually clicked to open. var getters = {}; // What the sense currently holds, fetched once and shared by every box that prefills from it. // collectChanges() also diffs against it, so an untouched box never queues a change. var original = null; var sensePromise = null; function loadSense() { if (!sensePromise) { sensePromise = fetchSenseFields(language, sectionType, sectionOrdinal, definitionLevel).then(function (fields) { original = fields; return fields; }); } return sensePromise; } function sameList(a, b) { return (a || []).join("\u0000") === (b || []).join("\u0000"); } // -- gloss ("Maneyê biguhêre" -- the one box that EDITS the sense's wording; everything else here only ADDS) -- function addGlossField() { var $fields = $("<div class='dsb-gloss-fields'></div>"); var $textarea = $("<textarea class='dsb-input dsb-edit-gloss' rows='2'></textarea>") .attr("placeholder", util.msg.loading).prop("disabled", true); var $autoLink = $("<button type='button' class='dsb-autolink'>Oto-lînk bike</button>").prop("disabled", true); var $toRaw = $("<a href='#' class='dsb-quick-link dsb-gloss-raw'>Wekî wîkîtekst biguhêre</a>").hide(); var $status = $("<span class='dsb-status'></span>"); var originalGloss = null; var tplForm = null; // set while the parameter boxes are showing instead of the raw line var tplCall = null; // The gloss of a non-Kurdish entry is a translation followed by {{îzah|…}} explaining it. That // is one field on the page, so it stays one box here; the explanation opens beside it only when // asked for, and the two are joined back into a single gloss on save. A Kurdish sense is its // own definition, so it is never offered one -- though a ku gloss that somehow already carries // an {{îzah}} still opens its box below, rather than being edited blind. var offerIzah = language !== "ku"; var $izah = $("<textarea class='dsb-input dsb-edit-izah' rows='2'></textarea>") .attr("placeholder", "Îzaha maneyî… ji bo school-a îngilîzî 'cihê tehsîlgirtinê'"); // A non-Kurdish gloss is a translation and its explanation, so both boxes open together. A Kurdish // sense is its own definition and gets no îzah box, unless its gloss already carries one. var $izahWrap = $("<div class='dsb-izah-wrap'></div>") .append($("<label class='dsb-adv-label'>Îzaha maneyî</label>").append($izah)) .toggle(offerIzah); $fields.append($textarea); // The template form edits one call inside the line, so its result is spliced back into the rest. function currentGloss() { if (tplForm) { return $.trim(originalGloss.slice(0, tplCall.start) + tplForm.values() + originalGloss.slice(tplCall.end)); } return joinGloss($.trim($textarea.val()), $.trim($izah.val())); } function showRaw() { tplForm = null; tplCall = null; $fields.empty().append($textarea); $autoLink.show(); $toRaw.hide(); } loadSense().then( function (fields) { originalGloss = fields.gloss; // An existing gloss that already ends in {{îzah|…}} comes apart into the two boxes, so // editing it does not mean editing template syntax by hand. var parts = util.splitTercimeIzah(fields.gloss); $textarea.val(parts ? $.trim(parts.tercime) : fields.gloss) .prop("disabled", false) // A non-Kurdish gloss is a translation; the box under it takes the explanation. .attr("placeholder", offerIzah ? util.msg.tercimePrompt : "Maneyê binivîse…"); if (parts) { $izah.val($.trim(parts.izah)); $izahWrap.show(); } $autoLink.prop("disabled", false); var target = glossTemplateTarget(fields.gloss); if (!target) { return; } fetchTemplateData(target.name).then(function (td) { // The fetch is async; leave the raw box alone if it has already been typed into. if ($.trim($textarea.val()) !== $.trim(originalGloss)) { return; } tplCall = target; tplForm = cite.buildTemplateParamForm(target, td); $fields.empty().append(tplForm.$element); $autoLink.hide(); // linkifying a bare template call makes no sense // A gloss that is one template call carries no separate explanation. $izahWrap.hide(); $toRaw.show(); }); }, function (codeOrAbort, result) { $textarea.attr("placeholder", ""); var message = codeOrAbort instanceof SubmitAbort ? codeOrAbort.message : "Nikare maneya heyî bar bike: " + apiErrorMessage(codeOrAbort, result); $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(message); } ); $autoLink.on("click", function () { var mane = $.trim($textarea.val()); var izah = $.trim($izah.val()); if (!mane && !izah) { return; } $autoLink.prop("disabled", true); $status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…"); linkifyGlossParts(mane, izah, function (linkedMane, linkedIzah, error) { $textarea.val(linkedMane); $izah.val(linkedIzah); $autoLink.prop("disabled", false); if (error) { $status.addClass("dsb-status-error").text(error); } else { $status.text(""); } }); }); $toRaw.on("click", function (e) { e.preventDefault(); $textarea.val(currentGloss()); // read the form before showRaw() discards it showRaw(); }); getters.gloss = function () { var v = currentGloss(); return (v && v !== originalGloss) ? v : null; }; return $("<div class='dsb-adv-group'></div>").append( $("<div class='dsb-adv-label'></div>").text("Mane"), $fields, $izahWrap, $("<div class='dsb-form-actions'></div>").append($autoLink, $toRaw, $status) ); } // -- one SENSE_GROUPS word-list box (Hevmane/Dijmane/etc.) -- function addWordField(group) { var field = buildWordListField(group.label + "…"); loadSense().then(function (fields) { var current = fields.words[group.key]; if (current && current.length) { field.setValues(current); } }); getters["word:" + group.key] = function () { return field.values(); }; // The hint is senseGroups' own, so the box carries the same example sentence the wizard puts // beside its copy of this list. var $label = $("<div class='dsb-adv-label'></div>").text(group.label); if (group.hint) { $label.append($("<span class='dsb-adv-hint'></span>").text(group.hint)); } return $("<div class='dsb-adv-group'></div>").append($label, field.$element); } // -- maneid (single value; re-adding one that already exists is rejected -- see applyAdvancedChanges) -- function addNewSenseField() { var $textarea = $("<textarea class='dsb-input' rows='2'></textarea>").attr("placeholder", "Maneya nû binivîse…"); getters.newSense = function () { return $.trim($textarea.val()); }; return $("<div class='dsb-adv-group'></div>").append( $("<div class='dsb-adv-label'></div>").text(util.msg.anotherSense), $textarea ); } function addManeidField() { var $input = $("<input type='text' class='dsb-input' placeholder='id…'>"); loadSense().then(function (fields) { $input.val(fields.maneid); }); getters.maneid = function () { return $.trim($input.val()); }; return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Maneid"), $input); } // -- etîket / kategorî -- function addEtiketField() { var field = buildTagField("Etîket…"); loadSense().then(function (fields) { field.setValues(fields.etiket); }); getters.etiket = function () { return field.values(); }; return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Etîket"), field.$element); } function addKategoriField() { var field = buildTagField("Kategorî…"); loadSense().then(function (fields) { field.setValues(fields.kategori); }); getters.kategori = function () { return field.values(); }; return $("<div class='dsb-adv-group'></div>").append($("<div class='dsb-adv-label'></div>").text("Kategorî"), field.$element); } // -- the picker row: the gloss and Nimûne/jêgirtin links sit directly in the row; every word group and // the rest live behind a "Hevmane û Bêhtir" dropdown. Clicking any link builds and appends its box // to $openBoxes and hides that link; the box's own "×" removes it, clears its getter, and un-hides the // link -- several boxes can be open at once. No "Beşek (====)" entry here: buildSubsectionPanel()'s // own "+ Beşek lê zêde bike" trigger already covers page-level subsections. ---- var FIELD_DEFS = [{ key: "gloss", label: "Maneyê biguhêre", build: addGlossField, primary: true }] .concat(SENSE_GROUPS.map(function (group) { return { key: "word:" + group.key, label: group.label, build: function () { return addWordField(group); }, primary: false }; })) .concat([ { key: "maneid", label: "Maneid", build: addManeidField, primary: false }, { key: "etiket", label: "Etîket", build: addEtiketField, primary: false }, { key: "kategori", label: "Kategorî", build: addKategoriField, primary: false } ]); // Every sense offers this: the new one lands directly below whichever sense asked for it (see // insertNewSense), so it is no longer only the last one that can add to the end. FIELD_DEFS.push({ key: "newSense", label: util.msg.addAnotherSense, build: addNewSenseField, primary: false }); var $picker = $("<div class='dsb-field-picker'></div>"); var $moreMenu = $("<div class='dsb-more-menu'></div>").hide(); var $openBoxes = $("<div class='dsb-open-boxes'></div>"); // $actions (built below) stays hidden until at least one field box is actually open -- otherwise // "Lê zêde bike" sits there enabled with nothing to queue, which just produces an empty no-op change. var openBoxCount = 0; function updateActionsVisibility() { $actions.toggle(openBoxCount > 0); } function makeFieldLink(def) { var $link = $("<a href='#' class='dsb-quick-link dsb-field-pick'></a>").text(def.key === "gloss" ? def.label : "+ " + def.label); $link.on("click", function (e) { e.preventDefault(); openQueueBox(); var $box = def.build(); var $remove = $("<a href='#' class='dsb-box-remove' title='Rake'>×</a>"); $remove.on("click", function (e2) { e2.preventDefault(); delete getters[def.key]; $box.remove(); $link.show(); openBoxCount--; updateActionsVisibility(); }); $box.prepend($remove); $openBoxes.append($box); util.initManualResize($box); $link.hide(); $moreMenu.slideUp(); openBoxCount++; updateActionsVisibility(); }); return $link; } // Destructive, so it lives at the bottom of the dropdown behind a confirmation, and shares the // sense's queue key: deleting supersedes any edit still pending on the same sense. function makeDeleteLink() { var $link = $("<a href='#' class='dsb-quick-link dsb-field-delete'>Maneyê rake</a>"); $link.on("click", function (e) { e.preventDefault(); $moreMenu.slideUp(); OO.ui.confirm("Ev mane û hemû rêzên bin wê dê werin rakirin. Dewam bike?").done(function (ok) { if (!ok) { return; } queueChange( placeLabel(language, sectionType, $h3), "maneyek hate rakirin", function (baseContent) { return removeSense(baseContent, language, sectionType, sectionOrdinal, definitionLevel); }, $save, $note, function () { $li.addClass("dsb-sense-doomed"); return function () { $li.removeClass("dsb-sense-doomed"); }; }, { key: senseQueueKey() } ); $note.show(); }); }); return $link; } // Only the links the row actually shows are built now; the dropdown's nine are 43% of the work and // nobody sees them until "Hevmane û Bêhtir" is clicked, so buildMenuLinks() waits for that. FIELD_DEFS.forEach(function (def) { if (!def.primary) { return; } $picker.append(makeFieldLink(def)); if (def.key === "gloss") { $picker.append($nimune); // directly after "Maneyê biguhêre" } }); // Three sections, ruled apart: what labels this sense, the word lists that hang off it, and adding // another sense. "Maneyê rake" is appended after these by makeDeleteLink() and so closes the last // one. The word lists follow senseGroups' "order" -- that array's own order is the order the "#:" // lines are written to the page in, which is not a reading order; the wizard's boxes read the same // field, so both gadgets list them alike. Anything not named here still appears, after these, so a // field added later is never silently dropped from the menu. var MENU_GROUPS = [ ["etiket", "kategori", "maneid"], SENSE_GROUPS.slice().sort(function (a, b) { return (a.order || 0) - (b.order || 0); }).map(function (g) { return "word:" + g.key; }), ["newSense"] ]; var menuBuilt = false; function buildMenuLinks() { if (menuBuilt) { return; } menuBuilt = true; var byKey = {}; FIELD_DEFS.forEach(function (def) { if (!def.primary) { byKey[def.key] = def; } }); var placed = {}; MENU_GROUPS.forEach(function (group, groupIndex) { var defs = group.map(function (key) { return byKey[key]; }).filter(Boolean); defs.forEach(function (def, i) { placed[def.key] = true; var $link = makeFieldLink(def); // The rule goes on the first entry of every group after the first. if (groupIndex > 0 && i === 0) { $link.addClass("dsb-menu-group-start"); } $moreMenu.append($link); }); }); FIELD_DEFS.forEach(function (def) { if (!def.primary && !placed[def.key]) { $moreMenu.append(makeFieldLink(def)); } }); $moreMenu.append(makeDeleteLink()); } // Lives inside $picker (not appended straight to $quickRow) so .dsb-more-menu's CSS can position it as // an overlay anchored to $picker, instead of pushing $openBoxes/the rest of the page down when it opens. var $moreArrow = $("<span class='dsb-more-arrow'></span>").text("▸"); var $moreToggle = $("<a href='#' class='dsb-quick-link dsb-more-toggle'></a>") .text(util.msg.moreMenu + " ").append($moreArrow); $moreToggle.on("click", function (e) { e.preventDefault(); buildMenuLinks(); $moreMenu.slideToggle(function () { $moreArrow.text($moreMenu.is(":visible") ? "▾" : "▸"); }); }); $picker.append($moreToggle, $moreMenu); // Outside clicks are handled by one shared document listener (see closeMoreMenus), not one per panel: // hovering a sense builds its panel, so a long entry would otherwise accumulate dozens of them. $moreMenu.data("dsbArrow", $moreArrow); // -- combined save: whatever boxes are open right now, queued together via queueChange(); the actual // save happens when the user clicks "Guhartinan qeyd bike" on the floating queue box. ---- // Small "not saved yet" preview of everything this queued change will do, appended right under the // sense's gloss (plain text, not a real render of {{hevmane}}/etc.). function collectChanges() { var base = original || { maneid: "", etiket: [], kategori: [], words: {} }; var changed = {}; var words = {}; SENSE_GROUPS.forEach(function (group) { var getter = getters["word:" + group.key]; words[group.key] = getter ? getter() : []; if (getter && !sameList(words[group.key], base.words[group.key])) { changed["word:" + group.key] = true; } }); var maneid = getters.maneid ? getters.maneid() : ""; var etiket = getters.etiket ? getters.etiket() : []; var kategori = getters.kategori ? getters.kategori() : []; if (getters.maneid && maneid !== (base.maneid || "")) { changed.maneid = true; } if (getters.etiket && !sameList(etiket, base.etiket)) { changed.etiket = true; } if (getters.kategori && !sameList(kategori, base.kategori)) { changed.kategori = true; } return { gloss: getters.gloss ? getters.gloss() : null, newSense: getters.newSense ? getters.newSense() : null, maneid: maneid, etiket: etiket, kategori: kategori, words: words, changed: changed }; } // Both the field save and "Maneyê rake" queue under this, so the later one supersedes the earlier. function senseQueueKey() { return "sense:" + sectionType + "|" + sectionOrdinal + "|" + definitionLevel.join("."); } var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add); // Where queueChange() writes its confirmation for actions that have no box of their own. var $note = $("<div class='dsb-status dsb-quick-note'></div>").hide(); var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel); var $status = $("<span class='dsb-status'></span>"); var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status).hide(); $cancel.on("click", function () { // Close the boxes too, not just the row. Hiding alone left every field still open with its // text in it, so the next click on the pencil reopened the half-filled panel that had just // been cancelled. Each box's own "x" already clears its getter, restores its link and updates // the counter, so those are triggered rather than repeating the teardown here. $openBoxes.find(".dsb-box-remove").trigger("click"); $note.hide().text(""); // dsb.js owns the pencil's pinned state; tell it rather than hiding behind its back, or the // next click on the pencil would only toggle "pinned" off and appear to do nothing. $quickRow.trigger("dsbCancel"); hideQueueIfIdle(); }); $save.on("click", function () { var changes = collectChanges(); function afterLinkify() { var parts = senseChangeLabels(changes); queueChange( placeLabel(language, sectionType, $h3), parts.length ? parts.join(", ") + (parts.length > 1 ? " hatin guhartin" : " hate guhartin") : "mane hate guhartin", function (baseContent) { return applyAdvancedChanges(baseContent, language, sectionType, sectionOrdinal, definitionLevel, changes); }, $save, $status, function () { var undoPreview = previewSense($li, language, sectionType, sectionOrdinal, definitionLevel); // A new sense has no place on the page yet, so it gets a row of its own directly // after this one -- the list numbers it, so where it will land is visible. var $newSense = null; if (changes.newSense) { $newSense = $("<li class='dsb-sense-preview'></li>"); $li.after($newSense); fillWithRendered($newSense, changes.newSense, function () { $newSense.text(changes.newSense); }); } return function () { undoPreview(); if ($newSense) { $newSense.remove(); } }; }, // Re-saving this same sense supersedes its pending change rather than queuing another. { key: senseQueueKey() } ); } $save.prop("disabled", true); // Auto-linkify the gloss as part of this save, but only a half nobody has linked by hand. // Split back into its two halves first, so the explanation is linked on its own rather than // sitting unseen inside {{îzah|…}}. if (changes.gloss) { $status.removeClass("dsb-status-ok dsb-status-error").text("Tê lînkkirin…"); var glossParts = util.splitTercimeIzah(changes.gloss); linkifyGlossParts( glossParts ? $.trim(glossParts.tercime) : changes.gloss, glossParts ? $.trim(glossParts.izah) : "", function (linkedMane, linkedIzah, error) { // The change is queued either way, so a gloss that came back empty is not written // back -- that would save the sense with its wording gone. var joined = joinGloss(linkedMane, linkedIzah); if ($.trim(joined)) { changes.gloss = joined; } if (error) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text(error); } afterLinkify(); }, true ); } else { afterLinkify(); } }); // The links sit under the buttons, so each open box pushes them down rather than leaving them far above. $quickRow.empty().append($openBoxes, $actions, $picker, $note); } // Attaches the pencil toggle to one leaf definition <li> -- clicking it reveals the "guhartina pêşketî" // (advanced editing) panel built by buildAdvancedPanel() above. // ---- per-section UI: "+ Beşek lê zêde bike" after a POS block's own content ---- // Reads the header text of "====" subsections already rendered under this POS heading, straight from the DOM. // The subsections of a part of speech are the headings one deeper than it is. function subsectionDepthFor($h3) { return (sections.headingDepth($h3) || 3) + 1; } function isSubsectionHeading($el, depth) { return sections.headingDepth($el) === depth; } function existingSubsectionHeadersInDom($h3) { var depth = subsectionDepthFor($h3); var headers = []; for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && here < depth) { break; // out of this part of speech } if (isSubsectionHeading($cursor, depth)) { var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first(); headers.push(headingText($hh)); } } return headers; } // Finds where a new "====" subsection preview belongs in the live DOM, using the same SUBSECTION_ORDER rank // insertPageSubsection() uses. Returns {insertBefore: $el} (a ranked subsection that outranks this one) or // {insertAfter: $el} (goes at the end of the block). function domSubsectionInsertAnchor($h3, header) { var depth = subsectionDepthFor($h3); var myRank = subsectionRankForHeader(header); var $last = headingOuter($h3); for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && here < depth) { break; // out of this part of speech } if (isSubsectionHeading($cursor, depth)) { var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first(); var otherRank = subsectionRankForHeader(headingText($hh)); if (otherRank !== -1 && otherRank > myRank) { return { insertBefore: $cursor }; } } $last = $cursor; } return { insertAfter: $last }; } // The wikitext one subsection's content becomes, exactly as insertPageSubsection() writes it -- so the // preview parses the same string the save will produce. function subsectionBodyWikitext(language, s, content) { if (s.kind !== "wordlist") { return content; } return content.filter(function (group) { return group.words.length; }).map(function (group) { return buildWordListCall(WORDLIST_TEMPLATE, language, withNamedParam(["cure=" + s.header], "sernav", group.sernav), group.words); }).join("\n\n"); } // The plain word list this preview falls back to when the parse fails: the values that were typed, // without the template around them. Right, but not what the page will look like. function subsectionPlainDom($wrap, s, content) { if (s.kind !== "wordlist") { $wrap.append($("<p class='dsb-preview-text'></p>").text(content)); return; } content.forEach(function (group) { if (group.sernav) { $wrap.append($("<div class='dsb-preview-subheading'></div>").text(group.sernav)); } var $list = $("<ul class='dsb-preview-list'></ul>"); group.words.forEach(function (w) { $list.append($("<li></li>").text(w.replace(/<[^<>]*>/g, ""))); }); $wrap.append($list); }); } // A "not saved yet" preview of a page-level "====" subsection, dropped into the live page at the // position the save will put it, with its body rendered the way the page renders it -- real {{kol3}} // columns and real links, not a list of the words that went into them. Returns the inserted element so // the caller can remove it again. function buildSubsectionPreviewDom($h3, s, content, language) { var $wrap = $("<div class='dsb-preview-block'></div>"); // A styled <div>, not a real <h4>, so existingSubsectionHeadersInDom() never mistakes this live-only // preview for an actual subsection already on the page. $wrap.append($("<div class='dsb-preview-heading' role='heading' aria-level='4'></div>").text(s.header)); $wrap.append($("<span class='dsb-preview-badge'></span>").text("nû — hîn nehatiye qeydkirin")); // Placed before it is filled: a cached render resolves almost at once, and filling a wrap that is // still detached would announce content nobody can see. var anchor = domSubsectionInsertAnchor($h3, s.header); if (anchor.insertBefore) { anchor.insertBefore.before($wrap); } else { anchor.insertAfter.after($wrap); } var wikitext = language ? subsectionBodyWikitext(language, s, content) : ""; if ($.trim(wikitext)) { var $body = $("<div class='dsb-preview-rendered'></div>").appendTo($wrap); fillWithRendered($body, wikitext, function () { $body.remove(); subsectionPlainDom($wrap, s, content); }); } else { subsectionPlainDom($wrap, s, content); } return $wrap; } // A free section owns what lies between its own heading and the next heading of any depth, matching // the range locateHeadingByText() edits. Returns a function that puts the page back, or null. function replaceFreeSectionInPlace($heading, wikitext) { var $start = headingOuter($heading); var body = []; for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) { if (sections.headingDepth($cursor)) { break; } if (!isOwnFurniture($cursor)) { body.push($cursor.get(0)); } } if (!body.length) { return null; } var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start); var $body = $(body).detach(); fillWithRendered($slot, wikitext, function () { $slot.remove(); $slot = null; $body.insertAfter($start); }); return function () { if ($slot) { $body.insertAfter($start); $slot.remove(); $slot = null; } }; } /** * Redraws a subsection that is already on the page with the content this edit would give it. * * The section's own nodes -- everything between its heading and the next heading of the same rank or * higher -- are detached rather than dropped, so the returned function puts the page back exactly as it * was when the change is cancelled or superseded. */ function replaceSubsectionInPlace($h3, header, wikitext) { var depth = subsectionDepthFor($h3); // Walked the same way existingSubsectionHeadersInDom() walks it, so "which nodes are this // subsection" is decided once and the same way everywhere. var $start = null; var body = []; for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && here < depth) { break; // out of this part of speech } if (isSubsectionHeading($cursor, depth)) { if ($start) { break; // the next subsection starts here } var $hh = $cursor.is("h2, h3, h4, h5, h6") ? $cursor : $cursor.find("h2, h3, h4, h5, h6").first(); if (headingText($hh) === header) { $start = $cursor; } continue; } // This gadget's own furniture stays where it is: the subsection's editing panel is the sibling // right after its heading, so sweeping it into the body would detach the very panel the change // was made in and leave the pencil toggling an element that is no longer on the page. if ($start && !isOwnFurniture($cursor)) { body.push($cursor.get(0)); } } if (!$start || !body.length) { return null; } var $slot = $("<div class='dsb-sense-preview'></div>").insertAfter($start); var $body = $(body).detach(); fillWithRendered($slot, wikitext, function () { $slot.remove(); $slot = null; $body.insertAfter($start); }); return function () { if ($slot) { $body.insertAfter($start); $slot.remove(); $slot = null; } }; } /** * The live DOM one "place" section occupies: {nodes, insert}. nodes are what a render replaces -- * empty when the section is not on the page yet -- and insert() puts an element where the section * belongs, so a new one appears exactly where the save will put it. */ // This gadget's own panels sit between a heading and the page's content, so every walk steps over // them rather than counting one as content. function isOwnFurniture($el) { return $el.is(".dsb-toolbar, .dsb-quick-row, .dsb-subsection-panel, .dsb-convert-pos-panel," + " .dsb-preview-block, .dsb-sense-preview, .dsb-preview-inline"); } // A heading's place in the page, which orders queued renames and removals bottom-up. function headingPosition($el) { var $h = $el.is("h2, h3, h4, h5, h6") ? $el : $el.find("h2, h3, h4, h5, h6").first(); return $("h2, h3, h4, h5, h6").index($h); } // One subsection's own nodes on the page, read the way headingSpan() reads the wikitext: a "====" // subsection down to the next heading at its depth or shallower, a free section ($h3 is its heading) // down to the next heading of any depth. hasDeeper says a free section has headings under it. function subsectionDom($h3, s) { var $start = null; var depth; if (s.free) { $start = headingOuter($h3); depth = sections.headingDepth($start) || sections.headingDepth($h3); } else { depth = subsectionDepthFor($h3); for (var $c = headingOuter($h3).next(); $c.length; $c = $c.next()) { var d = sections.headingDepth($c); if (d && d < depth) { break; } if (d === depth) { var $hh = $c.is("h2, h3, h4, h5, h6") ? $c : $c.find("h2, h3, h4, h5, h6").first(); if (headingText($hh) === s.header) { $start = $c; break; } } } } if (!$start) { return null; } var body = []; var hasDeeper = false; for (var $cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) { var here = sections.headingDepth($cursor); if (here && (s.free || here <= depth)) { hasDeeper = !!s.free && here > depth; break; } if (!isOwnFurniture($cursor)) { body.push($cursor.get(0)); } } return { $heading: $start, $body: $(body), hasDeeper: hasDeeper }; } function loosePlaceDom($h3, subsection) { var place = subsection.place; var nodes = []; var $cursor; if (place === "page-top") { // Şablon:herwiha binêre renders as <div class="rellink binere"> at the head of the content. var $out = $("#mw-content-text .mw-parser-output").first(); var $hat = $out.children(".binere, .rellink").first(); if ($hat.length) { return { nodes: $hat.get(), insert: function ($el) { $hat.before($el); } }; } return { nodes: [], insert: function ($el) { $out.prepend($el); } }; } var $start = headingOuter($h3); if (place === "pron") { // A "===" heading above this POS block, under the language one. for (var $back = $start.prev(); $back.length; $back = $back.prev()) { if ($back.is(".mw-heading2, h2")) { break; } if ($back.is(".mw-heading3, h3")) { var $hh = $back.is("h3") ? $back : $back.find("h3").first(); if (headingText($hh) === subsection.header) { for ($cursor = $back.next(); $cursor.length && !$cursor.is(".mw-heading2, .mw-heading3, h2, h3"); $cursor = $cursor.next()) { if (!isOwnFurniture($cursor)) { nodes.push($cursor.get(0)); } } return { nodes: nodes, insert: function ($el) { $back.after($el); } }; } } } return { nodes: [], insert: function ($el) { $start.before($el); } }; } if (place === "pos-top") { // The thumbnails between the heading and the headword line. for ($cursor = $start.next(); $cursor.length; $cursor = $cursor.next()) { if (isOwnFurniture($cursor)) { continue; } if (!$cursor.is(".thumb, figure, .floatright, .floatleft")) { break; } nodes.push($cursor.get(0)); } return { nodes: nodes, insert: function ($el) { $start.after($el); } }; } return null; } // The wikitext a "place" section's pending content renders as. A word list is its one call; everything // else is already the body that will be written. function loosePlacePreviewWikitext(subsection, content, language) { return subsection.kind === "wordlist" ? wt.buildHbnrCall(loosePlaceWords(content)) : loosePlaceBody(subsection, content, language); } // Draws a section's headword line from wikitext where the page's own line stands, or above the // definitions when the section has none. The page's line is detached rather than dropped, so the // returned function puts it back. function replaceHeadwordInPlace($h3, wikitext) { if (!$.trim(wikitext || "")) { return null; } var $old = $(); var $at = $(); for (var $cursor = headingOuter($h3).next(); $cursor.length; $cursor = $cursor.next()) { if ($cursor.is("p")) { $old = $cursor; break; } if (sections.headingDepth($cursor) || $cursor.is("ol")) { $at = $cursor; break; } } var $slot = $("<div class='dsb-sense-preview'></div>"); if ($old.length) { $old.before($slot); } else if ($at.length) { $at.before($slot); } else { return null; } var $body = $old.detach(); function restore() { if (!$slot) { return; } $body.insertBefore($slot); $slot.remove(); $slot = null; } fillWithRendered($slot, wikitext, restore); return restore; } // Redraws one of those places where it stands, the same way replaceSubsectionInPlace() redraws a // "====" one. The page's own nodes are detached rather than dropped, so cancelling puts them back. function replaceLoosePlaceInPlace($h3, subsection, wikitext) { if (!$.trim(wikitext || "")) { return null; } var at = loosePlaceDom($h3, subsection); if (!at) { return null; } var $slot = $("<div class='dsb-sense-preview'></div>"); at.insert($slot); var $body = $(at.nodes).detach(); function restore() { if (!$slot) { return; } $body.insertBefore($slot); $slot.remove(); $slot = null; } fillWithRendered($slot, wikitext, restore); return restore; } // Builds the subsection picker + its word-list/text field. A subsection that isn't on the page yet is saved // via insertPageSubsection(); one that already is gets prefilled and saved via updatePageSubsection(). // onlyHeader pins the panel to a single subsection (the per-heading pencil); omit it for the full picker. // free pins the panel to a heading that is not a subsection of a part of speech, located by its own // text: {header, ordinal}. function buildSubsectionPanel($panel, $h3, language, sectionType, sectionOrdinal, onlyHeader, free) { var existing = existingSubsectionHeadersInDom($h3); // A heading the data does not name is still editable. It is declared a word list so the reader // tries, in order, its {{kol3}} calls and then a plain bullet list; anything else falls through to // raw wikitext, which is what prefill() does with a list it cannot read. // Hidden counts as unknown here: the picker does not offer to build a Werger box, but one already // on the page still opens, as the wikitext it is. var unknown = onlyHeader && !PAGE_SUBSECTIONS.some(function (s) { return s.header === onlyHeader && !s.hidden; }); // A free section starts as wikitext: what it holds is only known once it has been read, and // prefill() swaps in the {{kol3}} form there if it turns out to be a list. var available = free ? [{ header: onlyHeader, id: "free", kind: "text", free: free, existing: true }] : unknown ? [{ header: onlyHeader, id: "unknown", kind: "wordlist", unknown: true, existing: true }] : PAGE_SUBSECTIONS.filter(function (s) { // "hidden" takes a section out of the picker without removing it: Werger waits for the // translation tools it belongs to, and offering a box those cannot yet fill misleads. // Werger also carries lang: "ku" -- it is a Kurdish-entry section, so it is not offered // elsewhere either. return !s.hidden && (!s.lang || s.lang === language) && (!onlyHeader || s.header === onlyHeader); }).map(function (s) { return $.extend({}, s, { existing: existing.indexOf(s.header) !== -1 }); }); if (!available.length) { $panel.text("Ji bo vê beşê guhartin tune."); return; } var $select = $("<select class='dsb-subsection-select'></select>"); if (!onlyHeader) { // Label-less on purpose: it holds the "nothing chosen yet" value without becoming a row in the // list (makeSearchable() skips a blank option that has no label), so the prompt lives in the // input's placeholder instead. $select.append($("<option value=''></option>")); } available.forEach(function (s) { // A "place" entry has no "====" heading of its own, so it is marked rather than left looking // like the subsections around it. var label = s.place ? s.header + " (ne binebeş e)" : (s.existing ? s.header + " (biguhêre)" : s.header); $select.append($("<option></option>").val(s.id).text(label)); }); var $selectWrap = makeSearchable($select, "Binebeşek hilbijêre"); if (onlyHeader) { $selectWrap.hide(); // pinned to one subsection: nothing to choose } var $fieldWrap = $("<div class='dsb-subsection-field'></div>"); var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add); var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel); var $status = $("<span class='dsb-status'></span>"); var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status); $cancel.on("click", function () { resetForm(); $panel.hide(); hideQueueIfIdle(); }); // A panel pinned to a heading on the page can rename or remove it. Bilêvkirin and the other places // have no heading of their own to change. var headingEditable = !!onlyHeader && available.length === 1 && available[0].existing && !available[0].place; var $nameWrap = null; // Only a panel pinned to one heading renames it; elsewhere the name is the picked subsection's own. var readName = function (s) { return s.header; }; if (headingEditable) { var subject = available[0]; var $nameLabel = $("<div class='dsb-adv-label'>Nav</div>"); if (subject.free) { var $nameInput = $("<input type='text' class='dsb-input dsb-heading-name'>").val(onlyHeader); readName = function () { return $.trim($nameInput.val()); }; $nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameInput); } else { // The names the gadget knows, for a subsection of a part of speech; one this part of speech // already has is left out. var $nameSelect = $("<select class='dsb-heading-name'></select>"); var names = [onlyHeader]; PAGE_SUBSECTIONS.forEach(function (s) { if (!s.place && !s.hidden && (!s.lang || s.lang === language) && names.indexOf(s.header) === -1 && existing.indexOf(s.header) === -1) { names.push(s.header); } }); names.forEach(function (name) { $nameSelect.append($("<option></option>").val(name).text(name)); }); var $nameSearch = makeSearchable($nameSelect, "Nav"); $nameSelect.val(onlyHeader).trigger("wiktku:refresh"); readName = function () { return $nameSelect.val() || onlyHeader; }; $nameWrap = $("<div class='dsb-heading-name-wrap'></div>").append($nameLabel, $nameSearch); } var subjectDom = subsectionDom($h3, subject); if (!(subjectDom && subjectDom.hasDeeper)) { var $delete = $("<button type='button' class='dsb-delete'>Beşê jê bibe</button>"); $cancel.after($delete); $delete.on("click", function () { OO.ui.confirm("Beşa «" + subject.header + "» dê were rakirin. Dewam bike?").done(function (ok) { if (!ok) { return; } queueHeadingChange(subject, "beşa «" + subject.header + "» hate rakirin", function (pageContent) { return removeSubsection(pageContent, language, sectionType, sectionOrdinal, subject); }, function () { var dom = subsectionDom($h3, subject); if (!dom) { return null; } var $doomed = dom.$heading.add(dom.$body).addClass("dsb-preview-removed"); return function () { $doomed.removeClass("dsb-preview-removed"); }; }); }); }); } } // Renaming and removing share one queue key, so the later choice replaces the earlier one. Both run // last and bottom-up, since other queued changes find the section by the heading they change. function queueHeadingChange(s, action, transform, previewFn) { var dom = subsectionDom($h3, s); queueChange(subsectionPlaceLabel(s, language, sectionType, $h3), action, function (pageContent) { return { content: transform(pageContent), warnings: [] }; }, $save, $status, previewFn, { runLast: true, key: "heading:" + (s.free ? s.header + "|" + s.free.ordinal : sectionType + "|" + sectionOrdinal + "|" + s.header), pagePosition: dom ? headingPosition(dom.$heading) : 0 }); } function queueRename(s, newName) { queueHeadingChange(s, "beşa «" + s.header + "» bû «" + newName + "»", function (pageContent) { return renameSubsection(pageContent, language, sectionType, sectionOrdinal, s, newName); }, function () { var dom = subsectionDom($h3, s); if (!dom) { return null; } var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>") .text("→ " + newName + " — nû, hîn nehatiye qeydkirin"); dom.$heading.after($note); return function () { $note.remove(); }; }); } // Undefined while the placeholder option is selected. function currentSubsection() { var id = $select.val(); return id ? available.filter(function (s) { return s.id === id; })[0] : undefined; } // One entry per "{{kol3}}" group in the current wordlist section; empty for any other kind. var groupFields = []; var $groups = null; var editAsText = false; // set when an existing wordlist section turns out to be unparseable // Whatever has been typed into each subsection's box, so switching the picker away and back restores it // instead of rebuilding an empty field. Keyed by subsection id; lastId is whichever box is on screen. var drafts = {}; var lastId = null; // Called before renderField() rebuilds, while the group fields still hold the outgoing box. function captureDraft() { if (!lastId) { return; } drafts[lastId] = imagesField ? { asText: false, images: imagesField.values() } : (groupFields.length ? { asText: false, groups: readGroups() } : { asText: editAsText, text: fieldText() }); } function restoreDraft(s, draft) { // An existing wordlist we previously fell back to raw wikitext for stays in that mode. if (draft.asText && s.kind === "wordlist") { editAsText = true; groupFields = []; renderTextArea(s, 6); } if (imagesField) { imagesField.setValues(draft.images); } else if (groupFields.length) { setGroups(s, draft.groups); } else { setFieldText(draft.text); } } // Etîmolojî is edited on a live surface (see renderChipSurface) rather than in a textarea, so every // read and write of the field goes through these two instead of touching .dsb-subsection-text. var chipSurface = null; function fieldText() { if (wergerForm) { return buildWergerBlock(wergerForm.read()); } return chipSurface ? $.trim(readChipSurface(chipSurface.get(0))) : $.trim($fieldWrap.find(".dsb-subsection-text").val() || ""); } function setFieldText(value) { if (wergerForm) { wergerForm.set(parseWergerBlock(value)); return; } if (chipSurface) { renderChipSurface(chipSurface, value || ""); var schedule = chipSurface.data("dsbSchedulePreview"); if (schedule) { schedule(); // show what the loaded etymology renders as } } else { $fieldWrap.find(".dsb-subsection-text").val(value || ""); } } // The contenteditable surface: text typed directly, template calls as chips that open the dialog, // plus start.js's etymology templates in a searchable insert menu. // A live surface where a template shows as a chip, with a menu that inserts one. Etîmolojî and // Bilêvkirin are both written this way; they differ only in which templates the menu offers. function renderTemplateEditor(s, templates) { $fieldWrap.empty(); var $select = $("<select class='dsb-subsection-select'></select>"); $select.append($("<option value=''></option>")); templates.forEach(function (t) { $select.append($("<option></option>").val(t.snippet).text(t.name + " — " + t.desc)); }); var $surface = $("<div class='dsb-tpl-surface' contenteditable='true'></div>") .attr("role", "textbox") .attr("aria-multiline", "true"); chipSurface = $surface; // Clicking the insert menu moves focus out of the surface and the browser forgets the caret, so // the last caret position inside the surface is kept and restored before inserting -- otherwise // focus() drops it back to the very start and every template lands at the beginning of the line. var savedRange = null; function rememberCaret() { var sel = window.getSelection(); if (!sel || !sel.rangeCount) { return; } var range = sel.getRangeAt(0); var root = $surface.get(0); if (range.commonAncestorContainer === root || $.contains(root, range.commonAncestorContainer)) { savedRange = range.cloneRange(); } } $surface.on("keyup mouseup focusout", rememberCaret); function restoreCaret() { if (!savedRange) { return; } var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(savedRange); } $select.on("change", function () { var snippet = $select.val(); if (!snippet) { return; } // Same substitution start.js makes: CODE is this section's language, SOURCELANG is left for // the user to fill in. snippet = snippet.replace(/CODE/g, language).replace(/SOURCELANG/g, "?"); // A pronunciation template is a bullet of its own ("* {{ku-IPA}}"), so it starts a line // rather than landing in the middle of one. var ownLine = /^\*\s/.test(snippet); if (ownLine) { snippet = $.trim(snippet.replace(/^\*\s*/, "")); } $surface.focus(); restoreCaret(); var $chip = makeTemplateChip(snippet); var piece = document.createDocumentFragment(); if (ownLine) { // The bullet, and a line of its own unless the caret already starts one. var at = caretOffset(); var before = at >= 0 ? readChipSurface($surface.get(0)).slice(0, at) : ""; piece.appendChild(document.createTextNode(!before || /\n$/.test(before) ? "* " : "\n* ")); } piece.appendChild($chip.get(0)); insertAtCaret($surface, piece); rememberCaret(); // so a second insert lands after the first, not back at the old spot $select.val(""); // Straight into the dialog: the snippet is placeholders ("?", "…") until someone fills it in. cite.openTemplateDialog(snippet).then(function (edited) { applyChipEdit($chip, edited); syncPanelWidth(); }); }); // Paste as plain text: pasted markup would otherwise become real nodes in the surface. $surface.on("paste", function (e) { var clip = e.originalEvent && e.originalEvent.clipboardData; if (!clip) { return; } e.preventDefault(); document.execCommand("insertText", false, clip.getData("text/plain")); }); // The chip the dialog was opened for, or the one that has taken its place. renderChipSurface() // rebuilds the surface from its wikitext whenever a call is typed in as text, which throws away // the element this closure is holding; without this, "Jê bibe" would remove a node that is no // longer on screen and appear to do nothing. function liveChip($chip, wikitext) { if ($.contains($surface.get(0), $chip.get(0))) { return $chip; } return $surface.find(".dsb-tpl-chip").filter(function () { return $(this).attr("data-wikitext") === wikitext; }).first(); } function applyChipEdit($chip, edited) { if (edited === null || !$chip.length) { return; } if (!$.trim(edited)) { $chip.remove(); return; } // Edited into something that is no longer one template call: let it fall back to plain text // rather than keeping a chip that lies about its contents. var call = parseTemplateCalls(edited); if (call.otherContent || call.calls.length !== 1) { $chip.replaceWith(document.createTextNode(edited)); return; } $chip.replaceWith(makeTemplateChip(edited)); } // Double-click edits the call's wikitext in place; single click opens the parameter dialog. The // click is held back briefly so the first of a double-click does not open the dialog underneath. var chipClickTimer = null; var lastChipTap = 0; var lastChipNode = null; var DOUBLE_TAP_MS = 300; // Double-tap drops the chip back to plain wikitext in the surface, rather than making the chip // itself editable: a contenteditable inside a contenteditable gives Android a selection handle and // no usable caret. As plain text the browser's own editing works, and chipifyTyped() puts the chip // back once the caret leaves the call. // A collapsed caret inside the text just inserted: at the character tapped where the browser can // say which that is, otherwise just inside the closing braces so the caret stays within the call // (which is what stops chipifyTyped putting the chip straight back). function caretRangeIn(node, event) { var range; var x = event && event.clientX; var y = event && event.clientY; if (x !== undefined && document.caretRangeFromPoint) { range = document.caretRangeFromPoint(x, y); } else if (x !== undefined && document.caretPositionFromPoint) { var pos = document.caretPositionFromPoint(x, y); if (pos) { range = document.createRange(); range.setStart(pos.offsetNode, pos.offset); } } if (range && range.startContainer === node) { range.collapse(true); return range; } var text = node.nodeValue; range = document.createRange(); range.setStart(node, /\}\}$/.test(text) ? text.length - 2 : text.length); range.collapse(true); return range; } function startInlineEdit($chip, event) { if (!$.contains($surface.get(0), $chip.get(0))) { return; // the tap timer and dblclick can both fire; only the first one has a chip left } var node = document.createTextNode($chip.attr("data-wikitext")); $chip.replaceWith(node); $surface.get(0).focus(); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(caretRangeIn(node, event)); } // Bound before the chip's own handler and stopping there, so removing a call never opens the // dialog for it on the way out. $surface.on("click", ".dsb-tpl-chip-remove", function (e) { e.preventDefault(); e.stopImmediatePropagation(); clearTimeout(chipClickTimer); lastChipNode = null; $(this).closest(".dsb-tpl-chip").remove(); syncPanelWidth(); }); $surface.on("click keydown", ".dsb-tpl-chip", function (e) { if (e.type === "keydown" && e.which !== 13 && e.which !== 32) { return; } e.preventDefault(); var $chip = $(this); clearTimeout(chipClickTimer); // A second tap on the same chip edits it inline. Timed here rather than left to "dblclick", // which mobile browsers fire unreliably or not at all for a double-tap. var now = new Date().getTime(); if (lastChipNode === this && now - lastChipTap < DOUBLE_TAP_MS) { lastChipNode = null; startInlineEdit($chip, e); return; } lastChipTap = now; lastChipNode = this; var wikitext = $chip.attr("data-wikitext"); chipClickTimer = setTimeout(function () { cite.openTemplateDialog(wikitext).then(function (edited) { applyChipEdit(liveChip($chip, wikitext), edited); syncPanelWidth(); }); }, DOUBLE_TAP_MS); }); $surface.on("dblclick", ".dsb-tpl-chip", function (e) { e.preventDefault(); clearTimeout(chipClickTimer); startInlineEdit($(this), e); }); // A long etymology cannot be read in the panel's usual 520px column, so the panel drops its // width cap once there is enough text to need it. What it will look like is shown by the // in-place render on the page itself, not by a second copy inside the form. var WIDE_AT = 240; // characters function syncPanelWidth() { var wikitext = readChipSurface($surface.get(0)); if (wikitext.length > WIDE_AT || wikitext.indexOf("\n") !== -1) { $surface.closest(".dsb-subsection-panel").addClass("dsb-panel-wide"); } } // A template typed by hand becomes a chip once typing settles, so it behaves like an inserted one: // click for the parameter dialog, double-click for its raw wikitext. var composing = false; // The caret as an offset into the surface's wikitext, which is what survives rebuilding the DOM. function caretOffset() { var sel = window.getSelection(); var root = $surface.get(0); if (!sel || !sel.rangeCount) { return -1; } var range = sel.getRangeAt(0); if (range.startContainer !== root && !$.contains(root, range.startContainer)) { return -1; // caret is somewhere else on the page } var pre = document.createRange(); pre.selectNodeContents(root); pre.setEnd(range.startContainer, range.startOffset); var holder = document.createElement("div"); holder.appendChild(pre.cloneContents()); return readChipSurface(holder).length; } // Puts the caret back at that wikitext offset. Only runs straight after a rebuild, so the surface // holds nothing but text nodes and chips. function placeCaret(offset) { var root = $surface.get(0); var range = document.createRange(); var nodes = root.childNodes; root.focus(); for (var i = 0; i < nodes.length; i++) { var node = nodes[i]; var len = node.nodeType === 3 ? node.nodeValue.length : ($(node).attr("data-wikitext") || $(node).text()).length; if (offset <= len) { if (node.nodeType === 3) { range.setStart(node, offset); } else { range.setStartAfter(node); // a chip is atomic; the caret goes after it } break; } offset -= len; } if (!range.startContainer || range.startContainer === document) { range.selectNodeContents(root); } range.collapse(true); var sel = window.getSelection(); sel.removeAllRanges(); sel.addRange(range); } // True when the selection overlaps the inside of a template call. A caret resting exactly at the // closing "}}" does not count -- that is someone who has just finished typing one. function selectionTouchesCall(wikitext) { var sel = window.getSelection(); if (!sel || !sel.rangeCount) { return false; } var range = sel.getRangeAt(0); var root = $surface.get(0); if (range.startContainer !== root && !$.contains(root, range.startContainer)) { return false; } var from = caretOffset(); var to = from; if (!range.collapsed) { var pre = document.createRange(); pre.selectNodeContents(root); pre.setEnd(range.endContainer, range.endOffset); var holder = document.createElement("div"); holder.appendChild(pre.cloneContents()); to = readChipSurface(holder).length; } return parseTemplateCalls(wikitext).calls.some(function (call) { return from < call.end && to > call.start; }); } function chipifyTyped() { if (composing) { return; // never rebuild under an IME } var wikitext = readChipSurface($surface.get(0)); // Chips already hold one call each, so a higher call count means one was typed in as text. if (parseTemplateCalls(wikitext).calls.length <= $surface.find(".dsb-tpl-chip").length) { return; } var offset = caretOffset(); if (selectionTouchesCall(wikitext)) { return; // still inside a call: leave it as text until the caret moves out } renderChipSurface($surface, wikitext); savedRange = null; // the old range points at nodes that no longer exist if (offset >= 0) { placeCaret(offset); rememberCaret(); } } $surface.on("compositionstart", function () { composing = true; }); $surface.on("compositionend", function () { composing = false; schedulePreview(); }); var previewTimer = null; function schedulePreview() { clearTimeout(previewTimer); previewTimer = setTimeout(function () { chipifyTyped(); syncPanelWidth(); }, 700); } $surface.on("input", schedulePreview); $surface.data("dsbSchedulePreview", schedulePreview); $fieldWrap.append(makeSearchable($select, util.msg.addTemplate), $surface); // Bilêvkirin is written in IPA, so it gets the same character palette the wizard shows. Its // characters go in as text and its two template buttons as chips, which is what the rest of // this surface is made of. if (s.place === "pron") { $fieldWrap.append(util.buildIpaPalette({ insertText: function (text) { $surface.focus(); restoreCaret(); insertAtCaret($surface, document.createTextNode(text)); rememberCaret(); schedulePreview(); }, insertTemplate: function (snippet) { $surface.focus(); restoreCaret(); var $chip = makeTemplateChip(snippet.replace(/\|\s*\}\}$/, "}}")); insertAtCaret($surface, $chip.get(0)); rememberCaret(); cite.openTemplateDialog($chip.attr("data-wikitext")).then(function (edited) { applyChipEdit($chip, edited); syncPanelWidth(); }); } })); } } // The three "place" sections are wikitext with a shape worth spelling out, since nothing on screen // says what belongs in the box. var PLACE_PLACEHOLDERS = { "page-top": "{{h-bnr|Kelîme|Kelîmeyeke din}} an jî {{herwiha binêre/ane}}", "pos-top": "[[Wêne:Navê pelî.jpg|thumb|Binnivîs]]", "pron": "* {{ku-IPA}}" }; function renderTextArea(s, rows) { $fieldWrap.empty().append( $("<textarea class='dsb-input dsb-subsection-text'></textarea>") .attr("rows", rows) .attr("placeholder", PLACE_PLACEHOLDERS[s.place] || (s.header + "…")) ); util.initManualResize($fieldWrap); } // A translation box: the {{werger-ser}}/{{werger-bin}} pair, with the sense it covers and the // layout parameters that template accepts. The rows in between are left to the translation editor // gadget, which is what edits them on the rendered page. // Reads and writes through fieldText()/setFieldText() as wikitext, so drafts, save and the queue // need no special case beyond the append below. var wergerForm = null; var imagesField = null; function renderWergerField(s) { var inputs = {}; // Its own row class rather than .dsb-tpl-param-row: that one is styled in cite.css, which is // only on the page when wikt.cite happens to be loaded, and without it the label falls back to // sitting inline and a short one ("id") is overlapped by its own box. function row(key, label, placeholder) { inputs[key] = $("<input type='text' class='dsb-input'>").attr("placeholder", placeholder || ""); return $("<div class='dsb-werger-row'></div>").append( $("<label class='dsb-adv-label'></label>").text(label).append(inputs[key]) ); } // {{werger-ser}} also takes stûn, firehî, bgcolor, valign and align, but they only restyle the // box and its defaults are what these pages use, so the form does not offer them. They are // still in WERGER_NAMED, so a block that already sets one is read back correctly. var $main = $("<div class='dsb-werger-main'></div>").append( row("1", "Mane", "ava vexwarinê"), row("2", "Mane no", "ne mecbûrî — di parantezê de xuya dike"), row("id", "id", "ne mecbûrî — IDya tercimeyê") ); var $note = $("<p class='dsb-werger-note'></p>").text( "Qutiyeke Wergerê ya vala lê zêde dikî. Tercimeyan bi amûra wergerê dûre binivîse." ); wergerForm = { read: function () { var out = {}; $.each(inputs, function (key, $input) { var value = $.trim($input.val() || ""); if (value) { out[key] = value; } }); return out; }, set: function (params) { $.each(inputs, function (key, $input) { $input.val((params && params[key]) || ""); }); } }; $fieldWrap.empty().append($note, $main); } // Same [[Kategorî:Çavkanî]] search widget start.js's own picker uses: choosing an entry inserts // "* {{Target}}" at the cursor. The field itself stays the plain ".dsb-subsection-text" textarea // every other "kind: text" subsection already uses, so save/prefill/drafts need no changes. function renderCavkaniField(s) { var $ta = $("<textarea class='dsb-input dsb-subsection-text'></textarea>") .attr("rows", 4) .attr("placeholder", util.msg.pickOrTypeTemplate); var picker = cite.buildCategoryTemplateSearch({ placeholder: util.msg.addTemplate, describe: true, // Same param dialog Etîmolojî opens on a fresh insert: filled from the picked template's own // TemplateData, so the user adds "rûpel=", "sernav=", ... before anything lands in the field // rather than typing a bare {{Target}} and going back to fill params in by hand. onPick: function (entry) { cite.openTemplateDialog("{{" + entry.target + "}}").then(function (edited) { if (!edited) { return; // cancelled, or "Jê bibe" on a call that was never inserted } util.insertAtCursor($ta.get(0), "* " + edited + "\n"); $ta.trigger("focus"); }); } }); var $picker = $("<div class='dsb-cavkani-picker'></div>").append(picker.$element); $fieldWrap.empty().append($picker, $ta); } // One "{{kol3}}" group: its "sernav=" heading and its words. Several of these make up one section -- // "Herwiha binêre" typically carries an unheaded list plus a few headed ones. function addGroup(s, group) { var $sernav = $("<input type='text' class='dsb-input'>").attr("placeholder", "ne mecbûrî…"); // {{h-bnr}} takes bare page names, so its rows carry no ⊕: there is nowhere in the call for a // modifier to go. var words = buildWordListField(s.header + "…", { modifiers: !s.single }); var $remove = $("<a href='#' class='dsb-quick-link dsb-group-remove'>Komê rake</a>"); var $element = $("<div class='dsb-wordgroup'></div>").append( // Label beside the box, not above it: stacked, "Sernav" read as a heading for the whole // group rather than as the name of the field under it. The input is nested in the label so // clicking the word focuses the box, without needing an id per group. // A single-call list has no "sernav=" to carry, so the row is built (readGroups still reads // it) but never shown. Hidden here rather than in renderField: setGroups() rebuilds every // group on prefill, which would put a visible one back. $("<div class='dsb-tpl-param-row dsb-param-row-inline'></div>").append( $("<label class='dsb-adv-label'></label>").text("Sernav").append($sernav) ).toggle(!s.single), words.$element, $remove ); var field = { $element: $element, read: function () { return { sernav: $.trim($sernav.val()), words: words.values() }; }, set: function (g) { $sernav.val((g && g.sernav) || ""); words.setValues((g && g.words) || []); } }; $remove.on("click", function (e) { e.preventDefault(); var at = $.inArray(field, groupFields); if (at !== -1) { groupFields.splice(at, 1); } $element.remove(); updateGroupChrome(); }); field.set(group); groupFields.push(field); $groups.append($element); updateGroupChrome(); return field; } // With a single group there is nothing to tell apart, so it needs neither a remove link nor a label. function updateGroupChrome() { var many = groupFields.length > 1; $groups.toggleClass("dsb-wordgroups-many", many); $groups.find(".dsb-group-remove").toggle(many); } function readGroups() { return groupFields.map(function (field) { return field.read(); }); } // Rebuilds the blocks to match what the page (or the draft) holds, always leaving at least one. function setGroups(s, groups) { groupFields = []; $groups.empty(); (groups && groups.length ? groups : [null]).forEach(function (group) { addGroup(s, group); }); } // Loads what the page already has into the form, so an edit starts from the current list rather than // from an empty one. A wordlist section we can't parse degrades to raw wikitext editing. function prefill(s) { $status.removeClass("dsb-status-error dsb-status-ok").text("Tê barkirin…"); $save.prop("disabled", true); fetchPageSubsection(language, sectionType, sectionOrdinal, s).then(function (current) { $save.prop("disabled", false); $status.text(""); if (!current) { return; } // A "place" section has no heading of its own, so whether the page already has one cannot // be seen in the DOM the way a "====" subsection can -- it is known only once its content // has been read. That is what decides "nûkirin" or "zêdekirin" in the edit summary. if (s.place) { s.existing = !!(current.images ? current.images.length : $.trim(current.text || "")); // The label was set before this content arrived, when nothing yet said one was there. $save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add); } if (current.kind === "images" && imagesField) { imagesField.setValues(current.images); return; } // A free section's field was built before its content was known: a list turns it into the // {{kol3}} form, anything else leaves it the wikitext box it already is. if (s.free && current.kind === "wordlist" && !groupFields.length) { s.kind = "wordlist"; renderWordListField(s); setGroups(s, current.groups); if (current.fromBullets) { $status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}."); } return; } if (current.kind === "wordlist" && groupFields.length) { setGroups(s, current.groups); if (current.fromBullets) { $status.text("Ev lîste made bi made hatiye nivîsîn — bi qeydkirinê dibe {{kol3}}."); } return; } if (s.kind === "wordlist") { editAsText = true; groupFields = []; renderTextArea(s, 6); $status.text(s.unknown ? "Ev beş nayê naskirin — wekî wîkîtekst tê guhartin." : "Şablona vê lîsteyê nehate naskirin — wekî wîkîtekst biguhêre."); } setFieldText(current.text); }, function () { $save.prop("disabled", false); $status.addClass("dsb-status-error").text("Nikare muhtewaya heyî bixwîne."); }).then(function () { if (currentSubsection() === s) { loadedSnapshot = contentSnapshot(); } }); } // What the box held when the page's content was put in it, so a save that changed nothing queues // nothing -- renaming a heading does not also rewrite its body. var loadedSnapshot = null; function contentSnapshot() { if (imagesField) { return JSON.stringify(imagesField.values()); } return JSON.stringify(groupFields.length ? readGroups() : fieldText()); } // One "{{kol3}}" group per block, plus a way out to raw wikitext for a list no row can express -- // a shared subpage list like {{herwiha binêre/ane}}, say. function renderWordListField(s) { $fieldWrap.empty(); chipSurface = null; editAsText = false; var $addGroup = $("<a href='#' class='dsb-quick-link'>+ Komek lê zêde bike</a>"); $addGroup.on("click", function (e) { e.preventDefault(); addGroup(s, null); }); $groups = $("<div class='dsb-wordgroups'></div>"); $fieldWrap.append($groups, $addGroup); addGroup(s, null); // One call takes one flat list of names, so there is no second group to add. if (s.single) { $addGroup.hide(); } var $toRaw = $("<a href='#' class='dsb-quick-link'>Wekî wîkîtext biguhêre</a>"); $toRaw.on("click", function (e) { e.preventDefault(); var current = s.place ? wt.buildHbnrCall(loosePlaceWords(readGroups())) : subsectionBodyWikitext(language, s, readGroups()); editAsText = true; groupFields = []; $groups = null; renderTextArea(s, 3); setFieldText(current); util.initManualResize($fieldWrap); }); $fieldWrap.append($toRaw); util.initManualResize($fieldWrap); } function renderField() { var s = currentSubsection(); loadedSnapshot = null; $fieldWrap.empty(); groupFields = []; $groups = null; editAsText = false; chipSurface = null; wergerForm = null; imagesField = null; $status.removeClass("dsb-status-error dsb-status-ok").text(""); // Save stays disabled (but "Betal bike" usable) until something is actually chosen. $save.prop("disabled", !s); if (!s) { $save.text(util.msg.add); lastId = null; return; // still on "Binebeşekê hilbijêre" } if (s.kind === "wordlist") { renderWordListField(s); } else if (s.kind === "images") { imagesField = util.buildImageListField({ prefix: "dsb-", rowClass: "dsb-tpl-param-row dsb-param-row-inline", inputClass: "dsb-input", addClass: "dsb-quick-link", pageName: mw.config.get("wgTitle") }); $fieldWrap.append(imagesField.$element); } else if (s.header === "Etîmolojî") { renderTemplateEditor(s, templateChoices("etymTpls", language)); } else if (s.place === "pron") { renderTemplateEditor(s, templateChoices("pronTpls", language)); } else if (s.kind === "werger") { renderWergerField(s); } else if (s.header === "Çavkanî") { renderCavkaniField(s); } else { renderTextArea(s, 3); } // Werger always adds a box, even to a section that is already there, so its button never says // "Biguhêre". $save.text(s.existing && s.kind !== "werger" ? util.msg.edit : util.msg.add); // Covers whichever branch above built the field. Idempotent, so a textarea already carrying a // grip is skipped. util.initManualResize($fieldWrap); lastId = s.id; // A draft always wins over re-reading the page: it is the newer, unsaved state. if (drafts[s.id]) { restoreDraft(s, drafts[s.id]); } else if ((s.existing || s.place) && s.kind !== "werger") { prefill(s); } } $select.on("change", function () { captureDraft(); renderField(); }); renderField(); // Back to the state a fresh open would show: no draft, no picked subsection. Called directly // rather than through the "change" handler above, so the discarded draft is never captured first. function resetForm() { drafts = {}; if (!onlyHeader) { $select.val("").trigger("wiktku:refresh"); } renderField(); } $save.on("click", function () { var s = currentSubsection(); if (!s) { return; } var newName = readName(s); if (!newName) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Navê beşê vala ye."); return; } var asText = editAsText || (s.kind !== "wordlist" && s.kind !== "images"); var effective = asText ? $.extend({}, s, { kind: "text" }) : s; var content; var hasContent; if (asText) { content = fieldText(); hasContent = !!content; } else if (s.kind === "images") { content = imagesField ? imagesField.values() : []; hasContent = content.length > 0; } else { content = readGroups(); hasContent = content.some(function (group) { return group.words.length; }); } var renaming = newName !== s.header; if (renaming) { queueRename(s, newName); } var unchanged = loadedSnapshot !== null && contentSnapshot() === loadedSnapshot; if (!hasContent || unchanged) { if (unchanged && !renaming) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Tiştek nehatiye guhartin."); } return; } $save.prop("disabled", true); // A Werger section holds any number of boxes, so an existing one is appended to rather than // replaced; every other kind edits the single body it owns. var appending = s.kind === "werger" && s.existing; queueChange( subsectionPlaceLabel(s, language, sectionType, $h3), s.kind === "werger" ? "qutiyeke wergerê hate zêdekirin" : "beşa «" + s.header + "» hate " + (s.existing ? "nûkirin" : "zêdekirin"), function (pageContent) { var body = content; if (appending) { var current = readPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective); var existingText = current ? $.trim(current.text || "") : ""; body = existingText ? existingText + "\n\n" + content : content; } return { content: s.free ? updateFreeSection(pageContent, language, effective, body) : (s.place ? writeLoosePlace(pageContent, language, sectionType, sectionOrdinal, effective, loosePlaceBody(effective, body, language)) : (s.existing ? updatePageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body) : insertPageSubsection(pageContent, language, sectionType, sectionOrdinal, effective, body))), warnings: [] }; }, $save, $status, // Werger is a box the translation tools fill in afterwards, so there is nothing to draw for // it. A new subsection gets a block of its own at the position it will land in; one already // on the page is redrawn where it stands. s.kind === "werger" ? null : function () { // A free section is redrawn under its own heading, which is the element the panel hangs // on. if (s.free) { var restoreFree = replaceFreeSectionInPlace($h3, subsectionBodyWikitext(language, effective, content)); return function () { if (restoreFree) { restoreFree(); restoreFree = null; } }; } // A "place" section has no heading to redraw between, so it is found in the DOM by what // it renders as and replaced there. if (s.place) { var restoreLoose = replaceLoosePlaceInPlace($h3, effective, loosePlacePreviewWikitext(effective, content, language)); return function () { if (restoreLoose) { restoreLoose(); restoreLoose = null; } }; } if (!s.existing) { var $preview = buildSubsectionPreviewDom($h3, s, content, language); return function () { $preview.remove(); }; } var restore = replaceSubsectionInPlace($h3, effective.header, subsectionBodyWikitext(language, effective, content)); return function () { if (restore) { restore(); restore = null; } }; }, { key: s.free ? "section:" + s.header + "|" + s.free.ordinal : "subsection:" + sectionType + "|" + sectionOrdinal + "|" + s.header } ); }); $panel.empty().append($selectWrap, $nameWrap, $fieldWrap, $actions); } // Builds the "choose a part of speech" picker that reclassifies a section -- an unclassified // "=== Mane ===" placeholder, or a "=== Biwêj ===" that turns out to be a real part of speech. Saved via // convertSectionToPos(); lists every name from sectionNames except the one the section already is. function buildConvertPosPanel($panel, $h3, language, sectionType, sectionOrdinal) { var $select = $("<select class='dsb-convert-pos-select'></select>"); // Label-less, like the subsection picker's: it holds the "nothing chosen yet" value without showing // up as a row, so the prompt lives in the input's placeholder instead. $select.append($("<option value=''></option>")); Object.keys(sectionNames).forEach(function (name) { // The section's own part of speech is listed too, marked: picking it changes nothing about the // heading and leaves the parameters below to be edited on their own. $select.append($("<option></option>").val(name) .text(name === sectionType ? name + " (ya niha)" : name)); }); var $selectWrap = makeSearchable($select, "Li cureyekî rêzimanî bigere"); // Opens on the section's own part of speech, so editing only its parameters needs no pick. if (sectionNames[sectionType]) { $select.val(sectionType).trigger("wiktku:refresh"); } // The same card the entry wizard shows under its part-of-speech question -- gender, transitivity, // the transliteration boxes and everything behind "Tercîhên pêşketî". Shared from // wikt.edit/posparams.js, so reclassifying a section here offers exactly what creating one in the // wizard does. var card = posparams.build({ lang: language, pos: "" }); // Opened on the call the section already has, so this edits the current template rather than // starting from a blank line. setContext() rebuilds the line whenever the part of speech moves, // so the prefill is only the starting point. var spec0 = posTemplateFor(sectionType); card.setContext(language, spec0 ? spec0.name : "", /^Formeke /.test(sectionType)); fetchPageContent().then(function (pageContent) { try { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); var found = findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType); if (found.index !== -1 && ($select.val() || sectionType) === sectionType) { card.setWikitext(found.text); } } catch (e) { /* an unreadable section just leaves the card as it was */ } }); $select.on("change", function () { var spec = posTemplateFor($select.val()); card.setContext(language, spec ? spec.name : "", /^Formeke /.test($select.val() || "")); }); // "gh" on its own, or "<form>-<base>" once a structural form is picked -- start.js's own composition. // convertSectionToPos() writes the template itself, so only what follows "{{pos|lang" is wanted // from the card's line. function posParams() { var m = /^\{\{[^|}]*\|[^|}]*\|?([\s\S]*)\}\}$/.exec(card.wikitext()); return m ? m[1] : ""; } var $save = $("<button type='button' class='dsb-save'></button>").text(util.msg.add); var $cancel = $("<button type='button' class='dsb-cancel'></button>").text(util.msg.cancel); var $status = $("<span class='dsb-status'></span>"); var $actions = $("<div class='dsb-form-actions'></div>").append($save, $cancel, $status); // dsb.js owns the pencil and the panel's built state, so it does the closing. $cancel.on("click", function () { $panel.trigger("dsbCancel"); hideQueueIfIdle(); }); $save.on("click", function () { var chosen = $select.val(); if (!chosen) { $status.removeClass("dsb-status-ok").addClass("dsb-status-error").text("Pêşî cureyekî rêzimanî hilbijêre."); return; } var params = posParams(); $save.prop("disabled", true); $status.removeClass("dsb-status-error").text(""); queueChange( langLabel(language), "beşa «" + sectionLabel(sectionType, $h3) + "» bû «" + chosen + "»", function (pageContent) { return { content: convertSectionToPos(pageContent, language, sectionType, sectionOrdinal, chosen, params), warnings: [] }; }, $save, $status, function () { // The heading keeps its text, which every other queued change finds the section by; a // note under it names the new one. The headword line is drawn as the save will write it. var $note = $("<div class='dsb-preview-inline dsb-preview-heading-note'></div>") .text("→ " + chosen + (params ? " (" + params + ")" : "") + " — nû, hîn nehatiye qeydkirin"); headingOuter($h3).after($note); var dropped = false; var restoreHeadword = null; fetchPageContent().then(function (pageContent) { if (dropped) { return; } var call; try { var loc = locateSection(pageContent, language, sectionType, sectionOrdinal); call = posCallLine(findPosTemplateLine(loc.lines, loc.posLineIndex, sectionType), language, chosen, params); } catch (e) { return; } restoreHeadword = replaceHeadwordInPlace($h3, call); }); return function () { dropped = true; $note.remove(); if (restoreHeadword) { restoreHeadword(); restoreHeadword = null; } }; }, // Runs after every other queued change: it renames the "Mane" heading those changes locate // themselves by, so anything edited on this section has to be applied first. { runLast: true, key: "convert:" + sectionType + "|" + sectionOrdinal, pagePosition: headingPosition($h3) } ); }); $panel.empty().append($selectWrap, card.$element, $actions); } // Attaches the "+ Beşek lê zêde bike" trigger right after a POS block's own last element. // Puts the same pencil the definitions use on every existing "====" subsection heading the gadget knows how // to edit, opening buildSubsectionPanel() pinned to that one subsection. module.exports = { buildAdvancedPanel: buildAdvancedPanel, buildSubsectionPanel: buildSubsectionPanel, buildConvertPosPanel: buildConvertPosPanel, editExample: editExample, clearQueue: clearQueue, closeAllPanels: closeAllPanels, openQueueBox: openQueueBox }; }()); // </nowiki> fynxq22uwjg4hvllodyqzzjbn8dxcd1 MediaWiki:Gadget-wikt.dsb-panels.css 8 1359174 6533075 6426124 2026-09-19T10:15:16Z Wikihez 7344 DefSideBoxes: numbered sense-group headings, subsection rename and removal, bottom-up conversions, bracketed examples, and the add-subsection form fix 6533075 css text/css /* <nowiki> */ /* * Page: [[MediaWiki:Gadget-wikt.dsb-panels.css]] */ /* ── Searchable select ─────────────────────────────────────────────── The native <select> is hidden inside the wrapper and still holds the value; the input filters the list. */ .dsb-ac-wrap { position: relative; display: block; } .dsb-ac-input { width: 100%; box-sizing: border-box; } .dsb-ac-results { position: absolute; z-index: 30; top: 100%; left: 0; right: 0; max-height: 260px; margin: 2px 0 0; padding: 4px; overflow-y: auto; list-style: none; font-family: var(--wikt-sans); font-size: 13px; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); box-shadow: 0 6px 18px rgba(0, 0, 0, 0.12); } .dsb-ac-results li { padding: 6px 8px; border-radius: 6px; cursor: pointer; } .dsb-ac-results li:hover, .dsb-ac-results li.dsb-ac-active { background: var(--wikt-accent-tint); } /* ── Etîmolojî editing surface ─────────────────────────────────────── A contenteditable line of wikitext: text is typed straight into it, template calls sit in it as chips. */ .dsb-tpl-surface { min-height: 72px; margin-top: 6px; padding: 8px 10px; font-family: var(--wikt-sans); font-size: 14px; line-height: 1.6; color: var(--wikt-ink); white-space: pre-wrap; word-wrap: break-word; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); } .dsb-tpl-surface:focus { outline: none; border-color: var(--wikt-accent); box-shadow: 0 0 0 2px var(--wikt-accent-tint); } /* The chips: visibly not prose, and atomic to the caret. */ /* Takes the call off the line without going through the parameter dialog -- on a phone there is no reliable backspace onto a contenteditable="false" chip. */ .dsb-tpl-chip-remove { position: relative; margin-left: 5px; padding: 0 2px; font-family: var(--wikt-sans); font-size: 13px; line-height: 1; color: var(--wikt-accent-deep); opacity: 0.6; cursor: pointer; } .dsb-tpl-chip-remove:hover { color: var(--wikt-danger); opacity: 1; } /* The glyph stays small; the tap target grows invisibly around it. */ @media (max-width: 720px), (pointer: coarse) { .dsb-tpl-chip-remove { opacity: 1; } .dsb-tpl-chip-remove::after { content: ""; position: absolute; inset: -10px -8px; } } .dsb-tpl-chip { display: inline-block; margin: 0 1px; padding: 1px 6px; font-family: var(--wikt-mono); font-size: 12.5px; color: var(--wikt-accent-deep); max-width: 100%; white-space: normal; overflow-wrap: anywhere; vertical-align: baseline; background: var(--wikt-accent-tint); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); touch-action: manipulation; cursor: pointer; user-select: none; } .dsb-tpl-chip:hover, .dsb-tpl-chip:focus { background: var(--wikt-field-bg); border-color: var(--wikt-accent); outline: none; } /* ── Template parameter form ───────────────────────────────────────── .dsb-tpl-name/-desc/-param-row/-help/-undocumented/-modifier-list and the deprecated-label override now live in cite.css (wikt.cite's own stylesheet): buildTemplateParamForm() moved there so start.js's own Etîmolojî/Çavkanî pickers can open the same dialog. */ /* One-line variant: label beside its box rather than above it, for a single field whose name would otherwise read as a heading for everything below it (the word groups' "Sernav"). */ .dsb-param-row-inline > .dsb-adv-label { display: flex; gap: 8px; align-items: center; } /* Sernav is optional and names the group; the word boxes under it are what the form is actually for. Letting it stretch to the full row made the one thing you may leave blank the widest box on the card, so it takes only the space its own content needs. */ .dsb-param-row-inline .dsb-input { flex: 0 1 auto; width: 12em; max-width: 40%; /* .dsb-input's own 16em floor would win over the width above and make this the widest box on the card, which is the opposite of the point. */ min-width: 0; max-width: 100%; min-width: 0; } .dsb-gloss-raw { font-size: 12px; } /* Disclosure arrow on "Hevmane û Bêhtir", flipped when the menu is open. */ .dsb-more-arrow { font-size: 10px; vertical-align: 1px; } /* The POS panel's follow-up questions (cinsiyet / lektur): label above its select, like the field boxes. */ .dsb-pos-param-row { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; } /* ── "Guhartina pêşketî" (advanced editing) panel ────────────────────── Revealed by the pencil toggle above: every per-sense action this gadget offers, queued together with one "Lê zêde bike". A plain inline row, not a bordered/background card. */ .dsb-quick-row { display: flex; flex-direction: column; align-items: stretch; gap: 4px; box-sizing: border-box; max-width: 520px; margin: 4px 0 0 16px; font-family: var(--wikt-sans); font-size: 12px; color: var(--wikt-ink-2); } .dsb-quick-link { align-self: flex-start; margin-bottom: 10px; font-size: 12px; color: var(--wikt-accent); text-decoration: none; white-space: nowrap; cursor: pointer; } /* The links under a word list ("+ Komek lê zêde bike", "Wekî wîkîtext biguhêre") sit in the field wrap rather than in a flex column, so they need their own spacing or they run together. */ .dsb-subsection-field > .dsb-quick-link { display: inline-block; margin-right: 14px; } .dsb-quick-link:hover, .dsb-quick-link:focus { color: var(--wikt-accent-deep); text-decoration: underline; } /* The picker row: gloss + the two primary word groups as direct "+ <field>" links, plus a "Hevmane û Bêhtir" toggle for the rest -- clicking a link opens its box above the buttons and hides the link; .dsb-box-remove un-hides it. position: relative anchors .dsb-more-menu's overlay below (see there). */ .dsb-field-picker { position: relative; display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 14px; } .dsb-field-picker .dsb-quick-link { margin-bottom: 0; } /* Under the buttons once a box is open: a little space so the links do not read as part of the buttons. */ .dsb-open-boxes:not(:empty) ~ .dsb-field-picker { margin-top: 8px; } /* The "Hevmane û Bêhtir" dropdown: every non-primary field link (plus Nimûne/jêgirtin, which sits first) stacked as a plain vertical list. Floats over the page as an overlay (positioned against .dsb-field-picker) instead of pushing $openBoxes/the rest of the definition down when it opens. */ .dsb-more-menu { position: absolute; top: 100%; left: 0; z-index: 10; display: flex; flex-direction: column; align-items: flex-start; width: max-content; max-width: min(320px, calc(100vw - 40px)); gap: 6px; margin: 2px 0 0 4px; padding: 8px 12px; background: var(--wikt-card); border: 1px solid var(--wikt-rule); border-radius: var(--wikt-r-field); box-shadow: 0 2px 6px rgba(0, 0, 0, 0.06); } .dsb-more-menu .dsb-quick-link { margin-bottom: 0; } /* Boxes the user has actually opened, stacked in the order they were added -- several can be open at once. */ .dsb-open-boxes { display: flex; flex-direction: column; } /* Nothing open: take it out of the flow so the links do not sit above an empty gap. */ .dsb-open-boxes:empty { display: none; } /* One field (its label + input) within the panel -- always a currently-open, removable box. */ .dsb-adv-group { position: relative; margin-bottom: 14px; padding-right: 20px; } .dsb-adv-label { margin-bottom: 4px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } /* The example sentence beside a word list's name: same text the wizard shows, so it reads as the quieter half of the label rather than a second heading. */ .dsb-adv-hint { margin-left: 6px; font-weight: 400; font-style: italic; color: var(--wikt-muted); } /* The shared image rows (util.js's buildImageListField): one label + box per line, like the parameter rows above them. Three identical boxes twice over is unreadable without a break between them, so each image is its own block with its own name. */ .dsb-resim-list { margin: 0; padding-left: 0; } .dsb-resim-item { list-style: none; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--wikt-rule-soft); } .dsb-resim-item:first-child { margin-top: 0; padding-top: 0; border-top: 0; } .dsb-resim-index { margin-bottom: 6px; font-size: 12px; font-weight: 600; color: var(--wikt-ink-3); } .dsb-box-remove { position: absolute; top: 0; right: 0; color: var(--wikt-ink-3); text-decoration: none; font-size: 14px; line-height: 1; cursor: pointer; } .dsb-box-remove:hover, .dsb-box-remove:focus { color: var(--wikt-accent-deep); } .dsb-form-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; } .dsb-input { box-sizing: border-box; min-width: 16em; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } /* The native corner is replaced by util.js's grip (see wikt-edit.css), which drags vertically only and remembers the height. */ .dsb-subsection-panel textarea.dsb-input, .dsb-adv-group textarea.dsb-input { resize: none; } .dsb-input::placeholder { color: var(--wikt-placeholder); opacity: 1; } .dsb-input:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } /* ── Plain tag field (Etîket, Kategorî) ──────────────────────────────── Plain type-and-commit tags with no suggestion panel; unlike Hevmane/Dijmane/etc., these carry no modifiers. */ .dsb-tagfield { box-sizing: border-box; display: inline-flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 16em; padding: 4px 6px; background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); transition: border-color 0.12s ease, box-shadow 0.12s ease; } .dsb-tagfield:focus-within { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); } .dsb-tag { display: inline-flex; align-items: center; gap: 6px; background: var(--wikt-accent-tint); color: var(--wikt-accent-deep); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); font-size: 12px; padding: 3px 6px 3px 10px; } .dsb-tag-remove { border: 0; background: transparent; color: var(--wikt-muted); font-size: 13px; line-height: 1; cursor: pointer; padding: 0 2px; } .dsb-tag-remove:hover { color: var(--wikt-danger); } .dsb-tagfield .dsb-input { flex: 1 1 8em; min-width: 8em; border: 0; padding: 3px 2px; background: transparent; box-shadow: none; } .dsb-tagfield .dsb-input:focus { box-shadow: none; } .dsb-save, .dsb-cancel, .dsb-delete, .dsb-autolink { font-family: var(--wikt-sans); font-size: 13px; font-weight: 500; padding: 6px 14px; border-radius: var(--wikt-r-pill); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } /* One filled pill per row — the same rule the form's footer follows. */ .dsb-save { background: var(--wikt-accent); border: 1px solid var(--wikt-accent); color: #fff; } .dsb-save:hover { background: var(--wikt-accent-deep); border-color: var(--wikt-accent-deep); } .dsb-save:disabled { opacity: 0.55; cursor: progress; } .dsb-cancel { background: transparent; border: 1px solid transparent; color: var(--wikt-ink-3); } .dsb-cancel:hover { border-color: var(--wikt-field-edge); color: var(--wikt-ink); } /* Removing a heading: plain like Betal bike, in the danger colour, pushed to the far end of the row. */ .dsb-delete { margin-left: auto; background: transparent; border: 1px solid transparent; color: var(--wikt-danger); } .dsb-delete:hover { border-color: var(--wikt-danger); } /* The heading's name, above the section's own box. */ .dsb-heading-name-wrap { margin-bottom: 10px; } /* A heading queued for removal, with everything it owns, until the queue is saved or the change dropped. */ .dsb-preview-removed { opacity: 0.5; text-decoration: line-through; text-decoration-color: var(--wikt-danger); } /* An outline pill, distinct from both the filled .dsb-save and the plain-text .dsb-cancel -- a secondary utility action, not the primary save nor a dismissal. */ .dsb-autolink { background: transparent; border: 1px solid var(--wikt-accent-edge); color: var(--wikt-accent); } .dsb-autolink:hover { border-color: var(--wikt-accent); color: var(--wikt-accent-deep); } .dsb-autolink:disabled { opacity: 0.55; cursor: progress; } /* Status line. Color comes from .dsb-status-ok/.dsb-status-error (added by the .js on success/failure) rather than an inline style, so these tokens (and dark mode) apply. */ .dsb-status { font-family: var(--wikt-sans); font-size: 12.5px; color: var(--wikt-muted); } .dsb-status-ok { color: var(--wikt-ok); } .dsb-status-error { color: var(--wikt-danger); } /* ── "+ Beşek lê zêde bike" ────────────────────────────────────────── An accent-coloured action link, like the form's .wiktku-adv-toggle: it opens something, so it is not muted grey. */ /* iOS Safari zooms the page in whenever a field it focuses has text under 16px, and everything here is 12-13px for density. On touch the form controls go up to the size that stops it; the pointer query leaves the desktop layout alone. */ @media (pointer: coarse) { .dsb-input, .dsb-tag-input, .dsb-subsection-select, .dsb-convert-pos-select { font-size: 16px; } /* Full width, whatever the viewport reports: a phone asked to render the desktop site says ~980px and would otherwise leave these at their desktop size. */ .dsb-subsection-panel .dsb-input, .dsb-subsection-panel .dsb-subsection-select, .dsb-convert-pos-panel .dsb-convert-pos-select { width: 100%; max-width: 100%; } /* Sernav is the exception: it names the group, so it stays visibly smaller than the boxes it heads. The cap matters more than the em width -- at 16px, 12em came out the same size as a word box. */ .dsb-subsection-panel .dsb-param-row-inline .dsb-input { width: 8em; max-width: 40%; } } /* The image rows reuse the inline row, but nothing here is optional the way a group's "Sernav" is: a file name and a caption want the whole row. */ .dsb-resim-list .dsb-param-row-inline > .dsb-adv-label, .dsb-resim-list .dsb-tpl-param-row > label { display: flex; gap: 8px; align-items: center; } .dsb-resim-list .dsb-param-row-inline .dsb-input, .dsb-resim-list .dsb-tpl-param-row .dsb-input { flex: 1 1 auto; width: auto; max-width: 100%; } /* ── Subsection panel ──────────────────────────────────────────────── A sunken card rather than a grey utility box; fields stack so the picker and its input are not competing for one narrow row. */ .dsb-subsection-select, .dsb-convert-pos-select { box-sizing: border-box; width: 100%; max-width: 100%; padding: 6px 10px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink); background: var(--wikt-field-bg); border: 1px solid var(--wikt-field-edge); border-radius: var(--wikt-r-field); } .dsb-subsection-select:focus, .dsb-convert-pos-select:focus { border-color: var(--wikt-accent); box-shadow: 0 0 0 3px var(--wikt-accent-tint); outline: 0; } /* The template-insert picker sits above the Çavkanî textarea, not in place of it -- a little breathing room so the two don't read as one control. */ .dsb-cavkani-picker { margin-bottom: 6px; } .dsb-subsection-field { min-width: 0; } .dsb-subsection-words, .dsb-subsection-text { box-sizing: border-box; width: 100%; min-width: 0; } .dsb-subsection-text { line-height: 1.6; resize: vertical; } /* ── Gloss field inside the advanced-editing panel ──────────────────── Same shape as .dsb-subsection-text. */ .dsb-edit-gloss { width: 100%; line-height: 1.6; resize: vertical; } /* ── Live "not saved yet" previews ───────────────────────────────────── Dropped into the rendered page at the change's own spot. Dashed edge + a small badge mark them as pending, not real content; they disappear on "Betal bike" or once the real save lands. */ .dsb-preview-block, .dsb-preview-inline { margin: 8px 0; padding: 8px 12px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink-2); background: var(--wikt-accent-tint); border: 1px dashed var(--wikt-accent-edge); border-radius: var(--wikt-r-field); } .dsb-preview-inline { margin-left: 26px; max-width: 520px; } .dsb-preview-heading { margin: 0 0 4px; font-size: 15px; font-weight: 600; color: var(--wikt-ink); } .dsb-preview-badge { display: inline-block; margin-bottom: 6px; padding: 1px 8px; font-size: 11px; font-weight: 500; color: var(--wikt-accent-deep); background: var(--wikt-card); border: 1px solid var(--wikt-accent-edge); border-radius: var(--wikt-r-pill); } /* Parser output goes in here, so it drops the panel's own font and colour and takes the page's \u2014 the point of the box is that what is inside it looks exactly like what will be saved. */ .dsb-preview-rendered, .dsb-preview-rendered-inline { font-family: inherit; font-size: 14px; color: var(--wikt-ink); } .dsb-preview-rendered-inline { display: inline; } .dsb-preview-rendered-inline .mw-parser-output, .dsb-preview-rendered-inline .mw-parser-output > p { display: inline; } .dsb-preview-list, .dsb-preview-text { margin: 0; padding-left: 18px; } .dsb-preview-text { padding-left: 0; } /* ── Floating save-queue widget ───────────────────────────────────── This gadget's own small floating box. One "Lê zêde bike" click anywhere on the page adds a line here; "Guhertinan qeyd bike" makes the one real save; "Betal bike" drops everything queued without touching the page. */ .dsb-queue-box { position: fixed; top: 60px; right: 16px; z-index: 1000; box-sizing: border-box; width: 280px; max-width: calc(100vw - 32px); max-height: calc(100vh - 90px); overflow-y: auto; padding: 12px 14px; font-family: var(--wikt-sans); font-size: 13px; color: var(--wikt-ink-2); background: var(--wikt-card); border: 1px solid var(--wikt-accent); border-radius: var(--wikt-r-card); box-shadow: 0 4px 18px rgba(0, 0, 0, 0.16); } /* An OOUI dialog sits low in the page's stacking order (z-index 4), so no z-index here can go under it without dropping behind the article as well. While one is open -- on a phone it fills the screen -- the box is taken off instead; wikt.cite puts the class on while its dialogs are showing. */ body.wikt-dialog-open .dsb-queue-box { display: none; } .dsb-queue-title { margin-right: 20px; font-size: 13px; font-weight: 600; color: var(--wikt-ink); } .dsb-queue-close { float: right; color: var(--wikt-ink-3); text-decoration: none; font-size: 14px; line-height: 1; cursor: pointer; } .dsb-queue-close:hover, .dsb-queue-close:focus { color: var(--wikt-accent-deep); } /* Stands in for the list before anything is queued, saying what the save button is for. */ .dsb-queue-empty { margin: 8px 0; font-size: 12px; line-height: 1.5; color: var(--wikt-ink-3); } .dsb-queue-list { margin: 8px 0; padding-left: 18px; max-height: 160px; overflow-y: auto; } .dsb-queue-list li { margin-bottom: 4px; } /* Drops one queued change. Dim until its line is hovered, so the list stays a list and not a row of buttons. */ .dsb-queue-drop { margin-left: 6px; padding: 0 3px; border: 0; background: transparent; color: var(--wikt-muted); font-size: 13px; line-height: 1; cursor: pointer; opacity: 0; transition: opacity 0.12s ease, color 0.12s ease; } .dsb-queue-list li:hover .dsb-queue-drop, .dsb-queue-drop:focus { opacity: 1; } .dsb-queue-drop:hover { color: var(--wikt-danger); opacity: 1; } /* No hover on touch, so the button is simply there. */ @media (hover: none), (pointer: coarse) { .dsb-queue-drop { opacity: 1; } } .dsb-queue-actions { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 4px; } .dsb-queue-save, .dsb-queue-cancel { font-family: var(--wikt-sans); font-size: 13px; font-weight: 500; padding: 6px 14px; border-radius: var(--wikt-r-pill); cursor: pointer; transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease; } .dsb-queue-save { background: var(--wikt-accent); border: 1px solid var(--wikt-accent); color: #fff; } .dsb-queue-save:hover { background: var(--wikt-accent-deep); border-color: var(--wikt-accent-deep); } .dsb-queue-save:disabled { opacity: 0.55; cursor: progress; } .dsb-queue-cancel { background: transparent; border: 1px solid var(--wikt-field-edge); color: var(--wikt-ink-3); } .dsb-queue-cancel:hover { border-color: var(--wikt-ink-3); color: var(--wikt-ink); } .dsb-queue-status { margin-top: 6px; font-size: 12.5px; color: var(--wikt-muted); } .dsb-queue-status.dsb-status-ok { color: var(--wikt-ok); } .dsb-queue-status.dsb-status-error { color: var(--wikt-danger); } /* ── Minerva (mobile) ──────────────────────────────────────────────── Narrower viewport: keep the panel on screen and give every tap target the form's 44px minimum. */ @media (max-width: 720px), (pointer: coarse) { .dsb-quick-row { font-size: 13px; margin-left: 20px; } .dsb-input, .dsb-subsection-select, .dsb-convert-pos-select { min-height: 40px; /* >=16px stops iOS Safari zooming the page on focus. */ font-size: 16px; } .dsb-tagfield .dsb-input { min-height: 32px; } .dsb-tag-remove { padding: 0 6px; } .dsb-save, .dsb-cancel, .dsb-autolink, .dsb-queue-save, .dsb-queue-cancel { min-height: 40px; padding: 8px 16px; } .dsb-queue-box { top: auto; bottom: 8px; right: 8px; left: 8px; width: auto; } } /* ── Dark mode ─────────────────────────────────────────────────────── Same warm dark palette and same explicit-signal-only rule as the form's stylesheet: no bare prefers-color-scheme fallback, since legacy Vector sets no theme class and would go dark on its own. */ html.skin-theme-clientpref-night .dsb-save, html.skin-nightmode .dsb-save, html.skin-theme-clientpref-night .dsb-queue-save, html.skin-nightmode .dsb-queue-save { color: #14213a; } @media screen and (prefers-color-scheme: dark) { html.skin-theme-clientpref-os .dsb-save, html.skin-theme-clientpref-os .dsb-queue-save { color: #14213a; } } /* Rules the menu's three sections apart (see MENU_GROUPS). */ .dsb-more-menu .dsb-menu-group-start { margin-top: 7px; padding-top: 7px; border-top: 1px solid var(--wikt-rule-soft); } /* Deleting a sense is destructive, so it reads in the danger colour -- but it shares the last section with "Maneyeke din zêde bike" (both act on the sense itself), so it carries no rule of its own. */ .dsb-more-menu .dsb-field-delete { color: var(--wikt-danger); } .dsb-more-menu .dsb-field-delete:hover, .dsb-more-menu .dsb-field-delete:focus { color: var(--wikt-danger); text-decoration: underline; } /* A sense queued for deletion, struck through until the queue is saved or the change dropped. */ li.dsb-sense-doomed { text-decoration: line-through; text-decoration-color: var(--wikt-danger); } li.dsb-sense-doomed .dsb-quick-row { text-decoration: none; } /* Queue confirmation for row actions that have no field box of their own. */ .dsb-quick-note { display: block; margin-top: 6px; } /* Dropped by anything that cannot live in a 520px column: a long etymology, and a word list wide enough to have gone to two columns. */ .dsb-subsection-panel.dsb-panel-wide { max-width: none; } /* Word-list groups: one "{{kol3}}" per block, told apart only when there is more than one. */ .dsb-wordgroups-many .dsb-wordgroup { padding-top: 10px; border-top: 1px solid var(--wikt-rule-soft); } .dsb-wordgroups-many .dsb-wordgroup:first-child { padding-top: 0; border-top: 0; } .dsb-group-remove { color: var(--wikt-danger); } /* A sernav-headed group inside an unsaved-section preview. */ .dsb-preview-subheading { margin-top: 6px; font-weight: 600; } /* ── Werger box form ── The {{werger-ser}} parameters. Reuses .dsb-input / .dsb-adv-label from the other panels; only the note and the disclosure body need anything of their own. */ .dsb-werger-note { margin: 0 0 10px; color: var(--wikt-muted); font-size: 12px; line-height: 1.5; } .dsb-werger-main { display: flex; flex-direction: column; gap: 10px; } /* The box is nested inside its label, so it is made a block to sit under the label text instead of beside it -- inline, a short label like "id" ends up behind its own box. */ .dsb-werger-row .dsb-adv-label { display: block; margin-bottom: 0; } .dsb-werger-row .dsb-input { display: block; width: 100%; margin-top: 4px; } /* ── Îzaha maneyî ── Opens under the Mane box; the two are one gloss, so it sits tight against it. */ .dsb-izah-wrap { margin-top: 6px; } .dsb-izah-wrap .dsb-adv-label { display: block; } .dsb-izah-wrap .dsb-input { display: block; width: 100%; margin-top: 4px; } /* A sense redrawn from the change that is queued for it, or a whole new sense waiting in the list's own numbering. No badge and no frame: the point is that it reads the way it will read once saved. The tint is the only sign, and the queue box is what actually says nothing is published yet. */ .dsb-sense-preview { background: var(--wikt-accent-tint); box-shadow: -3px 0 0 var(--wikt-accent-edge); } /* Kept in the tree so another gadget's form still has somewhere to open, but out of sight while the preview above draws the same content. */ .dsb-preview-hidden { display: none !important; } li.dsb-sense-preview { display: list-item; padding-left: 4px; } /* </nowiki> */ g70qepztny4ega5cqy8kvkuiulpq7ou Modul:etymon/ceribandin 828 1359184 6532033 6531678 2026-09-18T16:07:22Z Wikihez 7344 sync test copy 6532033 Scribunto text/plain --[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Authors: - Original implementation: [[User:Ioaxxere]] - Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]]) Modules: - [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping - [[Module:etymon/data]]: keyword definitions, configuration, and status constants - [[Module:etymon/tree]]: etymology tree rendering - [[Module:etymon/text]]: etymology text generation - [[Module:etymon/categories]]: category generation logic - [[Module:etymon/tracking]]: tracking ]=] local export = {} local __state = { cached_etymon_args = {}, cached_etymon_pages = {}, cached_descendants_checks = {}, senseid_parent_etymon = {}, available_etymon_ids = {}, single_etymons = {}, entry_title = nil, entry_lang_code = nil, current_page_has_inline_etymology = false, current_page_has_redundant_etymology = false, used_idless_etymon = false, toplevel_has_inline_etymology = false, toplevel_redundant_etymology = false, toplevel_idless_etymon = false, has_mismatched_id = false, linked_page_multiple_etymons_idless = false, linked_page_partial_etymology_sections = false, partial_etymology_targets = {}, skip_partial_etymology_category = false, max_depth_reached = 0, total_nodes = 0, language_count = {}, toplevel_keyword_stats = {}, id_stats = nil, warnings = {}, } local function reset_invocation_state() __state.current_page_has_inline_etymology = false __state.current_page_has_redundant_etymology = false __state.used_idless_etymon = false __state.toplevel_has_inline_etymology = false __state.toplevel_redundant_etymology = false __state.toplevel_idless_etymon = false __state.has_mismatched_id = false __state.linked_page_multiple_etymons_idless = false __state.linked_page_partial_etymology_sections = false __state.max_depth_reached = 0 __state.total_nodes = 0 __state.language_count = {} __state.toplevel_keyword_stats = {} __state.warnings = {} end local M = require("Module:module loader").init({ require = { data = "Module:etymon/data/ceribandin", tree = "Module:etymon/tree/ceribandin", text = "Module:etymon/text/ceribandin", categories = "Module:etymon/categories/ceribandin", tracking = "Module:etymon/tracking", descendants = "Module:etymon/descendants/ceribandin", anchors = "Module:anchors", etydate = "Module:etydate", etymology = "Module:etymology", families = "Module:families", languages = "Module:languages", languages_errorgetby = "Module:languages/errorGetBy", links = "Module:links", pages = "Module:pages", parameters = "Module:parameters", string_utilities = "Module:string utilities", template_parser = "Module:template parser", utilities = "Module:utilities", debug = "Module:debug", en_utilities = "Module:en-utilities", parse_utilities = "Module:parse utilities", references = "Module:references", template_styles = "Module:TemplateStyles", script_utilities = "Module:script utilities", JSON = "Module:JSON", yesno = "Module:yesno", }, loadData = { headword_data = "Module:headword/data", parameters_data = "Module:parameters/data/ceribandin", text_allowed = "Module:etymon/data/text_allowed", }, }) -- Template names that carry etymon data, and the heading that opens an etymology section. -- Pages are scraped for these, so both must match what ku.wiktionary actually uses: -- the section is "Etîmolojî", and the new template is "etîmon". -- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which -- this module would misparse into garbage node labels. Add "etymon" here only once -- Şablon:etymon itself invokes this module. local ETYMON_TEMPLATES = { ["etîmon"] = true, ["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out -- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax: -- this module would read those calls and parse the bare keyword ("inh") as a term. } local ETYMOLOGY_HEADING = "^Etîmolojî" -- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses -- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the -- leading "*" that Modul:links requires for reconstructed languages. local RECONSTRUCTION_NS_NAME = "Jinûvesazî" local RECONSTRUCTION_NS_ID = 108 local Util = {} function Util.format_error(message, preview_only) if preview_only and not M.pages.is_preview() then return nil end return '<span class="error">' .. message .. '</span>' end function Util.add_warning(message, preview_only) local formatted = Util.format_error(message, preview_only) if formatted then table.insert(__state.warnings, formatted) end end function Util.is_text_param_allowed_for_lang(lang) if not lang or type(lang) ~= "table" then return false end local types = lang.getTypes and lang:getTypes() if types and types.family then local code = lang.getCode and lang:getCode() return code and M.text_allowed.families[code] == true end local full_code = lang.getFullCode and lang:getFullCode() if full_code and M.text_allowed.langs[full_code] then return true end if lang.inFamily then for family_code in pairs(M.text_allowed.families) do if lang:inFamily(family_code) then return true end end end return false end function Util.get_lang(code, no_error) if no_error then return M.languages.getByCode(code, nil, true) end return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true) end -- Match a term language against a text=:lang stop target (supports etymology-only codes). function Util.lang_matches_stop_code(term_lang, stop_code) if not term_lang or not stop_code or stop_code == "" then return false end local stop_lang = Util.get_lang(stop_code, true) if not stop_lang then return false end if term_lang:getCode() == stop_lang:getCode() then return true end if stop_lang:getFullCode() == stop_lang:getCode() then return term_lang:getFullCode() == stop_lang:getCode() end return false end function Util.get_family(code) return M.families.getByCode(code) end function Util.get_lang_exception(lang) -- Families have no language-specific exceptions if lang.getTypes and lang:getTypes().family then return nil end local code = lang:getCode() local lang_exceptions = M.data.config.lang_exceptions if lang_exceptions[code] then return lang_exceptions[code] end for norm_code, exc in pairs(lang_exceptions) do if exc.normalize_to and code == exc.normalize_to then return exc end if exc.normalize_from_families then local should_normalize = false for _, family in ipairs(exc.normalize_from_families) do if lang:inFamily(family) then should_normalize = true break end end if should_normalize and exc.normalize_exclude_families then for _, family in ipairs(exc.normalize_exclude_families) do if lang:inFamily(family) then should_normalize = false break end end end if should_normalize then local ret = {} for k, v in pairs(exc) do ret[k] = v end ret.suppress_tr = nil return ret end end end return nil end function Util.get_norm_lang(lang) local exc = Util.get_lang_exception(lang) if exc and exc.normalize_to then return M.languages.getByCode(exc.normalize_to) end return lang end function Util.resolve_context_lang(lang, node_args) if type(node_args) ~= "table" then return lang end if node_args.status == M.data.STATUS.INLINE then return lang end if not (lang.hasType and lang:hasType("etymology-only")) then return lang end local full = lang.getFull and lang:getFull() if not full or full:getCode() == lang:getCode() then return lang end if full.hasAncestor and full:hasAncestor(lang) then return lang end return full end -- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>) -- This is needed because Module:parse utilities expects boolean modifiers to have explicit values function Util.add_boolean_defaults(str, param_mods) local result = str for name, spec in pairs(param_mods) do if spec.type == "boolean" then -- Replace <name> with <name:1> (but not <name:...> which already has a value) result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>") end end return result end local REQUEST_TEMPLATE_PARAM_MODS = { rfe = { nocat = { type = "boolean" }, sort = {}, y = {}, m = {}, fragment = {}, section = {}, box = { type = "boolean" }, noes = { type = "boolean" }, }, etystub = { nocat = { type = "boolean" }, sort = {}, nocap = { type = "boolean" }, nodot = { type = "boolean" }, }, } function Util.expand_request_template(frame, template_name, param_value, lang_code) local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name] local with_defaults = Util.add_boolean_defaults(param_value, param_mods) local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, { param_mods = param_mods, generate_obj = function(text) if M.yesno(text, false) then return { is_boolean = true } end return { text = text } end, }) local template_args = { [1] = lang_code } for name in pairs(param_mods) do template_args[name] = parsed[name] end if not parsed.is_boolean then template_args[2] = parsed.text end return " " .. frame:expandTemplate({ title = template_name, args = template_args, }) end -- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of -- the module compares against. local POS_ALIASES = { ["reh"] = "root", ["kelîme"] = "word", ["pêşgir"] = "prefix", ["paşgir"] = "suffix", ["navgir"] = "interfix", } function Util.normalize_pos(value) if type(value) ~= "string" then return value end value = mw.text.trim(value) return POS_ALIASES[value] or value end -- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish -- name of `pos`) and the Kurdish values are resolved here. function Util.normalize_raw_etymon_args(args) if args.pos == nil and args.crz ~= nil then args.pos = args.crz end args.pos = Util.normalize_pos(args.pos) return args end -- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms function Util.format_term(term, is_toplevel, opts) opts = opts or {} -- suppress_term (-) returns nil if term.suppress_term then return nil end local lang = term.lang local exc = Util.get_lang_exception(lang) if is_toplevel then local display_text = term.alt or term.title or "" local sc = term.sc or lang:findBestScript(display_text) local bold_text = tostring(mw.html.create("strong") :addClass("selflink") :wikitext(display_text)) return M.script_utilities.tag_text(bold_text, lang, sc, "term") end local link_params = { lang = lang } link_params.term = not term.unknown_term and term.title or nil link_params.alt = term.alt link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil if not (exc and exc.suppress_tr) then link_params.tr = term.tr link_params.ts = term.ts else link_params.suppress_tr = true end link_params.lit = (opts.lit ~= "suppress") and term.lit or nil -- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a -- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a -- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>. local t = (term.t and term.t ~= "") and term.t or nil local id_gloss = (term.id and term.id ~= "") and term.id or nil local gloss = t or id_gloss -- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so -- the tree can put it on its own line. if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then link_params.gloss = gloss end if term.g and term.g ~= "" then local genders = M.string_utilities.split(term.g, ",") for i = 1, #genders do genders[i] = M.string_utilities.trim(genders[i]) end link_params.genders = genders end if opts.pos ~= "suppress" then link_params.pos = term.pos link_params.ng = term.ng end if exc and exc.suppress_tr then link_params.lit = nil end local show_qualifiers if opts.tree_ql ~= "suppress" then if term.q then link_params.q = term.q end if term.qq then link_params.qq = term.qq end if term.l then link_params.l = term.l end if term.ll then link_params.ll = term.ll end show_qualifiers = term.q or term.qq or term.l or term.ll end local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil) if opts.gloss == "separate" then return link, gloss end return link end local __is_content_page_cached function Util.is_content_page() if __is_content_page_cached == nil then __is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle()) end return __is_content_page_cached end local __page_data_cached function Util.get_page_data() if not __page_data_cached then __page_data_cached = M.headword_data.page end return __page_data_cached end -- Extract base keyword from param (without modifiers) local function get_keyword_base(param) if type(param) ~= "string" then return nil end local base = param:match("^:?([^<]+)") or param:gsub("^:", "") return base end local function is_keyword(param, allow_colon_less) if type(param) ~= "string" then return false end local keywords = M.data.keywords if param:sub(1, 1) == ":" then local base = get_keyword_base(param) return keywords[base] ~= nil end if allow_colon_less then local base = get_keyword_base(param) return keywords[base] ~= nil end return false end local function get_keyword(param, allow_colon_less) if type(param) ~= "string" then return nil end local keywords = M.data.keywords if param:sub(1, 1) == ":" then return get_keyword_base(param) end if allow_colon_less then local base = get_keyword_base(param) if keywords[base] then return base end end return nil end local function normalize_keyword(keyword) if keyword:sub(1, 1) == ":" then return keyword end return ":" .. keyword end -- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries local function get_canonical_keyword(keyword) if not keyword then return keyword end return M.data.keyword_canonical[keyword] or keyword end local function is_affix_group_keyword(keyword) local config = keyword and M.data.keywords[keyword] return config and config.affix_categories or false end local function reject_removed_surf_keyword(param) local base = get_keyword_base(param) if base == "surf" then error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).") end end local function copy_keyword_info(source) local copy = {} for k, v in pairs(source) do copy[k] = v end return copy end local function lowercase_glossary_display(text) return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function surf_should_keep_formation_phrase(base) if not base.phrase then return false end if base.glossary then return true end return not (base.phrase == "from" and (base.text == "From" or base.text == "from")) end -- Runtime overrides when <surf> is present on a keyword. local function get_effective_keyword_info(keyword, modifiers) local base = M.data.keywords[keyword] if not base or not modifiers or not modifiers.surf then return base end local effective = copy_keyword_info(base) local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]]," local surf_phrase = "by surface analysis," effective.new_sentence = true effective.invisible = "tree" if surf_should_keep_formation_phrase(base) then effective.phrase = surf_phrase .. " " .. base.phrase if base.text then effective.text = surf_text .. " " .. lowercase_glossary_display(base.text) else effective.text = surf_text .. " " .. base.phrase end else effective.text = surf_text effective.phrase = surf_phrase end return effective end -- Build text/phrase for nominalization with <g:code> (uses data module for codes only). local function get_nominalization_label_for_g(code) if not code or code == "" then return nil end local codes = M.data.nominalization_g_codes local adj = codes[code] if not adj and code:find("-", 1, true) then -- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the -- letters together ("mp"); build the label from the parts. Splitting two-letter codes the -- en.wikt way would mislabel ku codes that are not combinations at all, such as "np" -- (nepersonel). local parts, all_known = {}, true for part in code:gmatch("[^-]+") do local part_adj = codes[part] if part_adj then table.insert(parts, part_adj) else all_known = false end end if all_known and parts[1] then adj = table.concat(parts, " ") end end if not adj then return nil end local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of" local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false) return { text = text, phrase = phrase } end local EtymonParser = {} -- Keyword modifier definitions EtymonParser.keyword_param_mods = { unc = { type = "boolean" }, ref = {}, text = { restrict = { keywords = { "from", "derived" } } }, lit = { restrict = { affix_group = true } }, conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc. g = { restrict = { keywords = { "nominalization" } } }, surf = { type = "boolean" }, senseid = { restrict = { keywords = { "semantic loan" } } }, -- Kurdish names, resolved by resolve_modifier_aliases() below. maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } }, } -- Term modifier definitions EtymonParser.etymon_param_mods = { id = {}, t = {}, tr = {}, ts = {}, q = {}, qq = {}, l = {}, ll = {}, pos = {}, ng = {}, alt = {}, g = {}, ety = {}, lit = {}, unc = { type = "boolean" }, ref = {}, aftype = { restrict = { affix_group = true } }, postype = {}, bor = { type = "boolean", restrict = { affix_group = true } }, slbor = { type = "boolean", restrict = { affix_group = true } }, lbor = { type = "boolean", restrict = { affix_group = true } }, -- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below. -- cuda/t/w/crz are the names ku's own templates already accept; the affix-group -- borrowing flags reuse the Kurdish keyword names. cuda = { alias_of = "alt" }, -- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):", -- so a name containing "î" can never be recognised as a prefix. etimon = { alias_of = "ety" }, w = { alias_of = "t" }, crz = { alias_of = "pos" }, nediyar = { type = "boolean", alias_of = "unc" }, deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } }, deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } }, deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } }, } --[==[ Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever sees the canonical set. Called right after the inline modifiers are parsed. ]==] function EtymonParser.resolve_modifier_aliases(obj, param_mods) for name, def in pairs(param_mods) do if def.alias_of and obj[name] ~= nil then if obj[def.alias_of] ~= nil then error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.") end obj[def.alias_of] = obj[name] obj[name] = nil end end return obj end local function get_clean_param_mods(param_mods) local clean = {} for mod_name, mod_def in pairs(param_mods) do clean[mod_name] = {} for key, value in pairs(mod_def) do if key ~= "restrict" and key ~= "alias_of" then clean[mod_name][key] = value end end end return clean end function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods) for mod_name, mod_value in pairs(modifiers) do -- Only check restrictions if the modifier has a non-false/nil value if mod_value then local mod_def = param_mods[mod_name] if mod_def and mod_def.restrict then if mod_def.restrict.affix_group then if not is_affix_group_keyword(current_keyword) then local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).") end elseif mod_def.restrict.keywords then local allowed_keywords = mod_def.restrict.keywords local is_allowed = false for _, allowed_keyword in ipairs(allowed_keywords) do if current_keyword == allowed_keyword then is_allowed = true break end end if not is_allowed then local keyword_list = {} for _, kw in ipairs(allowed_keywords) do table.insert(keyword_list, ":" .. kw) end local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ") if #keyword_list > 2 then -- Replace last comma with "or" keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1") end local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".") end end end end end end local TERM_RULE_DISALLOW = { suppress = { field = "suppress_term", label = "suppressed" }, unknown = { field = "unknown_term", label = "unknown" }, family = { field = "is_family", label = "family" }, } function EtymonParser.check_etymon_limits(count, limits, label, opts) if not limits then return end opts = opts or {} local min_etymons = limits.min_etymons if min_etymons == nil and not opts.skip_default_min then min_etymons = 1 end if min_etymons and count < min_etymons then if min_etymons > 1 then error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.") else error("Detected " .. label .. " with no etymons.") end end if limits.max_etymons and count > limits.max_etymons then local unit = (limits.max_etymons == 1) and "etymon" or "etymons" error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".") end end function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label) label = label or "term" if rules and rules.disallow then local disallowed = {} for _, typ in ipairs(rules.disallow) do local spec = TERM_RULE_DISALLOW[typ] if spec and etymon_data[spec.field] then table.insert(disallowed, spec.label) end end if #disallowed > 0 then error(label .. " does not support " .. mw.text.listToText(disallowed, "or") .. " etymons.") end end if etymon_data.is_family then if rules and rules.family == "disallowed" then error(label .. " does not support family codes" .. (rules.family_suffix or ".")) elseif not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end if rules then if rules.require_term and (not etymon_data.term or etymon_data.term == "") then error(label .. " requires a term for each listed form.") end if rules.entry_lang then if Util.get_norm_lang(etymon_data.lang):getFullCode() ~= Util.get_norm_lang(entry_lang):getFullCode() then error(label .. " terms must be in the entry language (" .. entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.") end end if rules.ancestor_check then M.etymology.check_ancestor(entry_lang, etymon_data.lang) end elseif etymon_data.is_family and not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword) local config = M.data.keywords[keyword] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`") end function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local config = M.data.supplements[supplement_type] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=") end -- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>") function EtymonParser.parse_keyword_modifiers(param) if type(param) ~= "string" then return nil, {} end local base_keyword = get_keyword_base(param) if not base_keyword then return nil, {} end local canonical_keyword = get_canonical_keyword(base_keyword) -- Check if there are any modifiers if not param:find("<", 1, true) then return canonical_keyword, {} end -- Parse modifiers using the same mechanism as etymon parsing local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods) local function generate_obj(ignored) return {} end local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""), { param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods) local modifiers = { unc = parsed.unc or false, ref = parsed.ref, text = parsed.text, lit = parsed.lit, conj = parsed.conj, g = parsed.g, surf = parsed.surf or false, senseid = parsed.senseid, } -- Validate modifiers against restrictions EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods) return canonical_keyword, modifiers end local function normalize_keyword_param(keyword_with_mods) local trimmed = M.string_utilities.trim(keyword_with_mods) reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed)) local base = get_keyword_base(trimmed) if not base or not M.data.keywords[base] then error("Invalid keyword '" .. trimmed .. "' in inline etymology") end local canonical_base = get_canonical_keyword(base) local without_colon = trimmed:gsub("^:", "") local mods_part = without_colon:sub(#base + 1) local kw_param = normalize_keyword(canonical_base .. mods_part) EtymonParser.parse_keyword_modifiers(kw_param) return kw_param end local function get_keyword_mod_names() local names = {} for mod_name in pairs(EtymonParser.keyword_param_mods) do names[mod_name] = true end return names end local function parse_inline_ety_run(ety_string) local body = ety_string or "" if body == "" then error("Empty inline etymology") end local keyword_mod_names = get_keyword_mod_names() local pos = 1 local len = #body local function parse_err(msg) error(msg .. " in inline etymology: '" .. body .. "'") end local function peek_double() return body:sub(pos, pos + 1) == "<<" end local function mod_name_from_unwrapped(unwrapped) return unwrapped:match("^<([^:>]+)") end local function is_keyword_mod(unwrapped) local name = mod_name_from_unwrapped(unwrapped) return name and keyword_mod_names[name] or false end local function read_double_bracket() if not peek_double() then return nil end local start = pos pos = pos + 2 while pos <= len - 1 do if body:sub(pos, pos + 1) == ">>" then local token = body:sub(start, pos + 1) pos = pos + 2 return token, token:sub(2, -2) end pos = pos + 1 end parse_err("Unmatched <<") end local function read_angle_cell() if body:sub(pos, pos) ~= "<" or peek_double() then return nil end local open = pos pos = pos + 1 local depth = 1 local i = pos while i <= len do local ch = body:sub(i, i) if ch == "<" then depth = depth + 1 elseif ch == ">" then depth = depth - 1 if depth == 0 then local inner = body:sub(open + 1, i - 1) pos = i + 1 return inner end end i = i + 1 end parse_err("Unmatched <") end local function read_bare_run() local start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end return body:sub(start, pos - 1) end local function absorb_double_keyword_mods(keyword_str) while peek_double() do local saved = pos local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then keyword_str = keyword_str .. unwrapped else pos = saved break end end return keyword_str end local kw_start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end local keyword = body:sub(kw_start, pos - 1) if keyword:match("^%s*$") then parse_err("Missing keyword") end keyword = absorb_double_keyword_mods(keyword) local cells = {} while pos <= len do if peek_double() then local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword") end table.insert(cells, "+" .. unwrapped) elseif body:sub(pos, pos) == "<" then local inner = read_angle_cell() if inner ~= "" then table.insert(cells, inner) end else local bare = read_bare_run() if bare ~= "" then if bare:sub(1, 1) ~= ":" then parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)") end if not is_keyword(bare, true) then parse_err("Invalid keyword '" .. bare .. "' in inline etymology") end table.insert(cells, absorb_double_keyword_mods(bare)) end end end return { keyword = keyword, cells = cells, } end function EtymonParser.inline_ety_to_pipe(ety_string) local run = parse_inline_ety_run(ety_string) if not run.keyword or run.keyword:match("^%s*$") then return "|" end local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(pipe_parts, normalize_keyword_param(segment)) else table.insert(pipe_parts, segment) end end return "|" .. table.concat(pipe_parts, "|") .. "|" end function EtymonParser.pipe_to_inline_ety(pipe_string) local cells = {} for cell in pipe_string:gmatch("([^|]+)") do if cell ~= "" then table.insert(cells, cell) end end if #cells == 0 then return "" end local inline_parts = {} for index, cell in ipairs(cells) do local base = get_keyword_base(cell) if base and M.data.keywords[base] then local without_colon = cell:gsub("^:", "") local kw_base, mods = without_colon:match("^([^<]+)(.*)$") local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>") if index > 1 then inline_kw = ":" .. inline_kw end table.insert(inline_parts, inline_kw) elseif cell:sub(1, 1) == "+" then local mod = cell:sub(2) if mod:match("^<.->$") then mod = mod:sub(2, -2) end table.insert(inline_parts, "<<" .. mod .. ">>") else table.insert(inline_parts, "<" .. cell .. ">") end end return table.concat(inline_parts, "") end function EtymonParser.parse_inline_ety(ety_string, context_lang) local run = parse_inline_ety_run(ety_string) local keyword = M.string_utilities.trim(run.keyword) reject_removed_surf_keyword(":" .. keyword) if not is_keyword(keyword, true) then error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>") end local args = { context_lang:getCode(), normalize_keyword_param(keyword) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(args, normalize_keyword_param(segment)) else table.insert(args, segment) end end return args end function EtymonParser.parse_etymon(param, context_lang) if is_keyword(param) then return nil end if type(param) ~= "string" then return nil end local lang, rest local is_family = false local before_bracket = param:match("^([^<]*)") or param local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$") if lang_code then local potential_lang = Util.get_lang(lang_code, true) if potential_lang then lang = potential_lang rest = param:sub(#lang_code + 2) else local potential_family = Util.get_family(lang_code) if potential_family then lang = potential_family rest = param:sub(#lang_code + 2) is_family = true else lang = context_lang rest = param end end else lang = context_lang rest = param end M.tracking.track_term(rest) if rest == "" or rest == "+" then return { lang = lang, term = nil, unknown_term = true, is_family = is_family, } end if rest == "-" then return { lang = lang, term = nil, suppress_term = true, is_family = is_family, } end if not rest:find("<", 1, true) then return { lang = lang, term = M.string_utilities.trim(rest), is_family = is_family, } end local term_text = rest:match("^([^<]*)") or "" local is_unknown = (term_text == "" or term_text == "+") local is_suppress = (term_text == "-") local function generate_obj(ignored_term) return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) } end local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods) local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults, { param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods) parsed_obj.postype = Util.normalize_pos(parsed_obj.postype) if parsed_obj.id and parsed_obj.id:match("^!") then parsed_obj.id = parsed_obj.id:sub(2) parsed_obj.override = true end parsed_obj.lang = lang parsed_obj.is_family = is_family if is_unknown then parsed_obj.unknown_term = true elseif is_suppress then parsed_obj.suppress_term = true end return parsed_obj end function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code) -- id is now optional, so only validate if provided if id then if mw.ustring.len(id) < 2 then error("The `id` parameter must have at least two characters.") end if id == title or id == Util.get_page_data().pagename then error("The `id` parameter must not be the same as the page title.") end end local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true } if pos and not valid_pos[pos] then error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").") end local current_keyword = "from" local current_keyword_explicit = false local keyword_etymons = {} local keywords = M.data.keywords local function checkKeyword() local config = keywords[current_keyword] if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then keyword_etymons = {} return end EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`") keyword_etymons = {} end local start_index = starts_with_lang_code and 2 or 1 for i = start_index, #args do local param = args[i] if type(param) ~= "string" then elseif param:sub(1, 1) == ":" and not is_keyword(param) then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif is_keyword(param) then checkKeyword() current_keyword = get_canonical_keyword(get_keyword(param)) current_keyword_explicit = true else local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then table.insert(keyword_etymons, param) EtymonParser.check_keyword_term(etymon_data, lang, current_keyword) -- Check modifier restrictions EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods) -- postype must be "root" or "word" local VALID_POSTYPES = { root = true, word = true } if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").") end if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true) end else table.insert(keyword_etymons, param) end end end checkKeyword() end local DataRetriever = {} local function format_etymon_id_hint(id_data, idx) local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then return '"' .. id .. '"' end if pos and pos ~= "" then return "unnamed (|pos=" .. pos .. "|)" end return "etymon #" .. idx .. " (no |id= on page)" end local function etymon_target_page_link(page, norm_lang) -- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it -- directly. Passing it back through full_link() with a reconstructed language raises an error, -- because the resolved name no longer carries the leading "*" those languages require -- and -- this link is built even when the warning it belongs to is later discarded outside preview. return "[[" .. page .. "]]" end -- Summarize {{etymon}} id slots on a linked page for preview warnings. local function summarize_available_etymon_ids(ids) local id_list = {} local all_idless = true local target_has_idless = false local any_pos = false for i, id_data in ipairs(ids) do local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then all_idless = false else target_has_idless = true end if pos and pos ~= "" then any_pos = true end table.insert(id_list, format_etymon_id_hint(id_data, i)) end return { id_list = id_list, all_idless = all_idless, target_has_idless = target_has_idless, any_pos = any_pos, count = #ids, options_text = mw.text.listToText(id_list), } end local function ambiguous_etymon_suggestion(page_link, summary) if summary.all_idless then if summary.any_pos then return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link .. ", then `<id:identifier>` after the term here. Section order / hints: " .. summary.options_text .. "." end return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)." end return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "." end local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(ids) if is_toplevel and summary.target_has_idless then __state.linked_page_multiple_etymons_idless = true end local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count .. " {{etymon}} templates for " .. lang_name .. ")." Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true) end local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon) return cached_args == M.data.STATUS.MISSING and not parent_etymon and #(__state.available_etymon_ids[base_key] or {}) > 0 end local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) if not is_toplevel or __state.skip_partial_etymology_category then return end if not __state.partial_etymology_targets[base_key] then return end if etymon_data.id and type(cached_args) == "table" then return end __state.linked_page_partial_etymology_sections = true end local function is_nonlemma_etymon_template(template_args) return template_args and M.yesno(template_args.nl, false) end local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {}) local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id .. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "." Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true) end -- Given an etymon data, scrape its page and cache the result in the global state object. function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel) local content = etymon_title:getContent() if not content then __state.cached_etymon_args[key] = M.data.STATUS.REDLINK return end -- Check if the linked page is a redirect. If it is, the template parsing -- code below will be effectively skipped, and `scrape_page` will be called -- again on the redirect target (see the bottom of this function) local lang_section_for_descendants = nil local redirect_target = etymon_title.redirect_target if not redirect_target then -- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language -- name, and this scrape runs on raw wikitext, so the template form has to be tried too. content = M.pages.get_section(content, etymon_lang:getFullName(), 2) or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2) if not content then __state.cached_etymon_args[key] = M.data.STATUS.MISSING return end lang_section_for_descendants = content end local etymon_lang_code = etymon_lang:getFullCode() local lang_page_key = etymon_lang_code .. ":" .. etymon_page local found_templates_for_lang = {} local found_ids = {} local get_node_class = M.template_parser.class_else_type -- Look for all {{etymon}} templates within the page content using the template parser -- This way the same page is never parsed more than once -- Build a map from senseids to their parent etymonids. local active_etymon_args = nil local etymology_section_count = 0 local etymology_sections_with_etymon = 0 local current_etymology_has_etymon = false local current_etymology_has_nonlemma = false local function finalize_current_etymology_section() if etymology_section_count == 0 then return end if current_etymology_has_etymon or current_etymology_has_nonlemma then etymology_sections_with_etymon = etymology_sections_with_etymon + 1 end current_etymology_has_etymon = false current_etymology_has_nonlemma = false end for node in M.template_parser.parse(content):iterate_nodes() do local node_class = get_node_class(node) if node_class == "heading" then -- A new L2 or etymology section acts as a barrier: an {{etymon}} usage -- used previously cannot be the parent of any subsequent senseids. -- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above. if node:get_name():find(ETYMOLOGY_HEADING) then finalize_current_etymology_section() etymology_section_count = etymology_section_count + 1 active_etymon_args = nil end elseif node_class == "template" then local template_name = node:get_name() if ETYMON_TEMPLATES[template_name] then local template_args = Util.normalize_raw_etymon_args(node:get_arguments()) -- Check if this etymon is for our language if template_args[1] == etymon_lang_code then if is_nonlemma_etymon_template(template_args) then if etymology_section_count > 0 then current_etymology_has_nonlemma = true end else if etymology_section_count > 0 then current_etymology_has_etymon = true end table.insert(found_templates_for_lang, template_args) if template_args.id then local etymon_key = lang_page_key .. ":" .. template_args.id __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, template_args.id) active_etymon_args = template_args else -- Store idless etymon with default key local etymon_key = lang_page_key .. ":*" __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, "*") active_etymon_args = template_args end end end elseif active_etymon_args and template_name == "senseid" then local template_args = node:get_arguments() -- This should always be true for proper usages of {{senseid}}. if template_args[1] == etymon_lang_code and template_args[2] then local sense_id_key = lang_page_key .. ":" .. template_args[2] __state.senseid_parent_etymon[sense_id_key] = active_etymon_args __state.cached_etymon_pages[sense_id_key] = tostring(etymon_page) end end end end finalize_current_etymology_section() if lang_section_for_descendants and etymology_section_count > 1 and etymology_sections_with_etymon > 0 and etymology_sections_with_etymon < etymology_section_count then __state.partial_etymology_targets[lang_page_key] = true end if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then M.descendants.cache_page_checks({ lang_section = lang_section_for_descendants, etymon_lang_code = etymon_lang_code, found_templates_for_lang = found_templates_for_lang, entry_title = __state.entry_title, entry_lang_code = __state.entry_lang_code, entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil, cached_descendants_checks = __state.cached_descendants_checks, lang_page_key = lang_page_key, redirected_from = redirected_from, }) end local id_data_list = {} for _, args in ipairs(found_templates_for_lang) do local id = args.id or "*" table.insert(id_data_list, { id = id, pos = args.pos }) end __state.available_etymon_ids[lang_page_key] = id_data_list if #found_templates_for_lang == 1 then __state.single_etymons[lang_page_key] = found_templates_for_lang[1] end if redirected_from and __state.available_etymon_ids[lang_page_key] then __state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {} for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do table.insert(__state.available_etymon_ids[redirected_from], id_data) end end if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then -- All done! return elseif redirect_target and not redirected_from then -- Try scraping the redirect. etymon_page = redirect_target.prefixedText DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel) __state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id] else __state.cached_etymon_args[key] = M.data.STATUS.MISSING end end local function has_linkable_term(etymon_data) if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then return false end local term = etymon_data.term if term == nil or term == "" then return false end return M.string_utilities.trim(term) ~= "" end local function record_term_id_tracking(etymon_data) if not has_linkable_term(etymon_data) then return end local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang) M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page) end -- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name. function DataRetriever.get_etymon_args(etymon_data, is_toplevel) if not has_linkable_term(etymon_data) then return M.data.STATUS.MISSING, nil, nil, nil end local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page if etymon_data.id then local key = base_key .. ":" .. etymon_data.id local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] if cached_args == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel) end cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh -- Get etymon_id from parent if this was resolved via senseid local parent_etymon = __state.senseid_parent_etymon[key] local resolved_etymon_id = parent_etymon and parent_etymon.id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) end end local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon) if mismatched_id and is_toplevel then __state.has_mismatched_id = true M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id) warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id) end maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check else __state.used_idless_etymon = true if is_toplevel then __state.toplevel_idless_etymon = true end if __state.available_etymon_ids[base_key] == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel) end local ids = __state.available_etymon_ids[base_key] or {} local count = #ids -- Try to filter by postype if available and we have multiple candidates if count > 1 and etymon_data.postype then local matching_ids = {} for _, id_data in ipairs(ids) do if id_data.pos == etymon_data.postype then table.insert(matching_ids, id_data) end end if #matching_ids == 1 then local matched_id = matching_ids[1].id local matched_key = base_key .. ":" .. matched_id M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id = matched_id }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id = matched_id }, }) end end local matched_args = __state.cached_etymon_args[matched_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel) return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check end end if count == 1 then local only_id_data = ids[1] local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*" M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id_data = only_id_data }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id_data = only_id_data }, }) end end local single_args = __state.single_etymons[base_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel) return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check elseif count > 1 then M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous") warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel) return M.data.STATUS.AMBIGUOUS, nil, nil, nil else M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing") maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel) return M.data.STATUS.MISSING, nil, nil, nil end end end local function keyword_invisible_in_tree(keyword_info) if not keyword_info then return false end local inv = keyword_info.invisible return inv == "all" or inv == true or inv == "tree" end -- True when the node has at least one top-level child container visible in the tree. local function node_has_visible_tree_children(node) for _, container in ipairs(node.children or {}) do if not keyword_invisible_in_tree(container.keyword_info) then return true end end return false end -- Count visible term nodes in the tree. local function get_visible_tree_depth(node, skip_child_rendering) local max_depth = 1 if skip_child_rendering or not node then return max_depth end for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if not keyword_invisible_in_tree(keyword_info) then local skip_grandchildren = keyword_info and keyword_info.no_child_categories for _, term in ipairs(container.terms or {}) do if term.is_duplicate then if term.original_has_children then max_depth = math.max(max_depth, 2) end else max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren)) end end end end return max_depth end local function as_param_list(val) if val == nil then return {} end if type(val) == "table" then return val end if type(val) == "string" and val ~= "" then return { val } end return {} end local TreeBuilder = {} local function parse_etymon_references(refs_text) if not refs_text or refs_text == "" then return "" end return M.references.parse_references(refs_text) end local function parse_tree_references(node) if node.ref then node.parsed_ref = parse_etymon_references(node.ref) end if node.children then for _, container in ipairs(node.children) do if container.terms then for _, term in ipairs(container.terms) do parse_tree_references(term) end end end end if node.supplements then for _, supplement in ipairs(node.supplements) do if supplement.terms then for _, term in ipairs(supplement.terms) do parse_tree_references(term) end end end end end -- Build a unique key for deduplication in the seen table function TreeBuilder.build_key(lang, title, args) local norm_lang_code = Util.get_norm_lang(lang):getFullCode() local is_table = type(args) == "table" local id = (is_table and args.id) or "" if title then return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id end if is_table and args.status == M.data.STATUS.INLINE then local content_parts = {} for i = 1, #args do content_parts[i] = tostring(args[i]) end return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0") end return norm_lang_code .. ":*:" .. id end -- Copy parsed etymon modifiers onto a tree/supplement term node. function TreeBuilder.apply_etymon_fields(term, etymon_data) -- A reference without <id:> still resolves when the target page has a single etymon, and the -- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows -- the target's id as the gloss without every reference having to repeat it. An explicit -- <id:...> still wins. term.id = etymon_data.id or term.id term.t = etymon_data.t term.tr = etymon_data.tr term.ts = etymon_data.ts term.alt = etymon_data.alt term.g = etymon_data.g term.pos = etymon_data.pos term.ng = etymon_data.ng term.ref = etymon_data.ref term.is_uncertain = etymon_data.unc term.lit = etymon_data.lit term.q = etymon_data.q term.qq = etymon_data.qq term.l = etymon_data.l term.ll = etymon_data.ll term.suppress_term = etymon_data.suppress_term term.unknown_term = etymon_data.unknown_term term.is_family = etymon_data.is_family term.override = etymon_data.override term.aftype = etymon_data.aftype term.postype = etymon_data.postype term.bor = etymon_data.bor term.lbor = etymon_data.lbor term.slbor = etymon_data.slbor end function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type) EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local term = { lang = etymon_data.lang, title = etymon_data.term, children = {}, status = M.data.STATUS.OK, } TreeBuilder.apply_etymon_fields(term, etymon_data) return term end function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) local terms = {} for _, term_param in ipairs(as_param_list(param_value)) do if type(term_param) == "string" and term_param ~= "" then local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang) if etymon_data then table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)) end end end return terms end -- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=). function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value) local config = M.data.supplements[supplement_type] if not config then error("Unknown supplement '" .. tostring(supplement_type) .. "'.") end local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) if #terms == 0 then return end data_tree.supplements = data_tree.supplements or {} table.insert(data_tree.supplements, { type = supplement_type, config = config, terms = terms, }) M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true) end function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion) seen = seen or {} depth = depth or 0 local is_toplevel = (depth == 0) if depth > __state.max_depth_reached then __state.max_depth_reached = depth end __state.total_nodes = __state.total_nodes + 1 local lang_code = lang:getCode() __state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1 local current_id = (type(args) == "table" and args.id) or "" local key = TreeBuilder.build_key(lang, title, args) local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK } if type(args) ~= "table" or seen[key] then node.status = args or M.data.STATUS.MISSING -- Mark as duplicate if we've seen this node before if seen[key] then node.is_duplicate = true node.duplicate_key = key local original_node = seen[key] if type(original_node) == "table" and original_node.children and #original_node.children > 0 then node.original_has_children = true end end return node end node.status = args.status or M.data.STATUS.OK seen[key] = node -- If stop_recursion is set, skip parsing children but check for visible children if stop_recursion then local keywords = M.data.keywords local has_visible_children = false for i = 2, #args do local param = args[i] if type(param) == "string" then local keyword_base = get_keyword_base(param) if keyword_base and keywords[keyword_base] then local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param)) if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then has_visible_children = true break end elseif param:sub(1, 1) ~= ":" then -- It's a term (not a keyword), so there are visible children has_visible_children = true break end end end node.has_visible_children = has_visible_children return node end -- Parse args into keyword containers local current_keyword = "from" local current_keyword_modifiers = {} local current_container = nil local function ensure_container() if not current_container or current_container.keyword ~= current_keyword then local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers) current_container = { keyword = current_keyword, keyword_info = keyword_info, keyword_modifiers = current_keyword_modifiers, terms = {}, } table.insert(node.children, current_container) -- Override keyword text/phrase for nominalization with <g:code> if current_keyword_modifiers.g and current_keyword == "nominalization" then local labels = get_nominalization_label_for_g(current_keyword_modifiers.g) if not labels then local codes = {} for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end table.sort(codes) error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", ")) end current_container.keyword_info = copy_keyword_info(keyword_info) current_container.keyword_info.text = labels.text current_container.keyword_info.phrase = labels.phrase end end return current_container end local parse_context_lang = Util.resolve_context_lang(lang, args) for i = 2, #args do local param = args[i] if is_keyword(param) then local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param) if not keyword then error("Invalid keyword '" .. param .. "'.") end current_keyword = keyword current_keyword_modifiers = modifiers current_container = nil -- Force new container for new keyword elseif type(param) == "string" and param:sub(1, 1) == ":" then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif type(param) == "string" then local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang) if etymon_data then -- Track keyword usage at top level M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel) local term_node = {} local container -- Handle suppress_term (-) and unknown_term (empty or +) directly if etymon_data.suppress_term or etymon_data.unknown_term then container = ensure_container() if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1) else term_node = { lang = etymon_data.lang, children = {}, status = M.data.STATUS.OK, } end TreeBuilder.apply_etymon_fields(term_node, etymon_data) else -- Regular term: fetch arguments from page record_term_id_tracking(etymon_data) local etymon_args, page_of, resolved_etymon_id, descendants_check = DataRetriever.get_etymon_args(etymon_data, is_toplevel) -- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing if etymon_data.ety then if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then __state.current_page_has_inline_etymology = true if is_toplevel then __state.toplevel_has_inline_etymology = true end local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) -- Track inline ety keywords too local inline_keyword = get_keyword(inline_args[2], true) if inline_keyword and #inline_args >= 3 then local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang) if inline_etymon then M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel) end end inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE etymon_args = inline_args term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent else -- Scraped arguments exist, <ety> is redundant and ignored __state.current_page_has_redundant_etymology = true if is_toplevel then __state.toplevel_redundant_etymology = true end end end -- Ensure container exists before checking keyword info container = ensure_container() -- Check if current keyword has no_child_categories - if so, stop recursion local keyword_info = container.keyword_info local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories)) term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion) term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() .. ":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang) term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid term_node.page_of = page_of TreeBuilder.apply_etymon_fields(term_node, etymon_data) term_node.missing_descendants_header, term_node.missing_descendants_entry = M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check) end table.insert(container.terms, term_node) end end end return node end -- Convert etymology tree to JSON-serializable table local function tree_to_json(node) local obj = { term = node.title, lang = node.lang:getCode(), lang_name = node.lang:getCanonicalName(), id = (node.id and node.id ~= "") and node.id or nil, status = node.status, is_uncertain = node.is_uncertain or nil, is_duplicate = node.is_duplicate or nil, gloss = node.t, transliteration = node.tr, transcription = node.ts, alt = node.alt, g = node.g, pos = node.pos, ng = node.ng, children = {}, } for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if keyword_info then local container_obj = { keyword = container.keyword, keyword_label = keyword_info.text, keyword_abbrev = keyword_info.abbrev, is_group = keyword_info.is_group or nil, is_invisible = keyword_info.invisible or nil, is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil, terms = {}, } for _, term in ipairs(container.terms or {}) do table.insert(container_obj.terms, tree_to_json(term)) end table.insert(obj.children, container_obj) end end return obj end -- Build and return the etymology data tree for a given term. function export.get_tree(lang, title, args, options) options = options or {} __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() __state.skip_partial_etymology_category = options.skip_partial_etymology_category == true if options.validate then EtymonParser.validate(lang, args, options.id, title, options.pos, false) end local lang_code = lang:getCode() local start_index = (args[1] == lang_code) and 2 or 1 local tree_args = { [1] = lang_code, id = options.id or args.id } for i = start_index, #args do table.insert(tree_args, args[i]) end __state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args local ety_data_tree = TreeBuilder.build(lang, title, tree_args) parse_tree_references(ety_data_tree) if options.json then return M.JSON.toJSON(tree_to_json(ety_data_tree)) end return ety_data_tree end -- Given a language code, page name and optionally the id= parameter, -- render the tree and only the etymology tree for the relevant page. -- Fetches and parses the corresponding {{etymon}} from the requested page, -- and any further pages needed to render the tree. -- Parameters can be passed either through the #invoke or as -- template parameters *through* an #invoke. function export.render_tree_for_etymon_on_page(frame) local frame_args = frame.args local parent_args = frame:getParent().args local langcode = frame_args[1] or parent_args[1] local pagename = frame_args[2] or parent_args[2] local id = frame_args["id"] or parent_args["id"] local display_title = frame_args["title"] or parent_args["title"] local parsed_title = mw.title.new(pagename, 0) local title if parsed_title.namespace == 0 then title = M.pages.safe_page_name(parsed_title) elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then title = "*" .. M.pages.safe_page_name(parsed_title) else error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace) end local lang = Util.get_lang(langcode) __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() -- Construct etymon_data for DataRetriever.get_args. local etymon_data = { lang = lang, term = title, id = id } local args, pagename = DataRetriever.get_etymon_args(etymon_data, true) if args == M.data.STATUS.MISSING then error("The etymon template was not found (language " .. langcode .. ", title '" .. title .. "'" .. (id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.") end local tree_title = display_title or title if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then M.tracking.track_title_pagename_mismatch(lang) end reset_invocation_state() local ety_data_tree = export.get_tree(lang, tree_title, args, { validate = true, id = id, }) local output = {} table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) return table.concat(output) end function export.main(frame) local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, M.parameters_data.etymon) args.pos = Util.normalize_pos(args.pos) local lang = args[1] local etymon_args = args[2] local id = args.id local title = args.title local text = args.text local tree = args.tree local etydate = args.etydate local doublet = args.doublet local rfe = args.rfe local etystub = args.etystub local is_nonlemma = M.yesno(args.nl, false) local page_data = Util.get_page_data() if not title then title = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end end local entry_pagename = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then entry_pagename = "*" .. entry_pagename end if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then M.tracking.track_title_pagename_mismatch(lang) end local current_L2 = M.pages.get_current_L2() if current_L2 then local norm_lang = Util.get_norm_lang(lang) local norm_name = norm_lang:getCanonicalName() if current_L2 ~= norm_name then local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if norm_lang:getCode() ~= lang:getCode() then lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")" end error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").") end end reset_invocation_state() local ety_data_tree = export.get_tree(lang, title, etymon_args, { validate = true, pos = args.pos, id = id, json = args.json, skip_partial_etymology_category = is_nonlemma, }) if args.json then return ety_data_tree end local output = {} local text_allowlist_mode = M.text_allowed.default_mode or "off" if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() .. "; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter." if text_allowlist_mode == "error" then error(msg) else Util.add_warning(msg, true) end end local lang_exc = Util.get_lang_exception(lang) if lang_exc and lang_exc.disallow then local disallow = lang_exc.disallow local error_text = " for " .. lang:getFullName() if disallow.ref then error_text = error_text .. "; see " .. disallow.ref else error_text = error_text .. "." end if tree and disallow.tree then error("Etymology trees are not allowed" .. error_text) end if text and disallow.text then error("Etymology texts are not allowed" .. error_text) end end if etydate then local etydate_param_mods = { ref = { list = true, type = "references", allow_holes = true }, refn = { list = true, allow_holes = true }, nocap = { type = "boolean" }, } local function generate_etydate_obj(etydate_text) local etydate_specs = {} for spec in etydate_text:gmatch("[^,]+") do table.insert(etydate_specs, mw.text.trim(spec)) end return { [1] = etydate_specs } end local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj }) local etydate_args = { [1] = parsed_etydate[1], nocap = parsed_etydate.nocap or false, } ety_data_tree.supplements = ety_data_tree.supplements or {} table.insert(ety_data_tree.supplements, { type = "etydate", etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }), etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil, }) end TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet) if ety_data_tree.supplements then parse_tree_references(ety_data_tree) end local has_visible_children = node_has_visible_tree_children(ety_data_tree) -- Suppress trees for multiword entries and one-step chains local visible_tree_depth = get_visible_tree_depth(ety_data_tree) local is_trivial_tree = visible_tree_depth <= 2 local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil if tree and (is_multiword or is_trivial_tree) then tree = false end if tree then table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) end local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree)) local anchor = M.anchors.etymonid(lang, id, { no_tree = args.notree, title = title, empty_tree = (not has_visible_children) or tree_disallowed, ety_tree_json = ety_tree_json, }) table.insert(output, anchor) local text_stop_lang_missing = nil if text then local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink if text == "++" then max_depth, stop_at_blue_link = false, false elseif text == "+" then max_depth, stop_at_blue_link = 1, false elseif text == "*" then max_depth, stop_at_blue_link = false, true elseif text:match("^:[^*]+%*$") then -- Stop at a specific language OR first bluelink after it, e.g., ":ota*" -- If the target language is a redlink, continue to the first bluelink local lang_code = text:match("^:([^*]+)%*$") if lang_code and lang_code ~= "" then local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang_or_bluelink = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end elseif text:sub(1, 1) == ":" then -- Stop at a specific language, e.g., ":ar" stops at first Arabic term local lang_code = text:sub(2) if lang_code ~= "" then -- Validate the language code local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else local num = tonumber(text) if num and num >= 1 then max_depth, stop_at_blue_link = num, false else error('Invalid text value "' .. text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)') end end local text_output, text_render_meta = M.text.render({ data_tree = ety_data_tree, format_term_func = Util.format_term, lang_matches_stop_code = Util.lang_matches_stop_code, max_depth = max_depth, stop_at_blue_link = stop_at_blue_link, curr_page = page_data.pagename, nodot = args.nodot, dot = args.dot, stop_at_lang = stop_at_lang, stop_at_lang_or_bluelink = stop_at_lang_or_bluelink, }) table.insert(output, text_output) if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then M.tracking.track_text_stop_lang_missing(lang, stop_at_lang) text_stop_lang_missing = stop_at_lang end end if rfe then table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode())) end if etystub then table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode())) end if is_nonlemma then table.insert(output, " " .. frame:expandTemplate({ title = "nonlemma", args = {}, })) end local categories = {} if Util.is_content_page() then M.tracking.track_tree_metrics({ max_depth_reached = __state.max_depth_reached, total_nodes = __state.total_nodes, language_count = __state.language_count, lang = lang, }) categories = M.categories.build({ data_tree = ety_data_tree, page_lang = lang, available_etymon_ids = __state.available_etymon_ids, senseid_parent_etymon = __state.senseid_parent_etymon, get_norm_lang_func = Util.get_norm_lang, lang_exc = lang_exc, suppress_categories = lang_exc and lang_exc.suppress_categories, nocat = args.nocat, tree = tree, text = text, exnihilo = args.exnihilo, toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology, toplevel_redundant_etymology = __state.toplevel_redundant_etymology, toplevel_idless_etymon = __state.toplevel_idless_etymon, has_mismatched_id = __state.has_mismatched_id, linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless, linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections, text_stop_lang_missing = text_stop_lang_missing, }) M.tracking.track_keywords(__state.toplevel_keyword_stats, lang) M.tracking.track_page_id(lang, id) M.tracking.track_ids(__state.id_stats, lang) end if #categories > 0 then table.insert(output, M.categories.format(categories, lang)) end if __state.warnings then for i, warning in ipairs(__state.warnings) do table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n") end end return table.concat(output) end return export hnilsgqvid6wczxab95eoymmlieznpe 6532073 6532033 2026-09-18T18:40:20Z Wikihez 7344 sync test copy 6532073 Scribunto text/plain --[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Authors: - Original implementation: [[User:Ioaxxere]] - Full refactor (September 2025): [[User:Fenakhay]] ([[Special:Diff/86717746]]) Modules: - [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping - [[Module:etymon/data]]: keyword definitions, configuration, and status constants - [[Module:etymon/tree]]: etymology tree rendering - [[Module:etymon/text]]: etymology text generation - [[Module:etymon/categories]]: category generation logic - [[Module:etymon/tracking]]: tracking ]=] local export = {} local __state = { cached_etymon_args = {}, cached_etymon_pages = {}, cached_descendants_checks = {}, senseid_parent_etymon = {}, available_etymon_ids = {}, single_etymons = {}, entry_title = nil, entry_lang_code = nil, current_page_has_inline_etymology = false, current_page_has_redundant_etymology = false, used_idless_etymon = false, toplevel_has_inline_etymology = false, toplevel_redundant_etymology = false, toplevel_idless_etymon = false, has_mismatched_id = false, linked_page_multiple_etymons_idless = false, linked_page_partial_etymology_sections = false, partial_etymology_targets = {}, skip_partial_etymology_category = false, max_depth_reached = 0, total_nodes = 0, language_count = {}, toplevel_keyword_stats = {}, id_stats = nil, warnings = {}, } local function reset_invocation_state() __state.current_page_has_inline_etymology = false __state.current_page_has_redundant_etymology = false __state.used_idless_etymon = false __state.toplevel_has_inline_etymology = false __state.toplevel_redundant_etymology = false __state.toplevel_idless_etymon = false __state.has_mismatched_id = false __state.linked_page_multiple_etymons_idless = false __state.linked_page_partial_etymology_sections = false __state.max_depth_reached = 0 __state.total_nodes = 0 __state.language_count = {} __state.toplevel_keyword_stats = {} __state.warnings = {} end local M = require("Module:module loader").init({ require = { data = "Module:etymon/data/ceribandin", tree = "Module:etymon/tree/ceribandin", text = "Module:etymon/text/ceribandin", categories = "Module:etymon/categories/ceribandin", tracking = "Module:etymon/tracking", descendants = "Module:etymon/descendants/ceribandin", anchors = "Module:anchors", etydate = "Module:etydate", etymology = "Module:etymology", families = "Module:families", languages = "Module:languages", languages_errorgetby = "Module:languages/errorGetBy", links = "Module:links", pages = "Module:pages", parameters = "Module:parameters", string_utilities = "Module:string utilities", template_parser = "Module:template parser", utilities = "Module:utilities", debug = "Module:debug", en_utilities = "Module:en-utilities", parse_utilities = "Module:parse utilities", references = "Module:references", template_styles = "Module:TemplateStyles", script_utilities = "Module:script utilities", JSON = "Module:JSON", yesno = "Module:yesno", }, loadData = { headword_data = "Module:headword/data", parameters_data = "Module:parameters/data/ceribandin", text_allowed = "Module:etymon/data/text_allowed", }, }) -- Template names that carry etymon data, and the heading that opens an etymology section. -- Pages are scraped for these, so both must match what ku.wiktionary actually uses: -- the section is "Etîmolojî", and the new template is "etîmon". -- Only the new template: pages still using Şablon:etymon carry the old ">"-separated syntax, which -- this module would misparse into garbage node labels. Add "etymon" here only once -- Şablon:etymon itself invokes this module. local ETYMON_TEMPLATES = { ["etîmon"] = true, ["etymon/nû"] = true, -- redirect to Şablon:etîmon; still recognised if written out -- Do NOT add "etymon" here while Şablon:etymon still uses the old ">"-separated syntax: -- this module would read those calls and parse the bare keyword ("inh") as a term. } local ETYMOLOGY_HEADING = "^Etîmolojî" -- ku's reconstruction namespace is "Jinûvesazî" (id 108), where en.wiktionary uses -- "Reconstruction" (id 118). A page here is a reconstructed term, so its title needs the -- leading "*" that Modul:links requires for reconstructed languages. local RECONSTRUCTION_NS_NAME = "Jinûvesazî" local RECONSTRUCTION_NS_ID = 108 local Util = {} function Util.format_error(message, preview_only) if preview_only and not M.pages.is_preview() then return nil end return '<span class="error">' .. message .. '</span>' end function Util.add_warning(message, preview_only) local formatted = Util.format_error(message, preview_only) if formatted then table.insert(__state.warnings, formatted) end end function Util.is_text_param_allowed_for_lang(lang) if not lang or type(lang) ~= "table" then return false end local types = lang.getTypes and lang:getTypes() if types and types.family then local code = lang.getCode and lang:getCode() return code and M.text_allowed.families[code] == true end local full_code = lang.getFullCode and lang:getFullCode() if full_code and M.text_allowed.langs[full_code] then return true end if lang.inFamily then for family_code in pairs(M.text_allowed.families) do if lang:inFamily(family_code) then return true end end end return false end function Util.get_lang(code, no_error) if no_error then return M.languages.getByCode(code, nil, true) end return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true) end -- Match a term language against a text=:lang stop target (supports etymology-only codes). function Util.lang_matches_stop_code(term_lang, stop_code) if not term_lang or not stop_code or stop_code == "" then return false end local stop_lang = Util.get_lang(stop_code, true) if not stop_lang then return false end if term_lang:getCode() == stop_lang:getCode() then return true end if stop_lang:getFullCode() == stop_lang:getCode() then return term_lang:getFullCode() == stop_lang:getCode() end return false end function Util.get_family(code) return M.families.getByCode(code) end function Util.get_lang_exception(lang) -- Families have no language-specific exceptions if lang.getTypes and lang:getTypes().family then return nil end local code = lang:getCode() local lang_exceptions = M.data.config.lang_exceptions if lang_exceptions[code] then return lang_exceptions[code] end for norm_code, exc in pairs(lang_exceptions) do if exc.normalize_to and code == exc.normalize_to then return exc end if exc.normalize_from_families then local should_normalize = false for _, family in ipairs(exc.normalize_from_families) do if lang:inFamily(family) then should_normalize = true break end end if should_normalize and exc.normalize_exclude_families then for _, family in ipairs(exc.normalize_exclude_families) do if lang:inFamily(family) then should_normalize = false break end end end if should_normalize then local ret = {} for k, v in pairs(exc) do ret[k] = v end ret.suppress_tr = nil return ret end end end return nil end function Util.get_norm_lang(lang) local exc = Util.get_lang_exception(lang) if exc and exc.normalize_to then return M.languages.getByCode(exc.normalize_to) end return lang end function Util.resolve_context_lang(lang, node_args) if type(node_args) ~= "table" then return lang end if node_args.status == M.data.STATUS.INLINE then return lang end if not (lang.hasType and lang:hasType("etymology-only")) then return lang end local full = lang.getFull and lang:getFull() if not full or full:getCode() == lang:getCode() then return lang end if full.hasAncestor and full:hasAncestor(lang) then return lang end return full end -- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>) -- This is needed because Module:parse utilities expects boolean modifiers to have explicit values function Util.add_boolean_defaults(str, param_mods) local result = str for name, spec in pairs(param_mods) do if spec.type == "boolean" then -- Replace <name> with <name:1> (but not <name:...> which already has a value) result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>") end end return result end local REQUEST_TEMPLATE_PARAM_MODS = { rfe = { nocat = { type = "boolean" }, sort = {}, y = {}, m = {}, fragment = {}, section = {}, box = { type = "boolean" }, noes = { type = "boolean" }, }, etystub = { nocat = { type = "boolean" }, sort = {}, nocap = { type = "boolean" }, nodot = { type = "boolean" }, }, } function Util.expand_request_template(frame, template_name, param_value, lang_code) local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name] local with_defaults = Util.add_boolean_defaults(param_value, param_mods) local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, { param_mods = param_mods, generate_obj = function(text) if M.yesno(text, false) then return { is_boolean = true } end return { text = text } end, }) local template_args = { [1] = lang_code } for name in pairs(param_mods) do template_args[name] = parsed[name] end if not parsed.is_boolean then template_args[2] = parsed.text end return " " .. frame:expandTemplate({ title = template_name, args = template_args, }) end -- Kurdish values accepted for |pos= (|crz=) and <postype:>, mapped to the English values the rest of -- the module compares against. local POS_ALIASES = { ["reh"] = "root", ["kelîme"] = "word", ["pêşgir"] = "prefix", ["paşgir"] = "suffix", ["navgir"] = "interfix", } function Util.normalize_pos(value) if type(value) ~= "string" then return value end value = mw.text.trim(value) return POS_ALIASES[value] or value end -- {{etîmon}} arguments read straight from another page skip Module:parameters, so `crz` (the Kurdish -- name of `pos`) and the Kurdish values are resolved here. function Util.normalize_raw_etymon_args(args) if args.pos == nil and args.crz ~= nil then args.pos = args.crz end args.pos = Util.normalize_pos(args.pos) return args end -- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms function Util.format_term(term, is_toplevel, opts) opts = opts or {} -- suppress_term (-) returns nil if term.suppress_term then return nil end local lang = term.lang local exc = Util.get_lang_exception(lang) if is_toplevel then local display_text = term.alt or term.title or "" local sc = term.sc or lang:findBestScript(display_text) local bold_text = tostring(mw.html.create("strong") :addClass("selflink") :wikitext(display_text)) return M.script_utilities.tag_text(bold_text, lang, sc, "term") end local link_params = { lang = lang } link_params.term = not term.unknown_term and term.title or nil link_params.alt = term.alt link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil if not (exc and exc.suppress_tr) then link_params.tr = term.tr link_params.ts = term.ts else link_params.suppress_tr = true end link_params.lit = (opts.lit ~= "suppress") and term.lit or nil -- An explicit <t:...> wins; otherwise fall back to the etymon id, which on ku is usually a -- Kurdish gloss in its own right ("berik", "hêştir"). An id that is a key rather than a -- translation ("H2O", "paşgira meslekî") can be overridden with a <t:...>. local t = (term.t and term.t ~= "") and term.t or nil local id_gloss = (term.id and term.id ~= "") and term.id or nil local gloss = t or id_gloss -- gloss = "separate" leaves the gloss out of the link and returns it as a second value, so -- the tree can put it on its own line. if opts.gloss ~= "suppress" and opts.gloss ~= "separate" then link_params.gloss = gloss end if term.g and term.g ~= "" then local genders = M.string_utilities.split(term.g, ",") for i = 1, #genders do genders[i] = M.string_utilities.trim(genders[i]) end link_params.genders = genders end if opts.pos ~= "suppress" then link_params.pos = term.pos link_params.ng = term.ng end if exc and exc.suppress_tr then link_params.lit = nil end local show_qualifiers if opts.tree_ql ~= "suppress" then if term.q then link_params.q = term.q end if term.qq then link_params.qq = term.qq end if term.l then link_params.l = term.l end if term.ll then link_params.ll = term.ll end show_qualifiers = term.q or term.qq or term.l or term.ll end local link = M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil) if opts.gloss == "separate" then return link, gloss end return link end local __is_content_page_cached function Util.is_content_page() if __is_content_page_cached == nil then __is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle()) end return __is_content_page_cached end local __page_data_cached function Util.get_page_data() if not __page_data_cached then __page_data_cached = M.headword_data.page end return __page_data_cached end -- Extract base keyword from param (without modifiers) local function get_keyword_base(param) if type(param) ~= "string" then return nil end local base = param:match("^:?([^<]+)") or param:gsub("^:", "") return base end local function is_keyword(param, allow_colon_less) if type(param) ~= "string" then return false end local keywords = M.data.keywords if param:sub(1, 1) == ":" then local base = get_keyword_base(param) return keywords[base] ~= nil end if allow_colon_less then local base = get_keyword_base(param) return keywords[base] ~= nil end return false end local function get_keyword(param, allow_colon_less) if type(param) ~= "string" then return nil end local keywords = M.data.keywords if param:sub(1, 1) == ":" then return get_keyword_base(param) end if allow_colon_less then local base = get_keyword_base(param) if keywords[base] then return base end end return nil end local function normalize_keyword(keyword) if keyword:sub(1, 1) == ":" then return keyword end return ":" .. keyword end -- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries local function get_canonical_keyword(keyword) if not keyword then return keyword end return M.data.keyword_canonical[keyword] or keyword end local function is_affix_group_keyword(keyword) local config = keyword and M.data.keywords[keyword] return config and config.affix_categories or false end local function reject_removed_surf_keyword(param) local base = get_keyword_base(param) if base == "surf" then error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).") end end local function copy_keyword_info(source) local copy = {} for k, v in pairs(source) do copy[k] = v end return copy end local function lowercase_glossary_display(text) return text:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function surf_should_keep_formation_phrase(base) if not base.phrase then return false end if base.glossary then return true end return not (base.phrase == "from" and (base.text == "From" or base.text == "from")) end -- Runtime overrides when <surf> is present on a keyword. local function get_effective_keyword_info(keyword, modifiers) local base = M.data.keywords[keyword] if not base or not modifiers or not modifiers.surf then return base end local effective = copy_keyword_info(base) local surf_text = "By [[Nimînok:Ferhengok#surface_analysis|surface analysis]]," local surf_phrase = "by surface analysis," effective.new_sentence = true effective.invisible = "tree" if surf_should_keep_formation_phrase(base) then effective.phrase = surf_phrase .. " " .. base.phrase if base.text then effective.text = surf_text .. " " .. lowercase_glossary_display(base.text) else effective.text = surf_text .. " " .. base.phrase end else effective.text = surf_text effective.phrase = surf_phrase end return effective end -- Build text/phrase for nominalization with <g:code> (uses data module for codes only). local function get_nominalization_label_for_g(code) if not code or code == "" then return nil end local codes = M.data.nominalization_g_codes local adj = codes[code] if not adj and code:find("-", 1, true) then -- ku combines a gender with a number by hyphenating them ("m-p"), where en.wikt runs the -- letters together ("mp"); build the label from the parts. Splitting two-letter codes the -- en.wikt way would mislabel ku codes that are not combinations at all, such as "np" -- (nepersonel). local parts, all_known = {}, true for part in code:gmatch("[^-]+") do local part_adj = codes[part] if part_adj then table.insert(parts, part_adj) else all_known = false end end if all_known and parts[1] then adj = table.concat(parts, " ") end end if not adj then return nil end local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of" local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Nimînok:Ferhengok#nominalization|nominalization]] of", false) return { text = text, phrase = phrase } end local EtymonParser = {} -- Keyword modifier definitions EtymonParser.keyword_param_mods = { unc = { type = "boolean" }, ref = {}, text = { restrict = { keywords = { "from", "derived" } } }, lit = { restrict = { affix_group = true } }, conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc. g = { restrict = { keywords = { "nominalization" } } }, surf = { type = "boolean" }, senseid = { restrict = { keywords = { "semantic loan" } } }, -- Kurdish names, resolved by resolve_modifier_aliases() below. maneid = { alias_of = "senseid", restrict = { keywords = { "semantic loan" } } }, grdk = { alias_of = "conj" }, anlz = { type = "boolean", alias_of = "surf" }, metn = { alias_of = "text", restrict = { keywords = { "from", "derived" } } }, } -- Term modifier definitions EtymonParser.etymon_param_mods = { id = {}, t = {}, tr = {}, ts = {}, q = {}, qq = {}, l = {}, ll = {}, pos = {}, ng = {}, alt = {}, g = {}, ety = {}, lit = {}, unc = { type = "boolean" }, ref = {}, aftype = { restrict = { affix_group = true } }, postype = {}, bor = { type = "boolean", restrict = { affix_group = true } }, slbor = { type = "boolean", restrict = { affix_group = true } }, lbor = { type = "boolean", restrict = { affix_group = true } }, -- Kurdish names for the same modifiers, resolved by resolve_modifier_aliases() below. -- cuda/t/w/crz are the names ku's own templates already accept; the affix-group -- borrowing flags reuse the Kurdish keyword names. cuda = { alias_of = "alt" }, -- ASCII only: Modul:parse utilities matches a modifier prefix with "^([a-zA-Z0-9+_-]+):", -- so a name containing "î" can never be recognised as a prefix. etimon = { alias_of = "ety" }, w = { alias_of = "t" }, crz = { alias_of = "pos" }, crztip = { alias_of = "postype" }, hrf = { alias_of = "lit" }, nediyar = { type = "boolean", alias_of = "unc" }, deyn = { type = "boolean", alias_of = "bor", restrict = { affix_group = true } }, deynh = { type = "boolean", alias_of = "lbor", restrict = { affix_group = true } }, deynhq = { type = "boolean", alias_of = "slbor", restrict = { affix_group = true } }, } --[==[ Move any Kurdish modifier onto the canonical name it aliases, so the rest of the module only ever sees the canonical set. Called right after the inline modifiers are parsed. ]==] function EtymonParser.resolve_modifier_aliases(obj, param_mods) for name, def in pairs(param_mods) do if def.alias_of and obj[name] ~= nil then if obj[def.alias_of] ~= nil then error("`<" .. name .. ":>` and `<" .. def.alias_of .. ":>` are the same modifier; use one.") end obj[def.alias_of] = obj[name] obj[name] = nil end end return obj end local function get_clean_param_mods(param_mods) local clean = {} for mod_name, mod_def in pairs(param_mods) do clean[mod_name] = {} for key, value in pairs(mod_def) do if key ~= "restrict" and key ~= "alias_of" then clean[mod_name][key] = value end end end return clean end function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods) for mod_name, mod_value in pairs(modifiers) do -- Only check restrictions if the modifier has a non-false/nil value if mod_value then local mod_def = param_mods[mod_name] if mod_def and mod_def.restrict then if mod_def.restrict.affix_group then if not is_affix_group_keyword(current_keyword) then local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).") end elseif mod_def.restrict.keywords then local allowed_keywords = mod_def.restrict.keywords local is_allowed = false for _, allowed_keyword in ipairs(allowed_keywords) do if current_keyword == allowed_keyword then is_allowed = true break end end if not is_allowed then local keyword_list = {} for _, kw in ipairs(allowed_keywords) do table.insert(keyword_list, ":" .. kw) end local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ") if #keyword_list > 2 then -- Replace last comma with "or" keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1") end local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".") end end end end end end local TERM_RULE_DISALLOW = { suppress = { field = "suppress_term", label = "suppressed" }, unknown = { field = "unknown_term", label = "unknown" }, family = { field = "is_family", label = "family" }, } function EtymonParser.check_etymon_limits(count, limits, label, opts) if not limits then return end opts = opts or {} local min_etymons = limits.min_etymons if min_etymons == nil and not opts.skip_default_min then min_etymons = 1 end if min_etymons and count < min_etymons then if min_etymons > 1 then error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.") else error("Detected " .. label .. " with no etymons.") end end if limits.max_etymons and count > limits.max_etymons then local unit = (limits.max_etymons == 1) and "etymon" or "etymons" error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".") end end function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label) label = label or "term" if rules and rules.disallow then local disallowed = {} for _, typ in ipairs(rules.disallow) do local spec = TERM_RULE_DISALLOW[typ] if spec and etymon_data[spec.field] then table.insert(disallowed, spec.label) end end if #disallowed > 0 then error(label .. " does not support " .. mw.text.listToText(disallowed, "or") .. " etymons.") end end if etymon_data.is_family then if rules and rules.family == "disallowed" then error(label .. " does not support family codes" .. (rules.family_suffix or ".")) elseif not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end if rules then if rules.require_term and (not etymon_data.term or etymon_data.term == "") then error(label .. " requires a term for each listed form.") end if rules.entry_lang then if Util.get_norm_lang(etymon_data.lang):getFullCode() ~= Util.get_norm_lang(entry_lang):getFullCode() then error(label .. " terms must be in the entry language (" .. entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.") end end if rules.ancestor_check then M.etymology.check_ancestor(entry_lang, etymon_data.lang) end elseif etymon_data.is_family and not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end end function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword) local config = M.data.keywords[keyword] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`") end function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local config = M.data.supplements[supplement_type] EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=") end -- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>") function EtymonParser.parse_keyword_modifiers(param) if type(param) ~= "string" then return nil, {} end local base_keyword = get_keyword_base(param) if not base_keyword then return nil, {} end local canonical_keyword = get_canonical_keyword(base_keyword) -- Check if there are any modifiers if not param:find("<", 1, true) then return canonical_keyword, {} end -- Parse modifiers using the same mechanism as etymon parsing local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods) local function generate_obj(ignored) return {} end local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""), { param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed, EtymonParser.keyword_param_mods) local modifiers = { unc = parsed.unc or false, ref = parsed.ref, text = parsed.text, lit = parsed.lit, conj = parsed.conj, g = parsed.g, surf = parsed.surf or false, senseid = parsed.senseid, } -- Validate modifiers against restrictions EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods) return canonical_keyword, modifiers end local function normalize_keyword_param(keyword_with_mods) local trimmed = M.string_utilities.trim(keyword_with_mods) reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed)) local base = get_keyword_base(trimmed) if not base or not M.data.keywords[base] then error("Invalid keyword '" .. trimmed .. "' in inline etymology") end local canonical_base = get_canonical_keyword(base) local without_colon = trimmed:gsub("^:", "") local mods_part = without_colon:sub(#base + 1) local kw_param = normalize_keyword(canonical_base .. mods_part) EtymonParser.parse_keyword_modifiers(kw_param) return kw_param end local function get_keyword_mod_names() local names = {} for mod_name in pairs(EtymonParser.keyword_param_mods) do names[mod_name] = true end return names end local function parse_inline_ety_run(ety_string) local body = ety_string or "" if body == "" then error("Empty inline etymology") end local keyword_mod_names = get_keyword_mod_names() local pos = 1 local len = #body local function parse_err(msg) error(msg .. " in inline etymology: '" .. body .. "'") end local function peek_double() return body:sub(pos, pos + 1) == "<<" end local function mod_name_from_unwrapped(unwrapped) return unwrapped:match("^<([^:>]+)") end local function is_keyword_mod(unwrapped) local name = mod_name_from_unwrapped(unwrapped) return name and keyword_mod_names[name] or false end local function read_double_bracket() if not peek_double() then return nil end local start = pos pos = pos + 2 while pos <= len - 1 do if body:sub(pos, pos + 1) == ">>" then local token = body:sub(start, pos + 1) pos = pos + 2 return token, token:sub(2, -2) end pos = pos + 1 end parse_err("Unmatched <<") end local function read_angle_cell() if body:sub(pos, pos) ~= "<" or peek_double() then return nil end local open = pos pos = pos + 1 local depth = 1 local i = pos while i <= len do local ch = body:sub(i, i) if ch == "<" then depth = depth + 1 elseif ch == ">" then depth = depth - 1 if depth == 0 then local inner = body:sub(open + 1, i - 1) pos = i + 1 return inner end end i = i + 1 end parse_err("Unmatched <") end local function read_bare_run() local start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end return body:sub(start, pos - 1) end local function absorb_double_keyword_mods(keyword_str) while peek_double() do local saved = pos local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then keyword_str = keyword_str .. unwrapped else pos = saved break end end return keyword_str end local kw_start = pos while pos <= len and body:sub(pos, pos) ~= "<" do pos = pos + 1 end local keyword = body:sub(kw_start, pos - 1) if keyword:match("^%s*$") then parse_err("Missing keyword") end keyword = absorb_double_keyword_mods(keyword) local cells = {} while pos <= len do if peek_double() then local _, unwrapped = read_double_bracket() if is_keyword_mod(unwrapped) then parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword") end table.insert(cells, "+" .. unwrapped) elseif body:sub(pos, pos) == "<" then local inner = read_angle_cell() if inner ~= "" then table.insert(cells, inner) end else local bare = read_bare_run() if bare ~= "" then if bare:sub(1, 1) ~= ":" then parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)") end if not is_keyword(bare, true) then parse_err("Invalid keyword '" .. bare .. "' in inline etymology") end table.insert(cells, absorb_double_keyword_mods(bare)) end end end return { keyword = keyword, cells = cells, } end function EtymonParser.inline_ety_to_pipe(ety_string) local run = parse_inline_ety_run(ety_string) if not run.keyword or run.keyword:match("^%s*$") then return "|" end local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(pipe_parts, normalize_keyword_param(segment)) else table.insert(pipe_parts, segment) end end return "|" .. table.concat(pipe_parts, "|") .. "|" end function EtymonParser.pipe_to_inline_ety(pipe_string) local cells = {} for cell in pipe_string:gmatch("([^|]+)") do if cell ~= "" then table.insert(cells, cell) end end if #cells == 0 then return "" end local inline_parts = {} for index, cell in ipairs(cells) do local base = get_keyword_base(cell) if base and M.data.keywords[base] then local without_colon = cell:gsub("^:", "") local kw_base, mods = without_colon:match("^([^<]+)(.*)$") local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>") if index > 1 then inline_kw = ":" .. inline_kw end table.insert(inline_parts, inline_kw) elseif cell:sub(1, 1) == "+" then local mod = cell:sub(2) if mod:match("^<.->$") then mod = mod:sub(2, -2) end table.insert(inline_parts, "<<" .. mod .. ">>") else table.insert(inline_parts, "<" .. cell .. ">") end end return table.concat(inline_parts, "") end function EtymonParser.parse_inline_ety(ety_string, context_lang) local run = parse_inline_ety_run(ety_string) local keyword = M.string_utilities.trim(run.keyword) reject_removed_surf_keyword(":" .. keyword) if not is_keyword(keyword, true) then error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>") end local args = { context_lang:getCode(), normalize_keyword_param(keyword) } for _, segment in ipairs(run.cells) do if is_keyword(segment, true) then table.insert(args, normalize_keyword_param(segment)) else table.insert(args, segment) end end return args end function EtymonParser.parse_etymon(param, context_lang) if is_keyword(param) then return nil end if type(param) ~= "string" then return nil end local lang, rest local is_family = false local before_bracket = param:match("^([^<]*)") or param local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$") if lang_code then local potential_lang = Util.get_lang(lang_code, true) if potential_lang then lang = potential_lang rest = param:sub(#lang_code + 2) else local potential_family = Util.get_family(lang_code) if potential_family then lang = potential_family rest = param:sub(#lang_code + 2) is_family = true else lang = context_lang rest = param end end else lang = context_lang rest = param end M.tracking.track_term(rest) if rest == "" or rest == "+" then return { lang = lang, term = nil, unknown_term = true, is_family = is_family, } end if rest == "-" then return { lang = lang, term = nil, suppress_term = true, is_family = is_family, } end if not rest:find("<", 1, true) then return { lang = lang, term = M.string_utilities.trim(rest), is_family = is_family, } end local term_text = rest:match("^([^<]*)") or "" local is_unknown = (term_text == "" or term_text == "+") local is_suppress = (term_text == "-") local function generate_obj(ignored_term) return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) } end local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods) local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults, { param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj }) EtymonParser.resolve_modifier_aliases(parsed_obj, EtymonParser.etymon_param_mods) parsed_obj.postype = Util.normalize_pos(parsed_obj.postype) if parsed_obj.id and parsed_obj.id:match("^!") then parsed_obj.id = parsed_obj.id:sub(2) parsed_obj.override = true end parsed_obj.lang = lang parsed_obj.is_family = is_family if is_unknown then parsed_obj.unknown_term = true elseif is_suppress then parsed_obj.suppress_term = true end return parsed_obj end function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code) -- id is now optional, so only validate if provided if id then if mw.ustring.len(id) < 2 then error("The `id` parameter must have at least two characters.") end if id == title or id == Util.get_page_data().pagename then error("The `id` parameter must not be the same as the page title.") end end local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true } if pos and not valid_pos[pos] then error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. " (Kurdish: " .. table.concat(require("Module:table").keysToList(POS_ALIASES), ", ") .. ").") end local current_keyword = "from" local current_keyword_explicit = false local keyword_etymons = {} local keywords = M.data.keywords local function checkKeyword() local config = keywords[current_keyword] if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then keyword_etymons = {} return end EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`") keyword_etymons = {} end local start_index = starts_with_lang_code and 2 or 1 for i = start_index, #args do local param = args[i] if type(param) ~= "string" then elseif param:sub(1, 1) == ":" and not is_keyword(param) then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif is_keyword(param) then checkKeyword() current_keyword = get_canonical_keyword(get_keyword(param)) current_keyword_explicit = true else local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then table.insert(keyword_etymons, param) EtymonParser.check_keyword_term(etymon_data, lang, current_keyword) -- Check modifier restrictions EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods) -- postype must be "root" or "word" local VALID_POSTYPES = { root = true, word = true } if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\" (Kurdish \"reh\" or \"kelîme\").") end if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true) end else table.insert(keyword_etymons, param) end end end checkKeyword() end local DataRetriever = {} local function format_etymon_id_hint(id_data, idx) local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then return '"' .. id .. '"' end if pos and pos ~= "" then return "unnamed (|pos=" .. pos .. "|)" end return "etymon #" .. idx .. " (no |id= on page)" end local function etymon_target_page_link(page, norm_lang) -- `page` is an already-resolved page name ("Jinûvesazî:proto-îranî/hižwáH"), so link to it -- directly. Passing it back through full_link() with a reconstructed language raises an error, -- because the resolved name no longer carries the leading "*" those languages require -- and -- this link is built even when the warning it belongs to is later discarded outside preview. return "[[" .. page .. "]]" end -- Summarize {{etymon}} id slots on a linked page for preview warnings. local function summarize_available_etymon_ids(ids) local id_list = {} local all_idless = true local target_has_idless = false local any_pos = false for i, id_data in ipairs(ids) do local id = type(id_data) == "table" and id_data.id or id_data local pos = type(id_data) == "table" and id_data.pos if id and id ~= "" and id ~= "*" then all_idless = false else target_has_idless = true end if pos and pos ~= "" then any_pos = true end table.insert(id_list, format_etymon_id_hint(id_data, i)) end return { id_list = id_list, all_idless = all_idless, target_has_idless = target_has_idless, any_pos = any_pos, count = #ids, options_text = mw.text.listToText(id_list), } end local function ambiguous_etymon_suggestion(page_link, summary) if summary.all_idless then if summary.any_pos then return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link .. ", then `<id:identifier>` after the term here. Section order / hints: " .. summary.options_text .. "." end return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)." end return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "." end local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(ids) if is_toplevel and summary.target_has_idless then __state.linked_page_multiple_etymons_idless = true end local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count .. " {{etymon}} templates for " .. lang_name .. ")." Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true) end local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon) return cached_args == M.data.STATUS.MISSING and not parent_etymon and #(__state.available_etymon_ids[base_key] or {}) > 0 end local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) if not is_toplevel or __state.skip_partial_etymology_category then return end if not __state.partial_etymology_targets[base_key] then return end if etymon_data.id and type(cached_args) == "table" then return end __state.linked_page_partial_etymology_sections = true end local function is_nonlemma_etymon_template(template_args) return template_args and M.yesno(template_args.nl, false) end local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id) local page_link = etymon_target_page_link(page, norm_lang) local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {}) local lang_name = norm_lang:getCanonicalName() local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id .. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "." Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true) end -- Given an etymon data, scrape its page and cache the result in the global state object. function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel) local content = etymon_title:getContent() if not content then __state.cached_etymon_args[key] = M.data.STATUS.REDLINK return end -- Check if the linked page is a redirect. If it is, the template parsing -- code below will be effectively skipped, and `scrape_page` will be called -- again on the redirect target (see the bottom of this function) local lang_section_for_descendants = nil local redirect_target = etymon_title.redirect_target if not redirect_target then -- ku.wiktionary writes L2 headings as "== {{ziman|CODE}} ==" rather than the language -- name, and this scrape runs on raw wikitext, so the template form has to be tried too. content = M.pages.get_section(content, etymon_lang:getFullName(), 2) or M.pages.get_section(content, "{{ziman|" .. etymon_lang:getFullCode() .. "}}", 2) if not content then __state.cached_etymon_args[key] = M.data.STATUS.MISSING return end lang_section_for_descendants = content end local etymon_lang_code = etymon_lang:getFullCode() local lang_page_key = etymon_lang_code .. ":" .. etymon_page local found_templates_for_lang = {} local found_ids = {} local get_node_class = M.template_parser.class_else_type -- Look for all {{etymon}} templates within the page content using the template parser -- This way the same page is never parsed more than once -- Build a map from senseids to their parent etymonids. local active_etymon_args = nil local etymology_section_count = 0 local etymology_sections_with_etymon = 0 local current_etymology_has_etymon = false local current_etymology_has_nonlemma = false local function finalize_current_etymology_section() if etymology_section_count == 0 then return end if current_etymology_has_etymon or current_etymology_has_nonlemma then etymology_sections_with_etymon = etymology_sections_with_etymon + 1 end current_etymology_has_etymon = false current_etymology_has_nonlemma = false end for node in M.template_parser.parse(content):iterate_nodes() do local node_class = get_node_class(node) if node_class == "heading" then -- A new L2 or etymology section acts as a barrier: an {{etymon}} usage -- used previously cannot be the parent of any subsequent senseids. -- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above. if node:get_name():find(ETYMOLOGY_HEADING) then finalize_current_etymology_section() etymology_section_count = etymology_section_count + 1 active_etymon_args = nil end elseif node_class == "template" then local template_name = node:get_name() if ETYMON_TEMPLATES[template_name] then local template_args = Util.normalize_raw_etymon_args(node:get_arguments()) -- Check if this etymon is for our language if template_args[1] == etymon_lang_code then if is_nonlemma_etymon_template(template_args) then if etymology_section_count > 0 then current_etymology_has_nonlemma = true end else if etymology_section_count > 0 then current_etymology_has_etymon = true end table.insert(found_templates_for_lang, template_args) if template_args.id then local etymon_key = lang_page_key .. ":" .. template_args.id __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, template_args.id) active_etymon_args = template_args else -- Store idless etymon with default key local etymon_key = lang_page_key .. ":*" __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, "*") active_etymon_args = template_args end end end elseif active_etymon_args and template_name == "senseid" then local template_args = node:get_arguments() -- This should always be true for proper usages of {{senseid}}. if template_args[1] == etymon_lang_code and template_args[2] then local sense_id_key = lang_page_key .. ":" .. template_args[2] __state.senseid_parent_etymon[sense_id_key] = active_etymon_args __state.cached_etymon_pages[sense_id_key] = tostring(etymon_page) end end end end finalize_current_etymology_section() if lang_section_for_descendants and etymology_section_count > 1 and etymology_sections_with_etymon > 0 and etymology_sections_with_etymon < etymology_section_count then __state.partial_etymology_targets[lang_page_key] = true end if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then M.descendants.cache_page_checks({ lang_section = lang_section_for_descendants, etymon_lang_code = etymon_lang_code, found_templates_for_lang = found_templates_for_lang, entry_title = __state.entry_title, entry_lang_code = __state.entry_lang_code, entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil, cached_descendants_checks = __state.cached_descendants_checks, lang_page_key = lang_page_key, redirected_from = redirected_from, }) end local id_data_list = {} for _, args in ipairs(found_templates_for_lang) do local id = args.id or "*" table.insert(id_data_list, { id = id, pos = args.pos }) end __state.available_etymon_ids[lang_page_key] = id_data_list if #found_templates_for_lang == 1 then __state.single_etymons[lang_page_key] = found_templates_for_lang[1] end if redirected_from and __state.available_etymon_ids[lang_page_key] then __state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {} for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do table.insert(__state.available_etymon_ids[redirected_from], id_data) end end if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then -- All done! return elseif redirect_target and not redirected_from then -- Try scraping the redirect. etymon_page = redirect_target.prefixedText DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel) __state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id] else __state.cached_etymon_args[key] = M.data.STATUS.MISSING end end local function has_linkable_term(etymon_data) if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then return false end local term = etymon_data.term if term == nil or term == "" then return false end return M.string_utilities.trim(term) ~= "" end local function record_term_id_tracking(etymon_data) if not has_linkable_term(etymon_data) then return end local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang) M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page) end -- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name. function DataRetriever.get_etymon_args(etymon_data, is_toplevel) if not has_linkable_term(etymon_data) then return M.data.STATUS.MISSING, nil, nil, nil end local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page if etymon_data.id then local key = base_key .. ":" .. etymon_data.id local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] if cached_args == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel) end cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh -- Get etymon_id from parent if this was resolved via senseid local parent_etymon = __state.senseid_parent_etymon[key] local resolved_etymon_id = parent_etymon and parent_etymon.id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) end end local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon) if mismatched_id and is_toplevel then __state.has_mismatched_id = true M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id) warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id) end maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel) return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check else __state.used_idless_etymon = true if is_toplevel then __state.toplevel_idless_etymon = true end if __state.available_etymon_ids[base_key] == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel) end local ids = __state.available_etymon_ids[base_key] or {} local count = #ids -- Try to filter by postype if available and we have multiple candidates if count > 1 and etymon_data.postype then local matching_ids = {} for _, id_data in ipairs(ids) do if id_data.pos == etymon_data.postype then table.insert(matching_ids, id_data) end end if #matching_ids == 1 then local matched_id = matching_ids[1].id local matched_key = base_key .. ":" .. matched_id M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id = matched_id }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id = matched_id }, }) end end local matched_args = __state.cached_etymon_args[matched_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel) return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check end end if count == 1 then local only_id_data = ids[1] local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*" M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single") local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id_data = only_id_data }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id_data = only_id_data }, }) end end local single_args = __state.single_etymons[base_key] maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel) return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check elseif count > 1 then M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous") warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel) maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel) return M.data.STATUS.AMBIGUOUS, nil, nil, nil else M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing") maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel) return M.data.STATUS.MISSING, nil, nil, nil end end end local function keyword_invisible_in_tree(keyword_info) if not keyword_info then return false end local inv = keyword_info.invisible return inv == "all" or inv == true or inv == "tree" end -- True when the node has at least one top-level child container visible in the tree. local function node_has_visible_tree_children(node) for _, container in ipairs(node.children or {}) do if not keyword_invisible_in_tree(container.keyword_info) then return true end end return false end -- Count visible term nodes in the tree. local function get_visible_tree_depth(node, skip_child_rendering) local max_depth = 1 if skip_child_rendering or not node then return max_depth end for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if not keyword_invisible_in_tree(keyword_info) then local skip_grandchildren = keyword_info and keyword_info.no_child_categories for _, term in ipairs(container.terms or {}) do if term.is_duplicate then if term.original_has_children then max_depth = math.max(max_depth, 2) end else max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren)) end end end end return max_depth end local function as_param_list(val) if val == nil then return {} end if type(val) == "table" then return val end if type(val) == "string" and val ~= "" then return { val } end return {} end local TreeBuilder = {} local function parse_etymon_references(refs_text) if not refs_text or refs_text == "" then return "" end return M.references.parse_references(refs_text) end local function parse_tree_references(node) if node.ref then node.parsed_ref = parse_etymon_references(node.ref) end if node.children then for _, container in ipairs(node.children) do if container.terms then for _, term in ipairs(container.terms) do parse_tree_references(term) end end end end if node.supplements then for _, supplement in ipairs(node.supplements) do if supplement.terms then for _, term in ipairs(supplement.terms) do parse_tree_references(term) end end end end end -- Build a unique key for deduplication in the seen table function TreeBuilder.build_key(lang, title, args) local norm_lang_code = Util.get_norm_lang(lang):getFullCode() local is_table = type(args) == "table" local id = (is_table and args.id) or "" if title then return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id end if is_table and args.status == M.data.STATUS.INLINE then local content_parts = {} for i = 1, #args do content_parts[i] = tostring(args[i]) end return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0") end return norm_lang_code .. ":*:" .. id end -- Copy parsed etymon modifiers onto a tree/supplement term node. function TreeBuilder.apply_etymon_fields(term, etymon_data) -- A reference without <id:> still resolves when the target page has a single etymon, and the -- node already carries that etymon's own id. Keep it instead of clearing it, so the tree shows -- the target's id as the gloss without every reference having to repeat it. An explicit -- <id:...> still wins. term.id = etymon_data.id or term.id term.t = etymon_data.t term.tr = etymon_data.tr term.ts = etymon_data.ts term.alt = etymon_data.alt term.g = etymon_data.g term.pos = etymon_data.pos term.ng = etymon_data.ng term.ref = etymon_data.ref term.is_uncertain = etymon_data.unc term.lit = etymon_data.lit term.q = etymon_data.q term.qq = etymon_data.qq term.l = etymon_data.l term.ll = etymon_data.ll term.suppress_term = etymon_data.suppress_term term.unknown_term = etymon_data.unknown_term term.is_family = etymon_data.is_family term.override = etymon_data.override term.aftype = etymon_data.aftype term.postype = etymon_data.postype term.bor = etymon_data.bor term.lbor = etymon_data.lbor term.slbor = etymon_data.slbor end function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type) EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type) local term = { lang = etymon_data.lang, title = etymon_data.term, children = {}, status = M.data.STATUS.OK, } TreeBuilder.apply_etymon_fields(term, etymon_data) return term end function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) local terms = {} for _, term_param in ipairs(as_param_list(param_value)) do if type(term_param) == "string" and term_param ~= "" then local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang) if etymon_data then table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)) end end end return terms end -- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=). function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value) local config = M.data.supplements[supplement_type] if not config then error("Unknown supplement '" .. tostring(supplement_type) .. "'.") end local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value) if #terms == 0 then return end data_tree.supplements = data_tree.supplements or {} table.insert(data_tree.supplements, { type = supplement_type, config = config, terms = terms, }) M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true) end function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion) seen = seen or {} depth = depth or 0 local is_toplevel = (depth == 0) if depth > __state.max_depth_reached then __state.max_depth_reached = depth end __state.total_nodes = __state.total_nodes + 1 local lang_code = lang:getCode() __state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1 local current_id = (type(args) == "table" and args.id) or "" local key = TreeBuilder.build_key(lang, title, args) local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK } if type(args) ~= "table" or seen[key] then node.status = args or M.data.STATUS.MISSING -- Mark as duplicate if we've seen this node before if seen[key] then node.is_duplicate = true node.duplicate_key = key local original_node = seen[key] if type(original_node) == "table" and original_node.children and #original_node.children > 0 then node.original_has_children = true end end return node end node.status = args.status or M.data.STATUS.OK seen[key] = node -- If stop_recursion is set, skip parsing children but check for visible children if stop_recursion then local keywords = M.data.keywords local has_visible_children = false for i = 2, #args do local param = args[i] if type(param) == "string" then local keyword_base = get_keyword_base(param) if keyword_base and keywords[keyword_base] then local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param)) if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then has_visible_children = true break end elseif param:sub(1, 1) ~= ":" then -- It's a term (not a keyword), so there are visible children has_visible_children = true break end end end node.has_visible_children = has_visible_children return node end -- Parse args into keyword containers local current_keyword = "from" local current_keyword_modifiers = {} local current_container = nil local function ensure_container() if not current_container or current_container.keyword ~= current_keyword then local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers) current_container = { keyword = current_keyword, keyword_info = keyword_info, keyword_modifiers = current_keyword_modifiers, terms = {}, } table.insert(node.children, current_container) -- Override keyword text/phrase for nominalization with <g:code> if current_keyword_modifiers.g and current_keyword == "nominalization" then local labels = get_nominalization_label_for_g(current_keyword_modifiers.g) if not labels then local codes = {} for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end table.sort(codes) error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", ")) end current_container.keyword_info = copy_keyword_info(keyword_info) current_container.keyword_info.text = labels.text current_container.keyword_info.phrase = labels.phrase end end return current_container end local parse_context_lang = Util.resolve_context_lang(lang, args) for i = 2, #args do local param = args[i] if is_keyword(param) then local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param) if not keyword then error("Invalid keyword '" .. param .. "'.") end current_keyword = keyword current_keyword_modifiers = modifiers current_container = nil -- Force new container for new keyword elseif type(param) == "string" and param:sub(1, 1) == ":" then reject_removed_surf_keyword(param) error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif type(param) == "string" then local etymon_data = EtymonParser.parse_etymon(param, parse_context_lang) if etymon_data then -- Track keyword usage at top level M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel) local term_node = {} local container -- Handle suppress_term (-) and unknown_term (empty or +) directly if etymon_data.suppress_term or etymon_data.unknown_term then container = ensure_container() if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1) else term_node = { lang = etymon_data.lang, children = {}, status = M.data.STATUS.OK, } end TreeBuilder.apply_etymon_fields(term_node, etymon_data) else -- Regular term: fetch arguments from page record_term_id_tracking(etymon_data) local etymon_args, page_of, resolved_etymon_id, descendants_check = DataRetriever.get_etymon_args(etymon_data, is_toplevel) -- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing if etymon_data.ety then if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then __state.current_page_has_inline_etymology = true if is_toplevel then __state.toplevel_has_inline_etymology = true end local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) -- Track inline ety keywords too local inline_keyword = get_keyword(inline_args[2], true) if inline_keyword and #inline_args >= 3 then local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang) if inline_etymon then M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel) end end inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE etymon_args = inline_args term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent else -- Scraped arguments exist, <ety> is redundant and ignored __state.current_page_has_redundant_etymology = true if is_toplevel then __state.toplevel_redundant_etymology = true end end end -- Ensure container exists before checking keyword info container = ensure_container() -- Check if current keyword has no_child_categories - if so, stop recursion local keyword_info = container.keyword_info local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories)) term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion) term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() .. ":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang) term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid term_node.page_of = page_of TreeBuilder.apply_etymon_fields(term_node, etymon_data) term_node.missing_descendants_header, term_node.missing_descendants_entry = M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check) end table.insert(container.terms, term_node) end end end return node end -- Convert etymology tree to JSON-serializable table local function tree_to_json(node) local obj = { term = node.title, lang = node.lang:getCode(), lang_name = node.lang:getCanonicalName(), id = (node.id and node.id ~= "") and node.id or nil, status = node.status, is_uncertain = node.is_uncertain or nil, is_duplicate = node.is_duplicate or nil, gloss = node.t, transliteration = node.tr, transcription = node.ts, alt = node.alt, g = node.g, pos = node.pos, ng = node.ng, children = {}, } for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if keyword_info then local container_obj = { keyword = container.keyword, keyword_label = keyword_info.text, keyword_abbrev = keyword_info.abbrev, is_group = keyword_info.is_group or nil, is_invisible = keyword_info.invisible or nil, is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil, terms = {}, } for _, term in ipairs(container.terms or {}) do table.insert(container_obj.terms, tree_to_json(term)) end table.insert(obj.children, container_obj) end end return obj end -- Build and return the etymology data tree for a given term. function export.get_tree(lang, title, args, options) options = options or {} __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() __state.skip_partial_etymology_category = options.skip_partial_etymology_category == true if options.validate then EtymonParser.validate(lang, args, options.id, title, options.pos, false) end local lang_code = lang:getCode() local start_index = (args[1] == lang_code) and 2 or 1 local tree_args = { [1] = lang_code, id = options.id or args.id } for i = start_index, #args do table.insert(tree_args, args[i]) end __state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args local ety_data_tree = TreeBuilder.build(lang, title, tree_args) parse_tree_references(ety_data_tree) if options.json then return M.JSON.toJSON(tree_to_json(ety_data_tree)) end return ety_data_tree end -- Given a language code, page name and optionally the id= parameter, -- render the tree and only the etymology tree for the relevant page. -- Fetches and parses the corresponding {{etymon}} from the requested page, -- and any further pages needed to render the tree. -- Parameters can be passed either through the #invoke or as -- template parameters *through* an #invoke. function export.render_tree_for_etymon_on_page(frame) local frame_args = frame.args local parent_args = frame:getParent().args local langcode = frame_args[1] or parent_args[1] local pagename = frame_args[2] or parent_args[2] local id = frame_args["id"] or parent_args["id"] local display_title = frame_args["title"] or parent_args["title"] local parsed_title = mw.title.new(pagename, 0) local title if parsed_title.namespace == 0 then title = M.pages.safe_page_name(parsed_title) elseif parsed_title.namespace == RECONSTRUCTION_NS_ID then title = "*" .. M.pages.safe_page_name(parsed_title) else error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace) end local lang = Util.get_lang(langcode) __state.entry_title = title __state.entry_lang_code = lang:getCode() __state.id_stats = M.tracking.new_id_stats() -- Construct etymon_data for DataRetriever.get_args. local etymon_data = { lang = lang, term = title, id = id } local args, pagename = DataRetriever.get_etymon_args(etymon_data, true) if args == M.data.STATUS.MISSING then error("The etymon template was not found (language " .. langcode .. ", title '" .. title .. "'" .. (id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.") end local tree_title = display_title or title if lang:makeEntryName(M.links.remove_links(tree_title)) ~= lang:makeEntryName(M.links.remove_links(title)) then M.tracking.track_title_pagename_mismatch(lang) end reset_invocation_state() local ety_data_tree = export.get_tree(lang, tree_title, args, { validate = true, id = id, }) local output = {} table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) return table.concat(output) end function export.main(frame) local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, M.parameters_data.etymon) args.pos = Util.normalize_pos(args.pos) local lang = args[1] local etymon_args = args[2] local id = args.id local title = args.title local text = args.text local tree = args.tree local etydate = args.etydate local doublet = args.doublet local rfe = args.rfe local etystub = args.etystub local is_nonlemma = M.yesno(args.nl, false) local page_data = Util.get_page_data() if not title then title = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then title = "*" .. title end end local entry_pagename = page_data.pagename if page_data.namespace == RECONSTRUCTION_NS_NAME then entry_pagename = "*" .. entry_pagename end if lang:makeEntryName(M.links.remove_links(title)) ~= lang:makeEntryName(M.links.remove_links(entry_pagename)) then M.tracking.track_title_pagename_mismatch(lang) end local current_L2 = M.pages.get_current_L2() if current_L2 then local norm_lang = Util.get_norm_lang(lang) local norm_name = norm_lang:getCanonicalName() if current_L2 ~= norm_name then local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if norm_lang:getCode() ~= lang:getCode() then lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")" end error("Language '" .. lang_desc .. "' does not match the L2 header (" .. current_L2 .. ").") end end reset_invocation_state() local ety_data_tree = export.get_tree(lang, title, etymon_args, { validate = true, pos = args.pos, id = id, json = args.json, skip_partial_etymology_category = is_nonlemma, }) if args.json then return ety_data_tree end local output = {} local text_allowlist_mode = M.text_allowed.default_mode or "off" if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() .. "; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter." if text_allowlist_mode == "error" then error(msg) else Util.add_warning(msg, true) end end local lang_exc = Util.get_lang_exception(lang) if lang_exc and lang_exc.disallow then local disallow = lang_exc.disallow local error_text = " for " .. lang:getFullName() if disallow.ref then error_text = error_text .. "; see " .. disallow.ref else error_text = error_text .. "." end if tree and disallow.tree then error("Etymology trees are not allowed" .. error_text) end if text and disallow.text then error("Etymology texts are not allowed" .. error_text) end end if etydate then local etydate_param_mods = { ref = { list = true, type = "references", allow_holes = true }, refn = { list = true, allow_holes = true }, nocap = { type = "boolean" }, } local function generate_etydate_obj(etydate_text) local etydate_specs = {} for spec in etydate_text:gmatch("[^,]+") do table.insert(etydate_specs, mw.text.trim(spec)) end return { [1] = etydate_specs } end local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj }) local etydate_args = { [1] = parsed_etydate[1], nocap = parsed_etydate.nocap or false, } ety_data_tree.supplements = ety_data_tree.supplements or {} table.insert(ety_data_tree.supplements, { type = "etydate", etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }), etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil, }) end TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet) if ety_data_tree.supplements then parse_tree_references(ety_data_tree) end local has_visible_children = node_has_visible_tree_children(ety_data_tree) -- Suppress trees for multiword entries and one-step chains local visible_tree_depth = get_visible_tree_depth(ety_data_tree) local is_trivial_tree = visible_tree_depth <= 2 local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil if tree and (is_multiword or is_trivial_tree) then tree = false end if tree then table.insert(output, M.template_styles("Module:etymon/ceribandin/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { pos = "suppress", lit = "suppress", tree_ql = "suppress", gloss = "separate", }) end, })) end local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree)) local anchor = M.anchors.etymonid(lang, id, { no_tree = args.notree, title = title, empty_tree = (not has_visible_children) or tree_disallowed, ety_tree_json = ety_tree_json, }) table.insert(output, anchor) local text_stop_lang_missing = nil if text then local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink if text == "++" then max_depth, stop_at_blue_link = false, false elseif text == "+" then max_depth, stop_at_blue_link = 1, false elseif text == "*" then max_depth, stop_at_blue_link = false, true elseif text:match("^:[^*]+%*$") then -- Stop at a specific language OR first bluelink after it, e.g., ":ota*" -- If the target language is a redlink, continue to the first bluelink local lang_code = text:match("^:([^*]+)%*$") if lang_code and lang_code ~= "" then local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang_or_bluelink = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end elseif text:sub(1, 1) == ":" then -- Stop at a specific language, e.g., ":ar" stops at first Arabic term local lang_code = text:sub(2) if lang_code ~= "" then -- Validate the language code local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else local num = tonumber(text) if num and num >= 1 then max_depth, stop_at_blue_link = num, false else error('Invalid text value "' .. text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)') end end local text_output, text_render_meta = M.text.render({ data_tree = ety_data_tree, format_term_func = Util.format_term, lang_matches_stop_code = Util.lang_matches_stop_code, max_depth = max_depth, stop_at_blue_link = stop_at_blue_link, curr_page = page_data.pagename, nodot = args.nodot, dot = args.dot, stop_at_lang = stop_at_lang, stop_at_lang_or_bluelink = stop_at_lang_or_bluelink, }) table.insert(output, text_output) if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then M.tracking.track_text_stop_lang_missing(lang, stop_at_lang) text_stop_lang_missing = stop_at_lang end end if rfe then table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode())) end if etystub then table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode())) end if is_nonlemma then table.insert(output, " " .. frame:expandTemplate({ title = "nonlemma", args = {}, })) end local categories = {} if Util.is_content_page() then M.tracking.track_tree_metrics({ max_depth_reached = __state.max_depth_reached, total_nodes = __state.total_nodes, language_count = __state.language_count, lang = lang, }) categories = M.categories.build({ data_tree = ety_data_tree, page_lang = lang, available_etymon_ids = __state.available_etymon_ids, senseid_parent_etymon = __state.senseid_parent_etymon, get_norm_lang_func = Util.get_norm_lang, lang_exc = lang_exc, suppress_categories = lang_exc and lang_exc.suppress_categories, nocat = args.nocat, tree = tree, text = text, exnihilo = args.exnihilo, toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology, toplevel_redundant_etymology = __state.toplevel_redundant_etymology, toplevel_idless_etymon = __state.toplevel_idless_etymon, has_mismatched_id = __state.has_mismatched_id, linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless, linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections, text_stop_lang_missing = text_stop_lang_missing, }) M.tracking.track_keywords(__state.toplevel_keyword_stats, lang) M.tracking.track_page_id(lang, id) M.tracking.track_ids(__state.id_stats, lang) end if #categories > 0 then table.insert(output, M.categories.format(categories, lang)) end if __state.warnings then for i, warning in ipairs(__state.warnings) do table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n") end end return table.concat(output) end return export jp7jqevefvzul0r8ehk0js66xswglzg Modul:etymon/tree/ceribandin 828 1359185 6532034 6434862 2026-09-18T16:07:32Z Wikihez 7344 sync test copy 6532034 Scribunto text/plain local export = {} local html_create = mw.html.create local max = math.max --[==[ The language label on a tree node: a link to the language's category with the first letter capitalised, the way Modul:etymon kevn rendered it. Families and anything without a category fall back to the plain canonical name. ]==] local function language_label(lang) if lang and lang.makeCategoryLink then local ok, link = pcall(lang.makeCategoryLink, lang) if ok and link and link ~= "" then return link end end local name = lang and lang:getCanonicalName() or "" return mw.ustring.upper(mw.ustring.sub(name, 1, 1)) .. mw.ustring.sub(name, 2) end local function create_vertical_connector() return html_create('span'):addClass('etytree-connector-vertical') end local function create_abbr(text, title, glossary) local abbr = html_create('abbr') :attr('title', title) :wikitext(text) if glossary then abbr = '[[Nimînok:Ferhengok#' .. glossary .. '|' .. tostring(abbr) .. ']]' end return html_create('span'):addClass('etytree-label'):node(abbr) end local function create_uncertainty_marker() return html_create('abbr') :addClass('etytree-unc') :attr('title', 'nediyar') :wikitext('?') end local function create_label_container() return html_create('span'):addClass('etytree-label-container') end local function invisible_in_tree(inv) return inv == "all" or inv == true or inv == "tree" end local function render_label(term_block, keyword_info, keyword_modifiers, is_uncertain, is_group_child, term_labels) -- Skip label when invisible in tree local has_label = keyword_info and keyword_info.abbrev and not is_group_child and not invisible_in_tree(keyword_info.invisible) -- For group children, keyword uncertainty is shown on the group label, not on individual terms local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc and not is_group_child local show_term_uncertainty = is_uncertain -- Check if we have term-specific labels local has_term_labels = term_labels and #term_labels > 0 if not has_label and not show_term_uncertainty and not keyword_uncertain and not has_term_labels then return end local label_span = create_label_container() if has_label then local glossary_title = keyword_info.glossary and keyword_info.glossary:gsub("_", " ") or keyword_info.abbrev label_span:node(create_abbr( keyword_info.abbrev, glossary_title, keyword_info.glossary )) -- Show uncertainty marker if term or keyword is uncertain if show_term_uncertainty or keyword_uncertain then label_span:node(create_uncertainty_marker()) end else -- No label, but term or keyword is uncertain if show_term_uncertainty or keyword_uncertain then label_span:node(create_uncertainty_marker()) end end -- Add term-specific labels if has_term_labels then for _, label_info in ipairs(term_labels) do label_span:node(create_abbr(label_info.abbrev, label_info.title, label_info.glossary)) end end term_block:node(label_span) end local function render_term_block(node_data, format_term_func, is_toplevel) local link_content = html_create() link_content :tag('span') :addClass('etyl') :wikitext(language_label(node_data.lang)) :done() local term_text, gloss = format_term_func(node_data, is_toplevel) if term_text then link_content :wikitext('<br>') :tag('span') :addClass('etytree-term') :wikitext(term_text) :done() end -- The meaning goes on its own line, smaller and in italics, instead of in (“...”) brackets. if gloss then link_content :wikitext('<br>') :tag('span') :addClass('etytree-gloss') :wikitext(gloss) :done() end local block = html_create('div'):addClass('etytree-block'):node(link_content) -- Reconstructed languages get their own tint, so an unattested step is obvious at a glance. local lang = node_data.lang if lang and lang.hasType then local ok, is_recon = pcall(lang.hasType, lang, "reconstructed") if ok and is_recon then block:addClass('etytree-reconstructed') end end -- Add duplicate styling if this is a duplicate node if node_data.is_duplicate then block:addClass('etytree-duplicate') end return block end local function create_dotted_connector() return html_create('span'):addClass('etytree-connector-dotted') end -- Create an L-shaped connector for nodes with hidden ancestry (duplicate or no_child_categories) local function create_duplicate_connector() local container = html_create('div'):addClass('etytree-duplicate-connector') local inner_wrapper = container:tag('div') inner_wrapper:tag('span'):addClass('etytree-dup-right') inner_wrapper:tag('span'):addClass('etytree-dup-horiz') inner_wrapper:tag('span'):addClass('etytree-dup-left') inner_wrapper:tag('span'):addClass('etytree-dup-arrow'):wikitext('▲') return container end local function render_group_label(connecting_line, keyword_info, keyword_modifiers) local has_abbrev = keyword_info and keyword_info.abbrev local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc -- Nothing to show if no abbrev and no uncertainty if not has_abbrev and not keyword_uncertain then return end local label_span = connecting_line:tag('span'):addClass('etytree-group-label') if has_abbrev then local glossary_title = keyword_info.glossary and keyword_info.glossary:gsub("_", " ") or keyword_info.abbrev label_span:node(create_abbr(keyword_info.abbrev, glossary_title, nil)) end -- Add uncertainty marker if keyword has <unc> modifier if keyword_uncertain then label_span:node(create_uncertainty_marker()) end end local function add_branch_connector(column, index, total) if index == 1 then column:tag('span'):addClass('etytree-branch-left') elseif index == total then column:tag('span'):addClass('etytree-branch-right') else column:tag('span'):addClass('etytree-connector-vertical-short') column:tag('span'):addClass('etytree-branch-mid') end end function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func -- Forward declaration local render_term -- Render a container (keyword + its terms) local function render_container(container, is_toplevel) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local is_group = keyword_info and keyword_info.is_group local terms = container.terms or {} -- Skip container entirely only when invisible = "all" (or true) if keyword_info and invisible_in_tree(keyword_info.invisible) then return nil, 0, 0 end if #terms == 0 then return nil, 0, 0 end -- For no_child_categories keywords (calque, semantic loan, etc.), don't render term's children local skip_child_rendering = keyword_info and keyword_info.no_child_categories -- Render each term in the container local rendered_terms = {} local container_height = 0 local container_width = 0 for _, term in ipairs(terms) do -- Collect term-specific labels local term_labels = {} if term.bor then table.insert(term_labels, { abbrev = "bor.", title = "borrowed", glossary = "loanword" }) end if term.slbor then table.insert(term_labels, { abbrev = "slbor.", title = "semi-learned borrowing", glossary = "semi-learned_borrowing" }) end if term.lbor then table.insert(term_labels, { abbrev = "lbor.", title = "learned borrowing", glossary = "learned_borrowing" }) end local term_tree, term_height, term_width = render_term(term, keyword_info, keyword_modifiers, is_group, false, skip_child_rendering, term_labels) table.insert(rendered_terms, { tree = term_tree, height = term_height, width = term_width, is_uncertain = term.is_uncertain, }) container_height = max(container_height, term_height) container_width = container_width + term_width end local rendered_html local has_connector = false if #rendered_terms == 1 then -- Single term: just return it directly rendered_html = rendered_terms[1].tree container_height = rendered_terms[1].height container_width = rendered_terms[1].width else -- Multiple terms: group them together local subtree_container = html_create('div'):addClass('etytree-branch-group') for i, term_data in ipairs(rendered_terms) do local column = html_create('div'):addClass('etytree-branch') column:node(term_data.tree) add_branch_connector(column, i, #rendered_terms) subtree_container:node(column) end local connecting_line = create_vertical_connector() -- Add group label for group keywords if is_group and not invisible_in_tree(keyword_info.invisible) then render_group_label(connecting_line, keyword_info, keyword_modifiers) end rendered_html = html_create() :node(subtree_container) :node(connecting_line) has_connector = true end return rendered_html, container_height, container_width, has_connector end -- Render a term node render_term = function(term_node, keyword_info, keyword_modifiers, is_group_child, is_toplevel_term, skip_child_rendering, term_labels) local tree_width, tree_height = 0, 0 local subtrees = {} -- Process term's children (which are containers) local has_hidden_children = false if not term_node.is_duplicate and not skip_child_rendering then for _, container in ipairs(term_node.children or {}) do local subtree, sub_height, sub_width, subtree_has_connector = render_container(container, is_toplevel_term) if subtree then table.insert(subtrees, { tree = subtree, height = sub_height, width = sub_width, has_connector = subtree_has_connector, }) tree_height = max(tree_height, sub_height) tree_width = tree_width + sub_width end end elseif skip_child_rendering then -- Check if there are any visible children -- When stop_recursion is true, children aren't parsed, but has_visible_children flag is set if term_node.has_visible_children then has_hidden_children = true elseif term_node.children and #term_node.children > 0 then -- Fallback: check parsed children for visibility for _, container in ipairs(term_node.children) do local child_keyword_info = container.keyword_info if not (child_keyword_info and (child_keyword_info.invisible == "all" or child_keyword_info.invisible == true)) then has_hidden_children = true break end end end end local is_toplevel_node = (keyword_info == nil) local term_block = render_term_block(term_node, format_term_func, is_toplevel_node) render_label(term_block, keyword_info, keyword_modifiers, term_node.is_uncertain, is_group_child, term_labels or {}) local term_html = html_create() if #subtrees == 0 then local show_connector = (term_node.is_duplicate and term_node.original_has_children) or has_hidden_children if show_connector then term_html:node(create_duplicate_connector()) end term_html:node(term_block) tree_width = tree_width + 1 elseif #subtrees == 1 then term_html:node(subtrees[1].tree) if not subtrees[1].has_connector then term_html:node(create_vertical_connector()) end term_html:node(term_block) else -- Multiple containers: need to merge them local subtree_container = html_create('div'):addClass('etytree-branch-group') for i, subtree_data in ipairs(subtrees) do local column = html_create('div'):addClass('etytree-branch') column:node(subtree_data.tree) add_branch_connector(column, i, #subtrees) subtree_container:node(column) end local connecting_line = create_vertical_connector() term_html :node(subtree_container) :node(connecting_line) :node(term_block) end return term_html, tree_height + 1, tree_width end local final_tree, final_height, final_width = render_term(data_tree, nil, nil, false, true) local container = html_create('div') :addClass('etytree-body') :node(final_tree) return tostring(html_create('div') :addClass('etytree NavFrame') :attr('data-etytree-height', final_height) :attr('data-etytree-width', final_width) :tag('div') :addClass('NavHead') :tag('div') :wikitext('Dara etîmolojiyê') :done() :done() :tag('div') :addClass('NavContent') :node(container) :done()) end return export 1o0dfpodiydpoylwbnjvcamsapwx2o8 6532036 6532034 2026-09-18T16:10:40Z Wikihez 7344 sync test copy 6532036 Scribunto text/plain local export = {} local html_create = mw.html.create local max = math.max --[==[ The language label on a tree node: a link to the language's category with the first letter capitalised, the way Modul:etymon kevn rendered it. Families and anything without a category fall back to the plain canonical name. ]==] local function language_label(lang) if lang and lang.makeCategoryLink then local ok, link = pcall(lang.makeCategoryLink, lang) if ok and link and link ~= "" then return link end end local name = lang and lang:getCanonicalName() or "" return mw.ustring.upper(mw.ustring.sub(name, 1, 1)) .. mw.ustring.sub(name, 2) end local function create_vertical_connector() return html_create('span'):addClass('etytree-connector-vertical') end local function create_abbr(text, title, glossary) local abbr = html_create('abbr') :attr('title', title) :wikitext(text) if glossary then -- Like Modul:etymon/data: a bare anchor sits on the glossary page, "Rûpel#lenger" is a full target. local page, anchor = glossary:match("^(.-)#(.+)$") if not page then page, anchor = "Nimînok:Ferhengok", glossary end abbr = '[[' .. page .. '#' .. anchor:gsub(" ", "_") .. '|' .. tostring(abbr) .. ']]' end return html_create('span'):addClass('etytree-label'):node(abbr) end local function create_uncertainty_marker() return html_create('abbr') :addClass('etytree-unc') :attr('title', 'nediyar') :wikitext('?') end local function create_label_container() return html_create('span'):addClass('etytree-label-container') end local function invisible_in_tree(inv) return inv == "all" or inv == true or inv == "tree" end local function render_label(term_block, keyword_info, keyword_modifiers, is_uncertain, is_group_child, term_labels) -- Skip label when invisible in tree local has_label = keyword_info and keyword_info.abbrev and not is_group_child and not invisible_in_tree(keyword_info.invisible) -- For group children, keyword uncertainty is shown on the group label, not on individual terms local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc and not is_group_child local show_term_uncertainty = is_uncertain -- Check if we have term-specific labels local has_term_labels = term_labels and #term_labels > 0 if not has_label and not show_term_uncertainty and not keyword_uncertain and not has_term_labels then return end local label_span = create_label_container() if has_label then local glossary_title = keyword_info.glossary and keyword_info.glossary:gsub("_", " ") or keyword_info.abbrev label_span:node(create_abbr( keyword_info.abbrev, glossary_title, keyword_info.glossary )) -- Show uncertainty marker if term or keyword is uncertain if show_term_uncertainty or keyword_uncertain then label_span:node(create_uncertainty_marker()) end else -- No label, but term or keyword is uncertain if show_term_uncertainty or keyword_uncertain then label_span:node(create_uncertainty_marker()) end end -- Add term-specific labels if has_term_labels then for _, label_info in ipairs(term_labels) do label_span:node(create_abbr(label_info.abbrev, label_info.title, label_info.glossary)) end end term_block:node(label_span) end local function render_term_block(node_data, format_term_func, is_toplevel) local link_content = html_create() link_content :tag('span') :addClass('etyl') :wikitext(language_label(node_data.lang)) :done() local term_text, gloss = format_term_func(node_data, is_toplevel) if term_text then link_content :wikitext('<br>') :tag('span') :addClass('etytree-term') :wikitext(term_text) :done() end -- The meaning goes on its own line, smaller and in italics, instead of in (“...”) brackets. if gloss then link_content :wikitext('<br>') :tag('span') :addClass('etytree-gloss') :wikitext(gloss) :done() end local block = html_create('div'):addClass('etytree-block'):node(link_content) -- Reconstructed languages get their own tint, so an unattested step is obvious at a glance. local lang = node_data.lang if lang and lang.hasType then local ok, is_recon = pcall(lang.hasType, lang, "reconstructed") if ok and is_recon then block:addClass('etytree-reconstructed') end end -- Add duplicate styling if this is a duplicate node if node_data.is_duplicate then block:addClass('etytree-duplicate') end return block end local function create_dotted_connector() return html_create('span'):addClass('etytree-connector-dotted') end -- Create an L-shaped connector for nodes with hidden ancestry (duplicate or no_child_categories) local function create_duplicate_connector() local container = html_create('div'):addClass('etytree-duplicate-connector') local inner_wrapper = container:tag('div') inner_wrapper:tag('span'):addClass('etytree-dup-right') inner_wrapper:tag('span'):addClass('etytree-dup-horiz') inner_wrapper:tag('span'):addClass('etytree-dup-left') inner_wrapper:tag('span'):addClass('etytree-dup-arrow'):wikitext('▲') return container end local function render_group_label(connecting_line, keyword_info, keyword_modifiers) local has_abbrev = keyword_info and keyword_info.abbrev local keyword_uncertain = keyword_modifiers and keyword_modifiers.unc -- Nothing to show if no abbrev and no uncertainty if not has_abbrev and not keyword_uncertain then return end local label_span = connecting_line:tag('span'):addClass('etytree-group-label') if has_abbrev then local glossary_title = keyword_info.glossary and keyword_info.glossary:gsub("_", " ") or keyword_info.abbrev label_span:node(create_abbr(keyword_info.abbrev, glossary_title, nil)) end -- Add uncertainty marker if keyword has <unc> modifier if keyword_uncertain then label_span:node(create_uncertainty_marker()) end end local function add_branch_connector(column, index, total) if index == 1 then column:tag('span'):addClass('etytree-branch-left') elseif index == total then column:tag('span'):addClass('etytree-branch-right') else column:tag('span'):addClass('etytree-connector-vertical-short') column:tag('span'):addClass('etytree-branch-mid') end end function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func -- Forward declaration local render_term -- Render a container (keyword + its terms) local function render_container(container, is_toplevel) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local is_group = keyword_info and keyword_info.is_group local terms = container.terms or {} -- Skip container entirely only when invisible = "all" (or true) if keyword_info and invisible_in_tree(keyword_info.invisible) then return nil, 0, 0 end if #terms == 0 then return nil, 0, 0 end -- For no_child_categories keywords (calque, semantic loan, etc.), don't render term's children local skip_child_rendering = keyword_info and keyword_info.no_child_categories -- Render each term in the container local rendered_terms = {} local container_height = 0 local container_width = 0 for _, term in ipairs(terms) do -- Collect term-specific labels local term_labels = {} if term.bor then table.insert(term_labels, { abbrev = "bor.", title = "borrowed", glossary = "loanword" }) end if term.slbor then table.insert(term_labels, { abbrev = "slbor.", title = "semi-learned borrowing", glossary = "semi-learned_borrowing" }) end if term.lbor then table.insert(term_labels, { abbrev = "lbor.", title = "learned borrowing", glossary = "learned_borrowing" }) end local term_tree, term_height, term_width = render_term(term, keyword_info, keyword_modifiers, is_group, false, skip_child_rendering, term_labels) table.insert(rendered_terms, { tree = term_tree, height = term_height, width = term_width, is_uncertain = term.is_uncertain, }) container_height = max(container_height, term_height) container_width = container_width + term_width end local rendered_html local has_connector = false if #rendered_terms == 1 then -- Single term: just return it directly rendered_html = rendered_terms[1].tree container_height = rendered_terms[1].height container_width = rendered_terms[1].width else -- Multiple terms: group them together local subtree_container = html_create('div'):addClass('etytree-branch-group') for i, term_data in ipairs(rendered_terms) do local column = html_create('div'):addClass('etytree-branch') column:node(term_data.tree) add_branch_connector(column, i, #rendered_terms) subtree_container:node(column) end local connecting_line = create_vertical_connector() -- Add group label for group keywords if is_group and not invisible_in_tree(keyword_info.invisible) then render_group_label(connecting_line, keyword_info, keyword_modifiers) end rendered_html = html_create() :node(subtree_container) :node(connecting_line) has_connector = true end return rendered_html, container_height, container_width, has_connector end -- Render a term node render_term = function(term_node, keyword_info, keyword_modifiers, is_group_child, is_toplevel_term, skip_child_rendering, term_labels) local tree_width, tree_height = 0, 0 local subtrees = {} -- Process term's children (which are containers) local has_hidden_children = false if not term_node.is_duplicate and not skip_child_rendering then for _, container in ipairs(term_node.children or {}) do local subtree, sub_height, sub_width, subtree_has_connector = render_container(container, is_toplevel_term) if subtree then table.insert(subtrees, { tree = subtree, height = sub_height, width = sub_width, has_connector = subtree_has_connector, }) tree_height = max(tree_height, sub_height) tree_width = tree_width + sub_width end end elseif skip_child_rendering then -- Check if there are any visible children -- When stop_recursion is true, children aren't parsed, but has_visible_children flag is set if term_node.has_visible_children then has_hidden_children = true elseif term_node.children and #term_node.children > 0 then -- Fallback: check parsed children for visibility for _, container in ipairs(term_node.children) do local child_keyword_info = container.keyword_info if not (child_keyword_info and (child_keyword_info.invisible == "all" or child_keyword_info.invisible == true)) then has_hidden_children = true break end end end end local is_toplevel_node = (keyword_info == nil) local term_block = render_term_block(term_node, format_term_func, is_toplevel_node) render_label(term_block, keyword_info, keyword_modifiers, term_node.is_uncertain, is_group_child, term_labels or {}) local term_html = html_create() if #subtrees == 0 then local show_connector = (term_node.is_duplicate and term_node.original_has_children) or has_hidden_children if show_connector then term_html:node(create_duplicate_connector()) end term_html:node(term_block) tree_width = tree_width + 1 elseif #subtrees == 1 then term_html:node(subtrees[1].tree) if not subtrees[1].has_connector then term_html:node(create_vertical_connector()) end term_html:node(term_block) else -- Multiple containers: need to merge them local subtree_container = html_create('div'):addClass('etytree-branch-group') for i, subtree_data in ipairs(subtrees) do local column = html_create('div'):addClass('etytree-branch') column:node(subtree_data.tree) add_branch_connector(column, i, #subtrees) subtree_container:node(column) end local connecting_line = create_vertical_connector() term_html :node(subtree_container) :node(connecting_line) :node(term_block) end return term_html, tree_height + 1, tree_width end local final_tree, final_height, final_width = render_term(data_tree, nil, nil, false, true) local container = html_create('div') :addClass('etytree-body') :node(final_tree) return tostring(html_create('div') :addClass('etytree NavFrame') :attr('data-etytree-height', final_height) :attr('data-etytree-width', final_width) :tag('div') :addClass('NavHead') :tag('div') :wikitext('Dara etîmolojiyê') :done() :done() :tag('div') :addClass('NavContent') :node(container) :done()) end return export g28ydu0v7itj59qfvz5j478j5n9s9qj Modul:etymon/text/ceribandin 828 1359186 6532029 6433856 2026-09-18T15:52:59Z Wikihez 7344 sync test copy 6532029 Scribunto text/plain local export = {} local loader = require("Module:module loader") local M = loader.init({ require = { en_utilities = "Module:en-utilities", references = "Module:references", senseno = "Module:senseno", }, loadData = { data = "Module:etymon/data/ceribandin", }, }) function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func local max_depth = opts.max_depth local stop_at_blue_link = opts.stop_at_blue_link local curr_page = opts.curr_page local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0" local function explicit_dot_override() if opts.dot == nil or opts.dot == false then return nil end local d = mw.text.trim(tostring(opts.dot)) if d == "" or d == "." then return nil end return d end local dot_override = explicit_dot_override() local function find_deepest_last_part(tree) if not tree or not tree.container_parts or #tree.container_parts == 0 then return nil end local last_part = tree.container_parts[#tree.container_parts] if last_part.continuation then return find_deepest_last_part(last_part.continuation) end return last_part end local function apply_final_punctuation_override(tree, punct) if not tree or punct == nil then return end local last_part = find_deepest_last_part(tree) if last_part then last_part.punctuation = punct end end local function apply_closing_punctuation_override(tree, is_last_segment) if not is_last_segment then return end local punct if nodot then punct = "" elseif dot_override ~= nil then punct = dot_override else return end apply_final_punctuation_override(tree, punct) end local function has_supplements() return data_tree.supplements and #data_tree.supplements > 0 end local stop_at_lang = opts.stop_at_lang local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink local lang_matches_stop_code = opts.lang_matches_stop_code local stop_lang_reached = false local function term_matches_stop_code(term_lang, stop_code) if lang_matches_stop_code then return lang_matches_stop_code(term_lang, stop_code) end return term_lang and term_lang:getCode() == stop_code end local children = data_tree.children local function has_text_supplements() if not data_tree.supplements then return false end for _, supplement in ipairs(data_tree.supplements) do if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then return true end if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then return true end end return false end if (not children or #children == 0) and not has_text_supplements() then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page local entry_lang = data_tree.lang local function lowercase_glossary_link_display(wikitext) return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain) local senseids = mw.text.split(senseid, "!!", true) local senseno_parts = {} for i, id in ipairs(senseids) do id = mw.text.trim(id) if id ~= "" then table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, { title = curr_page, uc = (i == 1 and capitalize_senseno) or nil, })) end end if #senseno_parts == 0 then return keyword_text, keyword_phrase end local senseno_text = mw.text.listToText(senseno_parts) local glossary_link = (keyword_text or ""):gsub(" from$", "") local glossary_lower = lowercase_glossary_link_display(glossary_link) if #senseno_parts > 1 then local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]") if is_uncertain then return senseno_text .. " are possibly " .. plural_link .. " from", senseno_text .. " are possibly semantic loans from" end return senseno_text .. " are " .. plural_link .. " from", senseno_text .. " are semantic loans from" end if is_uncertain then return senseno_text .. " is possibly a " .. glossary_lower .. " from", senseno_text .. " is possibly a semantic loan from" end return senseno_text .. " is a " .. glossary_lower .. " from", senseno_text .. " is a semantic loan from" end -- Get refs for a term local function get_term_refs(term, term_lang, depth) local term_l2 = term_lang:getFullCode() .. ":" .. curr_page if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then return M.references.format_references(term.parsed_ref) end return "" end -- Build a text part for a single term local function build_term_part(term, current_lang, depth) local text = "" local new_lang = current_lang local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName() -- Use centralized format_term (handles suppress_term, unknown_term, and regular terms) local term_text = format_term_func(term) if lang_changed then new_lang = term.lang if term_text then text = term.lang:makeWikipediaLink() .. " " .. term_text elseif term.is_family then text = "zimanên " .. term.lang:makeWikipediaLink() else -- suppress_term with language change: show only language text = term.lang:makeWikipediaLink() end else text = term_text or "" end return { type = "term", text = text, refs = get_term_refs(term, new_lang, depth), lang = new_lang, is_uncertain = term.is_uncertain or false, } end -- Build text parts for a container local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local terms = container.terms or {} if not keyword_info or #terms == 0 then return nil end -- Skip building text part when invisible in text ("all", "text", or true) local inv = keyword_info.invisible if inv == "all" or inv == true or inv == "text" then return nil end local is_group = keyword_info.is_group local keyword_uncertain = keyword_modifiers.unc or false -- Determine text and phrase (allowing for overrides) local intro_text = keyword_info.text local phrase = keyword_info.phrase local new_sentence = keyword_info.new_sentence or false if keyword_modifiers.text then -- User-provided override: assumed to be lowercase phrase = keyword_modifiers.text -- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from") intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2) end -- Get keyword references local keyword_refs = "" if keyword_modifiers.ref then local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref) if parsed_keyword_refs and parsed_keyword_refs ~= "" then keyword_refs = M.references.format_references(parsed_keyword_refs) end end -- Build term parts local term_parts = {} local current_lang = node.lang for _, term in ipairs(terms) do local term_part = build_term_part(term, current_lang, depth) if term_part.text ~= "" then table.insert(term_parts, term_part) current_lang = term_part.lang end end -- Check uncertainty distribution local uncertain_count = 0 for _, term_part in ipairs(term_parts) do if term_part.is_uncertain then uncertain_count = uncertain_count + 1 end end -- If keyword itself is uncertain, treat all terms as uncertain local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0) if is_group and uncertain_count > 0 then all_uncertain = true end local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0 -- Check if there are more steps (only if continuation is allowed) local has_more_steps = false local next_node = nil local first_term = terms[1] -- Check if we should stop at this language local reached_stop_lang = false if stop_at_lang then for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then reached_stop_lang = true stop_lang_reached = true break end end elseif stop_at_lang_or_bluelink then -- Check if we should stop at this language, or at the first bluelink if it's a redlink for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then if first_term.status == M.data.STATUS.OK then reached_stop_lang = true else fallback_to_bluelink = true end break end end if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then reached_stop_lang = true end end if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then local first_term_children = first_term.children if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then local next_container = first_term_children[1] local next_keyword_info = next_container and next_container.keyword_info if not (next_keyword_info and next_keyword_info.invisible) then if stop_at_blue_link then if first_term.status ~= M.data.STATUS.OK then has_more_steps = true next_node = first_term end else has_more_steps = true next_node = first_term end end end end return { type = "container", intro_text = intro_text, phrase = phrase, senseid = keyword_modifiers.senseid, sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil, is_uncertain = all_uncertain, has_mixed_uncertainty = has_mixed_uncertainty, term_parts = term_parts, is_group = is_group, has_more_steps = has_more_steps, next_node = next_node, new_sentence = new_sentence, separate_clause = keyword_info.separate_clause or false, conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc. lit = keyword_modifiers.lit, keyword_refs = keyword_refs, fallback_to_bluelink = fallback_to_bluelink, } end -- Build the full tree of text parts local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink) local containers = node.children if not containers or #containers == 0 then return nil end local container_parts = {} -- Count containers that get a text part (invisible in text = "all", "text", or true) local visible_container_count = 0 for _, container in ipairs(containers) do local keyword_info = container.keyword_info local inv = keyword_info and keyword_info.invisible if not (inv == "all" or inv == true or inv == "text") then visible_container_count = visible_container_count + 1 end end -- If there are multiple visible containers at this level, don't allow continuation for any local has_multiple_containers = visible_container_count > 1 local should_allow_continuation = allow_continuation and not has_multiple_containers for _, container in ipairs(containers) do local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink) if part then -- Recursively build children if there are more steps if part.has_more_steps and part.next_node then part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink) end table.insert(container_parts, part) end end if #container_parts == 0 then return nil end return { type = "tree", container_parts = container_parts, depth = depth, } end -- Check if tree has mixed joining types local function container_join_kind(part) if part.type == "etydate" then return nil end if part.new_sentence or part.separate_clause then return "supplement" end return "or_join" end local function check_complexity(tree) if not tree then return nil end local parts = tree.container_parts if #parts <= 1 then -- Single container if parts[1] and parts[1].continuation then return check_complexity(parts[1].continuation) end return nil end -- Or-join containers must precede any supplemental (calque-like / influence) containers. local seen_supplement = false for _, part in ipairs(parts) do local kind = container_join_kind(part) if kind == "supplement" then seen_supplement = true elseif kind == "or_join" and seen_supplement then error( "Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.") end end for _, part in ipairs(parts) do if part.continuation then check_complexity(part.continuation) end end return nil end -- Analyze tree and assign punctuation local function analyze_punctuation(tree, is_toplevel) if not tree then return end local parts = tree.container_parts local num_parts = #parts for i, part in ipairs(parts) do local is_first = (i == 1) local is_last = (i == num_parts) local next_part = parts[i + 1] -- Analyze term punctuation within container if part.term_parts then -- Terms use Oxford comma style: "A, B, yan jî C" -- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and") local num_terms = #part.term_parts local term_conj = part.conj or "yan jî" -- Kurdish default for j, term_part in ipairs(part.term_parts) do local is_last_term = (j == num_terms) if part.is_group then -- Group: terms joined with " + " term_part.joiner = is_last_term and "" or " + " elseif num_terms > 1 then -- Multiple terms not in a group: Oxford comma style if is_last_term then term_part.joiner = "" elseif j == num_terms - 1 then -- Second to last term if num_terms == 2 then term_part.joiner = " " .. term_conj .. " " else term_part.joiner = ", " .. term_conj .. " " end else term_part.joiner = ", " end else -- Single term term_part.joiner = "" end end end -- Determine container punctuation based on what comes next if part.continuation then -- Has continuation part.punctuation = "," -- Recursively analyze continuation analyze_punctuation(part.continuation, false) elseif is_last then -- Last container at this level (may still continue in part.continuation) part.punctuation = "." elseif next_part and next_part.new_sentence then -- Next container starts a new sentence part.punctuation = "." elseif next_part and next_part.separate_clause then -- Next container is a separate clause part.punctuation = "," else -- Not last, next is joined with the conjunction -- Containers use repeated conjunction style: "A, yan jî B, yan jî C" part.punctuation = "," end -- Determine joiner to next part -- Containers use the repeated conjunction between each -- Custom conjunction can be specified via conj modifier local container_conj = part.conj or "yan jî" -- Kurdish default if not is_last then if next_part and next_part.new_sentence then -- New sentence part.joiner = " " elseif next_part and next_part.separate_clause then -- Separate clause part.joiner = " " else -- Same sentence: use the custom conjunction, else the default part.joiner = " " .. container_conj .. " " end else part.joiner = "" end -- Determine intro formatting -- Capitalize if first at top level, OR if this container starts a new sentence if (is_first and is_toplevel) or part.new_sentence then part.intro_capitalized = true part.use_full_intro = true else part.intro_capitalized = false part.use_full_intro = false end end end -- Assemble text from analyzed tree local function assemble_text(tree) if not tree then return "" end local result = "" for i, part in ipairs(tree.container_parts) do if part.type == "etydate" then result = result .. part.etydate_text if part.punctuation and part.punctuation ~= "" then result = result .. part.punctuation end if part.etydate_refs and next(part.etydate_refs) then result = result .. M.references.format_references(part.etydate_refs) end if part.joiner and part.joiner ~= "" then result = result .. part.joiner end else -- Build intro local intro_text = part.intro_text local phrase = part.phrase if part.senseid then intro_text, phrase = format_sl_senseid_intro( part.senseid, part.sl_keyword_text, part.phrase, part.intro_capitalized, part.is_uncertain ) end local intro if part.use_full_intro then if part.is_uncertain and not part.senseid then intro = "Mihtemelen " .. phrase else intro = intro_text end else if part.is_uncertain and not part.senseid then intro = "mihtemelen " .. phrase else intro = phrase end end result = result .. intro -- Build terms if #part.term_parts > 0 then result = result .. " " for j, term_part in ipairs(part.term_parts) do -- Add "possibly" prefix for uncertain terms when there's mixed uncertainty if part.has_mixed_uncertainty and term_part.is_uncertain then result = result .. "mihtemelen " end result = result .. term_part.text -- Add joiner between terms if term_part.joiner ~= "" then -- Check if joiner contains comma (punctuation) local comma_pos = term_part.joiner:find(",") if comma_pos then -- Add up to and including comma result = result .. term_part.joiner:sub(1, comma_pos) -- Add refs after comma if term_part.refs ~= "" then result = result .. term_part.refs end -- Add rest of joiner result = result .. term_part.joiner:sub(comma_pos + 1) else -- No comma, add refs before joiner if term_part.refs ~= "" then result = result .. term_part.refs end result = result .. term_part.joiner end end end -- For the last term, add punctuation then refs local last_term = part.term_parts[#part.term_parts] if last_term and last_term.joiner == "" then if part.punctuation ~= "" then -- If we have literal text, punctuation goes AFTER it if part.lit then -- Add refs first (attached to term) if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text result = result .. ", literally “" .. part.lit .. "”" -- Add punctuation result = result .. part.punctuation else -- Normal behavior: punctuation then refs result = result .. part.punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs after term refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end else -- No punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text if present (even without punctuation) if part.lit then result = result .. ", literally “" .. part.lit .. "”" end end end else -- No terms, just add punctuation and keyword refs if part.punctuation ~= "" then result = result .. part.punctuation end -- Add keyword refs even when there are no terms if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end -- Add continuation if part.continuation then result = result .. " " .. assemble_text(part.continuation) end -- Add joiner to next container if part.joiner ~= "" then result = result .. part.joiner end end end return result end local text_tree = build_text_tree(data_tree, 1, true, false) -- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree. local function assemble_supplements() if not data_tree.supplements then return "" end local chunks = {} local pending_trees = {} local function flush_pending_trees() local num = #pending_trees for i, supplement_tree in ipairs(pending_trees) do analyze_punctuation(supplement_tree, true) apply_closing_punctuation_override(supplement_tree, i == num) local chunk = assemble_text(supplement_tree) if chunk ~= "" then table.insert(chunks, chunk) end end pending_trees = {} end for _, supplement in ipairs(data_tree.supplements) do local supplement_tree if supplement.type == "doublet" and supplement.config and supplement.terms and #supplement.terms > 0 then local config = supplement.config local term_parts = {} for _, term in ipairs(supplement.terms) do local term_part = build_term_part(term, entry_lang, 1) if term_part.text ~= "" then table.insert(term_parts, term_part) end end if #term_parts == 0 then supplement_tree = nil else supplement_tree = { type = "tree", container_parts = { { type = "doublet", intro_text = config.text, phrase = config.phrase, term_parts = term_parts, conj = config.default_conj or "û", new_sentence = true, }, }, depth = 1, } end elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then supplement_tree = { type = "tree", container_parts = { { type = "etydate", etydate_text = supplement.etydate_text, etydate_refs = supplement.etydate_refs, new_sentence = true, }, }, depth = 1, } end if supplement_tree then table.insert(pending_trees, supplement_tree) end end flush_pending_trees() return table.concat(chunks, " ") end if not text_tree then local supplement_text = assemble_supplements() if supplement_text == "" then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end if stop_at_lang then return supplement_text, { stop_lang_reached = false } end return supplement_text end local rendered = "" if text_tree then check_complexity(text_tree) analyze_punctuation(text_tree, true) apply_closing_punctuation_override(text_tree, not has_supplements()) rendered = assemble_text(text_tree) end local supplement_text = assemble_supplements() if supplement_text ~= "" then if rendered ~= "" then rendered = rendered .. " " .. supplement_text else rendered = supplement_text end end if stop_at_lang then return rendered, { stop_lang_reached = stop_lang_reached } end return rendered end return export kpz9x75q6ggymvy0y2d3vm1ehr523q0 6532030 6532029 2026-09-18T15:59:41Z Wikihez 7344 sync test copy 6532030 Scribunto text/plain local export = {} local loader = require("Module:module loader") local M = loader.init({ require = { en_utilities = "Module:en-utilities", references = "Module:references", senseno = "Module:senseno", }, loadData = { data = "Module:etymon/data/ceribandin", }, }) function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func local max_depth = opts.max_depth local stop_at_blue_link = opts.stop_at_blue_link local curr_page = opts.curr_page local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0" local function explicit_dot_override() if opts.dot == nil or opts.dot == false then return nil end local d = mw.text.trim(tostring(opts.dot)) if d == "" or d == "." then return nil end return d end local dot_override = explicit_dot_override() local function find_deepest_last_part(tree) if not tree or not tree.container_parts or #tree.container_parts == 0 then return nil end local last_part = tree.container_parts[#tree.container_parts] if last_part.continuation then return find_deepest_last_part(last_part.continuation) end return last_part end local function apply_final_punctuation_override(tree, punct) if not tree or punct == nil then return end local last_part = find_deepest_last_part(tree) if last_part then last_part.punctuation = punct end end local function apply_closing_punctuation_override(tree, is_last_segment) if not is_last_segment then return end local punct if nodot then punct = "" elseif dot_override ~= nil then punct = dot_override else return end apply_final_punctuation_override(tree, punct) end local function has_supplements() return data_tree.supplements and #data_tree.supplements > 0 end local stop_at_lang = opts.stop_at_lang local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink local lang_matches_stop_code = opts.lang_matches_stop_code local stop_lang_reached = false local function term_matches_stop_code(term_lang, stop_code) if lang_matches_stop_code then return lang_matches_stop_code(term_lang, stop_code) end return term_lang and term_lang:getCode() == stop_code end local children = data_tree.children local function has_text_supplements() if not data_tree.supplements then return false end for _, supplement in ipairs(data_tree.supplements) do if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then return true end if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then return true end end return false end if (not children or #children == 0) and not has_text_supplements() then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page local entry_lang = data_tree.lang local function lowercase_glossary_link_display(wikitext) return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain) local senseids = mw.text.split(senseid, "!!", true) local senseno_parts = {} for i, id in ipairs(senseids) do id = mw.text.trim(id) if id ~= "" then table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, { title = curr_page, uc = (i == 1 and capitalize_senseno) or nil, })) end end if #senseno_parts == 0 then return keyword_text, keyword_phrase end local senseno_text = mw.text.listToText(senseno_parts) local glossary_link = (keyword_text or ""):gsub(" from$", "") local glossary_lower = lowercase_glossary_link_display(glossary_link) if #senseno_parts > 1 then local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]") if is_uncertain then return senseno_text .. " are possibly " .. plural_link .. " from", senseno_text .. " are possibly semantic loans from" end return senseno_text .. " are " .. plural_link .. " from", senseno_text .. " are semantic loans from" end if is_uncertain then return senseno_text .. " is possibly a " .. glossary_lower .. " from", senseno_text .. " is possibly a semantic loan from" end return senseno_text .. " is a " .. glossary_lower .. " from", senseno_text .. " is a semantic loan from" end -- Get refs for a term local function get_term_refs(term, term_lang, depth) local term_l2 = term_lang:getFullCode() .. ":" .. curr_page if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then return M.references.format_references(term.parsed_ref) end return "" end -- Build a text part for a single term local function build_term_part(term, current_lang, depth) local text = "" local new_lang = current_lang local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName() -- Use centralized format_term (handles suppress_term, unknown_term, and regular terms) local term_text = format_term_func(term) if lang_changed then new_lang = term.lang if term_text then text = term.lang:makeWikipediaLink() .. " " .. term_text elseif term.is_family then text = term.lang:makeCategoryLink() -- a family: "zimanên îranî", linked to its category else -- suppress_term with language change: show only language text = term.lang:makeWikipediaLink() end else text = term_text or "" end return { type = "term", text = text, refs = get_term_refs(term, new_lang, depth), lang = new_lang, is_uncertain = term.is_uncertain or false, } end -- Build text parts for a container local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local terms = container.terms or {} if not keyword_info or #terms == 0 then return nil end -- Skip building text part when invisible in text ("all", "text", or true) local inv = keyword_info.invisible if inv == "all" or inv == true or inv == "text" then return nil end local is_group = keyword_info.is_group local keyword_uncertain = keyword_modifiers.unc or false -- Determine text and phrase (allowing for overrides) local intro_text = keyword_info.text local phrase = keyword_info.phrase local new_sentence = keyword_info.new_sentence or false if keyword_modifiers.text then -- User-provided override: assumed to be lowercase phrase = keyword_modifiers.text -- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from") intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2) end -- Get keyword references local keyword_refs = "" if keyword_modifiers.ref then local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref) if parsed_keyword_refs and parsed_keyword_refs ~= "" then keyword_refs = M.references.format_references(parsed_keyword_refs) end end -- Build term parts local term_parts = {} local current_lang = node.lang for _, term in ipairs(terms) do local term_part = build_term_part(term, current_lang, depth) if term_part.text ~= "" then table.insert(term_parts, term_part) current_lang = term_part.lang end end -- Check uncertainty distribution local uncertain_count = 0 for _, term_part in ipairs(term_parts) do if term_part.is_uncertain then uncertain_count = uncertain_count + 1 end end -- If keyword itself is uncertain, treat all terms as uncertain local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0) if is_group and uncertain_count > 0 then all_uncertain = true end local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0 -- Check if there are more steps (only if continuation is allowed) local has_more_steps = false local next_node = nil local first_term = terms[1] -- Check if we should stop at this language local reached_stop_lang = false if stop_at_lang then for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then reached_stop_lang = true stop_lang_reached = true break end end elseif stop_at_lang_or_bluelink then -- Check if we should stop at this language, or at the first bluelink if it's a redlink for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then if first_term.status == M.data.STATUS.OK then reached_stop_lang = true else fallback_to_bluelink = true end break end end if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then reached_stop_lang = true end end if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then local first_term_children = first_term.children if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then local next_container = first_term_children[1] local next_keyword_info = next_container and next_container.keyword_info if not (next_keyword_info and next_keyword_info.invisible) then if stop_at_blue_link then if first_term.status ~= M.data.STATUS.OK then has_more_steps = true next_node = first_term end else has_more_steps = true next_node = first_term end end end end return { type = "container", intro_text = intro_text, phrase = phrase, senseid = keyword_modifiers.senseid, sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil, is_uncertain = all_uncertain, has_mixed_uncertainty = has_mixed_uncertainty, term_parts = term_parts, is_group = is_group, has_more_steps = has_more_steps, next_node = next_node, new_sentence = new_sentence, separate_clause = keyword_info.separate_clause or false, conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc. lit = keyword_modifiers.lit, keyword_refs = keyword_refs, fallback_to_bluelink = fallback_to_bluelink, } end -- Build the full tree of text parts local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink) local containers = node.children if not containers or #containers == 0 then return nil end local container_parts = {} -- Count containers that get a text part (invisible in text = "all", "text", or true) local visible_container_count = 0 for _, container in ipairs(containers) do local keyword_info = container.keyword_info local inv = keyword_info and keyword_info.invisible if not (inv == "all" or inv == true or inv == "text") then visible_container_count = visible_container_count + 1 end end -- If there are multiple visible containers at this level, don't allow continuation for any local has_multiple_containers = visible_container_count > 1 local should_allow_continuation = allow_continuation and not has_multiple_containers for _, container in ipairs(containers) do local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink) if part then -- Recursively build children if there are more steps if part.has_more_steps and part.next_node then part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink) end table.insert(container_parts, part) end end if #container_parts == 0 then return nil end return { type = "tree", container_parts = container_parts, depth = depth, } end -- Check if tree has mixed joining types local function container_join_kind(part) if part.type == "etydate" then return nil end if part.new_sentence or part.separate_clause then return "supplement" end return "or_join" end local function check_complexity(tree) if not tree then return nil end local parts = tree.container_parts if #parts <= 1 then -- Single container if parts[1] and parts[1].continuation then return check_complexity(parts[1].continuation) end return nil end -- Or-join containers must precede any supplemental (calque-like / influence) containers. local seen_supplement = false for _, part in ipairs(parts) do local kind = container_join_kind(part) if kind == "supplement" then seen_supplement = true elseif kind == "or_join" and seen_supplement then error( "Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.") end end for _, part in ipairs(parts) do if part.continuation then check_complexity(part.continuation) end end return nil end -- Analyze tree and assign punctuation local function analyze_punctuation(tree, is_toplevel) if not tree then return end local parts = tree.container_parts local num_parts = #parts for i, part in ipairs(parts) do local is_first = (i == 1) local is_last = (i == num_parts) local next_part = parts[i + 1] -- Analyze term punctuation within container if part.term_parts then -- Terms use Oxford comma style: "A, B, yan jî C" -- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and") local num_terms = #part.term_parts local term_conj = part.conj or "yan jî" -- Kurdish default for j, term_part in ipairs(part.term_parts) do local is_last_term = (j == num_terms) if part.is_group then -- Group: terms joined with " + " term_part.joiner = is_last_term and "" or " + " elseif num_terms > 1 then -- Multiple terms not in a group: Oxford comma style if is_last_term then term_part.joiner = "" elseif j == num_terms - 1 then -- Second to last term if num_terms == 2 then term_part.joiner = " " .. term_conj .. " " else term_part.joiner = ", " .. term_conj .. " " end else term_part.joiner = ", " end else -- Single term term_part.joiner = "" end end end -- Determine container punctuation based on what comes next if part.continuation then -- Has continuation part.punctuation = "," -- Recursively analyze continuation analyze_punctuation(part.continuation, false) elseif is_last then -- Last container at this level (may still continue in part.continuation) part.punctuation = "." elseif next_part and next_part.new_sentence then -- Next container starts a new sentence part.punctuation = "." elseif next_part and next_part.separate_clause then -- Next container is a separate clause part.punctuation = "," else -- Not last, next is joined with the conjunction -- Containers use repeated conjunction style: "A, yan jî B, yan jî C" part.punctuation = "," end -- Determine joiner to next part -- Containers use the repeated conjunction between each -- Custom conjunction can be specified via conj modifier local container_conj = part.conj or "yan jî" -- Kurdish default if not is_last then if next_part and next_part.new_sentence then -- New sentence part.joiner = " " elseif next_part and next_part.separate_clause then -- Separate clause part.joiner = " " else -- Same sentence: use the custom conjunction, else the default part.joiner = " " .. container_conj .. " " end else part.joiner = "" end -- Determine intro formatting -- Capitalize if first at top level, OR if this container starts a new sentence if (is_first and is_toplevel) or part.new_sentence then part.intro_capitalized = true part.use_full_intro = true else part.intro_capitalized = false part.use_full_intro = false end end end -- Assemble text from analyzed tree local function assemble_text(tree) if not tree then return "" end local result = "" for i, part in ipairs(tree.container_parts) do if part.type == "etydate" then result = result .. part.etydate_text if part.punctuation and part.punctuation ~= "" then result = result .. part.punctuation end if part.etydate_refs and next(part.etydate_refs) then result = result .. M.references.format_references(part.etydate_refs) end if part.joiner and part.joiner ~= "" then result = result .. part.joiner end else -- Build intro local intro_text = part.intro_text local phrase = part.phrase if part.senseid then intro_text, phrase = format_sl_senseid_intro( part.senseid, part.sl_keyword_text, part.phrase, part.intro_capitalized, part.is_uncertain ) end local intro if part.use_full_intro then if part.is_uncertain and not part.senseid then intro = "Mihtemelen " .. phrase else intro = intro_text end else if part.is_uncertain and not part.senseid then intro = "mihtemelen " .. phrase else intro = phrase end end result = result .. intro -- Build terms if #part.term_parts > 0 then result = result .. " " for j, term_part in ipairs(part.term_parts) do -- Add "possibly" prefix for uncertain terms when there's mixed uncertainty if part.has_mixed_uncertainty and term_part.is_uncertain then result = result .. "mihtemelen " end result = result .. term_part.text -- Add joiner between terms if term_part.joiner ~= "" then -- Check if joiner contains comma (punctuation) local comma_pos = term_part.joiner:find(",") if comma_pos then -- Add up to and including comma result = result .. term_part.joiner:sub(1, comma_pos) -- Add refs after comma if term_part.refs ~= "" then result = result .. term_part.refs end -- Add rest of joiner result = result .. term_part.joiner:sub(comma_pos + 1) else -- No comma, add refs before joiner if term_part.refs ~= "" then result = result .. term_part.refs end result = result .. term_part.joiner end end end -- For the last term, add punctuation then refs local last_term = part.term_parts[#part.term_parts] if last_term and last_term.joiner == "" then if part.punctuation ~= "" then -- If we have literal text, punctuation goes AFTER it if part.lit then -- Add refs first (attached to term) if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text result = result .. ", literally “" .. part.lit .. "”" -- Add punctuation result = result .. part.punctuation else -- Normal behavior: punctuation then refs result = result .. part.punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs after term refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end else -- No punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text if present (even without punctuation) if part.lit then result = result .. ", literally “" .. part.lit .. "”" end end end else -- No terms, just add punctuation and keyword refs if part.punctuation ~= "" then result = result .. part.punctuation end -- Add keyword refs even when there are no terms if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end -- Add continuation if part.continuation then result = result .. " " .. assemble_text(part.continuation) end -- Add joiner to next container if part.joiner ~= "" then result = result .. part.joiner end end end return result end local text_tree = build_text_tree(data_tree, 1, true, false) -- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree. local function assemble_supplements() if not data_tree.supplements then return "" end local chunks = {} local pending_trees = {} local function flush_pending_trees() local num = #pending_trees for i, supplement_tree in ipairs(pending_trees) do analyze_punctuation(supplement_tree, true) apply_closing_punctuation_override(supplement_tree, i == num) local chunk = assemble_text(supplement_tree) if chunk ~= "" then table.insert(chunks, chunk) end end pending_trees = {} end for _, supplement in ipairs(data_tree.supplements) do local supplement_tree if supplement.type == "doublet" and supplement.config and supplement.terms and #supplement.terms > 0 then local config = supplement.config local term_parts = {} for _, term in ipairs(supplement.terms) do local term_part = build_term_part(term, entry_lang, 1) if term_part.text ~= "" then table.insert(term_parts, term_part) end end if #term_parts == 0 then supplement_tree = nil else supplement_tree = { type = "tree", container_parts = { { type = "doublet", intro_text = config.text, phrase = config.phrase, term_parts = term_parts, conj = config.default_conj or "û", new_sentence = true, }, }, depth = 1, } end elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then supplement_tree = { type = "tree", container_parts = { { type = "etydate", etydate_text = supplement.etydate_text, etydate_refs = supplement.etydate_refs, new_sentence = true, }, }, depth = 1, } end if supplement_tree then table.insert(pending_trees, supplement_tree) end end flush_pending_trees() return table.concat(chunks, " ") end if not text_tree then local supplement_text = assemble_supplements() if supplement_text == "" then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end if stop_at_lang then return supplement_text, { stop_lang_reached = false } end return supplement_text end local rendered = "" if text_tree then check_complexity(text_tree) analyze_punctuation(text_tree, true) apply_closing_punctuation_override(text_tree, not has_supplements()) rendered = assemble_text(text_tree) end local supplement_text = assemble_supplements() if supplement_text ~= "" then if rendered ~= "" then rendered = rendered .. " " .. supplement_text else rendered = supplement_text end end if stop_at_lang then return rendered, { stop_lang_reached = stop_lang_reached } end return rendered end return export j4rx3kii3ltjel9dccwf17ohjvji18n 6532031 6532030 2026-09-18T16:01:25Z Wikihez 7344 sync test copy 6532031 Scribunto text/plain local export = {} local loader = require("Module:module loader") local M = loader.init({ require = { en_utilities = "Module:en-utilities", references = "Module:references", senseno = "Module:senseno", }, loadData = { data = "Module:etymon/data/ceribandin", }, }) function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func local max_depth = opts.max_depth local stop_at_blue_link = opts.stop_at_blue_link local curr_page = opts.curr_page local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0" local function explicit_dot_override() if opts.dot == nil or opts.dot == false then return nil end local d = mw.text.trim(tostring(opts.dot)) if d == "" or d == "." then return nil end return d end local dot_override = explicit_dot_override() local function find_deepest_last_part(tree) if not tree or not tree.container_parts or #tree.container_parts == 0 then return nil end local last_part = tree.container_parts[#tree.container_parts] if last_part.continuation then return find_deepest_last_part(last_part.continuation) end return last_part end local function apply_final_punctuation_override(tree, punct) if not tree or punct == nil then return end local last_part = find_deepest_last_part(tree) if last_part then last_part.punctuation = punct end end local function apply_closing_punctuation_override(tree, is_last_segment) if not is_last_segment then return end local punct if nodot then punct = "" elseif dot_override ~= nil then punct = dot_override else return end apply_final_punctuation_override(tree, punct) end local function has_supplements() return data_tree.supplements and #data_tree.supplements > 0 end local stop_at_lang = opts.stop_at_lang local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink local lang_matches_stop_code = opts.lang_matches_stop_code local stop_lang_reached = false local function term_matches_stop_code(term_lang, stop_code) if lang_matches_stop_code then return lang_matches_stop_code(term_lang, stop_code) end return term_lang and term_lang:getCode() == stop_code end local children = data_tree.children local function has_text_supplements() if not data_tree.supplements then return false end for _, supplement in ipairs(data_tree.supplements) do if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then return true end if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then return true end end return false end if (not children or #children == 0) and not has_text_supplements() then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page local entry_lang = data_tree.lang local function lowercase_glossary_link_display(wikitext) return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain) local senseids = mw.text.split(senseid, "!!", true) local senseno_parts = {} for i, id in ipairs(senseids) do id = mw.text.trim(id) if id ~= "" then table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, { title = curr_page, uc = (i == 1 and capitalize_senseno) or nil, })) end end if #senseno_parts == 0 then return keyword_text, keyword_phrase end local senseno_text = mw.text.listToText(senseno_parts) local glossary_link = (keyword_text or ""):gsub(" from$", "") local glossary_lower = lowercase_glossary_link_display(glossary_link) if #senseno_parts > 1 then local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]") if is_uncertain then return senseno_text .. " are possibly " .. plural_link .. " from", senseno_text .. " are possibly semantic loans from" end return senseno_text .. " are " .. plural_link .. " from", senseno_text .. " are semantic loans from" end if is_uncertain then return senseno_text .. " is possibly a " .. glossary_lower .. " from", senseno_text .. " is possibly a semantic loan from" end return senseno_text .. " is a " .. glossary_lower .. " from", senseno_text .. " is a semantic loan from" end -- Get refs for a term local function get_term_refs(term, term_lang, depth) local term_l2 = term_lang:getFullCode() .. ":" .. curr_page if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then return M.references.format_references(term.parsed_ref) end return "" end -- A language name in running text: its canonical name, linked to the language's category. -- A family keeps makeCategoryLink's own wording ("zimanên îranî"). local function lang_link(lang) if (lang.hasType and lang:hasType("family")) or not lang.getCategoryName then return lang:makeCategoryLink() end local ok, cat = pcall(lang.getCategoryName, lang) if not ok or not cat or cat == "" then return lang:makeWikipediaLink() end return "[[:Kategorî:" .. cat .. "|" .. lang:getCanonicalName() .. "]]" end -- Build a text part for a single term local function build_term_part(term, current_lang, depth) local text = "" local new_lang = current_lang local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName() -- Use centralized format_term (handles suppress_term, unknown_term, and regular terms) local term_text = format_term_func(term) if lang_changed then new_lang = term.lang if term_text then text = lang_link(term.lang) .. " " .. term_text elseif term.is_family then text = lang_link(term.lang) -- a family: "zimanên îranî" else -- suppress_term with language change: show only language text = lang_link(term.lang) end else text = term_text or "" end return { type = "term", text = text, refs = get_term_refs(term, new_lang, depth), lang = new_lang, is_uncertain = term.is_uncertain or false, } end -- Build text parts for a container local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local terms = container.terms or {} if not keyword_info or #terms == 0 then return nil end -- Skip building text part when invisible in text ("all", "text", or true) local inv = keyword_info.invisible if inv == "all" or inv == true or inv == "text" then return nil end local is_group = keyword_info.is_group local keyword_uncertain = keyword_modifiers.unc or false -- Determine text and phrase (allowing for overrides) local intro_text = keyword_info.text local phrase = keyword_info.phrase local new_sentence = keyword_info.new_sentence or false if keyword_modifiers.text then -- User-provided override: assumed to be lowercase phrase = keyword_modifiers.text -- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from") intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2) end -- Get keyword references local keyword_refs = "" if keyword_modifiers.ref then local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref) if parsed_keyword_refs and parsed_keyword_refs ~= "" then keyword_refs = M.references.format_references(parsed_keyword_refs) end end -- Build term parts local term_parts = {} local current_lang = node.lang for _, term in ipairs(terms) do local term_part = build_term_part(term, current_lang, depth) if term_part.text ~= "" then table.insert(term_parts, term_part) current_lang = term_part.lang end end -- Check uncertainty distribution local uncertain_count = 0 for _, term_part in ipairs(term_parts) do if term_part.is_uncertain then uncertain_count = uncertain_count + 1 end end -- If keyword itself is uncertain, treat all terms as uncertain local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0) if is_group and uncertain_count > 0 then all_uncertain = true end local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0 -- Check if there are more steps (only if continuation is allowed) local has_more_steps = false local next_node = nil local first_term = terms[1] -- Check if we should stop at this language local reached_stop_lang = false if stop_at_lang then for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then reached_stop_lang = true stop_lang_reached = true break end end elseif stop_at_lang_or_bluelink then -- Check if we should stop at this language, or at the first bluelink if it's a redlink for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then if first_term.status == M.data.STATUS.OK then reached_stop_lang = true else fallback_to_bluelink = true end break end end if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then reached_stop_lang = true end end if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then local first_term_children = first_term.children if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then local next_container = first_term_children[1] local next_keyword_info = next_container and next_container.keyword_info if not (next_keyword_info and next_keyword_info.invisible) then if stop_at_blue_link then if first_term.status ~= M.data.STATUS.OK then has_more_steps = true next_node = first_term end else has_more_steps = true next_node = first_term end end end end return { type = "container", intro_text = intro_text, phrase = phrase, senseid = keyword_modifiers.senseid, sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil, is_uncertain = all_uncertain, has_mixed_uncertainty = has_mixed_uncertainty, term_parts = term_parts, is_group = is_group, has_more_steps = has_more_steps, next_node = next_node, new_sentence = new_sentence, separate_clause = keyword_info.separate_clause or false, conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc. lit = keyword_modifiers.lit, keyword_refs = keyword_refs, fallback_to_bluelink = fallback_to_bluelink, } end -- Build the full tree of text parts local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink) local containers = node.children if not containers or #containers == 0 then return nil end local container_parts = {} -- Count containers that get a text part (invisible in text = "all", "text", or true) local visible_container_count = 0 for _, container in ipairs(containers) do local keyword_info = container.keyword_info local inv = keyword_info and keyword_info.invisible if not (inv == "all" or inv == true or inv == "text") then visible_container_count = visible_container_count + 1 end end -- If there are multiple visible containers at this level, don't allow continuation for any local has_multiple_containers = visible_container_count > 1 local should_allow_continuation = allow_continuation and not has_multiple_containers for _, container in ipairs(containers) do local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink) if part then -- Recursively build children if there are more steps if part.has_more_steps and part.next_node then part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink) end table.insert(container_parts, part) end end if #container_parts == 0 then return nil end return { type = "tree", container_parts = container_parts, depth = depth, } end -- Check if tree has mixed joining types local function container_join_kind(part) if part.type == "etydate" then return nil end if part.new_sentence or part.separate_clause then return "supplement" end return "or_join" end local function check_complexity(tree) if not tree then return nil end local parts = tree.container_parts if #parts <= 1 then -- Single container if parts[1] and parts[1].continuation then return check_complexity(parts[1].continuation) end return nil end -- Or-join containers must precede any supplemental (calque-like / influence) containers. local seen_supplement = false for _, part in ipairs(parts) do local kind = container_join_kind(part) if kind == "supplement" then seen_supplement = true elseif kind == "or_join" and seen_supplement then error( "Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.") end end for _, part in ipairs(parts) do if part.continuation then check_complexity(part.continuation) end end return nil end -- Analyze tree and assign punctuation local function analyze_punctuation(tree, is_toplevel) if not tree then return end local parts = tree.container_parts local num_parts = #parts for i, part in ipairs(parts) do local is_first = (i == 1) local is_last = (i == num_parts) local next_part = parts[i + 1] -- Analyze term punctuation within container if part.term_parts then -- Terms use Oxford comma style: "A, B, yan jî C" -- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and") local num_terms = #part.term_parts local term_conj = part.conj or "yan jî" -- Kurdish default for j, term_part in ipairs(part.term_parts) do local is_last_term = (j == num_terms) if part.is_group then -- Group: terms joined with " + " term_part.joiner = is_last_term and "" or " + " elseif num_terms > 1 then -- Multiple terms not in a group: Oxford comma style if is_last_term then term_part.joiner = "" elseif j == num_terms - 1 then -- Second to last term if num_terms == 2 then term_part.joiner = " " .. term_conj .. " " else term_part.joiner = ", " .. term_conj .. " " end else term_part.joiner = ", " end else -- Single term term_part.joiner = "" end end end -- Determine container punctuation based on what comes next if part.continuation then -- Has continuation part.punctuation = "," -- Recursively analyze continuation analyze_punctuation(part.continuation, false) elseif is_last then -- Last container at this level (may still continue in part.continuation) part.punctuation = "." elseif next_part and next_part.new_sentence then -- Next container starts a new sentence part.punctuation = "." elseif next_part and next_part.separate_clause then -- Next container is a separate clause part.punctuation = "," else -- Not last, next is joined with the conjunction -- Containers use repeated conjunction style: "A, yan jî B, yan jî C" part.punctuation = "," end -- Determine joiner to next part -- Containers use the repeated conjunction between each -- Custom conjunction can be specified via conj modifier local container_conj = part.conj or "yan jî" -- Kurdish default if not is_last then if next_part and next_part.new_sentence then -- New sentence part.joiner = " " elseif next_part and next_part.separate_clause then -- Separate clause part.joiner = " " else -- Same sentence: use the custom conjunction, else the default part.joiner = " " .. container_conj .. " " end else part.joiner = "" end -- Determine intro formatting -- Capitalize if first at top level, OR if this container starts a new sentence if (is_first and is_toplevel) or part.new_sentence then part.intro_capitalized = true part.use_full_intro = true else part.intro_capitalized = false part.use_full_intro = false end end end -- Assemble text from analyzed tree local function assemble_text(tree) if not tree then return "" end local result = "" for i, part in ipairs(tree.container_parts) do if part.type == "etydate" then result = result .. part.etydate_text if part.punctuation and part.punctuation ~= "" then result = result .. part.punctuation end if part.etydate_refs and next(part.etydate_refs) then result = result .. M.references.format_references(part.etydate_refs) end if part.joiner and part.joiner ~= "" then result = result .. part.joiner end else -- Build intro local intro_text = part.intro_text local phrase = part.phrase if part.senseid then intro_text, phrase = format_sl_senseid_intro( part.senseid, part.sl_keyword_text, part.phrase, part.intro_capitalized, part.is_uncertain ) end local intro if part.use_full_intro then if part.is_uncertain and not part.senseid then intro = "Mihtemelen " .. phrase else intro = intro_text end else if part.is_uncertain and not part.senseid then intro = "mihtemelen " .. phrase else intro = phrase end end result = result .. intro -- Build terms if #part.term_parts > 0 then result = result .. " " for j, term_part in ipairs(part.term_parts) do -- Add "possibly" prefix for uncertain terms when there's mixed uncertainty if part.has_mixed_uncertainty and term_part.is_uncertain then result = result .. "mihtemelen " end result = result .. term_part.text -- Add joiner between terms if term_part.joiner ~= "" then -- Check if joiner contains comma (punctuation) local comma_pos = term_part.joiner:find(",") if comma_pos then -- Add up to and including comma result = result .. term_part.joiner:sub(1, comma_pos) -- Add refs after comma if term_part.refs ~= "" then result = result .. term_part.refs end -- Add rest of joiner result = result .. term_part.joiner:sub(comma_pos + 1) else -- No comma, add refs before joiner if term_part.refs ~= "" then result = result .. term_part.refs end result = result .. term_part.joiner end end end -- For the last term, add punctuation then refs local last_term = part.term_parts[#part.term_parts] if last_term and last_term.joiner == "" then if part.punctuation ~= "" then -- If we have literal text, punctuation goes AFTER it if part.lit then -- Add refs first (attached to term) if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text result = result .. ", literally “" .. part.lit .. "”" -- Add punctuation result = result .. part.punctuation else -- Normal behavior: punctuation then refs result = result .. part.punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs after term refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end else -- No punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text if present (even without punctuation) if part.lit then result = result .. ", literally “" .. part.lit .. "”" end end end else -- No terms, just add punctuation and keyword refs if part.punctuation ~= "" then result = result .. part.punctuation end -- Add keyword refs even when there are no terms if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end -- Add continuation if part.continuation then result = result .. " " .. assemble_text(part.continuation) end -- Add joiner to next container if part.joiner ~= "" then result = result .. part.joiner end end end return result end local text_tree = build_text_tree(data_tree, 1, true, false) -- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree. local function assemble_supplements() if not data_tree.supplements then return "" end local chunks = {} local pending_trees = {} local function flush_pending_trees() local num = #pending_trees for i, supplement_tree in ipairs(pending_trees) do analyze_punctuation(supplement_tree, true) apply_closing_punctuation_override(supplement_tree, i == num) local chunk = assemble_text(supplement_tree) if chunk ~= "" then table.insert(chunks, chunk) end end pending_trees = {} end for _, supplement in ipairs(data_tree.supplements) do local supplement_tree if supplement.type == "doublet" and supplement.config and supplement.terms and #supplement.terms > 0 then local config = supplement.config local term_parts = {} for _, term in ipairs(supplement.terms) do local term_part = build_term_part(term, entry_lang, 1) if term_part.text ~= "" then table.insert(term_parts, term_part) end end if #term_parts == 0 then supplement_tree = nil else supplement_tree = { type = "tree", container_parts = { { type = "doublet", intro_text = config.text, phrase = config.phrase, term_parts = term_parts, conj = config.default_conj or "û", new_sentence = true, }, }, depth = 1, } end elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then supplement_tree = { type = "tree", container_parts = { { type = "etydate", etydate_text = supplement.etydate_text, etydate_refs = supplement.etydate_refs, new_sentence = true, }, }, depth = 1, } end if supplement_tree then table.insert(pending_trees, supplement_tree) end end flush_pending_trees() return table.concat(chunks, " ") end if not text_tree then local supplement_text = assemble_supplements() if supplement_text == "" then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end if stop_at_lang then return supplement_text, { stop_lang_reached = false } end return supplement_text end local rendered = "" if text_tree then check_complexity(text_tree) analyze_punctuation(text_tree, true) apply_closing_punctuation_override(text_tree, not has_supplements()) rendered = assemble_text(text_tree) end local supplement_text = assemble_supplements() if supplement_text ~= "" then if rendered ~= "" then rendered = rendered .. " " .. supplement_text else rendered = supplement_text end end if stop_at_lang then return rendered, { stop_lang_reached = stop_lang_reached } end return rendered end return export oawj2h2aqok5q8g7kvkt5gug2zj25fx 6532032 6532031 2026-09-18T16:05:32Z Wikihez 7344 sync test copy 6532032 Scribunto text/plain local export = {} local loader = require("Module:module loader") local M = loader.init({ require = { en_utilities = "Module:en-utilities", references = "Module:references", senseno = "Module:senseno", }, loadData = { data = "Module:etymon/data/ceribandin", }, }) function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func local max_depth = opts.max_depth local stop_at_blue_link = opts.stop_at_blue_link local curr_page = opts.curr_page local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0" local function explicit_dot_override() if opts.dot == nil or opts.dot == false then return nil end local d = mw.text.trim(tostring(opts.dot)) if d == "" or d == "." then return nil end return d end local dot_override = explicit_dot_override() local function find_deepest_last_part(tree) if not tree or not tree.container_parts or #tree.container_parts == 0 then return nil end local last_part = tree.container_parts[#tree.container_parts] if last_part.continuation then return find_deepest_last_part(last_part.continuation) end return last_part end local function apply_final_punctuation_override(tree, punct) if not tree or punct == nil then return end local last_part = find_deepest_last_part(tree) if last_part then last_part.punctuation = punct end end local function apply_closing_punctuation_override(tree, is_last_segment) if not is_last_segment then return end local punct if nodot then punct = "" elseif dot_override ~= nil then punct = dot_override else return end apply_final_punctuation_override(tree, punct) end local function has_supplements() return data_tree.supplements and #data_tree.supplements > 0 end local stop_at_lang = opts.stop_at_lang local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink local lang_matches_stop_code = opts.lang_matches_stop_code local stop_lang_reached = false local function term_matches_stop_code(term_lang, stop_code) if lang_matches_stop_code then return lang_matches_stop_code(term_lang, stop_code) end return term_lang and term_lang:getCode() == stop_code end local children = data_tree.children local function has_text_supplements() if not data_tree.supplements then return false end for _, supplement in ipairs(data_tree.supplements) do if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then return true end if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then return true end end return false end if (not children or #children == 0) and not has_text_supplements() then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page local entry_lang = data_tree.lang local function lowercase_glossary_link_display(wikitext) return wikitext:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain) local senseids = mw.text.split(senseid, "!!", true) local senseno_parts = {} for i, id in ipairs(senseids) do id = mw.text.trim(id) if id ~= "" then table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, { title = curr_page, uc = (i == 1 and capitalize_senseno) or nil, })) end end if #senseno_parts == 0 then return keyword_text, keyword_phrase end local senseno_text = mw.text.listToText(senseno_parts) local glossary_link = (keyword_text or ""):gsub(" from$", "") local glossary_lower = lowercase_glossary_link_display(glossary_link) if #senseno_parts > 1 then local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]") if is_uncertain then return senseno_text .. " are possibly " .. plural_link .. " from", senseno_text .. " are possibly semantic loans from" end return senseno_text .. " are " .. plural_link .. " from", senseno_text .. " are semantic loans from" end if is_uncertain then return senseno_text .. " is possibly a " .. glossary_lower .. " from", senseno_text .. " is possibly a semantic loan from" end return senseno_text .. " is a " .. glossary_lower .. " from", senseno_text .. " is a semantic loan from" end -- Get refs for a term local function get_term_refs(term, term_lang, depth) local term_l2 = term_lang:getFullCode() .. ":" .. curr_page if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then return M.references.format_references(term.parsed_ref) end return "" end -- Build a text part for a single term local function build_term_part(term, current_lang, depth) local text = "" local new_lang = current_lang local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName() -- Use centralized format_term (handles suppress_term, unknown_term, and regular terms) local term_text = format_term_func(term) if lang_changed then new_lang = term.lang if term_text then text = term.lang:makeCategoryLink(true) .. " " .. term_text elseif term.is_family then text = term.lang:makeCategoryLink(true) -- a family: "zimanên îranî" else -- suppress_term with language change: show only language text = term.lang:makeCategoryLink(true) end else text = term_text or "" end return { type = "term", text = text, refs = get_term_refs(term, new_lang, depth), lang = new_lang, is_uncertain = term.is_uncertain or false, } end -- Build text parts for a container local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local terms = container.terms or {} if not keyword_info or #terms == 0 then return nil end -- Skip building text part when invisible in text ("all", "text", or true) local inv = keyword_info.invisible if inv == "all" or inv == true or inv == "text" then return nil end local is_group = keyword_info.is_group local keyword_uncertain = keyword_modifiers.unc or false -- Determine text and phrase (allowing for overrides) local intro_text = keyword_info.text local phrase = keyword_info.phrase local new_sentence = keyword_info.new_sentence or false if keyword_modifiers.text then -- User-provided override: assumed to be lowercase phrase = keyword_modifiers.text -- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from") intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2) end -- Get keyword references local keyword_refs = "" if keyword_modifiers.ref then local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref) if parsed_keyword_refs and parsed_keyword_refs ~= "" then keyword_refs = M.references.format_references(parsed_keyword_refs) end end -- Build term parts local term_parts = {} local current_lang = node.lang for _, term in ipairs(terms) do local term_part = build_term_part(term, current_lang, depth) if term_part.text ~= "" then table.insert(term_parts, term_part) current_lang = term_part.lang end end -- Check uncertainty distribution local uncertain_count = 0 for _, term_part in ipairs(term_parts) do if term_part.is_uncertain then uncertain_count = uncertain_count + 1 end end -- If keyword itself is uncertain, treat all terms as uncertain local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0) if is_group and uncertain_count > 0 then all_uncertain = true end local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0 -- Check if there are more steps (only if continuation is allowed) local has_more_steps = false local next_node = nil local first_term = terms[1] -- Check if we should stop at this language local reached_stop_lang = false if stop_at_lang then for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then reached_stop_lang = true stop_lang_reached = true break end end elseif stop_at_lang_or_bluelink then -- Check if we should stop at this language, or at the first bluelink if it's a redlink for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then if first_term.status == M.data.STATUS.OK then reached_stop_lang = true else fallback_to_bluelink = true end break end end if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then reached_stop_lang = true end end if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then local first_term_children = first_term.children if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then local next_container = first_term_children[1] local next_keyword_info = next_container and next_container.keyword_info if not (next_keyword_info and next_keyword_info.invisible) then if stop_at_blue_link then if first_term.status ~= M.data.STATUS.OK then has_more_steps = true next_node = first_term end else has_more_steps = true next_node = first_term end end end end return { type = "container", intro_text = intro_text, phrase = phrase, senseid = keyword_modifiers.senseid, sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil, is_uncertain = all_uncertain, has_mixed_uncertainty = has_mixed_uncertainty, term_parts = term_parts, is_group = is_group, has_more_steps = has_more_steps, next_node = next_node, new_sentence = new_sentence, separate_clause = keyword_info.separate_clause or false, conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc. lit = keyword_modifiers.lit, keyword_refs = keyword_refs, fallback_to_bluelink = fallback_to_bluelink, } end -- Build the full tree of text parts local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink) local containers = node.children if not containers or #containers == 0 then return nil end local container_parts = {} -- Count containers that get a text part (invisible in text = "all", "text", or true) local visible_container_count = 0 for _, container in ipairs(containers) do local keyword_info = container.keyword_info local inv = keyword_info and keyword_info.invisible if not (inv == "all" or inv == true or inv == "text") then visible_container_count = visible_container_count + 1 end end -- If there are multiple visible containers at this level, don't allow continuation for any local has_multiple_containers = visible_container_count > 1 local should_allow_continuation = allow_continuation and not has_multiple_containers for _, container in ipairs(containers) do local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink) if part then -- Recursively build children if there are more steps if part.has_more_steps and part.next_node then part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink) end table.insert(container_parts, part) end end if #container_parts == 0 then return nil end return { type = "tree", container_parts = container_parts, depth = depth, } end -- Check if tree has mixed joining types local function container_join_kind(part) if part.type == "etydate" then return nil end if part.new_sentence or part.separate_clause then return "supplement" end return "or_join" end local function check_complexity(tree) if not tree then return nil end local parts = tree.container_parts if #parts <= 1 then -- Single container if parts[1] and parts[1].continuation then return check_complexity(parts[1].continuation) end return nil end -- Or-join containers must precede any supplemental (calque-like / influence) containers. local seen_supplement = false for _, part in ipairs(parts) do local kind = container_join_kind(part) if kind == "supplement" then seen_supplement = true elseif kind == "or_join" and seen_supplement then error( "Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.") end end for _, part in ipairs(parts) do if part.continuation then check_complexity(part.continuation) end end return nil end -- Analyze tree and assign punctuation local function analyze_punctuation(tree, is_toplevel) if not tree then return end local parts = tree.container_parts local num_parts = #parts for i, part in ipairs(parts) do local is_first = (i == 1) local is_last = (i == num_parts) local next_part = parts[i + 1] -- Analyze term punctuation within container if part.term_parts then -- Terms use Oxford comma style: "A, B, yan jî C" -- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and") local num_terms = #part.term_parts local term_conj = part.conj or "yan jî" -- Kurdish default for j, term_part in ipairs(part.term_parts) do local is_last_term = (j == num_terms) if part.is_group then -- Group: terms joined with " + " term_part.joiner = is_last_term and "" or " + " elseif num_terms > 1 then -- Multiple terms not in a group: Oxford comma style if is_last_term then term_part.joiner = "" elseif j == num_terms - 1 then -- Second to last term if num_terms == 2 then term_part.joiner = " " .. term_conj .. " " else term_part.joiner = ", " .. term_conj .. " " end else term_part.joiner = ", " end else -- Single term term_part.joiner = "" end end end -- Determine container punctuation based on what comes next if part.continuation then -- Has continuation part.punctuation = "," -- Recursively analyze continuation analyze_punctuation(part.continuation, false) elseif is_last then -- Last container at this level (may still continue in part.continuation) part.punctuation = "." elseif next_part and next_part.new_sentence then -- Next container starts a new sentence part.punctuation = "." elseif next_part and next_part.separate_clause then -- Next container is a separate clause part.punctuation = "," else -- Not last, next is joined with the conjunction -- Containers use repeated conjunction style: "A, yan jî B, yan jî C" part.punctuation = "," end -- Determine joiner to next part -- Containers use the repeated conjunction between each -- Custom conjunction can be specified via conj modifier local container_conj = part.conj or "yan jî" -- Kurdish default if not is_last then if next_part and next_part.new_sentence then -- New sentence part.joiner = " " elseif next_part and next_part.separate_clause then -- Separate clause part.joiner = " " else -- Same sentence: use the custom conjunction, else the default part.joiner = " " .. container_conj .. " " end else part.joiner = "" end -- Determine intro formatting -- Capitalize if first at top level, OR if this container starts a new sentence if (is_first and is_toplevel) or part.new_sentence then part.intro_capitalized = true part.use_full_intro = true else part.intro_capitalized = false part.use_full_intro = false end end end -- Assemble text from analyzed tree local function assemble_text(tree) if not tree then return "" end local result = "" for i, part in ipairs(tree.container_parts) do if part.type == "etydate" then result = result .. part.etydate_text if part.punctuation and part.punctuation ~= "" then result = result .. part.punctuation end if part.etydate_refs and next(part.etydate_refs) then result = result .. M.references.format_references(part.etydate_refs) end if part.joiner and part.joiner ~= "" then result = result .. part.joiner end else -- Build intro local intro_text = part.intro_text local phrase = part.phrase if part.senseid then intro_text, phrase = format_sl_senseid_intro( part.senseid, part.sl_keyword_text, part.phrase, part.intro_capitalized, part.is_uncertain ) end local intro if part.use_full_intro then if part.is_uncertain and not part.senseid then intro = "Mihtemelen " .. phrase else intro = intro_text end else if part.is_uncertain and not part.senseid then intro = "mihtemelen " .. phrase else intro = phrase end end result = result .. intro -- Build terms if #part.term_parts > 0 then result = result .. " " for j, term_part in ipairs(part.term_parts) do -- Add "possibly" prefix for uncertain terms when there's mixed uncertainty if part.has_mixed_uncertainty and term_part.is_uncertain then result = result .. "mihtemelen " end result = result .. term_part.text -- Add joiner between terms if term_part.joiner ~= "" then -- Check if joiner contains comma (punctuation) local comma_pos = term_part.joiner:find(",") if comma_pos then -- Add up to and including comma result = result .. term_part.joiner:sub(1, comma_pos) -- Add refs after comma if term_part.refs ~= "" then result = result .. term_part.refs end -- Add rest of joiner result = result .. term_part.joiner:sub(comma_pos + 1) else -- No comma, add refs before joiner if term_part.refs ~= "" then result = result .. term_part.refs end result = result .. term_part.joiner end end end -- For the last term, add punctuation then refs local last_term = part.term_parts[#part.term_parts] if last_term and last_term.joiner == "" then if part.punctuation ~= "" then -- If we have literal text, punctuation goes AFTER it if part.lit then -- Add refs first (attached to term) if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text result = result .. ", literally “" .. part.lit .. "”" -- Add punctuation result = result .. part.punctuation else -- Normal behavior: punctuation then refs result = result .. part.punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs after term refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end else -- No punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text if present (even without punctuation) if part.lit then result = result .. ", literally “" .. part.lit .. "”" end end end else -- No terms, just add punctuation and keyword refs if part.punctuation ~= "" then result = result .. part.punctuation end -- Add keyword refs even when there are no terms if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end -- Add continuation if part.continuation then result = result .. " " .. assemble_text(part.continuation) end -- Add joiner to next container if part.joiner ~= "" then result = result .. part.joiner end end end return result end local text_tree = build_text_tree(data_tree, 1, true, false) -- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree. local function assemble_supplements() if not data_tree.supplements then return "" end local chunks = {} local pending_trees = {} local function flush_pending_trees() local num = #pending_trees for i, supplement_tree in ipairs(pending_trees) do analyze_punctuation(supplement_tree, true) apply_closing_punctuation_override(supplement_tree, i == num) local chunk = assemble_text(supplement_tree) if chunk ~= "" then table.insert(chunks, chunk) end end pending_trees = {} end for _, supplement in ipairs(data_tree.supplements) do local supplement_tree if supplement.type == "doublet" and supplement.config and supplement.terms and #supplement.terms > 0 then local config = supplement.config local term_parts = {} for _, term in ipairs(supplement.terms) do local term_part = build_term_part(term, entry_lang, 1) if term_part.text ~= "" then table.insert(term_parts, term_part) end end if #term_parts == 0 then supplement_tree = nil else supplement_tree = { type = "tree", container_parts = { { type = "doublet", intro_text = config.text, phrase = config.phrase, term_parts = term_parts, conj = config.default_conj or "û", new_sentence = true, }, }, depth = 1, } end elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then supplement_tree = { type = "tree", container_parts = { { type = "etydate", etydate_text = supplement.etydate_text, etydate_refs = supplement.etydate_refs, new_sentence = true, }, }, depth = 1, } end if supplement_tree then table.insert(pending_trees, supplement_tree) end end flush_pending_trees() return table.concat(chunks, " ") end if not text_tree then local supplement_text = assemble_supplements() if supplement_text == "" then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end if stop_at_lang then return supplement_text, { stop_lang_reached = false } end return supplement_text end local rendered = "" if text_tree then check_complexity(text_tree) analyze_punctuation(text_tree, true) apply_closing_punctuation_override(text_tree, not has_supplements()) rendered = assemble_text(text_tree) end local supplement_text = assemble_supplements() if supplement_text ~= "" then if rendered ~= "" then rendered = rendered .. " " .. supplement_text else rendered = supplement_text end end if stop_at_lang then return rendered, { stop_lang_reached = stop_lang_reached } end return rendered end return export rph63f7am34zj2t95xkk45z839n8f56 6532035 6532032 2026-09-18T16:07:42Z Wikihez 7344 sync test copy 6532035 Scribunto text/plain local export = {} local loader = require("Module:module loader") local M = loader.init({ require = { en_utilities = "Module:en-utilities", references = "Module:references", senseno = "Module:senseno", }, loadData = { data = "Module:etymon/data/ceribandin", }, }) function export.render(opts) opts = opts or {} local data_tree = opts.data_tree local format_term_func = opts.format_term_func local max_depth = opts.max_depth local stop_at_blue_link = opts.stop_at_blue_link local curr_page = opts.curr_page local nodot = opts.nodot and opts.nodot ~= "" and opts.nodot ~= "0" local function explicit_dot_override() if opts.dot == nil or opts.dot == false then return nil end local d = mw.text.trim(tostring(opts.dot)) if d == "" or d == "." then return nil end return d end local dot_override = explicit_dot_override() local function find_deepest_last_part(tree) if not tree or not tree.container_parts or #tree.container_parts == 0 then return nil end local last_part = tree.container_parts[#tree.container_parts] if last_part.continuation then return find_deepest_last_part(last_part.continuation) end return last_part end local function apply_final_punctuation_override(tree, punct) if not tree or punct == nil then return end local last_part = find_deepest_last_part(tree) if last_part then last_part.punctuation = punct end end local function apply_closing_punctuation_override(tree, is_last_segment) if not is_last_segment then return end local punct if nodot then punct = "" elseif dot_override ~= nil then punct = dot_override else return end apply_final_punctuation_override(tree, punct) end local function has_supplements() return data_tree.supplements and #data_tree.supplements > 0 end local stop_at_lang = opts.stop_at_lang local stop_at_lang_or_bluelink = opts.stop_at_lang_or_bluelink local lang_matches_stop_code = opts.lang_matches_stop_code local stop_lang_reached = false local function term_matches_stop_code(term_lang, stop_code) if lang_matches_stop_code then return lang_matches_stop_code(term_lang, stop_code) end return term_lang and term_lang:getCode() == stop_code end local children = data_tree.children local function has_text_supplements() if not data_tree.supplements then return false end for _, supplement in ipairs(data_tree.supplements) do if supplement.type == "doublet" and supplement.terms and #supplement.terms > 0 then return true end if supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then return true end end return false end if (not children or #children == 0) and not has_text_supplements() then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end local top_l2 = data_tree.lang:getFullCode() .. ":" .. curr_page local entry_lang = data_tree.lang local function lowercase_glossary_link_display(wikitext) return wikitext:gsub("(%[%[Nimînok:Ferhengok#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest) return prefix .. mw.ustring.lower(first) .. rest .. "]]" end) end local function format_sl_senseid_intro(senseid, keyword_text, keyword_phrase, capitalize_senseno, is_uncertain) local senseids = mw.text.split(senseid, "!!", true) local senseno_parts = {} for i, id in ipairs(senseids) do id = mw.text.trim(id) if id ~= "" then table.insert(senseno_parts, M.senseno.link_text(entry_lang:getCode(), { id }, { title = curr_page, uc = (i == 1 and capitalize_senseno) or nil, })) end end if #senseno_parts == 0 then return keyword_text, keyword_phrase end local senseno_text = mw.text.listToText(senseno_parts) local glossary_link = (keyword_text or ""):gsub(" from$", "") local glossary_lower = lowercase_glossary_link_display(glossary_link) if #senseno_parts > 1 then local plural_link = glossary_lower:gsub("|semantic loan%]%]", "|semantic loans]]") if is_uncertain then return senseno_text .. " are possibly " .. plural_link .. " from", senseno_text .. " are possibly semantic loans from" end return senseno_text .. " are " .. plural_link .. " from", senseno_text .. " are semantic loans from" end if is_uncertain then return senseno_text .. " is possibly a " .. glossary_lower .. " from", senseno_text .. " is possibly a semantic loan from" end return senseno_text .. " is a " .. glossary_lower .. " from", senseno_text .. " is a semantic loan from" end -- Get refs for a term local function get_term_refs(term, term_lang, depth) local term_l2 = term_lang:getFullCode() .. ":" .. curr_page if term.parsed_ref and (depth == 1 or term_l2 == top_l2) then return M.references.format_references(term.parsed_ref) end return "" end -- Build a text part for a single term local function build_term_part(term, current_lang, depth) local text = "" local new_lang = current_lang local lang_changed = term.lang:getCanonicalName() ~= current_lang:getCanonicalName() -- Use centralized format_term (handles suppress_term, unknown_term, and regular terms) local term_text = format_term_func(term) if lang_changed then new_lang = term.lang if term_text then text = term.lang:makeCategoryLink(true) .. " " .. term_text elseif term.is_family then text = term.lang:makeCategoryLink(true) -- a family: "zimanên îranî" else -- suppress_term with language change: show only language text = term.lang:makeCategoryLink(true) end else text = term_text or "" end return { type = "term", text = text, refs = get_term_refs(term, new_lang, depth), lang = new_lang, is_uncertain = term.is_uncertain or false, } end -- Build text parts for a container local function build_container_part(container, node, depth, allow_continuation, fallback_to_bluelink) local keyword_info = container.keyword_info local keyword_modifiers = container.keyword_modifiers or {} local terms = container.terms or {} if not keyword_info or #terms == 0 then return nil end -- Skip building text part when invisible in text ("all", "text", or true) local inv = keyword_info.invisible if inv == "all" or inv == true or inv == "text" then return nil end local is_group = keyword_info.is_group local keyword_uncertain = keyword_modifiers.unc or false -- Determine text and phrase (allowing for overrides) local intro_text = keyword_info.text local phrase = keyword_info.phrase local new_sentence = keyword_info.new_sentence or false if keyword_modifiers.text then -- User-provided override: assumed to be lowercase phrase = keyword_modifiers.text -- Auto-capitalize for intro text (e.g., "derived from" -> "Derived from") intro_text = mw.ustring.upper(phrase:sub(1, 1)) .. phrase:sub(2) end -- Get keyword references local keyword_refs = "" if keyword_modifiers.ref then local parsed_keyword_refs = M.references.parse_references(keyword_modifiers.ref) if parsed_keyword_refs and parsed_keyword_refs ~= "" then keyword_refs = M.references.format_references(parsed_keyword_refs) end end -- Build term parts local term_parts = {} local current_lang = node.lang for _, term in ipairs(terms) do local term_part = build_term_part(term, current_lang, depth) if term_part.text ~= "" then table.insert(term_parts, term_part) current_lang = term_part.lang end end -- Check uncertainty distribution local uncertain_count = 0 for _, term_part in ipairs(term_parts) do if term_part.is_uncertain then uncertain_count = uncertain_count + 1 end end -- If keyword itself is uncertain, treat all terms as uncertain local all_uncertain = keyword_uncertain or (uncertain_count == #term_parts and #term_parts > 0) if is_group and uncertain_count > 0 then all_uncertain = true end local has_mixed_uncertainty = not all_uncertain and uncertain_count > 0 -- Check if there are more steps (only if continuation is allowed) local has_more_steps = false local next_node = nil local first_term = terms[1] -- Check if we should stop at this language local reached_stop_lang = false if stop_at_lang then for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang) then reached_stop_lang = true stop_lang_reached = true break end end elseif stop_at_lang_or_bluelink then -- Check if we should stop at this language, or at the first bluelink if it's a redlink for _, term in ipairs(terms) do if term.lang and term_matches_stop_code(term.lang, stop_at_lang_or_bluelink) then if first_term.status == M.data.STATUS.OK then reached_stop_lang = true else fallback_to_bluelink = true end break end end if fallback_to_bluelink and first_term.status == M.data.STATUS.OK then reached_stop_lang = true end end if allow_continuation and not is_group and #terms == 1 and not reached_stop_lang then local first_term_children = first_term.children if first_term_children and #first_term_children > 0 and (not max_depth or depth < max_depth) then local next_container = first_term_children[1] local next_keyword_info = next_container and next_container.keyword_info if not (next_keyword_info and next_keyword_info.invisible) then if stop_at_blue_link then if first_term.status ~= M.data.STATUS.OK then has_more_steps = true next_node = first_term end else has_more_steps = true next_node = first_term end end end end return { type = "container", intro_text = intro_text, phrase = phrase, senseid = keyword_modifiers.senseid, sl_keyword_text = keyword_modifiers.senseid and keyword_info.text or nil, is_uncertain = all_uncertain, has_mixed_uncertainty = has_mixed_uncertainty, term_parts = term_parts, is_group = is_group, has_more_steps = has_more_steps, next_node = next_node, new_sentence = new_sentence, separate_clause = keyword_info.separate_clause or false, conj = keyword_modifiers.conj or keyword_info.default_conj, -- custom conjunction: "and", "or", "and/or", etc. lit = keyword_modifiers.lit, keyword_refs = keyword_refs, fallback_to_bluelink = fallback_to_bluelink, } end -- Build the full tree of text parts local function build_text_tree(node, depth, allow_continuation, fallback_to_bluelink) local containers = node.children if not containers or #containers == 0 then return nil end local container_parts = {} -- Count containers that get a text part (invisible in text = "all", "text", or true) local visible_container_count = 0 for _, container in ipairs(containers) do local keyword_info = container.keyword_info local inv = keyword_info and keyword_info.invisible if not (inv == "all" or inv == true or inv == "text") then visible_container_count = visible_container_count + 1 end end -- If there are multiple visible containers at this level, don't allow continuation for any local has_multiple_containers = visible_container_count > 1 local should_allow_continuation = allow_continuation and not has_multiple_containers for _, container in ipairs(containers) do local part = build_container_part(container, node, depth, should_allow_continuation, fallback_to_bluelink) if part then -- Recursively build children if there are more steps if part.has_more_steps and part.next_node then part.continuation = build_text_tree(part.next_node, depth + 1, true, part.fallback_to_bluelink) end table.insert(container_parts, part) end end if #container_parts == 0 then return nil end return { type = "tree", container_parts = container_parts, depth = depth, } end -- Check if tree has mixed joining types local function container_join_kind(part) if part.type == "etydate" then return nil end if part.new_sentence or part.separate_clause then return "supplement" end return "or_join" end local function check_complexity(tree) if not tree then return nil end local parts = tree.container_parts if #parts <= 1 then -- Single container if parts[1] and parts[1].continuation then return check_complexity(parts[1].continuation) end return nil end -- Or-join containers must precede any supplemental (calque-like / influence) containers. local seen_supplement = false for _, part in ipairs(parts) do local kind = container_join_kind(part) if kind == "supplement" then seen_supplement = true elseif kind == "or_join" and seen_supplement then error( "Cannot generate etymology text: a main derivation step cannot follow a calque, semantic loan, or influence clause in the same list.") end end for _, part in ipairs(parts) do if part.continuation then check_complexity(part.continuation) end end return nil end -- Analyze tree and assign punctuation local function analyze_punctuation(tree, is_toplevel) if not tree then return end local parts = tree.container_parts local num_parts = #parts for i, part in ipairs(parts) do local is_first = (i == 1) local is_last = (i == num_parts) local next_part = parts[i + 1] -- Analyze term punctuation within container if part.term_parts then -- Terms use Oxford comma style: "A, B, yan jî C" -- Custom conjunction can be specified via conj modifier (e.g., "and/or", "and") local num_terms = #part.term_parts local term_conj = part.conj or "yan jî" -- Kurdish default for j, term_part in ipairs(part.term_parts) do local is_last_term = (j == num_terms) if part.is_group then -- Group: terms joined with " + " term_part.joiner = is_last_term and "" or " + " elseif num_terms > 1 then -- Multiple terms not in a group: Oxford comma style if is_last_term then term_part.joiner = "" elseif j == num_terms - 1 then -- Second to last term if num_terms == 2 then term_part.joiner = " " .. term_conj .. " " else term_part.joiner = ", " .. term_conj .. " " end else term_part.joiner = ", " end else -- Single term term_part.joiner = "" end end end -- Determine container punctuation based on what comes next if part.continuation then -- Has continuation part.punctuation = "," -- Recursively analyze continuation analyze_punctuation(part.continuation, false) elseif is_last then -- Last container at this level (may still continue in part.continuation) part.punctuation = "." elseif next_part and next_part.new_sentence then -- Next container starts a new sentence part.punctuation = "." elseif next_part and next_part.separate_clause then -- Next container is a separate clause part.punctuation = "," else -- Not last, next is joined with the conjunction -- Containers use repeated conjunction style: "A, yan jî B, yan jî C" part.punctuation = "," end -- Determine joiner to next part -- Containers use the repeated conjunction between each -- Custom conjunction can be specified via conj modifier local container_conj = part.conj or "yan jî" -- Kurdish default if not is_last then if next_part and next_part.new_sentence then -- New sentence part.joiner = " " elseif next_part and next_part.separate_clause then -- Separate clause part.joiner = " " else -- Same sentence: use the custom conjunction, else the default part.joiner = " " .. container_conj .. " " end else part.joiner = "" end -- Determine intro formatting -- Capitalize if first at top level, OR if this container starts a new sentence if (is_first and is_toplevel) or part.new_sentence then part.intro_capitalized = true part.use_full_intro = true else part.intro_capitalized = false part.use_full_intro = false end end end -- Assemble text from analyzed tree local function assemble_text(tree) if not tree then return "" end local result = "" for i, part in ipairs(tree.container_parts) do if part.type == "etydate" then result = result .. part.etydate_text if part.punctuation and part.punctuation ~= "" then result = result .. part.punctuation end if part.etydate_refs and next(part.etydate_refs) then result = result .. M.references.format_references(part.etydate_refs) end if part.joiner and part.joiner ~= "" then result = result .. part.joiner end else -- Build intro local intro_text = part.intro_text local phrase = part.phrase if part.senseid then intro_text, phrase = format_sl_senseid_intro( part.senseid, part.sl_keyword_text, part.phrase, part.intro_capitalized, part.is_uncertain ) end local intro if part.use_full_intro then if part.is_uncertain and not part.senseid then intro = "Mihtemelen " .. phrase else intro = intro_text end else if part.is_uncertain and not part.senseid then intro = "mihtemelen " .. phrase else intro = phrase end end result = result .. intro -- Build terms if #part.term_parts > 0 then result = result .. " " for j, term_part in ipairs(part.term_parts) do -- Add "possibly" prefix for uncertain terms when there's mixed uncertainty if part.has_mixed_uncertainty and term_part.is_uncertain then result = result .. "mihtemelen " end result = result .. term_part.text -- Add joiner between terms if term_part.joiner ~= "" then -- Check if joiner contains comma (punctuation) local comma_pos = term_part.joiner:find(",") if comma_pos then -- Add up to and including comma result = result .. term_part.joiner:sub(1, comma_pos) -- Add refs after comma if term_part.refs ~= "" then result = result .. term_part.refs end -- Add rest of joiner result = result .. term_part.joiner:sub(comma_pos + 1) else -- No comma, add refs before joiner if term_part.refs ~= "" then result = result .. term_part.refs end result = result .. term_part.joiner end end end -- For the last term, add punctuation then refs local last_term = part.term_parts[#part.term_parts] if last_term and last_term.joiner == "" then if part.punctuation ~= "" then -- If we have literal text, punctuation goes AFTER it if part.lit then -- Add refs first (attached to term) if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text result = result .. ", literally “" .. part.lit .. "”" -- Add punctuation result = result .. part.punctuation else -- Normal behavior: punctuation then refs result = result .. part.punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs after term refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end else -- No punctuation if last_term.refs ~= "" then result = result .. last_term.refs end -- Add keyword refs if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end -- Add literal text if present (even without punctuation) if part.lit then result = result .. ", literally “" .. part.lit .. "”" end end end else -- No terms, just add punctuation and keyword refs if part.punctuation ~= "" then result = result .. part.punctuation end -- Add keyword refs even when there are no terms if part.keyword_refs and part.keyword_refs ~= "" then result = result .. part.keyword_refs end end -- Add continuation if part.continuation then result = result .. " " .. assemble_text(part.continuation) end -- Add joiner to next container if part.joiner ~= "" then result = result .. part.joiner end end end return result end local text_tree = build_text_tree(data_tree, 1, true, false) -- Supplements (doublets, etydate, …) are rendered outside the main derivation text tree. local function assemble_supplements() if not data_tree.supplements then return "" end local chunks = {} local pending_trees = {} local function flush_pending_trees() local num = #pending_trees for i, supplement_tree in ipairs(pending_trees) do analyze_punctuation(supplement_tree, true) apply_closing_punctuation_override(supplement_tree, i == num) local chunk = assemble_text(supplement_tree) if chunk ~= "" then table.insert(chunks, chunk) end end pending_trees = {} end for _, supplement in ipairs(data_tree.supplements) do local supplement_tree if supplement.type == "doublet" and supplement.config and supplement.terms and #supplement.terms > 0 then local config = supplement.config local term_parts = {} for _, term in ipairs(supplement.terms) do local term_part = build_term_part(term, entry_lang, 1) if term_part.text ~= "" then table.insert(term_parts, term_part) end end if #term_parts == 0 then supplement_tree = nil else supplement_tree = { type = "tree", container_parts = { { type = "doublet", intro_text = config.text, phrase = config.phrase, term_parts = term_parts, conj = config.default_conj or "û", new_sentence = true, }, }, depth = 1, } end elseif supplement.type == "etydate" and supplement.etydate_text and supplement.etydate_text ~= "" then supplement_tree = { type = "tree", container_parts = { { type = "etydate", etydate_text = supplement.etydate_text, etydate_refs = supplement.etydate_refs, new_sentence = true, }, }, depth = 1, } end if supplement_tree then table.insert(pending_trees, supplement_tree) end end flush_pending_trees() return table.concat(chunks, " ") end if not text_tree then local supplement_text = assemble_supplements() if supplement_text == "" then if stop_at_lang then return "", { stop_lang_reached = false } end return "" end if stop_at_lang then return supplement_text, { stop_lang_reached = false } end return supplement_text end local rendered = "" if text_tree then check_complexity(text_tree) analyze_punctuation(text_tree, true) apply_closing_punctuation_override(text_tree, not has_supplements()) rendered = assemble_text(text_tree) end local supplement_text = assemble_supplements() if supplement_text ~= "" then if rendered ~= "" then rendered = rendered .. " " .. supplement_text else rendered = supplement_text end end if stop_at_lang then return rendered, { stop_lang_reached = stop_lang_reached } end return rendered end return export a0p4o3zxiq72k8j0pbxt1kv2umqzfl4 Modul:etymon/data/ceribandin 828 1359187 6532037 6531856 2026-09-18T16:34:45Z Wikihez 7344 sync test copy 6532037 Scribunto text/plain local export = {} export.STATUS = { OK = "ok", INLINE = "inline", MISSING = "missing", REDLINK = "redlink", AMBIGUOUS = "ambiguous", } export.TRANSITIVE = { ALWAYS = "always", -- always recurse into children NEVER = "never", -- never recurse into children CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues) CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context } -- Deep merge tables (nested tables are merged recursively, later values override earlier) local function deep_merge(...) local result = {} for _, t in ipairs({ ... }) do for k, v in pairs(t) do if type(v) == "table" and type(result[k]) == "table" then result[k] = deep_merge(result[k], v) else result[k] = v end end end return result end local glossary_page = "Nimînok:Ferhengok" -- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger". local function make_glossary_link(term, display_text) if not term then return display_text end local page, anchor = term:match("^(.-)#(.+)$") if not page then page, anchor = glossary_page, term end return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]" end -- Extract base word and connector from text like "Borrowed from" or "calque of" local function split_glossary_text(text) for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do local base, rest = text:match(pattern) if base then return base, rest end end return text, "" end local TRANSITIVE = export.TRANSITIVE local function create_keyword(opts) local entry = { is_group = opts.is_group or false, abbrev = opts.abbrev, glossary = opts.glossary, transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always" inherited_chain = opts.inherited_chain or false, affix_categories = opts.affix_categories or false, borrowing_type = opts.borrowing_type, specialized_borrowing = opts.specialized_borrowing, toplevel_category = opts.toplevel_category, no_child_categories = opts.no_child_categories or false, source_category_type = opts.source_category_type, invisible = (opts.invisible == true and "all") or opts.invisible or false, pos_override = opts.pos_override, new_sentence = opts.new_sentence or false, separate_clause = opts.separate_clause or false, default_conj = opts.default_conj, min_etymons = opts.min_etymons, max_etymons = opts.max_etymons, term_rules = opts.term_rules, aliases = opts.aliases, } -- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text") local inv = entry.invisible if inv ~= "all" and inv ~= "text" then entry.phrase = opts.phrase if opts.text then if opts.glossary then local base_word, rest = split_glossary_text(opts.text) entry.text = make_glossary_link(opts.glossary, base_word) .. rest else entry.text = opts.text end end end return entry end -- Shared defaults for keyword groups local DEFAULTS = { -- Keywords that pass through inheritance chain inheritance = { transitive = TRANSITIVE.ALWAYS, inherited_chain = true, }, -- Standard transitive derivation transitive = { transitive = TRANSITIVE.ALWAYS, }, -- Standard for internal derivations: transitive across languages, but not within them internal_derivation = { transitive = TRANSITIVE.CROSS_LANG, }, -- Borrowing keywords borrowing = { transitive = TRANSITIVE.ALWAYS, }, -- Affix group keywords (compound words, blends, etc.) affix_group = { is_group = true, min_etymons = 2, transitive = TRANSITIVE.CROSS_LANG, affix_categories = true, }, -- Calque-like keywords (calque, partial calque, semantic loan) calque_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, new_sentence = true, }, -- Non-transitive influence influence_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, }, } export.keywords = { -- -- Inheritance keywords -- ["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Ji", phrase = "ji", aliases = { "ji" }, term_rules = { entry_lang = true }, })), ["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Mîrasmayî ji", phrase = "mîrasmayî ji", glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî", aliases = { "inh", "mîrasmayî", "mîr" }, term_rules = { family = "disallowed", family_suffix = "; use a specific language.", ancestor_check = true, }, })), -- -- Basic derivation keywords -- ["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", aliases = { "drşnd" }, toplevel_category = "Dariştinên nediyar", })), ["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", abbrev = "drş.", glossary = "Nimînok:Ferhengok#dariştî", aliases = { "der", "dariştî", "drş" }, })), -- -- Affix/compound group keywords -- ["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", min_etymons = 1, aliases = { "af", "qertaf", "qf" }, })), ["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Têkilkirin ji", phrase = "têkilkirin ji", aliases = { "têkilkirin" }, abbrev = "blend", glossary = "Nimînok:Ferhengok#têkilkirin", toplevel_category = "Têkilkirin", })), ["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ûnîverbasyona", phrase = "ûnîverbasyona", abbrev = "univ.", glossary = "ûnîverbasyon", toplevel_category = "univerbations", min_etymons = 1, aliases = { "univ" }, })), ["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "[[Sanskritic]] formation from", phrase = "a [[Sanskritic]] formation of", toplevel_category = "Sanskritic formations", })), -- -- Borrowing keywords -- ["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deyn ji", phrase = "deynkirî ji", abbrev = "deyn.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", borrowing_type = "borrowed", aliases = { "borrowed", "deyn" }, })), ["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ji", phrase = "deynkirina hînbûyî ji", aliases = { "deynh" }, abbrev = "deynh.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "learned", })), ["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina ortografîk ji", phrase = "deynkirina ortografîk ji", abbrev = "obor.", glossary = "deynkirina ortografîk", specialized_borrowing = "orthographic", })), ["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ya qismî ji", phrase = "deynkirina hînbûyî ya qismî ji", aliases = { "deynhq" }, abbrev = "deynhq.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "semi-learned", })), ["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina neadaptekirî ji", phrase = "deynkirina neadaptekirî ji", abbrev = "ubor.", glossary = "deynkirina neadaptekirî", specialized_borrowing = "unadapted", })), -- -- Calque-like keywords (non-transitive, start new sentence) -- ["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser ji", phrase = "wergerandina yekser ji", abbrev = "yekser", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "calque", aliases = { "cal", "clq", "yekser" }, })), ["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser a qismî ji", phrase = "wergerandina yekser a qismî ji", abbrev = "yekserq.", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "partial-calque", aliases = { "pcal", "yekserqismî", "yekserq" }, })), ["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergirtina maneyê ji", phrase = "wergirtina maneyê ji", abbrev = "wer. mane", glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê", specialized_borrowing = "semantic-loan", aliases = { "sl", "wergirtin" }, })), ["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Lihevanîna dengî-maneyî ji", phrase = "lihevanîna dengî-maneyî ji", abbrev = "lihevanîn", glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî", specialized_borrowing = "phono-semantic-matching", aliases = { "phono-semantic matching", "lihevanîn" }, })), -- -- Influence keywords (non-transitive, separate clause) -- ["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, { text = "Di bin tesîra", phrase = "bin tesîra", aliases = { "tesîr" }, abbrev = "tesîr.", glossary = "belavbûn ji zimanekî din", separate_clause = true, })), -- -- Morphological derivation keywords -- ["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Qusandin ji", phrase = "qusandin ji", abbrev = "qusandin", glossary = "Nimînok:Ferhengok#qusandin", toplevel_category = "Qusandin", aliases = { "clip", "qusandin" }, })), ["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Elîpsîza", phrase = "elîpsîza", abbrev = "ellip.", glossary = "elîpsîz", toplevel_category = "ellipses", aliases = { "ellip" }, })), ["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Paşvesazî ji", phrase = "paşvesazî ji", abbrev = "paşvesazî", glossary = "Nimînok:Ferhengok#paşvesazî", toplevel_category = "Paşvesazî", aliases = { "bf", "paşvesazî" }, })), ["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Nomînalîzasyona", phrase = "nomînalîzasyona", abbrev = "nom.", glossary = "nomînalîzasyon", toplevel_category = "nominalizations", aliases = { "nom" }, })), ["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Translîterasyona", phrase = "translîterasyona", abbrev = "translit.", glossary = "translîterasyon", aliases = { "translit" }, })), ["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Apheretic form of", phrase = "an apheretic form of", abbrev = "aph.", glossary = "apheresis", aliases = { "apheresis", "aphetic" }, })), ["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Denominal verb from", phrase = "denominal verb from", abbrev = "denom.", glossary = "denominal", toplevel_category = "denominal verbs", aliases = { "denom" }, })), ["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Deverbal from", phrase = "deverbal from", abbrev = "deverb.", glossary = "deverbal", toplevel_category = "deverbals", })), ["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Redûblîcasyona", phrase = "redûblîcasyona", abbrev = "redup.", glossary = "redûblîcasyon", toplevel_category = "reduplications", aliases = { "redup" }, })), ["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Kurtkirina", phrase = "kurtkirina", abbrev = "kurt.", aliases = { "abbr", "abbrev", "kurtkirin" }, })), ["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Syllabic abbreviation of", phrase = "syllabic abbreviation of", abbrev = "syl. abbr.", glossary = "syllabic abbreviation", aliases = { "sylabbr", "sylabbrev" }, })), ["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Akronîma", phrase = "akronîma", abbrev = "acronym", glossary = "akronîm", aliases = { "acro" }, })), ["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Înîtîalîzma", phrase = "înîtîalîzma", abbrev = "init.", glossary = "înîtîalîzm", aliases = { "init" }, })), ["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Metateza", phrase = "metateza", abbrev = "meta.", glossary = "metatez", toplevel_category = "peyvên dariştî bi riya metatezê", aliases = { "meta" }, })), -- -- Invisible keywords (no text output) -- ["root"] = create_keyword { transitive = TRANSITIVE.ALWAYS, invisible = "all", pos_override = "root", aliases = { "reh" }, }, ["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", transitive = TRANSITIVE.NEVER, min_etymons = 1, invisible = "all", })), } -- Template-parameter supplements. export.supplements = { doublet = { text = "Cotreha", phrase = "cotreha", glossary = "Nimînok:Ferhengok#cotreh", toplevel_category = "Cotreh", default_conj = "û", term_rules = { entry_lang = true, require_term = true, disallow = { "suppress", "unknown", "family" }, }, }, } local aliases_to_register = {} local canonical_aliases = {} -- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking. export.keyword_canonical = {} for name, keyword_data in pairs(export.keywords) do export.keyword_canonical[name] = name if keyword_data.aliases then canonical_aliases[name] = keyword_data.aliases for _, alias in ipairs(keyword_data.aliases) do if export.keywords[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.") end if aliases_to_register[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.") end aliases_to_register[alias] = keyword_data export.keyword_canonical[alias] = name end keyword_data.aliases = nil end end for alias, data in pairs(aliases_to_register) do export.keywords[alias] = data end -- -- Language exception presets -- local EXCEPTION_PRESETS = { -- Fully disallowed: no tree, no text, no categories disallowed = { disallow = { tree = true, text = true }, suppress_categories = true, }, -- Suppress transliteration only no_translit = { suppress_tr = true, }, -- Suppress all categories only no_categories = { suppress_categories = true, }, } --[=[ Available exception options: disallow = { Related options for disallowing output: tree Disallow etymology trees for this language text Disallow etymology text generation for this language ref Reference link shown when tree/text is disallowed } suppress_tr Suppress transliteration in links suppress_categories Suppress all category generation normalize_to Normalize language code to a different code normalize_from_families Apply normalization to languages in these families normalize_exclude_families Exclude these families from normalization keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } }) ]=] local function create_exception(preset, overrides) local base = preset and EXCEPTION_PRESETS[preset] or {} return deep_merge(base, overrides or {}) end export.config = { lang_exceptions = { ["zh"] = create_exception("disallowed", { disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" }, suppress_tr = true, normalize_to = "zh", normalize_from_families = { "zhx" }, normalize_exclude_families = { "qfa-cnt" }, }), }, } -- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes) -- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of -- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is -- passed through to it for the gender tag, so anything valid here is valid there. A two-letter -- gender+number code that is not listed ("np", "mp") is decomposed automatically below. export.nominalization_g_codes = { -- Cins ["n"] = "nêr", ["m"] = "mê", ["f"] = "mê", ["nt"] = "nêtar", ["c"] = "giştî", ["g"] = "giştî", ["cnt"] = "cinsê-notr", -- Hejmar ["y"] = "yekjimar", ["s"] = "yekjimar", ["p"] = "pirjimar", ["d"] = "dual", -- Kodên hevedudanî yên [[Modul:gender and number/data]] ["mf"] = "nêr an mê", ["mn"] = "mê an nêr", ["mnt"] = "mê an nêtar", } -- -- Propagate keyword overrides to aliases -- if export.config.lang_exceptions then for lang_code, exception in pairs(export.config.lang_exceptions) do if exception.keyword_overrides then for canonical, aliases in pairs(canonical_aliases) do if exception.keyword_overrides[canonical] then local override_data = exception.keyword_overrides[canonical] for _, alias in ipairs(aliases) do if not exception.keyword_overrides[alias] then exception.keyword_overrides[alias] = override_data end end end end end end end return export 4jqasrug1e75idczdq2t4w9qgohmy29 6532038 6532037 2026-09-18T16:39:06Z Wikihez 7344 sync test copy 6532038 Scribunto text/plain local export = {} export.STATUS = { OK = "ok", INLINE = "inline", MISSING = "missing", REDLINK = "redlink", AMBIGUOUS = "ambiguous", } export.TRANSITIVE = { ALWAYS = "always", -- always recurse into children NEVER = "never", -- never recurse into children CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues) CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context } -- Deep merge tables (nested tables are merged recursively, later values override earlier) local function deep_merge(...) local result = {} for _, t in ipairs({ ... }) do for k, v in pairs(t) do if type(v) == "table" and type(result[k]) == "table" then result[k] = deep_merge(result[k], v) else result[k] = v end end end return result end local glossary_page = "Nimînok:Ferhengok" -- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger". local function make_glossary_link(term, display_text) if not term then return display_text end local page, anchor = term:match("^(.-)#(.+)$") if not page then page, anchor = glossary_page, term end return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]" end -- Extract base word and connector from text like "Borrowed from" or "calque of" local function split_glossary_text(text) for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do local base, rest = text:match(pattern) if base then return base, rest end end return text, "" end local TRANSITIVE = export.TRANSITIVE local function create_keyword(opts) local entry = { is_group = opts.is_group or false, abbrev = opts.abbrev, glossary = opts.glossary, transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always" inherited_chain = opts.inherited_chain or false, affix_categories = opts.affix_categories or false, borrowing_type = opts.borrowing_type, specialized_borrowing = opts.specialized_borrowing, toplevel_category = opts.toplevel_category, no_child_categories = opts.no_child_categories or false, source_category_type = opts.source_category_type, invisible = (opts.invisible == true and "all") or opts.invisible or false, pos_override = opts.pos_override, new_sentence = opts.new_sentence or false, separate_clause = opts.separate_clause or false, default_conj = opts.default_conj, min_etymons = opts.min_etymons, max_etymons = opts.max_etymons, term_rules = opts.term_rules, aliases = opts.aliases, } -- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text") local inv = entry.invisible if inv ~= "all" and inv ~= "text" then entry.phrase = opts.phrase if opts.text then if opts.glossary then local base_word, rest = split_glossary_text(opts.text) entry.text = make_glossary_link(opts.glossary, base_word) .. rest else entry.text = opts.text end end end return entry end -- Shared defaults for keyword groups local DEFAULTS = { -- Keywords that pass through inheritance chain inheritance = { transitive = TRANSITIVE.ALWAYS, inherited_chain = true, }, -- Standard transitive derivation transitive = { transitive = TRANSITIVE.ALWAYS, }, -- Standard for internal derivations: transitive across languages, but not within them internal_derivation = { transitive = TRANSITIVE.CROSS_LANG, }, -- Borrowing keywords borrowing = { transitive = TRANSITIVE.ALWAYS, }, -- Affix group keywords (compound words, blends, etc.) affix_group = { is_group = true, min_etymons = 2, transitive = TRANSITIVE.CROSS_LANG, affix_categories = true, }, -- Calque-like keywords (calque, partial calque, semantic loan) calque_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, new_sentence = true, }, -- Non-transitive influence influence_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, }, } export.keywords = { -- -- Inheritance keywords -- ["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Ji", phrase = "ji", aliases = { "ji" }, term_rules = { entry_lang = true }, })), ["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Mîrasmayî ji", phrase = "mîrasmayî ji", glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî", aliases = { "inh", "mîrasmayî", "mîr" }, term_rules = { family = "disallowed", family_suffix = "; use a specific language.", ancestor_check = true, }, })), -- -- Basic derivation keywords -- ["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", aliases = { "drşnd" }, toplevel_category = "Dariştinên nediyar", })), ["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", abbrev = "drş.", glossary = "Nimînok:Ferhengok#dariştî", aliases = { "der", "dariştî", "drş" }, })), -- -- Affix/compound group keywords -- ["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", min_etymons = 1, aliases = { "af", "qertaf", "qf" }, })), ["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Têkilkirin ji", phrase = "têkilkirin ji", aliases = { "têkilkirin" }, abbrev = "blend", glossary = "Nimînok:Ferhengok#têkilkirin", toplevel_category = "Têkilkirin", })), ["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ûnîverbasyona", phrase = "ûnîverbasyona", abbrev = "ûnîv.", glossary = "ûnîverbasyon", toplevel_category = "univerbations", min_etymons = 1, aliases = { "univ", "ûnîverbasyon", "ûnîv" }, })), ["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "[[Sanskritic]] formation from", phrase = "a [[Sanskritic]] formation of", toplevel_category = "Sanskritic formations", })), -- -- Borrowing keywords -- ["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deyn ji", phrase = "deynkirî ji", abbrev = "deyn.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", borrowing_type = "borrowed", aliases = { "borrowed", "deyn" }, })), ["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ji", phrase = "deynkirina hînbûyî ji", aliases = { "deynh" }, abbrev = "deynh.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "learned", })), ["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina ortografîk ji", phrase = "deynkirina ortografîk ji", abbrev = "deynort.", glossary = "deynkirina ortografîk", specialized_borrowing = "orthographic", aliases = { "deynort" }, })), ["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ya qismî ji", phrase = "deynkirina hînbûyî ya qismî ji", aliases = { "deynhq" }, abbrev = "deynhq.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "semi-learned", })), ["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina neadaptekirî ji", phrase = "deynkirina neadaptekirî ji", abbrev = "deynne.", glossary = "deynkirina neadaptekirî", specialized_borrowing = "unadapted", aliases = { "deynne" }, })), -- -- Calque-like keywords (non-transitive, start new sentence) -- ["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser ji", phrase = "wergerandina yekser ji", abbrev = "yekser", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "calque", aliases = { "cal", "clq", "yekser" }, })), ["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser a qismî ji", phrase = "wergerandina yekser a qismî ji", abbrev = "yekserq.", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "partial-calque", aliases = { "pcal", "yekserqismî", "yekserq" }, })), ["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergirtina maneyê ji", phrase = "wergirtina maneyê ji", abbrev = "wer. mane", glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê", specialized_borrowing = "semantic-loan", aliases = { "sl", "wergirtin" }, })), ["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Lihevanîna dengî-maneyî ji", phrase = "lihevanîna dengî-maneyî ji", abbrev = "lihevanîn", glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî", specialized_borrowing = "phono-semantic-matching", aliases = { "phono-semantic matching", "lihevanîn" }, })), -- -- Influence keywords (non-transitive, separate clause) -- ["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, { text = "Di bin tesîra", phrase = "bin tesîra", aliases = { "tesîr" }, abbrev = "tesîr.", glossary = "belavbûn ji zimanekî din", separate_clause = true, })), -- -- Morphological derivation keywords -- ["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Qusandin ji", phrase = "qusandin ji", abbrev = "qusandin", glossary = "Nimînok:Ferhengok#qusandin", toplevel_category = "Qusandin", aliases = { "clip", "qusandin" }, })), ["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Elîpsîza", phrase = "elîpsîza", abbrev = "elîp.", glossary = "elîpsîz", toplevel_category = "ellipses", aliases = { "ellip", "elîpsîz", "elîp" }, })), ["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Paşvesazî ji", phrase = "paşvesazî ji", abbrev = "paşvesazî", glossary = "Nimînok:Ferhengok#paşvesazî", toplevel_category = "Paşvesazî", aliases = { "bf", "paşvesazî" }, })), ["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Nomînalîzasyona", phrase = "nomînalîzasyona", abbrev = "nomîn.", glossary = "nomînalîzasyon", toplevel_category = "nominalizations", aliases = { "nom", "nomînalîzasyon", "nomîn" }, })), ["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Translîterasyona", phrase = "translîterasyona", abbrev = "translît.", glossary = "translîterasyon", aliases = { "translit", "translîterasyon", "translît" }, })), ["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Apheretic form of", phrase = "an apheretic form of", abbrev = "aph.", glossary = "apheresis", aliases = { "apheresis", "aphetic" }, })), ["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Denominal verb from", phrase = "denominal verb from", abbrev = "denom.", glossary = "denominal", toplevel_category = "denominal verbs", aliases = { "denom" }, })), ["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Deverbal from", phrase = "deverbal from", abbrev = "deverb.", glossary = "deverbal", toplevel_category = "deverbals", })), ["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Redûblîcasyona", phrase = "redûblîcasyona", abbrev = "redûb.", glossary = "redûblîcasyon", toplevel_category = "reduplications", aliases = { "redup", "redûblîcasyon", "redûb" }, })), ["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Kurtkirina", phrase = "kurtkirina", abbrev = "kurt.", aliases = { "abbr", "abbrev", "kurtkirin" }, })), ["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Syllabic abbreviation of", phrase = "syllabic abbreviation of", abbrev = "syl. abbr.", glossary = "syllabic abbreviation", aliases = { "sylabbr", "sylabbrev" }, })), ["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Akronîma", phrase = "akronîma", abbrev = "akronîm", glossary = "akronîm", aliases = { "acro", "akronîm" }, })), ["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Înîtîalîzma", phrase = "înîtîalîzma", abbrev = "înît.", glossary = "înîtîalîzm", aliases = { "init", "înîtîalîzm", "înît" }, })), ["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Metateza", phrase = "metateza", abbrev = "meta.", glossary = "metatez", toplevel_category = "peyvên dariştî bi riya metatezê", aliases = { "meta", "metatez" }, })), -- -- Invisible keywords (no text output) -- ["root"] = create_keyword { transitive = TRANSITIVE.ALWAYS, invisible = "all", pos_override = "root", aliases = { "reh" }, }, ["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", transitive = TRANSITIVE.NEVER, min_etymons = 1, invisible = "all", })), } -- Template-parameter supplements. export.supplements = { doublet = { text = "Cotreha", phrase = "cotreha", glossary = "Nimînok:Ferhengok#cotreh", toplevel_category = "Cotreh", default_conj = "û", term_rules = { entry_lang = true, require_term = true, disallow = { "suppress", "unknown", "family" }, }, }, } local aliases_to_register = {} local canonical_aliases = {} -- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking. export.keyword_canonical = {} for name, keyword_data in pairs(export.keywords) do export.keyword_canonical[name] = name if keyword_data.aliases then canonical_aliases[name] = keyword_data.aliases for _, alias in ipairs(keyword_data.aliases) do if export.keywords[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.") end if aliases_to_register[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.") end aliases_to_register[alias] = keyword_data export.keyword_canonical[alias] = name end keyword_data.aliases = nil end end for alias, data in pairs(aliases_to_register) do export.keywords[alias] = data end -- -- Language exception presets -- local EXCEPTION_PRESETS = { -- Fully disallowed: no tree, no text, no categories disallowed = { disallow = { tree = true, text = true }, suppress_categories = true, }, -- Suppress transliteration only no_translit = { suppress_tr = true, }, -- Suppress all categories only no_categories = { suppress_categories = true, }, } --[=[ Available exception options: disallow = { Related options for disallowing output: tree Disallow etymology trees for this language text Disallow etymology text generation for this language ref Reference link shown when tree/text is disallowed } suppress_tr Suppress transliteration in links suppress_categories Suppress all category generation normalize_to Normalize language code to a different code normalize_from_families Apply normalization to languages in these families normalize_exclude_families Exclude these families from normalization keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } }) ]=] local function create_exception(preset, overrides) local base = preset and EXCEPTION_PRESETS[preset] or {} return deep_merge(base, overrides or {}) end export.config = { lang_exceptions = { ["zh"] = create_exception("disallowed", { disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" }, suppress_tr = true, normalize_to = "zh", normalize_from_families = { "zhx" }, normalize_exclude_families = { "qfa-cnt" }, }), }, } -- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes) -- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of -- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is -- passed through to it for the gender tag, so anything valid here is valid there. A two-letter -- gender+number code that is not listed ("np", "mp") is decomposed automatically below. export.nominalization_g_codes = { -- Cins ["n"] = "nêr", ["m"] = "mê", ["f"] = "mê", ["nt"] = "nêtar", ["c"] = "giştî", ["g"] = "giştî", ["cnt"] = "cinsê-notr", -- Hejmar ["y"] = "yekjimar", ["s"] = "yekjimar", ["p"] = "pirjimar", ["d"] = "dual", -- Kodên hevedudanî yên [[Modul:gender and number/data]] ["mf"] = "nêr an mê", ["mn"] = "mê an nêr", ["mnt"] = "mê an nêtar", } -- -- Propagate keyword overrides to aliases -- if export.config.lang_exceptions then for lang_code, exception in pairs(export.config.lang_exceptions) do if exception.keyword_overrides then for canonical, aliases in pairs(canonical_aliases) do if exception.keyword_overrides[canonical] then local override_data = exception.keyword_overrides[canonical] for _, alias in ipairs(aliases) do if not exception.keyword_overrides[alias] then exception.keyword_overrides[alias] = override_data end end end end end end end return export gq7pkwytx2usrb5n6ojbcvtd7c42m7p 6532041 6532038 2026-09-18T16:46:35Z Wikihez 7344 sync test copy 6532041 Scribunto text/plain local export = {} export.STATUS = { OK = "ok", INLINE = "inline", MISSING = "missing", REDLINK = "redlink", AMBIGUOUS = "ambiguous", } export.TRANSITIVE = { ALWAYS = "always", -- always recurse into children NEVER = "never", -- never recurse into children CROSS_LANG = "cross_lang", -- only recurse when source lang differs from target lang (but pos chain continues) CROSS_LANG_NO_INTERNAL_SOURCE = "cross_lang_no_internal_source", -- like CROSS_LANG, but source breaks for internal derivations in the same language context } -- Deep merge tables (nested tables are merged recursively, later values override earlier) local function deep_merge(...) local result = {} for _, t in ipairs({ ... }) do for k, v in pairs(t) do if type(v) == "table" and type(result[k]) == "table" then result[k] = deep_merge(result[k], v) else result[k] = v end end end return result end local glossary_page = "Nimînok:Ferhengok" -- `term` is either a bare anchor on the glossary page or a full "Rûpel#lenger". local function make_glossary_link(term, display_text) if not term then return display_text end local page, anchor = term:match("^(.-)#(.+)$") if not page then page, anchor = glossary_page, term end return "[[" .. page .. "#" .. anchor:gsub(" ", "_") .. "|" .. display_text .. "]]" end -- Extract base word and connector from text like "Borrowed from" or "calque of" local function split_glossary_text(text) for _, pattern in ipairs({ "^(.-)(%s+[Jj][Ii])$", "^(.-)(%s+[Oo][Ff])$", "^(.-)(%s+[Ff][Rr][Oo][Mm])$" }) do local base, rest = text:match(pattern) if base then return base, rest end end return text, "" end local TRANSITIVE = export.TRANSITIVE local function create_keyword(opts) local entry = { is_group = opts.is_group or false, abbrev = opts.abbrev, glossary = opts.glossary, transitive = opts.transitive or TRANSITIVE.ALWAYS, -- default "always" inherited_chain = opts.inherited_chain or false, affix_categories = opts.affix_categories or false, borrowing_type = opts.borrowing_type, specialized_borrowing = opts.specialized_borrowing, toplevel_category = opts.toplevel_category, no_child_categories = opts.no_child_categories or false, source_category_type = opts.source_category_type, invisible = (opts.invisible == true and "all") or opts.invisible or false, pos_override = opts.pos_override, new_sentence = opts.new_sentence or false, separate_clause = opts.separate_clause or false, default_conj = opts.default_conj, min_etymons = opts.min_etymons, max_etymons = opts.max_etymons, term_rules = opts.term_rules, aliases = opts.aliases, } -- Only set text/phrase when visible in text (invisible ~= "all" and ~= "text") local inv = entry.invisible if inv ~= "all" and inv ~= "text" then entry.phrase = opts.phrase if opts.text then if opts.glossary then local base_word, rest = split_glossary_text(opts.text) entry.text = make_glossary_link(opts.glossary, base_word) .. rest else entry.text = opts.text end end end return entry end -- Shared defaults for keyword groups local DEFAULTS = { -- Keywords that pass through inheritance chain inheritance = { transitive = TRANSITIVE.ALWAYS, inherited_chain = true, }, -- Standard transitive derivation transitive = { transitive = TRANSITIVE.ALWAYS, }, -- Standard for internal derivations: transitive across languages, but not within them internal_derivation = { transitive = TRANSITIVE.CROSS_LANG, }, -- Borrowing keywords borrowing = { transitive = TRANSITIVE.ALWAYS, }, -- Affix group keywords (compound words, blends, etc.) affix_group = { is_group = true, min_etymons = 2, transitive = TRANSITIVE.CROSS_LANG, affix_categories = true, }, -- Calque-like keywords (calque, partial calque, semantic loan) calque_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, new_sentence = true, }, -- Non-transitive influence influence_like = { transitive = TRANSITIVE.NEVER, no_child_categories = true, }, } export.keywords = { -- -- Inheritance keywords -- ["from"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Ji", phrase = "ji", aliases = { "ji" }, term_rules = { entry_lang = true }, })), ["inherited"] = create_keyword(deep_merge(DEFAULTS.inheritance, { text = "Mîrasmayî ji", phrase = "mîrasmayî ji", glossary = "Wîkîferheng:Etîmolojî#Peyvên mîrasmayî", aliases = { "inh", "mîrasmayî", "mîr" }, term_rules = { family = "disallowed", family_suffix = "; use a specific language.", ancestor_check = true, }, })), -- -- Basic derivation keywords -- ["uder"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", aliases = { "drşnd" }, toplevel_category = "Dariştinên nediyar", })), ["derived"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Ji", phrase = "ji", abbrev = "drş.", glossary = "Nimînok:Ferhengok#dariştî", aliases = { "der", "dariştî", "drş" }, })), -- -- Affix/compound group keywords -- ["affix"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", min_etymons = 1, aliases = { "af", "qertaf", "qf" }, })), ["blend"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Têkilkirin ji", phrase = "têkilkirin ji", aliases = { "têkilkirin" }, abbrev = "blend", glossary = "Nimînok:Ferhengok#têkilkirin", toplevel_category = "Têkilkirin", })), ["univerbation"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ûnîverbasyona", phrase = "ûnîverbasyona", abbrev = "ûnîv.", glossary = "ûnîverbasyon", toplevel_category = "univerbations", min_etymons = 1, aliases = { "univ", "ûnîverbasyon", "ûnîv" }, })), ["vrd-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["sa-af"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "[[Sanskritic]] formation from", phrase = "a [[Sanskritic]] formation of", toplevel_category = "Sanskritic formations", })), -- -- Borrowing keywords -- ["bor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deyn ji", phrase = "deynkirî ji", abbrev = "deyn.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", borrowing_type = "borrowed", aliases = { "borrowed", "deyn" }, })), ["lbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ji", phrase = "deynkirina hînbûyî ji", aliases = { "deynh" }, abbrev = "deynh.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "learned", })), ["obor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina ortografîk ji", phrase = "deynkirina ortografîk ji", abbrev = "deynort.", glossary = "deynkirina ortografîk", specialized_borrowing = "orthographic", aliases = { "deynort" }, })), ["slbor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina hînbûyî ya qismî ji", phrase = "deynkirina hînbûyî ya qismî ji", aliases = { "deynhq" }, abbrev = "deynhq.", glossary = "Wîkîferheng:Etîmolojî#Peyvên deynkirî", specialized_borrowing = "semi-learned", })), ["ubor"] = create_keyword(deep_merge(DEFAULTS.borrowing, { text = "Deynkirina neadaptekirî ji", phrase = "deynkirina neadaptekirî ji", abbrev = "deynne.", glossary = "deynkirina neadaptekirî", specialized_borrowing = "unadapted", aliases = { "deynne" }, })), -- -- Calque-like keywords (non-transitive, start new sentence) -- ["calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser ji", phrase = "wergerandina yekser ji", abbrev = "yekser", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "calque", aliases = { "cal", "clq", "yekser" }, })), ["partial calque"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergerandina yekser a qismî ji", phrase = "wergerandina yekser a qismî ji", abbrev = "yekserq.", glossary = "Nimînok:Ferhengok#yekser", specialized_borrowing = "partial-calque", aliases = { "pcal", "yekserqismî", "yekserq" }, })), ["semantic loan"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Wergirtina maneyê ji", phrase = "wergirtina maneyê ji", abbrev = "wer. mane", glossary = "Wîkîferheng:Etîmolojî#Wergirtina maneyê", specialized_borrowing = "semantic-loan", aliases = { "sl", "wergirtin" }, })), ["psm"] = create_keyword(deep_merge(DEFAULTS.calque_like, { text = "Lihevanîna dengî-maneyî ji", phrase = "lihevanîna dengî-maneyî ji", abbrev = "lihevanîn", glossary = "Wîkîferheng:Etîmolojî#Lihevanîna dengî-maneyî", specialized_borrowing = "phono-semantic-matching", aliases = { "phono-semantic matching", "lihevanîn" }, })), -- -- Influence keywords (non-transitive, separate clause) -- ["influence"] = create_keyword(deep_merge(DEFAULTS.influence_like, { text = "Di bin tesîra", phrase = "bin tesîra", aliases = { "tesîr" }, abbrev = "tesîr.", glossary = "belavbûn ji zimanekî din", separate_clause = true, })), -- -- Morphological derivation keywords -- ["clipping"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Qusandin ji", phrase = "qusandin ji", abbrev = "qusandin", glossary = "Nimînok:Ferhengok#qusandin", toplevel_category = "Qusandin", aliases = { "clip", "qusandin" }, })), ["ellipsis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Elîpsîza", phrase = "elîpsîza", abbrev = "elîp.", glossary = "elîpsîz", toplevel_category = "ellipses", aliases = { "ellip", "elîpsîz", "elîp" }, })), ["back-formation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Paşvesazî ji", phrase = "paşvesazî ji", abbrev = "paşvesazî", glossary = "Nimînok:Ferhengok#paşvesazî", toplevel_category = "Paşvesazî", aliases = { "bf", "paşvesazî" }, })), ["nominalization"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Nomînalîzasyona", phrase = "nomînalîzasyona", abbrev = "nomîn.", glossary = "nomînalîzasyon", toplevel_category = "nominalizations", aliases = { "nom", "nomînalîzasyon", "nomîn" }, })), ["transliteration"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Translîterasyona", phrase = "translîterasyona", abbrev = "translît.", glossary = "translîterasyon", aliases = { "translit", "translîterasyon", "translît" }, })), ["vrd"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Vṛddhi derivative of", phrase = "a vṛddhi derivative of", abbrev = "vṛd.", glossary = "vṛddhi derivative", toplevel_category = "vrddhi derivatives", })), ["apheretic"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Apheretic form of", phrase = "an apheretic form of", abbrev = "aph.", glossary = "apheresis", aliases = { "apheresis", "aphetic" }, })), ["denominal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Denominal verb from", phrase = "denominal verb from", abbrev = "denom.", glossary = "denominal", toplevel_category = "denominal verbs", aliases = { "denom" }, })), ["deverbal"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Deverbal from", phrase = "deverbal from", abbrev = "deverb.", glossary = "deverbal", toplevel_category = "deverbals", })), ["reduplication"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Redûblîkasyona", phrase = "redûblîkasyona", abbrev = "redûb.", glossary = "redûblîkasyon", toplevel_category = "reduplications", aliases = { "redup", "redûblîkasyon", "redûb" }, })), ["abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Kurtkirina", phrase = "kurtkirina", abbrev = "kurt.", aliases = { "abbr", "abbrev", "kurtkirin" }, })), ["syllabic abbreviation"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Syllabic abbreviation of", phrase = "syllabic abbreviation of", abbrev = "syl. abbr.", glossary = "syllabic abbreviation", aliases = { "sylabbr", "sylabbrev" }, })), ["acronym"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Akronîma", phrase = "akronîma", abbrev = "akronîm", glossary = "akronîm", aliases = { "acro", "akronîm" }, })), ["initialism"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Înîtîalîzma", phrase = "înîtîalîzma", abbrev = "înît.", glossary = "înîtîalîzm", aliases = { "init", "înîtîalîzm", "înît" }, })), ["metathesis"] = create_keyword(deep_merge(DEFAULTS.transitive, { text = "Metateza", phrase = "metateza", abbrev = "meta.", glossary = "metatez", toplevel_category = "peyvên dariştî bi riya metatezê", aliases = { "meta", "metatez" }, })), -- -- Invisible keywords (no text output) -- ["root"] = create_keyword { transitive = TRANSITIVE.ALWAYS, invisible = "all", pos_override = "root", aliases = { "reh" }, }, ["afeq"] = create_keyword(deep_merge(DEFAULTS.affix_group, { text = "Ji", phrase = "ji", transitive = TRANSITIVE.NEVER, min_etymons = 1, invisible = "all", })), } -- Template-parameter supplements. export.supplements = { doublet = { text = "Cotreha", phrase = "cotreha", glossary = "Nimînok:Ferhengok#cotreh", toplevel_category = "Cotreh", default_conj = "û", term_rules = { entry_lang = true, require_term = true, disallow = { "suppress", "unknown", "family" }, }, }, } local aliases_to_register = {} local canonical_aliases = {} -- Map every keyword (canonical or alias) to its canonical form for consistent checks and tracking. export.keyword_canonical = {} for name, keyword_data in pairs(export.keywords) do export.keyword_canonical[name] = name if keyword_data.aliases then canonical_aliases[name] = keyword_data.aliases for _, alias in ipairs(keyword_data.aliases) do if export.keywords[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' collides with existing keyword '" .. alias .. "'.") end if aliases_to_register[alias] then error("Alias '" .. alias .. "' defined in keyword '" .. name .. "' is already claimed by another keyword.") end aliases_to_register[alias] = keyword_data export.keyword_canonical[alias] = name end keyword_data.aliases = nil end end for alias, data in pairs(aliases_to_register) do export.keywords[alias] = data end -- -- Language exception presets -- local EXCEPTION_PRESETS = { -- Fully disallowed: no tree, no text, no categories disallowed = { disallow = { tree = true, text = true }, suppress_categories = true, }, -- Suppress transliteration only no_translit = { suppress_tr = true, }, -- Suppress all categories only no_categories = { suppress_categories = true, }, } --[=[ Available exception options: disallow = { Related options for disallowing output: tree Disallow etymology trees for this language text Disallow etymology text generation for this language ref Reference link shown when tree/text is disallowed } suppress_tr Suppress transliteration in links suppress_categories Suppress all category generation normalize_to Normalize language code to a different code normalize_from_families Apply normalization to languages in these families normalize_exclude_families Exclude these families from normalization keyword_overrides Per-keyword categorisation overrides (e.g. { ["af"] = { transitive = TRANSITIVE.NEVER } }) ]=] local function create_exception(preset, overrides) local base = preset and EXCEPTION_PRESETS[preset] or {} return deep_merge(base, overrides or {}) end export.config = { lang_exceptions = { ["zh"] = create_exception("disallowed", { disallow = { ref = "[[Wiktionary:Beer parlour/2025/May#Template:etymon for Chinese]]" }, suppress_tr = true, normalize_to = "zh", normalize_from_families = { "zhx" }, normalize_exclude_families = { "qfa-cnt" }, }), }, } -- Supported codes for the nominalization <g:code> modifier (subset of common gender/number-style codes) -- Codes accepted by the <g:code> modifier on a nominalization. These are the codes of -- [[Modul:gender and number/data]], with that module's own Kurdish wording -- the same value is -- passed through to it for the gender tag, so anything valid here is valid there. A two-letter -- gender+number code that is not listed ("np", "mp") is decomposed automatically below. export.nominalization_g_codes = { -- Cins ["n"] = "nêr", ["m"] = "mê", ["f"] = "mê", ["nt"] = "nêtar", ["c"] = "giştî", ["g"] = "giştî", ["cnt"] = "cinsê-notr", -- Hejmar ["y"] = "yekjimar", ["s"] = "yekjimar", ["p"] = "pirjimar", ["d"] = "dual", -- Kodên hevedudanî yên [[Modul:gender and number/data]] ["mf"] = "nêr an mê", ["mn"] = "mê an nêr", ["mnt"] = "mê an nêtar", } -- -- Propagate keyword overrides to aliases -- if export.config.lang_exceptions then for lang_code, exception in pairs(export.config.lang_exceptions) do if exception.keyword_overrides then for canonical, aliases in pairs(canonical_aliases) do if exception.keyword_overrides[canonical] then local override_data = exception.keyword_overrides[canonical] for _, alias in ipairs(aliases) do if not exception.keyword_overrides[alias] then exception.keyword_overrides[alias] = override_data end end end end end end end return export ccvtb8l8zkezxqph95plteme7ki8zxy Modul:etymon/ceribandin/styles.css 828 1359190 6532096 6434869 2026-09-18T20:05:45Z Wikihez 7344 sync test copy 6532096 sanitized-css text/css /* Main container. Follows the frame that {{tewandin-ser}} gives inflection tables (Şablon:tewandin-ser/style.css): pale-blue frame, rounded, soft shadow, white body. */ .etytree { width: max-content; max-width: 100%; overflow: hidden; box-sizing: border-box; padding: 3px; margin: 0.5em 0; background: var(--wikt-palette-paleblue); border: 1px solid var(--wikt-palette-grey); border-radius: 6px; box-shadow: 0 4px 15px var(--wikt-palette-grey-3); } /* Title bar, styled like the inflection-table caption. */ .etytree .NavHead { background: var(--wikt-palette-paleblue); text-align: left; font-size: 95%; font-weight: bold; padding: 0.1em 0.5em; box-sizing: border-box; } /* Was a fixed 25em, which stretched even a two-node tree to that width. */ .etytree .NavHead > div { min-width: 14em; } /* A fixed height; a taller tree scrolls (or drags, with the EtytreeZoom gadget) inside the box. The gadget's "Biçûk bike" lifts the limit and scales the whole tree into view. */ .etytree .NavContent { overflow: auto; max-height: 28em; background: var(--wikt-palette-white); border: 1px solid var(--wikt-palette-grey-6); border-radius: 4px; } .etytree-body { display: flex; flex-direction: column; align-items: center; padding: 0.75em 0.5em; margin: auto; width: fit-content; } .etytree-branch-group { display: flex; column-gap: 0.5em; align-items: end; position: relative; } .etytree-branch { display: flex; flex-direction: column; align-items: center; } /* Term blocks */ .etytree-block { position: relative; padding: 0.3em 0.7em; border: 1px solid var(--wikt-palette-lightgrey); border-radius: 4px; background: var(--wikt-palette-beige); text-align: center; line-height: 1.35; box-shadow: 0 1px 2px var(--wikt-palette-grey-3); } /* The language sits above the term, so give it the quieter weight of the two: smaller, grey and out of link blue, so only the term itself reads as a link. */ .etytree-block .etyl { font-size: 85%; letter-spacing: 0.02em; } .etytree-block .etyl a { color: var(--wikt-palette-grey-9); text-decoration: none; } .etytree-block .etyl a:hover, .etytree-block .etyl a:focus { color: var(--wikt-palette-blue); text-decoration: underline; } /* Reconstructed languages: a cooler tint than the beige of attested terms. */ .etytree-block.etytree-reconstructed { background: var(--wikt-palette-grey-blue-1); /* the sanitiser rejects border-color with a var(), so set the shorthand */ border: 1px solid var(--wikt-palette-grey-blue-3); } /* Termless keyword blocks (invisible wrapper for positioning) */ .etytree-termless-block { height: 0 !important; padding: 0 !important; border: none !important; background: transparent !important; margin: 0 !important; overflow: visible; } .etytree-block.etytree-duplicate { border: 1px dashed var(--wikt-palette-grey); } .etytree-term { display: inline-block; } /* The meaning, on its own line under the term. */ .etytree-gloss { display: inline-block; max-width: 16em; font-size: 85%; font-style: italic; line-height: 1.25; color: var(--wikt-palette-grey-9); } /* Vertical connectors */ .etytree-connector-vertical, .etytree-connector-vertical-short { border-right: 2px solid var(--wikt-palette-grey); position: relative; transform: translateX(1px); } .etytree-connector-vertical { height: 20px; } .etytree-connector-vertical-short { height: 10px; } .etytree-connector-dotted { border-left: 2px dotted var(--wikt-palette-grey); height: 20px; display: block; margin-left: 50%; } /* Branch connectors */ .etytree-branch-left, .etytree-branch-right { height: 10px; width: calc(50% + 0.25em); border-bottom: 2px solid var(--wikt-palette-grey); } .etytree-branch-left { border-left: 2px solid var(--wikt-palette-grey); border-bottom-left-radius: 4px; transform: translateX(50%); } .etytree-branch-right { border-right: 2px solid var(--wikt-palette-grey); border-bottom-right-radius: 4px; transform: translateX(-50%); } .etytree-branch-mid { border-bottom: 2px solid var(--wikt-palette-grey); width: calc(100% + 0.5em); } /* Duplicate connector (L-shaped with arrow) */ .etytree-duplicate-connector { display: flex; justify-content: center; height: 20px; } .etytree-duplicate-connector > div { position: relative; width: 60px; height: 100%; } .etytree-duplicate-connector .etytree-dup-right { position: absolute; right: 0; top: 50%; bottom: 0; border-left: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-horiz { position: absolute; left: 0; right: 0; top: 50%; border-top: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-left { position: absolute; left: 0; top: 0; bottom: 50%; border-left: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-arrow { position: absolute; left: -5px; top: -5px; font-size: 10px; color: var(--wikt-palette-grey); } /* Label containers */ .etytree-label-container { z-index: 1; position: absolute; transform: translate(-50%); top: calc(100% + 5px); left: 50%; line-height: 10px; overflow: visible; } .etytree-group-label { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 2; height: 10px; line-height: 10px; } /* Labels */ .etytree-label abbr { font-size: 12px; font-style: italic; color: var(--wikt-palette-black); background: var(--wikt-palette-cyan); border-radius: 2px; text-decoration: none; } /* Uncertainty marker */ .etytree-unc { font-size: 10px; font-weight: bold; padding: 1px 2px; background: var(--wikt-palette-pink); border-radius: 2px; text-decoration: none; } .etytree-label + .etytree-unc { position: absolute; left: calc(100% + 3px); } /* Final marker (for termless keywords) */ .etytree-final { font-size: 10px; font-weight: bold; padding: 1px 2px; background: var(--wikt-palette-grey) !important; color: var(--wikt-palette-white) !important; border-radius: 2px; text-decoration: none; display: inline-block; line-height: 1; } .etytree-label-container .etytree-final { position: absolute; left: 50%; top: -12px; transform: translateX(-50%); z-index: 3; margin-left: 0; } hzewiqkdp3qhxjfy2jwct7y1xht5l8k 6532097 6532096 2026-09-18T20:06:58Z Wikihez 7344 sync test copy 6532097 sanitized-css text/css /* Main container. Follows the frame that {{tewandin-ser}} gives inflection tables (Şablon:tewandin-ser/style.css): pale-blue frame, rounded, soft shadow, white body. */ .etytree { width: max-content; max-width: 100%; overflow: hidden; box-sizing: border-box; padding: 3px; margin: 0.5em 0; background: var(--wikt-palette-paleblue); border: 1px solid var(--wikt-palette-grey); border-radius: 6px; box-shadow: 0 4px 15px var(--wikt-palette-grey-3); } /* Title bar, styled like the inflection-table caption. */ .etytree .NavHead { background: var(--wikt-palette-paleblue); text-align: left; font-size: 95%; font-weight: bold; padding: 0.1em 0.5em; box-sizing: border-box; } /* Was a fixed 25em, which stretched even a two-node tree to that width. */ .etytree .NavHead > div { min-width: 14em; } /* A fixed height; a taller tree scrolls (or drags, with the EtytreeZoom gadget) inside the box. The gadget's "Biçûk bike" lifts the limit and scales the whole tree into view. */ .etytree .NavContent { overflow: auto; max-height: 28em; background: var(--wikt-palette-white); border: 1px solid var(--wikt-palette-grey-6); border-radius: 4px; } .etytree-body { display: flex; flex-direction: column; align-items: center; padding: 0.75em 0.5em; margin: auto; width: fit-content; } .etytree-branch-group { display: flex; column-gap: 0.5em; align-items: end; position: relative; } .etytree-branch { display: flex; flex-direction: column; align-items: center; } /* Term blocks */ .etytree-block { position: relative; padding: 0.3em 0.7em; border: 1px solid var(--wikt-palette-lightgrey); border-radius: 4px; background: var(--wikt-palette-beige); text-align: center; line-height: 1.35; box-shadow: 0 1px 2px var(--wikt-palette-grey-3); } /* The language sits above the term, so give it the quieter weight of the two: smaller, grey and out of link blue, so only the term itself reads as a link. */ .etytree-block .etyl { font-size: 85%; letter-spacing: 0.02em; } .etytree-block .etyl a { color: var(--wikt-palette-darkgrey); text-decoration: none; } .etytree-block .etyl a:hover, .etytree-block .etyl a:focus { color: var(--wikt-palette-blue); text-decoration: underline; } /* Reconstructed languages: a cooler tint than the beige of attested terms. */ .etytree-block.etytree-reconstructed { background: var(--wikt-palette-grey-blue-1); /* the sanitiser rejects border-color with a var(), so set the shorthand */ border: 1px solid var(--wikt-palette-grey-blue-3); } /* Termless keyword blocks (invisible wrapper for positioning) */ .etytree-termless-block { height: 0 !important; padding: 0 !important; border: none !important; background: transparent !important; margin: 0 !important; overflow: visible; } .etytree-block.etytree-duplicate { border: 1px dashed var(--wikt-palette-grey); } .etytree-term { display: inline-block; } /* The meaning, on its own line under the term. */ .etytree-gloss { display: inline-block; max-width: 16em; font-size: 85%; font-style: italic; line-height: 1.25; color: var(--wikt-palette-grey-9); } /* Vertical connectors */ .etytree-connector-vertical, .etytree-connector-vertical-short { border-right: 2px solid var(--wikt-palette-grey); position: relative; transform: translateX(1px); } .etytree-connector-vertical { height: 20px; } .etytree-connector-vertical-short { height: 10px; } .etytree-connector-dotted { border-left: 2px dotted var(--wikt-palette-grey); height: 20px; display: block; margin-left: 50%; } /* Branch connectors */ .etytree-branch-left, .etytree-branch-right { height: 10px; width: calc(50% + 0.25em); border-bottom: 2px solid var(--wikt-palette-grey); } .etytree-branch-left { border-left: 2px solid var(--wikt-palette-grey); border-bottom-left-radius: 4px; transform: translateX(50%); } .etytree-branch-right { border-right: 2px solid var(--wikt-palette-grey); border-bottom-right-radius: 4px; transform: translateX(-50%); } .etytree-branch-mid { border-bottom: 2px solid var(--wikt-palette-grey); width: calc(100% + 0.5em); } /* Duplicate connector (L-shaped with arrow) */ .etytree-duplicate-connector { display: flex; justify-content: center; height: 20px; } .etytree-duplicate-connector > div { position: relative; width: 60px; height: 100%; } .etytree-duplicate-connector .etytree-dup-right { position: absolute; right: 0; top: 50%; bottom: 0; border-left: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-horiz { position: absolute; left: 0; right: 0; top: 50%; border-top: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-left { position: absolute; left: 0; top: 0; bottom: 50%; border-left: 2px dotted var(--wikt-palette-grey); } .etytree-duplicate-connector .etytree-dup-arrow { position: absolute; left: -5px; top: -5px; font-size: 10px; color: var(--wikt-palette-grey); } /* Label containers */ .etytree-label-container { z-index: 1; position: absolute; transform: translate(-50%); top: calc(100% + 5px); left: 50%; line-height: 10px; overflow: visible; } .etytree-group-label { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); z-index: 2; height: 10px; line-height: 10px; } /* Labels */ .etytree-label abbr { font-size: 12px; font-style: italic; color: var(--wikt-palette-black); background: var(--wikt-palette-cyan); border-radius: 2px; text-decoration: none; } /* Uncertainty marker */ .etytree-unc { font-size: 10px; font-weight: bold; padding: 1px 2px; background: var(--wikt-palette-pink); border-radius: 2px; text-decoration: none; } .etytree-label + .etytree-unc { position: absolute; left: calc(100% + 3px); } /* Final marker (for termless keywords) */ .etytree-final { font-size: 10px; font-weight: bold; padding: 1px 2px; background: var(--wikt-palette-grey) !important; color: var(--wikt-palette-white) !important; border-radius: 2px; text-decoration: none; display: inline-block; line-height: 1; } .etytree-label-container .etytree-final { position: absolute; left: 50%; top: -12px; transform: translateX(-50%); z-index: 3; margin-left: 0; } d7wsfcirpqt63vplh60vc7778du531i jenk 0 1359254 6532051 2026-09-18T17:14:47Z Avestaboy 5833 Rûpel bi "== {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * {{g|ku|locîk}} ==== Jê ==== ==== Etîmolojî ====" hat çêkirin 6532051 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Formên alternatîv ==== * {{g|ku|locîk}} ==== Jê ==== ==== Etîmolojî ==== 8j41wejs4iwov7o0csz389iqfi1e480 6532052 6532051 2026-09-18T17:15:04Z Avestaboy 5833 6532052 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== ==== Etîmolojî ==== kkij6swgvkg3cfj4s7pub2myi2z2bpr 6532053 6532052 2026-09-18T17:17:16Z Avestaboy 5833 6532053 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]], [[beraqilî]], [[hişmendî]], li gor [[hiş]] û [[aqil]]î, ne [[keyfî]], [[feraset]], [[têgihiştin]], [[aqildarî]], [[aqilmendî]], [[aqil]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== ==== Etîmolojî ==== {{bêetîmolojî|ku}} hk7gz60r34lluzrs5mlo65sckjh4l03 6532056 6532053 2026-09-18T17:22:16Z Avestaboy 5833 6532056 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== ==== Etîmolojî ==== {{bêetîmolojî|ku}} fbhm47126s40vyw40c2ff4f6cc79mt7 6532057 6532056 2026-09-18T17:23:27Z Avestaboy 5833 6532057 wikitext text/x-wiki == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== [[jenkî]] ==== Etîmolojî ==== {{bêetîmolojî|ku}} i2d7eszle4tp17xygssfqayf9tmfv2r 6532786 6532057 2026-09-19T09:29:58Z Wikihez 7344 [[Bikarhêner:Wikihez/skrîpt/js/şablon-lêke.js|T]]: +{{bêçavkanî}} 6532786 wikitext text/x-wiki {{bêçavkanî}} == {{ziman|ku}} == === Bilêvkirin === * {{ku-kîte}} === Navdêr === {{navdêr|ku|z=m}} # [[vac]], [[mantiq]] ==== Tewandin ==== {{ku-tewîn-nav|mê}} ==== Jê ==== [[jenkî]] ==== Etîmolojî ==== {{bêetîmolojî|ku}} 31bv5oqihn27wcl3bfkjn8rvqxee1o2 Modul:etydate/ceribandin 828 1359256 6532072 2026-09-18T18:40:04Z Wikihez 7344 test copy: Kurdish wording for etydate 6532072 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts = {} local specs = args[1] local function ins(txt) insert(parts, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(arg) if not arg:find("^%d+$") then return arg elseif arg:find("11$") then return arg .. "an" elseif arg:find("1$") then return arg .. "ê" end return arg .. "an" end local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1 .. " û " .. oblique(r2)) return poff + 3 end ins(oblique(year:gsub("^!", ""))) return poff + 1 end local process_common_usage local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end process_common_usage = function(offset) ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(oblique(specs[2])) ins(" hatiye peyitandin") if specs[3] then process_common_usage(3) end else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then ins(M.references.format_references(flattened_refs)) end end return concat(parts) end return export dlthsdntef7tcc9ob7nake0hp8xag9n 6532076 6532072 2026-09-18T18:42:19Z Wikihez 7344 test copy: Kurdish wording for etydate 6532076 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts, tail = {}, {} local specs = args[1] local target = parts local function ins(txt) insert(target, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(num) if num:find("11$") then return num .. "an" elseif num:find("1$") then return num .. "ê" end return num .. "an" end -- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an", -- with "early"/"mid"/"late" in front where they are given. local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " } local function period(arg) arg = arg:gsub("^!", "") local prefix = "" local word, rest = arg:match("^(%a+)[ %-](.+)$") if word and period_prefixes[word] then prefix, arg = period_prefixes[word], rest end local decade = arg:match("^(%d+)s$") if decade then return prefix .. "salên " .. oblique(decade) end local century = arg:match("^(%d+)c$") if century then return prefix .. "sedsala " .. oblique(century) end if arg:find("^%d+$") then return prefix .. oblique(arg) end return prefix .. arg end local process_common_usage local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2)) return poff + 3 end ins(period(year)) return poff + 1 end local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end -- The second date goes after the main clause, as a sentence of its own. process_common_usage = function(offset) target = tail ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") target = parts end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(period(specs[2])) if specs[3] then process_common_usage(3) end ins(" hatiye peyitandin") else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end for _, part in ipairs(tail) do insert(parts, part) end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then insert(parts, M.references.format_references(flattened_refs)) end end return concat(parts) end return export 0mmmpprtbtp44vcgxr7xqzpu001y439 6532080 6532076 2026-09-18T19:06:53Z Wikihez 7344 test copy: Kurdish wording for etydate 6532080 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts, tail = {}, {} local specs = args[1] local target = parts local function ins(txt) insert(target, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(num) if num:find("11$") then return num .. "an" elseif num:find("1$") then return num .. "ê" end return num .. "an" end -- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an", -- with "early"/"mid"/"late" in front where they are given. local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " } local function period(arg) arg = arg:gsub("^!", "") local prefix = "" local word, rest = arg:match("^(%a+)[ %-](.+)$") if word and period_prefixes[word] then prefix, arg = period_prefixes[word], rest end local decade = arg:match("^(%d+)s$") if decade then return prefix .. "salên " .. decade .. "î" end local century = arg:match("^(%d+)c$") if century then return prefix .. "sedsala " .. oblique(century) end if arg:find("^%d+$") then return prefix .. oblique(arg) end return prefix .. arg end local process_common_usage local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2)) return poff + 3 end ins(period(year)) return poff + 1 end local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end -- The second date goes after the main clause, as a sentence of its own. process_common_usage = function(offset) target = tail ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") target = parts end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(period(specs[2])) if specs[3] then process_common_usage(3) end ins(" hatiye peyitandin") else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end for _, part in ipairs(tail) do insert(parts, part) end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then insert(parts, M.references.format_references(flattened_refs)) end end return concat(parts) end return export q0rpkr9bn4b2ronjkx2u27tdfblmzeh 6532086 6532080 2026-09-18T19:11:56Z Wikihez 7344 test copy: Kurdish wording for etydate 6532086 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts, tail = {}, {} local specs = args[1] local target = parts local function ins(txt) insert(target, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(num) if num:find("11$") then return num .. "an" elseif num:find("1$") then return num .. "ê" end return num .. "an" end -- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an", -- with "early"/"mid"/"late" in front where they are given. local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " } local function period(arg) arg = arg:gsub("^!", "") local prefix = "" local word, rest = arg:match("^(%a+)[ %-](.+)$") if word and period_prefixes[word] then prefix, arg = period_prefixes[word], rest end -- An ending the editor typed already ("1900î", "1901ê", "1900an") is kept as it is. if arg:find("^%d+[îê]$") or arg:find("^%d+an$") then return prefix .. arg end local decade = arg:match("^(%d+)s$") if decade then return prefix .. "salên " .. decade .. "î" end local century = arg:match("^(%d+)c$") if century then return prefix .. "sedsala " .. oblique(century) end if arg:find("^%d+$") then return prefix .. oblique(arg) end return prefix .. arg end local process_common_usage local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2)) return poff + 3 end ins(period(year)) return poff + 1 end local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end -- The second date goes after the main clause, as a sentence of its own. process_common_usage = function(offset) target = tail ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") target = parts end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(period(specs[2])) if specs[3] then process_common_usage(3) end ins(" hatiye peyitandin") else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end for _, part in ipairs(tail) do insert(parts, part) end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then insert(parts, M.references.format_references(flattened_refs)) end end return concat(parts) end return export fjnsqd1ulj59xk18vmkimgqi2z9f6sn 6532088 6532086 2026-09-18T19:12:51Z Wikihez 7344 test copy: Kurdish wording for etydate 6532088 Scribunto text/plain local export = {} local M = require("Module:module loader").init({ require = { parameters = "Module:parameters", references = "Module:references", }, }) local insert = table.insert local concat = table.concat function export.etydate(frame) local params = { nocap = { type = "boolean" }, [1] = { list = true, required = true, template_default = "{{{1}}}", disallow_holes = true }, ref = { list = true, type = "references", allow_holes = true }, ["ref\1n"] = { list = true, allow_holes = true }, } local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, params) return export.format_etydate(args, nil) end function export.collect_etydate_ref_specs(args) local ref = args.ref or {} local refn = args.refn local maxindex = (refn and refn.maxindex) or 0 for k in pairs(ref) do if type(k) == "number" and k > maxindex then maxindex = k end end if maxindex == 0 and not next(ref) then return {} end local parse_refs = M.references.parse_references local flattened_refs = {} for i = 1, maxindex do if refn and refn[i] then if ref[i] then if ref[i][2] then local ind = i == 1 and "" or i error(("Can't specify two or more references in |ref%s= and also |ref%sn="):format(ind, ind)) end if type(ref[i][1]) == "string" then ref[i][1] = { text = ref[i][1] } end ref[i][1].name = refn[i] insert(flattened_refs, ref[i][1]) else insert(flattened_refs, { name = refn[i] }) end elseif ref[i] then if type(ref[i]) == "string" then for _, note in ipairs(parse_refs(ref[i])) do insert(flattened_refs, note) end else for j = 1, #ref[i] do local item = ref[i][j] if type(item) == "string" then for _, note in ipairs(parse_refs(item)) do insert(flattened_refs, note) end else insert(flattened_refs, item) end end end end end return flattened_refs end function export.format_etydate(args, opts) local parts, tail = {}, {} local specs = args[1] local target = parts local function ins(txt) insert(target, txt) end -- Kurdish oblique ending on a year: "-ê" after a final 1, "-an" after a final 11 and everything else. local function oblique(num) if num:find("11$") then return num .. "an" elseif num:find("1$") then return num .. "ê" end return num .. "an" end -- "1900" -> "1900an", "1500s" -> "salên 1500an", "14c" -> "sedsala 14an", -- with "early"/"mid"/"late" in front where they are given. local period_prefixes = { early = "destpêka ", mid = "nîvê ", late = "dawiya " } local function period(arg) if arg:find("^!") then -- "!" means: print it exactly as it was typed return (arg:gsub("^!", "")) end local prefix = "" local word, rest = arg:match("^(%a+)[ %-](.+)$") if word and period_prefixes[word] then prefix, arg = period_prefixes[word], rest end -- An ending the editor typed already ("1900î", "1901ê", "1900an") is kept as it is. if arg:find("^%d+[îê]$") or arg:find("^%d+an$") then return prefix .. arg end local decade = arg:match("^(%d+)s$") if decade then return prefix .. "salên " .. decade .. "î" end local century = arg:match("^(%d+)c$") if century then return prefix .. "sedsala " .. oblique(century) end if arg:find("^%d+$") then return prefix .. oblique(arg) end return prefix .. arg end local process_common_usage local function process_year_or_range(poff) local year = specs[poff] if not year then error(("Expected a year or 'r' in %s= but it is missing"):format(poff)) end if year == "r" then local r1 = specs[poff + 1] local r2 = specs[poff + 2] if not r1 or not r2 then error(("Saw 'r' in %s= but %s= or %s= is missing"):format(poff, poff + 1, poff + 2)) end ins("navbera " .. r1:gsub("^!", "") .. " û " .. period(r2)) return poff + 3 end ins(period(year)) return poff + 1 end local function process_circa_or_year_range(offset) local next_param if specs[offset] == "c" then ins("''[[circa|nêzîkî]]'' ") next_param = process_year_or_range(offset + 1) else next_param = process_year_or_range(offset) end if specs[next_param] then process_common_usage(next_param) end end -- The second date goes after the main clause, as a sentence of its own. process_common_usage = function(offset) target = tail ins(", lê ancax ji ") process_circa_or_year_range(offset) ins(" ve bi berfirehî hatiye bikaranîn") target = parts end if args.nocap then ins("c") else ins("C") end ins("ara ewil ") if specs[1] == "before" or specs[1] == "after" then ins(specs[1] == "before" and "beriya " or "piştî ") if not specs[2] then error(("Saw 1=%s but 2= is missing"):format(specs[1])) end ins(period(specs[2])) if specs[3] then process_common_usage(3) end ins(" hatiye peyitandin") else ins("di ") process_circa_or_year_range(1) ins(" de hatiye peyitandin") end for _, part in ipairs(tail) do insert(parts, part) end if not (opts and opts.omit_refs) then local flattened_refs = export.collect_etydate_ref_specs(args) if #flattened_refs > 0 then insert(parts, M.references.format_references(flattened_refs)) end end return concat(parts) end return export ljm1hlpw1vnhhwzm66nabwf3vuj5oxu Şablon:etîmon/belge 10 1359259 6532084 2026-09-18T19:08:53Z Wikihez 7344 documentation for {{etîmon}}: parameters, keywords and term modifiers 6532084 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code>{{tlf|etîmon|ku|:qf|ziman|dirêj}}</code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre> Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code>&lt;&lt;…&gt;&gt;</code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guhernerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> 43qgwmyp2eh3rlyyqxoaq5c4mdfhv08 6532085 6532084 2026-09-18T19:09:31Z Wikihez 7344 documentation for {{etîmon}}: parameters, keywords and term modifiers 6532085 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre> Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code>&lt;&lt;…&gt;&gt;</code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guhernerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> 2bk3omeezg1h35f3oy69mh8ga6ye5m5 6532089 6532085 2026-09-18T19:14:21Z Wikihez 7344 /* Nasname (id) */ (bi [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]ê re) 6532089 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre> Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code>&lt;&lt;…&gt;&gt;</code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guhernerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> 8hc5ev2qleykneej5v1p4mp73cl3ttk 6532090 6532089 2026-09-18T19:16:59Z Wikihez 7344 6532090 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:خانه<etimon::mîr<<pal:test>>>|metn=++}}</pre> Di hundir de kelîmeya mifteyî û kelîmeyên jêder tên nivîsîn; guhernerên hundirîn bi <code>&lt;&lt;…&gt;&gt;</code> tên nivîsîn. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guhernerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> 2hpazsc4mguupmyjcmbbw0bgeango1s 6532092 6532090 2026-09-18T19:18:51Z Wikihez 7344 documentation for {{etîmon}}: parameters, keywords and term modifiers 6532092 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guhernerê <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guhernerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre> : Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”). Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code>&lt;&gt;</code> de tên nivîsîn; guhernerên wan jî di nav <code>&lt;&gt;</code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code>&lt;etimon::mîr&lt;pal:a&gt;:deyn&lt;ar:b&gt;&gt;</code>. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guhernerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> smx7ixq46vl8pgwjlvk7mu0vn0qrejq 6532093 6532092 2026-09-18T19:19:48Z Wikihez 7344 documentation for {{etîmon}}: parameters, keywords and term modifiers 6532093 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerê <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji etîmolojiyekê zêdetir hebe, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî: rêzik]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre> : Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”). Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code>&lt;&gt;</code> de tên nivîsîn; guherînerên wan jî di nav <code>&lt;&gt;</code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code>&lt;etimon::mîr&lt;pal:a&gt;:deyn&lt;ar:b&gt;&gt;</code>. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guherînerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> 1s46i1fboow16jx7uk5mpddka2g3qf7 6532094 6532093 2026-09-18T19:26:30Z Wikihez 7344 documentation for {{etîmon}}: parameters, keywords and term modifiers 6532094 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre> : Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”). Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code>&lt;&gt;</code> de tên nivîsîn; guherînerên wan jî di nav <code>&lt;&gt;</code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code>&lt;etimon::mîr&lt;pal:a&gt;:deyn&lt;ar:b&gt;&gt;</code>. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code> |- | <code>:kurtkirina bi kîteyan</code> || Kurtkirin li gorî kîteyan || <code>:sylabbr</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:aph</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheresis</code>, <code>:aphetic</code> |- | <code>:denom</code> || Fiîla ji îsmekê çêbûyî || <code>:denominal</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guherînerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> 2ejwkmhvt2of04jkr1w1vsv2lrzom7t 6532249 6532094 2026-09-19T08:04:11Z Wikihez 7344 documentation for {{etîmon}}: parameters, keywords and term modifiers 6532249 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre> : Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”). Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code>&lt;&gt;</code> de tên nivîsîn; guherînerên wan jî di nav <code>&lt;&gt;</code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code>&lt;etimon::mîr&lt;pal:a&gt;:deyn&lt;ar:b&gt;&gt;</code>. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>, <code>:abbrev</code>, <code>:abbreviation</code> |- | <code>:sylabbr</code> || Kurtkirin li gorî kîteyan || <code>:sylabbrev</code>, <code>:syllabic abbreviation</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:apheresis</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheretic</code>, <code>:aphetic</code> |- | <code>:denominal</code> || Fiîla ji îsmekê çêbûyî || <code>:denom</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guherînerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;g:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> o9oft6eks1rtpjy13z18eo5xkuwixgu 6533313 6532249 2026-09-19T10:54:05Z Wikihez 7344 Cinsiyet: <c:> e, <z:> û <g:> jî tên qebûlkirin 6533313 wikitext text/x-wiki {{belgekirin/binrûpel}} {{Lua bikartîne|Modul:etymon|Modul:etymon/data|Modul:etymon/text|Modul:etymon/tree|Modul:etymon/categories}} Ev şablon etîmolojiya kelîmeyekê bi awayekî birêkûpêk qeyd dike. Di her bangkirinê de bi kêmî gaveke etîmolojiyê tê nivîsîn, yanî kelîmeya ku ev kelîme jê hatiye; bi guherînerên <code>&lt;etimon:…&gt;</code> mirov dikare çend gavan jî di eynî bangkirinê de binivîse. Gavên din li ser rûpelên wan kelîmeyan bi vê şablonê hatine qeydkirin; şablon wan rûpelan dixwîne û zincîrê bi xwe berhev dike, loma ne lazim e mirov tevahiya zincîrê li ser her rûpelê dubare bike. Ji vê zincîrê du netîce çêdibin: '''metnê etîmolojiyê''' (bi {{para|metn}}) û '''dara etîmolojiyê''' (bi {{para|dar}}). === Bikaranîn === <pre>{{etîmon|<koda zimanê rûpelê>|:<kelîmeya mifteyî>|<koda zimên>:<kelîme>|metn=++|dar=1}}</pre> * '''Parametreya 1''' koda zimanê rûpelê ye, wek <code>ku</code>. * '''Parametreyên bênav ên din''' bi rêz têne xwendin: [[#Kelîmeyên mifteyî|kelîmeya mifteyî]] (bi du niqteyan dest pê dike, wek <code>:deyn</code>) û paşê kelîmeyên jêder di şiklê <code>koda zimên:kelîme</code> de. * Eger kelîmeya jêder bi zimanê rûpelê be, koda zimên ne lazim e. Li ser rûpela ''zimandirêj'' herdu parçe kurmancî ne, loma <code><nowiki>{{etîmon|ku|:qf|ziman|dirêj}}</nowiki></code> bes e. * Kelîmeya mifteyî heta ya pêş de li hemû kelîmeyên jêder tê tetbîqkirin: <code>|:deyn|a|b|:mîr|c</code> yanî a û b deyn in, c mîrasmayî ye. ==== Nimûne ==== {{şx|etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++}} : {{etîmon|ku|:deyn|fa:پنجه<tr:pencê><t:dest>|metn=++|katna=1}} {{şx|etîmon|ku|:qf|ziman|dirêj|metn=++}} : {{etîmon|ku|:qf|ziman|dirêj|metn=++|katna=1}} {{şx|etîmon|ku|:deyn|ira:-|fa:test|metn=++}} : {{etîmon|ku|:deyn|ira:-|fa:test|metn=++|katna=1}} Bi darê re: {{şx|etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman}} : {{etîmon|ku|:mîr|ira-pro:*hižwáH<id:ziman>|metn=++|dar=1|title=ziman|katna=1}} ==== Nasname (id) ==== Eger li ser rûpelekê ji yekî zêdetir beşên etîmolojiyê hebin, divê her yek nasnameyeke xwe ya bi {{para|id}} hebe, û rûpelên ku wê kelîmeyê wek jêder nîşan didin divê eynî nasnameyê bi <code>&lt;id:…&gt;</code> binivîsin. Bi vî awayî şablon dizane ka kîjan etîmolojî tê xwestin. Nasname divê kurt be û maneyekê yan eslekî bide nasîn (wek <code>kitêba referansê</code>), ne hejmarên bêmane. Eger kelîmeyê tenê etîmolojiyek hebe, nasname ne lazim e. Eger li ser rûpelekê çend bangkirinên eynî zimanî hebin û yek jê bê nasname be, şablon xeletiyekê dide. Nasname herwiha wek lenger tê bikaranîn: <code>[[qanûn#Kurmancî:_qaîdeyên_hiqûqî]]</code>. ==== Kelîmeyên jêder ==== Şiklê temam: <code>koda zimên:kelîme&lt;guherîner&gt;…</code> * Ji bo ku tenê navê zimên yan malbata zimanan bê nîşandan, li şûna kelîmeyê <code>-</code> tê nivîsîn: <code>ira:-</code>. Malbatên zimanan her tim bi vî awayî têne nivîsîn. * Eger cihê kelîmeyê vala be, wek kelîmeyeke nenas tê nîşandan. * Bi <code>&lt;id:!…&gt;</code> nasname her tim xuya dibe, ku şablon bi xwe biryar nede. ==== Etîmolojiya di cih de ==== Eger rûpela kelîmeya jêder tune be yan tê de ev şablon nehatibe bikaranîn, mirov dikare zincîrê bi <code>&lt;etimon:…&gt;</code> di cih de berdewam bike. '''Not:''' ev guherîner bêyî '''î''' tê nivîsîn (<code>etimon</code>, ne <code>etîmon</code>), ji ber ku navên guherînerên di nav <code>&lt;&gt;</code> de tenê bi herfên ASCII dikarin bên nivîsîn. <pre>{{etîmon|ku|:deyn|fa:testxyz<etimon::mîr<pal:testabc<t:mal>>>|metn=++}}</pre> : Deyn ji farisî ''testxyz'', mîrasmayî ji farisiya navîn ''testabc'' (“mal”). Di hundir de pêşî kelîmeya mifteyî, paşê kelîmeyên jêder her yek di nav <code>&lt;&gt;</code> de tên nivîsîn; guherînerên wan jî di nav <code>&lt;&gt;</code> de, tavilê pey kelîmeyê. Çend gav jî dibin: <code>&lt;etimon::mîr&lt;pal:a&gt;:deyn&lt;ar:b&gt;&gt;</code>. Eger rûpela hedefê hebe û tê de ev şablon hebe, etîmolojiya di cih de nayê bikaranîn. === Parametre === {| class="wikitable" ! Parametre !! Mane !! Navê îngilîzî |- | {{para|1}} || Koda zimanê rûpelê. Lazim e. |- | {{para|metn}} || Metnê etîmolojiyê nîşan dide; binêre [[#Metn]]. || {{para|text}} |- | {{para|dar}} || Bi <code>1</code> dara etîmolojiyê nîşan dide. || {{para|tree}} |- | {{para|id}} || Nasnameya vê etîmolojiyê. Eger mane nehatibe dayîn, wek mane jî tê nîşandan. |- | {{para|title}} || Kelîmeya ku etîmolojî jê re tê nivîsîn, eger ne navê rûpelê be. |- | {{para|crz}} || Cureyê rêzimanî yê kelîmeyê ji bo kategoriyan: <code>reh</code>, <code>kelîme</code>, <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>. || {{para|pos}} |- | {{para|cotreh}} || Cotrehên vê kelîmeyê, bi bêhnokê ji hev cuda. || {{para|doublet}} |- | {{para|tarîxa-etîm}} || Tarîxa peyitandina pêşîn, wek <code>1901</code>, <code>1500s</code>, <code>14c</code>, <code>c,1900</code>, <code>before,1850</code>, <code>r,1501,1558</code>. || {{para|etydate}} |- | {{para|niqtena}} || Bi <code>1</code> niqteya dawiyê nayê zêdekirin. || {{para|nodot}} |- | {{para|niqte}} || Li şûna niqteya dawiyê nîşaneke din. || {{para|dot}} |- | {{para|katna}} || Bi <code>1</code> kategorî nayên zêdekirin. Herwiha {{para|nekat}}. || {{para|nocat}} |- | {{para|darna}} || Bi <code>1</code> ev etîmolojî di dara rûpelên din de dernakeve. || {{para|notree}} |- | {{para|exnihilo}} || Kelîmeya ku ji tu kelîmeyeke din nehatiye çêkirin. |- | {{para|json}} || Bi <code>1</code> li şûna metnî daneyên xam vedigerîne; ji bo ceribandinê ye. |} === Kelîmeyên mifteyî === Kelîmeya mifteyî bi du niqteyan dest pê dike û eleqeya di navbera her du kelîmeyan de diyar dike. Navên îngilîzî jî tên qebûlkirin. {| class="wikitable" ! Kelîmeya mifteyî !! Mane !! Navên din |- | <code>:mîr</code> || Kelîmeya ku ji zimanê bav û kalan maye || <code>:mîrasmayî</code>, <code>:inh</code> |- | <code>:deyn</code> || Kelîmeya ku rasterast ji zimanekî din hatiye deynkirin || <code>:bor</code>, <code>:borrowed</code> |- | <code>:deynh</code> || [[Nimînok:Ferhengok#deynkirina hînbûyî|Deynkirina hînbûyî]]: ne bi riya têkiliya rojane, bi qesd hatiye girtin || <code>:lbor</code> |- | <code>:deynhq</code> || Deynkirina hînbûyî ya ku hinekî hatiye guhertin || <code>:slbor</code> |- | <code>:deynort</code> || [[Nimînok:Ferhengok#deynkirina ortografîk|Deynkirina ortografîk]] || <code>:obor</code> |- | <code>:deynne</code> || [[Nimînok:Ferhengok#deynkirina neadaptekirî|Deynkirina neadaptekirî]] || <code>:ubor</code> |- | <code>:drş</code> || Kelîmeya ku ji zimanekî din hatiye dariştin, wextê ne mîrasmayî û ne jî deynkirineke diyar be || <code>:dariştî</code>, <code>:der</code> |- | <code>:ji</code> || Dariştineke di nav eynî zimanî de ku cureyê wê nehatiye diyarkirin; tenê ji bo kelîmeyên eynî zimanî derbasdar e || <code>:from</code> |- | <code>:drşnd</code> || Dariştin heye lê cureyê wê ne diyar e || <code>:uder</code> |- | <code>:qf</code> || Kelîmeya ji qertafan an ji du kelîmeyan pêk hatî; rêza parçeyan girîng e || <code>:qertaf</code>, <code>:af</code> |- | <code>:reh</code> || Kelîmeyên pey xwe wek reh dide nasîn; tenê ji bo kategoriyan e ("Peyvên … yên aîdî rehê …") û di metn û darê de xuya nabe || <code>:root</code> |- | <code>:yekser</code> || [[Nimînok:Ferhengok#yekser|Wergerandina yekser]]; zincîr li vir disekine || <code>:cal</code>, <code>:clq</code> |- | <code>:yekserq</code> || Wergerandina yekser a qismî; zincîr li vir disekine || <code>:yekserqismî</code>, <code>:pcal</code> |- | <code>:wergirtin</code> || [[Nimînok:Ferhengok#wergirtin|Wergirtina maneyê]]; mana wergirtî bi <code>&lt;maneid:…&gt;</code> tê nîşankirin || <code>:sl</code> |- | <code>:lihevanîn</code> || Lihevanîna dengî-maneyî || <code>:psm</code> |- | <code>:tesîr</code> || Kelîme di bin tesîra kelîmeyeke din de guheriye; zincîr li vir disekine || <code>:influence</code> |- | <code>:têkilkirin</code> || [[Nimînok:Ferhengok#têkilkirin|Têkilkirina]] du kelîmeyan || <code>:blend</code> |- | <code>:ûnîverbasyon</code> || [[Nimînok:Ferhengok#ûnîverbasyon|Ûnîverbasyon]] || <code>:ûnîv</code>, <code>:univ</code> |- | <code>:qusandin</code> || [[Nimînok:Ferhengok#qusandin|Qusandin]] || <code>:clip</code> |- | <code>:paşvesazî</code> || [[Nimînok:Ferhengok#paşvesazî|Paşvesazî]] || <code>:bf</code> |- | <code>:elîpsîz</code> || [[Nimînok:Ferhengok#elîpsîz|Elîpsîz]] || <code>:elîp</code>, <code>:ellip</code> |- | <code>:nomînalîzasyon</code> || [[Nimînok:Ferhengok#nomînalîzasyon|Nomînalîzasyon]] || <code>:nomîn</code>, <code>:nom</code> |- | <code>:translîterasyon</code> || [[Nimînok:Ferhengok#translîterasyon|Translîterasyon]] || <code>:translît</code>, <code>:translit</code> |- | <code>:redûblîkasyon</code> || [[Nimînok:Ferhengok#redûblîkasyon|Redûblîkasyon]] || <code>:redûb</code>, <code>:redup</code> |- | <code>:kurtkirin</code> || Kurtkirina kelîmeyekê || <code>:abbr</code>, <code>:abbrev</code>, <code>:abbreviation</code> |- | <code>:sylabbr</code> || Kurtkirin li gorî kîteyan || <code>:sylabbrev</code>, <code>:syllabic abbreviation</code> |- | <code>:akronîm</code> || [[Nimînok:Ferhengok#akronîm|Akronîm]] || <code>:acro</code> |- | <code>:înîtîalîzm</code> || [[Nimînok:Ferhengok#înîtîalîzm|Înîtîalîzm]] || <code>:înît</code>, <code>:init</code> |- | <code>:metatez</code> || [[Nimînok:Ferhengok#metatez|Metatez]] || <code>:meta</code> |- | <code>:afeq</code> || Wek <code>:qf</code>, lê ne di metnê ne jî di darê de xuya dibe; tenê kategoriyan çêdike |- | <code>:apheresis</code> || Şiklê ku dengê destpêkê winda kiriye || <code>:apheretic</code>, <code>:aphetic</code> |- | <code>:denominal</code> || Fiîla ji îsmekê çêbûyî || <code>:denom</code> |- | <code>:deverbal</code> || Kelîmeya ji fiîlekê çêbûyî |- | <code>:vrd</code> || Dariştina vṛddhî (sanskrîtî); bi qertaf: <code>:vrd-af</code> |- | <code>:sa-af</code> || Pêkhateya sanskrîtî |} === Guherîner === Guherîner di nav <code>&lt;&gt;</code> de tên nivîsîn û tavilê tên pey kelîmeyê yan kelîmeya mifteyî: <code>fa:خانه&lt;tr:xâne&gt;&lt;t:mal&gt;</code>. Navên guherînerên di nav <code>&lt;&gt;</code> de her tim bi herfên ASCII ne. ==== Guherînerên kelîmeyê ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;t:…&gt;</code> || Tercimeya kelîmeyê bi kurmancî || <code>&lt;w:…&gt;</code> |- | <code>&lt;tr:…&gt;</code> || Translîterasyon |- | <code>&lt;ts:…&gt;</code> || Transkrîpsiyon |- | <code>&lt;cuda:…&gt;</code> || Şiklê ku tê nîşandan, eger ne wek navê rûpelê be || <code>&lt;alt:…&gt;</code> |- | <code>&lt;id:…&gt;</code> || Nasnameya etîmolojiya wê kelîmeyê li ser rûpela wê; eger mane tune be, wek mane tê nîşandan |- | <code>&lt;crz:…&gt;</code> || Cureyê rêzimanî yê kelîmeyê || <code>&lt;pos:…&gt;</code> |- | <code>&lt;c:…&gt;</code> || Cinsiyet: <code>n</code> (nêr), <code>m</code> (mê), <code>nt</code> (nêtar) || <code>&lt;z:…&gt;</code>, <code>&lt;g:…&gt;</code> |- | <code>&lt;q:…&gt;</code> || Wesf li pêşiyê kelîmeyê |- | <code>&lt;qq:…&gt;</code> || Wesf li pey kelîmeyê |- | <code>&lt;hrf:…&gt;</code> || Mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkanî; binêre [[#Çavkanî]] |- | <code>&lt;nediyar&gt;</code> || Ev gav ne teqez e || <code>&lt;unc&gt;</code> |- | <code>&lt;crztip:…&gt;</code> || Kelîme ji bo kategoriyan wek <code>reh</code> yan <code>kelîme</code> tê hesibandin || <code>&lt;postype:…&gt;</code> |- | <code>&lt;etimon:…&gt;</code> || Etîmolojiya di cih de; binêre jor || <code>&lt;ety:…&gt;</code> |- | <code>&lt;aftype:…&gt;</code> || Di nav <code>:qf</code> de: cureyê qertafê; binêre [[#Cureyên qertafan]] |- | <code>&lt;deyn&gt;</code>, <code>&lt;deynh&gt;</code>, <code>&lt;deynhq&gt;</code> || Di nav <code>:qf</code> de: ev parçe deynkirî ye |} ==== Guherînerên kelîmeya mifteyî ==== {| class="wikitable" ! Guherîner !! Mane !! Navên din |- | <code>&lt;unc&gt;</code> || Ev gav ne teqez e: "Mihtemelen…" |- | <code>&lt;grdk:…&gt;</code> || Girêdeka di navbera kelîmeyên jêder de, li şûna "yan jî" || <code>&lt;conj:…&gt;</code> |- | <code>&lt;anlz&gt;</code> || [[Nimînok:Ferhengok#analîza şiklî|Analîza şiklî]] || <code>&lt;surf&gt;</code> |- | <code>&lt;hrf:…&gt;</code> || Di nav <code>:qf</code> de: mana herfiyen || <code>&lt;lit:…&gt;</code> |- | <code>&lt;maneid:…&gt;</code> || Di nav <code>:wergirtin</code> de: nasnameya maneya wergirtî || <code>&lt;senseid:…&gt;</code> |- | <code>&lt;metn:…&gt;</code> || Di nav <code>:ji</code> û <code>:drş</code> de: metnekî din li şûna "Ji" || <code>&lt;text:…&gt;</code> |- | <code>&lt;ref:…&gt;</code> || Çavkaniya vê gavê |} === Çavkanî === Çavkanî bi <code>&lt;ref:…&gt;</code> li kelîmeyekê yan li kelîmeya mifteyî tên zêdekirin. Ji bo çend çavkaniyan <code>&nbsp;!!!&nbsp;</code> (bi valahiyan) dikeve navbera wan. Çavkanî tenê wextê {{para|metn}} hatibe dayîn xuya dibin, û tenê li ser wê rûpelê, ne li ser rûpelên dûndeyan. * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&gt;</code> – çavkaniyek * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}} !!! {{ş|R:Tsabolov}}&gt;</code> – du çavkanî * <code>la:verbum&lt;ref:{{ş|R:L&amp;S}}&lt;&lt;name:LS&gt;&gt;&gt;</code> – çavkaniya bi nav, ku paşê bi <code>&lt;ref:&lt;&lt;name:LS&gt;&gt;&gt;</code> tê dubarekirin * Bi <code>&lt;&lt;group:…&gt;&gt;</code> kom tê diyarkirin. === Dar === Bi {{para|dar|1}} dara etîmolojiyê tê nîşandan. Dar ji eynî daneyan tê çêkirin, yanî ji zincîra ku ji rûpelan tê berhevkirin. Kelîmeyên mifteyî yên ku zincîrê pêş de nabin (<code>:yekser</code>, <code>:yekserq</code>, <code>:wergirtin</code>, <code>:tesîr</code>) di darê de etîmolojiya jorîn nîşan nadin; li şûna wê xetek bi niqteyan xuya dibe. Kelîmeya ku di darê de dubare dibe jî etîmolojiya xwe cardin nîşan nade û bi çarçoveyeke niqteyî tê xuyakirin. Dar bi gedgeta [[MediaWiki:Gadget-EtytreeZoom.js|EtytreeZoom]] tê biçûk û mezin kirin. === Metn === Bi {{para|metn}} metnê etîmolojiyê tê çêkirin. Li ser Wîkîferhenga kurdî ev ji bo hemû zimanan vekirî ye ([[Modul:etymon/data/text_allowed]]). Nirxên {{para|metn}}: * <code>++</code> – tevahiya zincîrê * <code>+</code> – tenê gava pêşîn * <code>*</code> – heta kelîmeya pêşîn a ku rûpela wê heye * hejmarek – ewqas gav * <code>:kod</code> – heta zimanê bi wê kodê * <code>:kod*</code> – heta wî zimanî, eger rûpela wî tune be heta rûpela pêşîn a heyî === Cureyên qertafan === Di nav <code>:qf</code> de bi <code>&lt;aftype:…&gt;</code> tê diyarkirin ka parçe çi ye: <code>pêşgir</code>, <code>paşgir</code>, <code>navgir</code>, <code>circumfix</code>, <code>infix</code>, <code>non-affix</code>. Kurtiyên <code>pre</code>, <code>suf</code>, <code>in</code>, <code>inter</code>, <code>circum</code>, <code>naf</code> û <code>root</code> jî tên qebûlkirin. === Rewşên xisûsî === Ji bo zimanên çînî (malbata <code>zhx</code>) dar, metn û kategorî girtî ne û translîterasyon nayê nîşandan. '''Not:''' ev şablon li sernavê beşê dinêre û divê ew navê zimanê parametreya 1 be. Loma nimûneyên jorîn di beşên asta sisiyan de ne; di beşeke asta duduyan de (wek <code>== Bikaranîn ==</code>) şablon xeletiyekê dide. === Binêre === * {{ş|dû}} – dûndeyên kelîmeyekê * {{ş|dara dûnde}} – dara dûndeyan * [[Nimînok:Ferhengok]] – ferhengoka terimên etîmolojiyê * [[Şablon:etîmon/testcases]] – ceribandin <includeonly> [[Kategorî:Etîmolojî (şablon)]] </includeonly> ejv60u4ameg78ugob060kc8e8537jd6 Bikarhêner:Wikihez/etydate-cer2 2 1359260 6532087 2026-09-18T19:12:10Z Wikihez 7344 wrapper to test Modul:etydate/ceribandin 6532087 wikitext text/x-wiki <includeonly>{{#invoke:etydate/ceribandin|etydate}}</includeonly> 0i4qzzayd3ouxzdgvra0rvxcge78c0k Bikarhêner:Wikihez/Gadget-test/etimon.js 2 1359261 6532101 2026-09-18T20:34:29Z Wikihez 7344 Etymology: add a builder for {{etîmon}} to the shared template dialog, with its keywords, modifiers and metn= values in data-main.json 6532101 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. function modifierEditor(mods, defs, onChange) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } var pillsBuilt = false; $btn.on("click", function (e) { e.preventDefault(); if (!pillsBuilt) { pillsBuilt = true; defs.forEach(function (def) { var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); } var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); return util.wrapNativeSelect($select); } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - ji bo navê zimên bi tenê )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed)); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); return $wrap; } function namedParams() { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams()); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> 0f8lhj4opr0t05r0puhkb948jxb4i9w 6532108 6532101 2026-09-18T20:38:17Z Wikihez 7344 Etymology: show the chosen keyword and metn= value in their searchable boxes 6532108 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. function modifierEditor(mods, defs, onChange) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } var pillsBuilt = false; $btn.on("click", function (e) { e.preventDefault(); if (!pillsBuilt) { pillsBuilt = true; defs.forEach(function (def) { var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); } var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); var $wrapped = util.wrapNativeSelect($select); // The searchable box reads the selection only when told to, so a keyword already chosen shows. $select.trigger("wiktku:refresh"); return $wrapped; } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - = tenê navê zimên )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed)); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); $select.trigger("wiktku:refresh"); return $wrap; } function namedParams() { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams()); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> ridgq5fwslkolcur42tesqz99r7vcvu 6532113 6532108 2026-09-18T20:45:26Z Wikihez 7344 Etymology: offer a modifier only under the keywords it applies to 6532113 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. // Whether a modifier applies under the keyword it is being offered for: an "only" list in the data // (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker. function modApplies(def, keyword) { if (!(def.only || []).length) { return true; } var canonical = defFor(keywords(), keyword); return def.only.indexOf(canonical ? canonical.key : keyword) !== -1; } function modifierEditor(mods, defs, onChange, keywordOf) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } // Rebuilt per open rather than once: the keyword can change while the row is on screen, and with // it which modifiers are on offer. $btn.on("click", function (e) { e.preventDefault(); var keyword = keywordOf ? keywordOf() : ""; $picker.empty(); defs.forEach(function (def) { if (!modApplies(def, keyword)) { return; } var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); var $wrapped = util.wrapNativeSelect($select); // The searchable box reads the selection only when told to, so a keyword already chosen shows. $select.trigger("wiktku:refresh"); return $wrapped; } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - = tenê navê zimên )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () { return step.keyword; }), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed, function () { return step.keyword; })); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); $select.trigger("wiktku:refresh"); return $wrap; } function namedParams() { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams()); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> 7aybws9jjcegzsiby4k61s0wssyjgp4 6532115 6532113 2026-09-18T20:46:35Z Wikihez 7344 Etymology: keep the in-place chain out of the modifier picker, it has its own button 6532115 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. // Whether a modifier applies under the keyword it is being offered for: an "only" list in the data // (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker. function modApplies(def, keyword) { if (!(def.only || []).length) { return true; } var canonical = defFor(keywords(), keyword); return def.only.indexOf(canonical ? canonical.key : keyword) !== -1; } function modifierEditor(mods, defs, onChange, keywordOf) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } // Rebuilt per open rather than once: the keyword can change while the row is on screen, and with // it which modifiers are on offer. $btn.on("click", function (e) { e.preventDefault(); var keyword = keywordOf ? keywordOf() : ""; $picker.empty(); defs.forEach(function (def) { // <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a // box asking for a whole chain in one line. if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) { return; } var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); var $wrapped = util.wrapNativeSelect($select); // The searchable box reads the selection only when told to, so a keyword already chosen shows. $select.trigger("wiktku:refresh"); return $wrapped; } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - = tenê navê zimên )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () { return step.keyword; }), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed, function () { return step.keyword; })); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); $select.trigger("wiktku:refresh"); return $wrap; } function namedParams() { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams()); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> 0ypo26x0ppmsioshslv0gahgza61pgo 6532547 6532115 2026-09-19T08:52:41Z Wikihez 7344 Etymology: keep dar= and id= in the open, below metn= 6532547 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. // Whether a modifier applies under the keyword it is being offered for: an "only" list in the data // (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker. function modApplies(def, keyword) { if (!(def.only || []).length) { return true; } var canonical = defFor(keywords(), keyword); return def.only.indexOf(canonical ? canonical.key : keyword) !== -1; } function modifierEditor(mods, defs, onChange, keywordOf) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } // Rebuilt per open rather than once: the keyword can change while the row is on screen, and with // it which modifiers are on offer. $btn.on("click", function (e) { e.preventDefault(); var keyword = keywordOf ? keywordOf() : ""; $picker.empty(); defs.forEach(function (def) { // <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a // box asking for a whole chain in one line. if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) { return; } var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); var $wrapped = util.wrapNativeSelect($select); // The searchable box reads the selection only when told to, so a keyword already chosen shows. $select.trigger("wiktku:refresh"); return $wrapped; } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - = tenê navê zimên )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () { return step.keyword; }), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed, function () { return step.keyword; })); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); $select.trigger("wiktku:refresh"); return $wrap; } // The parameters marked "primary" in the data sit in the open next to Metn; the rest are behind // "Parametreyên din". function namedParams(primary) { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { if (!!param.primary !== !!primary) { return; } var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); $element.append(namedParams(true)); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams(false)); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> 0hgkc2xbam4rrflo1vp56kdw9vlxu5g 6532614 6532547 2026-09-19T09:02:36Z Wikihez 7344 DefSideBoxes: hide the pending-changes box while a dialog is open 6532614 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. // Whether a modifier applies under the keyword it is being offered for: an "only" list in the data // (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker. function modApplies(def, keyword) { if (!(def.only || []).length) { return true; } var canonical = defFor(keywords(), keyword); return def.only.indexOf(canonical ? canonical.key : keyword) !== -1; } function modifierEditor(mods, defs, onChange, keywordOf) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } // Rebuilt per open rather than once: the keyword can change while the row is on screen, and with // it which modifiers are on offer. $btn.on("click", function (e) { e.preventDefault(); var keyword = keywordOf ? keywordOf() : ""; $picker.empty(); defs.forEach(function (def) { // <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a // box asking for a whole chain in one line. if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) { return; } var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); var $wrapped = util.wrapNativeSelect($select); // The searchable box reads the selection only when told to, so a keyword already chosen shows. $select.trigger("wiktku:refresh"); return $wrapped; } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - = tenê navê zimên )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () { return step.keyword; }), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed, function () { return step.keyword; })); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); $select.trigger("wiktku:refresh"); return $wrap; } // The parameters marked "primary" in the data sit in the open next to Metn; the rest are behind // "Parametreyên din". function namedParams(primary) { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { if (!!param.primary !== !!primary) { return; } var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); $element.append(namedParams(true)); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams(false)); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; // Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does // not sit over a dialog the page's stacking order puts underneath it. $(document.body).addClass("wikt-dialog-open"); done.always(function () { $(document.body).removeClass("wikt-dialog-open"); }); var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> orb9bq3exeqyqbljyoghbnqtsft1vqv Kategorî:Anagram bi tirkî 14 1359262 6532117 2026-09-19T07:13:46Z Şêr 1103 Rûpel bi "{{katbike}}" hat çêkirin 6532117 wikitext text/x-wiki {{katbike}} 1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh Kategorî:Anagram bi almanî 14 1359263 6532118 2026-09-19T07:14:09Z Şêr 1103 Rûpel bi "{{katbike}}" hat çêkirin 6532118 wikitext text/x-wiki {{katbike}} 1dpx16ue3vl1l6c1hkqu0q6ftpl2ezh سني 0 1359265 6532922 2026-09-19T09:52:13Z Wikihez 7344 [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:سني|en.wikt]], [[Bikarhêner:Wikihez/templateScript2.js|TS]]: Ji [[en:سني|en.wikt]] 6532922 wikitext text/x-wiki == {{ziman|ar}} == === Bilêvkirin === {{ar-pr|سُنِّيّ}} === Rengdêr === {{rengdêr|ar|سُنِّيّ}} # {{e|ar|Îslam}} [[sinî]] ==== Etîmolojî ==== {{etîmon|ar|:qertaf|السُّنَّة<t:[[sinet]]ên pêxember Muhammedî><etimon:ji<ar:سُنَّة<t:edet, norm>>>|ـِيّ<id:nîsbe>|text=+|tree=1}} ==== Dûnde ==== * {{dû|az|sünni|deyn=1}} * {{dû|chg|سنی|deyn=1}} ** {{dû|uz|sunniy}} * {{dû|fa-cls|سُنِّی|deyn=1}} ** {{dû|prs|سُنِّی}} ** {{dû|fa-ira|سُنّی}} ** {{dû|tg|суннӣ}} * {{dû|en|Sunni|deyn=1}} * {{dû|ota|سنی|tr=sünnî|deyn=1}} ** {{dû|tr|Sünni}} 6yrysh9kota0pjoj9e5p2b8ok87pajl MediaWiki:Gadget-wikt.cite/etimon.js 8 1359266 6533052 2026-09-19T10:12:54Z Wikihez 7344 Etymology: a builder for {{etîmon}} — keywords, modifiers, metn= values and in-place chains, driven by the etimon block of data-main.json 6533052 javascript text/javascript // <nowiki> /* * Page: [[MediaWiki:Gadget-wikt.cite/etimon.js]] * * The builder behind {{etîmon}}: one call is read into steps of "kelîmeya mifteyî + kelîmeyên jêder", * every source word carrying its own <guherîner>s and, when its page has no etymology of its own, an * inline <etimon:…> chain of further steps. * * Keywords, modifiers, the metn= values and the named parameters all come from the "etimon" block of * data-main.json, so a new one is added there rather than here. cite.openTemplateDialog() hands every * {{etîmon}} call to openDialog(), which is what DefSideBoxes and the wizard both call. */ (function () { "use strict"; var edit = require("ext.gadget.wikt.edit"); var util = edit.util; var langs = edit.langs; var wt = edit.wt; var data = edit.data.etimon || {}; var NAME = "etîmon"; // Every name the template answers to: a call written under one of its redirects still opens the builder. var NAMES = ["etîmon", "etimon", "etymon"]; // <etimon:…> is spelled without "î": modifier names inside <> are ASCII only. var INLINE_KEYS = ["etimon", "ety"]; function isEtimonName(name) { return NAMES.indexOf($.trim(name || "").toLowerCase().replace(/^şablon:\s*/i, "")) !== -1; } // ---- the tables --------------------------------------------------------------------------------- function keywords() { return data.keywords || []; } function wordMods() { return data.wordMods || []; } function keywordMods() { return data.keywordMods || []; } // The entry for a key or for one of its documented aliases, so ":inh" is understood as ":mîr". function defFor(defs, key) { var found = null; defs.forEach(function (def) { if (found) { return; } if (def.key === key || (def.aliases || []).indexOf(key) !== -1) { found = def; } }); return found; } function isKeywordModName(key) { return !!defFor(keywordMods(), key); } // ---- reading a call ---------------------------------------------------------------------------- // The ">" closing the "<" at start, skipping the nested ones an <etimon:…> or an <id:…> inside it has. function matchAngle(text, start) { var depth = 0; for (var i = start; i < text.length; i++) { var ch = text.charAt(i); if (ch === "<") { depth++; } else if (ch === ">") { depth--; if (depth === 0) { return i; } } } return -1; } // Splits on the "|" that separate parameters, and only those: a <ref:{{ş|R:X}}> carries pipes of its own. function splitParams(text) { var out = []; var buf = ""; var braces = 0; var angles = 0; for (var i = 0; i < text.length; i++) { var two = text.substr(i, 2); if (two === "{{" || two === "}}") { braces += two === "{{" ? 1 : -1; buf += two; i++; continue; } var ch = text.charAt(i); if (ch === "<") { angles++; } else if (ch === ">") { angles = Math.max(0, angles - 1); } if (ch === "|" && braces <= 0 && angles === 0) { out.push(buf); buf = ""; continue; } buf += ch; } out.push(buf); return out; } function parseMod(inner) { var at = inner.indexOf(":"); if (at === -1) { return { key: $.trim(inner), flag: true }; } return { key: $.trim(inner.slice(0, at)), value: inner.slice(at + 1) }; } // "fa:خانه<tr:xâne><t:mal>" -> { head: "fa:خانه", mods: [...] } function splitMods(text) { var head = ""; var mods = []; var i = 0; while (i < text.length) { if (text.charAt(i) === "<") { var end = matchAngle(text, i); if (end === -1) { head += text.slice(i); break; } mods.push(parseMod(text.slice(i + 1, end))); i = end + 1; continue; } head += text.charAt(i); i++; } return { head: head, mods: mods }; } function emptyWord() { return { lang: "", word: "", mods: [], steps: [] }; } function emptyStep() { return { keyword: "", mods: [], words: [] }; } function parseWord(text) { var split = splitMods($.trim(text)); var word = emptyWord(); var head = split.head; // A language code, or a language family ("ira:-"); anything else is the word itself. var m = /^([a-zA-Z][a-zA-Z0-9._-]*):([\s\S]*)$/.exec(head); if (m) { word.lang = m[1]; head = m[2]; } word.word = head; split.mods.forEach(function (mo) { if (INLINE_KEYS.indexOf(mo.key) !== -1) { word.steps = parseChain(mo.value || ""); return; } word.mods.push(mo); }); return word; } // The inside of an <etimon:…>: ":kelîmeyeke mifteyî" followed by each source word in its own <…>. // A group named after a keyword modifier belongs to the keyword, which is how Modul:etymon reads it too. function parseChain(text) { var steps = []; var i = 0; function current() { if (!steps.length) { steps.push(emptyStep()); } return steps[steps.length - 1]; } while (i < text.length) { var ch = text.charAt(i); if (ch === ":") { var j = i + 1; while (j < text.length && text.charAt(j) !== ":" && text.charAt(j) !== "<") { j++; } var step = emptyStep(); step.keyword = $.trim(text.slice(i + 1, j)); steps.push(step); i = j; continue; } if (ch === "<") { var end = matchAngle(text, i); if (end === -1) { break; } var inner = text.slice(i + 1, end); i = end + 1; var name = /^([^:>]+)/.exec(inner); var step2 = current(); if (!step2.words.length && name && isKeywordModName($.trim(name[1]))) { step2.mods.push(parseMod(inner)); } else { step2.words.push(parseWord(inner)); } continue; } i++; } return steps; } // One {{etîmon}} call -> the model the form edits, or null for anything else. function parseCall(callWikitext) { var call = wt.parseTemplateCalls(callWikitext || "").calls[0]; if (!call || !isEtimonName(call.name)) { return null; } var model = { lang: "", steps: [], named: {}, namedOrder: [] }; var positional = 0; splitParams(call.params.join("|")).forEach(function (raw) { // A name cannot hold "<": that is a modifier, so "fa:x<t:a=b>" stays positional. var m = /^\s*([^|={}<>\n]+?)\s*=([\s\S]*)$/.exec(raw); if (m) { if (model.named[m[1]] === undefined) { model.namedOrder.push(m[1]); } model.named[m[1]] = $.trim(m[2]); return; } positional++; var value = $.trim(raw); if (positional === 1) { model.lang = value; return; } if (value.charAt(0) === ":") { var split = splitMods(value); var step = emptyStep(); step.keyword = $.trim(split.head.slice(1)); step.mods = split.mods; model.steps.push(step); return; } if (!model.steps.length) { model.steps.push(emptyStep()); } model.steps[model.steps.length - 1].words.push(parseWord(value)); }); return model; } // ---- writing it back --------------------------------------------------------------------------- function joinMods(mods) { return (mods || []).map(function (mo) { return mo.flag ? "<" + mo.key + ">" : "<" + mo.key + ":" + (mo.value || "") + ">"; }).join(""); } // A row nobody filled in: no word, no language, nothing hanging off it. function wordIsEmpty(word) { return !$.trim(word.word || "") && !$.trim(word.lang || "") && !(word.mods || []).length && !(word.steps || []).length; } function joinWord(word) { var lang = $.trim(word.lang || ""); var out = (lang ? lang + ":" : "") + $.trim(word.word || "") + joinMods(word.mods); if ((word.steps || []).length) { out += "<etimon:" + joinChain(word.steps) + ">"; } return out; } function joinChain(steps) { return (steps || []).map(function (step) { return ":" + $.trim(step.keyword || "") + joinMods(step.mods) + (step.words || []).filter(function (word) { return !wordIsEmpty(word); }).map(function (word) { return "<" + joinWord(word) + ">"; }).join(""); }).join(""); } function buildCall(model) { var parts = [NAME, $.trim(model.lang || "")]; (model.steps || []).forEach(function (step) { var keyword = $.trim(step.keyword || ""); if (keyword || (step.mods || []).length) { parts.push(":" + keyword + joinMods(step.mods)); } (step.words || []).forEach(function (word) { if (!wordIsEmpty(word)) { parts.push(joinWord(word)); } }); }); (model.namedOrder || []).forEach(function (key) { var value = model.named[key]; if (value !== undefined && value !== null && value !== "") { parts.push(key + "=" + value); } }); return "{{" + parts.join("|") + "}}"; } // Which metn= choice a written value belongs to, and what is left over for that choice's own box: // "3" belongs to the number choice, ":pal*" to the ":kod*" one. function splitMetn(value) { var current = $.trim(value || ""); var out = { choice: "", rest: "" }; if (!current) { return out; } (data.metnChoices || []).forEach(function (choice) { if (out.choice) { return; } if (!choice.free) { if (choice.value === current) { out.choice = choice.value; } return; } if (choice.value === "1" && /^\d+$/.test(current)) { out.choice = choice.value; out.rest = current; } else if (choice.value === ":*" && /^:.+\*$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1, -1); } else if (choice.value === ":" && /^:[^*]+$/.test(current)) { out.choice = choice.value; out.rest = current.slice(1); } }); return out; } // The inverse: what the dropdown and its box together mean as a metn= value. function joinMetn(choiceValue, rest) { var choice = null; (data.metnChoices || []).forEach(function (c) { if (c.value === choiceValue) { choice = c; } }); if (!choice) { return ""; } if (!choice.free) { return choice.value; } var typed = $.trim(rest || ""); if (!typed) { return ""; } if (choice.value === "1") { return typed; } return ":" + typed + (choice.value === ":*" ? "*" : ""); } function setNamed(model, key, value) { if (model.namedOrder.indexOf(key) === -1) { model.namedOrder.push(key); } model.named[key] = value; } // ---- the form ---------------------------------------------------------------------------------- // Chips for one list of modifiers, plus the ⊕ that adds another. The pills, the value box and the // chips are the same widgetry a sense word row uses, so they look and behave the same here. // Whether a modifier applies under the keyword it is being offered for: an "only" list in the data // (aftype under :qf, maneid under :wergirtin) keeps it off every other keyword's picker. function modApplies(def, keyword) { if (!(def.only || []).length) { return true; } var canonical = defFor(keywords(), keyword); return def.only.indexOf(canonical ? canonical.key : keyword) !== -1; } function modifierEditor(mods, defs, onChange, keywordOf) { var $wrap = $("<div class='dsb-etimon-mods'></div>"); var $chips = $("<div class='dsb-word-mods'></div>"); var $btn = $("<button type='button' class='dsb-mod-btn'>&#8853;</button>") .attr("title", util.msg.addModifier); var $picker = $("<div class='dsb-mod-picker'></div>").hide(); function label(def) { return def ? def.key + " — " + def.desc : ""; } // Same box for adding and for editing: a modifier with a fixed set of values gets a dropdown. function openValueEditor(def, index) { $picker.hide(); $wrap.children(".dsb-mod-val-wrap").remove(); var $box = $("<div class='dsb-mod-val-wrap'></div>"); var $label = $("<span class='dsb-mod-val-label'></span>").text(def.key); var current = index === -1 ? "" : (mods[index].value || ""); var $field; if ((def.values || []).length) { $field = $("<select class='dsb-mod-val-input'></select>"); $field.append($("<option value=''></option>")); def.values.forEach(function (value) { $field.append($("<option></option>").val(value).text(value)); }); $field.val(current); } else { $field = $("<input type='text' class='dsb-mod-val-input'>") .attr("size", 24).attr("placeholder", def.desc).val(current); } var $ok = $("<button type='button' class='dsb-mod-confirm'>&#10003;</button>"); var $no = $("<button type='button' class='dsb-mod-cancel'>&#10005;</button>"); function apply() { var value = $.trim(String($field.val() || "")); if (value) { if (index === -1) { mods.push({ key: def.key, value: value }); } else { mods[index].value = value; } onChange(); render(); } $box.remove(); } $ok.on("click", apply); $no.on("click", function () { $box.remove(); }); $field.on("keydown", function (e) { if (e.which === 13) { e.preventDefault(); apply(); } if (e.which === 27) { $box.remove(); } }); $box.append($label, $field, $ok, $no); $wrap.append($box); $field.focus(); } function render() { $chips.empty(); mods.forEach(function (mo, index) { var def = defFor(defs, mo.key); var $chip = $("<span class='dsb-word-mod-chip' role='button' tabindex='0'></span>") .attr("title", def ? def.desc : mo.key) .text(mo.flag ? mo.key : mo.key + ": " + (mo.value || "")); var $x = $("<button type='button' class='dsb-word-mod-chip-remove'>&#215;</button>") .attr("title", util.msg.removeModifier); $x.on("click", function (e) { e.stopPropagation(); mods.splice(index, 1); onChange(); render(); }); $chip.on("click", function () { if (def && !mo.flag) { openValueEditor(def, index); } }); $chip.append($x); $chips.append($chip); }); $chips.toggle(!!mods.length); } // Rebuilt per open rather than once: the keyword can change while the row is on screen, and with // it which modifiers are on offer. $btn.on("click", function (e) { e.preventDefault(); var keyword = keywordOf ? keywordOf() : ""; $picker.empty(); defs.forEach(function (def) { // <etimon:…> has the "+ Etîmolojiya di cih de" button of its own; as a pill it would be a // box asking for a whole chain in one line. if (INLINE_KEYS.indexOf(def.key) !== -1 || !modApplies(def, keyword)) { return; } var $pill = $("<button type='button' class='dsb-mod-pill'></button>") .text(def.key).attr("title", label(def)).data("mod-key", def.key); $pill.on("click", function (ev) { ev.preventDefault(); if (def.flag) { mods.push({ key: def.key, flag: true }); $picker.hide(); onChange(); render(); return; } openValueEditor(def, -1); }); $picker.append($pill); }); var used = {}; mods.forEach(function (mo) { used[mo.key] = true; }); $picker.children(".dsb-mod-pill").each(function () { var isUsed = !!used[$(this).data("mod-key")]; $(this).prop("disabled", isUsed).toggleClass("dsb-mod-pill-used", isUsed); }); $picker.toggle(); }); render(); $wrap.append($chips, $btn, $picker); return $wrap; } function languageInput(value, onChange) { var $input = $("<input type='text' class='dsb-input dsb-etimon-lang'>") .attr("list", langs.datalistId()) .attr("placeholder", "koda zimanî…") .val(value || ""); $input.on("input change", function () { if (langs.missingFromCore($input.val())) { langs.ensureFull(); } onChange($.trim($input.val())); }); return $input; } // The whole form for one call. Structural changes (a step or a word added or dropped) rebuild it from // the model, which every box writes into as it is typed in. function buildForm(model, onResize) { var $element = $("<div class='dsb-etimon'></div>"); var $preview = $("<code class='dsb-etimon-preview'></code>"); function changed() { $preview.text(buildCall(model)); } function structureChanged() { render(); if (onResize) { onResize(); } } function keywordSelect(step) { var $select = $("<select class='dsb-etimon-keyword'></select>"); $select.append($("<option value=''>— kelîmeya mifteyî —</option>")); keywords().forEach(function (def) { $select.append($("<option></option>").val(def.key).text(def.key + " — " + def.desc)); }); // A keyword written under an alias, or one the table does not know, keeps its own option. var known = defFor(keywords(), step.keyword); if (step.keyword && (!known || known.key !== step.keyword)) { $select.append($("<option></option>").val(step.keyword) .text(step.keyword + (known ? " — " + known.desc : " — (ne di belgeyê de)"))); } $select.val(step.keyword); $select.on("change", function () { step.keyword = $select.val(); changed(); structureChanged(); // the hints under it (how many words, what they mean) follow the keyword }); $select.attr("data-placeholder", "Kelîmeya mifteyî"); var $wrapped = util.wrapNativeSelect($select); // The searchable box reads the selection only when told to, so a keyword already chosen shows. $select.trigger("wiktku:refresh"); return $wrapped; } function wordRow(step, word, words, nested) { var $li = $("<li class='dsb-etimon-word'></li>"); var $row = $("<div class='dsb-etimon-word-row'></div>"); var $lang = languageInput(word.lang, function (value) { word.lang = value; changed(); }); var $word = $("<input type='text' class='dsb-input dsb-etimon-word-input'>") .attr("placeholder", "kelîme ( - = tenê navê zimên )") .val(word.word || ""); $word.on("input", function () { word.word = $word.val(); changed(); }); var $remove = $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê kelîmeyê jê bibe"); $remove.on("click", function () { words.splice(words.indexOf(word), 1); if (!words.length && !nested) { words.push(emptyWord()); } changed(); structureChanged(); }); $row.append($lang, $word, modifierEditor(word.mods, wordMods(), changed, function () { return step.keyword; }), $remove); $li.append($row); // The way on to the next step when the source word's own page carries no {{etîmon}}. if ((word.steps || []).length) { var $nested = $("<div class='dsb-etimon-nested'></div>"); $nested.append($("<div class='dsb-etimon-nested-head'></div>").append( $("<span class='dsb-adv-label'>Etîmolojiya di cih de</span>"), $("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Etîmolojiya di cih de jê bibe") .on("click", function () { word.steps = []; changed(); structureChanged(); }) )); renderSteps($nested, word.steps, true); $li.append($nested); } else { $li.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Etîmolojiya di cih de") .attr("title", "Zincîrê li vir bidomîne, eger rûpela vê kelîmeyê tune be") .on("click", function () { word.steps = [$.extend(emptyStep(), { words: [emptyWord()] })]; changed(); structureChanged(); })); } return $li; } function stepBlock(steps, step, nested) { var $block = $("<div class='dsb-etimon-step'></div>"); var $head = $("<div class='dsb-etimon-step-head'></div>"); $head.append(keywordSelect(step)); $head.append(modifierEditor(step.mods, keywordMods(), changed, function () { return step.keyword; })); if (steps.length > 1 || nested) { $head.append($("<button type='button' class='dsb-etimon-remove'>&#215;</button>") .attr("title", "Vê gavê jê bibe") .on("click", function () { steps.splice(steps.indexOf(step), 1); changed(); structureChanged(); })); } $block.append($head); var def = defFor(keywords(), step.keyword); if (def && def.min > 1) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Ev kelîmeya mifteyî bi kêmî " + def.min + " kelîmeyan dixwaze.")); } if (def && def.invisible) { $block.append($("<div class='dsb-tpl-help'></div>") .text("Di metnê de xuya nabe; tenê kategoriyan çêdike.")); } if (!step.words.length) { step.words.push(emptyWord()); } var $words = $("<ul class='dsb-etimon-words'></ul>"); step.words.forEach(function (word) { $words.append(wordRow(step, word, step.words, nested)); }); $block.append($words); $block.append($("<button type='button' class='dsb-etimon-add'>+ Kelîme</button>") .on("click", function () { step.words.push(emptyWord()); structureChanged(); })); return $block; } function renderSteps($host, steps, nested) { if (!steps.length) { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); } steps.forEach(function (step) { $host.append(stepBlock(steps, step, nested)); }); $host.append($("<button type='button' class='dsb-etimon-add'></button>") .text("+ Gaveke etîmolojiyê") .attr("title", "Gaveke din a eynî bangkirinê") .on("click", function () { steps.push($.extend(emptyStep(), { words: [emptyWord()] })); structureChanged(); })); } // metn= picks how much of the chain is written out; the values that need a number or a language // code ("3", ":pal") open a box of their own. function metnControl() { var $wrap = $("<div class='dsb-etimon-metn'></div>"); var choices = data.metnChoices || []; var $select = $("<select class='dsb-etimon-metn-select'></select>"); $select.append($("<option value=''>— metn nayê nîşandan —</option>")); choices.forEach(function (choice) { $select.append($("<option></option>").val(choice.value).text(choice.value + " — " + choice.desc)); }); var split = splitMetn(model.named.metn); $select.val(split.choice); var $free = $("<input type='text' class='dsb-input dsb-etimon-metn-free'>").val(split.rest); function choiceFor(value) { var found = null; choices.forEach(function (choice) { if (choice.value === value) { found = choice; } }); return found; } function apply() { var choice = choiceFor($select.val()); $free.toggle(!!(choice && choice.free)); if (choice && choice.free) { $free.attr("placeholder", choice.value === "1" ? "hejmar…" : "koda zimanî…"); } setNamed(model, "metn", joinMetn($select.val(), $free.val())); changed(); } $select.on("change", apply); $free.on("input", apply); apply(); $select.attr("data-placeholder", "metn"); $wrap.append($("<span class='dsb-adv-label'>Metn</span>"), util.wrapNativeSelect($select), $free); $select.trigger("wiktku:refresh"); return $wrap; } // The parameters marked "primary" in the data sit in the open next to Metn; the rest are behind // "Parametreyên din". function namedParams(primary) { var $wrap = $("<div class='dsb-etimon-named'></div>"); (data.params || []).forEach(function (param) { if (!!param.primary !== !!primary) { return; } var value = model.named[param.key] || ""; var $row = $("<div class='dsb-etimon-param'></div>"); if (param.type === "flag") { $row.addClass("dsb-etimon-param-flag"); var id = "dsb-etimon-" + param.key.replace(/[^A-Za-z0-9]/g, ""); var $box = $("<input type='checkbox'>").attr("id", id).prop("checked", value === "1"); $box.on("change", function () { setNamed(model, param.key, $box.prop("checked") ? "1" : ""); changed(); }); $row.append($box, $("<label class='dsb-adv-label'></label>").attr("for", id) .text(param.key + " — " + param.desc)); } else { var $field; if (param.type === "select") { $field = $("<select class='dsb-etimon-param-select'></select>"); $field.append($("<option value=''></option>")); (param.values || []).forEach(function (v) { $field.append($("<option></option>").val(v).text(v)); }); $field.val(value); } else { $field = $("<input type='text' class='dsb-input'>").val(value); } $field.on("input change", function () { setNamed(model, param.key, $.trim(String($field.val() || ""))); changed(); }); $row.append($("<label class='dsb-adv-label'></label>").text(param.key), $field, $("<div class='dsb-tpl-help'></div>").text(param.desc)); } $wrap.append($row); }); return $wrap; } function render() { $element.empty(); $element.append($("<div class='dsb-tpl-name'></div>").append( $("<a></a>").attr("href", mw.util.getUrl("Şablon:" + NAME)) .attr("target", "_blank").text("{{" + NAME + "}}") )); var $lang = $("<div class='dsb-etimon-pagelang'></div>"); $lang.append($("<span class='dsb-adv-label'>Zimanê rûpelê</span>"), languageInput(model.lang, function (value) { model.lang = value; changed(); })); $element.append($lang); var $steps = $("<div class='dsb-etimon-steps'></div>"); renderSteps($steps, model.steps, false); $element.append($steps); $element.append(metnControl()); $element.append(namedParams(true)); var $more = $("<details class='dsb-etimon-more'></details>"); $more.append($("<summary>Parametreyên din</summary>"), namedParams(false)); $more.on("toggle", function () { if (onResize) { onResize(); } }); $element.append($more); $element.append($("<div class='dsb-etimon-preview-wrap'></div>").append($preview)); changed(); } render(); return { $element: $element, values: function () { return buildCall(model); } }; } // A call for a page in this language with one empty step, and metn=++ so it actually writes something. function emptyModel(lang) { var model = { lang: lang || "", steps: [$.extend(emptyStep(), { words: [emptyWord()] })], named: {}, namedOrder: [] }; setNamed(model, "metn", "++"); return model; } // ---- the dialog -------------------------------------------------------------------------------- var manager = null; function windowManager() { if (!manager) { manager = new OO.ui.WindowManager(); $(document.body).append(manager.$element); } return manager; } // Opens one {{etîmon}} call in the builder. Resolves with the edited wikitext, "" for "Jê bibe", or // null when it is cancelled -- the contract cite.openTemplateDialog() has, since it is called in its // place. One at a time, for the same reason: a second window the manager does not track is dead. var busy = false; function openDialog(callWikitext) { var done = $.Deferred(); if (busy) { return done.resolve(null).promise(); } var parsed = parseCall(callWikitext); if (!parsed) { return done.resolve(null).promise(); } var model = parsed.steps.length ? parsed : emptyModel(parsed.lang); busy = true; done.always(function () { busy = false; }); mw.loader.using(["oojs-ui-core", "oojs-ui-windows"]).then(function () { var result = null; var ParentDialog = OO.ui.ProcessDialog; function EtimonDialog(config) { ParentDialog.call(this, config); } OO.inheritClass(EtimonDialog, ParentDialog); EtimonDialog.static.name = "etimonDialog"; EtimonDialog.static.title = "{{" + NAME + "}}"; EtimonDialog.static.actions = [ { action: "save", label: "Biguhêre", flags: ["primary", "progressive"] }, { action: "remove", label: "Jê bibe", flags: "destructive" }, { label: util.msg.cancel, flags: "safe" } ]; EtimonDialog.prototype.initialize = function () { var dialog = this; ParentDialog.prototype.initialize.apply(this, arguments); this.panel = new OO.ui.PanelLayout({ padded: true, expanded: false }); this.form = buildForm(model, function () { dialog.updateSize(); }); this.panel.$element.append(this.form.$element); this.$body.append(this.panel.$element); }; EtimonDialog.prototype.getBodyHeight = function () { return this.panel.$element.outerHeight(true); }; EtimonDialog.prototype.getActionProcess = function (action) { var dialog = this; if (action === "save" || action === "remove") { return new OO.ui.Process(function () { result = action === "remove" ? "" : dialog.form.values(); dialog.close(); }); } return ParentDialog.prototype.getActionProcess.call(this, action); }; // Marks the page while this is showing, so a floating box of ours (DefSideBoxes' queue) does // not sit over a dialog the page's stacking order puts underneath it. $(document.body).addClass("wikt-dialog-open"); done.always(function () { $(document.body).removeClass("wikt-dialog-open"); }); var windows = windowManager(); var dialog = new EtimonDialog({ size: "large" }); windows.addWindows([dialog]); var instance = windows.openWindow(dialog); instance.closed.then(function () { windows.clearWindows(); done.resolve(result); }); instance.opening.fail(function () { windows.clearWindows(); done.resolve(null); }); }, function () { done.resolve(null); }); return done.promise(); } module.exports = { NAME: NAME, splitMetn: splitMetn, joinMetn: joinMetn, isEtimonName: isEtimonName, parseCall: parseCall, buildCall: buildCall, parseChain: parseChain, joinChain: joinChain, openDialog: openDialog }; }()); // </nowiki> orb9bq3exeqyqbljyoghbnqtsft1vqv