Wikipedia
acewiki
https://ace.wikipedia.org/wiki/%C3%94n_Keue
MediaWiki 1.47.0-wmf.3
first-letter
Alat
Kusuih
Marit
Ureuëng Ngui
Marit Ureuëng Ngui
Wikipedia
Marit Wikipedia
Beureukaih
Marit Beureukaih
MediaWiki
Marit MediaWiki
Seunaleuëk
Marit Seunaleuëk
Beunantu
Marit Beunantu
Kawan
Marit Kawan
TimedText
TimedText talk
Modul
Pembicaraan Modul
Acara
Pembicaraan Acara
Bahsa Minangkabau
0
5897
158117
149973
2026-05-21T10:54:17Z
~2026-30490-46
33452
/* */
158117
wikitext
text/x-wiki
'''Bahsa Minangkabau''', nakeuh saboh [[bahsa]] nyang geungui lé [[ureueng Minangkabau]] di [[Sumatera Barat]] ([[Indonesia]]), [[Nanggroë Sembilan, Malaysia|Negeri Sembilan]], [[Seulangor|Selangor]] ([[Malaysia]]).
== Asa seunurat ==
* ''Tata Bahasa Minangkabau'', Gerard Moussay (original title ''La Langue Minangkabau'', translated from French by Rahayu S. Hidayat), ISBN 979-9023-16-5.
[[Kawan:Bahsa|Minangkabau]]
j50v8tk0tfnodqqjhuiipr4hl3t1zpx
Ureuëng Ngui:PK2
2
33320
158116
155650
2026-05-21T08:27:58Z
PK2
446
add user pages for new Wikipedia editions
158116
wikitext
text/x-wiki
{| class="wikitable" style="font-size:85%"
|-
| [[User:PK2/sandbox|This]] is where my sandbox pages in different languages are
|}
;<div class="center" style="width:auto; margin-left:auto; margin-right:auto; font-size:85%">My user pages in different languages by language code</div>
{| class="wikitable" style="text-align: center; font-size:85%"
|+ A
|-
| [[:ab:User:PK2|User page]] in [[:en:Abkhaz language|Abkhaz]]<br />(code: <code>ab</code>)
| [[:ace:User:PK2|User page]] in [[:en:Acehnese language|Acehnese]]<br />(code: <code>ace</code>)
| [[:ady:User:PK2|User page]] in [[:en:Adyghe language|Adyghe]]<br />(code: <code>ady</code>)
| [[:af:User:PK2|User page]] in [[:en:Afrikaans|Afrikaans]]<br />(code: <code>af</code>)
| [[:als:User:PK2|User page]] in [[:en:Alemannic German|Alemannic German]]<br />(code: <code>als</code>)
| [[:alt:User:PK2|User page]] in [[:en:Southern Altai language|Southern Altai]]<br />(code: <code>alt</code>)
| [[:am:User:PK2|User page]] in [[:en:Amharic|Amharic]]<br />(code: <code>am</code>)
| [[:ami:User:PK2|User page]] in [[:en:Amis language|Amis]]<br />(code: <code>ami</code>)
| [[:an:User:PK2|User page]] in [[:en:Aragonese language|Aragonese]]<br />(code: <code>an</code>)
| [[:ang:User:PK2|User page]] in [[:en:Old English|Old English]]<br />(code: <code>ang</code>)
|-
| [[:ann:User:PK2|User page]] in [[:en:Obolo language|Obolo]]<br />(code: <code>ann</code>)
| [[:anp:User:PK2|User page]] in [[:en:Angika|Angika]]<br />(code: <code>anp</code>)
| [[:ar:User:PK2|User page]] in [[:en:Arabic|Arabic]]<br />(code: <code>ar</code>)
| [[:arc:User:PK2|User page]] in [[:en:Aramaic|Aramaic]] ([[:en:Syriac language|Syriac]])<br />(code: <code>arc</code>)
| [[:ary:User:PK2|User page]] in [[:en:Moroccan Arabic|Moroccan Arabic]]<br />(code: <code>ary</code>)
| [[:arz:User:PK2|User page]] in [[:en:Egyptian Arabic|Egyptian Arabic]]<br />(code: <code>arz</code>)
| [[:as:User:PK2|User page]] in [[:en:Assamese language|Assamese]]<br />(code: <code>as</code>)
| [[:ast:User:PK2|User page]] in [[:en:Asturleonese language|Asturleonese]] ([[:en:Asturian language|Asturian]])<br />(code: <code>ast</code>)
| [[:atj:User:PK2|User page]] in [[:en:Atikamekw language|Atikamekw]]<br />(code: <code>atj</code>)
| [[:av:User:PK2|User page]] in [[:en:Avar language|Avar]]<br />(code: <code>av</code>)
|-
| [[:avk:User:PK2|User page]] in [[:en:Kotava|Kotava]]<br />(code: <code>avk</code>)
| [[:awa:User:PK2|User page]] in [[:en:Awadhi language|Awadhi]]<br />(code: <code>awa</code>)
| [[:ay:User:PK2|User page]] in [[:en:Aymara language|Aymara]]<br />(code: <code>ay</code>)
| [[:az:User:PK2|User page]] in [[:en:Azerbaijani language|Azerbaijani]]<br />(code: <code>az</code>)
| [[:azb:User:PK2|User page]] in [[:en:Azerbaijani language#South Azerbaijani|South Azerbaijani]]<br />(code: <code>azb</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ B
|-
| [[:ba:User:PK2|User page]] in [[:en:Bashkir language|Bashkir]]<br />(code: <code>ba</code>)
| [[:ban:User:PK2|User page]] in [[:en:Balinese language|Balinese]]<br />(code: <code>ban</code>)
| [[:bar:User:PK2|User page]] in [[:en:Bavarian language|Bavarian]]<br />(code: <code>bar</code>)
| [[:bat-smg:User:PK2|User page]] in [[:en:Samogitian language|Samogitian]]<br />(code: <code>bat-smg</code>)
| [[:bbc:User:PK2|User page]] in [[:en:Toba Batak language|Toba Batak]]<br />(code: <code>bbc</code>)
| [[:bcl:User:PK2|User page]] in [[:en:Central Bikol|Central Bikol]]<br />(code: <code>bcl</code>)
| [[:bdr:User:PK2|User page]] in [[:en:Sama–Bajaw languages|West Coast Bajau]]<br />(code: <code>bdr</code>)
| [[:be:User:PK2|User page]] in [[:en:Belarusian language|Belarusian]]<br />(code: <code>be</code>)
| [[:be-tarask:User:PK2|User page]] in [[:en:Belarusian language|Belarusian]] ([[:en:Taraškievica|Taraškievica]])<br />(code: <code>be-tarask</code>)
| [[:bew:User:PK2|User page]] in [[:en:Betawi language|Betawi]]<br />(code: <code>bew</code>)
|-
| [[:bg:User:PK2|User page]] in [[:en:Bulgarian language|Bulgarian]]<br />(code: <code>bg</code>)
| [[:bh:User:PK2|User page]] in [[:en:Bihari languages|Bihari]] ([[:en:Bhojpuri language|Bhojpuri]])<br />(code: <code>bh</code>)
| [[:bi:User:PK2|User page]] in [[:en:Bislama|Bislama]]<br />(code: <code>bi</code>)
| [[:bjn:User:PK2|User page]] in [[:en:Banjarese language|Banjarese]]<br />(code: <code>bjn</code>)
| [[:blk:User:PK2|User page]] in [[:en:Pa'O language|Pa'O]]<br />(code: <code>blk</code>)
| [[:bm:User:PK2|User page]] in [[:en:Bambara language|Bambara]]<br />(code: <code>bm</code>)
| [[:bn:User:PK2|User page]] in [[:en:Bengali language|Bengali]]<br />(code: <code>bn</code>)
| [[:bo:User:PK2|User page]] in [[:en:Central Tibetan|Central Tibetan]] ([[:en:Lhasa Tibetan|Lhasa Tibetan]])<br />(code: <code>bo</code>)
| [[:bpy:User:PK2|User page]] in [[:en:Bishnupriya Manipuri|Bishnupriya Manipuri]]<br />(code: <code>bpy</code>)
| [[:br:User:PK2|User page]] in [[:en:Breton language|Breton]]<br />(code: <code>br</code>)
|-
| [[:bs:User:PK2|User page]] in [[:en:Bosnian language|Bosnian]]<br />(code: <code>bs</code>)
| [[:btm:User:PK2|User page]] in [[:en:Mandailing Batak language|Mandailing Batak]]<br />(code: <code>btm</code>)
| [[:bug:User:PK2|User page]] in [[:en:Buginese language|Buginese]]<br />(code: <code>bug</code>)
| [[:bxr:User:PK2|User page]] in [[:en:Buryat language|Buryat]] (Russia Buriat)<br />(code: <code>bxr</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ C
|-
| [[:ca:User:PK2|User page]] in [[:en:Catalan language|Catalan]]<br />(code: <code>ca</code>)
| [[:cbk-zam:User:PK2|User page]] in [[:en:Chavacano|Chavacano]] (Zamboanga)<br />(code: <code>cbk-zam</code>)
| [[:cdo:User:PK2|User page]] in [[:en:Eastern Min|Eastern Min]]<br />(code: <code>cdo</code>)
| [[:ce:User:PK2|User page]] in [[:en:Chechen language|Chechen]]<br />(code: <code>ce</code>)
| [[:ceb:User:PK2|User page]] in [[:en:Cebuano language|Cebuano]]<br />(code: <code>ceb</code>)
| [[:ch:User:PK2|User page]] in [[:en:Chamorro language|Chamorro]]<br />(code: <code>ch</code>)
| [[:chr:User:PK2|User page]] in [[:en:Cherokee language|Cherokee]]<br />(code: <code>chr</code>)
| [[:chy:User:PK2|User page]] in [[:en:Cheyenne language|Cheyenne]]<br />(code: <code>chy</code>)
|-
| [[:ckb:User:PK2|User page]] in [[:en:Kurdish language|Kurdish]] ([[:en:Sorani|Sorani]])<br />(code: <code>ckb</code>)
| [[:co:User:PK2|User page]] in [[:en:Corsican language|Corsican]]<br />(code: <code>co</code>)
| [[:crh:User:PK2|User page]] in [[:en:Crimean Tatar language|Crimean Tatar]]<br />(code: <code>crh</code>)
| [[:cs:User:PK2|User page]] in [[:en:Czech language|Czech]]<br />(code: <code>cs</code>)
| [[:csb:User:PK2|User page]] in [[:en:Kashubian language|Kashubian]]<br />(code: <code>csb</code>)
| [[:cu:User:PK2|User page]] in [[:en:Old Church Slavonic|Old Church Slavonic]]<br />(code: <code>cu</code>)
| [[:cv:User:PK2|User page]] in [[:en:Chuvash language|Chuvash]]<br />(code: <code>cv</code>)
| [[:cy:User:PK2|User page]] in [[:en:Welsh language|Welsh]]<br />(code: <code>cy</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ D
|-
| [[:da:User:PK2|User page]] in [[:en:Danish language|Danish]]<br />(code: <code>da</code>)
| [[:dag:User:PK2|User page]] in [[:en:Dagbani language|Dagbani]]<br />(code: <code>dag</code>)
| [[:de:User:PK2|User page]] in [[:en:German language|German]]<br />(code: <code>de</code>)
| [[:dga:User:PK2|User page]] in [[:en:Dagaare language|Dagaare]]<br />(code: <code>dga</code>)
| [[:din:User:PK2|User page]] in [[:en:Dinka language|Dinka]]<br />(code: <code>din</code>)
| [[:diq:User:PK2|User page]] in [[:en:Zaza language|Zaza]]<br />(code: <code>diq</code>)
| [[:dsb:User:PK2|User page]] in [[:en:Lower Sorbian language|Lower Sorbian]]<br />(code: <code>dsb</code>)
| [[:dtp:User:PK2|User page]] in [[:en:Dusun language|Dusun]]<br />(code: <code>dtp</code>)
| [[:dty:User:PK2|User page]] in [[:en:Doteli|Doteli]]<br />(code: <code>dty</code>)
| [[:dv:User:PK2|User page]] in [[:en:Maldivian language|Maldivian]]<br />(code: <code>dv</code>)
| [[:dz:User:PK2|User page]] in [[:en:Dzongkha|Dzongkha]]<br />(code: <code>dz</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ E
|-
| [[:ee:User:PK2|User page]] in [[:en:Ewe language|Ewe]]<br />(code: <code>ee</code>)
| [[:el:User:PK2|User page]] in [[:en:Greek language|Greek]]<br />(code: <code>el</code>)
| [[:eml:User:PK2|User page]] in [[:en:Emilian–Romagnol|Emilian–Romagnol]]<br />(code: <code>eml</code>)
| [[:en:User:PK2|User page]] in [[:en:English language|English]]<br />(code: <code>en</code>)
| [[:eo:User:PK2|User page]] in [[:en:Esperanto|Esperanto]]<br />(code: <code>eo</code>)
| [[:es:User:PK2|User page]] in [[:en:Spanish language|Spanish]]<br />(code: <code>es</code>)
| [[:et:User:PK2|User page]] in [[:en:Estonian language|Estonian]]<br />(code: <code>et</code>)
| [[:eu:User:PK2|User page]] in [[:en:Basque language|Basque]]<br />(code: <code>eu</code>)
| [[:ext:User:PK2|User page]] in [[:en:Extremaduran language|Extremaduran]]<br />(code: <code>ext</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ F
|-
| [[:fa:User:PK2|User page]] in [[:en:Persian language|Persian]]<br />(code: <code>fa</code>)
| [[:fat:User:PK2|User page]] in [[:en:Akan language|Akan]] ([[:en:Fante dialect|Fante]])<br />(code: <code>fat</code>)
| [[:ff:User:PK2|User page]] in [[:en:Fula language|Fula]]<br />(code: <code>ff</code>)
| [[:fi:User:PK2|User page]] in [[:en:Finnish language|Finnish]]<br />(code: <code>fi</code>)
| [[:fiu-vro:User:PK2|User page]] in [[:en:Võro language|Võro]]<br />(code: <code>fiu-vro</code>)
| [[:fj:User:PK2|User page]] in [[:en:Fijian language|Fijian]]<br />(code: <code>fj</code>)
| [[:fo:User:PK2|User page]] in [[:en:Faroese language|Faroese]]<br />(code: <code>fo</code>)
| [[:fon:User:PK2|User page]] in [[:en:Fon language|Fon]]<br />(code: <code>fon</code>)
| [[:fr:User:PK2|User page]] in [[:en:French language|French]]<br />(code: <code>fr</code>)
| [[:frp:User:PK2|User page]] in [[:en:Franco-Provençal|Franco-Provençal]]<br />(code: <code>frp</code>)
| [[:frr:User:PK2|User page]] in [[:en:North Frisian language|North Frisian]]<br />(code: <code>frr</code>)
| [[:fur:User:PK2|User page]] in [[:en:Friulian language|Friulian]]<br />(code: <code>fur</code>)
| [[:fy:User:PK2|User page]] in [[:en:West Frisian language|West Frisian]]<br />(code: <code>fy</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ G
|-
| [[:ga:User:PK2|User page]] in [[:en:Irish language|Irish]]<br />(code: <code>ga</code>)
| [[:gag:User:PK2|User page]] in [[:en:Gagauz language|Gagauz]]<br />(code: <code>gag</code>)
| [[:gan:User:PK2|User page]] in [[:en:Gan Chinese|Gan Chinese]]<br />(code: <code>gan</code>)
| [[:gcr:User:PK2|User page]] in [[:en:French Guianese Creole|French Guianese Creole]]<br />(code: <code>gcr</code>)
| [[:gd:User:PK2|User page]] in [[:en:Scottish Gaelic|Scottish Gaelic]]<br />(code: <code>gd</code>)
| [[:gl:User:PK2|User page]] in [[:en:Galician language|Galician]]<br />(code: <code>gl</code>)
| [[:glk:User:PK2|User page]] in [[:en:Gilaki language|Gilaki]]<br />(code: <code>glk</code>)
| [[:gn:User:PK2|User page]] in [[:en:Guarani language|Guarani]]<br />(code: <code>gn</code>)
| [[:gom:User:PK2|User page]] in [[:en:Konkani language|Konkani]] (Goan Konkani)<br />(code: <code>gom</code>)
|-
| [[:gor:User:PK2|User page]] in [[:en:Gorontalo language|Gorontalo]]<br />(code: <code>gor</code>)
| [[:got:User:PK2|User page]] in [[:en:Gothic language|Gothic]]<br />(code: <code>got</code>)
| [[:gpe:User:PK2|User page]] in [[:en:Ghanaian Pidgin English|Ghanaian Pidgin English]]<br />(code: <code>gpe</code>)
| [[:gu:User:PK2|User page]] in [[:en:Gujarati language|Gujarati]]<br />(code: <code>gu</code>)
| [[:guc:User:PK2|User page]] in [[:en:Wayuu language|Wayuu]]<br />(code: <code>guc</code>)
| [[:gur:User:PK2|User page]] in [[:en:Farefare language|Farefare]]<br />(code: <code>gur</code>)
| [[:guw:User:PK2|User page]] in [[:en:Gun language|Gun]]<br />(code: <code>guw</code>)
| [[:gv:User:PK2|User page]] in [[:en:Manx language|Manx]]<br />(code: <code>gv</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ H
|-
| [[:ha:User:PK2|User page]] in [[:en:Hausa language|Hausa]]<br />(code: <code>ha</code>)
| [[:hak:User:PK2|User page]] in [[:en:Hakka Chinese|Hakka Chinese]]<br />(code: <code>hak</code>)
| [[:haw:User:PK2|User page]] in [[:en:Hawaiian language|Hawaiian]]<br />(code: <code>haw</code>)
| [[:he:User:PK2|User page]] in [[:en:Hebrew language|Hebrew]]<br />(code: <code>he</code>)
| [[:hi:User:PK2|User page]] in [[:en:Hindi|Hindi]]<br />(code: <code>hi</code>)
| [[:hif:User:PK2|User page]] in [[:en:Fiji Hindi|Fiji Hindi]]<br />(code: <code>hif</code>)
| [[:hr:User:PK2|User page]] in [[:en:Croatian language|Croatian]]<br />(code: <code>hr</code>)
| [[:hsb:User:PK2|User page]] in [[:en:Upper Sorbian language|Upper Sorbian]]<br />(code: <code>hsb</code>)
| [[:ht:User:PK2|User page]] in [[:en:Haitian Creole|Haitian Creole]]<br />(code: <code>ht</code>)
| [[:hu:User:PK2|User page]] in [[:en:Hungarian language|Hungarian]]<br />(code: <code>hu</code>)
| [[:hy:User:PK2|User page]] in [[:en:Armenian language|Armenian]] ([[:en:Eastern Armenian|Eastern Armenian]])<br />(code: <code>hy</code>)
| [[:hyw:User:PK2|User page]] in [[:en:Western Armenian|Western Armenian]]<br />(code: <code>hyw</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ I
|-
| [[:ia:User:PK2|User page]] in [[:en:Interlingua|Interlingua]]<br />(code: <code>ia</code>)
| [[:iba:User:PK2|User page]] in [[:en:Iban language|Iban]]<br />(code: <code>iba</code>)
| [[:id:User:PK2|User page]] in [[:en:Indonesian language|Indonesian]]<br />(code: <code>id</code>)
| [[:ie:User:PK2|User page]] in [[:en:Interlingue|Interlingue]]<br />(code: <code>ie</code>)
| [[:ig:User:PK2|User page]] in [[:en:Igbo language|Igbo]]<br />(code: <code>ig</code>)
| [[:igl:User:PK2|User page]] in [[:en:Igala language|Igala]]<br />(code: <code>igl</code>)
| [[:ik:User:PK2|User page]] in [[:en:Iñupiaq language|Iñupiaq]]<br />(code: <code>ik</code>)
| [[:ilo:User:PK2|User page]] in [[:en:Ilocano language|Ilocano]]<br />(code: <code>ilo</code>)
| [[:inh:User:PK2|User page]] in [[:en:Ingush language|Ingush]]<br />(code: <code>inh</code>)
| [[:io:User:PK2|User page]] in [[:en:Ido|Ido]]<br />(code: <code>io</code>)
| [[:is:User:PK2|User page]] in [[:en:Icelandic language|Icelandic]]<br />(code: <code>is</code>)
| [[:it:User:PK2|User page]] in [[:en:Italian language|Italian]]<br />(code: <code>it</code>)
| [[:iu:User:PK2|User page]] in [[:en:Inuktitut|Inuktitut]]<br />(code: <code>iu</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ J
|-
| [[:ja:User:PK2|User page]] in [[:en:Japanese language|Japanese]]<br />(code: <code>ja</code>)
| [[:jam:User:PK2|User page]] in [[:en:Jamaican Patois|Jamaican Patois]]<br />(code: <code>jam</code>)
| [[:jbo:User:PK2|User page]] in [[:en:Lojban|Lojban]]<br />(code: <code>jbo</code>)
| [[:jv:User:PK2|User page]] in [[:en:Javanese language|Javanese]]<br />(code: <code>jv</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ K
|-
| [[:ka:User:PK2|User page]] in [[:en:Georgian language|Georgian]]<br />(code: <code>ka</code>)
| [[:kaa:User:PK2|User page]] in [[:en:Karakalpak language|Karakalpak]]<br />(code: <code>kaa</code>)
| [[:kab:User:PK2|User page]] in [[:en:Kabyle language|Kabyle]]<br />(code: <code>kab</code>)
| [[:kai:User:PK2|User page]] in [[:en:Karai-karai|Karai-karai]]<br />(code: <code>kai</code>)
| [[:kaj:User:PK2|User page]] in [[:en:Jju language|Jju]]<br />(code: <code>kaj</code>)
| [[:kbd:User:PK2|User page]] in [[:en:Kabardian language|Kabardian]]<br />(code: <code>kbd</code>)
| [[:kbp:User:PK2|User page]] in [[:en:Kabiye language|Kabiye]]<br />(code: <code>kbp</code>)
| [[:kcg:User:PK2|User page]] in [[:en:Tyap|Tyap]]<br />(code: <code>kcg</code>)
| [[:kg:User:PK2|User page]] in [[:en:Kongo language|Kongo]]<br />(code: <code>kg</code>)
| [[:kge:User:PK2|User page]] in [[:en:Komering language|Komering]]<br />(code: <code>kge</code>)
| [[:ki:User:PK2|User page]] in [[:en:Kikuyu language|Kikuyu]]<br />(code: <code>ki</code>)
| [[:kk:User:PK2|User page]] in [[:en:Kazakh language|Kazakh]]<br />(code: <code>kk</code>)
| [[:km:User:PK2|User page]] in [[:en:Khmer language|Khmer]]<br />(code: <code>km</code>)
|-
| [[:kn:User:PK2|User page]] in [[:en:Kannada|Kannada]]<br />(code: <code>kn</code>)
| [[:knc:User:PK2|User page]] in [[:en:Central Kanuri|Central Kanuri]]<br />(code: <code>knc</code>)
| [[:ko:User:PK2|User page]] in [[:en:Korean language|Korean]]<br />(code: <code>ko</code>)
| [[:koi:User:PK2|User page]] in [[:en:Komi-Permyak language|Komi-Permyak]]<br />(code: <code>koi</code>)
| [[:krc:User:PK2|User page]] in [[:en:Karachay-Balkar|Karachay-Balkar]]<br />(code: <code>krc</code>)
| [[:ks:User:PK2|User page]] in [[:en:Kashmiri language|Kashmiri]]<br />(code: <code>ks</code>)
| [[:ksh:User:PK2|User page]] in [[:en:Ripuarian language|Ripuarian]]<br />(code: <code>ksh</code>)
| [[:ku:User:PK2|User page]] in [[:en:Kurdish language|Kurdish]] ([[:en:Kurmanji|Kurmanji]])<br />(code: <code>ku</code>)
| [[:kus:User:PK2|User page]] in [[:en:Kusaal language|Kusaal]]<br />(code: <code>kus</code>)
| [[:kv:User:PK2|User page]] in [[:en:Komi language|Komi]]<br />(code: <code>kv</code>)
| [[:kw:User:PK2|User page]] in [[:en:Cornish language|Cornish]]<br />(code: <code>kw</code>)
| [[:ky:User:PK2|User page]] in [[:en:Kyrgyz language|Kyrgyz]]<br />(code: <code>ky</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ L
|-
| [[:la:User:PK2|User page]] in [[:en:Latin|Latin]]<br />(code: <code>la</code>)
| [[:lad:User:PK2|User page]] in [[:en:Judaeo-Spanish|Judaeo-Spanish]]<br />(code: <code>lad</code>)
| [[:lb:User:PK2|User page]] in [[:en:Luxembourgish|Luxembourgish]]<br />(code: <code>lb</code>)
| [[:lbe:User:PK2|User page]] in [[:en:Lak language|Lak]]<br />(code: <code>lbe</code>)
| [[:lez:User:PK2|User page]] in [[:en:Lezgian language|Lezgian]]<br />(code: <code>lez</code>)
| [[:lfn:User:PK2|User page]] in [[:en:Lingua Franca Nova|Lingua Franca Nova]]<br />(code: <code>lfn</code>)
| [[:lg:User:PK2|User page]] in [[:en:Luganda|Luganda]]<br />(code: <code>lg</code>)
| [[:li:User:PK2|User page]] in [[:en:Limburgish|Limburgish]]<br />(code: <code>li</code>)
|-
| [[:lij:User:PK2|User page]] in [[:en:Ligurian language|Ligurian]]<br />(code: <code>lij</code>)
| [[:lld:User:PK2|User page]] in [[:en:Ladin language|Ladin]]<br />(code: <code>lld</code>)
| [[:lmo:User:PK2|User page]] in [[:en:Lombard language|Lombard]]<br />(code: <code>lmo</code>)
| [[:ln:User:PK2|User page]] in [[:en:Lingala|Lingala]]<br />(code: <code>ln</code>)
| [[:lo:User:PK2|User page]] in [[:en:Lao language|Lao]]<br />(code: <code>lo</code>)
| [[:lt:User:PK2|User page]] in [[:en:Lithuanian language|Lithuanian]]<br />(code: <code>lt</code>)
| [[:ltg:User:PK2|User page]] in [[:en:Latgalian language|Latgalian]]<br />(code: <code>ltg</code>)
| [[:lv:User:PK2|User page]] in [[:en:Latvian language|Latvian]]<br />(code: <code>lv</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ M
|-
| [[:mad:User:PK2|User page]] in [[:en:Madurese language|Madurese]]<br />(code: <code>mad</code>)
| [[:mai:User:PK2|User page]] in [[:en:Maithili language|Maithili]]<br />(code: <code>mai</code>)
| [[:map-bms:User:PK2|User page]] in [[:en:Javanese language|Javanese]] ([[:en:Banyumasan dialect|Banyumasan]])<br />(code: <code>map-bms</code>)
| [[:mdf:User:PK2|User page]] in [[:en:Moksha language|Moksha]]<br />(code: <code>mdf</code>)
| [[:mg:User:PK2|User page]] in [[:en:Malagasy language|Malagasy]]<br />(code: <code>mg</code>)
| [[:mhr:User:PK2|User page]] in [[:en:Meadow Mari language|Meadow Mari]]<br />(code: <code>mhr</code>)
| [[:mi:User:PK2|User page]] in [[:en:Māori language|Māori]]<br />(code: <code>mi</code>)
| [[:min:User:PK2|User page]] in [[:en:Minangkabau language|Minangkabau]]<br />(code: <code>min</code>)
| [[:mk:User:PK2|User page]] in [[:en:Macedonian language|Macedonian]]<br />(code: <code>mk</code>)
| [[:ml:User:PK2|User page]] in [[:en:Malayalam|Malayalam]]<br />(code: <code>ml</code>)
| [[:mn:User:PK2|User page]] in [[:en:Mongolian language|Mongolian]]<br />(code: <code>mn</code>)
|-
| [[:mni:User:PK2|User page]] in [[:en:Meitei language|Meitei]]<br />(code: <code>mni</code>)
| [[:mnw:User:PK2|User page]] in [[:en:Mon language|Mon]]<br />(code: <code>mnw</code>)
| [[:m:mos:User:PK2|User page]] in [[:en:Mooré|Mooré]]<br />(code: <code>mos</code>)
| [[:mr:User:PK2|User page]] in [[:en:Marathi language|Marathi]]<br />(code: <code>mr</code>)
| [[:mrj:User:PK2|User page]] in [[:en:Hill Mari language|Hill Mari]]<br />(code: <code>mrj</code>)
| [[:ms:User:PK2|User page]] in [[:en:Malay language|Malay]]<br />(code: <code>ms</code>)
| [[:mt:User:PK2|User page]] in [[:en:Maltese language|Maltese]]<br />(code: <code>mt</code>)
| [[:mwl:User:PK2|User page]] in [[:en:Mirandese language|Mirandese]]<br />(code: <code>mwl</code>)
| [[:my:User:PK2|User page]] in [[:en:Burmese language|Burmese]]<br />(code: <code>my</code>)
| [[:myv:User:PK2|User page]] in [[:en:Erzya language|Erzya]]<br />(code: <code>myv</code>)
| [[:mzn:User:PK2|User page]] in [[:en:Mazanderani language|Mazanderani]]<br />(code: <code>mzn</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ N
|-
| [[:nah:User:PK2|User page]] in [[:en:Nahuatl|Nahuatl]]<br />(code: <code>nah</code>)
| [[:nap:User:PK2|User page]] in [[:en:Neapolitan language|Neapolitan]]<br />(code: <code>nap</code>)
| [[:nds:User:PK2|User page]] in [[:en:Low German|Low German]]<br />(code: <code>nds</code>)
| [[:nds-nl:User:PK2|User page]] in [[:en:Dutch Low Saxon|Dutch Low Saxon]]<br />(code: <code>nds-nl</code>)
| [[:ne:User:PK2|User page]] in [[:en:Nepali language|Nepali]]<br />(code: <code>ne</code>)
| [[:new:User:PK2|User page]] in [[:en:Newar language|Newar]]<br />(code: <code>new</code>)
| [[:nia:User:PK2|User page]] in [[:en:Nias language|Nias]]<br />(code: <code>nia</code>)
| [[:nl:User:PK2|User page]] in [[:en:Dutch language|Dutch]]<br />(code: <code>nl</code>)
| [[:nn:User:PK2|User page]] in [[:en:Norwegian language|Norwegian]] ([[:en:Nynorsk|Nynorsk]])<br />(code: <code>nn</code>)
|-
| [[:no:User:PK2|User page]] in [[:en:Norwegian language|Norwegian]] ([[:en:Bokmål|Bokmål]])<br />(code: <code>no</code>)
| [[:nov:User:PK2|User page]] in [[:en:Novial|Novial]]<br />(code: <code>nov</code>)
| [[:nqo:User:PK2|User page]] in [[:en:N'Ko language|N'Ko]]<br />(code: <code>nqo</code>)
| [[:nr:User:PK2|User page]] in [[:en:Southern Ndebele language|Southern Ndebele]]<br />(code: <code>nr</code>)
| [[:nrm:User:PK2|User page]] in [[:en:Norman language|Norman]]<br />(code: <code>nrm</code>)
| [[:nso:User:PK2|User page]] in [[:en:Northern Sotho|Northern Sotho]]<br />(code: <code>nso</code>)
| [[:nup:User:PK2|User page]] in [[:en:Nupe language|Nupe]]<br />(code: <code>nup</code>)
| [[:nv:User:PK2|User page]] in [[:en:Navajo language|Navajo]]<br />(code: <code>nv</code>)
| [[:ny:User:PK2|User page]] in [[:en:Chewa language|Chewa]]<br />(code: <code>ny</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ O
|-
| [[:oc:User:PK2|User page]] in [[:en:Occitan language|Occitan]]<br />(code: <code>oc</code>)
| [[:olo:User:PK2|User page]] in [[:en:Livvi-Karelian language|Livvi-Karelian]]<br />(code: <code>olo</code>)
| [[:om:User:PK2|User page]] in [[:en:Oromo language|Oromo]]<br />(code: <code>om</code>)
| [[:or:User:PK2|User page]] in [[:en:Odia language|Odia]]<br />(code: <code>or</code>)
| [[:os:User:PK2|User page]] in [[:en:Ossetian language|Ossetian]]<br />(code: <code>os</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ P
|-
| [[:pa:User:PK2|User page]] in [[:en:Punjabi language|Punjabi]]<br />(code: <code>pa</code>)
| [[:pag:User:PK2|User page]] in [[:en:Pangasinan language|Pangasinan]]<br />(code: <code>pag</code>)
| [[:pam:User:PK2|User page]] in [[:en:Kapampangan language|Kapampangan]]<br />(code: <code>pam</code>)
| [[:pap:User:PK2|User page]] in [[:en:Papiamento|Papiamento]]<br />(code: <code>pap</code>)
| [[:pcd:User:PK2|User page]] in [[:en:Picard language|Picard]]<br />(code: <code>pcd</code>)
| [[:pcm:User:PK2|User page]] in [[:en:Nigerian Pidgin|Nigerian Pidgin]]<br />(code: <code>pcm</code>)
| [[:pdc:User:PK2|User page]] in [[:en:Pennsylvania Dutch language|Pennsylvania Dutch]]<br />(code: <code>pdc</code>)
| [[:pfl:User:PK2|User page]] in [[:en:Palatine German dialects|Palatine German]]<br />(code: <code>pfl</code>)
| [[:pi:User:PK2|User page]] in [[:en:Pali|Pali]]<br />(code: <code>pi</code>)
|-
| [[:pl:User:PK2|User page]] in [[:en:Polish language|Polish]]<br />(code: <code>pl</code>)
| [[:pms:User:PK2|User page]] in [[:en:Piedmontese language|Piedmontese]]<br />(code: <code>pms</code>)
| [[:pnb:User:PK2|User page]] in [[:en:Punjabi language|Punjabi]] (Western Punjabi)<br />(code: <code>pnb</code>)
| [[:pnt:User:PK2|User page]] in [[:en:Pontic Greek|Pontic Greek]]<br />(code: <code>pnt</code>)
| [[:ppl:User:PK2|User page]] in [[:en:Nawat language|Nawat]]<br />(code: <code>ppl</code>)
| [[:ps:User:PK2|User page]] in [[:en:Pashto|Pashto]]<br />(code: <code>ps</code>)
| [[:pt:User:PK2|User page]] in [[:en:Portuguese language|Portuguese]]<br />(code: <code>pt</code>)
| [[:pwn:User:PK2|User page]] in [[:en:Paiwan language|Paiwan]]<br />(code: <code>pwn</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ Q
|-
| [[:qu:User:PK2|User page]] in [[:en:Quechuan languages|Quechua]] ([[:en:Southern Quechua|Southern Quechua]])<br />(code: <code>qu</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ R
|-
| [[:rki:User:PK2|User page]] in [[:en:Rakhine language|Rakhine]]<br />(code: <code>rki</code>)
| [[:rm:User:PK2|User page]] in [[:en:Romansh language|Romansh]]<br />(code: <code>rm</code>)
| [[:rmy:User:PK2|User page]] in [[:en:Romani language|Romani]] ([[:en:Vlax Romani language|Vlax Romani]])<br />(code: <code>rmy</code>)
| [[:rn:User:PK2|User page]] in [[:en:Kirundi|Kirundi]]<br />(code: <code>rn</code>)
| [[:ro:User:PK2|User page]] in [[:en:Romanian language|Romanian]]<br />(code: <code>ro</code>)
| [[:roa-rup:User:PK2|User page]] in [[:en:Aromanian language|Aromanian]]<br />(code: <code>roa-rup</code>)
| [[:roa-tara:User:PK2|User page]] in [[:en:Neapolitan language|Neapolitan]] ([[:en:Tarantino dialect|Tarantino]])<br />(code: <code>roa-tara</code>)
| [[:rsk:User:PK2|User page]] in [[:en:Pannonian Rusyn|Pannonian Rusyn]]<br />(code: <code>rsk</code>)
| [[:ru:User:PK2|User page]] in [[:en:Russian language|Russian]]<br />(code: <code>ru</code>)
| [[:rue:User:PK2|User page]] in [[:en:Rusyn language|Rusyn]]<br />(code: <code>rue</code>)
| [[:rw:User:PK2|User page]] in [[:en:Kinyarwanda|Kinyarwanda]]<br />(code: <code>rw</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ S
|-
| [[:sa:User:PK2|User page]] in [[:en:Sanskrit|Sanskrit]]<br />(code: <code>sa</code>)
| [[:sah:User:PK2|User page]] in [[:en:Yakut language|Yakut]]<br />(code: <code>sah</code>)
| [[:sat:User:PK2|User page]] in [[:en:Santali language|Santali]]<br />(code: <code>sat</code>)
| [[:sc:User:PK2|User page]] in [[:en:Sardinian language|Sardinian]]<br />(code: <code>sc</code>)
| [[:scn:User:PK2|User page]] in [[:en:Sicilian language|Sicilian]]<br />(code: <code>scn</code>)
| [[:sco:User:PK2|User page]] in [[:en:Scots language|Scots]]<br />(code: <code>sco</code>)
| [[:sd:User:PK2|User page]] in [[:en:Sindhi language|Sindhi]]<br />(code: <code>sd</code>)
| [[:se:User:PK2|User page]] in [[:en:Northern Sámi|Northern Sámi]]<br />(code: <code>se</code>)
| [[:sg:User:PK2|User page]] in [[:en:Sango language|Sango]]<br />(code: <code>sg</code>)
| [[:sh:User:PK2|User page]] in [[:en:Serbo-Croatian|Serbo-Croatian]]<br />(code: <code>sh</code>)
| [[:shi:User:PK2|User page]] in [[:en:Shilha language|Shilha]]<br />(code: <code>shi</code>)
|-
| [[:shn:User:PK2|User page]] in [[:en:Shan language|Shan]]<br />(code: <code>shn</code>)
| [[:si:User:PK2|User page]] in [[:en:Sinhala language|Sinhala]]<br />(code: <code>si</code>)
| [[:simple:User:PK2|User page]] in [[:en:Basic English|Basic English]]<br />(code: <code>simple</code>)
| [[:sk:User:PK2|User page]] in [[:en:Slovak language|Slovak]]<br />(code: <code>sk</code>)
| [[:skr:User:PK2|User page]] in [[:en:Saraiki language|Saraiki]]<br />(code: <code>skr</code>)
| [[:sl:User:PK2|User page]] in [[:en:Slovene language|Slovene]]<br />(code: <code>sl</code>)
| [[:sm:User:PK2|User page]] in [[:en:Samoan language|Samoan]]<br />(code: <code>sm</code>)
| [[:smn:User:PK2|User page]] in [[:en:Inari Sámi language|Inari Sámi]]<br />(code: <code>smn</code>)
| [[:sn:User:PK2|User page]] in [[:en:Shona language|Shona]]<br />(code: <code>sn</code>)
| [[:so:User:PK2|User page]] in [[:en:Somali language|Somali]]<br />(code: <code>so</code>)
| [[:sq:User:PK2|User page]] in [[:en:Albanian language|Albanian]]<br />(code: <code>sq</code>)
|-
| [[:sr:User:PK2|User page]] in [[:en:Serbian language|Serbian]]<br />(code: <code>sr</code>)
| [[:srn:User:PK2|User page]] in [[:en:Sranan Tongo|Sranan Tongo]]<br />(code: <code>srn</code>)
| [[:ss:User:PK2|User page]] in [[:en:Swazi language|Swazi]]<br />(code: <code>ss</code>)
| [[:st:User:PK2|User page]] in [[:en:Sotho language|Sotho]]<br />(code: <code>st</code>)
| [[:stq:User:PK2|User page]] in [[:en:Saterland Frisian language|Saterland Frisian]]<br />(code: <code>stq</code>)
| [[:su:User:PK2|User page]] in [[:en:Sundanese language|Sundanese]]<br />(code: <code>su</code>)
| [[:sv:User:PK2|User page]] in [[:en:Swedish language|Swedish]]<br />(code: <code>sv</code>)
| [[:sw:User:PK2|User page]] in [[:en:Swahili language|Swahili]]<br />(code: <code>sw</code>)
| [[:syl:User:PK2|User page]] in [[:en:Sylheti language|Sylheti]]<br />(code: <code>syl</code>)
| [[:szl:User:PK2|User page]] in [[:en:Silesian language|Silesian]]<br />(code: <code>szl</code>)
| [[:szy:User:PK2|User page]] in [[:en:Sakizaya language|Sakizaya]]<br />(code: <code>szy</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ T
|-
| [[:ta:User:PK2|User page]] in [[:en:Tamil language|Tamil]]<br />(code: <code>ta</code>)
| [[:tay:User:PK2|User page]] in [[:en:Atayal language|Atayal]]<br />(code: <code>tay</code>)
| [[:tcy:User:PK2|User page]] in [[:en:Tulu language|Tulu]]<br />(code: <code>tcy</code>)
| [[:tdd:User:PK2|User page]] in [[:en:Tai Nuea language|Tai Nuea]]<br />(code: <code>tdd</code>)
| [[:te:User:PK2|User page]] in [[:en:Telugu language|Telugu]]<br />(code: <code>te</code>)
| [[:tet:User:PK2|User page]] in [[:en:Tetum language|Tetum]]<br />(code: <code>tet</code>)
| [[:tg:User:PK2|User page]] in [[:en:Tajik language|Tajik]]<br />(code: <code>tg</code>)
| [[:th:User:PK2|User page]] in [[:en:Thai language|Thai]]<br />(code: <code>th</code>)
| [[:ti:User:PK2|User page]] in [[:en:Tigrinya language|Tigrinya]]<br />(code: <code>ti</code>)
| [[:tig:User:PK2|User page]] in [[:en:Tigre language|Tigre]]<br />(code: <code>tig</code>)
| [[:tk:User:PK2|User page]] in [[:en:Turkmen language|Turkmen]]<br />(code: <code>tk</code>)
| [[:tl:User:PK2|User page]] in [[:en:Tagalog language|Tagalog]]<br />(code: <code>tl</code>)
| [[:tly:User:PK2|User page]] in [[:en:Talysh language|Talysh]]<br />(code: <code>tly</code>)
|-
| [[:tn:User:PK2|User page]] in [[:en:Tswana language|Tswana]]<br />(code: <code>tn</code>)
| [[:to:User:PK2|User page]] in [[:en:Tongan language|Tongan]]<br />(code: <code>to</code>)
| [[:tok:User:PK2|User page]] in [[:en:Toki Pona|Toki Pona]]<br />(code: <code>tok</code>)
| [[:tpi:User:PK2|User page]] in [[:en:Tok Pisin|Tok Pisin]]<br />(code: <code>tpi</code>)
| [[:tr:User:PK2|User page]] in [[:en:Turkish language|Turkish]]<br />(code: <code>tr</code>)
| [[:trv:User:PK2|User page]] in [[:en:Seediq language|Seediq]]<br />(code: <code>trv</code>)
| [[:ts:User:PK2|User page]] in [[:en:Tsonga language|Tsonga]]<br />(code: <code>ts</code>)
| [[:tt:User:PK2|User page]] in [[:en:Tatar language|Tatar]]<br />(code: <code>tt</code>)
| [[:tum:User:PK2|User page]] in [[:en:Tumbuka language|Tumbuka]]<br />(code: <code>tum</code>)
| [[:tw:User:PK2|User page]] in [[:en:Akan language|Akan]] (Twi)<br />(code: <code>tw</code>)
| [[:ty:User:PK2|User page]] in [[:en:Tahitian language|Tahitian]]<br />(code: <code>ty</code>)
| [[:tyv:User:PK2|User page]] in [[:en:Tuvan language|Tuvan]]<br />(code: <code>tyv</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ U
|-
| [[:udm:User:PK2|User page]] in [[:en:Udmurt language|Udmurt]]<br />(code: <code>udm</code>)
| [[:ug:User:PK2|User page]] in [[:en:Uyghur language|Uyghur]]<br />(code: <code>ug</code>)
| [[:uk:User:PK2|User page]] in [[:en:Ukrainian language|Ukrainian]]<br />(code: <code>uk</code>)
| [[:ur:User:PK2|User page]] in [[:en:Urdu|Urdu]]<br />(code: <code>ur</code>)
| [[:uz:User:PK2|User page]] in [[:en:Uzbek language|Uzbek]]<br />(code: <code>uz</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ V
|-
| [[:ve:User:PK2|User page]] in [[:en:Venda language|Venda]]<br />(code: <code>ve</code>)
| [[:vec:User:PK2|User page]] in [[:en:Venetian language|Venetian]]<br />(code: <code>vec</code>)
| [[:vep:User:PK2|User page]] in [[:en:Veps language|Veps]]<br />(code: <code>vep</code>)
| [[:vi:User:PK2|User page]] in [[:en:Vietnamese language|Vietnamese]]<br />(code: <code>vi</code>)
| [[:vls:User:PK2|User page]] in [[:en:West Flemish|West Flemish]]<br />(code: <code>vls</code>)
| [[:vo:User:PK2|User page]] in [[:en:Volapük|Volapük]]<br />(code: <code>vo</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ W
|-
| [[:wa:User:PK2|User page]] in [[:en:Walloon language|Walloon]]<br />(code: <code>wa</code>)
| [[:war:User:PK2|User page]] in [[:en:Waray language|Waray]]<br />(code: <code>war</code>)
| [[:wo:User:PK2|User page]] in [[:en:Wolof language|Wolof]]<br />(code: <code>wo</code>)
| [[:wuu:User:PK2|User page]] in [[:en:Wu Chinese|Wu Chinese]]<br />(code: <code>wuu</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ X
|-
| [[:xal:User:PK2|User page]] in [[:en:Oirat language|Oirat]] ([[:en:Kalmyk Oirat|Kalmyk Oirat]])<br />(code: <code>xal</code>)
| [[:xh:User:PK2|User page]] in [[:en:Xhosa language|Xhosa]]<br />(code: <code>xh</code>)
| [[:xmf:User:PK2|User page]] in [[:en:Mingrelian language|Mingrelian]]<br />(code: <code>xmf</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ Y
|-
| [[:yi:User:PK2|User page]] in [[:en:Yiddish|Yiddish]]<br />(code: <code>yi</code>)
| [[:yo:User:PK2|User page]] in [[:en:Yoruba language|Yoruba]]<br />(code: <code>yo</code>)
|}
{| class="wikitable" style="text-align: center; font-size:85%"
|+ Z
|-
| [[:za:User:PK2|User page]] in [[:en:Zhuang languages|Zhuang]] ([[:en:Standard Zhuang|Standard Zhuang]])<br />(code: <code>za</code>)
| [[:zea:User:PK2|User page]] in [[:en:Zeelandic|Zeelandic]]<br />(code: <code>zea</code>)
| [[:zgh:User:PK2|User page]] in [[:en:Standard Moroccan Amazigh|Standard Moroccan Amazigh]]<br />(code: <code>zgh</code>)
| [[:zh:User:PK2|User page]] in [[:en:Chinese language|Chinese]] ([[:en:Mandarin Chinese|Mandarin Chinese]])<br />(code: <code>zh</code>)
| [[:zh-classical:User:PK2|User page]] in [[:en:Classical Chinese|Classical Chinese]]<br />(code: <code>zh-classical</code>)
| [[:zh-min-nan:User:PK2|User page]] in [[:en:Southern Min|Southern Min]]<br />(code: <code>zh-min-nan</code>)
| [[:zh-yue:User:PK2|User page]] in [[:en:Cantonese|Cantonese]]<br />(code: <code>zh-yue</code>)
| [[:zu:User:PK2|User page]] in [[:en:Zulu language|Zulu]]<br />(code: <code>zu</code>)
|}
dud3tixug1qffje4pl8q76cccmmhg8l
MediaWiki:Gadget-DiscussionArchiver.js
8
33662
158114
158113
2026-05-20T15:09:36Z
Rachmat04
7338
158114
javascript
text/javascript
/**
* [DISCUSSIONARCHIVER.JS — GADGET PENGARSIP DISKUSI — WIKIPEDIA ACEH]
*
* •==============================================•
* > Tipe: JavaScript (MediaWiki Gadget)
* > Target: Halaman spesifik: Wikipedia:Meusapat
* > Fungsi: Mengarsipkan utas diskusi yang komentar
* terakhirnya sudah >= 2 bulan dari sekarang
* atau utas yang memiliki templat {{section resolved}} / {{Section resolved}}
* > Hak: Hanya sysop
* > Halaman arsip ditentukan berdasarkan tahun timestamp
* terbaru utas (bukan tahun saat tombol ditekan).
* •==============================================•
*/
// <nowiki>
(function () {
const cfg = mw.config.get();
const api = new mw.Api();
const page = cfg.wgPageName;
const groups = cfg.wgUserGroups || [];
const isSysop = groups.includes('sysop');
if (!isSysop) return;
const pageReadable = page.replace(/_/g, ' ');
if (pageReadable !== 'Wikipedia:Meusapat') return;
if (
cfg.wgAction === 'history' ||
cfg.wgDiffNewId ||
cfg.wgDiffOldId ||
cfg.wgCurRevisionId !== cfg.wgRevisionId
) return;
// ── CSS (Codex Wikimedia design tokens) ─────────────────────────────
mw.util.addCSS(`
/*
* Semua nilai mengacu pada Codex design tokens (WikimediaUI theme).
* Referensi: https://doc.wikimedia.org/codex/latest/design-tokens/
*
* Token warna mode-aware (light/dark) sudah tersedia via
* mediawiki.skin.variables.less di konteks MediaWiki.
* Di sini kita definisikan fallback eksplisit agar gadget
* tetap berjalan di luar konteks skin (mis. preview/debug).
*/
/* ── Light mode (default) ── */
.da-overlay,
.da-dialog {
/* Color – background */
--da-bg-base: var(--background-color-base, #ffffff);
--da-bg-subtle: var(--background-color-neutral, #f8f9fa);
--da-bg-hover: var(--background-color-neutral-subtle, #eaecf0);
--da-bg-interactive: var(--background-color-interactive, #f8f9fa);
/* Color – text */
--da-text-base: var(--color-base, #202122);
--da-text-subtle: var(--color-subtle, #54595d);
--da-text-placeholder: var(--color-placeholder, #72777d);
/* Color – border */
--da-border-base: var(--border-color-base, #a2a9b1);
--da-border-subtle: var(--border-color-subtle, #c8ccd1);
--da-border-muted: var(--border-color-muted, #eaecf0);
/* Color – progressive (link/action) */
--da-progressive: var(--color-progressive, #3366cc);
--da-progressive-bg: var(--background-color-progressive-subtle, #eaf3ff);
/* Color – destructive */
--da-destructive: var(--color-destructive, #d33);
--da-destructive-bg: var(--background-color-destructive-subtle, #fee7e6);
/* Color – notice (badge) */
--da-notice-bg: var(--background-color-warning-subtle, #fef6e7);
--da-notice-text: var(--color-warning, #ac6600);
/* Box shadow (Codex elevation token) */
--da-shadow: var(--box-shadow-drop-medium, 0 2px 2px 0 rgba(0,0,0,.2));
--da-shadow-dialog: 0 4px 20px rgba(0, 0, 0, 0.25);
/* Border radius (Codex token) */
--da-radius-base: var(--border-radius-base, 2px);
--da-radius-sharp: var(--border-radius-sharp, 0px);
--da-radius-pill: var(--border-radius-pill, 9999px);
/* Spacing (Codex spacing scale: 4px unit) */
--da-space-25: var(--spacing-25, 2px);
--da-space-50: var(--spacing-50, 4px);
--da-space-75: var(--spacing-75, 6px);
--da-space-100: var(--spacing-100, 8px);
--da-space-125: var(--spacing-125, 10px);
--da-space-150: var(--spacing-150, 12px);
--da-space-200: var(--spacing-200, 16px);
/* Typography (Codex) */
--da-font-family: var(--font-family-base,
'Linux Libertine', 'Georgia', 'Times', 'Source Serif Pro', serif);
--da-font-family-ui: var(--font-family-system-sans,
-apple-system, 'BlinkMacSystemFont', 'Segoe UI', 'Roboto', 'Lato',
'Helvetica Neue', 'Helvetica', 'Arial', sans-serif);
--da-font-size-base: var(--font-size-medium, 1em);
--da-font-size-small: var(--font-size-small, .875em);
--da-font-size-xsmall: var(--font-size-x-small, .8125em);
--da-line-height: var(--line-height-medium, 1.6);
/* Transition (Codex motion token) */
--da-transition: var(--transition-duration-base, 100ms)
var(--transition-timing-function-user, ease);
}
/* ── Dark mode override ── */
@media (prefers-color-scheme: dark) {
.da-overlay,
.da-dialog {
--da-bg-base: #1e1e1e;
--da-bg-subtle: #27292d;
--da-bg-hover: #303236;
--da-bg-interactive: #27292d;
--da-text-base: #eaecf0;
--da-text-subtle: #a2a9b1;
--da-text-placeholder: #72777d;
--da-border-base: #54595d;
--da-border-subtle: #3d3d3d;
--da-border-muted: #2e2e2e;
--da-progressive: #6699ff;
--da-progressive-bg: #1a2740;
--da-destructive: #ff6e6e;
--da-destructive-bg: #3d1a1a;
--da-notice-bg: #3d2e00;
--da-notice-text: #f0a500;
--da-shadow-dialog: 0 4px 20px rgba(0, 0, 0, 0.6);
}
}
/* ════════════════════════════════════════════════
Overlay
════════════════════════════════════════════════ */
.da-overlay {
position: fixed;
inset: 0;
background: rgba(0, 0, 0, 0.5);
z-index: 100000;
display: flex;
align-items: center;
justify-content: center;
padding: var(--da-space-150);
animation: da-fadein .15s ease-out;
}
/* ════════════════════════════════════════════════
Dialog — selaras cdx-dialog
Referensi: https://doc.wikimedia.org/codex/latest/components/demos/dialog.html
════════════════════════════════════════════════ */
.da-dialog {
background: var(--da-bg-base);
color: var(--da-text-base);
border: 1px solid var(--da-border-base);
border-radius: var(--da-radius-base);
width: min(640px, 96%);
max-height: 88vh;
overflow: auto;
box-shadow: var(--da-shadow-dialog);
font-family: var(--da-font-family-ui);
font-size: var(--da-font-size-base);
line-height: var(--da-line-height);
animation: da-slidein .15s ease-out;
}
/* ── Header ── */
.da-dialog-header {
padding: var(--da-space-150) var(--da-space-200);
border-bottom: 1px solid var(--da-border-muted);
background: var(--da-bg-subtle);
color: var(--da-text-base);
font-weight: bold;
font-size: 1em;
display: flex;
align-items: center;
gap: var(--da-space-100);
/* Codex uses a 4px left accent on dialogs for progressive actions */
border-left: 4px solid var(--da-progressive);
}
/* ── Body ── */
.da-dialog-body {
padding: var(--da-space-150) var(--da-space-200);
font-size: var(--da-font-size-base);
color: var(--da-text-base);
}
/* ── Footer ── */
.da-dialog-footer {
padding: var(--da-space-125) var(--da-space-200);
border-top: 1px solid var(--da-border-muted);
background: var(--da-bg-subtle);
display: flex;
justify-content: flex-end;
gap: var(--da-space-100);
flex-wrap: wrap;
}
/* ════════════════════════════════════════════════
Buttons — selaras cdx-button
Referensi: https://doc.wikimedia.org/codex/latest/components/demos/button.html
════════════════════════════════════════════════ */
.da-btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: var(--da-space-75);
padding: var(--da-space-75) var(--da-space-150);
border-radius: var(--da-radius-base);
border: 1px solid transparent;
font-family: var(--da-font-family-ui);
font-size: var(--da-font-size-base);
font-weight: bold;
line-height: 1.6;
cursor: pointer;
transition: background var(--da-transition),
color var(--da-transition),
border-color var(--da-transition);
white-space: nowrap;
text-decoration: none;
min-height: 32px;
}
.da-btn:focus-visible {
outline: 2px solid var(--da-progressive);
outline-offset: 2px;
}
/* Normal (tertiary) */
.da-btn--normal {
background: var(--da-bg-interactive);
color: var(--da-text-base);
border-color: var(--da-border-base);
}
.da-btn--normal:hover {
background: var(--da-bg-hover);
border-color: var(--da-border-base);
}
.da-btn--normal:active {
background: #c8ccd1;
}
/* Progressive (primary action) */
.da-btn--progressive {
background: var(--da-progressive);
color: #fff;
border-color: var(--da-progressive);
}
.da-btn--progressive:hover {
background: #2a4b8d;
border-color: #2a4b8d;
}
.da-btn--progressive:active {
background: #1e3a6e;
}
/* Destructive */
.da-btn--destructive {
background: transparent;
color: var(--da-destructive);
border-color: var(--da-destructive);
}
.da-btn--destructive:hover {
background: var(--da-destructive-bg);
}
/* Quiet (ghost) */
.da-btn--quiet {
background: transparent;
color: var(--da-progressive);
border-color: transparent;
}
.da-btn--quiet:hover {
background: var(--da-progressive-bg);
}
/* ════════════════════════════════════════════════
Thread list
════════════════════════════════════════════════ */
.da-thread-list {
list-style: none;
margin: var(--da-space-100) 0;
padding: 0;
max-height: 320px;
overflow-y: auto;
border: 1px solid var(--da-border-subtle);
border-radius: var(--da-radius-base);
background: var(--da-bg-base);
}
.da-thread-item {
display: flex;
align-items: flex-start;
gap: var(--da-space-100);
padding: var(--da-space-100) var(--da-space-150);
border-bottom: 1px solid var(--da-border-muted);
cursor: pointer;
transition: background var(--da-transition);
}
.da-thread-item:last-child { border-bottom: none; }
.da-thread-item:hover { background: var(--da-bg-hover); }
/* Checkbox — selaras cdx-checkbox */
.da-thread-item input[type="checkbox"] {
margin-top: 3px;
flex-shrink: 0;
cursor: pointer;
accent-color: var(--da-progressive);
width: 20px;
height: 20px;
}
.da-thread-title {
font-weight: bold;
font-size: var(--da-font-size-base);
color: var(--da-text-base);
}
.da-thread-meta {
font-size: var(--da-font-size-small);
color: var(--da-text-placeholder);
margin-top: var(--da-space-25);
}
/* ── Badge (Codex: cdx-info-chip style) ── */
.da-badge {
display: inline-flex;
align-items: center;
background: var(--da-notice-bg);
color: var(--da-notice-text);
border: 1px solid currentColor;
border-radius: var(--da-radius-pill);
padding: 0 var(--da-space-75);
font-size: var(--da-font-size-xsmall);
font-weight: bold;
margin-left: var(--da-space-75);
line-height: 1.5;
vertical-align: middle;
}
/* ── Archive target link ── */
.da-archive-target {
font-size: var(--da-font-size-small);
color: var(--da-progressive);
word-break: break-all;
margin-top: var(--da-space-25);
}
/* ── Select-all row ── */
.da-select-all-row {
display: flex;
align-items: center;
gap: var(--da-space-100);
padding: var(--da-space-75) var(--da-space-150);
background: var(--da-bg-subtle);
border-bottom: 1px solid var(--da-border-muted);
font-size: var(--da-font-size-small);
color: var(--da-text-subtle);
}
/* ════════════════════════════════════════════════
Confirm box — selaras cdx-message (notice)
════════════════════════════════════════════════ */
.da-confirm-box {
background: var(--da-bg-subtle);
border: 1px solid var(--da-border-subtle);
/* Codex cdx-message uses left accent border */
border-left: 4px solid var(--da-progressive);
border-radius: var(--da-radius-base);
padding: var(--da-space-125) var(--da-space-150);
margin-bottom: var(--da-space-100);
}
.da-confirm-box strong {
display: block;
margin-bottom: var(--da-space-50);
color: var(--da-text-base);
font-size: var(--da-font-size-base);
}
.da-confirm-meta {
font-size: var(--da-font-size-small);
color: var(--da-text-subtle);
margin: var(--da-space-50) 0 var(--da-space-100);
}
/* ── Progress / status ── */
.da-progress {
font-size: var(--da-font-size-small);
color: var(--da-text-subtle);
margin-top: var(--da-space-100);
min-height: 1.4em;
padding: var(--da-space-100);
background: var(--da-bg-subtle);
border: 1px solid var(--da-border-muted);
border-radius: var(--da-radius-base);
}
/* ── Empty state ── */
.da-empty {
text-align: center;
padding: var(--da-space-200) 0;
color: var(--da-text-placeholder);
font-size: var(--da-font-size-base);
}
/* ── Helper text under confirm ── */
.da-helper-text {
font-size: var(--da-font-size-small);
color: var(--da-text-subtle);
margin: var(--da-space-75) 0 0;
}
/* ════════════════════════════════════════════════
Floating button
════════════════════════════════════════════════ */
#da-float-btn {
position: fixed;
bottom: 130px;
right: 25px;
background: var(--da-progressive, #3366cc);
color: #fff;
border: none;
padding: var(--da-space-100) var(--da-space-150);
border-radius: var(--da-radius-base);
cursor: pointer;
z-index: 99999;
font-family: var(--da-font-family-ui);
font-weight: bold;
font-size: var(--da-font-size-small);
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.22);
transition: background var(--da-transition);
line-height: 1.6;
}
#da-float-btn:hover { background: #2a4b8d; }
#da-float-btn:active { background: #1e3a6e; }
#da-float-btn:focus-visible {
outline: 2px solid var(--da-progressive, #3366cc);
outline-offset: 2px;
}
/* ════════════════════════════════════════════════
Animations (minimal — Codex motion principle)
════════════════════════════════════════════════ */
@keyframes da-fadein {
from { opacity: 0; }
to { opacity: 1; }
}
@keyframes da-slidein {
from { opacity: 0; transform: translateY(-6px); }
to { opacity: 1; transform: translateY(0); }
}
`);
// ── Nama bulan bahasa Aceh ────────────────────────────────────────────
const BULAN_ACEH = {
'Buleuen Sa': 0,
'Buleuen Duwa': 1,
'Buleuen Lhèe': 2,
'Buleuen Peuet': 3,
'Buleuen Limöng': 4,
'Buleuen Nam': 5,
'Buleuen Tujôh': 6,
'Buleuen Lapan': 7,
'Buleuen Sikureueng': 8,
'Buleuen Siplôh': 9,
'Buleuen Siblaih': 10,
'Buleuen Duwa Blah': 11
};
const BULAN_ACEH_ARR = Object.keys(BULAN_ACEH);
function hasSectionResolvedTemplate(text) {
if (!text) return false;
return /\{\{\s*[Ss]ection\s+resolved\b[\s\S]*?\}\}/.test(text);
}
function getLatestTimestamp(text) {
const pattern = /(\d{1,2})\s+(Buleuen Sa|Buleuen Duwa|Buleuen Lhèe|Buleuen Peuet|Buleuen Limöng|Buleuen Nam|Buleuen Tujôh|Buleuen Lapan|Buleuen Sikureueng|Buleuen Siplôh|Buleuen Siblaih|Buleuen Duwa Blah)\s+(\d{4})\s+(?:pukul\s+)?(\d{1,2})[.:](\d{2})\s+\(WIB\)/g;
let latest = null, m;
while ((m = pattern.exec(text)) !== null) {
const hourUTC = parseInt(m[4], 10) - 7;
const d = new Date(Date.UTC(
parseInt(m[3], 10),
BULAN_ACEH[m[2]],
parseInt(m[1], 10),
hourUTC,
parseInt(m[5], 10)
));
if (!latest || d > latest) latest = d;
}
return latest;
}
function formatTanggalAceh(d) {
if (!d) return '';
const dWIB = new Date(d.getTime() + 7 * 60 * 60 * 1000);
const day = String(dWIB.getUTCDate()).padStart(2, '0');
return `${day} ${BULAN_ACEH_ARR[dWIB.getUTCMonth()]} ${dWIB.getUTCFullYear()} (WIB)`;
}
function selisihBulan(dari, ke) {
return (ke.getFullYear() - dari.getFullYear()) * 12
+ (ke.getMonth() - dari.getMonth());
}
function getArchiveTitleForThread(thread) {
const ts = getLatestTimestamp(thread.content);
const year = ts ? ts.getUTCFullYear() : new Date().getFullYear();
return `${page.replace(/_/g, ' ')}/Keuneubah ${year}`;
}
function notify(msg, type = 'info') {
mw.notify ? mw.notify(msg, { type }) : console.log('[DiscussionArchiver:Aceh]', msg);
}
// ── Dialog factory ────────────────────────────────────────────────────
function createDialog(titleHtml, bodyHtml) {
const overlay = document.createElement('div');
overlay.className = 'da-overlay';
const dialog = document.createElement('div');
dialog.className = 'da-dialog';
dialog.setAttribute('role', 'dialog');
dialog.setAttribute('aria-modal', 'true');
dialog.innerHTML = `
<div class="da-dialog-header">📦 ${titleHtml}</div>
<div class="da-dialog-body">${bodyHtml}</div>
<div class="da-dialog-footer"></div>
`;
overlay.appendChild(dialog);
// Tutup saat klik di luar dialog
overlay.addEventListener('click', e => { if (e.target === overlay) overlay.remove(); });
// Tutup saat tekan Escape
const onKeydown = e => { if (e.key === 'Escape') { overlay.remove(); document.removeEventListener('keydown', onKeydown); } };
document.addEventListener('keydown', onKeydown);
document.body.appendChild(overlay);
return {
overlay,
dialog,
body: dialog.querySelector('.da-dialog-body'),
footer: dialog.querySelector('.da-dialog-footer')
};
}
/**
* Tambah tombol ke footer dialog.
* variant: 'progressive' | 'destructive' | 'quiet' | 'normal'
*/
function addBtn(footer, label, variant, onClick) {
const btn = document.createElement('button');
btn.className = `da-btn da-btn--${variant}`;
btn.textContent = label;
btn.addEventListener('click', onClick);
footer.appendChild(btn);
return btn;
}
// ── Parsing utas level-2 ──────────────────────────────────────────────
function parseThreads(wikitext) {
const headerRe = /^==\s*([^=\n][^\n]*?)\s*==\s*$/gm;
const positions = [];
let m;
while ((m = headerRe.exec(wikitext)) !== null) {
positions.push({ title: m[1].trim(), start: m.index });
}
positions.push({ title: null, start: wikitext.length });
const threads = [];
for (let i = 0; i < positions.length - 1; i++) {
threads.push({
title: positions[i].title,
content: wikitext.substring(positions[i].start, positions[i + 1].start),
start: positions[i].start,
end: positions[i + 1].start
});
}
return threads;
}
// ── Konfirmasi per utas ───────────────────────────────────────────────
function confirmPerThread(threads) {
return new Promise(resolve => {
const approved = [];
let idx = 0;
function showNext() {
if (idx >= threads.length) { resolve(approved); return; }
const t = threads[idx];
const ts = getLatestTimestamp(t.content);
const resolved = hasSectionResolvedTemplate(t.content);
const usia = ts ? selisihBulan(ts, new Date()) : (resolved ? 'resolved' : '?');
const tsTxt = ts ? formatTanggalAceh(ts) : (resolved ? 'Terdeteksi: {{section resolved}}' : 'Tidak terdeteksi');
const tgtTitle = getArchiveTitleForThread(t);
const { overlay, footer } = createDialog(
`Konfirmasi Arsip Utas (${idx + 1}/${threads.length})`,
`<div class="da-confirm-box">
<strong>📄 ${mw.html.escape(t.title)}</strong>
<div class="da-confirm-meta">
Komentar terakhir: <b>${tsTxt}</b>
<span class="da-badge">~${usia} bulan lalu</span>
</div>
<div class="da-archive-target">→ Akan diarsipkan ke: <b>${mw.html.escape(tgtTitle)}</b></div>
</div>
<p class="da-helper-text">
Klik <b>Lewati</b> untuk melewati utas ini tanpa mengarsipkan.
</p>`
);
addBtn(footer, 'Lewati', 'normal', () => { overlay.remove(); idx++; showNext(); });
addBtn(footer, 'Arsipkan', 'progressive', () => { approved.push(t); overlay.remove(); idx++; showNext(); });
}
showNext();
});
}
// ── Proses pengarsipan ────────────────────────────────────────────────
async function doArchive(threadsToArchive) {
const res = await api.get({
action: 'query', prop: 'revisions',
rvprop: ['content', 'timestamp'],
titles: page, formatversion: 2
});
const pageData = res.query.pages[0];
let text = pageData.revisions[0].content;
const baseTimestamp = pageData.revisions[0].timestamp;
for (const t of threadsToArchive) {
const escaped = t.content.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
text = text.replace(new RegExp(escaped), '');
}
text = text.replace(/\n{3,}/g, '\n\n').trim();
// Kelompokkan utas per halaman arsip tujuan
const groupMap = new Map();
for (const t of threadsToArchive) {
const tgt = getArchiveTitleForThread(t);
if (!groupMap.has(tgt)) groupMap.set(tgt, []);
groupMap.get(tgt).push(t);
}
const sourceTitle = page.replace(/_/g, ' ');
await api.postWithToken('csrf', {
action: 'edit', title: page, text,
summary: `Mengarsipkan ${threadsToArchive.length} utas tidak aktif`,
basetimestamp: baseTimestamp
});
for (const [archiveTitle, threads] of groupMap.entries()) {
const arsRes = await api.get({
action: 'query', prop: 'revisions', rvprop: 'content',
titles: archiveTitle, formatversion: 2
});
const arsPage = arsRes.query.pages[0];
let arsText = (arsPage.revisions && arsPage.revisions[0].content) || '';
if (!arsPage.revisions) {
arsText = `{{Arsip|${sourceTitle}}}\n__ARCHIVEDTALK__\n__NOINDEX__\n`;
}
const newBlocks = threads.map(t => t.content.trim()).join('\n\n');
arsText = `${arsText.trim()}\n\n${newBlocks}\n`;
await api.postWithToken('csrf', {
action: 'edit', title: archiveTitle,
text: arsText.trim(),
summary: `Menambahkan ${threads.length} utas diarsipkan dari [[${sourceTitle}]]`
});
}
}
// ── Alur utama ────────────────────────────────────────────────────────
async function runArchiver() {
let data;
try {
data = await api.get({
action: 'query', prop: 'revisions', rvprop: 'content',
titles: page, formatversion: 2
});
} catch (e) {
notify('⚠️ Gagal memuat isi halaman.', 'error');
return;
}
const wikitext = (
data.query.pages[0] &&
data.query.pages[0].revisions &&
data.query.pages[0].revisions[0] &&
data.query.pages[0].revisions[0].content
) || '';
if (!wikitext) {
notify('⚠️ Halaman kosong atau gagal dimuat.', 'warn');
return;
}
const allThreads = parseThreads(wikitext);
if (!allThreads.length) {
notify('ℹ️ Tidak ditemukan utas level-2 di halaman ini.', 'info');
return;
}
const now = new Date();
const staleThreads = allThreads.filter(t => {
const ts = getLatestTimestamp(t.content);
const resolved = hasSectionResolvedTemplate(t.content);
if (resolved) return true;
if (!ts) return false;
return selisihBulan(ts, now) >= 2;
});
if (!staleThreads.length) {
const { overlay, footer } = createDialog(
'Pengarsip Diskusi — Tidak Ada Utas Kedaluwarsa',
`<div class="da-empty">
✅ Semua utas masih aktif (komentar terakhir < 2 bulan)<br>
dan tidak ada templat <code>{{section resolved}}</code>.<br><br>
Tidak ada yang perlu diarsipkan saat ini.
</div>`
);
addBtn(footer, 'Tutup', 'normal', () => overlay.remove());
return;
}
const proceed = await new Promise(resolve => {
const listItems = staleThreads.map(t => {
const ts = getLatestTimestamp(t.content);
const resolved = hasSectionResolvedTemplate(t.content);
const usia = ts ? selisihBulan(ts, now) : (resolved ? 'resolved' : '?');
const tsTxt = ts ? formatTanggalAceh(ts) : (resolved ? 'Terdeteksi: {{section resolved}}' : '—');
const tgtTitle = getArchiveTitleForThread(t);
return `<li class="da-thread-item" style="cursor:default">
<div>
<div class="da-thread-title">${mw.html.escape(t.title)}</div>
<div class="da-thread-meta">
Komentar terakhir: ${tsTxt}
<span class="da-badge">~${usia} bln</span>
</div>
<div class="da-archive-target">→ ${mw.html.escape(tgtTitle)}</div>
</div>
</li>`;
}).join('');
const { overlay, footer } = createDialog(
`Pengarsip Diskusi — ${staleThreads.length} Utas Tidak Aktif`,
`<p style="margin:0 0 var(--da-space-100);font-size:var(--da-font-size-small);color:var(--da-text-subtle)">
Utas berikut memiliki komentar terakhir <b>≥ 2 bulan</b> yang lalu
atau mengandung templat <code>{{section resolved}}</code>.
Klik <b>Lanjut</b> untuk mengkonfirmasi setiap utas satu per satu.
</p>
<ul class="da-thread-list">${listItems}</ul>`
);
addBtn(footer, 'Batal', 'destructive', () => { overlay.remove(); resolve(false); });
addBtn(footer, 'Lanjut →', 'progressive', () => { overlay.remove(); resolve(true); });
});
if (!proceed) return;
const approved = await confirmPerThread(staleThreads);
if (!approved.length) {
notify('ℹ️ Tidak ada utas yang dipilih untuk diarsipkan.', 'info');
return;
}
const baseTitle = page.replace(/_/g, ' ');
const { overlay, body, footer } = createDialog(
`Mengarsipkan ${approved.length} Utas…`,
`<div class="da-progress" id="da-prog-msg">⏳ Memproses…</div>`
);
const progMsg = document.getElementById('da-prog-msg');
try {
progMsg.textContent = `⏳ Menyimpan perubahan ke ${baseTitle} dan halaman arsip tujuan…`;
await doArchive(approved);
progMsg.innerHTML = `✅ <b>${approved.length} utas</b> berhasil diarsipkan.`;
addBtn(footer, 'Tutup & Muat Ulang', 'progressive', () => {
overlay.remove();
location.reload();
});
} catch (e) {
console.error('[DiscussionArchiver:Aceh] Error:', e);
progMsg.textContent = '❌ Gagal mengarsipkan. Lihat konsol untuk detail.';
addBtn(footer, 'Tutup', 'destructive', () => overlay.remove());
}
}
// ── Tombol mengambang ─────────────────────────────────────────────────
const floatBtn = document.createElement('button');
floatBtn.id = 'da-float-btn';
floatBtn.textContent = '📦 Arsipkan Diskusi';
floatBtn.title = 'DiscussionArchiver.js (Wikipedia Aceh) — Arsipkan utas tidak aktif (≥ 2 bulan) atau yang berlabel resolved';
floatBtn.addEventListener('click', runArchiver);
document.body.appendChild(floatBtn);
})();
// </nowiki>
p2bpwhyy2dmiwwrbw42c8gz43sirmn9
158115
158114
2026-05-20T15:11:53Z
Rachmat04
7338
Restored revision 158113 by [[Special:Contributions/Rachmat04|Rachmat04]] ([[User talk:Rachmat04|talk]])
158115
javascript
text/javascript
/**
* [DISCUSSIONARCHIVER.JS — GADGET PENGARSIP DISKUSI — WIKIPEDIA ACEH]
*
* •==============================================•
* > Tipe: JavaScript (MediaWiki Gadget)
* > Target: Halaman spesifik: Wikipedia:Meusapat
* > Fungsi: Mengarsipkan utas diskusi yang komentar
* terakhirnya sudah >= 2 bulan dari sekarang
* atau utas yang memiliki templat {{section resolved}} / {{Section resolved}}
* > Hak: Hanya sysop
* > Halaman arsip ditentukan berdasarkan tahun timestamp
* terbaru utas (bukan tahun saat tombol ditekan).
* •==============================================•
*/
// <nowiki>
(function () {
const cfg = mw.config.get();
const api = new mw.Api();
const page = cfg.wgPageName; // contoh: "Wikipedia:Meusapat"
const groups = cfg.wgUserGroups || [];
const isSysop = groups.includes('sysop');
// Hanya aktif untuk sysop
if (!isSysop) return;
// Hanya aktif di halaman persis "Wikipedia:Meusapat"
const pageReadable = page.replace(/_/g, ' ');
if (pageReadable !== 'Wikipedia:Meusapat') return;
// Jangan jalankan di halaman diff, history, atau jika bukan revisi saat ini
if (
cfg.wgAction === 'history' ||
cfg.wgDiffNewId ||
cfg.wgDiffOldId ||
cfg.wgCurRevisionId !== cfg.wgRevisionId
) return;
// ── CSS ──────────────────────────────────────────────────────────────
mw.util.addCSS(`
/* ── Variabel warna: light mode (default) ── */
.da-overlay, .da-dialog, .da-dialog * {
--da-bg: #ffffff;
--da-bg-subtle: #f8f9fa;
--da-bg-hover: #f0f2f4;
--da-border: #a2a9b1;
--da-border-subtle: #eaecf0;
--da-text: #202122;
--da-text-subtle: #54595d;
--da-text-muted: #72777d;
--da-link: #3366cc;
--da-badge-bg: #fee7e6;
--da-badge-text: #b32424;
}
@media (prefers-color-scheme: dark) {
.da-overlay, .da-dialog, .da-dialog * {
--da-bg: #1e1e1e;
--da-bg-subtle: #2a2a2a;
--da-bg-hover: #333333;
--da-border: #54595d;
--da-border-subtle: #3a3a3a;
--da-text: #eaecf0;
--da-text-subtle: #a2a9b1;
--da-text-muted: #72777d;
--da-link: #6699ff;
--da-badge-bg: #4a1a1a;
--da-badge-text: #ff8080;
}
}
.da-overlay {
position: fixed;
inset: 0;
background: rgba(0,0,0,0.50);
z-index: 100000;
display: flex;
align-items: center;
justify-content: center;
padding: 12px;
animation: da-fadein .15s ease-out;
}
.da-dialog {
background: var(--da-bg);
color: var(--da-text);
border: 1px solid var(--da-border);
border-radius: 8px;
width: min(680px, 96%);
max-height: 88vh;
overflow: auto;
box-shadow: 0 8px 24px rgba(0,0,0,0.40);
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial;
animation: da-slidein .15s ease-out;
}
.da-dialog-header {
padding: 12px 16px;
border-bottom: 1px solid var(--da-border-subtle);
background: var(--da-bg-subtle);
color: var(--da-text);
font-weight: bold;
font-size: 1.05em;
display: flex;
align-items: center;
gap: 8px;
}
.da-dialog-body {
padding: 14px 16px;
font-size: 0.95em;
color: var(--da-text);
}
.da-dialog-footer {
padding: 10px 16px;
border-top: 1px solid var(--da-border-subtle);
background: var(--da-bg-subtle);
text-align: right;
}
.da-dialog-footer button {
margin-left: 6px;
}
.da-thread-list {
list-style: none;
margin: 10px 0;
padding: 0;
max-height: 340px;
overflow-y: auto;
border: 1px solid var(--da-border-subtle);
border-radius: 4px;
}
.da-thread-item {
display: flex;
align-items: flex-start;
gap: 10px;
padding: 9px 12px;
border-bottom: 1px solid var(--da-border-subtle);
cursor: pointer;
transition: background .1s;
}
.da-thread-item:last-child { border-bottom: none; }
.da-thread-item:hover { background: var(--da-bg-hover); }
.da-thread-item input[type=checkbox] {
margin-top: 3px;
flex-shrink: 0;
cursor: pointer;
}
.da-thread-title {
font-weight: 600;
font-size: 0.92em;
color: var(--da-text);
}
.da-thread-meta {
font-size: 0.82em;
color: var(--da-text-muted);
margin-top: 2px;
}
.da-badge {
display: inline-block;
background: var(--da-badge-bg);
color: var(--da-badge-text);
border-radius: 3px;
padding: 1px 6px;
font-size: 0.78em;
font-weight: 700;
margin-left: 6px;
vertical-align: middle;
}
.da-confirm-box {
background: var(--da-bg-subtle);
border: 1px solid var(--da-border-subtle);
border-radius: 6px;
padding: 10px 14px;
margin-bottom: 10px;
}
.da-confirm-box strong {
display: block;
margin-bottom: 4px;
color: var(--da-text);
}
.da-confirm-meta {
font-size: 0.85em;
color: var(--da-text-subtle);
margin: 4px 0 8px;
}
.da-archive-target {
font-size: 0.88em;
color: var(--da-link);
word-break: break-all;
}
.da-progress {
font-size: 0.9em;
color: var(--da-text-subtle);
margin-top: 8px;
min-height: 1.4em;
}
.da-empty {
text-align: center;
padding: 28px 0;
color: var(--da-text-muted);
font-size: 0.93em;
}
.da-select-all-row {
display: flex;
align-items: center;
gap: 8px;
padding: 7px 12px;
background: var(--da-bg-subtle);
border-bottom: 1px solid var(--da-border-subtle);
font-size: 0.88em;
color: var(--da-text-subtle);
}
@keyframes da-fadein {
from { opacity: 0; } to { opacity: 1; }
}
@keyframes da-slidein {
from { opacity: 0; transform: translateY(-8px); }
to { opacity: 1; transform: translateY(0); }
}
#da-float-btn {
position: fixed;
bottom: 130px;
right: 25px;
background: #36c;
color: #fff;
border: none;
padding: 8px 13px;
border-radius: 5px;
cursor: pointer;
z-index: 99999;
font-weight: bold;
font-size: 0.93em;
box-shadow: 0 2px 8px rgba(0,0,0,0.22);
transition: background .15s;
}
#da-float-btn:hover { background: #2a55a8; }
`);
// ── Nama bulan bahasa Aceh ────────────────────────────────────────────
const BULAN_ACEH = {
'Buleuen Sa': 0,
'Buleuen Duwa': 1,
'Buleuen Lhèe': 2,
'Buleuen Peuet': 3,
'Buleuen Limöng': 4,
'Buleuen Nam': 5,
'Buleuen Tujôh': 6,
'Buleuen Lapan': 7,
'Buleuen Sikureueng': 8,
'Buleuen Siplôh': 9,
'Buleuen Siblaih': 10,
'Buleuen Duwa Blah': 11
};
// Array nama bulan (urut) untuk formatting
const BULAN_ACEH_ARR = Object.keys(BULAN_ACEH);
/**
* Deteksi apakah sebuah utas mengandung templat {{section resolved}} atau {{Section resolved}}
* dengan parameter apapun. Mencakup variasi whitespace dan multiline.
*/
function hasSectionResolvedTemplate(text) {
if (!text) return false;
const re = /\{\{\s*[Ss]ection\s+resolved\b[\s\S]*?\}\}/;
return re.test(text);
}
/**
* Mengambil timestamp terbaru dari sebuah blok teks wikitext.
* Format yang dideteksi: "12 Buleuen Sa 2024 12.34 (WIB)"
* Catatan: tanda tangan di halaman kemungkinan menuliskan waktu dalam WIB (UTC+7).
* Untuk menyimpan perbandingan waktu, kita konversi ke UTC dengan mengurangi 7 jam.
*/
function getLatestTimestamp(text) {
const pattern = /(\d{1,2})\s+(Buleuen Sa|Buleuen Duwa|Buleuen Lhèe|Buleuen Peuet|Buleuen Limöng|Buleuen Nam|Buleuen Tujôh|Buleuen Lapan|Buleuen Sikureueng|Buleuen Siplôh|Buleuen Siblaih|Buleuen Duwa Blah)\s+(\d{4})\s+(?:pukul\s+)?(\d{1,2})[.:](\d{2})\s+\(WIB\)/g;
let latest = null;
let m;
while ((m = pattern.exec(text)) !== null) {
const day = parseInt(m[1], 10);
const monthIndex = BULAN_ACEH[m[2]];
const year = parseInt(m[3], 10);
const hourWIB = parseInt(m[4], 10);
const minute = parseInt(m[5], 10);
// Konversi WIB (UTC+7) ke UTC dengan mengurangi 7 jam
const hourUTC = hourWIB - 7;
const d = new Date(Date.UTC(year, monthIndex, day, hourUTC, minute));
if (!latest || d > latest) latest = d;
}
return latest;
}
/**
* Format tanggal ke string Aceh (mengembalikan waktu dalam WIB).
* Menerima Date yang direpresentasikan dalam UTC; kita tambahkan offset +7 jam untuk menampilkan WIB.
*/
function formatTanggalAceh(d) {
if (!d) return '';
const dWIB = new Date(d.getTime() + 7 * 60 * 60 * 1000);
const day = String(dWIB.getUTCDate()).padStart(2, '0');
const monthName = BULAN_ACEH_ARR[dWIB.getUTCMonth()];
const year = dWIB.getUTCFullYear();
return `${day} ${monthName} ${year} (WIB)`;
}
function selisihBulan(dari, ke) {
return (ke.getFullYear() - dari.getFullYear()) * 12
+ (ke.getMonth() - dari.getMonth());
}
/**
* Menentukan judul halaman arsip untuk sebuah utas.
* Menggunakan tahun dari timestamp terbaru utas tersebut.
* Jika tidak ada timestamp terdeteksi (misal hanya {{section resolved}}),
* fallback ke tahun saat ini.
*/
function getArchiveTitleForThread(thread) {
const baseTitle = page.replace(/_/g, ' ');
const ts = getLatestTimestamp(thread.content);
const year = ts ? ts.getUTCFullYear() : new Date().getFullYear();
return `${baseTitle}/Keuneubah ${year}`;
}
function notify(msg, type = 'info') {
mw.notify ? mw.notify(msg, { type }) : console.log('[DiscussionArchiver:Aceh]', msg);
}
// ── Dialog ────────────────────────────────────────────────────────────
function createDialog(titleHtml, bodyHtml) {
const overlay = document.createElement('div');
overlay.className = 'da-overlay';
const dialog = document.createElement('div');
dialog.className = 'da-dialog';
dialog.innerHTML = `
<div class="da-dialog-header">📦 ${titleHtml}</div>
<div class="da-dialog-body">${bodyHtml}</div>
<div class="da-dialog-footer"></div>
`;
overlay.appendChild(dialog);
overlay.addEventListener('click', e => { if (e.target === overlay) overlay.remove(); });
document.body.appendChild(overlay);
return {
overlay,
dialog,
body: dialog.querySelector('.da-dialog-body'),
footer: dialog.querySelector('.da-dialog-footer')
};
}
function addBtn(footer, label, cls, onClick) {
const btn = document.createElement('button');
btn.className = `mw-ui-button ${cls}`;
btn.textContent = label;
btn.addEventListener('click', onClick);
footer.appendChild(btn);
return btn;
}
// ── Parsing utas level-2 ───────────────────────────────────────────────
function parseThreads(wikitext) {
const headerRe = /^==\s*([^=\n][^\n]*?)\s*==\s*$/gm;
const positions = [];
let m;
while ((m = headerRe.exec(wikitext)) !== null) {
positions.push({ title: m[1].trim(), start: m.index });
}
positions.push({ title: null, start: wikitext.length });
const threads = [];
for (let i = 0; i < positions.length - 1; i++) {
const start = positions[i].start;
const end = positions[i + 1].start;
threads.push({
title: positions[i].title,
content: wikitext.substring(start, end),
start,
end
});
}
return threads;
}
// ── Konfirmasi per utas ────────────────────────────────────────────────
// archiveTitle dihitung per utas di dalam fungsi ini (tidak lagi diterima sebagai parameter)
function confirmPerThread(threads) {
return new Promise(resolve => {
const approved = [];
let idx = 0;
function showNext() {
if (idx >= threads.length) {
resolve(approved);
return;
}
const t = threads[idx];
const ts = getLatestTimestamp(t.content);
const resolved = hasSectionResolvedTemplate(t.content);
const usia = ts ? selisihBulan(ts, new Date()) : (resolved ? 'resolved' : '?');
const tsTxt = ts ? formatTanggalAceh(ts) : (resolved ? 'Terdeteksi: {{section resolved}}' : 'Tidak terdeteksi');
const tgtTitle = getArchiveTitleForThread(t); // per utas, bukan global
const { overlay, footer } = createDialog(
`Konfirmasi Arsip Utas (${idx + 1}/${threads.length})`,
`<div class="da-confirm-box">
<strong>📄 ${mw.html.escape(t.title)}</strong>
<div class="da-confirm-meta">
Komentar terakhir: <b>${tsTxt}</b>
<span class="da-badge">~${usia} bulan lalu</span>
</div>
<div class="da-archive-target">→ Akan diarsipkan ke: <b>${mw.html.escape(tgtTitle)}</b></div>
</div>
<p style="font-size:0.92em;color:var(--da-text-subtle);margin:6px 0 0">
Lewati untuk melewati utas ini tanpa mengarsipkan.
</p>`
);
addBtn(footer, 'Lewati', 'mw-ui-quiet', () => {
overlay.remove();
idx++;
showNext();
});
addBtn(footer, 'Arsipkan', 'mw-ui-progressive', () => {
approved.push(t);
overlay.remove();
idx++;
showNext();
});
}
showNext();
});
}
// ── Proses pengarsipan ─────────────────────────────────────────────────
// Tiap utas dikelompokkan berdasarkan archiveTitle-nya masing-masing,
// lalu tiap kelompok disimpan ke halaman arsip yang sesuai.
async function doArchive(threadsToArchive) {
// Ambil ulang wikitext terbaru (hindari konflik edit)
const res = await api.get({
action: 'query',
prop: 'revisions',
rvprop: ['content', 'timestamp'],
titles: page,
formatversion: 2
});
const pageData = res.query.pages[0];
let text = pageData.revisions[0].content;
const baseTimestamp = pageData.revisions[0].timestamp;
// Hapus setiap utas dari teks asal (cocokkan berdasarkan konten)
for (const t of threadsToArchive) {
const escaped = t.content.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const re = new RegExp(escaped);
text = text.replace(re, '');
}
text = text.replace(/\n{3,}/g, '\n\n').trim();
// Kelompokkan utas berdasarkan halaman arsip tujuan masing-masing
const groupMap = new Map(); // archiveTitle → [thread, ...]
for (const t of threadsToArchive) {
const tgt = getArchiveTitleForThread(t);
if (!groupMap.has(tgt)) groupMap.set(tgt, []);
groupMap.get(tgt).push(t);
}
const sourceTitle = page.replace(/_/g, ' ');
// Simpan halaman asal (sekali saja, semua utas sudah dihapus)
await api.postWithToken('csrf', {
action: 'edit',
title: page,
text,
summary: `Mengarsipkan ${threadsToArchive.length} utas tidak aktif`,
basetimestamp: baseTimestamp
});
// Simpan tiap halaman arsip sesuai kelompoknya
for (const [archiveTitle, threads] of groupMap.entries()) {
const arsRes = await api.get({
action: 'query',
prop: 'revisions',
rvprop: 'content',
titles: archiveTitle,
formatversion: 2
});
const arsPage = arsRes.query.pages[0];
let arsText = (arsPage.revisions && arsPage.revisions[0].content) || '';
if (!arsPage.revisions) {
arsText = `{{Arsip|${sourceTitle}}}\n__ARCHIVEDTALK__\n__NOINDEX__\n`;
}
const newBlocks = threads.map(t => t.content.trim()).join('\n\n');
arsText = `${arsText.trim()}\n\n${newBlocks}\n`;
await api.postWithToken('csrf', {
action: 'edit',
title: archiveTitle,
text: arsText.trim(),
summary: `Menambahkan ${threads.length} utas diarsipkan dari [[${sourceTitle}]]`
});
}
}
// ── Alur utama ────────────────────────────────────────────────────────
async function runArchiver() {
// 1. Ambil wikitext halaman
let data;
try {
data = await api.get({
action: 'query',
prop: 'revisions',
rvprop: 'content',
titles: page,
formatversion: 2
});
} catch (e) {
notify('⚠️ Gagal memuat isi halaman.', 'error');
return;
}
const wikitext = (data.query.pages[0] && data.query.pages[0].revisions && data.query.pages[0].revisions[0] && data.query.pages[0].revisions[0].content) || '';
if (!wikitext) {
notify('⚠️ Halaman kosong atau gagal dimuat.', 'warn');
return;
}
// 2. Parse utas level-2
const allThreads = parseThreads(wikitext);
if (!allThreads.length) {
notify('ℹ️ Tidak ditemukan utas level-2 di halaman ini.', 'info');
return;
}
// 3. Filter utas yang komentar terakhirnya >= 2 bulan OR memiliki {{section resolved}}
const now = new Date();
const staleThreads = allThreads.filter(t => {
const ts = getLatestTimestamp(t.content);
const resolved = hasSectionResolvedTemplate(t.content);
if (resolved) return true;
if (!ts) return false;
return selisihBulan(ts, now) >= 2;
});
if (!staleThreads.length) {
const { overlay, footer } = createDialog(
'Pengarsip Diskusi — Tidak Ada Utas Kedaluwarsa',
`<div class="da-empty">
✅ Semua utas masih aktif (komentar terakhir < 2 bulan) dan tidak ada templat {{section resolved}}.<br>
Tidak ada yang perlu diarsipkan saat ini.
</div>`
);
addBtn(footer, 'Tutup', 'mw-ui-quiet', () => overlay.remove());
return;
}
// 4. Tentukan nama dasar halaman (archiveTitle dihitung per utas via getArchiveTitleForThread)
const baseTitle = page.replace(/_/g, ' '); // "Wikipedia:Meusapat"
// 5. Tampilkan ringkasan dulu sebelum konfirmasi per utas
// Setiap baris menampilkan halaman arsip tujuan masing-masing utas
const proceed = await new Promise(resolve => {
const listItems = staleThreads.map(t => {
const ts = getLatestTimestamp(t.content);
const resolved = hasSectionResolvedTemplate(t.content);
const usia = ts ? selisihBulan(ts, now) : (resolved ? 'resolved' : '?');
const tsTxt = ts ? formatTanggalAceh(ts) : (resolved ? 'Terdeteksi: {{section resolved}}' : '—');
const tgtTitle = getArchiveTitleForThread(t); // per utas
return `<li class="da-thread-item" style="cursor:default">
<div>
<div class="da-thread-title">${mw.html.escape(t.title)}</div>
<div class="da-thread-meta">Komentar terakhir: ${tsTxt} <span class="da-badge">~${usia} bln</span></div>
<div class="da-archive-target" style="margin-top:2px">→ ${mw.html.escape(tgtTitle)}</div>
</div>
</li>`;
}).join('');
const { overlay, footer } = createDialog(
`Pengarsip Diskusi — ${staleThreads.length} Utas Tidak Aktif`,
`<p style="margin:0 0 8px;font-size:0.93em">
Utas berikut memiliki komentar terakhir <b>≥ 2 bulan</b> yang lalu atau mengandung templat <code>{{section resolved}}</code>.
Klik <b>Lanjut</b> untuk mengkonfirmasi setiap utas satu per satu.
</p>
<ul class="da-thread-list">${listItems}</ul>`
);
addBtn(footer, 'Batal', 'mw-ui-destructive', () => { overlay.remove(); resolve(false); });
addBtn(footer, 'Lanjut →', 'mw-ui-progressive', () => { overlay.remove(); resolve(true); });
});
if (!proceed) return;
// 6. Konfirmasi per utas (archiveTitle dihitung di dalam fungsi)
const approved = await confirmPerThread(staleThreads);
if (!approved.length) {
notify('ℹ️ Tidak ada utas yang dipilih untuk diarsipkan.', 'info');
return;
}
// 7. Dialog progres + eksekusi
const { overlay, body, footer } = createDialog(
`Mengarsipkan ${approved.length} Utas…`,
`<div class="da-progress" id="da-prog-msg">⏳ Memproses…</div>`
);
const progMsg = document.getElementById('da-prog-msg');
try {
progMsg.textContent = `⏳ Menyimpan perubahan ke ${baseTitle} dan halaman arsip tujuan…`;
await doArchive(approved);
progMsg.innerHTML = `✅ <b>${approved.length} utas</b> berhasil diarsipkan.`;
addBtn(footer, 'Tutup & Muat Ulang', 'mw-ui-progressive', () => {
overlay.remove();
location.reload();
});
} catch (e) {
console.error('[DiscussionArchiver:Aceh] Error:', e);
progMsg.textContent = '❌ Gagal mengarsipkan. Lihat konsol untuk detail.';
addBtn(footer, 'Tutup', 'mw-ui-destructive', () => overlay.remove());
}
}
// ── Tombol mengambang ─────────────────────────────────────────────────
const floatBtn = document.createElement('button');
floatBtn.id = 'da-float-btn';
floatBtn.textContent = '📦 Arsipkan Diskusi';
floatBtn.title = 'DiscussionArchiver.js (Wikipedia Aceh) — Arsipkan utas tidak aktif (≥ 2 bulan) atau yang berlabel resolved';
floatBtn.addEventListener('click', runArchiver);
document.body.appendChild(floatBtn);
})();
// </nowiki>
69ep6si6kls5osg830b5z166z4xhxkn