Vikivojaĝo
eowikivoyage
https://eo.wikivoyage.org/wiki/Vikivoja%C4%9Do:%C4%88efpa%C4%9Do
MediaWiki 1.47.0-wmf.4
first-letter
Aŭdvidaĵo
Specialaĵo
Diskuto
Uzanto
Uzanto-Diskuto
Vikivojaĝo
Vikivojaĝo-Diskuto
Dosiero
Dosiero-Diskuto
MediaWiki
MediaWiki-Diskuto
Ŝablono
Ŝablono-Diskuto
Helpo
Helpo-Diskuto
Kategorio
Kategorio-Diskuto
TimedText
TimedText talk
Modulo
Modulo-Diskuto
Event
Event talk
Vikivojaĝo:Diskutejo
4
4757
72495
72274
2026-05-27T17:15:24Z
MediaWiki message delivery
162
/* Vote now in the 2026 U4C election */ nova sekcio
72495
wikitext
text/x-wiki
{{/kapo}}
== Administrantigo de KuboF Hromoslav ==
Mi kandidatas por esti administranto. Bonvolu subteni min en [[Vikivojaĝo:Administrantigo/KuboF Hromoslav]]. Voĉdonado daŭros 14 tagojn. Dankon! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 23:17, 14 jan. 2019 (UTC)
: Dankon pro via subteno! Mi oficiale estas administranto por 1 jaro. Mi jam forigis sufiĉe multajn eksmodajn ŝablonojn kaj maltaŭgajn paĝojn kaj iomete modifis la interfacon. Mi ankoraŭ polurados ŝablonojn (pluraj ŝajnas al mi esti vere nebezonataj) kaj plibonigos interfacon. Sed por aliaj altnivelaj agadoj mi bezonos esti aldone [[Vikivojaĝo:Interfacaj administrantoj|interfaca administranto]] kaj havi [[Vikivojaĝo:Robotoj|roboton]] - pri tio mi zorgos baldaŭ. --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 20:40, 1 feb. 2019 (UTC)
== Voĉdonu pri propono de regularo pri robotoj ==
[[VV:BOT|Robotoj]] estas komputilaj programoj prizorgataj de homoj ("robotistoj"), kiuj povas rapide kaj facile fari amasajn (kaj kutime tedajn) taskojn. Por povi uzadi ilin en nia Vikivojaĝo, ni bezonas regularon pri ili.
Mi adaptis la regularon de la Esperanta Vikipedio kaj invitas vin '''<big>[[Vikivojaĝo-Diskuto:Permespeto_por_robotoj#Propono_de_regulo_pri_robotoj|voĉdoni pri ĝi]]</big>'''. La rezultoj estos post 1 semajno (la 10-an de Februaro 2021). --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 19:16, 2 feb. 2021 (UTC)
: {{Farita}} Post pli ol semajno, la propono estis akceptita! Ekde nun ni povas havi robotojn ĉi tie! {{R}} --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 22:33, 11 feb. 2021 (UTC)
== Wiki Loves Folklore 2021 is back! ==
<div lang="en" dir="ltr" class="mw-content-ltr">
{{int:please-translate}}
[[File:Wiki Loves Folklore Logo.svg|right|150px|frameless]]
You are humbly invited to participate in the '''[[:c:Commons:Wiki Loves Folklore 2021|Wiki Loves Folklore 2021]]''' an international photography contest organized on Wikimedia Commons to document folklore and intangible cultural heritage from different regions, including, folk creative activities and many more. It is held every year from the 1st till the 28th of February.
You can help in enriching the folklore documentation on Commons from your region by taking photos, audios, videos, and [https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&campaign=wlf_2021 submitting] them in this commons contest.
Please support us in translating the [[:c:Commons: Wiki Loves Folklore 2021|project page]] and a [https://meta.wikimedia.org/wiki/Special:Translate?group=Centralnotice-tgroup-wikiloveslove2020&language=en&filter=%21translated&action=translate|one-line banner message] to help us spread the word in your native language.
'''Kind regards,'''
'''Wiki loves Folklore International Team'''
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 13:25, 6 feb. 2021 (UTC)
</div>
<!-- Message sent by User:Tiven2240@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Tiven2240/wll&oldid=21073884 -->
== Artikol-verkaj konkursoj por 2021 ==
Kiel vi povas vidi en la [[:m:Esperanto_kaj_Libera_Scio/Annual_agendas/2021#Konkursoj_kaj_komunaj_redaktadoj|Jara plano por 2021]] de la organizo [[Vikivojaĝo:Esperanto kaj Libera Scio|Esperanto kaj Libera Scio]], por 2021 estas planataj jenaj konkursoj / kampanjoj:
* [[Vikivojaĝo:VikiPrintempo COE|VikiPrintempo de Centra kaj Orienta Eŭropo]] (21-a de Marto - la 30-a de Aprilo)
* [[Vikivojaĝo:Afrika monato|Afrika monato]] (Majo)
* [[Vikivojaĝo:Amerika monato|Amerika monato]] (Oktobro)
* <del>[[Vikivojaĝo:Azia monato|Azia monato]] (Novembro)</del> (pardonu, eraro, mi skribis de memoro - dume la plano estas ''ne'' organizi Azian monaton, sed se troviĝos iu volonta ĉeforganizanto, ni povas ĝin fari; korektita de --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 14:06, 13 feb. 2021 (UTC))
Planata estas ankaŭ [[:meta:Wikipedia_Pages_Wanting_Photos/eo|Vikipediaj Paĝoj Volantaj Fotojn]], sed dume ne estas klare, ĉu ĝi okazos nur en Vikipedio, aŭ ankaŭ en aliaj projektoj (kiel en Vikivojaĝo).
La paĝoj por la konkursoj estos preparataj iom-post-iom kaj pluraj detaloj povos ŝanĝiĝi. Ankaŭ, tiu ĉi jare ni volas havi pli vastan organizan teamon, do ni dissendos alvokojn por volontuloj kiam venos la tempo. Prezidanto de Esperanto kaj Libera Scio, [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 21:49, 7 feb. 2021 (UTC)
== Novaj petoj por robotoj ==
Jam ekfunkciis la nova regularo pri robotoj, do jam la robotan rajton petas unuaj robotistoj. Bonvolu subteni ilin (ankaŭ mi estas unu el tiuj) ĉe:
* [[Vikivojaĝo:Permespeto por robotoj/KuBOT]]
* [[Vikivojaĝo:Permespeto por robotoj/Robin Bot]]
--[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 23:01, 11 feb. 2021 (UTC)
: Ĝisdatigo: ambaŭ petoj estis akceptitaj kaj al ambaŭ robotoj estis donita la robota statuso. Dankon pro via subteno! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 19:01, 21 feb. 2021 (UTC)
== Rezultoj de Kunsidoj de Ĝenerala asembleo de Esperanto kaj Libera Scio en 2020 ==
[[Dosiero:Esperanto kaj Libera Scio - logo eo sen subtitolo.svg|eta|[[:w:Esperanto kaj Libera Scio]]]]
En 2020, la Vikimedia organizo [[:w:Esperanto kaj Libera Scio|Esperanto kaj Libera Scio]] havis 2 Kunsidojn de Ĝenerala asembleo, elektis novajn Estraron kaj Revizian komisionon kaj aprobis plurajn gravajn gvidjn dokumentojn.
Estraro:
* Prezidanto: Michal Matúšov ([[Uzanto:KuboF Hromoslav|KuboF Hromoslav]])
* Vic-Prezidanto: Ivan Camilo Quintero Santacruz
* Estrarano: Juan Sebastian Quintero Santacruz
Revizia komisiono:
* Prezidanto de la Revizia komisiono: Ziko van Dijk
* Michel Castelo Branco
* Yves Nevelsteen
Krome, gravaj dokumentoj estis akceptitaj:
* [[:meta:Special:MyLanguage/Esperanto_kaj_Libera_Scio/Reports/2019|Jara raporto 2019]]
* [[:meta:Esperanto_kaj_Libera_Scio/Annual_agendas/2020-eo|Jara plano 2020]]
* [https://docs.google.com/spreadsheets/d/1tZKheF7efS0-0Q9l6WRdX4H1P9NVVA3G_dUFcuoYUog/edit Jara buĝeto 2020]
* [[:meta:Special:MyLanguage/Esperanto_kaj_Libera_Scio/Annual_agendas/2021|Jara plano 2021]]
* [https://docs.google.com/spreadsheets/d/1bu1ilkFRmCmnSB2FTDBaiwW3wAUfiCL1EpTHBZu6Sh8/edit Jara buĝeto 2021]
Ĝenerale, la Jara plano prezentas minimumon da agado por koncerna jaro. Jam por tiuj ĉi agadoj ni serĉas aldonajn volontulojn (elde simplaj helpantoj ĝi ĉeforganizantoj), sed se vi volas aldone organizi ion plian, [https://esperanto.wiki/kontakto/ kontaktu nin]! Danke al la tuta teamo, prezidanto [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 16:34, 15 feb. 2021 (UTC)
== Bv. subteni nian monpeton por Afrika monato 2021 ==
[[Dosiero:Vikimedia Afrika monato 2021 rubando-eo.svg|512px|center|link=Vikivojaĝo:Afrika monato 2021]]
En Majo okazos plia fojo de la artikol-verka konkurso "[[Vikivojaĝo:Afrika monato 2021|Afrika monato 2021]]" (sub organizado de [[Uzanto:Radioamatoro|Radioamatoro]] kaj [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]]. Kontraste al la antaŭa jaro, nun ni pli fokusiĝos al atingo de Afrikaj esperantistoj - unuflanke per niaj personaj kontaktoj kaj helpe de aliaj Esperantaj organizoj, kaj duaflanke per pagata reklamo. Nuntempe estas malmultaj Afrikaj Vikimedianoj, eĉ mapli en Esperantujo. Per sia partopreno en Vikimediaj projektoj ili unuflanke provizos specialan vidpunkton, neprovizeblan per alikontinentanoj, kaj aliflanke mem spertiĝos pri diversaj teĥnologioj kaj temoj, kio utilos al ili ankaŭ en aliaj partoj de Vikimedia aŭ Esperanta agado. Venkontoj ricevos valorajn premiojn; speciala kategorio estas planata por Afrikaj nov-vikimedianoj.
Por subteni ĉion tion ĉi ni subvencipetis ĉe la Fondaĵo Vikimedio. '''Bonvolu viziti la paĝon de la monpeto, konsulti ĝin, kaj <u>subskribiĝi</u> tute sube ĉe "Endorsements" por subteni nin: [[:meta:Grants:Project/Rapid/UG ELiSo/African month 2021]].'''
Amike, kun-organizanto [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 20:12, 15 mar. 2021 (UTC)
== VOĈDONO pri plibonigo de ŝablona sistemo ==
Mi ĵus lanĉis ''Peton pri komento'' por peti al la Fondaĵo Vikimedio starigi sistemon por uzado de ŝablonojn de centra deponejo ("mallokaj ŝablonoj"). '''Bonvolu voĉdoni ĉe [[Vikivojaĝo:Peto pri komento/Mallokaj ŝablonoj]]!'''
Kreadi, importadi, bontenadi kaj ĝisdatigadi ŝablonojn kaj modulojn estas por kelkaj el ni eterna peno kaj doloro. La resto de redaktantoj kaj legantoj kutime ĝuas la rezultojn de tiu laboro, sed ofte ne konscias kiom multa energio kaj tempo venas en ĝin. Foje al mi okazas, ke mi dum 2-3 horoj pene laboras pri iu eta funkcio ĝis kiam funkcias - kaj historio tio aspektas kiel ŝanĝo de 1 vorto...
Nia Esperanta amiko [[Uzanto:Amire80]] (ankaŭ membro de la Lingva Inĝeniera Teamo de la Fondaĵo Vikimedio) proponis kiel solvi plurajn problemojn pri la afero. Mi, kiel edukita programisto kaj longtempa prilaboranto de ŝablonoj, plene konfirmas ke lia propono signife plibonigos mastrumadon kaj uzadon de ŝablonoj en nia Esperanta Vikivojaĝo.
Sed la ŝanĝo ne venos mem - la Fondaĵo Vikimedie unue bezonas provizi rimedojn por ĝi. Nia peto estas unu el pluraj, kiuj celas ĝuste tio. Do, mi petas vin voĉdoni ĉe [[Vikivojaĝo:Peto pri komento/Mallokaj ŝablonoj]]! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 13:47, 25 mar. 2021 (UTC)
: La propono ricevis amasan subtenon. Dankon al ĉiu voĉdoninto! Sekve mi raportis la rezulton en la centra loko kaj fermis la voĉdonon. --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 19:49, 30 apr. 2021 (UTC)
== Registriĝu kiel interesiĝanto pri Erasmus+ ==
[[Dosiero:Esperanto kaj Libera Scio - logo eo sen subtitolo.svg|150px|dekstre]]
Kiel promesite en la [[:meta:Special:MyLanguage/Esperanto kaj Libera Scio/Annual agendas/2021|Jara plano 2021]], la Estraro de ''Esperanto kaj Libera Scio'' laboras pri partopreno en projekto subvenciata de Erasmus+ de la Eŭropa Komisiono.
Antaŭ ol mi povos provizi pliajn detalojn, mi ŝatus inviti vin registriĝi kiel interesiĝanto pri partopreno. Tio estas esprimo de ĝenerala intereso partopreni, vi ne devos partopreni jam sekvan projekton. Kiam laboro pri projekto pliprogresos, ni kontaktos unue ĉiujn interesiĝantojn, kiuj registriĝis.
Taskoj de partoprenontoj dependos de konkreta projekto kaj ili estos kominikitaj kun interesiĝantoj antaŭ konfirmo de partopreno. Kutimaj taskoj estas veturo al alia lando por trejnado aŭ alia edukado, kreado de eduka aŭ informa materialo (broŝuro, video ktp), eĉ trejnado de aliaj aktivuloj.
Utiligu vian oportunon kaj '''[https://esperanto.wiki/2021/partoprenu-kun-vikimedianoj-en-erasmus#crm-container registriĝu ankoraŭ hodiaŭ]!''' Amike, Prezidanto [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 11:32, 4 maj. 2021 (UTC)
== Unesko-konkurso por Junio 2021 ==
[[File:Unesko 2021 rubando.jpg|512px|center]]
Paco naskiĝas en mensoj kaj koroj de homoj.
UEA kaj ELiSo / VMEO kunigis siajn fortojn por subteni disvastigon de tiuj ĉi valoroj kaj idealoj de Unesko per Esperanto, specife per artikol-redakta konkurso okazanta dum '''Junio 2021''' en la '''Esperanta Vikipedio'''.
Ĝian okazigon instigis rekte Unesko, kiu konsideras Vikipedion taŭga maniero por subteni sian mision. Ni montru al Unesko, kiom tio veras!
'''Kiel partopreni?'''
Legu la regulojn, verku / traduku novajn aŭ plibonigu jamajn artikolojn en la Esperanta Vikipedio pri Unesko kaj listigu viajn artikolojn en la konkursa paĝo. Fine UEA sendos premiojn por 5 venkintoj.
'''<big>[[:w:Projekto:Unesko 2021]]</big>'''
PS: Se via amiko aŭ kolego interesiĝus, certe invitu lin / ŝin - vi scias, varbado ;-)
kunorganizanto [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 21:36, 1 jun. 2021 (UTC)
== Statistikoj pri la Esperanta Vikivojaĝo ekfunkcias! ==
Post maturiĝo kaj memstariĝo de la Esperanta Vikivojaĝo ni teorie povus havi statistikojn pri kontribuado kaj vizitado (male al la tempoj kiam ni estis en Kovilo, kie statistikoj pri vizitoj estis por la tuta Kovilo). Sed okazis iu teĥnika problemo, kaj la statistikaĵoj ne videblis. Nun [[:phab:T279564|la problemo estas solvita]]!
Do, '''[[:stats:#/eo.wikivoyage.org|ĝuu la statistikaĵojn]]'''! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 21:01, 6 jun. 2021 (UTC)
== Read-only next Tuesday ==
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
A maintenance operation will be performed on '''Tuesday 22nd at 05:00 AM UTC'''.
It is supposed to last a few minutes and will affect 31 wikis. During this time, you will not be able to save your edits. For more details, please check [[phab:T284530|on Phabricator]].
A banner will be displayed 30 minutes before the operation.
Please help making your community aware of this. [[user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] 17:36, 16 jun. 2021 (UTC)
</div>
<!-- Message sent by User:SGrabarczuk (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Varia&oldid=21599852 -->
== 2021 Board of Trustees election ==
The [[m:Special:MyLanguage/Wikimedia Foundation elections/2021|2021 Board of Trustees election]] opens 4 August 2021. Candidates from the community were asked to submit their candidacy. After a three week long call for candidates, there are [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Candidates#Candidate Table|20 candidates for the 2021 election]].
The Wikimedia movement has the opportunity to vote for the selection of community-and-affiliate trustees. The Board is expected to select the four most voted candidates to serve as trustees. Voting closes 17 August 2021.
The [[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees|Wikimedia Foundation Board of Trustees]] oversees the Wikimedia Foundation's operations. The Board wants to improve their competences and diversity as a team. They have shared the [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Candidates#Skills|areas of expertise]] that they are currently missing and hope to cover with new trustees.
How can you get involved?
* [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Candidates#Candidate%20Table|Learn more about candidates]].
* [[m:Special:MyLanguage/Wikimedia Foundation elections/2021#Campaign%20Activities|Organize campaign activities]].
* [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/Voting|Vote]].
Read the [[m:Special:MyLanguage/Wikimedia Foundation elections/2021/2021-07-02/2021 Confirmed Candidates|full announcement]].
Best,
On behalf of the Elections Committee
[[Uzanto:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] ([[Uzanto-Diskuto:MNadzikiewicz (WMF)|diskuto]]) 10:53, 3 jul. 2021 (UTC)
== Mallokaj ŝablonoj - helpo bezonata nun! ==
Antaŭ 3 monatoj ni ĉi tie diskutis kaj voĉdonis pri nia peto al la Fondaĵo Vikimedio krei sistemon kiu ebligos uzadon de ŝablonoj kaj moduloj de centra loko por ĉiuj vikioj, tn. "mallokaj ŝablonoj". Tia sistemo ŝparos al ni tempon de niaj teĥnikistoj kaj ebligos al ni uzadi plej progresintajn ŝablonojn kaj modulojn kaj teni ilin ĝisdataj. Ni [[Vikivojaĝo:Peto pri komento/Mallokaj ŝablonoj|subtenis la proponon]].
Tamen, ne estas klare, ĉu mallokaj ŝablonoj eniris la [[:meta:Wikimedia Foundation Medium-term plan 2019/Annual Plan 2021-2022/eo|sekvan Jaran planon de la Fondaĵo Vikimedio]]. Iuj vortumoj donas ioman esperon, sed tio ne estas sufiĉe klara.
Tamen, ankoraŭ eblas konvinki la Fondaĵon! Necesas, ke ĝi aŭdu fortan voĉon de la komunumo, kiu volas tion! La '''28-an de Julio 2021 je 15:00 UTK''' okazos komunuma konsulto pri la Jara plano, specife pri ĝia teĥnika parto. Por helpi al mallokaj ŝablonoj '''[[:meta:Wikimedia Foundation Medium-term plan 2019/Annual Plan 2021-2022/eo#Konversacioj pri Jara plano|petu partoprenon kaj esprimu vian volon]]''' (eĉ se nur en la babilejo kaj nur en Esperanto kaj / aŭ aliaj lingvoj, kiujn vi regas)! Vi tute bone povas antaŭ la voko sendi retmesaĝon kun via demando pri mallokaj ŝablonoj (aŭ alia emo pri kiu vi interesiĝas). --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 15:40, 27 jul. 2021 (UTC)
== Subvencio petita por konkurso Amerika monato 2021. Bv. subteni! ==
Saluton karaj! Por Oktobro 2021 estas planata artikol-verka konkurso Amerika monato. Krom kutima konkursado inter kontribuantoj ni ĉi-foje ankaŭ provos atentigi organizantojn de Esperantaj renkontiĝoj pri ebloj de Vikivojaĝo, cele ke ili mem uzadu Vikivojaĝon por siaj sekvaj renkontiĝoj.
Por provizi premiojn por venkintoj ni petis subvencion de la Fondaĵo Vikimedio. Bonvolu rigardi ĝin kaj, se vi ŝatas kaj subtenas, skribu vian koncizan subtenan mesaĝon tute sube en la sekcio "Endorsements" (vi povas ankaŭ en Esperanto). Subteno de komunumo estas unu el kriterioj por akcepti subvenci-peton.
<big>'''[[:meta:Grants:Project/Rapid/UG_ELiSo/American_month_2021#Endorsements|Bv. subteni la subvenci-peton.]]'''</big>
Amike, [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 13:39, 16 aŭg. 2021 (UTC)
== The 2022 Community Wishlist Survey will happen in January ==
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr">
Hello everyone,
We hope all of you are as well and safe as possible during these trying times! We wanted to share some news about a change to the Community Wishlist Survey 2022. We would like to hear your opinions as well.
Summary:
<div style="font-style:italic;">
We will be running the [[m:Special:MyLanguage/Community Wishlist Survey|Community Wishlist Survey]] 2022 in January 2022. We need more time to work on the 2021 wishes. We also need time to prepare some changes to the Wishlist 2022. In the meantime, you can use a [[m:Special:MyLanguage/Community Wishlist Survey/Sandbox|dedicated sandbox to leave early ideas for the 2022 wishes]].
</div>
=== Proposing and wish-fulfillment will happen during the same year ===
In the past, the [[m:Special:MyLanguage/Community Tech|Community Tech]] team has run the Community Wishlist Survey for the following year in November of the prior year. For example, we ran the [[m:Special:MyLanguage/Community Wishlist Survey 2021|Wishlist for 2021]] in November 2020. That worked well a few years ago. At that time, we used to start working on the Wishlist soon after the results of the voting were published.
However, in 2021, there was a delay between the voting and the time when we could start working on the new wishes. Until July 2021, we were working on wishes from the [[m:Special:MyLanguage/Community Wishlist Survey 2020|Wishlist for 2020]].
We hope having the Wishlist 2022 in January 2022 will be more intuitive. This will also give us time to fulfill more wishes from the 2021 Wishlist.
=== Encouraging wider participation from historically excluded communities ===
We are thinking how to make the Wishlist easier to participate in. We want to support more translations, and encourage under-resourced communities to be more active. We would like to have some time to make these changes.
=== A new space to talk to us about priorities and wishes not granted yet ===
We will have gone 365 days without a Wishlist. We encourage you to approach us. We hope to hear from you in the [[m:Special:MyLanguage/Talk:Community Wishlist Survey|talk page]], but we also hope to see you at our bi-monthly Talk to Us meetings! These will be hosted at two different times friendly to time zones around the globe.
We will begin our first meeting '''September 15th at 23:00 UTC'''. More details about the agenda and format coming soon!
=== Brainstorm and draft proposals before the proposal phase ===
If you have early ideas for wishes, you can use the [[m:Special:MyLanguage/Community Wishlist Survey/Sandbox|new Community Wishlist Survey sandbox]]. This way, you will not forget about these before January 2022. You will be able to come back and refine your ideas. Remember, edits in the sandbox don't count as wishes!
=== Feedback ===
* What should we do to improve the Wishlist pages?
* How would you like to use our new [[m:Special:MyLanguage/Community Wishlist Survey/Sandbox|sandbox?]]
* What, if any, risks do you foresee in our decision to change the date of the Wishlist 2022?
* What will help more people participate in the Wishlist 2022?
Answer on the [[m:Special:MyLanguage/Talk:Community Wishlist Survey|talk page]] (in any language you prefer) or at our Talk to Us meetings.
</div>
[[user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[user talk:SGrabarczuk (WMF)|talk]]) 00:23, 7 sep. 2021 (UTC)
<!-- Message sent by User:SGrabarczuk (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21980442 -->
== Server switch ==
<div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|Legu ĉi tiun mesaĝon en Esperanto]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
The [[foundation:|Wikimedia Foundation]] tests the switch between its first and secondary data centers. This will make sure that Wikipedia and the other Wikimedia wikis can stay online even after a disaster. To make sure everything is working, the Wikimedia Technology department needs to do a planned test. This test will show if they can reliably switch from one data centre to the other. It requires many teams to prepare for the test and to be available to fix any unexpected problems.
They will switch all traffic back to the primary data center on '''Tuesday, 14 September 2021'''.
Unfortunately, because of some limitations in [[mw:Manual:What is MediaWiki?|MediaWiki]], all editing must stop while the switch is made. We apologize for this disruption, and we are working to minimize it in the future.
'''You will be able to read, but not edit, all wikis for a short period of time.'''
*You will not be able to edit for up to an hour on Tuesday, 14 September 2021. The test will start at [https://zonestamp.toolforge.org/1631628049 14:00 UTC] (07:00 PDT, 10:00 EDT, 15:00 WEST/BST, 16:00 CEST, 19:30 IST, 23:00 JST, and in New Zealand at 02:00 NZST on Wednesday, 15 September).
*If you try to edit or save during these times, you will see an error message. We hope that no edits will be lost during these minutes, but we can't guarantee it. If you see the error message, then please wait until everything is back to normal. Then you should be able to save your edit. But, we recommend that you make a copy of your changes first, just in case.
''Other effects'':
*Background jobs will be slower and some may be dropped. Red links might not be updated as quickly as normal. If you create an article that is already linked somewhere else, the link will stay red longer than usual. Some long-running scripts will have to be stopped.
* We expect the code deployments to happen as any other week. However, some case-by-case code freezes could punctually happen if the operation require them afterwards.
This project may be postponed if necessary. You can [[wikitech:Switch_Datacenter|read the schedule at wikitech.wikimedia.org]]. Any changes will be announced in the schedule. There will be more notifications about this. A banner will be displayed on all wikis 30 minutes before this operation happens. '''Please share this information with your community.'''</div></div> [[user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[user talk:SGrabarczuk (WMF)|<span class="signature-talk">{{int:Talkpagelinktext}}</span>]]) 00:46, 11 sep. 2021 (UTC)
<!-- Message sent by User:SGrabarczuk (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21980442 -->
== Talk to the Community Tech ==
[[File:Magic Wand Icon 229981 Color Flipped.svg|{{dir|{{pagelang}}|left|right}}|frameless|50px]]
[[:m:Special:MyLanguage/Community Wishlist Survey/Updates/2021-09 Talk to Us|Read this message in another language]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Community_Wishlist_Survey/Updates/2021-09_Talk_to_Us&language=&action=page&filter= {{int:please-translate}}]
Hello!
As we have [[m:Special:MyLanguage/Community Wishlist Survey/Updates|recently announced]], we, the team working on the [[m:Special:MyLanguage/Community Wishlist Survey|Community Wishlist Survey]], would like to invite you to an online meeting with us. It will take place on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20210915T2300 '''September 15th, 23:00 UTC'''] on Zoom, and will last an hour. [https://wikimedia.zoom.us/j/89828615390 '''Click here to join'''].
'''Agenda'''
* [[m:Special:MyLanguage/Community Wishlist Survey 2021/Status report 1#Prioritization Process|How we prioritize the wishes to be granted]]
* [[m:Special:MyLanguage/Community Wishlist Survey/Updates|Why we decided to change the date]] from November 2021 to January 2022
* Update on the [[m:Special:MyLanguage/Community Wishlist Survey 2021/Warn when linking to disambiguation pages|disambiguation]] and the [[m:Special:MyLanguage/Community Wishlist Survey 2021/Real Time Preview for Wikitext|real-time preview]] wishes
* Questions and answers
'''Format'''
The meeting will not be recorded or streamed. Notes without attribution will be taken and published on Meta-Wiki. The presentation (first three points in the agenda) will be given in English.
We can answer questions asked in English, French, Polish, and Spanish. If you would like to ask questions in advance, add them [[m:Talk:Community Wishlist Survey|on the Community Wishlist Survey talk page]] or send to sgrabarczuk@wikimedia.org.
[[m:Special:MyLanguage/User:NRodriguez (WMF)|Natalia Rodriguez]] (the [[m:Special:MyLanguage/Community Tech|Community Tech]] manager) will be hosting this meeting.
'''Invitation link'''
* [https://wikimedia.zoom.us/j/89828615390 Join online]
* Meeting ID: 898 2861 5390
* One tap mobile
** +16465588656,,89828615390# US (New York)
** +16699006833,,89828615390# US (San Jose)
* [https://wikimedia.zoom.us/u/kctR45AI8o Dial by your location]
See you! [[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|<span class="signature-talk">{{int:Talkpagelinktext}}</span>]]) 03:04, 11 sep. 2021 (UTC)
<!-- Message sent by User:SGrabarczuk (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=21980442 -->
== Voting for the election for the members for the Movement Charter drafting committee is now open ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content"/>
:''<div class="plainlinks">[[m:Special:MyLanguage/Movement Charter/Drafting Committee/MCDC Voter Email short 12-10-2021|{{int:otherlanguages}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/MCDC Voter Email short 12-10-2021}}&language=&action=page&filter= {{int:please-translate}}]''</div>
Voting for the election for the members for the Movement Charter drafting committee is now open. In total, 70 Wikimedians from around the world are running for 7 seats in these elections.
'''Voting is open from October 12 to October 24, 2021.'''
The committee will consist of 15 members in total: The online communities vote for 7 members, 6 members will be selected by the Wikimedia affiliates through a parallel process, and 2 members will be appointed by the Wikimedia Foundation. The plan is to assemble the committee by November 1, 2021.
Learn about each candidate to inform your vote in the language that you prefer: <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates>
Learn about the Drafting Committee: <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee>
We are piloting a voting advice application for this election. Click yourself through the tool and you will see which candidate is closest to you! Check at <https://mcdc-election-compass.toolforge.org/>
Read the full announcement: <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee/Elections>
'''Go vote at SecurePoll on:''' <https://meta.wikimedia.org/wiki/Special:MyLanguage/Movement_Charter/Drafting_Committee/Elections>
Best,
Movement Strategy & Governance Team, Wikimedia Foundation
<section end="announcement-content"/>
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 02:04, 14 okt. 2021 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Xeno_(WMF)/Delivery/Wikivoyage&oldid=22185689 -->
== Kiu skemo por landoj en federaciaj landoj? ==
Nia nuntempa sistemo de skemoj ([[Helpo:Krei paĝon#Skemoj de artikoloj]]) sufiĉe bone funkcias por situacioj, kiam lando ne havas aparte fortajn administrajn unuojn. Sed nun (pro la konkurso [[Vikivojaĝo:Amerika monato 2021|Amerika monato 2021]] - parenteze, partoprenu {{R|;-)}}) mi iom pli okupiĝas pri Usono, kiu estas federacia (kaj samo ŝajne validus por aliaj federaciaj landoj).
Mia demando estas: ''ĉu unuopajn ŝtatojn de Usono ni traktu kiel [[Vikivojaĝo:Skemo por lando|landojn]] aŭ kiel [[Vikivojaĝo:Skemo por regiono|regionojn]]?''
Ambaŭ sencas, sed neniu plene. Ĉu iuj sugestoj? --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 12:49, 17 okt. 2021 (UTC)
== Learn how Movement Strategy Implementation Grants can support your Movement Strategy plans ==
<section begin="announcement-content"/>Movement Strategy Implementation grants now provide more than $2,000 USD to put Movement Strategy plans into action. Find out more about [[:m:Special:MyLanguage/Grants:MSIG/About|Movement Strategy Implementation grants, the criteria, and how to apply]].<section end="annoumcent-content"/>
[[User:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] ([[User talk:MNadzikiewicz (WMF)#top|talk]]) 13:30, 29 October 2021 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:MNadzikiewicz_(WMF)/Delivery&oldid=22247589 -->
== Meet the new Movement Charter Drafting Committee members ==
<section begin="announcement-content"/>
:''<div class="plainlinks">[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Elections/Results/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/Elections/Results/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
The Movement Charter Drafting Committee election and selection processes are complete.
* The [[m:Special:MyLanguage/Movement Charter/Drafting Committee/Elections/Results|election results have been published]]. 1018 participants voted to elect seven members to the committee: '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Richard_Knipel_(Pharos)|Richard Knipel (Pharos)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Anne_Clin_(Risker)|Anne Clin (Risker)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Alice_Wiegand_(lyzzy)|Alice Wiegand (Lyzzy)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Micha%C5%82_Buczy%C5%84ski_(Aegis_Maelstrom)|Michał Buczyński (Aegis Maelstrom)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Richard_(Nosebagbear)|Richard (Nosebagbear)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Ravan_J_Al-Taie_(Ravan)|Ravan J Al-Taie (Ravan)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Ciell_(Ciell)|Ciell (Ciell)]]'''.
* The [[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Affiliate-chosen_members|affiliate process]] has selected six members: '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Anass_Sedrati_(Anass_Sedrati)|Anass Sedrati (Anass Sedrati)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#%C3%89rica_Azzellini_(EricaAzzellini)|Érica Azzellini (EricaAzzellini)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Jamie_Li-Yun_Lin_(Li-Yun_Lin)|Jamie Li-Yun Lin (Li-Yun Lin)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Georges_Fodouop_(Geugeor)|Georges Fodouop (Geugeor)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Manavpreet_Kaur_(Manavpreet_Kaur)|Manavpreet Kaur (Manavpreet Kaur)]]''', '''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Candidates#Pepe_Flores_(Padaguan)|Pepe Flores (Padaguan)]]'''.
* The Wikimedia Foundation has [[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Wikimedia_Foundation-chosen_members|appointed]] two members: '''[[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Runa_Bhattacharjee_(Runab_WMF)|Runa Bhattacharjee (Runab WMF)]]''', '''[[m:Special:MyLanguage/Movement_Charter/Drafting_Committee/Candidates#Jorge_Vargas_(JVargas_(WMF))|Jorge Vargas (JVargas (WMF))]]'''.
The committee will convene soon to start its work. The committee can appoint up to three more members to bridge diversity and expertise gaps.
If you are interested in engaging with [[m:Special:MyLanguage/Movement Charter|Movement Charter]] drafting process, follow the updates [[m:Special:MyLanguage/Movement Charter/Drafting Committee|on Meta]] and join the [https://t.me/joinchat/U-4hhWtndBjhzmSf Telegram group].
With thanks from the Movement Strategy and Governance team<section end="announcement-content"/>
15:53, 5 nov. 2021 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:MNadzikiewicz_(WMF)/Delivery&oldid=22300322 -->
== Kunfestu la 20-an naskiĝtagon de la Esperanta Vikipedio! ==
[[Dosiero:Wikipedia20 custom mark.svg|300px|center|link=https://esperanto.wiki/projektoj/vikifesto-2021]]
La Esperanta Vikipedio estis fondita antaŭ 20 jaroj, do ĉi-jare ni festas rondan "naskiĝtagon"!
Kaj ni volas festi ĝin kun vi! La organizo Esperanto kaj Libera Scio / Vikimedio EO tial organizas '''''VikiFeston''''' por la 18-a de Decembro 2021, do jam tre baldaŭ!
La festo estor virtuala (por ebligi tutmondan partoprenon) kaj senpaga (kvankam ni instigas al donacoj ;). Ankoraŭ vi povas proponi programeron (aparte se ĝi estas festa / amuza)! La festo okazas kun la subtitolo “''Preter 20 jaroj de la Esperanta Vikipedio''“, do ĝi temos ankaŭ pri aliaj projektoj kaj estonteco.
<span style="font-size: 120%;">'''[https://esperanto.wiki/projektoj/vikifesto-2021 Aliĝu tuj senpage]'''</span> por povi partopreni! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 14:35, 16 dec. 2021 (UTC)
== Upcoming Call for Feedback about the Board of Trustees elections ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content />
:''You can find this message translated into additional languages on Meta-wiki.''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback:2022 Board of Trustees election/Upcoming Call for Feedback about the Board of Trustees elections|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board of Trustees/Call for feedback:2022 Board of Trustees election/Upcoming Call for Feedback about the Board of Trustees elections}}&language=&action=page&filter= {{int:please-translate}}]</div>''
The Board of Trustees is preparing a call for feedback about the upcoming Board Elections, from January 7 - February 10, 2022.
While details will be finalized the week before the call, we have confirmed at least two questions that will be asked during this call for feedback:
* What is the best way to ensure fair representation of emerging communities among the Board?
* What involvement should candidates have during the election?
While additional questions may be added, the Movement Strategy and Governance team wants to provide time for community members and affiliates to consider and prepare ideas on the confirmed questions before the call opens. We apologize for not having a complete list of questions at this time. The list of questions should only grow by one or two questions. The intention is to not overwhelm the community with requests, but provide notice and welcome feedback on these important questions.
'''Do you want to help organize local conversation during this Call?'''
Contact the [[m:Special:MyLanguage/Movement Strategy and Governance|Movement Strategy and Governance team]] on Meta, on [https://t.me/wmboardgovernancechat Telegram], or via email at msg[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org.
Reach out if you have any questions or concerns. The Movement Strategy and Governance team will be minimally staffed until January 3. Please excuse any delayed response during this time. We also recognize some community members and affiliates are offline during the December holidays. We apologize if our message has reached you while you are on holiday.
Best,
Movement Strategy and Governance<section end="announcement-content" />
</div>
{{int:thank-you}} [[User:Xeno (WMF)|Xeno (WMF)]] 17:25, 27 dec. 2021 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery/Wikivoyage&oldid=22502624 -->
== Wiki Loves Folklore is back! ==
<div lang="en" dir="ltr" class="mw-content-ltr">
{{int:please-translate}}
[[File:Wiki Loves Folklore Logo.svg|right|150px|frameless]]
You are humbly invited to participate in the '''[[:c:Commons:Wiki Loves Folklore 2022|Wiki Loves Folklore 2022]]''' an international photography contest organized on Wikimedia Commons to document folklore and intangible cultural heritage from different regions, including, folk creative activities and many more. It is held every year from the '''1st till the 28th''' of February.
You can help in enriching the folklore documentation on Commons from your region by taking photos, audios, videos, and [https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&campaign=wlf_2022 submitting] them in this commons contest.
You can also [[:c:Commons:Wiki Loves Folklore 2022/Organize|organize a local contest]] in your country and support us in translating the [[:c:Commons:Wiki Loves Folklore 2022/Translations|project pages]] to help us spread the word in your native language.
Feel free to contact us on our [[:c:Commons talk:Wiki Loves Folklore 2022|project Talk page]] if you need any assistance.
'''Kind regards,'''
'''Wiki loves Folklore International Team'''
--[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 13:14, 9 jan. 2022 (UTC)
</div>
<!-- Message sent by User:Tiven2240@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Tiven2240/wlf&oldid=22560402 -->
== Call for Feedback about the Board of Trustees elections is now open ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />:''[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback about the Board of Trustees elections is now open/Short|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback about the Board of Trustees elections is now open/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections/Call for Feedback about the Board of Trustees elections is now open/Short}}&language=&action=page&filter= {{int:please-translate}}]</div>''
The Call for Feedback: Board of Trustees elections is now open and will close on 7 February 2022.
With this Call for Feedback, the Movement Strategy and Governance team is taking a different approach. This approach incorporates community feedback from 2021. Instead of leading with proposals, the Call is framed around key questions from the Board of Trustees. The key questions came from the feedback about the 2021 Board of Trustees election. The intention is to inspire collective conversation and collaborative proposal development about these key questions.
[[m:Special:MyLanguage/Wikimedia Foundation Board of Trustees/Call for feedback: Board of Trustees elections|Join the conversation.]]
Best,
Movement Strategy and Governance<section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 00:34, 15 jan. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery/Wikivoyage&oldid=22610079 -->
== Subscribe to the This Month in Education newsletter - learn from others and share your stories ==
<div lang="en" dir="ltr" class="mw-content-ltr">
Dear community members,
Greetings from the EWOC Newsletter team and the education team at Wikimedia Foundation. We are very excited to share that we on tenth years of Education Newsletter ([[m:Education/News|This Month in Education]]) invite you to join us by [[m:Global message delivery/Targets/This Month in Education|subscribing to the newsletter on your talk page]] or by [[m:Education/News/Newsroom|sharing your activities in the upcoming newsletters]]. The Wikimedia Education newsletter is a monthly newsletter that collects articles written by community members using Wikimedia projects in education around the world, and it is published by the EWOC Newsletter team in collaboration with the Education team. These stories can bring you new ideas to try, valuable insights about the success and challenges of our community members in running education programs in their context.
If your affiliate/language project is developing its own education initiatives, please remember to take advantage of this newsletter to publish your stories with the wider movement that shares your passion for education. You can submit newsletter articles in your own language or submit bilingual articles for the education newsletter. For the month of January the deadline to submit articles is on the 20th January. We look forward to reading your stories.
Older versions of this newsletter can be found in the [[outreach:Education/Newsletter/Archives|complete archive]].
More information about the newsletter can be found at [[m:Education/News/Publication Guidelines|Education/Newsletter/About]].
For more information, please contact spatnaik{{@}}wikimedia.org.
------
<div style="text-align: center;"><div style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;">[[m:Education/Newsletter/About|About ''This Month in Education'']] · [[m:Global message delivery/Targets/This Month in Education|Subscribe/Unsubscribe]] · [[m:MassMessage|Global message delivery]] · For the team: [[User:ZI Jony|<span style="color:#8B0000">'''ZI Jony'''</span>]] [[User talk:ZI Jony|<sup><span style="color:Green"><i>(Talk)</i></span></sup>]], {{<includeonly>subst:</includeonly>#time:l G:i, d F Y|}} (UTC)</div></div>
</div>
<!-- Message sent by User:ZI Jony@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:ZI_Jony/MassMessage/Awareness_of_Education_Newsletter/List_of_Village_Pumps&oldid=21244129 -->
== Movement Strategy and Governance News – Issue 5 ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="ucoc-newsletter"/>
:''<div class="plainlinks">[[m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5/Global message|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Strategy and Governance/Newsletter/5/Global message}}&language=&action=page&filter= {{int:please-translate}}]</div>''
<span style="font-size:200%;">'''Movement Strategy and Governance News'''</span><br>
<span style="font-size:120%; color:#404040;">'''Issue 5, January 2022'''</span><span style="font-size:120%; float:right;">[[m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5|'''Read the full newsletter''']]</span>
----
Welcome to the fifth issue of Movement Strategy and Governance News (formerly known as Universal Code of Conduct News)! This revamped newsletter distributes relevant news and events about the Movement Charter, Universal Code of Conduct, Movement Strategy Implementation grants, Board elections and other relevant MSG topics.
This Newsletter will be distributed quarterly, while more frequent Updates will also be delivered weekly or bi-weekly to subscribers. Please remember to subscribe [[:m:Special:MyLanguage/Global message delivery/Targets/MSG Newsletter Subscription|here]] if you would like to receive these updates.
<div style="margin-top:3px; padding:10px 10px 10px 20px; background:#fffff; border:2px solid #808080; border-radius:4px; font-size:100%;">
*'''Call for Feedback about the Board elections''' - We invite you to give your feedback on the upcoming WMF Board of Trustees election. This call for feedback went live on 10th January 2022 and will be concluded on 16th February 2022. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Call for Feedback about the Board elections|continue reading]])
*'''Universal Code of Conduct Ratification''' - In 2021, the WMF asked communities about how to enforce the Universal Code of Conduct policy text. The revised draft of the enforcement guidelines should be ready for community vote in March. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Universal Code of Conduct Ratification|continue reading]])
*'''Movement Strategy Implementation Grants''' - As we continue to review several interesting proposals, we encourage and welcome more proposals and ideas that target a specific initiative from the Movement Strategy recommendations. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Movement Strategy Implementation Grants|continue reading]])
*'''The New Direction for the Newsletter''' - As the UCoC Newsletter transitions into MSG Newsletter, join the facilitation team in envisioning and deciding on the new directions for this newsletter. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#The New Direction for the Newsletter|continue reading]])
*'''Diff Blogs''' - Check out the most recent publications about MSG on Wikimedia Diff. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/5#Diff Blogs|continue reading]])</div><section end="ucoc-newsletter"/>
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 03:14, 29 jan. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery/Wikivoyage&oldid=22610079 -->
=== Updates on the Universal Code of Conduct Enforcement Guidelines Review ===
Hello, I have an update on the vote on the enforcement guidelines that was mentioned above. [[Uzanto:Xeno (WMF)|Xeno (WMF)]] ([[Uzanto-Diskuto:Xeno (WMF)|diskuto]]) 02:56, 4 feb. 2022 (UTC)
----
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/2022-02-02 Announcement/Short|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/2022-02-02 Announcement/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/2022-02-02 Announcement/Short}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello everyone,
The '''[[m:Universal Code of Conduct/Enforcement guidelines|Universal Code of Conduct (UCoC) Enforcement Guidelines]]''' were published 24 January 2022 as a proposed way to apply the [[m:Universal Code of Conduct|Universal Code of Conduct]] across the movement. Comments about the guidelines can be shared here or [[m:Talk:Universal Code of Conduct/Enforcement guidelines|the Meta-wiki talk page]].
There will be conversations on Zoom on 4 February 2022 at 15:00 UTC, 25 February 2022 at 12:00 UTC, and 4 March 2022 at 15:00 UTC. '''[[m:Special:MyLanguage/Universal Code of Conduct/Conversations|Join the UCoC project team and drafting committee members to discuss the guidelines and voting process]].'''
The [[m:Universal Code of Conduct/Project#Timeline|timeline is available on Meta-wiki]]. The voting period is March 7 to 21. '''[[m:Universal Code of Conduct/Enforcement guidelines/Voting|See the voting information page for more details]].'''
Thank you to everyone who has participated so far.
Sincerely,
Movement Strategy and Governance<br/>
Wikimedia Foundation<section end="announcement-content" />
== <span lang="en" dir="ltr" class="mw-content-ltr">Leadership Development Task Force: Your feedback is appreciated</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />:''[[m:Special:MyLanguage/Leadership Development Task Force/Call for Feedback Announcement|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Leadership Development Task Force/Call for Feedback Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Leadership Development Task Force/Call for Feedback Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
The Community Development team at the Wikimedia Foundation is supporting the creation of a global, community-driven Leadership Development Task Force. The purpose of the task force is to advise leadership development work.
The team is looking for feedback about the responsibilities of the Leadership Development Task Force. This Meta page shares the proposal for a [[m:Special:MyLanguage/Leadership Development Task Force|Leadership Development Task Force]] and how [[m:Special:MyLanguage/Leadership Development Task Force/Participate|you can help.]] Feedback on the proposal will be collected from 7 to 25 February 2022.<section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 00:45, 9 feb. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery/Wikivoyage&oldid=22796516 -->
== Wiki Loves Folklore is extended till 15th March ==
<div lang="en" dir="ltr" class="mw-content-ltr">{{int:please-translate}}
[[File:Wiki Loves Folklore Logo.svg|right|frameless|180px]]
Greetings from Wiki Loves Folklore International Team,
We are pleased to inform you that [[:c:Commons:Wiki Loves Folklore|Wiki Loves Folklore]] an international photographic contest on Wikimedia Commons has been extended till the '''15th of March 2022'''. The scope of the contest is focused on folk culture of different regions on categories, such as, but not limited to, folk festivals, folk dances, folk music, folk activities, etc.
We would like to have your immense participation in the photographic contest to document your local Folk culture on Wikipedia. You can also help with the [[:c:Commons:Wiki Loves Folklore 2022/Translations|translation]] of project pages and share a word in your local language.
Best wishes,
'''International Team'''<br />
'''Wiki Loves Folklore'''
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 04:50, 22 feb. 2022 (UTC)
</div>
<!-- Message sent by User:Rockpeterson@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=22754428 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Remember to Participate in the UCoC Conversations and Ratification Vote!</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Universal Code of Conduct/Enforcement guidelines/Voting/Announcement|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Voting/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello everyone,
A [[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voting|'''vote in SecurePoll from 7 to 21 March 2022''']] is scheduled as part of the ratification process for the Universal Code of Conduct (UCoC) Enforcement guidelines. Eligible voters are invited to answer a poll question and share comments. [[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voter_information|Read voter information and eligibility details.]] During the poll, voters will be asked if they support the enforcement of the Universal Code of Conduct based on the proposed guidelines.
The [[m:Special:MyLanguage/Universal Code of Conduct|Universal Code of Conduct]] (UCoC) provides a baseline of acceptable behavior for the entire movement. The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines|revised enforcement guidelines]] were published 24 January 2022 as a proposed way to apply the policy across the movement. A [[m:Special:MyLanguage/Wikimedia_Foundation_Board_noticeboard/January_2022_-_Board_of_Trustees_on_Community_ratification_of_enforcement_guidelines_of_UCoC|Wikimedia Foundation Board statement]] calls for a [[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voting|ratification process]] where eligible voters will have an opportunity to support or oppose the adoption of the UCoC Enforcement guidelines in a vote. Wikimedians are invited to [[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Voter_information/Volunteer|translate and share important information]]. For more information about the UCoC, please see the [[m:Special:MyLanguage/Universal Code of Conduct/Project|project page]] and [[m:Special:MyLanguage/Universal Code of Conduct/FAQ|frequently asked questions]] on Meta-wiki.
There are events scheduled to learn more and discuss:
* A [[m:Special:MyLanguage/Universal_Code_of_Conduct/Conversations/Panel_Q&A|community panel]] recorded on 18 February 2022 shares perspectives from small- and medium-sized community participants.
* The [[m:Movement Strategy and Governance|Movement Strategy and Governance]] (MSG) team is hosting Conversation Hours on 4 March 2022 at 15:00 UTC. Please [[m:Special:MyLanguage/Universal_Code_of_Conduct/Conversations|'''sign-up''']] to interact with the project team and the drafting committee about the updated enforcement guidelines and the ratification process. See the [[m:Special:MyLanguage/Universal_Code_of_Conduct/2022_conversation_hour_summaries|Conversation Hour summaries]] for notes from 4 February 2022 and 25 February 2022.
You can comment on Meta-wiki talk pages in any language. You may also contact either team by email: msg[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org or ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org
Sincerely,
Movement Strategy and Governance <br />
Wikimedia Foundation <br /><section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 02:17, 2 mar. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=22916674 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Universal Code of Conduct Enforcement guidelines ratification voting open from 7 to 21 March 2022</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote|You can find this message translated into additional languages on Meta-wiki.]]
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Vote}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello everyone,
The ratification voting process for the [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines|revised enforcement guidelines]] of the [[m:Special:MyLanguage/Universal Code of Conduct|Universal Code of Conduct]] (UCoC) is now open! '''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting|Voting commenced on SecurePoll]]''' on 7 March 2022 and will conclude on 21 March 2022. Please [[m:Universal Code of Conduct/Enforcement guidelines/Voter information|read more on the voter information and eligibility details]].
The Universal Code of Conduct (UCoC) provides a baseline of acceptable behavior for the entire movement. The revised enforcement guidelines were published 24 January 2022 as a proposed way to apply the policy across the movement. You can [[m:Special:MyLanguage/Universal Code of Conduct/Project|read more about the UCoC project]].
You can also comment on Meta-wiki talk pages in any language. You may also contact the team by email: ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org
Sincerely,
Movement Strategy and Governance
Wikimedia Foundation<section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 00:52, 8 mar. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=22962850 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Invitation to Hubs event: Global Conversation on 2022-03-12 at 13:00 UTC</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />Hello!
The Movement Strategy and Governance team of the Wikimedia Foundation would like to invite you to the next event about "Regional and Thematic Hubs". The Wikimedia Movement is in the process of understanding what Regional and Thematic Hubs should be. Our workshop in November was a good start ([[m:Special:MyLanguage/Hubs/Documentation/27 November Workshop|read the report]]), but we're not finished yet.
Over the last weeks we conducted about 16 interviews with groups working on establishing a Hub in their context ([[m:Special:MyLanguage/Hubs/Dialogue|see Hubs Dialogue]]). These interviews informed a report that will serve as a foundation for discussion on March 12. The report is planned to be published on March 9.
The event will take place on March 12, 13:00 to 16:00 UTC on Zoom. Interpretation will be provided in French, Spanish, Arabic, Russian, and Portuguese. Registration is open, and will close on March 10. Anyone interested in the topic is invited to join us. '''[[m:Special:MyLanguage/Hubs/Global Conversations March 12, 2022|More information on the event on Meta-wiki]]'''.
Best regards,
[[m:User:KVaidla (WMF)|Kaarel Vaidla]]<br />Movement Strategy
<section end="announcement-content" />
</div>
01:31, 10 mar. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=22974079 -->
== Wiki Loves Folklore 2022 ends tomorrow ==
[[File:Wiki Loves Folklore Logo.svg|right|frameless|180px]]
International photographic contest [[:c:Commons:Wiki Loves Folklore 2022| Wiki Loves Folklore 2022]] ends on 15th March 2022 23:59:59 UTC. This is the last chance of the year to upload images about local folk culture, festival, cuisine, costume, folklore etc on Wikimedia Commons. Watch out our social media handles for regular updates and declaration of Winners.
([https://www.facebook.com/WikiLovesFolklore/ Facebook] , [https://twitter.com/WikiFolklore Twitter ] , [https://www.instagram.com/wikilovesfolklore/ Instagram])
The writing competition Feminism and Folklore will run till 31st of March 2022 23:59:59 UTC. Write about your local folk tradition, women, folk festivals, folk dances, folk music, folk activities, folk games, folk cuisine, folk wear, folklore, and tradition, including ballads, folktales, fairy tales, legends, traditional song and dance, folk plays, games, seasonal events, calendar customs, folk arts, folk religion, mythology etc. on your local Wikipedia. Check if your [[:m:Feminism and Folklore 2022/Project Page|local Wikipedia is participating]]
A special competition called '''Wiki Loves Falles''' is organised in Spain and the world during 15th March 2022 till 15th April 2022 to document local folk culture and [[:en:Falles|Falles]] in Valencia, Spain. Learn more about it on [[:ca:Viquiprojecte:Falles 2022|Catalan Wikipedia project page]].
We look forward for your immense co-operation.
Thanks
Wiki Loves Folklore international Team
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 14:41, 14 mar. 2022 (UTC)
<!-- Message sent by User:Rockpeterson@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=22754428 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Leadership Development Working Group: Apply to join! (14 March to 10 April 2022)</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Leadership Development Working Group/Participate/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Leadership Development Working Group/Participate/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello everyone,
Thank you to everyone who participated in the feedback period for the [[m:Special:MyLanguage/Leadership Development Working Group|Leadership Development Working Group]] initiative. A [[m:Special:MyLanguage/Leadership Development Working Group/Participate#5. Summary of Call for Feedback|summary of the feedback]] can be found on Meta-wiki. This feedback will be shared with the working group to inform their work. The application period to join the Working Group is now open and will close on April 10, 2022. Please [[m:Special:MyLanguage/Leadership_Development_Working_Group/Purpose_and_Structure#3._How_is_the_working_group_formed_and_structured?|review the information about the working group]], share with community members who might be interested, and '''[[m:Special:MyLanguage/Leadership_Development_Working_Group/Participate#1._How_to_participate|apply if you are interested]]'''.
Thank you,
From the Community Development team<br /><section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 02:20, 18 mar. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=22974079 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Universal Code of Conduct Enforcement guidelines ratification voting is now closed</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote/Closing message|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Vote/Closing message|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Vote/Closing message}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Greetings,
The ratification voting process for the [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines|revised enforcement guidelines]] of the [[m:Special:MyLanguage/Universal Code of Conduct|Universal Code of Conduct]] (UCoC) came to a close on 21 March 2022. Over {{#expr:2300}} Wikimedians voted across different regions of our movement. Thank you to everyone who participated in this process! The scrutinizing group is now reviewing the vote for accuracy, so please allow up to two weeks for them to finish their work.
The final results from the voting process will be announced [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voting/Results|here]], along with the relevant statistics and a summary of comments as soon as they are available. Please check out [[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Voter information|the voter information page]] to learn about the next steps. You can comment on the project talk page [[m:Talk:Universal Code of Conduct/Enforcement guidelines|on Meta-wiki]] in any language. You may also contact the UCoC project team by email: ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org
Best regards,
Movement Strategy and Governance<br /><section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 01:53, 30 mar. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23079949 -->
== Rekandidatiĝo de KuboF Hromoslav por administranto ==
Karaj, ĉar ni estas eta projekto, administrantoj estas elektataj nur por 1 jaro. Tiu periodo por mi jam pasis, kaj tial mi aŭtomate perdis administrajn rajtojn.
Nun mi denove kandidatiĝas kaj petas vian subtenon: '''[[Vikivojaĝo:Administrantigo/KuboF Hromoslav (2)]]'''
Antaŭdankon! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 20:33, 3 apr. 2022 (UTC)
== <span lang="en" dir="ltr" class="mw-content-ltr">Movement Strategy and Governance News – Issue 6</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="msg-newsletter"/>
<div style = "line-height: 1.2">
<span style="font-size:200%;">'''Movement Strategy and Governance News'''</span><br>
<span style="font-size:120%; color:#404040;">'''Issue 6, April 2022'''</span><span style="font-size:120%; float:right;">[[m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6|'''Read the full newsletter''']]</span>
----
Welcome to the sixth issue of Movement Strategy and Governance News! This revamped newsletter distributes relevant news and events about the Movement Charter, Universal Code of Conduct, Movement Strategy Implementation grants, Board of trustees elections and other relevant MSG topics.
This Newsletter will be distributed quarterly, while the more frequent Updates will also be delivered weekly. Please remember to subscribe [[m:Special:MyLanguage/Global message delivery/Targets/MSG Newsletter Subscription|here]] if you would like to receive future issues of this newsletter.
</div><div style="margin-top:3px; padding:10px 10px 10px 20px; background:#fffff; border:2px solid #808080; border-radius:4px; font-size:100%;">
*'''Leadership Development -''' A Working Group is Forming! - The application to join the Leadership Development Working Group closed on April 10th, 2022, and up to 12 community members will be selected to participate in the working group. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A1|continue reading]])
*'''Universal Code of Conduct Ratification Results are out! -''' The global decision process on the enforcement of the UCoC via SecurePoll was held from 7 to 21 March. Over 2,300 eligible voters from at least 128 different home projects submitted their opinions and comments. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A2|continue reading]])
*'''Movement Discussions on Hubs -''' The Global Conversation event on Regional and Thematic Hubs was held on Saturday, March 12, and was attended by 84 diverse Wikimedians from across the movement. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A3|continue reading]])
*'''Movement Strategy Grants Remain Open! -''' Since the start of the year, six proposals with a total value of about $80,000 USD have been approved. Do you have a movement strategy project idea? Reach out to us! ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A4|continue reading]])
*'''The Movement Charter Drafting Committee is All Set! -''' The Committee of fifteen members which was elected in October 2021, has agreed on the essential values and methods for its work, and has started to create the outline of the Movement Charter draft. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A5|continue reading]])
*'''Introducing Movement Strategy Weekly -''' Contribute and Subscribe! - The MSG team have just launched the updates portal, which is connected to the various Movement Strategy pages on Meta-wiki. Subscriber to get up-to-date news about the various ongoing projects. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A6|continue reading]])
*'''Diff Blogs -''' Check out the most recent publications about Movement Strategy on Wikimedia Diff. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/6#A7|continue reading]])
</div><section end="msg-newsletter"/>
</div>
Also, a draft of the [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/draft|'''2022-23 Wikimedia Foundation Annual Plan''']] has been published. Input is being sought on-wiki and during [[:m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/Conversations|'''several conversations''' with Wikimedia Foundation CEO Maryana Iskander]].
[[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2022-2023/Conversations/Announcement|See full announcement on Meta-wiki]]. [[User:Xeno (WMF)|Xeno (WMF)]] 01:46, 22 apr. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23184989 -->
== 2022 Board of Trustees Call for Candidates ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Call for Candidates/Short|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Call for Candidates/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Call for Candidates/Short}}&language=&action=page&filter= {{int:please-translate}}]</div>''
The Board of Trustees seeks candidates for the 2022 Board of Trustees election. [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Announcement/Call_for_Candidates|'''Read more on Meta-wiki.''']]
The [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|2022 Board of Trustees election]] is here! Please consider submitting your candidacy to serve on the Board of Trustees.
The Wikimedia Foundation Board of Trustees oversees the Wikimedia Foundation's operations. Community-and-affiliate selected trustees and Board-appointed trustees make up the Board of Trustees. Each trustee serves a three year term. The Wikimedia community has the opportunity to vote for community-and-affiliate selected trustees.
The Wikimedia community will vote to fill two seats on the Board in 2022. This is an opportunity to improve the representation, diversity, and expertise of the Board as a team.
;Who are potential candidates? Are you a potential candidate? Find out more on the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Apply to be a Candidate|Apply to be a Candidate page]].
Thank you for your support,
Movement Strategy and Governance on behalf of the Elections Committee and the Board of Trustees<br /><section end="announcement-content" />
10:39, 10 maj. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23215441 -->
== Junia konkurso en Vikivojaĝo kaj rilata CentraAtentigo ==
Saluton! Dum Junio ĉi tie en la Esperanta Vikivojaĝo okazos konkurso speciale fasonita por helpi al partoprenontoj de Esperantaj renkontiĝoj. Mi ĝin organizas enkadre de Vikimedio EO. Por la konkurso ni partneras kun organizantoj de kelkaj gravaj Esperantaj renkontiĝoj, kaj ili ankaŭ provizas premiojn por venkontoj. Dum la konkurso ni / vi verkos / tradukos vojaĝajn gvidilojn pri lokoj / lingvoj, kiuj helpos al partoprenontoj de Esperantaj renkontiĝoj veturi al la renkontiĝoj pli facile, malmultekoste kaj ĝue. Mi mem kutime uzas (anglan) Vikivojaĝon dum mia veturado, sed la Esperanta versio dume ne estas uzebla por aparte multaj lokoj. Kaj ni volas tion ŝanĝi - ankaŭ per tiu ĉi konkurso {{R|;-)}}
Por varbi al la konkurso mi [[:meta:CentralNotice/Request/Esperanto Wikivoyage competition 2022|petis CentraAtentigon]], kiu laŭplane montriĝadu dum Junio ankaŭ ĉi tie. Se vi havas komenton pri ĝi, bv. esprimu ĝin rekte en la peta paĝo, eĉ en Esperanto. --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 19:45, 29 maj. 2022 (UTC)
== <span lang="en" dir="ltr" class="mw-content-ltr">Revisions to the Universal Code of Conduct (UCoC) Enforcement Guidelines</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/Enforcement guidelines/Revision discussions/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Enforcement guidelines/Revision discussions/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello all,
We'd like to provide an update on the work on the Enforcement Guidelines for the Universal Code of Conduct. After the conclusion of the community vote on the guidelines in March, the [[m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee|Community Affairs committee (CAC)]] of the Board [https://lists.wikimedia.org/hyperkitty/list/wikimedia-l@lists.wikimedia.org/thread/JAYQN3NYKCHQHONMUONYTI6WRKZFQNSC/ asked that several areas of the guidelines be reviewed for improvements] before the Board does its final review. These areas were identified based on community discussions and comments provided during the vote. The CAC also requested review of the controversial Note in 3.1 of the UCoC itself.
Once more, a big thank you to all who voted, especially to all who left constructive feedback and comments! The project team is working with the Board to establish a timeline for this work, and will communicate this next month.
Members of the two prior [[m:Special:MyLanguage/Universal Code of Conduct/Drafting committee|UCoC Drafting Committees]] have generously offered their time to help shape improvements to the Guidelines. You can read more about them and their work [[m:Special:MyLanguage/Universal Code of Conduct/Drafting committee#Revisions_Committee|here]], as well as read [[m:Special:MyLanguage/Universal_Code_of_Conduct/Drafting_committee/Phase_2_meeting_summaries#2022|summaries of their weekly meetings in 2022]].
Wikimedians have provided many valuable comments together with the vote and in other conversations. Given the size and diversity of the Wikimedia community, there are even more voices out there who can give ideas on how to improve the enforcement guidelines and add even more valuable ideas to the process. To help the Revisions committee identify improvements, input on several questions for the committee’s review is requested. Visit the Meta-wiki pages ([[m:Special:MyLanguage/Universal_Code_of_Conduct/Enforcement_guidelines/Revision_discussions|Enforcement Guidelines revision discussions]], [[m:Special:MyLanguage/Universal_Code_of_Conduct/Policy text/Revision_discussions|Policy text revision discussions]]) to get your ideas to the Committee - it is very important that viewpoints are heard from different communities before the Committee begins drafting revision proposals.
On behalf of the UCoC project team <br /><section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 22:57, 3 jun. 2022 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23215441 -->
== Propose statements for the 2022 Election Compass ==
:''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Propose statements for the 2022 Election Compass| You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Propose statements for the 2022 Election Compass|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Propose statements for the 2022 Election Compass}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hi all,
Community members in the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|2022 Board of Trustees election]] are invited to [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Community_Voting/Election_Compass|propose statements to use in the Election Compass.]]
An Election Compass is a tool to help voters select the candidates that best align with their beliefs and views. The community members will propose statements for the candidates to answer using a Lickert scale (agree/neutral/disagree). The candidates’ answers to the statements will be loaded into the Election Compass tool. Voters will use the tool by entering in their answer to the statements (agree/disagree/neutral). The results will show the candidates that best align with the voter’s beliefs and views.
;Here is the timeline for the Election Compass:
* July 8 - 20: Community members propose statements for the Election Compass
* July 21 - 22: Elections Committee reviews statements for clarity and removes off-topic statements
* July 23 - August 1: Volunteers vote on the statements
* August 2 - 4: Elections Committee selects the top 15 statements
* August 5 - 12: candidates align themselves with the statements
* August 15: The Election Compass opens for voters to use to help guide their voting decision
The Elections Committee will select the top 15 statements at the beginning of August. The Elections Committee will oversee the process, supported by the Movement Strategy and Governance team. MSG will check that the questions are clear, there are no duplicates, no typos, and so on.
Best,
Movement Strategy and Governance
''This message was sent on behalf of the Board Selection Task Force and the Elections Committee''<br /><section end="announcement-content" />
[[User:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] ([[User talk:MNadzikiewicz (WMF)|talk]]) 11:34, 14 jul. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23215441 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Movement Strategy and Governance News – Issue 7</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="msg-newsletter"/>
<div style = "line-height: 1.2">
<span style="font-size:200%;">'''Movement Strategy and Governance News'''</span><br>
<span style="font-size:120%; color:#404040;">'''Issue 7, July-September 2022'''</span><span style="font-size:120%; float:right;">[[m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7|'''Read the full newsletter''']]</span>
----
Welcome to the 7th issue of Movement Strategy and Governance News! The newsletter distributes relevant news and events about the implementation of Wikimedia's [[:m:Special:MyLanguage/Movement Strategy/Initiatives|Movement Strategy recommendations]], other relevant topics regarding Movement governance, as well as different projects and activities supported by the Movement Strategy and Governance (MSG) team of the Wikimedia Foundation.
The MSG Newsletter is delivered quarterly, while the more frequent [[:m:Special:MyLanguage/Movement Strategy/Updates|Movement Strategy Weekly]] will be delivered weekly. Please remember to subscribe [[m:Special:MyLanguage/Global message delivery/Targets/MSG Newsletter Subscription|here]] if you would like to receive future issues of this newsletter.
</div><div style="margin-top:3px; padding:10px 10px 10px 20px; background:#fffff; border:2px solid #808080; border-radius:4px; font-size:100%;">
* '''Movement sustainability''': Wikimedia Foundation's annual sustainability report has been published. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A1|continue reading]])
* '''Improving user experience''': recent improvements on the desktop interface for Wikimedia projects. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A2|continue reading]])
* '''Safety and inclusion''': updates on the revision process of the Universal Code of Conduct Enforcement Guidelines. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A3|continue reading]])
* '''Equity in decisionmaking''': reports from Hubs pilots conversations, recent progress from the Movement Charter Drafting Committee, and a new white paper for futures of participation in the Wikimedia movement. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A4|continue reading]])
* '''Stakeholders coordination''': launch of a helpdesk for Affiliates and volunteer communities working on content partnership. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A5|continue reading]])
* '''Leadership development''': updates on leadership projects by Wikimedia movement organizers in Brazil and Cape Verde. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A6|continue reading]])
* '''Internal knowledge management''': launch of a new portal for technical documentation and community resources. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A7|continue reading]])
* '''Innovate in free knowledge''': high-quality audiovisual resources for scientific experiments and a new toolkit to record oral transcripts. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A8|continue reading]])
* '''Evaluate, iterate, and adapt''': results from the Equity Landscape project pilot ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A9|continue reading]])
* '''Other news and updates''': a new forum to discuss Movement Strategy implementation, upcoming Wikimedia Foundation Board of Trustees election, a new podcast to discuss Movement Strategy, and change of personnel for the Foundation's Movement Strategy and Governance team. ([[:m:Special:MyLanguage/Movement Strategy and Governance/Newsletter/7#A10|continue reading]])
</div><section end="msg-newsletter"/>
</div>
Thank you for reading! [[User:RamzyM (WMF)|RamzyM (WMF)]] 01:38, 18 jul. 2022 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23529147 -->
== Announcing the six candidates for the 2022 Board of Trustees election ==
<section begin="announcement-content"/>
:''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Announcing the six candidates for the 2022 Board of Trustees election| You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Announcing the six candidates for the 2022 Board of Trustees election|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Announcing the six candidates for the 2022 Board of Trustees election}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hi everyone,
'''The Affiliate voting process has concluded.''' Representatives from each Affiliate organization learned about the candidates by reading candidates’ statements, reviewing candidates’ answers to questions, and considering the candidates’ ratings provided by the Analysis Committee. The selected 2022 Board of Trustees candidates are:
* Tobechukwu Precious Friday ([[:m:User:Tochiprecious|Tochiprecious]])
* Farah Jack Mustaklem ([[:m:User:Fjmustak|Fjmustak]])
* Shani Evenstein Sigalov ([[:m:User:Esh77|Esh77]])
* Kunal Mehta ([[:m:User:Legoktm|Legoktm]])
* Michał Buczyński ([[:m:User:Aegis Maelstrom|Aegis Maelstrom]])
* Mike Peel ([[:m:User:Mike Peel|Mike Peel]])
You may see more information about the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Results|Results]] and [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Stats|Statistics]] of this Board election.
Please take a moment to appreciate the Affiliate Representatives and Analysis Committee members for taking part in this process and helping to grow the Board of Trustees in capacity and diversity. These hours of volunteer work connect us across understanding and perspective. Thank you for your participation.
Thank you to the community members who put themselves forward as candidates for the Board of Trustees. Considering joining the Board of Trustees is no small decision. The time and dedication candidates have shown to this point speaks to their commitment to this movement. Congratulations to those candidates who have been selected. A great amount of appreciation and gratitude for those candidates not selected. Please continue to share your leadership with Wikimedia.
Thank you to those who followed the Affiliate process for this Board election. You may review the results of the Affiliate selection process.
'''The next part of the Board election process is the community voting period.''' [[m:Special:MyLanguage/Wikimedia Foundation elections/2022#Timeline|You may view the Board election timeline here]]. To prepare for the community voting period, there are several things community members can engage with in the following ways:
* [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|Read candidates’ statements]] and read the candidates’ answers to the questions posed by the Affiliate Representatives.
* [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Community_Voting/Questions_for_Candidates|Propose and select the 6 questions for candidates to answer during their video Q&A]].
* See the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|Analysis Committee’s ratings of candidates on each candidate’s statement]].
* [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Community Voting/Election Compass|Propose statements for the Election Compass]] voters can use to find which candidates best fit their principles.
* Encourage others in your community to take part in the election.
Best,
Movement Strategy and Governance
''This message was sent on behalf of the Board Selection Task Force and the Elections Committee''
</div><section end="announcement-content"/>
[[User:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] 14:03, 27 jul. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23530132 -->
== Vote for Election Compass Statements ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Vote for Election Compass Statements| You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/Vote for Election Compass Statements|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/Vote for Election Compass Statements}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hi all,
Volunteers in the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|2022 Board of Trustees election]] are invited to [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Community_Voting/Election_Compass/Statements|vote for statements to use in the Election Compass]]. You can vote for the statements you would like to see included in the Election Compass on Meta-wiki.
An Election Compass is a tool to help voters select the candidates that best align with their beliefs and views. The community members will propose statements for the candidates to answer using a Lickert scale (agree/neutral/disagree). The candidates’ answers to the statements will be loaded into the Election Compass tool. Voters will use the tool by entering in their answer to the statements (agree/disagree/neutral). The results will show the candidates that best align with the voter’s beliefs and views.
Here is the timeline for the Election Compass:
*<s>July 8 - 20: Volunteers propose statements for the Election Compass</s>
*<s>July 21 - 22: Elections Committee reviews statements for clarity and removes off-topic statements</s>
*July 23 - August 1: Volunteers vote on the statements
*August 2 - 4: Elections Committee selects the top 15 statements
*August 5 - 12: candidates align themselves with the statements
*August 15: The Election Compass opens for voters to use to help guide their voting decision
The Elections Committee will select the top 15 statements at the beginning of August
Best,
Movement Strategy and Governance
''This message was sent on behalf of the Board Selection Task Force and the Elections Committee''
</div><section end="announcement-content" />
[[User:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] 21:01, 27 jul. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23530132 -->
== The 2022 Board of Trustees election Community Voting period is now open ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/The 2022 Board of Trustees election Community Voting period is now open| You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Announcement/The 2022 Board of Trustees election Community Voting period is now open|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2022/Announcement/The 2022 Board of Trustees election Community Voting period is now open}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hi everyone,
The Community Voting period for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022|2022 Board of Trustees election]] is now open. Here are some helpful links to get you the information you need to vote:
* Try the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Community_Voting/Election_Compass|Election Compass]], showing how candidates stand on 15 different topics.
* Read the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|candidate statements]] and [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Affiliate_Organization_Participation/Candidate_Questions|answers to Affiliate questions]]
* [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Apply to be a Candidate|Learn more about the skills the Board seeks]] and how the [[m:Special:MyLanguage/Wikimedia Foundation elections/2022/Candidates|Analysis Committee found candidates align with those skills]]
If you are ready to vote, you may go to [[Special:SecurePoll/vote/Wikimedia_Foundation_Board_Elections_2022|SecurePoll voting page]] to vote now. '''You may vote from August 23 at 00:00 UTC to September 6 at 23:59 UTC.''' To see about your voter eligibility, please visit the [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2022/Voter_eligibility_guidelines|voter eligibility page]].
Best,
Movement Strategy and Governance
''This message was sent on behalf of the Board Selection Task Force and the Elections Committee''<br /><section end="announcement-content" />
[[User:MNadzikiewicz_(WMF)|MNadzikiewicz (WMF)]]
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23708360 -->
== Invitation to join the Movement Strategy Forum ==
:''{{More languages}}''
<section begin="announcement-content" />
Hello everyone,
The [https://forum.movement-strategy.org/ Movement Strategy Forum] (MS Forum) is a multilingual collaborative space for all conversations about Movement Strategy implementation.
We are inviting all Movement participants to collaborate on the MS Forum. The goal of the forum is to build community collaboration, using an inclusive multilingual platform.
The [[m:Movement Strategy|Movement Strategy]] is a collaborative effort to imagine and build the future of the Wikimedia Movement. Anyone can contribute to the Movement Strategy, from a comment to a full-time project.
;Join this forum with your Wikimedia account, engage in conversations, and ask questions in your language.
The Movement Strategy and Governance team (MSG) launched the proposal for the MS Forum in May 2022. There was a 2-month community review period, which ended on 24 July 2022. The community review process included several questions that resulted in interesting conversations. You can read the [https://forum.movement-strategy.org/t/ms-forum-community-review-report/1436 Community Review Report].
We look forward to seeing you at the MS Forum!
Best regards,
the Movement Strategy and Governance Team
[[User:MNadzikiewicz (WMF)]] 11:32, 29 aŭg. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23720620 -->
== The Vector 2022 skin as the default in two weeks? ==
<div lang="en" dir="ltr" class="mw-content-ltr">
[[File:Wikimania 2022 Vector (2022) Presentation.pdf|thumb|The slides for our presentation at Wikimania 2022|page=26]]
Hello. I'm writing on behalf of the [[mw:Reading/Web|Wikimedia Foundation Web team]]. '''In two weeks, we would like to make the Vector 2022 skin the default on this wiki.'''
We have been working on it for the past three years. So far, it has been the default on more than 30 wikis, including sister projects, all accounting for more than 1 billion pageviews per month. On average [[phab:T317529#8246686|87% of active logged-in users]] of those wikis use Vector 2022.
It would become the default for all logged-out users, and also all logged-in users who currently use Vector legacy. Logged-in users can at any time switch to [[Special:Preferences#mw-prefsection-rendering|any other skins]]. No changes are expected for users of these skins.
<div style="width:100%; margin:auto;"><gallery widths="220" heights="150" mode="packed" caption="Top of an article">
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2010 top.png|Vector legacy (current default)
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2022 top.png|Vector 2022
</gallery><gallery widths="220" heights="150" mode="packed" caption="A section of an article">
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2010 scrolled.png|Vector legacy (current default)
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2022 scrolled.png|Vector 2022
</gallery></div>
=== About the skin ===
'''[Why is a change necessary]''' The current default skin meets the needs of the readers and editors as these were 13 years ago. Since then, new users have begun using Wikimedia projects. [https://diff.wikimedia.org/2022/08/18/prioritizing-equity-within-wikipedias-new-desktop/ The old Vector doesn't meet their needs.]
'''[Objective]''' The objective for the new skin is to make the interface more welcoming and comfortable for readers and useful for advanced users. It draws inspiration from previous requests, the [[metawiki:Special:MyLanguage/Community_Wishlist_Survey|Community Wishlist Surveys]], and gadgets and scripts. The work helped our code follow the standards and improve all other skins. [[phab:phame/post/view/290/how_and_why_we_moved_our_skins_to_mustache/|We reduced PHP code in Wikimedia deployed skins by 75%]]. The project has also focused on making it easier to support gadgets and use APIs.
'''[Changes and test results]''' The skin introduces a [[mw:Special:MyLanguage/Reading/Web/Desktop Improvements/Features|series of changes]] that improve readability and usability. The new skin does not remove any functionality currently available on the Vector skin.
* The sticky header makes it easier to find tools that editors use often. It decreases scrolling to the top of the page by 16%.
* The new table of contents makes it easier to navigate to different sections. Readers and editors jumped to different sections of the page 50% more than with the old table of contents. It also looks a bit different on talk pages.
* The new search bar is easier to find and makes it easier to find the correct search result from the list. This increased the amount of searches started by 30% on the wikis we tested on.
* The skin does not negatively affect pageviews, edit rates, or account creation. There is evidence of increases in pageviews and account creation across partner communities.
'''[Try it out]''' Try out the new skin by going to the appearance tab in [[Special:Preferences#mw-prefsection-rendering|your preferences]] and selecting Vector 2022 from the list of skins.
=== How can editors change and customize this skin? ===
It's possible to configure and personalize our changes. We support volunteers who create new gadgets and user scripts. Check out [[mw:Special:MyLanguage/Reading/Web/Desktop Improvements/Repository|our repository]] for a list of currently available customizations, or add your own.
=== Our plan ===
'''If no large concerns are raised, we plan on deploying in the week of October 3, 2022'''. If your community would like to request more time to discuss the changes, hit the button and write to us. We can adjust the calendar.
<div style="text-align: center;">[[mw:Talk:Reading/Web/Desktop Improvements|<span class="plainlinks mw-ui-button">Request for more time to discuss the change</span>]]</div>
If you'd like ask our team anything, if you have questions, concerns, or additional thoughts, please ping me here or write on the [[mw:Talk:Reading/Web/Desktop Improvements|talk page of the project]]. We will gladly answer! Also, [[mw:Reading/Web/Desktop Improvements/Frequently asked questions|see our FAQ]]. Thank you! [[mw:User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[mw:User talk:SGrabarczuk (WMF)|talk]]) 04:15, 22 sep. 2022 (UTC)
</div>
<!-- Message sent by User:SGrabarczuk (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Varia&oldid=23838600 -->
== Malferma letero pri la Vikimedia Komunejo ==
Saluton, Vikimedia Komunejo bezonas riparadon. Nun ekzistas malferma letero kiu alvokas la WMF multe investi, plibonigi la platformon kaj pensi pri gxia estonteco. [[c:Commons:Think_big_-_open_letter_about_Wikimedia_Commons|Bonvolu rigardi la leteron kaj konsideru subskribi.]] Sincere, [[Uzanto:Ziko|Ziko]] ([[Uzanto-Diskuto:Ziko|diskuto]]) 19:41, 14 okt. 2022 (UTC)
== Invitation to attend “Ask Me Anything about Movement Charter” Sessions ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Movement Charter/Community Consultation/Announcement/Ask Me Anything Sessions|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Movement Charter/Community Consultation/Announcement/Ask Me Anything Sessions|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Community Consultation/Announcement/Ask Me Anything Sessions}}&language=&action=page&filter= {{int:please-translate}}]
Hello all,
During the 2022 Wikimedia Summit, the [[m:Special:MyLanguage/Movement Charter/Drafting Committee|Movement Charter Drafting Committee]] (MCDC) presented the first outline of the Movement Charter, giving a glimpse on the direction of its future work, and the Charter itself. The MCDC then integrated the initial feedback collected during the Summit. Before proceeding with writing the Charter for the whole Movement, the MCDC wants to interact with community members and gather feedback on the drafts of the three sections: Preamble, Values & Principles, and Roles & Responsibilities (intentions statement). The Movement Charter drafts will be available on the Meta page [[m:Special:MyLanguage/Movement Charter/Content|here]] on November 14, 2022. Community wide consultation period on MC will take place from November 20 to December 18, 2022. Learn more about it [[m:Special:MyLanguage/Movement Charter/Community Consultation|here]].
With the goal of ensuring that people are well informed to fully participate in the conversations and are empowered to contribute their perspective on the Movement Charter, three '''“Ask Me Anything about Movement Charter"''' sessions have been scheduled in different time zones. Everyone in the Wikimedia Movement is invited to attend these conversations. The aim is to learn about Movement Charter - its goal, purpose, why it matters, and how it impacts your community. MCDC members will attend these sessions to answer your questions and hear community feedback.
The “Ask Me Anything” sessions accommodate communities from different time zones. Only the presentation of the session is recorded and shared afterwards, no recording of conversations. Below is the list of planned events:
*<s>'''Asia/Pacific''': November 4, 2022 at 09:00 UTC ([https://zonestamp.toolforge.org/1667552400 your local time]). Interpretation is available in Chinese and Japanese.</s>
* '''Europe/MENA/Sub Saharan Africa''': November 12, 2022 at 15:00 UTC ([https://zonestamp.toolforge.org/1668265257 your local time]). Interpretation is available in Arabic, French and Russian.
* '''North and South America/ Western Europe''': November 12, 2022 at 15:00 UTC ([https://zonestamp.toolforge.org/1668265257 your local time]). Interpretation is available in Spanish and Portuguese.
On the [[m:Special:MyLanguage/Movement Charter/Community Consultation|Meta page]] you will find more details; Zoom links will be shared 48 hours ahead of the call.
'''Call for Movement Charter Ambassadors'''
Individuals or groups from all communities who wish to help include and start conversations in their communities on the Movement Charter are encouraged to become [[m:Special:MyLanguage/Movement Strategy and Governance/Movement Charter Ambassadors Program/About|Movement Charter Ambassadors]] (MC Ambassadors). MC Ambassadors will carry out their own activities and get financial support for enabling conversations in their own languages. [[m:Special:MyLanguage/Movement Strategy and Governance/Team|Regional facilitators]] from the Movement Strategy and Governance team are available to support applicants with MC Ambassadors grantmaking. If you are interested please sign up [[m:Special:MyLanguage/Movement Strategy and Governance/Movement Charter Ambassadors Program/About|here]]. Should you have specific questions, please reach out to the MSG team via email: strategy2030@wikimedia.org or on the MS forum.
We thank you for your time and participation.
On behalf of the Movement Charter Drafting Committee,<section end="announcement-content" />
[[User:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] 15:33, 7 nov. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23914777 -->
== Apply for Funding through the Movement Strategy Community Engagement Package to Support Your Community ==
:''{{More languages}}''
<section begin="announcement-content" />
The Wikimedia Movement Strategy implementation is a collaborative effort for all Wikimedians.
[[m:Special:MyLanguage/Grants:MSIG/About|Movement Strategy Implementation Grants]] support projects that take the current state of a [[m:Special:MyLanguage/Movement Strategy/Initiatives|Movement Strategy Initiative]] and push it one step forward. If you are looking for an example or some guide on how to engage your community further on Movement Strategy and the Movement Strategy Implementation Grants specifically, you may find this '''[[m:Special:MyLanguage/Grants:MSIG/Community Engagement Package|community engagement package]]''' helpful.
The goal of this community engagement package is to support more people to access the funding they might need for the implementation work. By becoming a recipient of this grant, you will be able to support other community members to develop further grant applications that fit with your local contexts to benefit your own communities. With this package, the hope is to break down language barriers and to ensure community members have needed information on Movement Strategy to connect with each other. Movement Strategy is a two-way exchange, we can always learn more from the experiences and knowledge of Wikimedians everywhere. We can train and support our peers by using this package, so more people can make use of this great funding opportunity.
If this information interests you or if you have any further thoughts or questions, please do not hesitate to reach out to us as your [[m:Special:MyLanguage/Movement_Strategy_and_Governance/Team|regional facilitators]] to discuss further. We will be more than happy to support you. When you are ready, follow the steps on [[m:Special:MyLanguage/Grants:MSIG/About |this page]] to apply. We look forward to receiving your application.
Best regards, <br> Movement Strategy and Governance Team <br> Wikimedia Foundation<section end="announcement-content" />
[[User:MNadzikiewicz (WMF)|MNadzikiewicz (WMF)]] 16:26, 14 nov. 2022 (UTC)
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23914777 -->
== Opportunities open for the Ombuds commission and the Case Review Committee ==
<section begin="announcement-content" />
<div style="margin:.2em 0 .5em;margin-{{#switch:{{PAGELANGUAGE}}|ar|arc|ary|arz|azb|bcc|bgn|ckb|bqi|dv|fa|fa-af|glk|ha-arab|he|kk-arab|kk-cn|ks|ku-arab|ms-arab|mzn|pnb|prd|ps|sd|ug|ur|ydd|yi=right|left}}:3ex;">
[[m:Special:MyLanguage/Wikimedia Foundation Legal department/Announcement/2023 OC and CRC appointments process|''You can find this message translated into additional languages on Meta-wiki.'']]
''<span class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Legal department/Announcement/2023 OC and CRC appointments process|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Legal department/Announcement/2023 OC and CRC appointments process}}&language=&action=page&filter= {{int:please-translate}}]</span>''
</div>
Hi everyone! The Ombuds commission (OC) and the Case Review Committee (CRC) are looking for members. People are encouraged to nominate themselves or encourage others they feel would contribute to these groups to do so. There is more information below about the opportunity and the skills that are needed.
'''About the Ombuds commission'''
The Ombuds commission (OC) works on all Wikimedia projects to investigate complaints about violations of the privacy policy, especially in use of [[m:Special:MyLanguage/CheckUser policy|CheckUser]] and [[m:Special:MyLanguage/Oversight policy|Oversight]] (also known as Suppression) tools. The Commission mediates between the parties of the investigation and, when violations of the policies are identified, advises the Wikimedia Foundation on best handling. They may also assist the General Counsel, the Chief Executive Officer, or the Board of Trustees of the Foundation in these investigations when legally necessary. For more on the OC's duties and roles, '''[[m:Special:MyLanguage/Ombuds commission|see Ombuds commission on Meta-Wiki]]'''.
Volunteers serving in this role should be experienced Wikimedians, active on any project, who have previously used the CheckUser/Oversight tools OR who have the technical ability to understand these tools and the willingness to learn them. They must be able to communicate in English, the common language of the commission. They are expected to be able to engage neutrally in investigating these concerns and to know when to recuse when other roles and relationships may cause conflict. Commissioners will serve '''two-year terms''' (note that this is different from past years, when the terms have been for one year).
'''About the Case Review Committee'''
The Case Review Committee (CRC) reviews appeals of eligible Trust & Safety office actions. The CRC is a critical layer of oversight to ensure that Wikimedia Foundation office actions are fair and unbiased. They also make sure the Wikimedia Foundation doesn’t overstep established practices or boundaries. For more about the role, '''[[m:Special:MyLanguage/Case Review Committee|see Case Review Committee on Meta-Wiki]]'''.
We are looking for current or former functionaries and experienced volunteers with an interest in joining this group. Applicants must be fluent in English (additional languages are a strong plus) and willing to abide by the [[m:Special:MyLanguage/Trust_and_Safety/Case_Review_Committee/Charter|terms of the Committee charter]]. If the work resonates and you qualify, please apply. Committee members will serve '''two-year terms''' (note that this is different from past years, when the terms have been for one year).
'''Applying to join either of these groups'''
Members are required to sign the [[m:Special:MyLanguage/Confidentiality agreement for nonpublic information|Confidentiality agreement for nonpublic information]] and must be willing to comply with the appropriate Wikimedia Foundation board policies (such as the [[m:Special:MyLanguage/Access to nonpublic information policy|access to non-public information policy]] and the [[foundation:Special:MyLanguage/Privacy policy|Foundation privacy policy]]). These positions requires a high degree of discretion and trust. Members must also be over 18 years of age.
'''If you are interested in serving in either capacity listed above,''' please write in English to the Trust and Safety team at ca[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org (to apply to the OC) or to the Legal Team at legal[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org (to apply to the CRC) with information about:
* Your primary projects
* Languages you speak/write
* Any experience you have serving on committees, whether movement or non-movement
* Your thoughts on what you could bring to the OC or CRC if appointed
* Any experience you have with the Checkuser or Oversight tools (OC only)
* Any other information you think is relevant
'''The deadline for applications is 31 December 2022 in any timezone.'''
Please feel free to pass this invitation along to any users who you think may be qualified and interested. Thank you!
On behalf of the Committee Support team,<br /><section end="announcement-content" />
<!-- Message sent by User:MNadzikiewicz (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Movement_Strategy_and_Governance/Delivery&oldid=23914777 -->
== Community Wishlist Survey 2023 opens in January ==
<div lang="en" dir="ltr" class="mw-content-ltr">
''{{int:Please-translate}}''
(There is [[m:Community Wishlist Survey 2023 opens in January|a translatable version of this message on MetaWiki]])
{{int:Hello}}
The [[m:Community Wishlist Survey 2023|'''Community Wishlist Survey (CWS) 2023''']], which lets contributors propose and vote for tools and improvements, starts next month on Monday, [https://zonestamp.toolforge.org/1674496831 23 January 2023, at 18:00 UTC] and will continue annually.
We are inviting you to share your ideas for technical improvements to our tools and platforms. Long experience in editing or technical skills is not required. If you have ever used our software and thought of an idea to improve it, this is the place to come share those ideas!
The dates for the phases of the Survey will be as follows:
* Phase 1: Submit, discuss, and revise proposals – Monday, Jan 23, 2023 to Sunday, Feb 6, 2023
* Phase 2: WMF/Community Tech reviews and organizes proposals – Monday, Jan 30, 2023 to Friday, Feb 10, 2023
* Phase 3: Vote on proposals – Friday, Feb 10, 2023 to Friday, Feb 24, 2023
* Phase 4: Results posted – Tuesday, Feb 28, 2023
If you want to start writing out your ideas ahead of the Survey, you can start thinking about your proposals and draft them in [[m:Community Wishlist Survey/Sandbox|the CWS sandbox]].
We are grateful to all who participated last year. See you in January 2023!
</div>
{{int:Feedback-thanks-title}} <bdi lang="en" dir="ltr">Community Tech, [[m:User:STei (WMF)|STei (WMF)]]</bdi> 16:44, 15 dec. 2022 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Community_Wishlist_list_for_non-Wikipedias&oldid=24239678 -->
== Global ban for PlanespotterA320/RespectCE ==
Per the [[m:Global bans|Global bans]] policy, I'm informing the project of this request for comment: [[m:Requests for comment/Global ban for PlanespotterA320 (2) ]] about banning a member from your community. Thank you.--[[User:Lemonaka|Lemonaka]] ([[User talk:Lemonaka|talk]]) 21:40, 6 February 2023 (UTC)
<!-- Message sent by User:Zabe@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Lemonaka/Massmessagelist&oldid=24501599 -->
== Your wiki will be in read only soon ==
<section begin="server-switch"/><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|Legi ĉi tiun mesaĝon en alia lingvo]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
La [[foundation:|Wikimedia Fundamento]] elprovas la ŝaltilon inter ties unua kaj duaranga datumcentroj. Tio certigos, ke Vikipedio kaj la ceteraj Vikimediaj vikioj povas resti enrete eĉ post katastrofo. Por certigi, ke ĉio funkcias, vikimedia teknologia sekcio bezonas okazigi planitan provon. Tiu provo montros, ĉu eblas fidinde transiri de unu datumcentro al la alia. Multaj teamoj devas prepari sin por la provo kaj esti pretaj por solvi iajn ajn neatenditajn problemojn.
Oni ŝaltos la tutan datumtrafikon je la '''{{#time:j xg|2023-03-01|eo}}'''. La provo komenciĝos je '''[https://zonestamp.toolforge.org/{{#time:U|2023-03-01T14:00|en}} {{#time:H:i e|2023-03-01T14:00}}]'''.
Bedaŭrinde pro iuj limoj en [[mw:Manual:What is MediaWiki?|MediaWiki]] la tuta redaktado devas esti interrompita dum la ŝaltado. Ni pardonpetas pro ĉi tiu interrompo, kaj ni laboras por mallongigi ĝin kiom plej eble en la estonteco.
'''Vi povos legi, sed ne redakti, ĉiujn vikiojn dum mallonga tempo.'''
*Vi ne povos redakti dum ĝis unu horo je la {{#time:l j xg Y|2023-03-01|eo}}.
*Se vi provos redakti aŭ konservi dum tiu tempo, vi vidos erarmesaĝon. Ni esperas, ke neniuj redaktoj perdiĝos dum tiuj minutoj, sed ni ne povas garantii tion. Se vi vidos erarmesaĝon, bonvolu atendi ĝis kiam ĉio estos denove en ordo. Tiam vi povos konservi vian redakton. Sed ni rekomendas ke vi faru kopion de viaj ŝanĝoj antaŭe, ĉiaokaze.
''Aliaj efikoj'':
*Fonaj taskoj estos malpli rapidaj, kaj eblas ke kelkaj estos rifuzitaj. Eblas ke ruĝaj ligiloj ne estos ĝisdatigataj kun kutima rapideco. Se vi kreas artikolon al kiu jam estas ligilo, tiu ligilo restos ruĝa pli longe ol kutime. Kelkaj longdaŭraj funkcisinsekvoj devos esti haltigitaj.
* Antaŭvideble, disdono de kodo okazos same kiel en la ceteraj semajnoj. Tamen, eblas haltoj en la kodo en kelkaj unuopaj okazoj.
* [[mw:Special:MyLanguage/GitLab|GitLab]] estos malhavebla dum ĉirkaŭ 90 minutoj.
Ĉi tiu projekto povas esti prokrastita se necese. Vi povas [[wikitech:Switch_Datacenter|legi la horaron ĉe wikitech.wikimedia.org]]. Ajnaj ŝanĝoj estos anoncitaj en la horaro. Estos pli da informoj pri tio. Rubando estos montrata en ĉiuj vikioj ekde 30 minutoj antaŭ la operacio. '''Bonvolu disvastigi ĉi tiun informon en via komunumo.'''</div><section end="server-switch"/>
<span dir=ltr>[[m:User:Trizek (WMF)|Trizek (WMF)]] ([[m:User talk:Trizek (WMF)|{{int:talk}}]])</span> 21:21, 27 feb. 2023 (UTC)
<!-- Message sent by User:Trizek (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=24390465 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Wikimania 2023 Welcoming Program Submissions</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="wikimania-program-submissions"/>[[File:Wikimania Singapore Logo.svg|right|frameless]]Do you want to host an in-person or virtual session at Wikimania 2023? Maybe a hands-on workshop, a lively discussion, a fun performance, a catchy poster, or a memorable lightning talk? [[wmania:Special:MyLanguage/2023:Program/Submissions|'''Submissions are open until March 28''']]. The event will have dedicated hybrid blocks, so virtual submissions and pre-recorded content are also welcome. If you have any questions, please join us at an upcoming conversation on March 12 or 19, or reach out by email at wikimania@wikimedia.org or on Telegram. More information on-wiki.<section end="wikimania-program-submissions"/>
</div>
<!-- Message sent by User:CKoerner (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=24390465 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Seeking volunteers for the next step in the Universal Code of Conduct process</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/U4C Building Committee/Nominations/Announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/U4C Building Committee/Nominations/Announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello,
As follow-up to [https://lists.wikimedia.org/hyperkitty/list/wikimedia-l@lists.wikimedia.org/message/IOMVS7W75ZYMABQGOQ2QH2JAURC3CHGH/ the message about the Universal Code of Conduct Enforcement Guidelines] by Wikimedia Foundation Board of Trustees Vice Chair, Shani Evenstein Sigalov, I am reaching out about the next steps. I want to bring your attention to the next stage of the Universal Code of Conduct process, which is forming a building committee for the Universal Code of Conduct Coordinating Committee (U4C). I invite community members with experience and deep interest in community health and governance to nominate themselves to be part of the U4C building committee, which needs people who are:
* Community members in good standing
* Knowledgeable about movement community processes, such as, but not limited to, policy drafting, participatory decision making, and application of existing rules and policies on Wikimedia projects
* Aware and appreciative of the diversity of the movement, such as, but not limited to, languages spoken, identity, geography, and project type
* Committed to participate for the entire U4C Building Committee period from mid-May - December 2023
* Comfortable with engaging in difficult, but productive conversations
* Confidently able to communicate in English
The Building Committee shall consist of volunteer community members, affiliate board or staff, and Wikimedia Foundation staff.
The Universal Code of Conduct has been a process strengthened by the skills and knowledge of the community and I look forward to what the U4C Building Committee creates. If you are interested in joining the Building Committee, please either [[m:Special:MyLanguage/Universal_Code_of_Conduct/U4C_Building_Committee/Nominations|sign up on the Meta-Wiki page]], or contact ucocproject[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org by May 12, 2023. '''[[m:Special:MyLanguage/Universal_Code_of_Conduct/U4C_Building_Committee|Read more on Meta-Wiki]]'''.
Best regards,<br /><section end="announcement-content" />
</div>
[[User:Xeno (WMF)|Xeno (WMF)]] 19:01, 26 apr. 2023 (UTC)
<!-- Message sent by User:Xeno (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=24941045 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Selection of the U4C Building Committee</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
The next stage in the Universal Code of Conduct process is establishing a Building Committee to create the charter for the Universal Code of Conduct Coordinating Committee (U4C). The Building Committee has been selected. [[m:Special:MyLanguage/Universal_Code_of_Conduct/U4C_Building_Committee|Read about the members and the work ahead on Meta-wiki]].<section end="announcement-content" />
</div>
-- [[m:Special:MyLanguage/Universal_Code_of_Conduct/Project|UCoC Project Team]], 04:21, 27 maj. 2023 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25018085 -->
== Administranto-kandidatiĝo de KuboF Hromoslav (3a fojo) ==
Miaj administraj rajtoj jam eksvalidiĝis (ĉar la Esperanta Vikivojaĝo estas malgranda projekto, administraj rajtoj estas provizataj nur por 1 jaro). Tial mi denove rekandidatiĝis, bonvolu esprimi vian opinion ĉe [[Vikivojaĝo:Administrantigo/KuboF Hromoslav (3)]]. Antaŭdankon! [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 10:25, 25 jun. 2023 (UTC)
== <span lang="en" dir="ltr" class="mw-content-ltr"> Announcing the new Elections Committee members</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation elections committee/Nominatons/2023/Announcement - new members|You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections committee/Nominatons/2023/Announcement - new members|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections committee/Nominatons/2023/Announcement - new members}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello there,
We are glad to announce [[listarchive:list/wikimedia-l@lists.wikimedia.org/message/4TALOUFPAP2VDBR27GKRVOP7IGQYU3DB/|the new members and advisors of the Elections Committee]]. The [[m:Special:MyLanguage/Wikimedia_Foundation_elections_committee|Elections Committee]] assists with the design and implementation of the process to select Community- and Affiliate-Selected trustees for the Wikimedia Foundation Board of Trustees. After an open nomination process, the strongest candidates spoke with the Board and four candidates were asked to join the Elections Committee. Four other candidates were asked to participate as advisors.
Thank you to all the community members who submitted their names for consideration. We look forward to working with the Elections Committee in the near future.
On behalf of the Wikimedia Foundation Board of Trustees,<br /><section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 18:00, 28 jun. 2023 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25018085 -->
== Wikimania 2023 ==
The Wikimania is started. Tonight is the opening ceremony. I will do a presentation tomorrow about how we have integrated [https://eventyay.com/e/8f889410/session/8369 Wikivoyage at voy/de]. most presentation oare streamed as far as i know. Is somebody here in Singapore as well? Are the other things, problems I should talk about with somebody here? -- [[Uzanto:DerFussi|DerFussi]] ([[Uzanto-Diskuto:DerFussi|diskuto]]) 06:06, 16 aŭg. 2023 (UTC)
== <span lang="en" dir="ltr" class="mw-content-ltr">Review the Charter for the Universal Code of Conduct Coordinating Committee</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''<div class="plainlinks">[[m:Special:MyLanguage/Universal Code of Conduct/U4C Building Committee/Announcement - Review|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/U4C Building Committee/Announcement - Review}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Hello all,
I am pleased to share the next step in the [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct|Universal Code of Conduct]] work. The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|Universal Code of Conduct Coordinating Committee (U4C) draft charter]] is now ready for your review.
The [[foundation:Special:MyLanguage/Policy:Universal Code of Conduct/Enforcement guidelines|Enforcement Guidelines]] require a [[foundation:Special:MyLanguage/Policy:Universal_Code_of_Conduct/Enforcement_guidelines#4.5_U4C_Building_Committee|Building Committee]] form to draft a charter that outlines procedures and details for a global committee to be called the [[foundation:Special:MyLanguage/Policy:Universal_Code_of_Conduct/Enforcement_guidelines#4._UCoC_Coordinating_Committee_(U4C)|Universal Code of Conduct Coordinating Committee (U4C)]]. Over the past few months, the U4C Building Committee worked together as a group to discuss and draft the U4C charter. The U4C Building Committee welcomes feedback about the draft charter now through 22 September 2023. After that date, the U4C Building Committee will revise the charter as needed and a community vote will open shortly afterward.
Join the conversation during the [[m:Special:MyLanguage/Universal Code of Conduct/U4C Building Committee#Conversation hours|conversation hours]] or on [[m:Talk:Universal Code of Conduct/Coordinating Committee/Charter|Meta-wiki]].
Best,<br /><section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]], on behalf of the U4C Building Committee, 15:35, 28 aŭg. 2023 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25392152 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">== Opportunities open for the Affiliations Committee, Ombuds commission, and the Case Review Committee ==</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
<div style="margin:.2em 0 .5em;margin-{{#switch:{{PAGELANGUAGE}}|ar|arc|ary|arz|azb|bcc|bgn|ckb|bqi|dv|fa|fa-af|glk|ha-arab|he|kk-arab|kk-cn|ks|ku-arab|ms-arab|mzn|pnb|prd|ps|sd|ug|ur|ydd|yi=right|left}}:3ex;">
[[m:Special:MyLanguage/Wikimedia Foundation Legal department/Committee appointments/Announcement/Short|''You can find this message translated into additional languages on Meta-wiki.'']]
''<span class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation Legal department/Committee appointments/Announcement/Short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Legal department/Committee appointments/Announcement/Short}}&language=&action=page&filter= {{int:please-translate}}]</span>''</div>
Hi everyone! The [[m:Special:MyLanguage/Affiliations Committee|Affiliations Committee]] (AffCom), [[m:Special:MyLanguage/Ombuds_commission|Ombuds commission]] (OC), and the [[m:Special:MyLanguage/Trust_and_Safety/Case_Review_Committee|Case Review Committee]] (CRC) are looking for new members. These volunteer groups provide important structural and oversight support for the community and movement. People are encouraged to nominate themselves or encourage others they feel would contribute to these groups to apply. There is more information about the roles of the groups, the skills needed, and the opportunity to apply on the [[m:Special:MyLanguage/Wikimedia Foundation Legal department/Committee appointments|'''Meta-wiki page''']].
On behalf of the Committee Support team,<br /><section end="announcement-content" />
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
~ [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 16:41, 9 okt. 2023 (UTC) </div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25570445 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Review and comment on the 2024 Wikimedia Foundation Board of Trustees selection rules package</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/wiki/Wikimedia Foundation elections/2024/Announcement/Rules package review - short| You can find this message translated into additional languages on Meta-wiki.]]''
:''<div class="plainlinks">[[m:Special:MyLanguage/wiki/Wikimedia Foundation elections/2024/Announcement/Rules package review - short|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:wiki/Wikimedia Foundation elections/2024/Announcement/Rules package review - short}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Dear all,
Please review and comment on the Wikimedia Foundation Board of Trustees selection rules package from now until 29 October 2023. The selection rules package was based on older versions by the Elections Committee and will be used in the 2024 Board of Trustees selection. Providing your comments now will help them provide a smoother, better Board selection process. [[m:Special:MyLanguage/Wikimedia Foundation elections/2024|More on the Meta-wiki page]].
Best,
Katie Chan <br>
Chair of the Elections Committee<br /><section end="announcement-content" />
</div>
01:13, 17 okt. 2023 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25570445 -->
== The Vector 2022 skin as the default in three weeks? ==
<div lang="en" dir="ltr" class="mw-content-ltr">
''[[mw:Special:MyLanguage/Reading/Web/Desktop Improvements/Updates/2023-10 for sister projects|Read this in your language]] • <span class=plainlinks>[https://mediawiki.org/w/index.php?title=Special:Translate&group=page-Reading%2FWeb%2FDesktop+Improvements%2FUpdates%2F2023-10+for+sister+projects&language=&action=page&filter= {{Int:please-translate}}]</span> • Please tell other users about these changes''
Hello. I'm writing on behalf of the [[mw:Reading/Web|Wikimedia Foundation Web team]]. '''In two weeks, we would like to make the Vector 2022 skin the default on this wiki.'''
[[File:Desktop Improvements - how to enable globally.png|thumb|[[Special:GlobalPreferences|{{int:globalpreferences}}]]]]
'''If you prefer keeping the current skin''' select "Vector legacy (2010)" on [[Special:GlobalPreferences#mw-prefsection-rendering|the appearance tab of the global preferences]] and save the change. We encourage you to give the new skin a try, though.
Since I last came to you with this question, many things have changed. The skin is now the default on most Wikipedias, and all logos are done! We have also made some tweaks in the skin itself. Below is the text I've sent to you once, but I'm sending it again, just slightly edited, for those who haven't seen it.
If you know what this is about, jump straight to the section "Our plan":
<div style="margin-left:.5em; border-left:3px dotted #a2a9b1; padding-left:.5em;">
It would become the default for all logged-out users, and also all logged-in users who currently use Vector legacy as a [[Special:Preferences#mw-prefsection-rendering|local]] (but not global) preference. Logged-in users can at any time switch to any other skin. No changes are expected for these skins.
<div style="width:100%; margin:auto;"><gallery widths="250" heights="180" mode="packed" caption="Top of an article">
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2010 top.png|Vector legacy (current default)
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2022 top.png|Vector 2022
</gallery><gallery widths="250" heights="180" mode="packed" caption="A section of an article">
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2010 scrolled.png|Vector legacy (current default)
Screenshot Historia da moeda do Tíbet - 2022-09-22 - Vector 2022 scrolled.png|Vector 2022
</gallery></div>
=== About the skin ===
[[File:Wikimania 2022 Vector (2022) Presentation.pdf|thumb|Slides to our Wikimania 2022 presentation. [https://www.youtube.com/watch?v=yC-ItaXDe2A You may also listen to the recording on YouTube (in English)].]]
'''[Why is a change necessary]''' When the current default skin was created, it reflected the needs of the readers and editors as these were 14 years ago. Since then, new users have begun using the Internet and Wikimedia projects in different ways. [[wmfblog:2022/08/18/prioritizing-equity-within-wikipedias-new-desktop/|The old Vector does not meet their needs]].
'''[Objective]''' The objective for the Vector 2022 skin is to make the interface more welcoming and comfortable for readers and useful for advanced users. It introduces a series of changes that aim to improve problems new and existing readers and editors were having with the old skin. It draws inspiration from previous user requests, the [[metawiki:Special:MyLanguage/Community_Wishlist_Survey|Community Wishlist Surveys]], and gadgets and scripts. The work helped our code follow the standards and improve all other skins. [[phab:phame/post/view/290/how_and_why_we_moved_our_skins_to_mustache/|The PHP code in the other available skins has been reduced by 75%]]. The project has also focused on making it easier to support gadgets and use APIs.
[[File:Screenshot of the Vector-2022 skin's fullscreen toggle.png|thumb]]
'''[Changes in a nutshell]''' The skin introduces changes that improve readability and usability. The new skin does not remove any functionality currently available on the Vector skin.
* The limited width and pin-able menus allow to adjust the interface to the screen size, and focus on editing or reading. Logged-in and logged-out users may use a toggle button to keep the full width, though.
* The sticky header makes it easier to find tools that editors use often. It decreases scrolling to the top of the page by 16%.
* The new table of contents makes it easier to navigate to different sections. Readers and editors jump to different sections of the page 50% more than with the old table of contents. It also looks a bit different on talk pages.
* The new search bar is easier to find and makes it easier to find the correct search result from the list. This increased the amount of searches started by 30% on the tested wikis.
* The skin does not negatively affect pageviews, edit rates, or account creation. There is evidence of increases in pageviews and account creation across partner communities.
'''[Customize this skin]''' It's possible to configure and personalize our changes. We support volunteers who create new gadgets and user scripts. Check out [[mw:Special:MyLanguage/Reading/Web/Desktop Improvements/Repository|the repository]] for a list of currently available customizations and changes, or add your own.
</div>
=== Our plan ===
'''If no large concerns are raised, we plan on deploying on 14 November'''. If you'd like to ask our team anything, if you have questions, concerns, or additional thoughts, please comment in any language. If this is the first comment to my message, make sure to ping me. We will gladly answer! Also, check out [[mw:Reading/Web/Desktop Improvements/Frequently asked questions|our FAQ]]. Thank you! [[User:SGrabarczuk (WMF)|SGrabarczuk (WMF)]] ([[User talk:SGrabarczuk (WMF)|<span class="signature-talk">diskuto</span>]]) 01:09, 26 okt. 2023 (UTC)
</div>
<!-- Message sent by User:SGrabarczuk (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Varia&oldid=25791651 -->
== [ĝis 17-a de Novembro] Subtenu mian kandidatiĝon al AffCom ==
'''Resumo''': Mi kandidatiĝis por servado en la Komitato pri aligitaj organizoj de la Fondaĵo Vikimedio (AffCom) por helpi solvi ĝiajn problemojn, kiuj dum jaroj damaĝas ankaŭ la Esperantan komunumon. Bonvolu subteni min aldonante <nowiki>{{Strong support}}</nowiki> (forta subteno) ĉe '''[[:meta:Affiliations_Committee/Candidates/2023#KuboF_Hromoslav]]'''
Karaj, dum lastaj jaroj Vikimedio EO klopodas esti rekonita de la Fondaĵo Vikimedio kiel Tema organizo (nun ni estas Uzanto-Grupo, kio estas malpli alta ŝtupo). Bedaŭrinde tiu ĉi nia klopodo estis haltigita de la [[metawiki:Special:MyLanguage/Affiliations_Committee|Komitato pri aligitaj organizoj]] (AffCom), kiu dum jaroj ne havas sufiĉajn kapacitojn por sia respondeca funkciado. Bedaŭrinde, ilia subakapciteco montriĝis esti tiom drasta, ke ili bezonis ĉ. 5 monatojn de celita plua edukado por taŭge respondi bazlernej-nivelan demandon (konkrete kiam ili decidis haltigi nian rekonon). Mi daŭre komunikas kun AffCom ankaŭ pri aferoj ekster VMEO kaj mi respondece konfirmas, ke AffCom daŭre havas drastajn problemojn - disvastigas malveraĵojn, ne korektas ilin kiam oni atentigas pri tio, fiaskas respondi bazlernej-nivelajn demandojn ks.
Tiu ĉi subkapaciteco de AffCom bedaŭrinde ne nur '''kostas monon''' al la Fondaĵo Vikimedio (kiu pagas (kaj sufiĉe multe) al siaj dungitoj por provizadi helpon al AffCom, kaj tiu multekosta helpado estas pli alta ol taŭge pro la nekapabloj de AffCom). Sed ĝi ankaŭ '''forsuĉas energion de Vikimediaj organizoj kiel Vikimedio EO'''. Pro tio la komunumoj de Vikipedio kaj aliaj projektoj ne disvolviĝas tiom bone kaj rapide kiom eblus kun taŭga subteno. Rezulte de tio, la socioj parolantaj ties lingvojn ne edukiĝas tiom rapide, profunde kaj vaste kiom ili povus kun pli bona funkciado de Vikipedioj (kio havas konsekvencojn ekz en nesufiĉe rapida preventado de klimata ŝanĝo, nesufiĉa pacigado de mondo kaj daŭre ĉeesta granda neegaleco).
Mi jam havas tre (fakte tro) multan laboron, sed mi vidas, ke la damaĝo kiun kreas la subkapaciteco de AffCom estas tro maltaŭga kaj detrua ankaŭ por nia Esperanta komunumo. Tial mi decidis kandidatiĝi por AffCom kaj helpi ĝin deinterne. Tio bedaŭrinde prenos iom de mia tempo, kiun mi preferas dediĉi al VMEO, sed samtempe (mi esperas, ke) helpos glatigi la padon kaj kunlaboradon de VMEO kun AffCom, kaj samtempe plifortigos ankaŭ aliajn Vikimediajn organizojn, de kies sukcesoj ni povos profiti (ekz. lernante de ili, aŭ kunlaborante en subvenciataj projektoj de Erasmus+ ktp).
'''Por tio tamen indas via subteno!''' Mi petas, '''legu mian kandidatiĝon''' kaj se vi subtenas tion, bv. en la parto "'''Endorsements (KuboF Hromoslav)'''" '''subteni min aldonante <nowiki>{{Strong support}}</nowiki>''' (forta subteno) aŭ <nowiki>{{Support}}</nowiki> (subteno), ideale ankaŭ kun certa komento (povas esti en Esperanto ;)
'''[[:meta:Affiliations_Committee/Candidates/2023#KuboF_Hromoslav]]'''
Mi anticipe dankas vin pro via helpo al mia helpado de disvolvigo de tutmonda Vikimedia komunumo! [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 16:19, 10 nov. 2023 (UTC)
== <span lang="en" dir="ltr" class="mw-content-ltr">Vote on the Charter for the Universal Code of Conduct Coordinating Committee</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - voting opens|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - voting opens}}&language=&action=page&filter= {{int:please-translate}}]''
Hello all,
I am reaching out to you today to announce that the voting period for the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) Charter is now open. Community members may [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter/Voter_information|cast their vote and provide comments about the charter via SecurePoll]] now through '''2 February 2024'''. Those of you who voiced your opinions during the development of the [[foundation:Special:MyLanguage/Policy:Universal_Code_of_Conduct/Enforcement_guidelines|UCoC Enforcement Guidelines]] will find this process familiar.
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|current version of the U4C Charter]] is on Meta-wiki with translations available.
Read the charter, go vote and share this note with others in your community. I can confidently say the U4C Building Committee looks forward to your participation.
On behalf of the UCoC Project team,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 18:09, 19 jan. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25853527 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Last days to vote on the Charter for the Universal Code of Conduct Coordinating Committee</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - voting reminder|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - voting reminder}}&language=&action=page&filter= {{int:please-translate}}]''
Hello all,
I am reaching out to you today to remind you that the voting period for the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) charter will close on '''2 February 2024'''. Community members may [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter/Voter_information|cast their vote and provide comments about the charter via SecurePoll]]. Those of you who voiced your opinions during the development of the [[foundation:Special:MyLanguage/Policy:Universal_Code_of_Conduct/Enforcement_guidelines|UCoC Enforcement Guidelines]] will find this process familiar.
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|current version of the U4C charter]] is on Meta-wiki with translations available.
Read the charter, go vote and share this note with others in your community. I can confidently say the U4C Building Committee looks forward to your participation.
On behalf of the UCoC Project team,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 17:01, 31 jan. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25853527 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Announcing the results of the UCoC Coordinating Committee Charter ratification vote</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - results|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - results}}&language=&action=page&filter= {{int:please-translate}}]''
Dear all,
Thank you everyone for following the progress of the Universal Code of Conduct. I am writing to you today to announce the outcome of the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter/Voter_information|ratification vote]] on the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|Universal Code of Conduct Coordinating Committee Charter]]. 1746 contributors voted in this ratification vote with 1249 voters supporting the Charter and 420 voters not. The ratification vote process allowed for voters to provide comments about the Charter.
A report of voting statistics and a summary of voter comments will be published on Meta-wiki in the coming weeks.
Please look forward to hearing about the next steps soon.
On behalf of the UCoC Project team,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 18:24, 12 feb. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26160150 -->
== <span lang="en" dir="ltr" class="mw-content-ltr"> Report of the U4C Charter ratification and U4C Call for Candidates now available</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – call for candidates| You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – call for candidates}}&language=&action=page&filter= {{int:please-translate}}]''
Hello all,
I am writing to you today with two important pieces of information. First, the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter/Vote results|report of the comments from the Universal Code of Conduct Coordinating Committee (U4C) Charter ratification]] is now available. Secondly, the call for candidates for the U4C is open now through April 1, 2024.
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. Community members are invited to submit their applications for the U4C. For more information and the responsibilities of the U4C, please [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|review the U4C Charter]].
Per the charter, there are 16 seats on the U4C: eight community-at-large seats and eight regional seats to ensure the U4C represents the diversity of the movement.
Read more and submit your application on [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024|Meta-wiki]].
On behalf of the UCoC project team,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 16:25, 5 mar. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26276337 -->
== <span lang="en" dir="ltr" class="mw-content-ltr"> Wikimedia Foundation Board of Trustees 2024 Selection</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
: ''[[m:Special:MyLanguage/Wikimedia Foundation elections/2024/Announcement/Selection announcement| You can find this message translated into additional languages on Meta-wiki.]]''
: ''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2024/Announcement/Selection announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2024/Announcement/Selection announcement}}&language=&action=page&filter= {{int:please-translate}}]</div>''
Dear all,
This year, the term of 4 (four) Community- and Affiliate-selected Trustees on the Wikimedia Foundation Board of Trustees will come to an end [1]. The Board invites the whole movement to participate in this year’s selection process and vote to fill those seats.
The [[m:Special:MyLanguage/Wikimedia Foundation elections committee|Elections Committee]] will oversee this process with support from Foundation staff [2]. The Board Governance Committee created a Board Selection Working Group from Trustees who cannot be candidates in the 2024 community- and affiliate-selected trustee selection process composed of Dariusz Jemielniak, Nataliia Tymkiv, Esra'a Al Shafei, Kathy Collins, and Shani Evenstein Sigalov [3]. The group is tasked with providing Board oversight for the 2024 trustee selection process, and for keeping the Board informed. More details on the roles of the Elections Committee, Board, and staff are here [4].
Here are the key planned dates:
* May 2024: Call for candidates and call for questions
* June 2024: Affiliates vote to shortlist 12 candidates (no shortlisting if 15 or less candidates apply) [5]
* June-August 2024: Campaign period
* End of August / beginning of September 2024: Two-week community voting period
* October–November 2024: Background check of selected candidates
* Board's Meeting in December 2024: New trustees seated
Learn more about the 2024 selection process - including the detailed timeline, the candidacy process, the campaign rules, and the voter eligibility criteria - on [[m:Special:MyLanguage/Wikimedia Foundation elections/2024|this Meta-wiki page]], and make your plan.
'''Election Volunteers'''
Another way to be involved with the 2024 selection process is to be an Election Volunteer. Election Volunteers are a bridge between the Elections Committee and their respective community. They help ensure their community is represented and mobilize them to vote. Learn more about the program and how to join on this [[m:Special:MyLanguage/Wikimedia Foundation elections/2024/Election Volunteers|Meta-wiki page]].
Best regards,
[[m:Special:MyLanguage/User:Pundit|Dariusz Jemielniak]] (Governance Committee Chair, Board Selection Working Group)
[1] https://meta.wikimedia.org/wiki/Special:MyLanguage/Wikimedia_Foundation_elections/2021/Results#Elected
[2] https://foundation.wikimedia.org/wiki/Committee:Elections_Committee_Charter
[3] https://foundation.wikimedia.org/wiki/Minutes:2023-08-15#Governance_Committee
[4] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections_committee/Roles
[5] Even though the ideal number is 12 candidates for 4 open seats, the shortlisting process will be triggered if there are more than 15 candidates because the 1-3 candidates that are removed might feel ostracized and it would be a lot of work for affiliates to carry out the shortlisting process to only eliminate 1-3 candidates from the candidate list.<section end="announcement-content" />
</div>
[[User:MPossoupe_(WMF)|MPossoupe_(WMF)]]19:57, 12 mar. 2024 (UTC)
<!-- Message sent by User:MPossoupe (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26349432 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Vote now to select members of the first U4C</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – vote opens|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – vote opens}}&language=&action=page&filter= {{int:please-translate}}]''
Dear all,
I am writing to you to let you know the voting period for the Universal Code of Conduct Coordinating Committee (U4C) is open now through May 9, 2024. Read the information on the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024|voting page on Meta-wiki]] to learn more about voting and voter eligibility.
The Universal Code of Conduct Coordinating Committee (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. Community members were invited to submit their applications for the U4C. For more information and the responsibilities of the U4C, please [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|review the U4C Charter]].
Please share this message with members of your community so they can participate as well.
On behalf of the UCoC project team,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 20:20, 25 apr. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Sign up for the language community meeting on May 31st, 16:00 UTC</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="message"/>Hello all,
The next language community meeting is scheduled in a few weeks - May 31st at 16:00 UTC. If you're interested, you can [https://www.mediawiki.org/w/index.php?title=Wikimedia_Language_engineering/Community_meetings#31_May_2024 sign up on this wiki page].
This is a participant-driven meeting, where we share language-specific updates related to various projects, collectively discuss technical issues related to language wikis, and work together to find possible solutions. For example, in the last meeting, the topics included the machine translation service (MinT) and the languages and models it currently supports, localization efforts from the Kiwix team, and technical challenges with numerical sorting in files used on Bengali Wikisource.
Do you have any ideas for topics to share technical updates related to your project? Any problems that you would like to bring for discussion during the meeting? Do you need interpretation support from English to another language? Please reach out to me at ssethi(__AT__)wikimedia.org and [[etherpad:p/language-community-meeting-may-2024|add agenda items to the document here]].
We look forward to your participation!
<section end="message"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:23, 14 maj. 2024 (UTC)
<!-- Message sent by User:SSethi (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244 -->
== <span lang="en" dir="ltr" class="mw-content-ltr"> Feedback invited on Procedure for Sibling Project Lifecycle</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle/Invitation for feedback (MM)|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle/Invitation for feedback (MM)}}&language=&action=page&filter= {{int:please-translate}}]''
[[File:Sibling Project Lifecycle Conversation 3.png|150px|right|link=:m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle]]
Dear community members,
The [[:m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee|Community Affairs Committee]] (CAC) of the [[:m:Special:MyLanguage/Wikimedia Foundation Board of Trustees|Wikimedia Foundation Board of Trustees]] invites you to give feedback on a '''[[:m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle|draft Procedure for Sibling Project Lifecycle]]'''. This draft Procedure outlines proposed steps and requirements for opening and closing Wikimedia Sibling Projects, and aims to ensure any newly approved projects are set up for success. This is separate from the procedures for opening or closing language versions of projects, which is handled by the [[:m:Special:MyLanguage/Language committee|Language Committee]] or [[m:Special:MyLanguage/Closing_projects_policy|closing projects policy]].
You can find the details on [[:m:Special:MyLanguage/Talk:Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle#Review|this page]], as well as the ways to give your feedback from today until the end of the day on '''June 23, 2024''', anywhere on Earth.
You can also share information about this with the interested project communities you work with or support, and you can also help us translate the procedure into more languages, so people can join the discussions in their own language.
On behalf of the CAC,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 02:26, 22 maj. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Announcing the first Universal Code of Conduct Coordinating Committee</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – results|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – results}}&language=&action=page&filter= {{int:please-translate}}]''
Hello,
The scrutineers have finished reviewing the vote results. We are following up with the results of the first [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024|Universal Code of Conduct Coordinating Committee (U4C) election]].
We are pleased to announce the following individuals as regional members of the U4C, who will fulfill a two-year term:
* North America (USA and Canada)
** –
* Northern and Western Europe
** [[m:Special:MyLanguage/User:Ghilt|Ghilt]]
* Latin America and Caribbean
** –
* Central and East Europe (CEE)
** —
* Sub-Saharan Africa
** –
* Middle East and North Africa
** [[m:Special:MyLanguage/User:Ibrahim.ID|Ibrahim.ID]]
* East, South East Asia and Pacific (ESEAP)
** [[m:Special:MyLanguage/User:0xDeadbeef|0xDeadbeef]]
* South Asia
** –
The following individuals are elected to be community-at-large members of the U4C, fulfilling a one-year term:
* [[m:Special:MyLanguage/User:Barkeep49|Barkeep49]]
* [[m:Special:MyLanguage/User:Superpes15|Superpes15]]
* [[m:Special:MyLanguage/User:Civvì|Civvì]]
* [[m:Special:MyLanguage/User:Luke081515|Luke081515]]
* –
* –
* –
* –
Thank you again to everyone who participated in this process and much appreciation to the candidates for your leadership and dedication to the Wikimedia movement and community.
Over the next few weeks, the U4C will begin meeting and planning the 2024-25 year in supporting the implementation and review of the UCoC and Enforcement Guidelines. Follow their work on [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Meta-wiki]].
On behalf of the UCoC project team,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 08:15, 3 jun. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">The final text of the Wikimedia Movement Charter is now on Meta</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Announcement - Final draft available|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/Announcement - Final draft available}}&language=&action=page&filter= {{int:please-translate}}]''
Hi everyone,
The final text of the [[m:Special:MyLanguage/Movement Charter|Wikimedia Movement Charter]] is now up on Meta in more than 20 languages for your reading.
'''What is the Wikimedia Movement Charter?'''
The Wikimedia Movement Charter is a proposed document to define roles and responsibilities for all the members and entities of the Wikimedia movement, including the creation of a new body – the Global Council – for movement governance.
'''Join the Wikimedia Movement Charter “Launch Party”'''
Join the [[m:Special:MyLanguage/Event:Movement Charter Launch Party|“Launch Party”]] on '''June 20, 2024''' at '''14.00-15.00 UTC''' ([https://zonestamp.toolforge.org/1718892000 your local time]). During this call, we will celebrate the release of the final Charter and present the content of the Charter. Join and learn about the Charter before casting your vote.
'''Movement Charter ratification vote'''
Voting will commence on SecurePoll on '''June 25, 2024''' at '''00:01 UTC''' and will conclude on '''July 9, 2024''' at '''23:59 UTC.''' You can read more about the [[m:Special:MyLanguage/Movement Charter/Ratification/Voting|voting process, eligibility criteria, and other details]] on Meta.
If you have any questions, please leave a comment on the [[m:Special:MyLanguage/Talk:Movement Charter|Meta talk page]] or email the MCDC at [mailto:mcdc@wikimedia.org mcdc@wikimedia.org].
On behalf of the MCDC,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 08:45, 11 jun. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Voting to ratify the Wikimedia Movement Charter is now open – cast your vote</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Announcement - Ratification vote opens|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/Announcement - Ratification vote opens}}&language=&action=page&filter= {{int:please-translate}}]''
Hello everyone,
The voting to ratify the [[m:Special:MyLanguage/Movement Charter|'''Wikimedia Movement Charter''']] is now open. The Wikimedia Movement Charter is a document to define roles and responsibilities for all the members and entities of the Wikimedia movement, including the creation of a new body – the Global Council – for movement governance.
The final version of the Wikimedia Movement Charter is [[m:Special:MyLanguage/Movement Charter|available on Meta in different languages]] and attached [https://commons.wikimedia.org/wiki/File:Wikimedia_Movement_Charter_(June_2024).pdf here in PDF format] for your reading.
Voting commenced on SecurePoll on '''June 25, 2024''' at '''00:01 UTC''' and will conclude on '''July 9, 2024''' at '''23:59 UTC'''. Please read more on the [[m:Special:MyLanguage/Movement Charter/Ratification/Voting|voter information and eligibility details]].
After reading the Charter, please [[Special:SecurePoll/vote/398|'''vote here''']] and share this note further.
If you have any questions about the ratification vote, please contact the Charter Electoral Commission at [mailto:cec@wikimedia.org '''cec@wikimedia.org'''].
On behalf of the CEC,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 10:52, 25 jun. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Voting to ratify the Wikimedia Movement Charter is ending soon</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Announcement - Final reminder|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/Announcement - Final reminder}}&language=&action=page&filter= {{int:please-translate}}]''
Hello everyone,
This is a kind reminder that the voting period to ratify the [[m:Special:MyLanguage/Movement Charter|Wikimedia Movement Charter]] will be closed on '''July 9, 2024''', at '''23:59 UTC'''.
If you have not voted yet, please vote [[m:Special:SecurePoll/vote/398|on SecurePoll]].
On behalf of the [[m:Special:MyLanguage/Movement_Charter/Ratification/Voting#Electoral_Commission|Charter Electoral Commission]],<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 03:46, 8 jul. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">U4C Special Election - Call for Candidates</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement – call for candidates|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement – call for candidates}}&language=&action=page&filter= {{int:please-translate}}]''
Hello all,
A special election has been called to fill additional vacancies on the U4C. The call for candidates phase is open from now through July 19, 2024.
The [[:m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the [[:foundation:Wikimedia Foundation Universal Code of Conduct|UCoC]]. Community members are invited to submit their applications in the special election for the U4C. For more information and the responsibilities of the U4C, please review the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|U4C Charter]].
In this special election, according to [[Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter#2. Elections and Terms|chapter 2 of the U4C charter]], there are 9 seats available on the U4C: '''four''' community-at-large seats and '''five''' regional seats to ensure the U4C represents the diversity of the movement. [[Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter#5. Glossary|No more than two members of the U4C can be elected from the same home wiki]]. Therefore, candidates must not have English Wikipedia, German Wikipedia, or Italian Wikipedia as their home wiki.
Read more and submit your application on [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election|Meta-wiki]].
In cooperation with the U4C,<section end="announcement-content" />
</div>
-- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 00:03, 10 jul. 2024 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Wikimedia Movement Charter ratification voting results</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Movement Charter/Drafting Committee/Announcement - Results of the ratification vote|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Movement Charter/Drafting Committee/Announcement - Results of the ratification vote}}&language=&action=page&filter= {{int:please-translate}}]''
Hello everyone,
After carefully tallying both individual and affiliate votes, the [[m:Special:MyLanguage/Movement Charter/Ratification/Voting#Electoral Commission|Charter Electoral Commission]] is pleased to announce the final results of the Wikimedia Movement Charter voting.
As [[m:Special:MyLanguage/Talk:Movement Charter#Thank you for your participation in the Movement Charter ratification vote!|communicated]] by the Charter Electoral Commission, we reached the quorum for both Affiliate and individual votes by the time the vote closed on '''July 9, 23:59 UTC'''. We thank all 2,451 individuals and 129 Affiliate representatives who voted in the ratification process. Your votes and comments are invaluable for the future steps in Movement Strategy.
The final results of the [[m:Special:MyLanguage/Movement Charter|Wikimedia Movement Charter]] ratification voting held between 25 June and 9 July 2024 are as follows:
'''Individual vote:'''
Out of 2,451 individuals who voted as of July 9 23:59 (UTC), 2,446 have been accepted as valid votes. Among these, '''1,710''' voted “yes”; '''623''' voted “no”; and '''113''' selected “–” (neutral). Because the neutral votes don’t count towards the total number of votes cast, 73.30% voted to approve the Charter (1710/2333), while 26.70% voted to reject the Charter (623/2333).
'''Affiliates vote:'''
Out of 129 Affiliates designated voters who voted as of July 9 23:59 (UTC), 129 votes are confirmed as valid votes. Among these, '''93''' voted “yes”; '''18''' voted “no”; and '''18''' selected “–” (neutral). Because the neutral votes don’t count towards the total number of votes cast, 83.78% voted to approve the Charter (93/111), while 16.22% voted to reject the Charter (18/111).
'''Board of Trustees of the Wikimedia Foundation:'''
The Wikimedia Foundation Board of Trustees voted '''not to ratify''' the proposed Charter during their special Board meeting on July 8, 2024. The Chair of the Wikimedia Foundation Board of Trustees, Nataliia Tymkiv, [[m:Special:MyLanguage/Wikimedia_Foundation_Board_noticeboard/Board_resolution_and_vote_on_the_proposed_Movement_Charter|shared the result of the vote, the resolution, meeting minutes and proposed next steps]].
With this, the Wikimedia Movement Charter in its current revision is '''not ratified'''.
We thank you for your participation in this important moment in our movement’s governance.
The Charter Electoral Commission,
[[m:User:Abhinav619|Abhinav619]], [[m:User:Borschts|Borschts]], [[m:User:Iwuala Lucy|Iwuala Lucy]], [[m:User:Tochiprecious|Tochiprecious]], [[m:User:Der-Wir-Ing|Der-Wir-Ing]]<section end="announcement-content" />
</div>
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 17:52, 18 jul. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Vote now to fill vacancies of the first U4C</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement – voting opens|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement – voting opens}}&language=&action=page&filter= {{int:please-translate}}]''
Dear all,
I am writing to you to let you know the voting period for the Universal Code of Conduct Coordinating Committee (U4C) is open now through '''August 10, 2024'''. Read the information on the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election|voting page on Meta-wiki]] to learn more about voting and voter eligibility.
The Universal Code of Conduct Coordinating Committee (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. Community members were invited to submit their applications for the U4C. For more information and the responsibilities of the U4C, please [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|review the U4C Charter]].
Please share this message with members of your community so they can participate as well.
In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 02:47, 27 jul. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444 -->
== <span lang="en" dir="ltr" class="mw-content-ltr">Reminder! Vote closing soon to fill vacancies of the first U4C</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement – reminder to vote|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement – reminder to vote}}&language=&action=page&filter= {{int:please-translate}}]''
Dear all,
The voting period for the Universal Code of Conduct Coordinating Committee (U4C) is closing soon. It is open through 10 August 2024. Read the information on [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2024_Special_Election#Voting|the voting page on Meta-wiki to learn more about voting and voter eligibility]]. If you are eligible to vote and have not voted in this special election, it is important that you vote now.
'''Why should you vote?''' The U4C is a global group dedicated to providing an equitable and consistent implementation of the UCoC. Community input into the committee membership is critical to the success of the UCoC.
Please share this message with members of your community so they can participate as well.
In cooperation with the U4C,<section end="announcement-content" />
</div>
-- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 15:30, 6 aŭg. 2024 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190 -->
== <span lang="en" dir="ltr">Coming soon: A new sub-referencing feature – try it!</span> ==
<div lang="en" dir="ltr">
<section begin="Sub-referencing"/>
[[File:Sub-referencing reuse visual.png|{{#ifeq:{{#dir}}|ltr|right|left}}|400px]]
Hello. For many years, community members have requested an easy way to re-use references with different details. Now, a MediaWiki solution is coming: The new sub-referencing feature will work for wikitext and Visual Editor and will enhance the existing reference system. You can continue to use different ways of referencing, but you will probably encounter sub-references in articles written by other users. More information on [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|the project page]].
'''We want your feedback''' to make sure this feature works well for you:
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#Test|Please try]] the current state of development on beta wiki and [[m:Talk:WMDE Technical Wishes/Sub-referencing|let us know what you think]].
* [[m:WMDE Technical Wishes/Sub-referencing/Sign-up|Sign up here]] to get updates and/or invites to participate in user research activities.
[[m:Special:MyLanguage/Wikimedia Deutschland|Wikimedia Deutschland]]’s [[m:Special:MyLanguage/WMDE Technical Wishes|Technical Wishes]] team is planning to bring this feature to Wikimedia wikis later this year. We will reach out to creators/maintainers of tools and templates related to references beforehand.
Please help us spread the message. --[[m:User:Johannes Richter (WMDE)|Johannes Richter (WMDE)]] ([[m:User talk:Johannes Richter (WMDE)|talk]]) 10:36, 19 August 2024 (UTC)
<section end="Sub-referencing"/>
</div>
<!-- Message sent by User:Johannes Richter (WMDE)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Johannes_Richter_(WMDE)/Sub-referencing/massmessage_list&oldid=27309345 -->
== Sign up for the language community meeting on August 30th, 15:00 UTC ==
Hi all,
The next language community meeting is scheduled in a few weeks—on August 30th at 15:00 UTC. If you're interested in joining, you can [https://www.mediawiki.org/wiki/Wikimedia_Language_and_Product_Localization/Community_meetings#30_August_2024 sign up on this wiki page].
This participant-driven meeting will focus on sharing language-specific updates related to various projects, discussing technical issues related to language wikis, and working together to find possible solutions. For example, in the last meeting, topics included the Language Converter, the state of language research, updates on the Incubator conversations, and technical challenges around external links not working with special characters on Bengali sites.
Do you have any ideas for topics to share technical updates or discuss challenges? Please add agenda items to the document [https://etherpad.wikimedia.org/p/language-community-meeting-aug-2024 here] and reach out to ssethi(__AT__)wikimedia.org. We look forward to your participation!
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 23:20, 22 aŭg. 2024 (UTC)
<!-- Message sent by User:SSethi (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190 -->
== Roll out of Parsoid Read Views on Esperanto Wikivoyage this week ==
{{Int:Please-translate}}
<div lang="en" dir="ltr" class="mw-content-ltr">
Hello everyone, I am glad to inform you that as part of our continued rollout of Parsoid Read Views, Parsoid has been turned this week as the default read views renderer on Esperanto, Swedish, and Finnish Wikivoyages. [[mw:Parsoid/Parser Unification/Confidence Framework/Reports#Deployment_Readiness_for_Esperanto,_Swedish,_and_Finnish_Wikivoyages|Here's the rationale]] behind our confidence to roll-out this experimental feature and collect feedback.
This is an opportunity for continued experimentation as we increase the number of wikis using Parsoid for read views.
If this disrupts your workflow, don’t worry you can still opt out through a user preference or turn Parsoid off on the page you’re navigating in the Tools submenu, as described at the [[mw:Help:Extension:ParserMigration|Extension:ParserMigration]] page.
To report bugs and issues, please look at our [[mw:Special:MyLanguage/Parsoid/Parser Unification/Known Issues|known issues]] documentation and if you found a new bug please create a phab ticket and tag the [[phab:project/view/5846|Content Transform Team in Phabricator]].
There is [[mw:Parsoid/Parser_Unification/Confidence_Framework|more information about our roll-out strategy]] available.
Best regards, [[User:CAnanian (WMF)|C. Scott Ananian]], for the Content Transform Team
</div> [[Uzanto:CAnanian (WMF)|CAnanian (WMF)]] ([[Uzanto-Diskuto:CAnanian (WMF)|diskuto]]) 21:34, 29 aŭg. 2024 (UTC)
== <span lang="en" dir="ltr">Announcing the Universal Code of Conduct Coordinating Committee</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
:''[https://lists.wikimedia.org/hyperkitty/list/board-elections@lists.wikimedia.org/thread/OKCCN2CANIH2K7DXJOL2GPVDFWL27R7C/ Original message at wikimedia-l]. [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement - results|You can find this message translated into additional languages on Meta-wiki.]] [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Announcement - results}}&language=&action=page&filter= {{int:please-translate}}]''
Hello all,
The scrutineers have finished reviewing the vote and the [[m:Special:MyLanguage/Elections Committee|Elections Committee]] have certified the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election/Results|results]] for the [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024 Special Election|Universal Code of Conduct Coordinating Committee (U4C) special election]].
I am pleased to announce the following individual as regional members of the U4C, who will fulfill a term until 15 June 2026:
* North America (USA and Canada)
** Ajraddatz
The following seats were not filled during this special election:
* Latin America and Caribbean
* Central and East Europe (CEE)
* Sub-Saharan Africa
* South Asia
* The four remaining Community-At-Large seats
Thank you again to everyone who participated in this process and much appreciation to the candidates for your leadership and dedication to the Wikimedia movement and community.
Over the next few weeks, the U4C will begin meeting and planning the 2024-25 year in supporting the implementation and review of the UCoC and Enforcement Guidelines. You can follow their work on [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Meta-Wiki]].
On behalf of the U4C and the Elections Committee,<section end="announcement-content" />
</div>
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] 14:07, 2 sep. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190 -->
== <span lang="en" dir="ltr">Have your say: Vote for the 2024 Board of Trustees!</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Hello all,
The voting period for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2024|2024 Board of Trustees election]] is now open. There are twelve (12) candidates running for four (4) seats on the Board.
Learn more about the candidates by [[m:Special:MyLanguage/Wikimedia Foundation elections/2024/Candidates|reading their statements]] and their [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2024/Questions_for_candidates|answers to community questions]].
When you are ready, go to the [[m:Special:SecurePoll/vote/400|SecurePoll]] voting page to vote. '''The vote is open from September 3rd at 00:00 UTC to September 17th at 23:59 UTC'''.
To check your voter eligibility, please visit the [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2024/Voter_eligibility_guidelines|voter eligibility page]].
Best regards,
The Elections Committee and Board Selection Working Group<section end="announcement-content" />
</div>
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 12:15, 3 sep. 2024 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190 -->
== 'Wikidata item' link is moving. Find out where... ==
<div lang="en" dir="ltr" class="mw-content-ltr"><i>Apologies for cross-posting in English. Please consider translating this message.</i>{{tracked|T66315}}
Hello everyone, a small change will soon be coming to the user-interface of your Wikimedia project.
The [[d:Q16222597|Wikidata item]] [[w:|sitelink]] currently found under the <span style="color: #54595d;"><u>''General''</u></span> section of the '''Tools''' sidebar menu will move into the <span style="color: #54595d;"><u>''In Other Projects''</u></span> section.
We would like the Wiki communities feedback so please let us know or ask questions on the [[m:Talk:Wikidata_For_Wikimedia_Projects/Projects/Move_Wikidata_item_link|Discussion page]] before we enable the change which can take place October 4 2024, circa 15:00 UTC+2.
More information can be found on [[m:Wikidata_For_Wikimedia_Projects/Projects/Move_Wikidata_item_link|the project page]].<br><br>We welcome your feedback and questions.<br> [[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 18:58, 27 sep. 2024 (UTC)
</div>
<!-- Message sent by User:Danny Benjafield (WMDE)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Test_List&oldid=27524260 -->
== <span lang="en" dir="ltr">Preliminary results of the 2024 Wikimedia Foundation Board of Trustees elections</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Hello all,
Thank you to everyone who participated in the [[m:Special:MyLanguage/Wikimedia Foundation elections/2024|2024 Wikimedia Foundation Board of Trustees election]]. Close to 6000 community members from more than 180 wiki projects have voted.
The following four candidates were the most voted:
# [[User:Kritzolina|Christel Steigenberger]]
# [[User:Nadzik|Maciej Artur Nadzikiewicz]]
# [[User:Victoria|Victoria Doronina]]
# [[User:Laurentius|Lorenzo Losa]]
While these candidates have been ranked through the vote, they still need to be appointed to the Board of Trustees. They need to pass a successful background check and meet the qualifications outlined in the Bylaws. New trustees will be appointed at the next Board meeting in December 2024.
[[m:Special:MyLanguage/Wikimedia_Foundation_elections/2024/Results|Learn more about the results on Meta-Wiki.]]
Best regards,
The Elections Committee and Board Selection Working Group
<section end="announcement-content" />
</div>
[[User:MPossoupe_(WMF)|MPossoupe_(WMF)]] 08:26, 14 okt. 2024 (UTC)
<!-- Message sent by User:MPossoupe (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190 -->
== <span lang="en" dir="ltr">Seeking volunteers to join several of the movement’s committees</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Each year, typically from October through December, several of the movement’s committees seek new volunteers.
Read more about the committees on their Meta-wiki pages:
* [[m:Special:MyLanguage/Affiliations_Committee|Affiliations Committee (AffCom)]]
* [[m:Special:MyLanguage/Ombuds_commission|Ombuds commission (OC)]]
* [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|Case Review Committee (CRC)]]
Applications for the committees open on 16 October 2024. Applications for the Affiliations Committee close on 18 November 2024, and applications for the Ombuds commission and the Case Review Committee close on 2 December 2024. Learn how to apply by [[m:Special:MyLanguage/Wikimedia_Foundation/Legal/Committee_appointments|visiting the appointment page on Meta-wiki]]. Post to the talk page or email [mailto:cst@wikimedia.org cst@wikimedia.org] with any questions you may have.
For the Committee Support team,
<section end="announcement-content" />
</div>
-- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 23:08, 16 okt. 2024 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27601062 -->
== 'Wikidata item' link is moving, finally. ==
Hello everyone, I previously wrote on the 27th September to advise that the ''Wikidata item'' sitelink will change places in the sidebar menu, moving from the '''General''' section into the '''In Other Projects''' section. The scheduled rollout date of 04.10.2024 was delayed due to a necessary request for Mobile/MinervaNeue skin. I am happy to inform that the global rollout can now proceed and will occur later today, 22.10.2024 at 15:00 UTC-2. [[m:Talk:Wikidata_For_Wikimedia_Projects/Projects/Move_Wikidata_item_link|Please let us know]] if you notice any problems or bugs after this change. There should be no need for null-edits or purging cache for the changes to occur. Kind regards, -[[m:User:Danny Benjafield (WMDE)|Danny Benjafield (WMDE)]] 11:30, 22 okt. 2024 (UTC)
<!-- Message sent by User:Danny Benjafield (WMDE)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Test_List&oldid=27535421 -->
== Sign up for the language community meeting on November 29th, 16:00 UTC ==
Hello everyone,
The next language community meeting is coming up next week, on November 29th, at 16:00 UTC (Zonestamp! For your timezone <https://zonestamp.toolforge.org/1732896000>). If you're interested in joining, you can sign up on this wiki page: <https://www.mediawiki.org/wiki/Wikimedia_Language_and_Product_Localization/Community_meetings#29_November_2024>.
This participant-driven meeting will be organized by the Wikimedia Foundation’s Language Product Localization team and the Language Diversity Hub. There will be presentations on topics like developing language keyboards, the creation of the Moore Wikipedia, and the language support track at Wiki Indaba. We will also have members from the Wayuunaiki community joining us to share their experiences with the Incubator and as a new community within our movement. This meeting will have a Spanish interpretation.
Looking forward to seeing you at the language community meeting! Cheers, [[User:SSethi (WMF)|Srishti]] 19:55, 21 nov. 2024 (UTC)
<!-- Message sent by User:SSethi (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27746256 -->
== Universal Code of Conduct annual review: provide your comments on the UCoC and Enforcement Guidelines ==
<div lang="en" dir="ltr" class="mw-content-ltr">
My apologies for writing in English.
{{Int:Please-translate}}.
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 3 February 2025. This is the first step of several to be taken for the annual review.
[[m:Special:MyLanguage/Universal_Code_of_Conduct/Annual_review|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 01:12, 24 jan. 2025 (UTC)
</div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27746256 -->
== Reminder: first part of the annual UCoC review closes soon ==
<div lang="en" dir="ltr" class="mw-content-ltr">
My apologies for writing in English.
{{Int:Please-translate}}.
This is a reminder that the first phase of the annual review period for the Universal Code of Conduct and Enforcement Guidelines will be closing soon. You can make suggestions for changes through [[d:Q614092|the end of day]], 3 February 2025. This is the first step of several to be taken for the annual review.
[[m:Special:MyLanguage/Universal_Code_of_Conduct/Annual_review|Read more information and find a conversation to join on the UCoC page on Meta]]. After review of the feedback, proposals for updated text will be published on Meta in March for another round of community review.
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 00:49, 3 feb. 2025 (UTC)
</div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28198931 -->
== <span lang="en" dir="ltr"> Upcoming Language Community Meeting (Feb 28th, 14:00 UTC) and Newsletter</span> ==
<div lang="en" dir="ltr">
<section begin="message"/>
Hello everyone!
[[File:WP20Symbols WIKI INCUBATOR.svg|right|frameless|150x150px|alt=An image symbolising multiple languages]]
We’re excited to announce that the next '''Language Community Meeting''' is happening soon, '''February 28th at 14:00 UTC'''! If you’d like to join, simply sign up on the '''[[mw:Wikimedia_Language_and_Product_Localization/Community_meetings#28_February_2025|wiki page]]'''.
This is a participant-driven meeting where we share updates on language-related projects, discuss technical challenges in language wikis, and collaborate on solutions. In our last meeting, we covered topics like developing language keyboards, creating the Moore Wikipedia, and updates from the language support track at Wiki Indaba.
'''Got a topic to share?''' Whether it’s a technical update from your project, a challenge you need help with, or a request for interpretation support, we’d love to hear from you! Feel free to '''reply to this message''' or add agenda items to the document '''[[etherpad:p/language-community-meeting-feb-2025|here]]'''.
Also, we wanted to highlight that the sixth edition of the Language & Internationalization newsletter (January 2025) is available here: [[:mw:Special:MyLanguage/Wikimedia Language and Product Localization/Newsletter/2025/January|Wikimedia Language and Product Localization/Newsletter/2025/January]]. This newsletter provides updates from the October–December 2024 quarter on new feature development, improvements in various language-related technical projects and support efforts, details about community meetings, and ideas for contributing to projects. To stay updated, you can subscribe to the newsletter on its wiki page: [[:mw:Wikimedia Language and Product Localization/Newsletter|Wikimedia Language and Product Localization/Newsletter]].
We look forward to your ideas and participation at the language community meeting, see you there!
<section end="message"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 08:30, 22 feb. 2025 (UTC)
<!-- Message sent by User:SSethi (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28217779 -->
== Universal Code of Conduct annual review: proposed changes are available for comment ==
<div lang="en" dir="ltr" class="mw-content-ltr">
My apologies for writing in English.
{{Int:Please-translate}}.
I am writing to you to let you know that [[m:Special:MyLanguage/Universal_Code_of_Conduct/Annual_review/Proposed_Changes|proposed changes]] to the [[foundation:Special:MyLanguage/Policy:Universal_Code_of_Conduct/Enforcement_guidelines|Universal Code of Conduct (UCoC) Enforcement Guidelines]] and [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter|Universal Code of Conduct Coordinating Committee (U4C) Charter]] are open for review. '''[[m:Special:MyLanguage/Universal_Code_of_Conduct/Annual_review/Proposed_Changes|You can provide feedback on suggested changes]]''' through the [[d:Q614092|end of day]] on Tuesday, 18 March 2025. This is the second step in the annual review process, the final step will be community voting on the proposed changes.
[[m:Special:MyLanguage/Universal_Code_of_Conduct/Annual_review|Read more information and find relevant links about the process on the UCoC annual review page on Meta]].
The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] 18:52, 7 mar. 2025 (UTC)
</div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28307738 -->
== Final proposed modifications to the Universal Code of Conduct Enforcement Guidelines and U4C Charter now posted ==
<div lang="en" dir="ltr" class="mw-content-ltr">
The proposed modifications to the [[foundation:Special:MyLanguage/Policy:Universal_Code_of_Conduct/Enforcement_guidelines|Universal Code of Conduct Enforcement Guidelines]] and the U4C Charter [[m:Universal_Code_of_Conduct/Annual_review/2025/Proposed_Changes|are now on Meta-wiki for community notice]] in advance of the voting period. This final draft was developed from the previous two rounds of community review. Community members will be able to vote on these modifications starting on 17 April 2025. The vote will close on 1 May 2025, and results will be announced no later than 12 May 2025. The U4C election period, starting with a call for candidates, will open immediately following the announcement of the review results. More information will be posted on [[m:Special:MyLanguage//Universal_Code_of_Conduct/Coordinating_Committee/Election|the wiki page for the election]] soon.
Please be advised that this process will require more messages to be sent here over the next two months.
The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, you may [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter|review the U4C Charter]].
Please share this message with members of your community so they can participate as well.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 02:05, 4 apr. 2025 (UTC)
</div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28469465 -->
== Vote now on the revised UCoC Enforcement Guidelines and U4C Charter ==
<div lang="en" dir="ltr" class="mw-content-ltr">
The voting period for the revisions to the Universal Code of Conduct Enforcement Guidelines ("UCoC EG") and the UCoC's Coordinating Committee Charter is open now through the end of 1 May (UTC) ([https://zonestamp.toolforge.org/1746162000 find in your time zone]). [[m:Special:MyLanguage/Universal_Code_of_Conduct/Annual_review/2025/Voter_information|Read the information on how to participate and read over the proposal before voting]] on the UCoC page on Meta-wiki.
The [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee (U4C)]] is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review of the EG and Charter was planned and implemented by the U4C. Further information will be provided in the coming months about the review of the UCoC itself. For more information and the responsibilities of the U4C, you may [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter|review the U4C Charter]].
Please share this message with members of your community so they can participate as well.
In cooperation with the U4C -- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|talk]]) 00:35, 17 apr. 2025 (UTC)
</div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28469465 -->
== <span lang="en" dir="ltr">Vote on proposed modifications to the UCoC Enforcement Guidelines and U4C Charter</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
The voting period for the revisions to the Universal Code of Conduct Enforcement Guidelines and U4C Charter closes on 1 May 2025 at 23:59 UTC ([https://zonestamp.toolforge.org/1746162000 find in your time zone]). [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2025/Voter information|Read the information on how to participate and read over the proposal before voting]] on the UCoC page on Meta-wiki.
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee (U4C)]] is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, you may [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|review the U4C Charter]].
Please share this message with members of your community in your language, as appropriate, so they can participate as well.
In cooperation with the U4C -- <section end="announcement-content" />
</div>
<div lang="en" dir="ltr" class="mw-content-ltr">
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 03:41, 29 apr. 2025 (UTC)</div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28618011 -->
== <span lang="en" dir="ltr">Call for Candidates for the Universal Code of Conduct Coordinating Committee (U4C)</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
The results of voting on the Universal Code of Conduct Enforcement Guidelines and Universal Code of Conduct Coordinating Committee (U4C) Charter is [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2025#Results|available on Meta-wiki]].
You may now [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2025/Candidates|submit your candidacy to serve on the U4C]] through 29 May 2025 at 12:00 UTC. Information about [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2025|eligibility, process, and the timeline are on Meta-wiki]]. Voting on candidates will open on 1 June 2025 and run for two weeks, closing on 15 June 2025 at 12:00 UTC.
If you have any questions, you can ask on [[m:Talk:Universal Code of Conduct/Coordinating Committee/Election/2025|the discussion page for the election]]. -- in cooperation with the U4C, </div><section end="announcement-content" />
</div>
<bdi lang="en" dir="ltr">[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|diskuto]])</bdi> 22:08, 15 maj. 2025 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28618011 -->
== RfC ongoing regarding Abstract Wikipedia (and your project) ==
<div lang="en" dir="ltr" class="mw-content-ltr">
''(Apologies for posting in English, if this is not your first language)''
Hello all! We opened a discussion on Meta about a very delicate issue for the development of [[:m:Special:MyLanguage/Abstract Wikipedia|Abstract Wikipedia]]: where to store the abstract content that will be developed through functions from Wikifunctions and data from Wikidata. Since some of the hypothesis involve your project, we wanted to hear your thoughts too.
We want to make the decision process clear: we do not yet know which option we want to use, which is why we are consulting here. We will take the arguments from the Wikimedia communities into account, and we want to consult with the different communities and hear arguments that will help us with the decision. The decision will be made and communicated after the consultation period by the Foundation.
You can read the various hypothesis and have your say at [[:m:Abstract Wikipedia/Location of Abstract Content|Abstract Wikipedia/Location of Abstract Content]]. Thank you in advance! -- [[User:Sannita (WMF)|Sannita (WMF)]] ([[User talk:Sannita (WMF)|<span class="signature-talk">{{int:Talkpagelinktext}}</span>]]) 15:27, 22 maj. 2025 (UTC)
</div>
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=28768453 -->
== <span lang="en" dir="ltr">Wikimedia Foundation Board of Trustees 2025 Selection & Call for Questions</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Announcement/Selection announcement|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2025/Announcement/Selection announcement}}&language=&action=page&filter= {{int:please-translate}}]''
Dear all,
This year, the term of 2 (two) Community- and Affiliate-selected Trustees on the Wikimedia Foundation Board of Trustees will come to an end [1]. The Board invites the whole movement to participate in this year’s selection process and vote to fill those seats.
The Elections Committee will oversee this process with support from Foundation staff [2]. The Governance Committee, composed of trustees who are not candidates in the 2025 community-and-affiliate-selected trustee selection process (Raju Narisetti, Shani Evenstein Sigalov, Lorenzo Losa, Kathy Collins, Victoria Doronina and Esra’a Al Shafei) [3], is tasked with providing Board oversight for the 2025 trustee selection process and for keeping the Board informed. More details on the roles of the Elections Committee, Board, and staff are here [4].
Here are the key planned dates:
* May 22 – June 5: Announcement (this communication) and call for questions period [6]
* June 17 – July 1, 2025: Call for candidates
* July 2025: If needed, affiliates vote to shortlist candidates if more than 10 apply [5]
* August 2025: Campaign period
* August – September 2025: Two-week community voting period
* October – November 2025: Background check of selected candidates
* Board’s Meeting in December 2025: New trustees seated
Learn more about the 2025 selection process - including the detailed timeline, the candidacy process, the campaign rules, and the voter eligibility criteria - on this Meta-wiki page [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2025|[link]]].
'''Call for Questions'''
In each selection process, the community has the opportunity to submit questions for the Board of Trustees candidates to answer. The Election Committee selects questions from the list developed by the community for the candidates to answer. Candidates must answer all the required questions in the application in order to be eligible; otherwise their application will be disqualified. This year, the Election Committee will select 5 questions for the candidates to answer. The selected questions may be a combination of what’s been submitted from the community, if they’re alike or related. [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2025/Questions_for_candidates|[link]]]
'''Election Volunteers'''
Another way to be involved with the 2025 selection process is to be an Election Volunteer. Election Volunteers are a bridge between the Elections Committee and their respective community. They help ensure their community is represented and mobilize them to vote. Learn more about the program and how to join on this Meta-wiki page [[m:Wikimedia_Foundation_elections/2025/Election_volunteers|[link].]]
Thank you!
[1] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2022/Results
[2] https://foundation.wikimedia.org/wiki/Committee:Elections_Committee_Charter
[3] https://foundation.wikimedia.org/wiki/Resolution:Committee_Membership,_December_2024
[4] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections_committee/Roles
[5] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2025/FAQ
[6] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2025/Questions_for_candidates
Best regards,
Victoria Doronina
Board Liaison to the Elections Committee
Governance Committee<section end="announcement-content" />
</div>
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 03:08, 28 maj. 2025 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28618011 -->
== Vote now in the 2025 U4C Election ==
<div lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English.
{{Int:Please-translate}}
Eligible voters are asked to participate in the 2025 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2025|2025 Election information page]]. The vote closes on 17 June 2025 at [https://zonestamp.toolforge.org/1750161600 12:00 UTC].
Please vote if your account is eligible. Results will be available by 1 July 2025. -- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 23:01, 13 jun. 2025 (UTC) </div>
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28848819 -->
== <span lang="en" dir="ltr">Wikimedia Foundation Board of Trustees 2025 - Call for Candidates</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
:''<div class="plainlinks">[[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Announcement/Call for candidates|{{int:interlanguage-link-mul}}]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-{{urlencode:Wikimedia Foundation elections/2025/Announcement/Call for candidates}}&language=&action=page&filter= {{int:please-translate}}]</div>
Hello all,
The [[m:Special:MyLanguage/Wikimedia Foundation elections/2025|call for candidates for the 2025 Wikimedia Foundation Board of Trustees selection is now open]] from June 17, 2025 – July 2, 2025 at 11:59 UTC [1]. The Board of Trustees oversees the Wikimedia Foundation's work, and each Trustee serves a three-year term [2]. This is a volunteer position.
This year, the Wikimedia community will vote in late August through September 2025 to fill two (2) seats on the Foundation Board. Could you – or someone you know – be a good fit to join the Wikimedia Foundation's Board of Trustees? [3]
Learn more about what it takes to stand for these leadership positions and how to submit your candidacy on [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidate application|this Meta-wiki page]] or encourage someone else to run in this year's election.
Best regards,
Abhishek Suryawanshi<br />
Chair of the Elections Committee
On behalf of the Elections Committee and Governance Committee
[1] https://meta.wikimedia.org/wiki/Special:MyLanguage/Wikimedia_Foundation_elections/2025/Call_for_candidates
[2] https://foundation.wikimedia.org/wiki/Legal:Bylaws#(B)_Term.
[3] https://meta.wikimedia.org/wiki/Special:MyLanguage/Wikimedia_Foundation_elections/2025/Resources_for_candidates<section end="announcement-content" />
</div>
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 17:44, 17 jun. 2025 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28866958 -->
== <span lang="en" dir="ltr">Sister Projects Task Force reviews Wikispore and Wikinews</span> ==
<div lang="en" dir="ltr">
<section begin="message"/>
Dear Wikimedia Community,
The [[m:Wikimedia Foundation Community Affairs Committee|Community Affairs Committee (CAC)]] of the Wikimedia Foundation Board of Trustees assigned [[m:Wikimedia Foundation Community Affairs Committee/Sister Projects Task Force|the Sister Projects Task Force (SPTF)]] to update and implement a procedure for assessing the lifecycle of Sister Projects – wiki [[m:Wikimedia projects|projects supported by Wikimedia Foundation (WMF)]].
A vision of relevant, accessible, and impactful free knowledge has always guided the Wikimedia Movement. As the ecosystem of Wikimedia projects continues to evolve, it is crucial that we periodically review existing projects to ensure they still align with our goals and community capacity.
Despite their noble intent, some projects may no longer effectively serve their original purpose. '''Reviewing such projects is not about giving up – it's about responsible stewardship of shared resources'''. Volunteer time, staff support, infrastructure, and community attention are finite, and the non-technical costs tend to grow significantly as our ecosystem has entered a different age of the internet than the one we were founded in. Supporting inactive projects or projects that didn't meet our ambitions can unintentionally divert these resources from areas with more potential impact.
Moreover, maintaining projects that no longer reflect the quality and reliability of the Wikimedia name stands for, involves a reputational risk. An abandoned or less reliable project affects trust in the Wikimedia movement.
Lastly, '''failing to sunset or reimagine projects that are no longer working can make it much harder to start new ones'''. When the community feels bound to every past decision – no matter how outdated – we risk stagnation. A healthy ecosystem must allow for evolution, adaptation, and, when necessary, letting go. If we create the expectation that every project must exist indefinitely, we limit our ability to experiment and innovate.
Because of this, SPTF reviewed two requests concerning the lifecycle of the Sister Projects to work through and demonstrate the review process. We chose Wikispore as a case study for a possible new Sister Project opening and Wikinews as a case study for a review of an existing project. Preliminary findings were discussed with the CAC, and a community consultation on both proposals was recommended.
=== Wikispore ===
The [[m:Wikispore|application to consider Wikispore]] was submitted in 2019. SPTF decided to review this request in more depth because rather than being concentrated on a specific topic, as most of the proposals for the new Sister Projects are, Wikispore has the potential to nurture multiple start-up Sister Projects.
After careful consideration, the SPTF has decided '''not to recommend''' Wikispore as a Wikimedia Sister Project. Considering the current activity level, the current arrangement allows '''better flexibility''' and experimentation while WMF provides core infrastructural support.
We acknowledge the initiative's potential and seek community input on what would constitute a sufficient level of activity and engagement to reconsider its status in the future.
As part of the process, we shared the decision with the Wikispore community and invited one of its leaders, Pharos, to an SPTF meeting.
Currently, we especially invite feedback on measurable criteria indicating the project's readiness, such as contributor numbers, content volume, and sustained community support. This would clarify the criteria sufficient for opening a new Sister Project, including possible future Wikispore re-application. However, the numbers will always be a guide because any number can be gamed.
=== Wikinews ===
We chose to review Wikinews among existing Sister Projects because it is the one for which we have observed the highest level of concern in multiple ways.
Since the SPTF was convened in 2023, its members have asked for the community's opinions during conferences and community calls about Sister Projects that did not fulfil their promise in the Wikimedia movement.[https://commons.wikimedia.org/wiki/File:WCNA_2024._Sister_Projects_-_opening%3F_closing%3F_merging%3F_splitting%3F.pdf <nowiki>[1]</nowiki>][https://meta.wikimedia.org/wiki/Wikimedia_Foundation_Community_Affairs_Committee/Sister_Projects_Task_Force#Wikimania_2023_session_%22Sister_Projects:_past,_present_and_the_glorious_future%22 <nowiki>[2]</nowiki>][https://meta.wikimedia.org/wiki/WikiConvention_francophone/2024/Programme/Quelle_proc%C3%A9dure_pour_ouvrir_ou_fermer_un_projet_%3F <nowiki>[3]</nowiki>] Wikinews was the leading candidate for an evaluation because people from multiple language communities proposed it. Additionally, by most measures, it is the least active Sister Project, with the greatest drop in activity over the years.
While the Language Committee routinely opens and closes language versions of the Sister Projects in small languages, there has never been a valid proposal to close Wikipedia in major languages or any project in English. This is not true for Wikinews, where there was a proposal to close English Wikinews, which gained some traction but did not result in any action[https://meta.wikimedia.org/wiki/Proposals_for_closing_projects/Closure_of_English_Wikinews <nowiki>[4]</nowiki>][https://meta.wikimedia.org/wiki/WikiConvention_francophone/2024/Programme/Quelle_proc%C3%A9dure_pour_ouvrir_ou_fermer_un_projet_%3F <nowiki>[5]</nowiki>, see section 5] as well as a draft proposal to close all languages of Wikinews[https://meta.wikimedia.org/wiki/Talk:Proposals_for_closing_projects/Archive_2#Close_Wikinews_completely,_all_languages? <nowiki>[6]</nowiki>].
[[:c:File:Sister Projects Taskforce Wikinews review 2024.pdf|Initial metrics]] compiled by WMF staff also support the community's concerns about Wikinews.
Based on this report, SPTF recommends a community reevaluation of Wikinews. We conclude that its current structure and activity levels are the lowest among the existing sister projects. SPTF also recommends pausing the opening of new language editions while the consultation runs.
SPTF brings this analysis to a discussion and welcomes discussions of alternative outcomes, including potential restructuring efforts or integration with other Wikimedia initiatives.
'''Options''' mentioned so far (which might be applied to just low-activity languages or all languages) include but are not limited to:
*Restructure how Wikinews works and is linked to other current events efforts on the projects,
*Merge the content of Wikinews into the relevant language Wikipedias, possibly in a new namespace,
*Merge content into compatibly licensed external projects,
*Archive Wikinews projects.
Your insights and perspectives are invaluable in shaping the future of these projects. We encourage all interested community members to share their thoughts on the relevant discussion pages or through other designated feedback channels.
=== Feedback and next steps ===
We'd be grateful if you want to take part in a conversation on the future of these projects and the review process. We are setting up two different project pages: [[m:Public consultation about Wikispore|Public consultation about Wikispore]] and [[m:Public consultation about Wikinews|Public consultation about Wikinews]]. Please participate between 27 June 2025 and 27 July 2025, after which we will summarize the discussion to move forward. You can write in your own language.
I will also host a community conversation 16th July Wednesday 11.00 UTC and 17th July Thursday 17.00 UTC (call links to follow shortly) and will be around at Wikimania for more discussions.
<section end="message"/>
</div>
-- [[User:Victoria|Victoria]] on behalf of the Sister Project Task Force, 20:57, 27 jun. 2025 (UTC)
<!-- Message sent by User:Johan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Sister_project_MassMassage_on_behalf_of_Victoria/Target_list&oldid=28911188 -->
== <span lang="en" dir="ltr">Temporary accounts will be rolled out soon</span> ==
<div lang="en" dir="ltr">
<section begin="body"/>
Hello, we are the Wikimedia Foundation [[mw:Special:MyLanguage/Product Safety and Integrity|Product Safety and Integrity]] team. We would like to announce that '''we plan to enable [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|temporary accounts]] for this wiki in the week of September 1'''.
Temporary accounts are successfully live on 30 wikis, including many large ones like German, Japanese, and French. The change they bring is especially relevant to logged-out editors, who this feature is designed to protect. But it is also relevant to community members like mentors, patrollers, and admins – anyone who reverts edits, blocks users, or otherwise interacts with logged-out editors as part of keeping the wikis safe and accurate.
'''Why we are building temporary accounts'''
Our wikis should be safer to edit by default for logged-out editors. Temporary accounts allow people to continue editing the wikis without creating an account, while avoiding publicly tying their edits to their IP address. We believe this is in the best interest of our logged-out editors, who make valuable contributions to the wikis and who may later create accounts and grow our community of editors, admins, and other roles. Even though the wikis do warn logged-out editors that their IP address will be associated with their edit, many people may not understand what an IP address is, or that it could be used to connect them to other information about them in ways they might not expect.
Additionally, our moderation software and tools rely too heavily on network origin (IP addresses) to identify users and patterns of activity, especially as IP addresses themselves are becoming less stable as identifiers. Temporary accounts allow for more precise interactions with logged-out editors, including more precise blocks, and can help limit how often we unintentionally end up blocking good-faith users who use the same IP addresses as bad-faith users.
'''How temporary accounts work'''
[[File:Temporary account banner and empty talk page.png|thumb]]
Any time a logged-out user publishes an edit on this wiki, a cookie will be set in this user's browser, and a temporary account tied with this cookie will be automatically created. This account's name will follow the pattern: <code dir=ltr>~2025-12345-67</code> (a tilde, current year, a number). On pages like Recent Changes or page history, this name will be displayed. The cookie will expire 90 days after its creation. As long as it exists, all edits made from this device will be attributed to this temporary account. It will be the same account even if the IP address changes, unless the user clears their cookies or uses a different device or web browser. A record of the IP address used at the time of each edit will be stored for 90 days after the edit. However, only some logged-in users will be able to see it.
'''What does this mean for different groups of users?'''
'''For logged-out editors'''
* This increases privacy: currently, if you do not use a registered account to edit, then everybody can see the IP address for the edits you made, even after 90 days. That will no longer be possible on this wiki.
* If you use a temporary account to edit from different locations in the last 90 days (for example at home and at a coffee shop), the edit history and the IP addresses for all those locations will now be recorded together, for the same temporary account. Users who [[foundation:Special:MyLanguage/Policy:Access_to_temporary_account_IP_addresses|meet the relevant requirements]] will be able to view this data. If this creates any personal security concerns for you, please contact talktohumanrights at wikimedia.org for advice.
'''For community members interacting with logged-out editors'''
* A temporary account is uniquely linked to a device. In comparison, an IP address can be shared with different devices and people (for example, different people at school or at work might have the same IP address).
* Compared to the current situation, it will be safer to assume that a temporary user's talk page belongs to only one person, and messages left there will be read by them. As you can see in the screenshot, temporary account users will receive notifications. It will also be possible to thank them for their edits, ping them in discussions, and invite them to get more involved in the community.
'''For users who use IP address data to moderate and maintain the wiki'''
* '''For patrollers''' who track persistent abusers, investigate violations of policies, etc.: Users who [[foundation:Special:MyLanguage/Policy:Access_to_temporary_account_IP_addresses|meet the requirements]] will be able to reveal temporary users' IP addresses and all contributions made by temporary accounts from a specific IP address or range ([[Special:IPContributions]]). They will also have access to useful information about the IP addresses thanks to the [[mw:Special:MyLanguage/Trust and Safety Product/IP Info|IP Info]] feature. Many other pieces of software have been built or adjusted to work with temporary accounts, including AbuseFilter, global blocks, Global User Contributions, and more. (For information for volunteer developers on how to update the code of your tools – see the last part of the message.)
* '''For admins blocking logged-out editors''':
** It will be possible to block many abusers by just blocking their temporary accounts. A blocked person won't be able to create new temporary accounts quickly if the admin selects the [[mw:Special:MyLanguage/Autoblock|autoblock]] option.
** It will still be possible to block an IP address or IP range.
* Temporary accounts will not be retroactively applied to contributions made before the deployment. On Special:Contributions, you will be able to see existing IP user contributions, but not new contributions made by temporary accounts on that IP address. Instead, you should use Special:IPContributions for this.
'''Our requests for you, and next steps'''
* If you know of any tools, bots, gadgets etc. using data about IP addresses or being available for logged-out users, you may want to test if they work on [[testwiki:Main_Page|testwiki]] or [[test2wiki:Main_Page|test2wiki]]. If you are a volunteer developer, [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/For developers|read our documentation for developers]], and in particular, the section on [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/For developers#How should I update my code?|how your code might need to be updated]].
* If you want to test the temporary account experience, for example just to check what it feels like, go to testwiki or test2wiki and edit without logging in.
* Tell us if you know of any difficulties that need to be addressed. We will try to help, and if we are not able, we will consider the available options.
* Look at our [[m:Meta:Babel#Temporary_Accounts:_access_to_IP_addresses_and_next_steps|previous message]] about requirements for users without extended rights who may need access to IP addresses.
To learn more about the project, check out [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/FAQ|our FAQ]] – you will find many useful answers there. You may also [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/Updates|look at the updates]] (we have just posted one) and [[mw:Newsletter:Product Safety and Integrity|subscribe to our new newsletter]]. If you'd like to talk to me (Szymon) off-wiki, you will find me on Discord and Telegram. Thank you!<section end="body" />
</div>
<bdi lang="en" dir="ltr">[[m:user:NKohli (WMF)|NKohli (WMF)]], [[m:user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]]</bdi> 21:37, 26 aŭg. 2025 (UTC)
<!-- Message sent by User:Quiddity (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=User:Quiddity_(WMF)/sandbox6&oldid=29181713 -->
== <span lang="en" dir="ltr">Have your say: vote for the 2025 Board of Trustees</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Hello all,
The voting period for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025|2025 Board of Trustees election]] is now open. Candidates are running for two (2) seats on the Board.
To check your voter eligibility, please visit the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Voter eligibility guidelines|voter eligibility page]].
Learn more about them by [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidates|reading their application statements and watch their candidacy videos]].
When you are ready, go to the [[m:Special:SecurePoll/vote/405|SecurePoll voting page to vote]].
'''The vote is open from October 8 at 00:00 UTC to October 22 at 23:59 UTC.'''
Best regards,
Abhishek Suryawanshi<br />Chair, Elections Committee<section end="announcement-content" />
</div>
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 04:49, 9 okt. 2025 (UTC)
<!-- Message sent by User:RamzyM (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29360896 -->
== 8-a Kunsido de Ĝenerala asembleo de Vikimedio EO (2025-2) ==
Mi invitas vin al la 8-a Kunsido de Ĝenerala asembleo de organizo [https://esperanto.wiki/ Vikimedio EO], kiu okazos rete la 16-an de Novembro 2025. Ni traktos precipe la Jarajn planon kaj buĝeton 2026, revizion de la [[:meta:|Strategia plano 2025-2026]] kaj eventuale ankaŭ aliajn aferojn. La kunsido estas celata al membroj de la organizo, kaj ankaŭ malfermita al Vikimediaj redaktistoj kiel vi. Bv. vidi pliajn informojn kaj aliĝu ĉe la '''[https://esperanto.wiki/evento/8-a-kunsido-de-generala-asembleo-2025-2 oficiala anonco]'''. [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 14:28, 16 okt. 2025 (UTC)
: Jam ĉi-dimanĉe, la '''16-an de Novembro 2025''', ni havos '''[https://esperanto.wiki/evento/8-a-kunsido-de-generala-asembleo-2025-2 Kunsidon de Ĝenerala asembleo de Vikimedio EO]''' (se vi volas partopreni, bv aliĝi anticipe). Kaj mi havas al vi 2 petojn.
: '''Ni serĉas 2 novajn Estraranojn'''
: Ni bezonas plivigligi nian Estraron por pli juste distribui internan laboron, esti pli daŭropova kaj pli bone subteni Vikimediajn redaktantojn. Aldone ni bezonas ankaŭ Kasiston kaj Ĝeneralan sekretarion (kiuj povas, sed ne devas esti Estraranoj) kaj ni aprezus ankaŭ plian / rezervan membron de Revizia komisiono. Se vi spertas pri gvidado de neprofitcela, plejparte volontula organizo, kandidatiĝu nun, aŭ plej malfrue dum la kunsido mem. '''[https://esperanto.wiki/2025/kandidatigu-al-la-estraro-revizia-komisiono-au-kiel-kasisto-au-sekretario-ekde-2025 Vidu pliajn detalojn en la artikolo]'''.
: '''Dokumentoj jam duonpretaj - trastudu ilin antaŭ la kunsido'''
: Mi finas verkon de la gravaj dokumentoj, kiujn ni traktos dum la kunsido:
:* '''[[meta:Esperanto kaj Libera Scio/Annual agendas/2026|Jara plano 2026]]''' - la enhavo preskaŭ pretas per lista formo, ankoraŭ mi plibeligos ĝian prezenton
:** se vi mem volas (kun)gvidi iun aldonan laboron, aldonu ĝin rekte en la viki-paĝon kaj mi ĝin ankoraŭ konsideros
:* '''[https://docs.google.com/spreadsheets/d/1bFPg0iQaPoDvM0UriDrbb4paiyT625peYEViNird-Nc/edit Jara buĝeto 2026]''' - mi atendis stabiligon de la Jara plano, kaj aldonos numerojn probable en sabato
:** vi povas komenti rekte en la dokumento (elektu komentatan tekston kaj premu Ctrl+Alt+M)
:* '''[https://docs.google.com/document/d/1EfasAA49GnM8dZNbX_vjidakqM3PogvKSZYBNXrxMdg/edit Revizio de la Strategia plano 2025-2026]''' - jam estas provizita detala klarigo pri la bezono de revizio, kaj la resuma prezento, al kiu mi aldonos enhavon probable sabate
:** vi povas komenti rekte en la dokumento (elektu komentatan tekston kaj premu Ctrl+Alt+M)
: Bv. trastudi la dokumentojn antaŭ la kunsido. Ili devus preti sabate antaŭ noktomezo, plej malfrue dimanĉe kelkajn horojn antaŭ la kunsido. Tiel ni dum la kunsido povos fokusiĝi al eventualaj demandoj kaj pli facile trakti aprobon.
: Mi antaŭĝojas vidi vin dimanĉe. --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 21:27, 14 nov. 2025 (UTC)
== <span lang="en" dir="ltr">Help us decide the name of the new Abstract Wikipedia project</span> ==
<div lang="en" dir="ltr">
<section begin="function1"/>
{{int:Hello}}. Please help pick a name for the new Abstract Wikipedia wiki project. This project will be a wiki that will enable users to combine functions from [[:f:|Wikifunctions]] and data from Wikidata in order to generate natural language sentences in any supported languages. These sentences can then be used by any Wikipedia (or elsewhere).
There will be two rounds of voting, each followed by legal review of candidates, with votes beginning on 20 October and 17 November 2025. Our goal is to have a final project name selected on mid-December 2025. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki.
{{Int:Feedback-thanks-title}}
<section end="function1"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 11:43, 20 okt. 2025 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29432175 -->
== <span lang="en" dir="ltr">Seeking volunteers to join several of the movement’s committees</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Each year, typically from October through December, several of the movement’s committees seek new volunteers.
Read more about the committees on their Meta-wiki pages:
* [[m:Special:MyLanguage/Affiliations Committee|Affiliations Committee (AffCom)]]
* [[m:Special:MyLanguage/Ombuds commission|Ombuds commission (OC)]]
* [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|Case Review Committee (CRC)]]
Applications for the committees open on October 30, 2025. Applications for the Affiliations Committee, Ombuds commission and the Case Review Committee close on December 11, 2025. Learn how to apply by [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Committee appointments|visiting the appointment page on Meta-wiki]]. Post to the talk page or email cst[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org with any questions you may have.
For the Committee Support team,
<section end="announcement-content" />
</div>
-[[m:User:MKaur (WMF)| MKaur (WMF)]] 14:13, 30 okt. 2025 (UTC)
<!-- Message sent by User:MKaur (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29517125 -->
== <span lang="en" dir="ltr">Reminder: Help us decide the name of the new Abstract Wikipedia project</span> ==
<div lang="en" dir="ltr">
<section begin="function2"/>
{{int:Hello}}. Reminder: Please help to choose name for the new Abstract Wikipedia wiki project. The finalist vote starts today. The finalists for the name are: <span lang="en" dir="ltr" class="mw-content-ltr">Abstract Wikipedia, Multilingual Wikipedia, Wikiabstracts, Wikigenerator, Proto-Wiki</span>. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki.
{{Int:Feedback-thanks-title}}
<section end="function2"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 14:23, 20 nov. 2025 (UTC)
<!-- Message sent by User:Sannita (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29583860 -->
== <span lang="en" dir="ltr">Annual review of the Universal Code of Conduct and Enforcement Guidelines</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
I am writing to you to let you know the annual review period for the Universal Code of Conduct and Enforcement Guidelines is open now. You can make suggestions for changes through 9 February 2026. This is the first step of several to be taken for the annual review. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Read more information and find a conversation to join on the UCoC page on Meta]].
The [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Universal Code of Conduct Coordinating Committee]] (U4C) is a global group dedicated to providing an equitable and consistent implementation of the UCoC. This annual review was planned and implemented by the U4C. For more information and the responsibilities of the U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|you may review the U4C Charter]].
Please share this information with other members in your community wherever else might be appropriate.
-- In cooperation with the U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
</div>
21:02, 19 jan. 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Administranto-kandidatiĝo de KuboF Hromoslav (4-a fojo) ==
Miaj administraj rajtoj jam eksvalidiĝis (ĉar la Esperanta Vikivojaĝo estas malgranda projekto, administraj rajtoj estas provizataj nur por 1 jaro). Tial mi denove rekandidatiĝis, bonvolu esprimi vian opinion ĉe [[Vikivojaĝo:Administrantigo/KuboF Hromoslav (4)]]. Antaŭdankon! --[[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 18:19, 1 mar. 2026 (UTC)
:Dankon pro via subteno! Mi denove havas administrajn rajtojn, do kaze de bezono volonte petu min plenumu bezonatan laboron. [[Uzanto:KuboF Hromoslav|KuboF Hromoslav]] ([[Uzanto-Diskuto:KuboF Hromoslav|diskuto]]) 19:41, 12 mar. 2026 (UTC)
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Uzanto:MediaWiki message delivery|MediaWiki message delivery]] ([[Uzanto-Diskuto:MediaWiki message delivery|diskuto]]) 00:58, 26 apr. 2026 (UTC)
</bdi>
<!-- Message sent by User:Codename Noreste@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== LANLIN-flagobildo por regiono de Japanio ==
Saluton. Mi uzis [[Ŝablono:Informkesto regiono]] en la artikolo [[Ĉubu]], kaj ĝi uzas [[Ŝablono:LANLIN-flagobildo por regiono de Japanio]]. Sed japana regiono ne estas oficiala, tial mi ne scias, kion mi faru kun la ŝablono. Ĉar mi estas komencanto, Mi petas pardonon se mi havas gramatikajn erarojn. [[Uzanto:Tmv|Tmv]] ([[Uzanto-Diskuto:Tmv|diskuto]]) 09:38, 3 maj. 2026 (UTC)
== <span lang="en" dir="ltr">Vote now in the 2026 U4C election</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Eligible voters are asked to participate in the 2026 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|2026 Election information page]]. The vote closes on 2 June 2026 at [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Please vote if your account is eligible. Results will be available by 14 June 2026. -- In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15, 27 maj. 2026 (UTC)
<!-- Message sent by User:Keegan (WMF)@metawiki using the list at https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860 -->
goaxt7rszi4ef6ckq9iowjshrqs2xa3
Modulo:VCard
828
4800
72508
72149
2026-05-28T06:49:21Z
RolandUnger
168
Update
72508
Scribunto
text/plain
-- module variable and administration
local vc = {
moduleInterface = {
suite = 'vCard',
serial = '2026-05-27',
item = 58187507
},
-- table containing parameters fetched from Wikidata
fromWD = {},
-- Wikidata to subtype table
subtypeIds = nil,
-- complete subtype table including Wikidata subtypes
subtypes = {}
}
-- module import
-- require( 'strict' )
local mi = require( 'Module:Marker utilities/i18n' )
local mu = require( 'Module:Marker utilities' )
local vp = require( 'Module:VCard/Params' ) -- parameter lists
local vi = require( 'Module:VCard/i18n' ) -- parameter translations
local vq = mw.loadData( 'Module:VCard/Qualifiers' ) -- comment tables
local cm = require( 'Module:CountryData' )
local er -- modules will be loaded later if needed
local hi
local hr
local lg
local lp = require( 'Module:LinkPhone' )
local vs
local wu = require( 'Module:Wikidata utilities' )
local function addWdClass( key )
return mu.addWdClass( vc.fromWD[ key ] )
end
local function forceFetchFromWikidata( tab )
for key, value in pairs( tab ) do
vp.ParMap[ key ] = true
end
end
-- copying frameArgs parameters to args = vp.ParMap parameters
local function copyParameters( args, show )
vp.ParMap.wikidata = args.wikidata
-- force getting data from Wikidata for missing parameters
show.inlineDescription = true -- description with div or span tag
if vp.ParMap.auto == true then
forceFetchFromWikidata( vp.ParWD )
forceFetchFromWikidata( vp.ParWDAdd )
end
-- copying args parameters to vp.ParMap parameters
local t, value
local exclude = { auto = 1, show = 1, subtype = 1, wikidata = 1 }
local copy = { subtype = 1 }
for key, v in pairs( vi.p ) do
value = args[ key ]
if value then
value, t =
mu.removeCtrls( value, show.inline or key ~= 'description' )
if t then
show.inlineDescription = false
end
if not exclude[ key ] then
if value == '' and key ~= 'type' then
value = 'y'
end
t = mu.yesno( value )
if t then
if vp.ParMap.wikidata ~= '' then
vp.ParMap[ key ] = t == 'y'
else
vp.ParMap[ key ] = ''
end
else
vp.ParMap[ key ] = value
end
end
if copy[ key ] then
vp.ParMap[ key ] = value
end
end
end
return vp.ParMap
end
-- checking subtypes
local function checkSubtypes( args, subtypesTable )
if not mu.isSet( args.subtype ) then
return {}
end
local function aliasToSubtype( alias )
if not vc.subtypeAliases then -- alias to subtype table
vc.subtypeAliases = mu.getAliases( subtypesTable, 'alias' )
end
return vc.subtypeAliases[ alias ]
end
local function subtypeExists( subtype )
return subtypesTable[ subtype ] and subtype or aliasToSubtype( subtype )
end
local subtypes = {}
local invalidSubtypes = {}
for subtype, v in pairs( mu.split( args.subtype ) ) do
local count = ''
local invalidCount = false
local item = subtype
-- split item from count
local at = item:find( ':', 1, true )
if at then
count = tonumber( item:sub( at + 1, #item ) ) or ''
item = mw.text.trim( item:sub( 1, at - 1 ) )
if count == '' then
invalidCount = true -- ':' without count or not a number
else
count = math.floor( count )
if count < 2 then
count = ''
end
end
end
item = subtypeExists( item ) or mu.typeExists( item )
if item then
subtypes[ item ] = count
end
if invalidCount or not item then
table.insert( invalidSubtypes, subtype )
end
end
if #invalidSubtypes > 0 then
mu.addMaintenance( 'unknownSubtype', table.concat( invalidSubtypes, mu.commaSeparator ) )
end
return subtypes
end
local function initialParametersCheck( frame, page )
local country, email, entity, show, t, v, web, wrongQualifier
local frameArgs = mu.checkArguments( frame:getParent().args, vi.p )
-- Using wu.getEntity instead of wu.getEntityId brings a better overall performance
frameArgs.wikidata, entity, wrongQualifier = wu.getEntity( frameArgs.wikidata or '' )
if wrongQualifier then
mu.addMaintenance( 'wrongQualifier' )
end
if mu.isSet( frameArgs.wikidata ) then
mu.addMaintenance( 'wikidata' )
v = mu.yesno( frameArgs.auto or '' )
if v then
vp.ParMap.auto = v == 'y'
else
vp.ParMap.auto = vi.options.defaultAuto
end
else
vp.ParMap.auto = false
end
-- making phone number table
t = {}
for i, key in ipairs( vp.phones ) do
mu.tableInsert( t, frameArgs[ key ] )
end
-- making web addresses table
web = {}
mu.tableInsert( web, frameArgs.url )
email = frameArgs.email or ''
email = email:gsub( ',.*$', '' ) -- first email
mu.tableInsert( web, email )
-- getting country-specific technical parameters
country = cm.getCountryData( entity, t, frameArgs.country, frameArgs.wikidata, web )
if country.fromWD then
mu.addMaintenance( 'countryFromWD' )
end
if country.unknownCountry then
mu.addMaintenance( 'unknownCountry' )
end
if country.cc ~= '' then
country.trunkPrefix = lp.getTrunkPrefix( country.cc )
end
-- for map support
country.extra = mi.map.defaultSiteType
if mu.isSet( country.iso_3166 ) then
country.extra = country.extra .. '_region:' .. country.iso_3166
-- country-specific default show
end
if mu.isSet( country.show ) then
vp.ParMap.show = vp.ParMap.show .. ',' .. country.show
end
-- handling args table
show = mu.getShow( vp.ParMap.show, frameArgs, vp.show )
-- copying frameArgs parameters to args = vp.ParMap parameters
local args = copyParameters( frameArgs, show )
-- alternate local language
if mu.isSet( args.localLang ) then
lg = lg or require( 'Module:Languages' )
args.localLang = args.localLang:lower()
if lg.lngProps[ args.localLang ] then
cm.setLanguageParams( args.localLang, page.lang, country )
else
args.localLang = ''
mu.addMaintenance( 'unknownLanguage' )
end
end
mu.checkStatus( args )
mu.checkStyles( args )
-- checking coordinates and converting DMS to decimal coordinates if necessary
mu.checkCoordinates( args )
mu.checkZoom( args )
-- remove namespace from category
mu.checkCommonsCategory( args )
mu.checkId( args )
for i, param in ipairs( mi.options.parameters ) do
if mu.isSet( args[ param ] ) then
mu.addMaintenance( 'parameterUsed', param )
end
end
args.subtypeAdd = mu.isSet( args.wikidata ) and vp.ParMap.auto
-- getting features manually entered
if mu.isSet( args.subtype ) then
vs = require( 'Module:VCard/Subtypes' )
vc.subtypes = checkSubtypes( args, vs.f )
if mu.isSet( args.wikidata ) then
-- y = fetch additional features from Wikidata
if vc.subtypes.y then
args.subtypeAdd = true
-- n = do not show subtypes fetched from Wikidata
elseif vc.subtypes.n then
args.subtypeAdd = false
end
end
end
if type( args.lastedit ) == 'string' and args.lastedit ~= ''
and not args.lastedit:match( mi.dates.yyyymmdd.p ) then
mu.addMaintenance( 'wrongDate' )
args.lastedit = ''
end
-- check Google Maps customer id
if type( args.googlemaps ) == 'string' and mu.isSet( args.googlemaps ) and
not ( mu.checkLength( args.googlemaps, 14, 20 ) and args.googlemaps:match( '^[1-9]%d+$' ) ) then
mu.addMaintenance( 'wrongGoogleCid' )
args.googlemaps = ''
end
if type( args.googlemaps ) == 'string' and mu.isSet( args.googlemaps ) then
mu.addMaintenance( 'parameterUsed', 'google-maps' )
if mu.isSet( args.wikidata ) then
mu.addMaintenance( 'wdWithGoogleCid' )
end
end
return args, entity, show, country
end
local function getQuantity( value, page )
if type( value ) == 'number' then
return tostring( value )
elseif value.amount == '0' then
return '0'
else
local a = mu.formatNumber( value.amount )
local u = ''
local unitId = value.unit
local unit = cm.getCurrency( unitId )
if mu.isSet( unit ) then
if unit.mul then
a = mu.formatNumber( string.format( '%.2f', -- 2 decimal places
tonumber( value.amount ) * unit.mul ) )
end
if mi.noCurrencyConversion.all or mi.noCurrencyConversion[ unit.iso ] then
unit = mu.makeSpan( cm.getCurrencyFormatter( unitId ),
'voy-currency voy-currency-' .. unit.iso:lower() )
else
er = er or require( 'Module:Exchange rate' )
unit = er.getWrapper( a, unit.iso, '', 2, cm.getCurrencyFormatter )
mu.addMaintenance( 'currencyTooltip' )
end
else
unit = vq.labels[ unitId ]
end
if unit and unit:find( '%s', 1, true ) then
a = mw.ustring.format( unit, a )
elseif unit then
u = unit
elseif mw.wikibase.isValidEntityId( unitId ) then
-- currency code
u = wu.getValue( unitId, mi.properties.iso4217 )
if u == '' then
-- unit symbol
u = wu.getValuesByLang( unitId, mi.properties.unitSymbol, 1,
page.lang )
u = u[ 1 ] or ''
end
if u ~= '' then
mu.addMaintenance( 'unitFromWD' )
else
u = unitId
mu.addMaintenance( 'unknownUnit' )
end
end
return ( u ~= '' ) and a .. ' ' .. u or a
end
end
local function getHourModules()
if not hr then
hi = require( 'Module:Hours/i18n' )
hr = require( 'Module:Hours' )
end
end
local function getLabel( id )
local label = id
local tables = { vq.labels }
if hi then
table.insert( tables, hi.dateIds )
end
if type( id ) == 'string' and id:match( '^Q%d+$' ) then
for i, tab in ipairs( tables ) do
if type( tab[ id ] ) == 'string' then
label = tab[ id ]
break
end
end
if label == '' then
return label
elseif label == id then
label = mu.getTypeLabel( id )
end
if label == '' or label == id then
label = wu.getLabel( id ) or ''
if label == '' then
mu.addMaintenance( 'unknownLabel' )
else
mu.addMaintenance( 'labelFromWD' )
end
end
end
return label
end
local function removeStringDuplicates( ar )
local hash = {}
local result = {}
local val
for i = 1, #ar do
val = ar[ i ]
if not hash[ val ] then
table.insert( result, val )
hash[ val ] = 1
end
end
return result
end
-- getting comments for contacts and prizes from Wikidata using tables
local function getComments( statement, properties, args, page )
local comments = {}
local isMobilephone = false
local minAge, maxAge
for i, property in ipairs( properties ) do
local pType = property .. '-type'
if statement[ property ] then
if property == mi.properties.minimumAge then
minAge = getQuantity( statement[ property ][ 1 ], page )
elseif property == mi.properties.maximumAge then
maxAge = getQuantity( statement[ property ][ 1 ], page )
end
for j, id in ipairs( statement[ property ] ) do
if statement[ pType ] == 'monolingualtext' then
id = id.text
elseif statement[ pType ] == 'time' then
-- getting last date in case of price/fees
id = wu.getDateFromTime( id )
if not mu.isSet( args.asOf ) or args.asOf < id then
args.asOf = id
end
id = ''
elseif type( id ) == 'table' then
id = ''
end
if id == mi.qualifiers.mobilePhone then
isMobilephone = true
else
mu.tableInsert( comments, getLabel( id ) )
end
end
end
end
comments = removeStringDuplicates( comments )
if minAge and maxAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.fromTo,
minAge:gsub( '(%d+).*', '%1' ), maxAge ) )
elseif minAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.from, minAge ) )
elseif maxAge then
mu.tableInsert( comments, mw.ustring.format( mi.texts.to, maxAge ) )
end
return table.concat( comments, mu.commaSeparator ), isMobilephone
end
local function getLngProperty( lng, p )
if not mu.isSet( lng ) then
return ''
end
lg = lg or require( 'Module:Languages' )
local item = lg.lngProps[ lng ]
if not item then
local hyphen = lng:find( '-', 1, true )
if hyphen and hyphen > 1 then
item = lg.lngProps[ lng:sub( 1, hyphen - 1 ) ]
end
end
if item then
item = item[ p ]
end
return item or ( p == 'c' and 0 or '' )
end
local function removeTableDuplicates( ar )
local hash = {}
local result = {}
local hashVal
for i, tab in ipairs( ar ) do
hashVal = tab.value .. '#' .. tab.comment
if not hash[ hashVal ] then
table.insert( result, tab )
hash[ hashVal ] = 1
end
end
return result
end
local function mergeComments( ar )
if #ar > 1 then
for i = #ar, 2, -1 do
for j = 1, i - 1, 1 do
if ar[ i ].value == ar[ j ].value and ar[ i ].comment ~= ''
and ar[ j ].comment ~= '' then
ar[ j ].comment = ar[ j ].comment .. '; ' .. ar[ i ].comment
table.remove( ar, i )
break
end
end
end
end
end
local function convertTableWithComment( ar )
for i = 1, #ar, 1 do
if ar[ i ].comment == '' then
ar[ i ] = ar[ i ].value
else
ar[ i ] = ar[ i ].value .. mu.parentheses( ar[ i ].comment )
end
end
end
--[[
properties are defined in Module:vCard/Params
p property or set of properties
f formatter string
c maximum count of results, default = 1
m concat mode (if c > 1), default concat with ', '
v value type,
empty: string value (i.e. default type),
id: string value of an id like Q1234567
idl: string value of the label of an id like Q1234567
il: language-dependent string value
iq: string value with qualifier ids
au: quantity consisting of amount and unit
pau: quantity consisting of amount (for P8733)
vq: string or table value with qualifiers ids and references
l = lang: language dependent
wiki / local: monolingual text by wiki or local language
le = true: use date for lastedit parameter
--]]
-- function returns an array in any case
local function getWikidataValues( args, propDef, entity, page, country )
local ar = {}
local a, isMobilephone, item, id, langs, q, u
-- setting defaults
propDef.v = propDef.v or ''
propDef.f = propDef.f or ''
propDef.c = propDef.c or 1
-- getting value arrays
if propDef.l == 'wiki' then
ar = wu.getValuesByLang( entity, propDef.p, propDef.c, page.lang )
elseif propDef.l == 'local' then
ar = wu.getValuesByLang( entity, propDef.p, propDef.c, country.lang )
elseif propDef.l == 'lang' and propDef.c == 1 then
id = getLngProperty( country.lang, 'q' )
if id == '' then
country.unknownLanguage = true
else
-- using language of work or name ( page.lang, mi.langs, country.lang )
a = wu.getValuesByQualifier( entity, propDef.p, mi.properties.languageOfName, id )
if next( a ) then
langs = mu.getLangTable( page.lang, country.lang )
for i, lang in ipairs( langs ) do
item = a[ getLngProperty( lang, 'q' ) ]
if item then
break
end
end
ar = { item or a[ next( a, nil ) ] } -- fallback: first item
end
end
elseif propDef.v == 'iq' or propDef.v == 'iqa' or propDef.v == 'iqp' then
q = mi.propTable.quantity
if propDef.v == 'iqa' then
q = mi.propTable.accessQuantity
elseif propDef.v == 'iqp' then
q = mi.propTable.policyComments
end
ar = wu.getValuesWithQualifiers( entity, propDef.p, propDef.q, q,
{ mi.properties.retrieved }, propDef.c )
if propDef.le then
args.lastedit = wu.getLastedit( args.lastedit, ar )
end
elseif propDef.v == 'au' or propDef.v == 'vq' then
q = propDef.v == 'au' and mi.propTable.feeComments or
mi.propTable.contactComments
ar = wu.getValuesWithQualifiers( entity, propDef.p, nil, q,
{ mi.properties.retrieved }, propDef.c )
-- maybe a change of nil to a properties table is useful
if propDef.le then
args.lastedit = wu.getLastedit( args.lastedit, ar )
end
else
ar = wu.getValues( entity, propDef.p, propDef.c )
end
if #ar == 0 and propDef.p ~= mi.properties.instanceOf then
return ar
end
for i = #ar, 1, -1 do
-- amount with unit (for fees)
if propDef.v == 'au' then
a = getQuantity( ar[ i ].value, page )
if a == '0' then
a = vq.labels.gratis
end
u = getComments( ar[ i ], mi.propTable.feeComments, args, page )
ar[ i ] = { value = a, comment = u }
-- for number of rooms P8733
elseif propDef.v == 'pau' then
if ar[ i ].unit == '1' then
a = tonumber( ar[ i ].amount ) or 0
else
a = 0
end
ar[ i ] = {}
ar[ i ][ mi.properties.quantity ] = { a }
ar[ i ][ mi.properties.quantity .. '-type' ] = 'quantity'
ar[ i ].value = mi.qualifiers.roomNumber
ar[ i ]['value-type'] = 'wikibase-entityid'
-- qualifier ids (for subtypes)
elseif propDef.v == 'iq' or propDef.v == 'iqa' or propDef.v == 'iqp' then
if ar[ i ][ 'value-type' ] ~= 'wikibase-entityid' then
table.remove( ar, i )
end
if propDef.v == 'iqa' then
ar[ i ].policyComment =
getComments( ar[ i ], mi.propTable.accessibility, args, page )
end
if propDef.v == 'iqp' then
ar[ i ].policyComment =
getComments( ar[ i ], mi.propTable.policyComments, args, page )
end
-- strings with qualifiers (for contacts)
elseif propDef.v == 'vq' then
if ar[ i ][ 'value-type' ] ~= 'string' then
table.remove( ar, i )
else
u, isMobilephone =
getComments( ar[ i ], mi.propTable.contactComments, args, page )
if vi.options.useMobile and propDef.t then
if ( isMobilephone and propDef.t == 'mobile' ) or
( not isMobilephone and propDef.t == 'landline' ) then
ar[ i ] = { value = ar[ i ].value, comment = u }
else
table.remove( ar, i )
end
else
ar[ i ] = { value = ar[ i ].value, comment = u }
end
end
-- value, monolingual text, identifier
else
if propDef.v == 'id' then
ar[ i ] = ar[ i ].id
elseif propDef.v == 'idl' then
getHourModules()
ar[ i ] = hr.formatTime( getLabel( ar[ i ].id ) )
end
if ar[ i ] ~= '' and propDef.f ~= '' then
ar[ i ] = mw.ustring.format( propDef.f, ar[ i ] )
end
end
if propDef.v == 'au' or propDef.v == 'vq' then
if ar[ i ] and ar[ i ].value == '' then
table.remove( ar, i )
end
else
if ar[ i ] == '' then
table.remove( ar, i )
end
end
end
-- cleanup
if propDef.v == 'au' or propDef.v == 'vq' then
ar = removeTableDuplicates( ar )
mergeComments( ar )
convertTableWithComment( ar )
else
ar = removeStringDuplicates( ar )
end
return ar
end
local function getWikidataItem( args, parWDitem, entity, page, country )
local arr = {}
local function singleProperty( propDef )
if #arr == 0 then
arr = getWikidataValues( args, propDef, entity, page, country )
else
for i, value in ipairs( getWikidataValues( args, propDef, entity, page, country ) ) do
table.insert( arr, value ) -- copy to arr
end
end
end
local p = parWDitem
if not p then
return ''
end
p.c = p.c or 1 -- count
local tp = type( p.p )
if tp == 'string' then
singleProperty( p )
elseif tp == 'table' then
for i, sngl in ipairs( p.p ) do
if type( sngl ) == 'table' then
singleProperty( sngl )
if p.c == 1 and #arr > 0 then
break
end
end
end
end
if #arr > p.c then
for i = #arr, p.c + 1, -1 do -- delete supernumerary values
table.remove( arr, i )
end
end
if p.m == 'no' then
return arr
else
return table.concat( arr, p.m or mu.commaSeparator )
end
end
local function getAddressesFromWikidata( args, page, country, entity )
local addresses
-- getting addresses from Wikidata but only if necessary
if args.address == true or type( args.addressLocal ) == 'boolean' then
-- P6375: address
addresses = wu.getMonolingualValues( entity, mi.properties.streetAddress )
if next( addresses ) then -- sometimes addresses contain <br> tag(s)
for key, value in pairs( addresses ) do
addresses[ key ] = value:gsub( '</*br%s*/*>', mi.texts.space )
end
else
return
end
else
return
end
local t, w
if args.address == true then
args.address = addresses[ page.lang ]
-- select address if the same writing system is used
if not args.address then
local weight = -1
local u = getLngProperty( page.lang, 'w' ) -- writing entity id
for key, value in pairs( addresses ) do
-- same writing entity id as page.lang
w = getLngProperty( key, 'w' )
if w == '' then
country.unknownPropertyLanguage = true
else
if key and w == u then -- same writing entity id
w = getLngProperty( key, 'c' ) -- getting language weight
if w > weight then -- compare language weight
args.address = value
args.addressLang = key
weight = w
end
end
end
end
end
if not args.address then
for i, lng in ipairs( mi.langs ) do
if addresses[ lng ] then
args.address = addresses[ lng ]
args.addressLang = lng
break
end
end
end
if not args.address then
args.address = ''
args.addressLang = ''
end
vc.fromWD.address = args.address ~= ''
end
-- removing county name from the end of address
-- same with county name in county language and English
if type( args.address ) == 'string' then
args.address = mw.ustring.gsub( args.address,
'[.,;]*%s*' .. country.country .. '$', '' )
end
t = true
for i, lng in ipairs( mi.langs ) do
if country.lang == lng then
t = false
end
end
-- keeping local address in any case for html data
args.addAddressLocal = addresses[ country.lang ] or ''
if t and args.addressLocal == true
and country.lang ~= page.lang then
if country.lang ~= '' then
args.addressLocal = addresses[ country.lang ] or ''
else
-- unknown language, maybe missing in Module:Languages
args.addressLocal = addresses.unknown or ''
end
vc.fromWD.addressLocal = args.addressLocal ~= ''
end
end
local function getDataFromWikidata( args, page, country, entity )
if args.wikidata == '' then
return
end
mu.getTypeFromWikidata( args, entity )
-- prevent local data if wiki language == country language
if page.lang == country.lang then
for i, value in ipairs( vp.localData ) do
if type( args[ value ] ) == 'boolean' then
args[ value ] = ''
end
end
end
mu.getNamesFromWikidata( args, vc.fromWD, page, country, entity )
getAddressesFromWikidata( args, page, country, entity )
if args.hours == true then
local lastEdit
getHourModules()
if not mu.typeIds then
mu.idToType( 'Q1' ) -- dummy call to create mu.typeIds
end
args.hours, lastEdit = hr.getHoursFromWikidata( entity, page.lang,
mi.langs[ 1 ] or '', mi.maintenance.properties, nil, args.lastedit,
vq.labels, { typeTable = mu.types, idTable = mu.typeIds } )
vc.fromWD.hours = args.hours ~= ''
if vi.options.lasteditHours then
args.lastedit = lastEdit
end
end
for key, value in pairs( vp.ParWD ) do
if args[ key ] == true then
args[ key ] =
getWikidataItem( args, vp.ParWD[ key ], entity, page, country )
vc.fromWD[ key ] = args[ key ] ~= ''
end
end
mu.getArticleLink( args, entity, page )
mu.getCommonsCategory( args, entity )
mu.getCoordinatesFromWikidata( args, vc.fromWD, entity )
end
local function finalParametersCheck( args, show, page, country, defaultType, entity )
-- remove boolean values from parameters to have only strings
for key, value in pairs( args ) do
if type( args[ key ] ) == 'boolean' then
args[ key ] = ''
end
end
-- create givenName, displayName tables
mu.prepareNames( args )
-- analysing addressLocal vs address
if args.addressLang and args.addressLang == country.lang then
args.addressLocal = ''
args.addAddressLocal = ''
end
if args.addressLocal ~= '' and args.address == '' then
args.address =
mu.languageSpan( args.addressLocal, mi.texts.hintAddress, page, country )
args.addressLocal = ''
args.addAddressLocal = ''
vc.fromWD.address = vc.fromWD.addressLocal
end
show.noCoord = args.lat == '' or args.long == ''
if show.noCoord then
show.coord = nil
show.poi = nil
mu.addMaintenance( 'missingCoordVc' )
else
mu.prepareCoordinates( args )
end
-- getting Marker type, group, and color
if not mu.isSet( args.type ) and mu.isSet( defaultType ) then
args.type = defaultType
end
mu.checkTypeAndGroup( args )
-- image check
if not vc.fromWD.image or mi.options.WDmediaCheck then
mu.checkImage( args, entity )
end
mu.checkUrl( args )
args.commonscat = args.commonscat:gsub( ' ', '_' )
-- add final period if not yet exists
if mu.isSet( args.description ) then
if mw.ustring.match( args.description, '[%w_€$]$' ) then
args.description = args.description .. mi.texts.period
end
if mw.ustring.len( args.description ) > mi.options.contentLimit and
mi.options.groupsWithLimit[ args.group ] then
args.description = mw.ustring.sub( args.description, 1, mi.options.contentLimit ) .. '…'
mu.addMaintenance( 'contentTooLong' )
end
end
end
local function formatText( args, results, key, class )
if not mu.isSet( args[ key ] ) then
return
end
local r
local textKey = key
local period = mi.texts.period
if key == 'hours' then
args[ key ], r = mw.ustring.gsub( args[ key ],
mi.texts.closedPattern, '' )
textKey = ( r > 0 ) and 'closed' or key
end
r = mw.ustring.format( mi.texts[ textKey ], args[ key ] )
r = mw.ustring.gsub( r, '^%a', mw.ustring.upper )
-- add period if not yet exists
r = r .. ( mw.ustring.sub( r, -1 ) == period and '' or period )
table.insert( results, mu.makeSpan( r, class .. addWdClass( key ) ) )
end
local function formatPhone( args, key, country )
if not mu.isSet( args[ key ] ) then
return ''
end
local class
local pArgs = {
phone = args[ key ],
cc = country.cc,
isFax = false,
isTollfree = false,
format = false
}
if vc.fromWD[ key ] then
pArgs.format = true
pArgs.size = country.phoneDigits or 2
end
if key == 'fax' then
class = 'voy-listing-fax p-tel-fax fax' .. addWdClass( key )
pArgs.isFax = true
else
class = 'p-tel tel' .. addWdClass( key )
if key == 'tollfree' then
class = 'voy-listing-tollfree ' .. class
pArgs.isTollfree = true
elseif key == 'mobile' then
class = 'voy-listing-mobile ' .. class
else
class = 'voy-listing-phone ' .. class
end
end
return mw.ustring.format( mi.texts[ key ],
mu.makeSpan( lp.linkPhoneNumbers( pArgs ), class ) )
end
local function formatDate( aDate, aFormat )
return mw.getContentLanguage():formatDate( aFormat, aDate, true )
end
local function removePeriods( s )
local period = mi.texts.period
local _period = '%' .. period
-- closing (span) tags between full stops
return s:gsub( _period .. '+(</[%l<>/]+>)' .. _period .. '+', '%1' .. period )
:gsub( _period .. _period .. '+', period )
end
local function makeMarkerAndName( args, show, page, country, frame )
local result = {}
-- adding status icons
mu.tableInsert( result, mu.makeStatusIcons( args ) )
-- adding POI marker
if show.poi or mu.isSet( args.copyMarker ) then
table.insert( result, mu.makeMarkerSymbol( args, show, frame ) )
end
mu.makeName( result, args, show, page, country, addWdClass( 'name' ),
addWdClass( 'nameLocal' ) )
if #result > 0 then
result = { table.concat( result, mi.texts.space ) }
end
if args.before ~= '' then
table.insert( result, 1, mu.makeSpan( args.before, 'voy-listing-before' ) )
end
return table.concat( result, mi.texts.space )
end
local function makeEvent( args, page )
local isEvent = false
local s = {}
local count = 0 -- counts from-to statements
local startMonth -- month of start date
local today = page.langObj:formatDate( 'Y-m-d', 'now', true )
local todayYear = today:sub( 1, 4 ) -- yyyy
local todayMonth = today:sub( 6, 7 ) -- mm
local lastDate = ''
local lastYear = ''
local useYMD -- both dates are yyyy-mm-dd
local function makePeriod( beginP, endP )
if beginP == endP then
endP = ''
end
if mu.isSet( beginP ) and mu.isSet( endP ) then
count = count + 1
return mw.ustring.format( mi.texts.fromTo2, beginP, endP )
elseif mu.isSet( beginP ) then
return beginP
else
return endP
end
end
local function analyseDate( d, m, y )
local success, c, t
if useYMD then
success, t = pcall( formatDate, d, mi.dates.yyyymmdd.f )
if success then
success, c = pcall( formatDate, d, 'Y-m-d' )
end
if success then
lastDate = c > lastDate and c or lastDate
d = t
end
return d, nil
end
if d:match( mi.dates.yyyymmdd.p ) then
y = d:sub( 1, 4 )
d = d:sub( 6 )
end
if mu.isSet( y ) then
if y:match( mi.dates.yy.p ) then
y = ( '2000' ):sub( -#y ) .. y
elseif not y:match( mi.dates.yyyy.p ) then
y = nil
end
lastYear = y > lastYear and y or lastYear
end
if mu.isSet( d ) and mu.isSet( m ) and d:match( mi.dates.dd.p ) and
not m:match( mi.dates.mm.p ) then
-- try to convert month to number string
success, t = pcall( formatDate, m, 'm' )
if success then
m = t
else
for i = 1, 12, 1 do
if m == mi.months[ i ] or mw.ustring.match( m, mi.monthAbbr[ i ] ) then
m = '' .. i
break
end
end
end
end
if mu.isSet( d ) and mu.isSet( m ) and d:match( mi.dates.dd.p ) and
m:match( mi.dates.mm.p ) then
d = m:gsub( '%.+$', '' ) .. '-' .. d:gsub( '%.+$', '' )
m = nil
elseif mu.isSet( d ) and not mu.isSet( m ) and d:match( mi.dates.dd.p ) then
d = ( startMonth or todayMonth ) .. '-' .. d:gsub( '%.+$', '' )
end
if mu.isSet( d ) then
if d:match( mi.dates.mmdd.p ) then
startMonth = d:gsub( '%-%d+', '' )
m = nil
c = ( y or todayYear ) .. '-' .. d
success, t = pcall( formatDate, c, mi.dates.mmdd.f )
if success then
d = t
end
elseif d:match( mi.dates.dd.p ) and not mu.isSet( m ) and startMonth then
c = ( y or todayYear ) .. '-' .. startMonth .. '-' .. d
success, t = pcall( formatDate, c, mi.dates.mmdd.f )
if success then
d = t
end
end
end
if mu.isSet( m ) then
d = ( mu.isSet( d ) and ( d .. mi.texts.space ) or '' ) .. m
end
return d, y
end
if not mu.groupWithEvents( args.group ) then
return ''
end
-- check if vCard is an event
for i, param in ipairs( vp.checkEvent ) do
if mu.isSet( args[ param ] ) then
isEvent = true
break
end
end
if not isEvent then
return ''
end
if mu.isSet( args.frequency ) then
table.insert( s, mu.makeSpan( args.frequency, 'voy-listing-frequency' ) )
else
if args.date:match( mi.dates.yyyymmdd.p ) and
args.endDate:match( mi.dates.yyyymmdd.p ) then
useYMD = true
if args.date > args.endDate then
args.date, args.endDate = args.endDate, args.date
end
end
args.date, args.year
= analyseDate( args.date, args.month, args.year )
args.endDate, args.endYear
= analyseDate( args.endDate, args.endMonth, args.endYear )
local d = {}
mu.tableInsert( d, makePeriod( args.date, args.endDate ) )
mu.tableInsert( d, makePeriod( args.year, args.endYear ) )
mu.tableInsert( s, mu.makeSpan( table.concat( d, count > 1 and
mu.commaSeparator or mi.texts.space ), 'voy-listing-date' ) )
if ( lastYear ~= '' and lastYear < todayYear ) or
( lastDate ~= '' and lastDate < today ) then
mu.addMaintenance( 'outdated' )
end
end
if mu.isSet( args.location ) then
local locations = mu.textSplit( args.location, ',' )
for i, location in ipairs( locations ) do
if location ~= page.subpageText and location ~= page.text
and mw.title.new( location, '' ).exists then
location = mu.makeSpan( '[[' .. location .. ']]', 'voy-listing-location' )
end
table.insert( s, location )
end
end
s = table.concat( s, mu.commaSeparator )
return ( s ~= '' and ': ' or '' ) .. s
end
local function makeAddressAndDirections( args, page, country )
local r = ''
local p, t
if mu.isSet( args.address ) then
p = {}
if mu.isSet( args.addressLang ) then
p.lang = args.addressLang
t = mw.language.fetchLanguageName( args.addressLang, page.lang )
if mu.isSet( t ) then
p.title = mw.ustring.format( mi.texts.hintAddress2, t )
else
country.unknownPropertyLanguage = true
end
end
r = mu.commaSeparator .. mu.makeSpan( args.address,
'voy-listing-address p-adr adr' .. addWdClass( 'address' ), true, p )
end
if mi.options.showLocalData and mu.isSet( args.addressLocal ) then
r = r .. mu.comma .. mu.languageSpan( args.addressLocal, mi.texts.hintAddress,
page, country, 'voy-listing-address-local' .. addWdClass( 'addressLocal' ) )
end
t = {}
if mu.isSet( args.directions ) then
table.insert( t, mu.makeSpan( args.directions,
'voy-listing-directions' .. addWdClass( 'directions' ) ) )
end
if mi.options.showLocalData and mu.isSet( args.directionsLocal ) then
table.insert( t, mu.languageSpan( args.directionsLocal,
mi.texts.hintDirections, page, country,
'voy-listing-directions-local' .. addWdClass( 'directionsLocal' ) ) )
end
if #t == 0 then
return r
end
return r .. mi.texts.space .. mu.makeSpan( mu.parentheses( table.concat( t, mu.comma ), true ),
'voy-listing-add-address' )
end
local function makeContacts( args, country )
local t = {}
local s
mu.tableInsert( t, formatPhone( args, 'phone', country ) )
mu.tableInsert( t, formatPhone( args, 'tollfree', country ) )
mu.tableInsert( t, formatPhone( args, 'mobile', country ) )
mu.tableInsert( t, formatPhone( args, 'fax', country ) )
if args.email ~= '' then
local lm = require( 'Module:LinkMail' )
s = mu.makeSpan( lm.linkMailSet( { email = args.email, ignoreUnicode = 1 } ),
'voy-listing-email u-email email' .. addWdClass( 'email' ) )
mu.tableInsert( t, mw.ustring.format( mi.texts.email, s ) )
end
s = table.concat( t, mu.commaSeparator )
if s ~= '' then
-- mi.texts.periodSeparator = '. '
s = mi.texts.periodSeparator .. mw.ustring.gsub( s, '^%a', mw.ustring.upper )
end
return s
end
-- making subtypes string
local function makeFeatures( args, tab )
vs = vs or require( 'Module:VCard/Subtypes' )
local function getSubtypeParams( subtype )
local r = vs.f[ subtype ] or mu.getTypeParams( subtype )
if not r.n then
r.n = r.label or subtype
end
r.g = r.g or vs.fromTypesGroupNumber
return r
end
vc.fromWD.subtypeAdd = type( args.subtypeAdd ) == 'table' and #args.subtypeAdd > 0
-- merging subtypeAdd (from Wikidata) to manually entered subtypes
local unknowWDfeatures = false
local label, p, t
if vc.fromWD.subtypeAdd then
-- making translation table from Wikidata ids to feature types
if not vc.subtypeIds then
vc.subtypeIds = mu.getAliases( vs.f, 'wd' )
end
-- adding type if Wikidata id (wd.value) is known
-- indexed array prevents multiple identical types
for i, wd in ipairs( args.subtypeAdd ) do
t = vc.subtypeIds[ wd.value ] or mu.idToType( wd.value )
if not t then
-- maybe instance or subclass of wd.value are known
local p31ids = wu.getIds( wd.value, mi.properties.instanceOf )
local p279ids = wu.getIds( wd.value, mi.properties.subclassOf )
-- merging both arrays
for j = 1, #p279ids, 1 do
table.insert( p31ids, p279ids[ j ] )
end
for j = 1, #p31ids, 1 do
t = vc.subtypeIds[ p31ids[ j ] ] or mu.idToType( p31ids[ j ] )
if t then
break
end
end
end
-- subtype from WD is not known
if not t and not vs.exclude[ wd.value ] then
unknowWDfeatures = true
-- try to add a new subtype Q... to vs.f subtypes table
label = wu.getLabel( wd.value )
if label then
vs.f[ wd.value ] = {
n = label,
wd = wd.value,
g = vs.fromWDGroupNumber
}
t = wd.value
end
end
-- add known subtype
if t then
vc.subtypes[ t ] = {
c = ( wd[ mi.properties.quantity ]
and wd[ mi.properties.quantity ][ 1 ] )
or ( wd[ mi.properties.capacity ] and
wd[ mi.properties.capacity ][ 1 ] ) or '',
p = wd.policyComment
}
end
end
end
if unknowWDfeatures then
mu.addMaintenance( 'unknowWDfeatures' )
end
if next( vc.subtypes ) == nil and #args.subtypeTable == 0 then
return
end
-- replace selected subtypes
for subtype, count in pairs( vc.subtypes ) do
if vs.convert[ subtype ] then
if type( count ) == 'table' then
p = count.p
count = count.c
end
t = vs.convert[ subtype ][ count ] or vs.convert[ subtype ][ 1 ]
vc.subtypes[ t ] = { p = p }
vc.subtypes[ subtype ] = nil
end
end
-- make subtypes table sortable
local s = {};
for subtype, count in pairs( vc.subtypes ) do
if type( count ) == 'table' then
table.insert( s, { t = subtype, c = count.c, p = count.p } )
else
table.insert( s, { t = subtype, c = count } )
end
end
-- add subtypes from types table
if args.subtypeTable then
for i, subtype in ipairs( args.subtypeTable ) do
table.insert( s, { t = subtype, c = 1 } )
end
end
-- sorting subtypes
-- by subtype group and then alphabetically by name
table.sort( s,
function( a, b )
local at = getSubtypeParams( a.t )
local bt = getSubtypeParams( b.t )
local na = mu.convertForSort( at.n )
local nb = mu.convertForSort( bt.n )
return ( at.g < bt.g ) or ( at.g == bt.g and na < nb )
end
)
-- make text and data output
local data = {} -- for data-subtype attribute in wrapper tag
if #s > 0 then
local r = {};
local subtype, f, u, u_n, v
for i = 1, #s do
subtype = s[ i ]
-- for data-subtype="..." in wrapper tag
u = subtype.t .. ',' .. tostring( i )
if type( subtype.c ) == 'number' and subtype.c > 1 then
u = u .. ',' .. subtype.c
end
table.insert( data, u )
u = getSubtypeParams( subtype.t )
if u.g >= vs.firstGroup then
u_n = u.n
if not mu.isSet( u_n ) then
u_n = subtype.t
end
u_n = u_n:gsub( '[,;/].*$', '' )
local count = ( type( subtype.c ) == 'number' ) and subtype.c or 1
if count > 1 and u_n:find( '%[[^%[%]]*%]' ) then
v = mw.ustring.format( mi.texts.subtypeWithCount, subtype.c,
u_n:gsub( '%[([^%[%]]*)|([^%[%]]*)%]', '%1' )
:gsub( '%[([^%[%]]*)%]', '%1' ) )
else
v = u_n:gsub( '%[([^%[%]]*)|([^%[%]]*)%]', '%2' )
:gsub( '%[([^%[%]]*)%]', '' )
end
if mu.isSet( u.t ) then -- string tooltip
v = mw.ustring.format( mi.texts.subtypeSpan, u.t, v )
elseif mu.isSet( u.f ) then -- icons
f = mw.ustring.format( mi.texts.subtypeFile, u.f, v )
if u.c then
f = mw.ustring.rep( f, u.c )
end
v = mw.ustring.format( mi.texts.subtypeAbbr, v, f )
end
-- adding policy comment
if subtype.p and subtype.p ~= '' then
v = v .. mu.parentheses( subtype.p )
end
end
table.insert( r, v )
end
if #r > 0 then
r = #r == 1 and mw.ustring.format( mi.texts.subtype, r[ 1 ] )
or mw.ustring.format( mi.texts.subtypes, table.concat( r, mu.commaSeparator ) )
if r ~= '' then
table.insert( tab, mu.makeSpan( r,
'voy-listing-subtype' .. addWdClass( 'subtypeAdd' ) ) )
end
end
end
-- subtype contains now the value for wrapper tag
args.subtype = table.concat( data, ';' )
end
local function makePayment( args, results )
if not mu.isSet( args.payment ) then
return
end
local t
local class = 'voy-listing-payment p-note note'
if type( args.payment ) == 'table' then
local vr = mw.loadData( 'Module:VCard/Cards')
for i = #args.payment, 1, -1 do -- remove unknown items
t = args.payment[ i ]
if vr.cards[ t ] then
args.payment[ i ] = vr.cards[ t ]
else
table.remove( args.payment, i )
end
end
class = class .. mu.addWdClass( #args.payment > 0 )
args.payment = table.concat( args.payment, mu.commaSeparator )
else
mu.addMaintenance( 'paymentUsed' )
end
formatText( args, results, 'payment', class )
end
local function wrapDescription( args, tab, isInline, addText )
if args.description ~= '' then
table.insert( tab, tostring( mw.html.create( isInline and 'span' or 'div' )
:addClass( 'voy-listing-content p-note note' )
:wikitext( args.description .. ( addText or '' ) ) )
)
end
end
local function makeMetadata( args, page )
local outdated = false
local t = args.lastedit
if t ~= '' then
local s, success, u
success, t = pcall( formatDate, t, mi.dates.lastedit.f )
if not success then
mu.addMaintenance( 'wrongDate' )
t = ''
else
success, s = pcall( formatDate, args.lastedit, 'U' ) -- UNIX seconds
if success then
success, u = pcall( formatDate, mi.texts.expirationPeriod, 'U' )
end
if success and s < u then
t = t .. mi.texts.space .. mi.texts.maybeOutdated
outdated = true
end
end
end
local tag = mw.html.create( 'span' )
:attr( 'class', 'voy-listing-metadata' )
-- add node to save the parent tag
:node( mw.html.create( 'span' )
:addClass( 'voy-listing-metadata-item voy-listing-lastedit' )
:addClass( outdated and 'voy-listing-outdated' or nil )
:addClass( t == '' and 'voy-listing-item-dummy' or nil )
:wikitext( mw.ustring.format( mi.texts.lastedit,
t == '' and mi.texts.lasteditNone or t ) )
)
if mu.isSet( args.sectionFrom ) then
local from = args.sectionFrom:gsub( '_', ' ' )
if from ~= page.subpageText and from ~= page.text then
if mu.isSet( args.wikidata ) then
from = mw.ustring.format( '%s#' .. mi.texts.anchor, from, args.wikidata )
end
tag:node( mw.html.create( 'span' )
:addClass( 'voy-listing-metadata-item voy-listing-toSourcePage' )
:wikitext( mw.ustring.format( '[[%s|%s]]', from, mi.texts.editInSource ) )
)
end
end
return tostring( tag )
end
-- making description, coordinates, and meta data
local function makeDescription( args, show, page, country, entity )
local results = {}
-- inline description
if show.inlineDescription then
wrapDescription( args, results, true )
end
-- adding features
makeFeatures( args, results )
-- practicalities
formatText( args, results, 'hours', 'voy-listing-hours p-note note' )
formatText( args, results, 'checkin', 'voy-listing-checkin' )
formatText( args, results, 'checkout', 'voy-listing-checkout' )
if mu.isSet( args.asOf ) and mu.isSet( args.price ) then
local success
success, args.asOf = pcall( formatDate, args.asOf, mi.dates.asOf.f )
if success then
args.price = args.price .. mw.ustring.format( mi.texts.asOf, args.asOf )
end
end
formatText( args, results, 'price', 'voy-listing-price p-note note' )
makePayment( args, results )
-- adding Unesco symbol
if args.unesco ~= '' and vi.options.showUnesco then
local uLink, uTitle = require( 'Module:VCard/Unesco' ).getUnescoInfo( country )
table.insert( results, mu.addLinkIcon( 'voy-listing-unesco', uLink,
uTitle, 'unesco' ) )
end
local noContent = #results == 0
-- adding DMS coordinates
if show.coord then
table.insert( results, mu.dmsCoordinates( args, page, country, vc.fromWD.lat ) )
end
if mi.options.showSisters == 'atEnd' then
table.insert( results, mu.makeIcons( args, page, country, entity, show, vc.fromWD ) )
end
local description
local space = mi.texts.space
-- adding description in block mode
if args.description ~= '' and not show.inlineDescription then
-- last edit will be inserted at the end of the div tag
wrapDescription( args, results, false, makeMetadata( args, page ) )
noContent = false
description = table.concat( results, space )
if description ~= '' then
description = space .. description
end
-- adding description in inline mode
else
description = table.concat( results, space )
if description ~= '' then
description = space .. description
end
end
return removePeriods( description ), noContent
end
-- vCard main function
function vc.vCard( frame )
mu.initMaintenance()
local page = mu.getPageData()
-- getting location (vCard/listing) entity, show options and country data
local args, vcEntity, show, country = initialParametersCheck( frame, page )
-- associated Wikivoyage page of the location in current Wikivoyage branch
-- possibly modified by mu.getArticleLink()
args.wikiPage = ''
-- getting data from Wikidata
getDataFromWikidata( args, page, country, vcEntity )
-- final check
local defaultType = frame.args.type
finalParametersCheck( args, show, page, country, defaultType, vcEntity )
-- making output
-- leading part for marker mode: only location names and comment
-- saving address
args.addressOrig = args.address
-- creating text parts
-- leading part (marker and names)
local leading = makeMarkerAndName( args, show, page, country, frame )
.. makeEvent( args, page )
-- additional parts for vCard mode
-- get address and directions
local address = makeAddressAndDirections( args, page, country )
-- get all contact information
local contacts = makeContacts( args, country ) -- all contacts
contacts = removePeriods( address .. contacts )
-- making description, coordinates, and meta data
local description, noContent =
makeDescription( args, show, page, country, vcEntity )
local r = leading
local icons = ''
if contacts == '' and noContent then
show.inline = true
r = r .. mu.makeIcons( args, page, country, vcEntity, show, vc.fromWD ) .. description
else
if type( mi.options.showSisters ) == 'boolean' then
-- could also be 'atEnd', then part of body
icons = mu.makeIcons( args, page, country, vcEntity, show, vc.fromWD )
end
-- mi.texts.periodSeparator = '. '
r = removePeriods( r .. contacts .. icons ..
( show.noperiod and '' or mi.texts.periodSeparator ) .. description )
:gsub( '%)(</span>)%s*(<span [^>]*>)%s*%(', '%1; %2' )
end
-- prevents line break before punctuation mark
r = r:gsub( '</span>([,;.:!?])', '%1</span>' )
-- remove space(s) before punctuation marks
:gsub( '%s+(<span [^>]*>[,;.:!?])', '%1' )
if show.inlineDescription then
r = r:gsub( '%s+$', '' ) .. makeMetadata( args, page )
end
-- error handling and maintenance, not in template and module namespaces
if country.unknownLanguage then
mu.addMaintenance( 'unknownLanguage' )
end
if country.unknownPropertyLanguage then
mu.addMaintenance( 'unknownPropertyLanguage' )
end
r = r .. mu.makeMaintenance( page, { wu, mu, cm, hr } )
-- wrapping tag
args.address = args.addressOrig
args.template = 'vCard'
return mu.makeWrapper( r, args, page, country, show, vp.vcardData, frame )
end
return vc
7avh0asx4nrnbbfbyv7uj7zy2y16ng8
Modulo:VCard/Subtypes
828
4804
72498
72092
2026-05-28T06:38:35Z
RolandUnger
168
Update
72498
Scribunto
text/plain
-- empty strings should be filled with icons
-- please use only quotation marks instead of apostrophs for JSON export
return {
-- administration
moduleInterface = {
suite = 'vCard',
sub = 'Subtypes',
serial = '2026-05-26',
item = 65455756
},
firstGroup = 2, -- first group to display
fromWDGroupNumber = 98, -- group number for Q... types from Wikidata
fromTypesGroupNumber = 99, -- group number for types from types table
-- subtype conversion
convert = {
hotelstars = { "1", "2", "3", "4", "5" }, -- hotel stars codes
michelin = { "michelin1", "michelin2", "michelin3" }
},
-- type list
f = {
-- classification, rating, y & n. Group 1 is usually not displayed
budget = { g = 1, wd = "", n = "günstig" },
midrange = { g = 1, wd = "", n = "mittel" },
upmarket = { g = 1, wd = "", n = "gehoben" },
-- fetching features from Wikidata
n = { g = 1, wd = "", alias = { "no", "none", "nein" }, n = "ohne Wikidata-Merkmale" },
y = { g = 1, wd = "", alias = { "yes", "j", "ja" }, n = "mit Wikidata-Merkmalen" },
-- hotel rating
hotelstars = { g = 2, wd = "Q2976556", n = "Hotel-Stern[e]" }, -- see: convert
-- Upto now it seems that there is no font containing the left black half star
-- (u+2BE8): ⯨. That's why now the ½ workaround.
["1"] = { g = 2, wd ="Q110772650", sortkey = "01*", n = "★", t = "1-Stern-Bewertung" }, -- tourist
["1h"] = { g = 2, wd ="Q110932985", sortkey = "01*5", n = "★½", t = "1,5-Sterne-Bewertung" }, -- superior tourist (tourist plus)
["1s"] = { g = 2, wd ="Q109726413", sortkey = "01*S", n = "★S", t = "1-Stern-Superior-Bewertung" }, -- superior tourist (tourist plus)
["2"] = { g = 2, wd ="Q110772651", sortkey = "02*", n = "★★", t = "2-Sterne-Bewertung" }, -- standard
["2h"] = { g = 2, wd ="Q110932986", sortkey = "02*5", n = "★★½", t = "2,5-Sterne-Bewertung" }, -- superior standard
["2s"] = { g = 2, wd ="Q109726348", sortkey = "02*S", n = "★★S", t = "2-Sterne-Superior-Bewertung" }, -- superior standard
["3"] = { g = 2, wd ="Q110772652", sortkey = "03*", n = "★★★", t = "3-Sterne-Bewertung" }, -- comfort
["3h"] = { g = 2, wd ="Q110932987", sortkey = "03*5", n = "★★★½", t = "3,5-Sterne-Bewertung" }, -- superior comfort
["3s"] = { g = 2, wd ="Q109726284", sortkey = "03*S", n = "★★★S", t = "3-Sterne-Superior-Bewertung" }, -- superior comfort
["4"] = { g = 2, wd ={ "Q110772653", "Q99309708" }, sortkey = "04*", n = "★★★★", t = "4-Sterne-Bewertung" }, -- first class
["4h"] = { g = 2, wd ="Q110932988", sortkey = "04*5", n = "★★★★½", t = "4,5-Sterne-Bewertung" }, -- superior first class
["4s"] = { g = 2, wd ="Q109726210", sortkey = "04*S", n = "★★★★S", t = "4-Sterne-Superior-Bewertung" }, -- superior first class
["5"] = { g = 2, wd ={ "Q109248725", "Q109248724" }, sortkey = "05*", n = "★★★★★", t = "5-Sterne-Bewertung" }, -- luxury
["5s"] = { g = 2, wd ="Q109726138", sortkey = "05*S", n = "★★★★★S", t = "5-Sterne-Superior-Bewertung" }, -- superior luxury
-- Michelin awards to restaurant chefs
bib_gourmand = { g = 2, wd ="Q104135230", n = "Bib Gourmand" },
michelin = { g = 2, wd = "Q20824563", n = "Michelin-Stern[e]" },
michelin1 = { g = 2, wd = "", n = "Michelin 1*", f = "Etoile Michelin-1.svg", c = 1 },
michelin2 = { g = 2, wd = "", n = "Michelin 2*", f = "Etoile Michelin-1.svg", c = 2 },
michelin3 = { g = 2, wd = "", n = "Michelin 3*", f = "Etoile Michelin-1.svg", c = 3 },
-- subtypes from subtype parameter in types table
bnb = { g = 3, wd = "Q367914", n = "Bed & Breakfast" },
boarding_house = { g = 3, wd = { "Q1558858", "Q1065252" }, n = "Pension" },
hotel_garni= { g = 3, wd = "Q1631103", n = "Garni" },
-- general facilities
accessible = { g = 4, wd = "Q808926", n = "barrierefrei" }, -- barrier-free, for handicapped people
ai = { g = 4, wd = "Q1281666", n = "All inclusive" },
basement_garage = { g = 4, wd = "Q2431970", n = "Tiefgarage[]" },
car_park = { g = 4, wd = "Q13218805", n = "Parkhaus" },
free_wlan = { g = 4, wd = "Q1543615", n = "freies WLAN" },
garage = { g = 4, wd = "Q22733", n = "Garage[n]" },
induction_loop = { g = 4, wd = "Q2163913", n = "Induktionsschleife[n]" },
internet_access = { g = 4, wd = "Q1472399", n = "Internetzugang" }, -- unknown type or both lan and wlan
lan = { g = 4, wd = "Q11381", n = "LAN" },
lgbt = { g = 4, wd = "Q17884", n = "LGBT", f = "Gay flag.svg" }, -- including gay
nobreakfast= { g = 4, wd ="Q106041208", n = "kein Frühstück" },
nowheelchair = { g = 4, wd = "Q24192069", n = "nicht rollstuhlzugänglich", f = "Wheelchair-red3.png" },
nowlan = { g = 4, wd = "Q1814990", n = "kein WLAN" }, -- no
paid_wlan = { g = 4, wd = "Q24202480", n = "kostenpflichtiges WLAN" },
parking = { g = 4, wd = "Q6501349", n = "Parkpl[ä|a]tz[e]" },
tactile_graphic = { g = 4, wd = "Q7674130", n = "Blindengrafik[en]" },
valet_parking = { g = 4, wd = "Q1423019", n = "Valet-Parken" },
withbreakfast = { g = 4, wd ="Q106041297", n = "mit Frühstück" },
wheelchair = { g = 4, wd = "Q24192067", n = "rollstuhlzugänglich", f = "Wheelchair-green3.png" },
wheelchair_available = { g = 4, wd = "Q191931", n = "Rollstuhl verfügbar" },
wheelchair_with_help = { g = 4, wd = "Q24192068", n = "rollstuhlzugänglich mit Hilfe", f = "Wheelchair-yellow3.png" },
wheelchair_partially = { g = 4, wd = "Q63731120", n = "teilweise rollstuhlzugänglich" },
wheelchair_partially_with_help = { g = 4, wd = "Q63731151", n = "teilweise rollstuhlzugänglich mit Hilfe" },
wlan = { g = 4, wd = { "Q6452715", "Q29643" }, n = "WLAN" }, -- yes
-- hotel facilities
adult_pool = { g = 5, wd = "", n = "Pool[s] für Erwachsene" },
airport_transfer_service = { g = 5, wd ="Q110012299", n = "Flughafentransfer-Service" },
atm = { g = 5, wd = "Q81235", n = "Geldautomat[en], Bankomat[en]" },
ballroom = { g = 5, wd = "Q805353", n = "Balls[ä|aa]l[e]" },
babysitter = { g = 5, wd = "Q45181247", n = "Babysitter[]" },
bank = { g = 5, wd = "Q22687", n = "Bank[en]" },
banquet_room = { g = 5, wd = "Q85833489", n = "Banketts[ä|aa]l[e]" },
bar = { g = 5, wd = "Q187456", n = "Bar[s]" },
beach = { g = 5, wd = "Q40080", n = "Str[ä|a]nd[e]" },
bed = { g = 5, wd = "Q42177", n = "Bett[en]" },
bicycle_stand = { g = 5, wd = "Q1392526", n = "Fahrradstellpl[ä|a]tz[e]" },
bike_rental= { g = 5, wd = "Q10611118", n = "Fahrradverleih[e]" },
business = { g = 5, wd = "Q203180", n = "Geschäftsbereich[e]" },
buy = { g = 5, wd = "Q1369832", n = "Einkaufen" },
cabana = { g = 5, wd = "Q3649129", n = "Cabana[s], Hütte[n], Umkleidehäuschen" },
cafe = { g = 5, wd = "Q30022", n = "Café[s]" },
cafeteria = { g = 5, wd = "Q8463304", n = "Cafeteria[s]" },
casino = { g = 5, wd = "Q133215", n = "Casino[s]" },
cell = { g = 5, wd = "Q2555640", n = "Zelle[n]" },
change_machine = { g = 5, wd = "Q5071849", n = "Geldwechselautomat[en]" },
cinema = { g = 5, wd = "Q41253", n = "Kino[s]" },
cloakroom = { g = 5, wd = "Q965173", n = "Garderobe[n]" },
conference = { g = 5, wd = { "Q625994", "Q1207465" }, n = "Konferenzr[ä|a]um[e]" },
currency_exchange = { g = 5, wd = "Q2002539", n = "Geldwechsel" },
dance_hall = { g = 5, wd ="Q121085156", n = "Tanzs[ä|aa]l[e]" },
dining_room= { g = 5, wd = "Q661199", n = "Esszimmer" },
diving = { g = 5, wd = "Q179643", n = "Tauchbas[en|is]" },
dormitory = { g = 5, wd = "Q3037266", n = "Schlafs[ä|aa]l[e]" },
family_room= { g = 5, wd = "Q5433389", n = "Familienzimmer[]" },
fitness_center = { g = 5, wd = { "Q1065656", "Q30750411" }, n = "Fitnessstudio[s]" }, -- including gym, healthclub
games_room = { g = 5, wd = "", n = "Spielzimmer[]" },
garden = { g = 5, wd = "Q1107656", n = "G[ä|a]rten" },
golf = { g = 5, wd = { "Q5377", "Q1048525", "Q3177122", "Q3177122" }, n = "Golf, Golfpl[ä|a]tz[e]" },
gym = { g = 5, wd = { "Q14092", "Q203609", "Q121085159" }, n = "Turnhalle[n]" },
indoorpool = { g = 5, wd = "Q357380", n = "Hallenschwimmb[ä|a]d[er]" },
kidsclub = { g = 5, wd = "Q16255832", n = "Kinderclub[s]" },
kiting = { g = 5, wd = "Q219554", n = "Kiten" },
library = { g = 5, wd = "Q7075", n = "Bibliothek[en]" },
lift = { g = 5, wd = "Q132911", n = "Fahrst[ü|u]hl[e], Lift[e]" },
lobby = { g = 5, wd = "Q31948", n = "Lobby[s]" },
luggage_storage = { g = 5, wd = { "Q1195470", "Q21996814" }, n = "Gepäckaufbewahrung[en]" },
money_exchange_machine = { g = 5, wd = "Q25632829", n = "Geldwechselautomat[en]" },
meeting = { g = 5, wd = "Q3469909", n = "Besprechungszimmer[]" }, -- meeting rooms
minigolf = { g = 5, wd = "Q754796", n = "Minigolf" },
nightclub = { g = 5, wd = "Q622425", n = "Nachtclub[s]" },
playground = { g = 5, wd = "Q11875349", n = "Spielpl[ä|a]tz[e]" },
pool = { g = 5, wd = { "Q1501", "Q118559330" }, n = "Schwimmbecken[]" },
reception = { g = 5, wd = "Q2794937", alias = "service_counter", n = "Rezeption[en], Empfangsschalter" },
restaurant = { g = 5, wd = "Q11707", n = "Restaurant[s]" },
roof_garden= { g = 5, wd = "Q1156696", n = "Dachg[ä|a]rten" },
roof_terrace= { g = 5, wd = "Q1081213", n = "Dachterrasse[n]" },
room = { g = 5, wd = "Q180516", n = "Zimmer[]" },
sauna = { g = 5, wd = "Q57036", n = "Sauna[s]" },
socket_near_bed = { g = 5, wd ="Q110073378", n = "Steckdose[n] in Bettnähe" },
shop = { g = 5, wd = "Q213441", n = "Geschäft[e]" },
souvenir_shop = { g = 5, wd = "Q865693", n = "Souvenirgeschäft[e]" },
spa = { g = 5, wd = "Q1341387", alias = "wellness_center", n = "Wellness-Center[], Spa[s]" },
sports = { g = 5, wd = "Q349", n = "Sport" },
suite = { g = 5, wd = "Q1367530", n = "Suite[n]" },
surfing = { g = 5, wd = "Q1324499", n = "Surfen" },
tennis = { g = 5, wd = "Q847", n = "Tennis" },
tennis_court = { g = 5, wd = "Q741118", n = "Tennispl[ä|a]tz[e]" },
theater = { g = 5, wd = "Q24354", n = "Theater[]" },
warm_water = { g = 5, wd = "Q1419245", n = "Warmwasser" },
water_slide= { g = 5, wd = "Q1163166", n = "Wasserrutsche[n]" },
wave_pool = { g = 5, wd = "Q827349", n = "Wellenb[ä|a]d[er]" },
-- non-hotel facilities
audioguide = { g = 5, wd = "Q758877", n = "Audioguide[s]" },
cctv = { g = 5, wd = { "Q242256", "Q334415" }, n = "Videoüberwachungsanlage[n]" },
communal_bunks = { g = 5, wd = "Q1628935", n = "Pl[ä|a]tz[e] im Matratzenlager" },
educational_workshop = { g = 5, wd ="Q113484895", n = "pädagogische[n] Werkst[ä|a]tt[en]" },
guidebook = { g = 5, wd = "Q223638", n = "gedruckte Reiseführer[]" },
lecture_hall = { g = 5, wd = "Q253275", n = "Hörs[ä|aa]l[e]" },
lighting = { g = 5, wd = "Q210064", n = "Beleuchtung" },
museum_shop= { g = 5, wd = "Q2922607", n = "Museumsgeschäft[e]" },
organ = { g = 5, wd = "Q1444", n = "Orgel[n]" },
public_clock = { g = 5, wd ="Q129165885", n = "öffentliche Uhr[en]" },
rest_area = { g = 5, wd = { "Q47520603", "Q785979" }, alias = "picnic_site", n = "Rastpl[ä|a]tz[e], Picknickplatz" },
reading_room = { g = 5, wd = "Q1753764", n = "Leses[ä|aa]l[e]" },
shakedown = { g = 5, wd = "Q40415224", n = "Pl[ä|a]tz[e] im Notlager" },
school_meal= { g = 5, wd = "Q1195832", n = "Schulspeisung" },
winter_room= { g = 5, wd = "Q382899", n = "Pl[ä|a]tz[e] im Winterraum" },
-- services in hotels etc.
["24-hour_reception"] = { g = 6, wd = "", n = "24-Stunden-Rezeption" },
accessible_toilet = { g = 6, wd = "Q2775009", n = "Behinderten-WC[s]" },
airport_shuttle = { g = 6, wd = "", n = "Flughafenshuttle" },
airport_terminal = { g = 6, wd = "Q849706", n = "Flughafenterminal[s]" },
airport_transportation = { g = 6, wd = "", n = "Flughafentransport" },
animation = { g = 6, wd = "Q547762", n = "Animation" },
baby_change = { g = 6, wd = "Q2567605", n = "Wickelr[ä|a]um[e]" },
babysitting = { g = 6, wd = "Q797990", n = "Babysitten" },
bahnhofsmission = { g = 6, wd = "Q801713", n = "Bahnhofsmission" },
beauty_service = { g = 6, wd = "Q30303305", n = "Schönheitsservice" },
bicycle = { g = 6, wd = "Q11442", n = "Fahrrad" },
breakfast = { g = 6, wd = "Q80973", n = "Frühstück" },
breakfast_buffet = { g = 6, wd = "", n = "Frühstücksbuffet" },
breakfast_included= { g = 6, wd = "", n = "inklusive Frühstück" },
bus_stop = { g = 6, wd = "Q953806", n = "Bushaltestelle[n]" },
car_hire = { g = 6, wd = "Q291240", n = "Autovermietung[en]" },
changing_table = { g = 6, wd = "Q1780834", n = "Wickeltisch[e]" },
concierge = { g = 6, wd = "Q2664461", n = "Concierge" },
discotheque = { g = 6, wd = "Q1228895", n = "Discothek[en]" },
dry_cleaning = { g = 6, wd = "Q878156", n = "chemische Reinigung[en]" },
entertainment = { g = 6, wd = "Q173799", n = "Unterhaltung" },
federal_police = { g = 6, wd = "Q56026", n = "Bundespolizei" },
free_parking = { g = 6, wd ="Q108759647", n = "kostenlose[|r] Parkpl[ä|a]tz[e]" },
gate = { g = 6, wd = "Q247739", n = "Flugsteig[e]" },
hairdresser = { g = 6, wd = { "Q55187", "Q95856773", "Q3062512" }, n = "Friseur[e]" },
laundry = { g = 6, wd = { "Q267734", "Q7223085", "Q12893467", "Q57261433" }, n = "Wäscherei[en]" },
live_music = { g = 6, wd ="Q100348587", n = "Livemusik" },
massage = { g = 6, wd = "Q179415", n = "Massage[n]" },
multilingual_staff= { g = 6, wd = "Q30081", n = "mehrsprachiges Personal" },
newspaper = { g = 6, wd = "Q11032", n = "Tageszeitung" },
paid_parking = { g = 6, wd ="Q128800991", n = "kostenpflichtige[|r] Parkpl[ä|a]tz[e]" },
post_office = { g = 6, wd = "Q35054", n = "Postfiliale[n]" },
public_toilet = { g = 6, wd = { "Q813966", "Q3472280" }, n = "öffentliche Toilette[n]" },
railroad_police = { g = 6, wd = "Q1930355", n = "Bahnpolizei" },
room_service = { g = 6, wd = "Q2048970", n = "Zimmerservice" },
selflaundry = { g = 6, wd = "Q1143034", n = "Waschsalon[s]" },
shuttle_bus = { g = 6, wd = "Q1368498", n = "Shuttlebus" },
taxicab_stand = { g = 6, wd = { "Q82650", "Q1395196" }, n = "Taxist[ä|a]nd[e]" },
ticket_machine = { g = 6, wd = "Q657345", n = "Fahrkartenautomat[en]" },
ticket_office = { g = 6, wd = { "Q56845288", "Q15842100" }, n = "Fahrkartenschalter[]" },
toilet = { g = 6, wd = { "Q7857", "Q97657740" }, n = "Toilette[n]" },
urinal = { g = 6, wd = { "Q152285", "Q97657738" }, n = "Urinal[e]" },
wc = { g = 6, wd = "Q7813355", n = "WC[s]" },
workshop = { g = 6, wd = "Q656720", n = "Werkst[ä|a]tt[en]" },
-- room facilities
ac = { g = 7, wd = "Q173725", n = "Klimaanlage[n]" },
air_condition = { g = 5, wd = "Q1265533", n = "Klimaanlage[n]" },
balcony = { g = 7, wd = "Q170552", n = "Balkon[e]" },
bathroom = { g = 7, wd = "Q190771", n = "Badezimmer[]" },
bathtub = { g = 7, wd = "Q152095", n = "Badewanne[n]" },
bottle_warmer = { g = 7, wd = "Q56711128", n = "Flaschenwärmer[]" },
coffeemaker= { g = 7, wd = "Q211841", n = "Kaffeemaschine[n]" },
commonbath = { g = 7, wd = "", n = "Gemeinschaftsb[ä|a]d[er]" }, -- Gemeinschaftsbad
fan = { g = 7, wd = "Q6498398", n = "Ventilator[en]" },
fridge = { g = 7, wd = "Q37828", n = "Kühlschr[ä|a]nk[e]" },
grab_rail = { g = 7, wd = "", n = "Haltegriff[e]" },
hairdryer = { g = 7, wd = "Q15004", n = "Fön[e]" },
jacuzzi = { g = 7, wd = "Q1936429", n = "Whirlpool[s]" }, -- incl. hot tub
kitchen = { g = 7, wd = "Q43164", n = "Küche[n]" }, -- usable for guest, usually in the room
minibar = { g = 7, wd = "Q1191522", n = "Minibar[s]" },
phone = { g = 7, wd = "Q11035", n = "Telefon[e]" },
safe = { g = 7, wd = "Q471898", n = "Safe[s]" },
shower = { g = 7, wd = "Q7863", n = "Dusche[n]" },
terrace = { g = 7, wd = "Q641406", n = "Terrasse[n]" },
tv = { g = 7, wd = "Q8075", n = "Fernseher[], TV" },
-- cuisine by ethnicity
african = { g = 8, wd = "Q386284", n = "afrikanische Küche" },
alsatian = { g = 8, wd = "Q3006870", n = "elsässische Küche" },
american = { g = 8, wd = "Q40578", n = "amerikanische Küche" },
arab = { g = 8, wd = "Q623970", n = "arabische Küche" },
argentinian= { g = 8, wd = "Q579500", n = "argentische Küche" },
asian = { g = 8, wd = "Q728206", n = "asiatische Küche" },
australian = { g = 8, wd = "Q783010", n = "australische Küche" },
austrian = { g = 8, wd = "Q42029", n = "österreichische Küche" },
baden = { g = 8, wd = "Q799087", n = "badische Küche" },
balkan = { g = 8, wd = "Q805060", n = "Balkan-Küche" },
basque = { g = 8, wd = "Q521179", n = "baskische Küche" },
bavarian = { g = 8, wd = "Q458851", n = "bayerische Küche" },
bolivian = { g = 8, wd = "Q3006895", n = "bolivianische Küche" },
brazilian = { g = 8, wd = "Q614394", n = "brasilianische Küche" },
burmese = { g = 8, wd = "Q1187275", n = "burmesische Küche" },
californian= { g = 8, wd = "Q1026802", n = "kalifornische Küche" },
cambodian = { g = 8, wd = "Q139430", n = "kambodschanische Küche" },
cantonese = { g = 8, wd = "Q1154790", n = "kantonesische Küche" },
caribbean = { g = 8, wd = "Q1729345", n = "karibische Küche" },
chinese = { g = 8, wd = "Q10876842", n = "chinesische Küche" },
creole = { g = 8, wd = { "Q85430164", "Q1645076" }, n = "kreolische Küche" },
croatian = { g = 8, wd = "Q1789628", n = "kroatische Küche" },
cypriot = { g = 8, wd = "Q245932", n = "zyprische Küche" },
czech = { g = 8, wd = "Q871595", n = "tschechische Küche" },
danish = { g = 8, wd = "Q1196267", n = "dänische Küche" },
egyptian = { g = 8, wd = "Q1346230", n = "ägyptische Küche" },
english = { g = 8, wd = "Q1261477", n = "englische Küche" },
ethiopian = { g = 8, wd = "Q257508", n = "äthiopische Küche" },
european = { g = 8, wd = "Q579316", n = "europäische Küche" },
franconian = { g = 8, wd = "Q1471192", n = "fränkische Küche" },
french = { g = 8, wd = "Q6661", n = "französische Küche" },
fucha_ryori= { g = 8, wd = "Q10286142", n = "Fucha Ryōri" },
georgian = { g = 8, wd = "Q1199026", n = "georgische Küche" },
german = { g = 8, wd = "Q47629", n = "deutsche Küche" },
greek = { g = 8, wd = "Q744027", n = "griechische Küche" },
home_style = { g = 8, wd = "Q881929", n = "gutbürgerliche Küche" },
hunan = { g = 8, wd = "Q1156889", n = "Hunan-Küche" },
hungarian = { g = 8, wd = "Q264327", n = "ungarische Küche" },
indian = { g = 8, wd = "Q192087", n = "indische Küche" },
indonesian = { g = 8, wd = "Q787497", n = "indonesische Küche" },
international = { g = 8, wd = "Q99522230", n = "internationale Küche" },
iranian = { g = 8, wd = "Q1342397", n = "iranische Küche" },
irish = { g = 8, wd = "Q1068545", n = "irische Küche" },
italian = { g = 8, wd = "Q192786", n = "italienische Küche" },
japanese = { g = 8, wd = "Q234138", n = "japanische Küche" },
jewish = { g = 8, wd = "Q284288", n = "jüdische Küche" },
korean = { g = 8, wd = "Q647500", n = "koreanische Küche" },
latin_american = { g = 8, wd = "Q2707196", n = "lateinamerikanische Küche" },
lebanese = { g = 8, wd = "Q929239", n = "libanesische Küche" },
levantine = { g = 8, wd = "Q765174", n = "levantinische Küche" },
malaysian = { g = 8, wd = "Q772247", n = "malaysische Küche" },
medieval = { g = 8, wd = "Q10886", n = "Mittelalterküche" },
mediterranean = { g = 8, wd = "Q934309", n = "Mittelmeerküche" },
mexican = { g = 8, wd = "Q207965", n = "mexikanische Küche" },
modern = { g = 8, wd = "", n = "moderne Küche" },
national = { g = 8, wd = "Q1968435", n = "Nationalküche" },
nepalese = { g = 8, wd = "Q1194855", n = "nepalesische Küche" },
new_nordic = { g = 8, wd = "Q3345199", n = "New Nordic Cuisine" },
nubian = { g = 8, wd ="Q113827054", n = "nubische Küche" },
oriental = { g = 8, wd = "Q1547037", n = "orientalische Küche" },
pakistani = { g = 8, wd = "Q1089120", n = "pakistanische Küche" },
peruvian = { g = 8, wd = "Q749847", n = "peruanische Küche" },
polish = { g = 8, wd = "Q756020", n = "polnische Küche" },
portuguese = { g = 8, wd = "Q180817", n = "portugiesische Küche" },
regional = { g = 8, wd = "Q94951", n = "Regionalküche" },
rhenish = { g = 8, wd = "Q2147761", n = "rheinische Küche" },
russian = { g = 8, wd = "Q12505", n = "russische Küche" },
savoy = { g = 8, wd = "Q3006988", n = "Savoyer Küche" },
shandong = { g = 8, wd = "Q1038209", n = "Shandong-Küche" },
sichuan = { g = 8, wd = "Q691365", n = "Sichuan-Küche" },
south_indian= { g = 8, wd = "Q3595152", n = "südindische Küche" },
spanish = { g = 8, wd = "Q622512", n = "spanische Küche" },
swedish = { g = 8, wd = "Q35623", n = "schwedische Küche" },
swiss = { g = 8, wd = "Q13497", n = "schweizerische Küche" },
swabian = { g = 8, wd = "Q880365", n = "schwäbische Küche" },
syrian = { g = 8, wd = "Q4119264", n = "syrische Küche" },
thai = { g = 8, wd = "Q841984", n = "thailändische Küche" },
thuringian = { g = 8, wd = "Q187477", n = "Thüringer Küche" },
turkish = { g = 8, wd = "Q654493", n = "türkische Küche" },
ukranian = { g = 8, wd = "Q1503789", n = "ukrainische Küche" },
vietnamese = { g = 8, wd = "Q826059", n = "vietnamesische Küche" },
western = { g = 8, wd = "Q16143746", n = "westliche Küche" },
westphalian= { g = 8, wd = "Q2565249", n = "westfälische Küche" },
-- cuisine by type of food
bagel = { g = 9, wd = "Q272502", n = "Bagel" },
barbecue = { g = 9, wd = "Q461696", n = "Barbecue, BBQ" },
bougatsa = { g = 9, wd = "Q895009", n = "Bougatsa" },
burger = { g = 9, wd = "Q6663", n = "Burger" },
cake = { g = 9, wd = "Q13276", n = "Kuchen" },
casserole = { g = 9, wd = "Q7724780", n = "Kasserolle" },
chicken = { g = 9, wd = "Q864693", n = "Hühnchen" },
crepe = { g = 9, wd = "Q12200", n = "Crêpe" },
couscous = { g = 9, wd = "Q76605", n = "Couscous" },
curry = { g = 9, wd = "Q164606", n = "Curry" },
dessert = { g = 9, wd = "Q182940", n = "Dessert, Nachspeise" },
donut = { g = 9, wd = "Q192783", n = "Donut" },
empanada = { g = 9, wd = "Q747457", n = "Empanada" },
fish = { g = 9, wd = "Q152", n = "Fisch" },
fish_and_chips = { g = 9, wd = "Q203925", n = "Fish and Chips" },
fried_food = { g = 9, wd = "Q300472", n = "Braten" },
friture = { g = 9, wd = "Q854618", n = "Frittieren" },
grill = { g = 9, wd = "Q853185", n = "Grill" },
gyros = { g = 9, wd = "Q681596", n = "Gyros" },
halal = { g = 9, wd = "Q85536643", n = "halal" },
ice_cream = { g = 9, wd = "Q13233", n = "Eis, Speiseeis" },
kebab = { g = 9, wd = "Q179010", n = "Kebab" },
noodle = { g = 9, wd = "Q192874", n = "Nudeln" },
pancake = { g = 9, wd = "Q44541", n = "Pfannkuchen, Eierkuchen" },
pasta = { g = 9, wd = "Q178", n = "Pasta" },
pie = { g = 9, wd = "Q13360264", n = "Pie" },
pizza = { g = 9, wd = "Q177", n = "Pizza" },
salad = { g = 9, wd = "Q9266", n = "Salat" },
sandwich = { g = 9, wd = "Q28803", n = "Sandwich" },
sausage = { g = 9, wd = "Q131419", n = "Wurst, Würstchen" },
seafood = { g = 9, wd = "Q192935", n = "Meeresfrüchte" },
soba = { g = 9, wd = "Q753910", n = "Soba" },
soup = { g = 9, wd = "Q41415", n = "Suppe" },
steakhouse = { g = 9, wd = "Q3109696", n = "Steakhaus" },
sushi = { g = 9, wd = "Q46383", n = "Sushi" },
tapas = { g = 9, wd = "Q220964", n = "Tapa, Tapas" },
vegan = { g = 9, wd = { "Q181138", "Q20669090" }, n = "vegan" },
vegetarian = { g = 9, wd = { "Q83364", "Q638022" }, n = "vegetarisch" },
wild_game = { g = 9, wd = "Q223930", n = "Wild" },
yakitori = { g = 9, wd = "Q483163", n = "Yakitori" },
-- drinks
alcoholic = { g = 10, wd = "Q154", n = "alkoholische Getränke" },
beer = { g = 10, wd = "Q44", n = "Bier" },
cocktails = { g = 10, wd = "Q134768", n = "Cocktails" },
["non-alcoholic"] = { g = 10, wd = "Q2647467", n = "alkoholfreie Getränke" },
noalcoholic= { g = 10, wd = "Q67426650", n = "keine alkoholischen Getränke" },
wine = { g = 10, wd = "Q282", n = "Wine" },
-- services in restaurants
beer_garden = { g = 11, wd = "Q857909", n = "Biergarten" },
bowling_alley = { g = 11, wd = "Q27106471", n = "Bowlingbahn[en]" },
delivery = { g = 11, wd = { "Q2334804", "Q1824143" }, n = "Lieferung, Freihauslieferung" },
drive_in = { g = 11, wd = "Q14253958", n = "Drive-in" },
drive_through = { g = 11, wd = "Q14253958", n = "Drive-through" }, -- including drive-thru
outdoor_seating = { g = 11, wd = "Q98642678", n = "Sitzplätze im Freien" },
reservation = { g = 11, wd = { "Q2145615", "Q7673285" }, n = "Reservierung" },
self_service = { g = 11, wd = "Q1369310", n = "Selbstbedienung" },
table_service = { g = 11, wd ="Q100805023", n = "mit Bedienung" },
takeaway = { g = 11, wd = "Q154383", n = "zum Mitnehmen" }, -- including "take-out", "to-go", and "carry-out"
-- activity policies (P5023)
-- photography
noflash = { g = 12, wd = "Q51728726", n = "ohne Blitz" },
nophotos = { g = 12, wd = "Q51728721", n = "Fotografieren verboten" },
nosticks = { g = 12, wd = "Q53540617", n = "Selfie-Sticks verboten" },
notripod = { g = 12, wd ="Q108583523", n = "ohne Stativ" },
novideo = { g = 12, wd = "Q66361451", n = "Videografieren verboten" },
permit_for_commercial_photography = { g = 12, wd ="Q113756144", n = "Erlaubnis für gewerbsmäßige Fotografie erforderlich" },
photos_allowed= { g = 12, wd = "Q51728733", n = "Fotografieren erlaubt" },
-- general policies
adults_only = { g = 13, wd ="Q132174927", n = "Adults Only, Erwachsenenhotel" },
animals = { g = 13, wd ="Q105100898", n = "Tiere erlaubt" },
bags_prohibited = { g = 13, wd ="Q113773766", n = "große Taschen verboten" },
cats = { g = 13, wd ="Q105100905", n = "Katzen erlaubt" },
companion_dogs= { g = 13, wd ="Q116343464", n = "Begleithunde erlaubt" },
couples_and_families = { g = 13, wd ="Q136175147", n = "Couples and Families Only" },
couples_only = { g = 13, wd ="Q136175105", n = "Couples Only" },
dogs = { g = 13, wd ="Q105100922", n = "Hunde erlaubt" },
drinking_ban = { g = 13, wd ="Q111986775", n = "Trinkverbot" },
eating_ban = { g = 13, wd ="Q116343890", n = "Essensverbot" },
face_mask_mandatory = { g = 13, wd = "Q97933005", n = "Gesichtsmaske vorgeschrieben" },
families_only = { g = 13, wd ="Q136175123", n = "Families Only, Familienhotel" },
leashed_dogs = { g = 13, wd = "Q66361287", n = "Hunde an der Leine" },
noanimals = { g = 13, wd ="Q105094093", n = "Tiere verboten" },
nobarefoot = { g = 13, wd ="Q135522352", n = "keine Barfüßigkeit" },
nobikes = { g = 13, wd = "Q66361472", n = "Fahrräder verboten" },
nocamping = { g = 13, wd = "Q66361437", n = "Campingverbot" },
nocats = { g = 13, wd ="Q105094244", n = "Katzen verboten" },
nodogs = { g = 13, wd ="Q105094236", n = "Hunde verboten" },
nodrones = { g = 13, wd = "Q66361435", n = "Drohnen verboten" },
nofeeding = { g = 13, wd = "Q5286412", n = "Tiere füttern verboten" },
nohighheels = { g = 13, wd ="Q123013492", n = "Stöckelschuhe verboten" },
nokids = { g = 13, wd = "Q24861437", n = "keine Kinder" },
nolittering = { g = 13, wd = "Q66361444", n = "Müllabladen verboten" },
noloudly = { g = 13, wd ="Q111986810", n = "lautes Sprechen verboten" },
nonsmoking = { g = 13, wd = "", n = "Nichtraucher" },
nopets = { g = 13, wd = "Q66361297", n = "Haustiere verboten" },
notouch = { g = 13, wd = "Q66361307", n = "Berühren verboten" },
pets = { g = 13, wd = "Q66361299", n = "Haustiere erlaubt" },
smoking = { g = 13, wd = "Q18809854", n = "Raucher" },
smoking_ban = { g = 13, wd = "Q751734", n = "Rauchverbot" },
smoking_separated= { g = 13, wd ="Q110090224", n = "Rauchen an abgetrennten Plätzen" },
water_mandatory= { g = 13, wd = "Q66361375", n = "eigenes Wasser zwingend erforderlich" },
-- dress codes:
dress_code = { g = 13, wd = "Q286300", n = "Kleiderordnung" },
smart_casual = { g = 13, wd = "Q7544032", n = "Smart casual" },
decent_clothing = { g = 13, wd = "Q66361332", n = "Angemessene Kleidung erforderlich" },
-- difficulties (routes etc.)
novice = { g = 14, wd = "", n = "Anfänger" },
easy = { g = 14, wd = "", n = "einfach" },
intermediate = { g = 14, wd = "", n = "mittel" },
advanced = { g = 14, wd = "", n = "Fortgeschrittene" },
expert = { g = 14, wd = "", n = "Erfahrener" },
freeride = { g = 14, wd = "", n = "Freeride" },
extreme = { g = 14, wd = "", n = "extrem" },
},
-- group meanings
g = {
["1"] = "Preisklasse",
["2"] = "Klassifikation",
["3"] = "Hoteltyp",
["4"] = "allgemeine Ausstattung",
["5"] = "Hotelausstattung",
["6"] = "Hoteldienstleistungen",
["7"] = "Raumausstattung",
["8"] = "Speisen nach Herkunft",
["9"] = "Speisen nach Art",
["10"] = "Getränke",
["11"] = "Restaurantdienstleistungen",
["12"] = "Verhaltensanweisungen Fotografie",
["13"] = "Verhaltensanweisungen",
["14"] = "Schwierigkeitsgrade"
},
exclude = { -- do not translate
Q116168276 = "10. Superior Deluxe",
Q1031873 = "aircraft catapult",
Q573970 = "apron",
Q104123038 = "bilingual street name sign",
Q918324 = "control tower",
Q192375 = "hangar",
Q464020 = "instrument landing system",
Q1061299 = "jet bridge",
Q184590 = "runway",
Q774583 = "solar panel",
Q5191724 = "steeple",
Q35473 = "window"
}
}
003nhm7t6s7bxuy09patnysq8p4fx1j
Modulo:Marker utilities
828
4807
72507
72071
2026-05-28T06:49:19Z
RolandUnger
168
Update
72507
Scribunto
text/plain
--[[
Functions library for Marker and vCard modules
In non-Wikivoyage projects, sister-project links functions have to be adapted.
]]--
-- require( 'strict' )
local cd = require( 'Module:Coordinates' )
local mg = require( 'Module:Marker utilities/Groups' )
local mi = require( 'Module:Marker utilities/i18n' )
local mm -- MAKI icons
local mt = require( 'Module:Marker utilities/Types' ) -- types to groups like drink, eat, go, see, sleep, ...
local uc -- URL check
local wu = require( 'Module:Wikidata utilities' )
-- module variable and administration
local mu = {
moduleInterface = {
serial = '2026-05-27',
item = 58187612
},
comma = mi.texts.comma,
commaSeparator = mi.texts.commaSeparator
}
-- to keep background color in print
local colorAdjust = { ['-webkit-print-color-adjust'] = 'exact', ['color-adjust'] = 'exact',
['print-color-adjust'] = 'exact' }
-- maintenance tools
function mu.initMaintenance()
mu.invalidParams = {} -- table of unknown parameters
mu.duplicateAliases = {} -- table of duplicate parameter aliases
mu.maintenance = {} -- table of error strings
mu.types = mt.types
mu.groups = mg.groups
mu.typeAliases = nil -- table for type aliases. Create on demand
mu.groupAliases = nil -- table for group aliases
end
local function contains( new )
for i = 1, #mu.maintenance do
if mu.maintenance[ i ] == new then
return true
end
end
return false
end
function mu.addMaintenance( key, value )
local s = key -- fallback
local tab = mi.maintenance[ key ]
if tab then
s = mi.formats.category:format( tab.category ) ..
( tab.err and mi.formats.error:format( tab.err ) or '' ) ..
( tab.hint and mi.formats.hint:format( tab.hint ) or '' )
end
s = value and mw.ustring.format( s, value ) or s
if not contains( s ) then
table.insert( mu.maintenance, s )
end
end
function mu.getCategories( formatStr )
return wu.getCategories( formatStr )
end
local function getMaintenance()
if #mu.invalidParams == 1 then
mu.addMaintenance( 'unknownParam', mu.invalidParams[ 1 ] )
elseif #mu.invalidParams > 1 then
mu.addMaintenance( 'unknownParams',
table.concat( mu.invalidParams, mu.commaSeparator ) )
end
if #mu.duplicateAliases > 0 then
mu.addMaintenance( 'duplicateAliases',
table.concat( mu.duplicateAliases, mu.commaSeparator ) )
end
return table.concat( mu.maintenance, '' )
end
function mu.makeMaintenance( page, modules )
local r = getMaintenance()
if mi.options.usePropertyCateg then
local m = mi.maintenance.properties -- format string
for i, aModule in ipairs( modules ) do
if aModule then
r = r .. aModule.getCategories( m )
end
end
end
if page.namespace ~= 0 then
-- remove maintenance categories
r = r:gsub( '%[%[[^%]]+%]%]', '' )
end
return r
end
-- general-use functions
function mu.isSet( arg )
return arg and arg ~= ''
end
function mu.convertForSort( s )
s = s:ulower()
for i, obj in ipairs( mi.substitutes ) do
s = mw.ustring.gsub( s, obj.l, obj.as )
end
return s
end
-- replacing decimal separator and inserting group separators
function mu.formatNumber( num )
if mu.isSet( mi.texts.decimalPoint ) and mi.texts.decimalPoint ~= '.' then
num = num:gsub( '%.', mi.texts.decimalPoint )
end
if mu.isSet( mi.texts.groupSeparator ) then
local count
repeat
num, count = num:gsub( '^([-+]?%d+)(%d%d%d)',
'%1%' .. mi.texts.groupSeparator .. '%2' )
until count == 0
end
return num
end
function mu.tableInsert( tab, value )
if mu.isSet( value ) then
table.insert( tab, value )
end
end
-- splitting string s at sep, removing empty substrings
-- sep is a single character separator but no magic pattern character
function mu.textSplit( s, sep )
local result = {}
if type( s ) ~= 'string' then
return result
end
for str in s:gmatch( '([^' .. sep .. ']+)' ) do
mu.tableInsert( result, mw.text.trim( str ) )
end
return result
end
local function encodeSpaces( s )
s = s:gsub( '[_%s]+', '_' )
return s
end
local function removeChars( s, pattern )
s = s:find( pattern ) and s:gsub( pattern, '' ) or s
return s
end
local function replaceWithSpace( s, pattern )
s = s:find( pattern ) and s:gsub( pattern, ' ' ) or s
return s
end
-- Splitting comma separated lists to a table and converting items
function mu.split( s )
local arr = {}
if not mu.isSet( s ) then
return arr
end
for i, str in ipairs( mu.textSplit( s, ',' ) ) do
arr[ encodeSpaces( str ) ] = 1
end
return arr
end
function mu.makeSpan( s, class, isBdi, attr, css )
return tostring( mw.html.create( isBdi and 'bdi' or 'span' )
:addClass( class )
:attr( attr or {} )
:css( css or {} )
:wikitext( s )
)
end
-- bdi and bdo tags are not working properly on all browsers. Adding marks
-- (lrm, rlm) is maybe the only way for a correct output
function mu.languageSpan( s, titleHint, page, country, addClass )
if not mu.isSet( s ) then
return ''
end
local bdi = mw.html.create( 'bdi' )
:addClass( addClass )
:wikitext( s )
local c = country.lang
if c == '' or c == page.lang then
return tostring( bdi )
end
local dir
local fStr = '%s'
if country.isRTL and not page.isRTL then
dir = 'rtl'
fStr = '‏%s‎'
elseif not country.isRTL and page.isRTL then
dir = 'ltr'
fStr = '‎%s‏'
end
return fStr:format( tostring( bdi
:addClass( 'voy-lang voy-lang-' .. c )
:attr( { title = mw.ustring.format( titleHint , country.langName ),
lang = c, dir = dir } )
) )
end
function mu.addWdClass( isFromWikidata )
return isFromWikidata and ' voy-wikidata-content' or ''
end
function mu.getAliases( tab, key )
local result = {}
if not tab then
return result
end
local v
for k, tb in pairs( tab ) do
v = tb[ key ]
if v then
if type( v ) == 'table' then
for i = 1, #v do
result[ v[ i ] ] = k
end
else
result[ v ] = k
end
end
end
return result
end
function mu.yesno( val )
return mi.yesno[ val:ulower() ]
end
-- check functions
local function emphasize( s )
return mw.ustring.format( mi.texts.emph, s )
end
-- args: template arguments consisting of argument name as key and a value
-- validKeys: table with argument name as key used by the script and
-- a string or a table of strings for argument names used by the local wiki
function mu.checkArguments( templateArgs, validKeys )
local args = {}
if not templateArgs or not validKeys or not next( validKeys ) then
return args
end
local keys = {} -- list of wiki-dependent parameter names
for key, params in pairs( validKeys ) do
if type( params ) == 'string' then
keys[ params ] = key
else
for i = 1, #params do
keys[ params[ i ] ] = key
end
end
end
local targetKey
for key, arg in pairs( templateArgs ) do
targetKey = keys[ key ]
if targetKey then
if args[ targetKey ] then -- prevents duplicates
table.insert( mu.duplicateAliases, emphasize( key ) )
else
args[ targetKey ] = arg
end
else
table.insert( mu.invalidParams, emphasize( key ) )
end
end
-- normalize values
for i, param in ipairs( mi.options.normalizeValues ) do
if mu.isSet( args[ param ] ) then
args[ param ] = replaceWithSpace( args[ param ]:ulower(), '[_%s]+' )
end
end
return args
end
local function removeNS( s, nsTable )
if not s:find( ':', 1, true ) then
return s
end
local t = s
for i = 1, #nsTable do
t = mw.ustring.gsub( t, '^' .. nsTable[ i ] .. ':', '' )
if s ~= t then
return t
end
end
return t
end
function mu.checkCommonsCategory( args )
-- remove namespace from category
if mu.isSet( args.commonscat ) then
args.commonscat = removeNS( args.commonscat, mi.texts.CategoryNS )
end
end
-- checking coordinates
function mu.checkCoordinates( args )
local function clearCoordinates()
args.lat, args.long = '', ''
end
local t
if type( args.lat ) == 'boolean' or type( args.long ) == 'boolean' then
clearCoordinates()
end
if args.lat == '' and args.long == '' then
return
elseif args.lat ~= '' and args.long == '' then
t = args.lat:find( ',', 1, true )
if t then
args.long = mw.text.trim( args.lat:sub( t + 1, #args.lat ) )
args.lat = mw.text.trim( args.lat:sub( 1, t - 1 ) )
end
end
if args.lat == '' or args.long == '' then
clearCoordinates()
mu.addMaintenance( 'wrongCoord' )
return
end
local dms = false
t = tonumber( args.lat )
if t then
args.lat = math.abs( t ) <= 90 and t or ''
else
t = cd.toDec( args.lat, 'lat', 6 )
args.lat = t.error == 0 and t.dec or ''
dms = args.lat ~= ''
end
if args.lat ~= '' then
t = tonumber( args.long )
if t then
args.long = ( t > -180 and t <= 180 ) and t or ''
else
t = cd.toDec( args.long, 'long', 6 )
args.long = t.error == 0 and t.dec or ''
dms = dms or args.long ~= ''
end
end
if args.lat == '' or args.long == '' then
clearCoordinates()
mu.addMaintenance( 'wrongCoord' )
elseif dms then
mu.addMaintenance( 'dmsCoordinate' )
end
end
-- check zoom level
function mu.checkZoom( args )
args.zoom = math.floor( tonumber( args.zoom ) or mi.map.defaultZoomLevel )
if args.zoom < 0 or args.zoom > mi.map.maxZoomLevel then
args.zoom = mi.map.defaultZoomLevel
end
end
-- image check
function mu.checkImage( args, entity )
if type( args.image ) == 'boolean' or args.image == '' then
return
end
-- formal checks
if args.image:find( '^https?:' ) then
args.image = ''
else
-- remove namespace
args.image = removeNS( args.image, mi.texts.FileNS )
local extensionExists = false
local im = args.image:lower()
for i = 1, #mi.fileExtensions do
if im:find( '%.' .. mi.fileExtensions[ i ] .. '$' ) then
extensionExists = true
break
end
end
if not extensionExists then
args.image = ''
end
end
if args.image == '' then
mu.addMaintenance( 'wrongImgName' )
return
end
local alreadyChecked = false
if mi.options.mediaCheck and args.image ~= '' then
if not mi.options.WDmediaCheck and entity then
-- check if image is stored in Wikidata
local imgs = wu.getValues( entity, mi.properties.image, nil )
for i = 1, #imgs do
if imgs[ i ] == args.image then
alreadyChecked = true
break
end
end
end
if not alreadyChecked then
-- expensive function call
local title = mw.title.new( 'Media:' .. args.image )
if not title or not title.exists then
mu.addMaintenance( 'missingImg', args.image )
args.image = ''
end
end
end
end
function mu.checkStatus( args )
args.statusTable = {}
local hash = {}
if mu.isSet( args.status ) then
local statusAliases = mu.getAliases( mi.statuses, 'alias' )
for i, t in ipairs( mu.textSplit( args.status, ',' ) ) do
t = encodeSpaces( t )
t = statusAliases[ t ] or t
if mi.statuses[ t ] then
if not hash[ t ] then
table.insert( args.statusTable, t )
hash[ t ] = 'x'
end
else
mu.addMaintenance( 'unknownStatus' )
end
end
if #args.statusTable > 1 then
table.sort( args.statusTable,
function( a, b )
local at = mi.statuses[ a ]
local bt = mi.statuses[ b ]
return ( at.g < bt.g ) or ( at.g == bt.g and a < b )
end
)
end
end
end
function mu.checkStyles( args )
if mu.isSet( args.styles ) then
if mi.nameStyles[ args.styles:lower() ] then
args.styles = args.styles:lower()
args.styleClass = ' voy-listing-name-style-' .. args.styles
args.styles = mi.nameStyles[ args.styles ]
end
else
args.styles = nil
end
end
function mu.checkId( args )
if mu.isSet( args.id ) and mu.isSet( args.wikidata ) then
mu.addMaintenance( 'wikidataWithId' )
args.id = ''
end
if mu.isSet( args.id ) and args.id:find( '[!-,.-/:-?[-^{-\127%z\1-\31]' ) then
mu.addMaintenance( 'wrongId' )
args.id = ''
end
end
function mu.checkLength( s, min, max )
return #s >= ( min or 0 ) and #s <= ( max or 1000 )
end
-- groups translation for map legend into Wiki language
local function translateGroup( group )
if not mu.isSet( group ) then
group = mt.types.error.group
end
local t = mg.groups[ group ]
if t then
t = t.map or t.label or t.alias or group
if type( t ) == 'table' then
t = t[ 1 ]
end
return t
end
return group
end
local function getTypeFromTypeAliases( aType )
if not mu.typeAliases then
mu.typeAliases = mu.getAliases( mt.types, 'alias' )
end
return mu.typeAliases[ aType ]
end
local function getGroupFromGroupAliases( group )
if not mu.groupAliases then
mu.groupAliases = mu.getAliases( mg.groups, 'alias' )
end
return mu.groupAliases[ group ]
end
-- getting marker type and group
function mu.checkTypeAndGroup( args )
local s
args.typeTable = {}
args.subtypeTable = {}
-- check group
if mu.isSet( args.group ) then
mu.addMaintenance( 'parameterUsed', 'group' )
s = mg.groups[ args.group ]
if not s then
s = getGroupFromGroupAliases( args.group )
if s then
args.group = s
s = mg.groups[ args.group ]
end
end
if not s then
mu.addMaintenance( 'unknownGroup' )
args.group = ''
elseif s.is and s.is == 'color' and mi.options.useTypeCateg then
mu.addMaintenance( 'group', args.group )
end
end
-- check type
if not mu.isSet( args.type ) then
args.type = mt.types.error.group
mu.addMaintenance( 'missingType' )
elseif args.type == mt.types.error.group then
mu.addMaintenance( 'unknownType', args.type )
end
if args.type == mt.types.error.group then
args.group = mt.types.error.group
else
-- split seperate types and analyse them
for i, t in ipairs( mu.textSplit( args.type, ',' ) ) do
-- try to find the type t in types or groups
t = encodeSpaces( t )
if not mt.types[ t ] then
t = getTypeFromTypeAliases( t ) or getGroupFromGroupAliases( t ) or t
end
s = mg.groups[ t ]
if s then -- type is a group itself
if s.is and s.is == 'color' then
if mi.options.excludeColorTypes then
args.group = mt.types.error.group
mu.addMaintenance( 'unknownType', t )
else
mu.addMaintenance( 'typeIsColor' )
end
elseif not mi.options.noTypeMsgs then
mu.addMaintenance( 'typeIsGroup' )
end
if args.group == '' then
args.group = t
end
else
s = mt.types[ t ]
if s then
if args.group == '' then
args.group = s.group
end
if mu.isSet( s.subtype ) then
table.insert( args.subtypeTable, t )
end
else
args.group = mt.types.error.group
mu.addMaintenance( 'unknownType', t )
end
end
table.insert( args.typeTable, t )
if mi.options.useTypeCateg then
mu.addMaintenance( 'type', t )
end
end
args.type = table.concat( args.typeTable, ',' )
end
args.groupTranslated = translateGroup( args.group )
mu.getColor( args )
end
local function isUrl( url )
uc = uc or require( 'Module:UrlCheck' )
return uc.isUrl( url, mi.options.skipPathCheck )
end
-- url check in args
function mu.checkUrl( args )
if not mu.isSet( args.url ) then
return
end
local c = isUrl( args.url ) -- getting result code
if c > 2 then
mu.addMaintenance( 'wrongUrl' )
args.url = ''
elseif c == 2 then -- URL contains IP address
mu.addMaintenance( 'urlWithIP' )
else
if args.url:find( 'twitter.com', 1, true ) then -- old X url
mu.addMaintenance( 'urlIsSocialMedia' )
args.url = ''
else
for i = 1, #mi.services do
if args.url:find( '[./]' .. mi.services[ i ].key .. '.com' ) then
mu.addMaintenance( 'urlIsSocialMedia' )
args.url = ''
break
end
end
end
end
end
-- type and group functions
-- getting a set of parameters for a given type
function mu.getTypeParams( aType )
return mt.types[ aType ]
end
function mu.idToType( id )
if not mu.typeIds then
mu.typeIds = mu.getAliases( mt.types, 'wd' ) -- Q id to type table
end
return mu.typeIds[ id ]
end
function mu.getTypeLabel( id )
if not mu.isSet( id ) then
return ''
end
if id:match( '^Q%d+$' ) then
id = mu.idToType( id )
if not id then
return ''
end
else
id = encodeSpaces( id )
end
local at, t
t = mt.types[ id ]
if not t then
t = getTypeFromTypeAliases( id )
t = t and mt.types[ t ]
end
if t then
t = t.label or id
at = t:find( ',', 1, true )
if at then
t = t:sub( 1, at - 1 )
end
else
t = replaceWithSpace( id, '_' )
end
return t
end
function mu.typeExists( aType )
return mt.types[ aType ] and aType or getTypeFromTypeAliases( aType )
end
-- check if the specified group can have events
function mu.groupWithEvents( group )
return mg.groups[ group ] and mg.groups[ group ].withEvents
end
-- see: https://www.w3.org/TR/WCAG20/#relativeluminancedef
local function hexToLinear( hex )
hex = tonumber( hex, 16 ) / 255.0
if hex <= 0.03928 then
return hex / 12.92
else
return ( ( hex + 0.055 ) / 1.055 ) ^ 2.4
end
end
-- relative luminance of a color
-- 6 digit hex color
local function hexToLuminance( color )
local r = hexToLinear( color:sub( 1, 2 ) )
local g = hexToLinear( color:sub( 3, 4 ) )
local b = hexToLinear( color:sub( 5, 6 ) )
return 0.2126 * r + 0.7152 * g + 0.0722 * b
end
local function isInverse( backgroundColor )
-- the luminance threshold should be greater than 0.2848 (i.e. magenta,
-- error, #FF00FF) and smaller than 0.4
-- the value chosen of 0.386 corresponds to a light magenta (#FF69FF) which
-- seems to be used for Wikimedia's map server
-- see: https://github.com/wikimedia/makizushi/blob/master/lib/color.js
local luminanceThreshold = 0.386
backgroundColor = backgroundColor:sub( 2 ) -- remove #
:gsub( '^(%x)(%x)(%x)$', '%1%1%2%2%3%3' )
return hexToLuminance( backgroundColor ) > luminanceThreshold
end
-- getting color from group in args
function mu.getColor( args )
local c = mg.groups[ args.group ] or mg.groups[ 'error' ]
args.color = c.color
args.inverse = isInverse( c.color )
end
-- Splitting comma separated lists to a table of key items
-- checking items with allowed key values of validValues table
local function splitAndCheck( s, validValues )
local values = {}
if not validValues then
return values, ''
end
local errors = {}
for item, v in pairs( mu.split( s ) ) do
-- value check
if validValues[ item ] then
values[ item ] = 1
else
table.insert( errors, item )
end
end
return values, table.concat( errors, mu.commaSeparator )
end
local function setCopyMarker( args, show )
if show.copy and ( mu.isSet( args.copyMarker ) or not mu.isSet( args.wikidata ) ) then
show.copy = nil
mu.addMaintenance( 'deleteShowCopy' )
end
if show.copy then
args.copyMarker = args.wikidata
end
if mu.isSet( args.copyMarker ) then
show.symbol = nil
end
end
-- treatment of social media services if Wikidata is available
local function setSocialMedia( args, value )
for i, service in ipairs( mi.services ) do
args[ service.key ] = value
end
end
function mu.getShow( default, args, validValues )
local show = mu.split( default )
local add, err = splitAndCheck( args.show, validValues )
if err ~= '' then
mu.addMaintenance( 'unknownShow', err )
end
-- maintenance
if add.inline then
show.inlineSelected = true
mu.addMaintenance( 'showInlineUsed' )
end
if add.poi then
mu.addMaintenance( 'showPoiUsed' ) -- is default
end
-- overwriting defaults
if add.none or add.coord or add.poi or add.all then
show.all, show.coord, show.poi = nil, nil, nil
end
-- merge show with add values
for key, value in pairs( add ) do
show[ key ] = value
end
if show.none then
show.none, show.all, show.coord, show.poi = nil, nil, nil, nil
end
if show.all then
show.all = nil
show.coord, show.poi = 1, 1
end
if show.noname then
show.noname, show.name = nil, nil
else
show.name = 1
end
setCopyMarker( args, show )
if args.wikidata ~= '' then
if show.socialmedia then
setSocialMedia( args, 'y' )
elseif show.nosocialmedia then
setSocialMedia( args, 'n' )
end
end
if not show.nosocialmedia then
show.socialmedia = 1
end
return show
end
-- removing line breaks and controls from parameter strings
function mu.removeCtrls( s, onlyInline )
local descrDiv = false -- div tag instead of span tag for description needed?
-- remove controls from tags
s = s:gsub( '(<[^>]+>)', function( t )
return replaceWithSpace( t, '[%z\1-\31]' )
end )
local t = removeChars( s, '[%z\1-\8\11\12\14-\31]' ) -- ctrl chars
t = replaceWithSpace( t, '[\9]' ) -- horizontal tab
t = replaceWithSpace( t, '</br%s*>' )
if onlyInline then
t = replaceWithSpace( t, '<br[^/>]*/*>' ) -- no line breaks
t = replaceWithSpace( t, '</*p[^/>]*/*>' ) -- no paragraphs
t = replaceWithSpace( t, '</*div[^/>]*/*>' ) -- no divs
t = mw.text.trim( replaceWithSpace( t, '[\10\13]' ) ) -- no line breaks
-- not %c because \127 is used for Mediawiki tags (strip markers `UNIQ)
else
descrDiv = t:find( '[\10\13]' ) or t:find( '<br[^/>]*/*>' ) or
t:find( '<p[^/>]*>' ) or t:find( '<div[^/>]*>' )
end
-- remove LTR and RTL marks
t = mw.ustring.gsub( t, '[]+', '' )
if descrDiv then
-- unify line breaks to Linux mode
t = t:gsub( '\13\10', '\10' ):gsub( '\13', '\10' )
-- replace line breaks by <br> in block mode
t = t:gsub( '([^>%]\10])\10+([^<%[\10])', '%1<br class="voy-listing-next-paragraph" />%2' )
end
return replaceWithSpace( t, '%s%s+' ), descrDiv
end
-- fetch data from Wikidata
function mu.getCoordinatesFromWikidata( args, fromWikidata, entity )
if not entity or ( args.lat ~= '' and args.long ~= '' ) then
return
end
-- center coordinates from Wikidata
local c = wu.getValue( entity, mi.properties.centerCoordinates )
if c == '' then
-- coordinates from Wikidata
c = wu.getValue( entity, mi.properties.coordinates )
end
-- search for headquarters location
if c == '' then
local tab = wu.getValuesWithQualifiers( entity, mi.properties.headquartersLoc,
nil, mi.properties.coordinates )
if #tab > 0 then
tab = tab[ 1 ][ mi.properties.coordinates ]
if tab and #tab > 0 then
c = tab[ 1 ]
mu.addMaintenance( 'headquarters' )
args.coordFrom = 'headquarters'
end
end
end
if c ~= '' then
args.lat, args.long = c.latitude, c.longitude
fromWikidata.lat = true
end
end
local function typeSearch( p31 )
-- p31: array of Wikidata values
if not p31 or #p31 == 0 then
return ''
end
local firstStep = true
local function compareLabels( ar )
if not ar then
return nil
elseif type( ar ) == 'string' then
ar = { ar }
end
for i, value in ipairs( ar ) do
if mu.isSet( value ) then
value = ( encodeSpaces( value ) )
if mt.types[ value ] then
return value
end
end
end
return nil
end
local function compareIds( ar )
local id, t
for i = 1, #ar do
id = ar[ i ].id
-- md: indexed array of q id - types relations
t = mu.idToType( id )
if t then
return t
end
-- checking English label and aliases
t = compareLabels( mw.wikibase.getLabelByLang( id, 'en' ) )
or compareLabels( wu.getAliases( id, 'en' ) )
if t then
if firstStep and not mi.options.noTypeMsgs then
firstStep = false
mu.addMaintenance( 'typeFromWDchain' )
end
return t
end
end
return nil
end
local aType = compareIds( p31 ) -- check p31 ids first, maybe step 2 is not nessary
if aType then
return aType
end
-- now functions becomes expensive because of multiple wu.getValues calls
local id, ids
firstStep = false
for i = 1, #p31 do -- step 2: analyse P279 chains of first ids
id = p31[ i ].id -- start id
local j = 0
repeat
ids = wu.getValues( id, mi.properties.subclassOf, nil )
if #ids > 0 then
aType = compareIds( ids )
if aType then
if not mi.options.noTypeMsgs then
mu.addMaintenance( 'typeFromWDchain' )
end
return aType
end
id = ids[ 1 ].id
end
j = j + 1
-- limit: maximum levels to analyse
until j >= mi.options.searchLimit or #ids == 0
end
return ''
end
function mu.getTypeFromWikidata( args, entity )
if mu.isSet( args.type ) then
return
end
local p31 = wu.getValues( entity, mi.properties.instanceOf )
if #p31 == 0 then
p31 = wu.getValues( entity, mi.properties.subclassOf )
end
args.type = typeSearch( p31 )
end
function mu.getCommonsCategory( args, entity )
-- getting commonscat from commonswiki sitelink before P373
-- because sitelink is checked by Wikidata
if type( args.commonscat ) == 'boolean' then
args.commonscat = ''
end
local t = wu.getSitelink( entity, 'commonswiki' ) or ''
if t:match( '^Category:.+$' ) then
t = t:gsub( '^[Cc]ategory:', '' )
else
t = wu.getValue( entity, mi.properties.commonsCategory )
if t == '' then
local id = wu.getId( entity, mi.properties.mainCategory )
if id ~= '' then
t = wu.getSitelink( id, 'commonswiki' ) or ''
t = t:gsub( '^[Cc]ategory:', '' )
end
end
end
if t ~= '' and args.commonscat ~= '' then
mu.addMaintenance( 'commonscatWD' )
end
if args.commonscat == '' then
args.commonscat = t
end
end
function mu.getLangTable( wikiLang, localLang )
local langs = { wikiLang }
for i, lang in ipairs( mi.langs ) do
table.insert( langs, lang )
end
if mu.isSet( localLang ) and localLang ~= wikiLang then
table.insert( langs, localLang )
end
return langs
end
-- getting names from Wikidata
function mu.getNamesFromWikidata( args, fromWikidata, page, country, entity )
-- getting official names
local officialNames =
wu.getMonolingualValues( entity, mi.properties.officialName )
if type( args.name ) == 'boolean' or args.name == '' then
args.name = ''
local langs = mu.getLangTable( page.lang )
for i, lang in ipairs( langs ) do
args.name = officialNames[ lang ]
if args.name then
break
end
end
-- if failed then get labels
if not mu.isSet( args.name ) then
for i, lang in ipairs( langs ) do
args.name = wu.getLabel( entity, lang, true ) -- no fallback
if args.name then
break
end
end
args.name = args.name or ''
end
if args.name ~= '' then
mu.addMaintenance( 'nameFromWD' )
fromWikidata.name = true
end
end
-- get local name if no name is available
if args.name == '' and
not ( type( args.nameLocal ) == 'string' and args.nameLocal ~= '' ) then
args.nameLocal = true
-- no local name if country and wiki language are identical
elseif args.nameLocal == true and page.lang == country.lang then
args.nameLocal = ''
end
if type( args.nameLocal ) == 'string' and args.nameLocal ~= '' then
-- keeping local name in any case for html data
args.addNameLocal = args.nameLocal
return
end
local nameLocal = officialNames[ country.lang ] or ''
if nameLocal == '' then
nameLocal = wu.getLabel( entity, country.lang, true ) or ''
end
if args.nameLocal == true then
args.nameLocal = nameLocal
if args.name == '' and args.nameLocal ~= '' then
args.name = args.nameLocal
args.nameLocal = ''
mu.addMaintenance( 'nameFromWD' )
fromWikidata.name = true
end
if args.name:ulower() == args.nameLocal:ulower() then
args.nameLocal = ''
end
fromWikidata.nameLocal = args.nameLocal ~= ''
elseif page.lang ~= country.lang and args.name ~= nameLocal then
args.addNameLocal = nameLocal
end
end
-- getting link to Wikivoyage
function mu.getArticleLink( args, entity, page )
local title, isRedirect =
wu.getCheckedSitelink( entity, page.lang .. page.globalProject )
if title and title ~= page.text then
args.wikiPage = title
if isRedirect == true then
args.linkIsRedirect = true
end
end
end
-- marker functions
-- returns a single data set from Module:Marker utilities/Maki icons
local function getMaki( key )
mm = mm or require( 'Module:Marker utilities/Maki icons' )
key = key:lower():gsub( '[_%s]+', '-' )
return mm.icons[ key ]
end
local function getMakiIconId( key )
if not mu.isSet( key ) then
return nil
end
key = key:lower():gsub( '[_%s]+', '-' )
if getMaki( key ) then
return key
end
key = mt.types[ key ] and mt.types[ key ].icon
if key and getMaki( key ) then
return key
end
return nil
end
local function addIconToMarker( args )
args.text = ( '[[File:Maki7-%s.svg|x14px|link=|class=noviewer]]' ):format( args.symbol )
args.isIcon = true
end
-- distinguishing marker symbols, default: number
local function makeMarkerProperties( args, show )
args.symbol = args.symbol or ''
local noSymbol = args.symbol == ''
if args.symbol == '' and show.poi and show.symbol then
args.symbol = getMakiIconId( args.typeTable[ 1 ] ) or ''
end
local isIcon = getMaki( args.symbol )
if args.symbol == '' or args.symbol == 'number' then
args.symbol = '-number-' .. args.group
elseif args.symbol == 'letter' then
args.symbol = '-letter-' .. args.group
elseif args.symbol:len() == 1 and args.symbol:match( '%w' ) then
args.text = args.symbol:upper()
mu.addMaintenance( 'numberUsed' )
elseif args.symbol ~= '' and args.text == '' and isIcon then
addIconToMarker( args )
elseif args.symbol ~= '' and not isIcon then
args.text = mi.texts.closeX
args.isIcon = true
args.group = 'error'
mu.getColor( args )
mu.addMaintenance( noSymbol and 'unknownMAKI' or 'unknownIcon' )
end
end
-- making marker symbol
function mu.makeMarkerSymbol( args, show, frame )
local title = args.givenName.all
local extraClasses = args.group == 'error' and ' voy-listing-map-is-error' or ''
if mu.isSet( args.copyMarker ) then
local copyClass = 'voy-listing-map voy-copy-marker plainlinks printNoLink' ..
extraClasses
return tostring( mw.html.create( 'span' )
:addClass( copyClass )
:css( colorAdjust )
-- display will be replaced by [[MediaWiki:Gadget-GeneralChanges.js]] script
:css( { display = 'none' } )
:attr( { ['data-copy-marker-attribute'] = args.copyMarker:match( 'Q%d+' )
and 'data-wikidata' or 'data-name', title = mi.texts.tooltip,
['data-copy-marker-content'] = args.copyMarker } )
)
end
makeMarkerProperties( args, show )
if args.isIcon then
extraClasses = extraClasses .. ' voy-listing-map-is-symbol' ..
-- set image color to white
( args.inverse and '' or ' voy-listing-map-inverse-img' )
end
local lon = tonumber( args.long )
local lat = tonumber( args.lat )
local tagArgs = {
zoom = tonumber( args.zoom ),
latitude = lat,
longitude = lon,
show = mg.showAll,
}
if mu.isSet( args.text ) then
tagArgs.text = args.text
tagArgs.class = 'no-icon'
end
if mu.isSet( args.mapGroup ) then
tagArgs.group, tagArgs.show = args.mapGroup, args.mapGroup
else
tagArgs.group = args.groupTranslated
end
if mu.isSet( args.image ) then
tagArgs.description = '[[File:' .. args.image .. '|100x100px|' .. title .. ']]'
end
local geoJson = {
type = 'Feature',
geometry = {
type = 'Point',
coordinates = { lon, lat }
},
properties = {
title = title,
description = tagArgs.description,
['marker-symbol'] = args.symbol,
['marker-color'] = args.color,
['marker-size'] = 'medium',
}
}
return tostring( mw.html.create( 'span' )
:addClass( 'voy-listing-map plainlinks printNoLink' .. extraClasses )
:attr( 'title', mi.texts.tooltip )
:css( colorAdjust )
-- color for print mode
:css( { ['background-color'] = args.color, color = args.inverse and '#000' or '#fff' } )
-- frame:extensionTag is expensive
:wikitext( frame:extensionTag( 'maplink', mw.text.jsonEncode( geoJson ), tagArgs ) )
)
end
-- icon functions
function mu.makeStatusIcons( args )
local result = ''
for i, v in ipairs( args.statusTable ) do
result = result .. mu.makeSpan( ' ', 'voy-listing-status voy-listing-status-' .. v,
false, { title = mi.statuses[ v ].label }, colorAdjust )
if mi.statuses[ v ].category then
result = result .. ( '[[Category:%s]]' ):format( mi.statuses[ v ].label )
end
end
return result
end
function mu.addLinkIcon( classes, link, title, text, mainClass )
local span = mu.makeSpan( ' ', nil, false, { title = title, ['data-icon'] = text },
colorAdjust ) -- space to keep the span tag
local lFormat = ( link:find( '^https?://' ) or link:find( '^//' ) )
and '[%s %s]' or '[[%s|%s]]'
local iconLink = mw.ustring.format( lFormat, link, span )
-- add leading space for wikidata icon which is necessary if visible
if text == 'wikidata' then
iconLink = mu.makeSpan( ' ', 'voy-listing-icon-with-space', true ) .. iconLink
end
mainClass = mainClass or 'voy-listing-icon'
return mu.makeSpan( iconLink, mainClass .. ' ' .. classes )
end
-- adding linked sister icons
local function addSisterIcons( icons, sisters, name, id )
local icon
for i, key in ipairs( { 'wikivoyage', 'wikipedia', 'commons', 'maps', 'wikidata' } ) do
if mu.isSet( sisters[ key ] ) then
icon = mu.addLinkIcon( 'voy-listing-sister-' .. key, sisters[ key ],
mw.ustring.format( mi.iconTitles[ key ], name, id ), key )
table.insert( icons, icon )
end
end
-- return true if only Wikidata icon
return mu.isSet( sisters.wikidata ) and #icons == 1
end
-- getting sister project links
local function getWikiLink( langArray, wiki, entity, wikilang )
local prefix = wiki == 'wiki' and 'w:' or 'voy:'
local link
for i, lang in ipairs( langArray ) do
if lang ~= '' then
link = wu.getFilteredSitelink( entity, lang .. wiki )
if link then
prefix = prefix .. ( lang ~= wikilang and ( lang .. ':' ) or '' )
return prefix .. link
end
end
end
return ''
end
-- adding Wikimedia sister project icons
local function makeSisterIcons( icons, args, page, country, entity )
local sisters = {
commons = '', -- link to Commons category
maps = '', -- link to Map Sources
wikidata = '', -- link to Wikidata
wikipedia = '', -- link to Wikipedia
wikivoyage = '', -- link to another branch, usually en, as a sister link
}
if mu.isSet( args.wikipedia ) then
sisters.wikipedia = 'w:' .. args.wikipedia
end
if mu.isSet( args.wikidata ) then
local langs = mu.getLangTable( page.lang, country.lang )
if sisters.wikipedia == '' then
sisters.wikipedia = getWikiLink( langs, 'wiki', entity, page.lang )
end
if args.wikiPage == '' then
table.remove( langs, 1 ) -- exclude page.lang
sisters.wikivoyage = getWikiLink( langs, page.globalProject, entity, page.lang )
if sisters.wikivoyage ~= '' then
mu.addMaintenance( 'linkToOtherWV' )
end
end
sisters.wikidata = 'd:' .. args.wikidata
end
if args.commonscat ~= '' then
sisters.commons = 'c:Category:' .. args.commonscat
end
if args.lat ~= '' and args.long ~= '' then
sisters.maps = mw.ustring.format( mi.map.coordURLformat, page.lang, args.latMs,
args.longMs, mw.uri.encode( country.extra ), mw.uri.encode( args.givenName.name ) )
end
return addSisterIcons( icons, sisters, args.givenName.name, args.wikidata )
end
-- creating social media icons including value check
local function makeSocial( icons, args, fromWikidata, name )
local domain, span, t, which
for i, service in ipairs( mi.services ) do
-- check values first
t = args[ service.key ] or ''
domain = type( service.url ) == 'string' and service.url or service.url[ 1 ]
domain = domain:gsub( 'com/.*', 'com/' )
if t ~= '' then
if t:match( '^http' ) then
if not t:find( 'https', 1, true ) then
t = t:gsub( '^http', 'https' )
mu.addMaintenance( 'wrongSocialUrl', service.key )
end
if isUrl( t ) > 1 or
not t:match( '^' .. domain .. '.+$' ) then
t = ''
mu.addMaintenance( 'wrongSocialUrl', service.key )
end
if t ~= '' and not fromWikidata[ service.key ] then
mu.addMaintenance( 'socialUrlUsed', service.key )
end
else
local match = false
local sp = service.pattern
if type( sp ) == 'string' then
sp = { sp }
end
for j = 1, #sp do
if mw.ustring.match( t, sp[ j ] ) then
match = true
which = j
break
end
end
if not match then
t = ''
mu.addMaintenance( 'wrongSocialId', service.key )
end
end
end
args[ service.key ] = t
-- create symbol link
if t ~= '' then
if not t:find( domain, 1, true ) then
-- multiple service urls
local formatStr = type( service.url ) == 'string' and service.url or
service.url[ which ]
t = mw.ustring.format( formatStr, t )
end
span = mu.addLinkIcon( 'voy-listing-social-media-' ..
service.key .. mu.addWdClass( fromWikidata[ service.key ] ), t,
mw.ustring.format( mi.iconTitles[ service.key ], name ), service.key,
'voy-listing-social-media' )
table.insert( icons, span )
end
end
end
function mu.makeIcons( args, page, country, entity, show, fromWikidata )
local icons = {}
if mi.options.showSisters and not show.nositelinks then
makeSisterIcons( icons, args, page, country, entity )
end
if show.socialmedia then
makeSocial( icons, args, fromWikidata, args.givenName.name )
end
return table.concat( icons, '' )
end
-- output functions
local function removeStars( args )
for i, param in ipairs( mi.options.noStarParams ) do
if mu.isSet( args[ param ] ) and args[ param ]:find( '*', 1, true ) then
args[ param ] = args[ param ]:gsub( '%*+', '' )
args[ param ] = mw.text.trim( args[ param ] )
mu.addMaintenance( 'nameWithStar' )
end
end
end
local function makeAnchorId( name )
if name and not name:match( '^Q%d+$' ) then
name = mw.uri.anchorEncode( name )
end
return mw.ustring.format( mi.texts.anchor, name )
end
-- getting name table with linked and unlinked names
local function getName( name, pageTitle )
local r = {
all = '', -- name or linked name
name = '', -- only name
pageTitle = '', -- if pageTitle ~= '' name is already linked
}
if type( name ) ~= 'string' or name == '' then
return r
end
local s
local t, c = mw.ustring.gsub( name, '^(.*)%[%[(.*)%]%](.*)$', '%2' )
if c > 0 then -- is / contains [[...]]
t = mw.text.trim( t )
r.all = '[[' .. t .. ']]'
s, c = mw.ustring.gsub( t, '^(.*)|(.*)$', '%2' )
if c > 0 then -- is [[...|...]]
r.name = mw.text.trim( s )
r.pageTitle = mw.ustring.gsub( t, '^(.*)|(.*)$', '%1' )
r.pageTitle = mw.text.trim( r.pageTitle )
else
r.name = t
r.pageTitle = t
end
else
r.name = name
r.all = name
if mu.isSet( pageTitle ) then
r.pageTitle = pageTitle
r.all = '[[' .. pageTitle .. '|' .. name .. ']]'
r.fromWD = true
end
end
removeStars( r, { 'name', 'all' } )
return r
end
-- create givenName, displayName tables
function mu.prepareNames( args )
local function simplifyString( s, length )
s = mw.ustring.sub( s, 1, length )
s = mw.ustring.gsub( s, "[%.'" .. '"“”„‟«»‘’‚‛‹›]', '' )
s = mw.ustring.gsub( s, '[-‐‑‒–—―]', ' ' )
return s:ulower():gsub( '%s%s+', ' ' )
end
local function removeDuplicate( value1, key2 )
if not mu.isSet( value1 ) or not mu.isSet( args[ key2 ] ) then
return
end
local minLen = math.min( mw.ustring.len( value1 ), mw.ustring.len( args[ key2 ] ) )
if simplifyString( value1, minLen ) == simplifyString( args[ key2 ], minLen ) then
args[ key2 ] = ''
end
end
-- use local name if name is not given
if args.name == '' and args.nameLocal ~= '' then
args.name = args.nameLocal
args.nameLocal = ''
end
if args.name == args.nameMap then
args.nameMap = ''
end
-- missing name
if args.name == '' then
args.name = mi.texts.missingName
mu.addMaintenance( 'missingNameMsg' )
end
-- names shall not contain tags or template calls
if args.name:find( '<', 1, true ) or args.name:find( '{{', 1, true ) or
args.nameMap:find( '<', 1, true ) or args.nameMap:find( '{{', 1, true ) or
args.nameLocal:find( '<', 1, true ) or args.nameLocal:find( '{{', 1, true ) then
mu.addMaintenance( 'malformedName' )
end
removeStars( args )
-- handling linked names like [[article|text]]
args.displayName = getName( args.name, args.wikiPage )
if mu.isSet( args.nameMap ) then
args.givenName = getName( args.nameMap, args.wikiPage )
else
-- real copy
args.givenName = {}
args.givenName.all = args.displayName.all
args.givenName.name = args.displayName.name
args.givenName.pageTitle = args.displayName.pageTitle
end
-- reset args.linkIsRedirect if Wikidata link is not used
-- args.linkIsRedirect is set by mu.getArticleLink()
if not args.displayName.fromWD then
args.linkIsRedirect = nil
end
-- remove identical names
removeDuplicate( args.givenName.name, 'nameLocal' )
removeDuplicate( args.givenName.name, 'alt' )
removeDuplicate( args.givenName.name, 'comment' )
removeDuplicate( args.nameLocal, 'alt' )
removeDuplicate( args.alt, 'comment' )
removeDuplicate( args.directions, 'directionsLocal' )
removeDuplicate( args.address, 'addressLocal' )
end
function mu.prepareCoordinates( args )
args.latDMS, args.latMs = cd.getDMSString( args.lat, 4, 'lat', '', '', mi.map.defaultDmsFormat )
args.longDMS, args.longMs = cd.getDMSString( args.long, 4, 'long', '', '', mi.map.defaultDmsFormat )
end
local function _makeAirport( code, args )
local span = mu.makeSpan( args[ code ],
'voy-listing-' .. code .. '-code' .. mu.addWdClass( true ) )
return mu.makeSpan( mw.ustring.format( mi.texts[ code ], span ),
'voy-listing-airport voy-listing-' .. code )
end
local function makeAirport( args, show )
if show.noairport then
return ''
else
local t = args.type:gsub( ',.*$', '' ) -- only first type
if mt.types[ t ] and not mt.types[ t ].useIATA then
return ''
end
end
if mu.isSet( args.iata ) then
return _makeAirport( 'iata', args )
elseif mu.isSet( args.icao ) then
return _makeAirport( 'icao', args )
else
return ''
end
end
-- creating a list of nick names etc.
local function makeNameAffix( args, page, country, addClass, show )
local result = {}
if mi.options.showLocalData then
if mu.isSet( args.nameLocal ) then
table.insert( result,
mu.languageSpan( args.nameLocal, mi.texts.hintName, page, country,
'voy-listing-name-local' .. addClass ) )
end
if mu.isSet( args.nameLatin ) then
table.insert( result, mu.makeSpan( args.nameLatin,
'voy-listing-name-latin', false, { title = mi.texts.hintLatin,
lang = mu.isSet( country.lang ) and ( country.lang .. '-Latn' ) or nil } ) )
end
end
for i, key in ipairs( { 'alt', 'comment' } ) do
if mu.isSet( args[ key ] ) then
table.insert( result, mu.makeSpan( args[ key ], 'voy-listing-' .. key ) )
end
end
mu.tableInsert( result, makeAirport( args, show ) )
if #result == 0 then
return ''
end
return mu.makeSpan( mu.parentheses( table.concat( result, mu.comma ) ),
'voy-listing-add-names p-nickname nickname' )
end
-- replace brackets in names
local function replaceBrackets( s )
s = s:gsub( '%[', '[' ):gsub( '%]', ']' )
return s
end
-- creating (linked) name and its affix
function mu.makeName( result, args, show, page, country, nameClass, localClass )
local s
local r = {}
nameClass = nameClass ..
( args.displayName.fromWD and ' voy-listing-link-from-wd' or '' )
-- clear redirect wiki link if required
if args.linkIsRedirect and not show.wikilink then
args.displayName.pageTitle = ''
args.displayName.all = args.displayName.name
args.linkIsRedirect = nil
nameClass = nameClass .. ' voy-listing-unused-redirect'
mu.addMaintenance( 'unusedRedirect' )
end
if args.linkIsRedirect then
nameClass = nameClass .. ' mw-redirect voy-listing-link-is-redirect'
mu.addMaintenance( 'linkIsRedirect' )
end
if mu.isSet( args.url ) and args.displayName.pageTitle == '' then
s = '[' .. args.url .. ' '
.. replaceBrackets( args.displayName.name ) .. ']'
else
s = args.displayName.all
end
if mu.isSet( args.nameExtra ) then
s = s .. ' ' .. args.nameExtra
end
-- insert name
if s ~= '' then
local attr = { style = args.styles }
s = mu.makeSpan( s, 'voy-listing-name p-name fn org' .. nameClass ..
( args.styleClass and args.styleClass or '' ), true, attr )
if mu.isSet( args.metadata ) then
s = s .. args.metadata
end
table.insert( r, s )
end
-- insert separate url icon
if mu.isSet( args.url ) and args.displayName.pageTitle ~= '' then
-- both article and web links
table.insert( r, mu.addLinkIcon( 'voy-listing-url', args.url,
mi.iconTitles.internet, 'internet' ) )
end
-- insert name affix
mu.tableInsert( r, makeNameAffix( args, page, country, localClass, show ) )
if #r > 0 then
table.insert( result, table.concat( r, mi.texts.space ) )
end
end
function mu.parentheses( s, trim )
if not mu.isSet( s ) then
return ''
end
local formatter = mi.texts.parentheses
if trim then
formatter = mw.text.trim( formatter )
end
return mw.ustring.format( formatter, s )
end
-- getting DMS coordinates
function mu.dmsCoordinates( args, page, country, fromWD, noBrackets )
local function coordSpan( title, text )
return mu.makeSpan( text, 'coordStyle', false, { title = title } )
end
local r = '[' .. mw.ustring.format( mi.map.coordURLformat, page.lang, args.latMs, args.longMs,
mw.uri.encode( country.extra ), mw.uri.encode( args.givenName.name ) ) ..
' ' .. coordSpan( mi.texts.latitude, args.latDMS ) ..
' ' .. coordSpan( mi.texts.longitude, args.longDMS ) .. ']'
r = noBrackets and r or mu.parentheses( r )
return mu.makeSpan( r, 'voy-listing-dms-coordinates printNoLink plainlinks'
.. mu.addWdClass( fromWD ) )
end
-- prepare value s for data attribute and replace all entities by characters
local function data( s )
return mu.isSet( s ) and mw.text.decode( s, true ) or nil
end
-- adding wrapper and microformats
function mu.makeWrapper( result, args, page, country, show, list, frame )
if not mu.isSet( args.nameLocal ) and mu.isSet( args.addNameLocal ) then
args.nameLocal = args.addNameLocal
end
if not mu.isSet( args.addressLocal ) and mu.isSet( args.addAddressLocal ) then
args.addressLocal = args.addAddressLocal
end
local wrapper = mw.html.create( show.inline and 'span' or 'div' )
:addClass( string.format( 'voy-%s vcard h-card', args.template ) )
if args.noGpx then
wrapper:addClass( 'voy-listing-no-gpx' )
end
if show.outdent and not show.inline then
wrapper:addClass( 'voy-listing-outdent' )
end
if show.inlineSelected or args.template == 'Marker' then
wrapper:addClass( 'voy-listing-inline' )
end
if mu.isSet( args.copyMarker ) or not show.poi then
wrapper:addClass( 'voy-without-marker' )
end
if #args.statusTable > 0 then
wrapper:addClass( 'voy-listing-with-status' )
end
if args.givenName.name ~= mi.texts.missingName then
wrapper:attr( 'data-name', data( args.givenName.name ) )
end
if not ( mu.isSet( args.copyMarker ) and args.copyMarker == args.wikidata ) then
local id = mu.isSet( args.wikidata ) and args.wikidata or args.id
if mu.isSet( id ) then
wrapper:attr( 'id', makeAnchorId( id ) )
end
end
local editClass = 'voy-listing-edit'
if mu.isSet( args.sectionFrom ) then
args.sectionFrom = replaceWithSpace( args.sectionFrom, '[_]+' )
if args.sectionFrom ~= page.text then
editClass = 'voy-listing-no-edit'
end
end
wrapper:addClass( editClass )
wrapper:attr( 'data-location', data( page.subpageText ) )
:attr( 'data-location-qid', page.entityId )
:attr( 'data-country', data( country.iso_3166 ) )
:attr( 'data-lang', data( country.lang ) )
:attr( 'data-country-calling-code', data( country.cc ) )
:attr( 'data-trunk-prefix', data( country.trunkPrefix ) )
:attr( 'data-currency', data( country.addCurrency ) )
:attr( 'data-coord-from', args.coordFrom )
local arg
for key, value in pairs( list ) do
if mu.isSet( args[ key ] ) then
arg = args[ key ]:gsub( '<[^<>]*>', '' ) -- remove html tags
wrapper:attr( value, data( arg ) )
end
end
if not show.name then
wrapper:node( mw.html.create( 'span' )
:addClass( 'voy-listing-name p-name fn org' )
:css( 'display', 'none' )
:wikitext( args.givenName.name )
)
end
wrapper:wikitext( result )
if not show.noCoord then
wrapper:node( mw.html.create( 'span' )
:addClass( 'voy-listing-coordinates p-geo geo' )
:css( 'display', 'none' )
:node( mw.html.create( 'span' )
:addClass( 'p-latitude latitude' )
:wikitext( args.lat )
)
:node( mw.html.create( 'span' )
:addClass( 'p-longitude longitude' )
:wikitext( args.long )
)
)
end
wrapper = tostring( wrapper )
-- adding coordinates to Mediawiki database
-- frame:callParserFunction is expensive
if not show.noCoord and mi.options.secondaryCoords then
wrapper = wrapper .. frame:callParserFunction{ name = '#coordinates',
args = { args.lat, args.long, country.extra, name = args.givenName.name } }
end
return wrapper
end
function mu.getPageData()
local page = mw.title.getCurrentTitle()
page.langObj = mw.getContentLanguage()
page.lang = page.langObj:getCode()
page.langName = mw.language.fetchLanguageName( page.lang, page.lang )
page.isRTL = page.langObj:isRTL()
page.entityId = mw.wikibase.getEntityIdForCurrentPage() -- can be nil
page.siteName = mw.site.siteName
page.globalProject = page.siteName:lower()
if page.globalProject == 'wikipedia' then
page.globalProject = 'wiki'
end
return page
end
return mu
r3cr0n62or25kcys2zob2ky5y2vc2wz
Modulo:Failsafe
828
4810
72496
65340
2026-05-28T06:35:28Z
RolandUnger
168
Update
72496
Scribunto
text/plain
-- module interface
local Failsafe = {
suite = 'Failsafe',
serial = '2026-05-17',
item = 65306115
}
local strings = {
docPage = 'dokumentado',
ok = '[[File:Artículo bueno.svg|16px|text-bottom|Ok!]]',
notOk = '[[File:Symbol oppose vote.svg|15px|text-bottom|Contra]][[Category:Malsama modula versio en Vikidatumoj]]',
versionText = 'Versionomo en Vikidatumoj:',
noVersion = 'neniu versio disponebla'
}
-- modul variable and administration
local fs = {
moduleInterface = Failsafe
}
-- possible vaules of version
-- nil, false: no version required
-- string: string of version required
-- table: frame table (template, #invoke)
-- aModuleInterface
-- table
function fs._failsafe( version, aModuleInterface )
if type( aModuleInterface ) ~= 'table' then
return false
end
local i, s, v
-- check if version is a frame table
if type( version ) == 'table' and type( version.args ) == 'table' then
s = version.args[ 1 ]
if not s and type( version.getParent ) == 'function' then
i = version:getParent()
if i then
s = i.args[ 1 ]
end
end
version = s
end
-- version should be a string
if type( version ) == 'string' then
-- check if empty string
version = mw.text.trim( version )
if version == '' then
version = nil
end
else
version = nil
end
-- getting version from Wikidata
if version == 'wikidata' then
version = nil
i = aModuleInterface.item
if type( i ) == 'number' and i > 0 then
s = mw.wikibase.getBestStatements( 'Q' .. i, 'P348' )
for j = 1, #s, 1 do
if s[ j ].mainsnak.snaktype == 'value' then
v = s[ j ].mainsnak.datavalue.value
if v ~= '' then
return v:gsub( '%.', '-' )
end
end
end
end
end
if not aModuleInterface.serial then
return false
elseif not version or version <= aModuleInterface.serial then
return aModuleInterface.serial
else
return false
end
end
local function getModule( title )
return require( 'Module:' .. title )
end
function fs.getModuleVersion()
local result = strings.versionText .. ' ' .. strings.noVersion
local fromModule, fromWikidata, m, success
local title = mw.ustring.gsub( mw.title.getCurrentTitle().text, '/' .. strings.docPage, '' )
if title == 'Failsafe' then -- the module itself
success = true
m = fs
else
success, m = pcall( getModule, title )
end
if success then
if m.moduleInterface then
fromModule = m.moduleInterface.serial
fromWikidata = fs._failsafe( 'wikidata', m.moduleInterface )
end
if fromWikidata or fromModule then
result = strings.versionText .. ' <code>'
.. ( fromWikidata or fromModule ) .. '</code>'
if fromWikidata and fromModule then
result = result .. ' ' ..
( fromWikidata == fromModule and strings.ok or strings.notOk )
end
end
end
return result
end
return fs
9cqgxhoy7s0tdt1wo1mb2x5b0jvqpbv
Modulo:Coordinates
828
4811
72506
67033
2026-05-28T06:49:16Z
RolandUnger
168
Update
72506
Scribunto
text/plain
--[[
Coordinate conversion procedures
This module is intended to replace the functionality of MapSources extension
Redesign of my own MapSources_math.php
Designed for use both in modules and for direct invoking
Functions for use in modules:
toDec( coord, aDir, prec )
returns a decimal coordinate from decimal or deg-min-sec-letter strings
getDMSString( coord, prec, aDir, plus, minus, aFormat )
formats a decimal/dms coordinate to a deg-min-sec-letter string
getGeoLink( pattern, lat, long, plusLat, plusLong, minusLat, minusLong, prec, aFormat )
converts a complete dms geographic coordinate without reapplying the toDec function
getDecGeoLink( pattern, lat, long, prec )
converts a complete decimal geographic coordinate without reapplying the toDec function
Invokable functions:
dec2dms( frame )
dms2dec( frame )
geoLink( frame )
Additional functions in Module:GeoData
]]--
-- module import
-- require( 'strict' )
local ci = require( 'Module:Coordinates/i18n' )
-- module variable and administration
local cd = {
moduleInterface = {
suite = 'Coordinates',
serial = '2026-05-27',
item = 7348344
}
}
-- helper function getErrorMsg
-- returns error message by error number which
local function getErrorMsg( which )
if which == 'noError' or which == 0 then
return ci.errorMsg.noError
elseif which > #ci.errorMsg then
return ci.errorMsg.unknown
else
return ci.errorMsg[ which ]
end
end
-- helper function round
-- num: value to round
-- idp: number of digits after the decimal point
local function round( n, idp )
local m = 10^( idp or 0 )
if n >= 0 then
return math.floor( n * m + 0.5 ) / m
else
return math.ceil( n * m - 0.5 ) / m
end
end
-- helper function getPrecision
-- returns integer precision number
-- possible values: numbers, D, DM, DMS
-- default result: 4
local function getPrecision( prec )
local p = tonumber( prec )
if p then
p = round( p, 0 )
if p < -1 then
p = -1
elseif p > 8 then -- maximum 8 decimals
p = 8
end
return p
else
p = prec and prec:upper() or 'DMS'
if p == 'D' then
return 0
elseif p == 'DM' then
return 2
else
return 4 -- DMS = default
end
end
end
-- helper function toDMS
-- splits a decimal coordinate dec to degree, minute and second depending on the
-- precision. prec <= 0 means only degree, prec < 3 degree and minute, and so on
-- returns a result array
local function toDMS( dec, prec )
local result = { dec = 0, deg = 0, min = 0, sec = 0, sign = 1,
NS = 'N', EW = 'E', prec = getPrecision( prec ) }
local p = result.prec
result.dec = round( dec, 8 )
if result.dec < 0 then
result.sign = -1
result.NS = 'S'
result.EW = 'W'
end
local angle = math.abs( round( result.dec, p ) )
result.deg = math.floor( angle )
result.min = ( angle - result.deg ) * 60
if p > 4 then
result.sec = round( ( result.min - math.floor( result.min ) ) * 60, p - 4 )
else
result.sec = round( ( result.min - math.floor( result.min ) ) * 60 )
end
result.min = math.floor( result.min )
if result.sec >= 60 then
result.sec = result.sec - 60
result.min = result.min + 1
end
if p < 3 and result.sec >= 30 then
result.min = result.min + 1
end
if p < 3 then
result.sec = 0
end
if result.min >= 60 then
result.min = result.min - 60
result.deg = result.deg + 1
end
if p < 1 and result.min >= 30 then
result.deg = result.deg + 1
end
if p < 1 then
result.min = 0
end
return result
end
-- toDec converts decimal and hexagesimal DMS formatted coordinates to decimal
-- coordinates
-- input
-- dec: coordinate
-- prec: number of digits after the decimal point
-- aDir: lat/long directions
-- returns a result array
-- output
-- dec: decimal value
-- error: error number
-- parts: number of DMS parts, usually 1 (already decimal) ... 4
function cd.toDec( coord, aDir, prec )
local result = { dec = 0, error = 0, parts = 1 }
local s = mw.text.trim( coord )
if s == '' then
result.error = 1
return result
end
-- pretest if already a decimal
local dir = aDir or ''
local mx = dir == 'lat' and 90 or 180
local r = tonumber( s )
if r then
if r < -mx or r > mx or r <= -180 then
result.error = 5
return result
end
result.dec = round( r, getPrecision ( prec ) )
return result
end
s = mw.ustring.gsub( s, '[‘’′´`]', "'" )
s = s:gsub( "''", '"' )
s = mw.ustring.gsub( s, '[“”″]', '"' )
s = mw.ustring.gsub( s, '[−–—]', '-' )
s = mw.ustring.upper( mw.ustring.gsub( s, '[_/%c%s%z]', ' ' ) )
local mStr = '^[ %.%-°\'"0-9' -- string to match, illegal characters?
for key, value in pairs( ci.inputLetters ) do
mStr = mStr .. key
end
mStr = mStr .. ']+$'
if not mw.ustring.match( s, mStr ) then
result.error = 3
return result
end
s = mw.ustring.gsub( s, '(%u)', ' %1' )
s = mw.ustring.gsub( s, '%s*([°"\'])', '%1 ' )
s = mw.text.split( s, '%s' )
for i = #s, 1, -1 do
if mw.text.trim( s[ i ] ) == '' then
table.remove( s, i )
end
end
result.parts = #s
if #s < 1 or #s > 4 then
result.error = 2
return result
end
local units = { '°', "'", '"', ' ' }
local res = { 0, 0, 0, 1 } -- 1 = positive direction
local v
local l
for i = 1, #s, 1 do
v = mw.ustring.gsub( s[ i ], units[ i ], '' )
if tonumber( v ) then
if i > 3 then -- this position is for direction letter, not for number
result.error = 4
return result
end
v = tonumber( v )
if i == 1 then
if v < -mx or v > mx then
result.error = 5
return result
end
res[ 1 ] = v
elseif i == 2 or i == 3 then
if v < 0 or v >= 60 then
result.error = 2 + 2 * i
return result
end
if res[ i - 1 ] ~= round( res[ i - 1 ], 0 ) then
result.error = 3 + 2 * i
return result
end
res[ i ] = v
end
else -- no number
if i ~= #s then -- allowed only at the last position
result.error = 10
return result
end
if res[ 1 ] < 0 then
result.error = 11
return result
end
l = ci.inputLetters[ v ]
if mw.ustring.len( v ) ~= 1 or not l then
result.error = 3
return result
end
-- l[1]: factor
-- l[2]: lat/long
if ( dir == 'long' and l[ 2 ] ~= 'long' ) or
( dir == 'lat' and l[ 2 ] ~= 'lat' ) then
result.error = 12
return result
else
dir = l[ 2 ]
end
res[ 4 ] = l[ 1 ]
end
end
if res[ 1 ] >= 0 then
result.dec = ( res[ 1 ] + res[ 2 ] / 60 + res[ 3 ] / 3600 ) * res[ 4 ]
else
result.dec = ( res[ 1 ] - res[ 2 ] / 60 - res[ 3 ] / 3600 ) * res[ 4 ]
end
result.dec = round( result.dec, getPrecision ( prec ) )
if result.dec < -mx or result.dec > mx or result.dec <= -180 then
result.error = 5
return result
end
return result
end
-- getDMSString formats a degree-minute-second string for output in accordance
-- to a given format specification
-- input
-- coord: decimal or hexagesimal DMS coordinate
-- prec: precion of the coorninate string: D, DM, DMS
-- aDir: lat/long direction to add correct direction letters
-- plus: alternative direction string for positive directions
-- minus: alternative direction string for negative directions
-- aFormat: format array with delimiter and leadZeros values or a predefined
-- dmsFormats key. Default format key is f1.
-- outputs 3 results
-- 1: formatted string or error message for display
-- 2: absolute decimal coordinate including the direction letter like 51.2323_N
-- 3: decimal coordinate
function cd.getDMSString( coord, prec, aDir, aPlus, aMinus, aFormat )
local d = aDir or ''
local p = aPlus or ''
local m = aMinus or ''
-- format
local f = aFormat or 'f1'
if type( f ) ~= 'table' then
f = ci.dmsFormats[ f ]
end
local del = f.delimiter or ' '
local lz = f.leadZeros or false
local c = { dec = tonumber( coord ), error = 0, parts = 1 }
if not c.dec then
c = cd.toDec( coord, d, 8 )
elseif c.dec <= -180 or c.dec > 180 then
c.error = 5
elseif d == 'lat' and ( c.dec < -90 or c.dec > 90 ) then
c.error = 5
end
local wp = ''
local l, result
if c.error == 0 then
local dms = toDMS( c.dec, prec )
if dms.dec < 0 and d == '' and m == '' then
dms.deg = -dms.deg
end
if lz and dms.min < 10 then
dms.min = '0' .. dms.min
end
if lz and dms.sec < 10 then
dms.sec = '0' .. dms.sec
end
result = dms.deg .. '°'
if dms.prec > 0 then
result = result .. del .. dms.min .. '′'
end
if dms.prec > 2 and dms.prec < 5 then
result = result .. del .. dms.sec .. '″'
end
if dms.prec > 4 then
-- enforce sec decimal digits even if zero
local s = string.format( "%." .. dms.prec - 4 .. "f″", dms.sec )
if ci.decimalPoint ~= '.' then
s = mw.ustring.gsub( s, '%.', ci.decimalPoint )
end
result = result .. del .. s
end
if d == 'lat' then
wp = dms.NS
elseif d == 'long' then
wp = dms.EW
end
if dms.dec >= 0 and p ~= '' then
l = p
elseif dms.dec < 0 and m ~= '' then
l = m
else
l = ci.outputLetters[ wp ]
end
if l and l ~= '' then
result = result .. del .. l
end
if c.parts > 1 then
result = result .. ci.categories.dms
end
return result, math.abs( dms.dec ) .. '_' .. wp, dms.dec
else
if d == 'lat' then
wp = 'N'
elseif d == 'long' then
wp = 'E'
end
result = '<span class="error" title="' .. getErrorMsg( c.error ) ..'">'
.. ci.errorMsg.faulty .. '</span>' .. ci.categories.faulty
return result, '0_' .. wp, '0'
end
end
-- getGeoLink returns complete dms geographic coordinate without reapplying the toDec
-- and toDMS functions. Pattern can contain placeholders $1 ... $6
-- $1: latitude in Wikipedia syntax including the direction letter like 51.2323_N
-- $2: longitude in Wikipedia syntax including the direction letter like 51.2323_E
-- $3: latitude in degree, minute and second format considering the strings for
-- the cardinal directions and the precision
-- $4: longitude in degree, minute and second format considering the strings
-- for the cardinal directions and the precision
-- $5: latitude
-- $6: longitude
-- aFormat: format array with delimiter and leadZeros values or a predefined
-- dmsFormats key. Default format key is f1.
-- outputs 3 results
-- 1: formatted string or error message for display
-- 2: decimal latitude
-- 3: decimal longitude
function cd.getGeoLink( pattern, lat, long, plusLat, plusLong, minusLat,
minusLong, prec, aFormat )
local lat_s, lat_wp, lat_dec =
cd.getDMSString( lat, prec, 'lat', plusLat, minusLat, aFormat )
local long_s, long_wp, long_dec =
cd.getDMSString( long, prec, 'long', plusLong, minusLong, aFormat )
local s = pattern
s = mw.ustring.gsub( s, '($1)', lat_wp )
s = mw.ustring.gsub( s, '($2)', long_wp )
s = mw.ustring.gsub( s, '($3)', lat_s )
s = mw.ustring.gsub( s, '($4)', long_s )
s = mw.ustring.gsub( s, '($5)', lat_dec )
s = mw.ustring.gsub( s, '($6)', long_dec )
return s, lat_dec, long_dec
end
-- getDecGeoLink returns complete decimal geographic coordinate without reapplying
-- the toDec function. Pattern can contain placeholders $1 ... $4
function cd.getDecGeoLink( pattern, lat, long, prec )
local function getDec( coord, aPrec, aDir, aPlus, aMinus )
local l = aPlus
local c = cd.toDec( coord, aDir, 8 )
if c.error == 0 then
if c.dec < 0 then
l = aMinus
end
local d = round( c.dec, aPrec ) .. ''
if ci.decimalPoint ~= '.' then
d = mw.ustring.gsub( d, '%.', ci.decimalPoint )
end
return d, math.abs( c.dec ) .. '_' .. l
else
c.dec = '<span class="error" title="' .. getErrorMsg( c.error ) ..'">'
.. ci.errorMsg.faulty .. '</span>' .. ci.categories.faulty
return c.dec, '0_' .. l
end
end
local lat_dec, lat_wp = getDec( lat, prec, 'lat', 'N', 'S' )
local long_dec, long_wp = getDec( long, prec, 'long', 'E', 'W' )
local s = pattern
s = mw.ustring.gsub( s, '($1)', lat_wp)
s = mw.ustring.gsub( s, '($2)', long_wp)
s = mw.ustring.gsub( s, '($3)', lat_dec)
s = mw.ustring.gsub( s, '($4)', long_dec)
return s, lat_dec, long_dec
end
-- Invokable functions
-- identical to MapSources #dd2dms tag
-- frame input
-- 1 or coord: decimal or hexagesimal coordinate
-- precision: precion of the coorninate string: D, DM, DMS
-- plus: alternative direction string for positive directions
-- minus: alternative direction string for negative directions
-- format: Predefined dmsFormats key. Default format key is f1.
function cd.dec2dms( frame )
local args = frame:getParent().args
args.coord = args[ 1 ] or args.coord or ''
args.precision = args.precision or ''
local r = cd.getDMSString( args.coord, args.precision, '',
args.plus, args.minus, args.format )
return r
end
-- identical to MapSources #deg2dd tag
function cd.dms2dec( frame )
local args = frame:getParent().args
args.coord = args[ 1 ] or args.coord or ''
args.precision = args.precision or ''
local r = cd.toDec( args.coord, '', args.precision )
local s = r.dec
if r.error ~= 0 then
s = '<span class="error" title="' .. getErrorMsg( r.error ) ..'">'
.. ci.errorMsg.faulty .. '</span>' .. ci.categories.faulty
end
return s
end
-- identical to MapSources #geoLink tag
-- This function can be extended to add Extension:GeoData #coordinates because
-- cd.getGeoLink returns lat and long, too
function cd.geoLink( frame )
local args = frame:getParent().args
args.pattern = args[ 1 ] or args.pattern or ''
if args.pattern == '' then
return ci.errorMsg[ 14 ]
end
return cd.getGeoLink( args.pattern, args.lat, args.long,
args.plusLat, args.plusLong, args.minusLat, args.minusLong,
args.precision, args.format )
end
return cd
3xk0kosj4z465qp7rh72xovi0e32gib
Modulo:UrlCheck
828
4817
72503
71079
2026-05-28T06:44:02Z
RolandUnger
168
Update
72503
Scribunto
text/plain
-- module variable and administration
local uc = {
moduleInterface = {
suite = 'UrlCheck',
serial = '2026-05-27',
item = 40849609
}
}
function uc.ip4( address )
local parts = { address:match( '(%d+)%.(%d+)%.(%d+)%.(%d+)' ) }
if #parts == 4 then
for key, value in pairs( parts ) do
if tonumber( value ) < 0 or tonumber( value ) > 255 then
return false
end
end
return true -- ok
end
return false
end
function uc.isUrl( url, skipPathCheck )
-- return codes 0 through 2 reserved
if not url or type( url ) ~= 'string' then
return 3
end
local s = mw.text.trim( url )
if s == '' then
return 3
elseif #s > 2048 then -- limitation because of search engines or IE
return 4
elseif s:find( '%s' ) or s:find( '%c' ) or s:match( '^%.' ) then
return 5
end
-- https://max:muster@www.example.com:8080/index.html?p1=A&p2=B#ressource
-- protocol
local count
s, count = s:gsub( '^https?://', '' )
if count == 0 then
s, count = s:gsub( '^//', '' )
end
if count == 0 then -- missing or wrong protocol
return 6
end
-- split path from host
local aPath = ''
local at = s:find( '/' )
if at then
aPath = s:sub( at + 1, #s )
s = s:sub( 1, at - 1 )
if not s then
return 7
end
end
-- path check
if not skipPathCheck and aPath ~= '' then
if not aPath:match( "^[-A-Za-z0-9_.,~%%%+&:;#*?!'=()@/\128-\255]*$" ) then
return 23
end
end
if s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or s:find( '%-%.' )
or s:find( '%.%-' ) or s:find( '%./' ) or s:find( '/%.' ) then
return 8
end
-- user and password
local host
s, count = s:gsub( '@', '@' )
if count > 1 then
return 9
elseif count == 1 then
at = s:find( '@' )
local user = s:sub( 1, at - 1 )
host = s:sub( at + 1, #s )
if not user or not s then
return 10
end
user, count = user:gsub( ':', ':' )
if count > 1 then
return 11
elseif count == 1 then
at = user:find( ':' )
local password = user:sub( at + 1, #user )
user = user:sub( 1, at - 1 )
if not user or not password then
return 12
elseif #user > 64 then
return 13
end
end
else
host = s
end
if host == '' then
return 14
end
-- host and port
host, count = host:gsub( ':', ':' )
if count > 1 then
return 15
elseif count == 1 then
at = host:find( ':' )
local port = host:sub( at + 1, #host )
host = host:sub( 1, at - 1 )
if not host or not port then
return 16
elseif not port:match( '^[1-9]%d*$' ) or tonumber( port ) > 65535 then
return 17
end
end
-- handle host part
if #host > 253 then
return 18
end
-- getting top-level domain
at = host:match( '^.*()%.' ) -- find last dot
if not at then
return 19
end
local topLevel = host:sub( at + 1, #host )
if not topLevel then
return 20
end
-- future: check of top-level domain
if uc.ip4( host ) then -- is ip4 address
return 2
elseif not ( mw.ustring.match( host, '^[ะ-๏%w%.%-]+%.%a%a+$' ) or
mw.ustring.match( host, '^[ะ-๏%w%.%-]+%.xn%-%-%w%w+$' ) ) then
-- Thai diacritical marks ะ (0E30) - ๏ (0E4F)
return 22
elseif not ( host:match( '^[%w%.%-]+%.%a%a+$' ) or
host:match( '^[%w%.%-]+%.xn%-%-%w%w+$' ) ) then
return 1 -- matches domain only in UTF 8 mode
end
return 0
end
function uc.uriEncodePath( url )
local at = url:find( '[^/]/[^/]' )
if at then
local domain = url:sub( 1, at + 1 )
local aPath = url:sub( at + 2, #url )
url = domain .. mw.uri.encode( aPath, 'PATH' )
end
return url
end
function uc.checkUrl( frame )
local args = frame.args
local pArgs = frame:getParent().args
args.url = args.url or pArgs.url or ''
args.show = args.show or pArgs.show or ''
local result = uc.isUrl( args.url, false )
if args.show:lower() == 'msg' then
local ui = mw.loadData( 'Module:UrlCheck/i18n')
if ui[ result ] then
return ui[ result ]
else
return ui.unknown
end
end
return result
end
function uc.encodePath( frame )
local args = frame.args
local pArgs = frame:getParent().args
args.url = args.url or args[ 1 ] or pArgs.url or pArgs[ 1 ] or ''
return uc.uriEncodePath( args.url )
end
return uc
0hxg267by9bmetxsu8mhmmfm2qgle28
Modulo:Wikidata utilities
828
4819
72497
71052
2026-05-28T06:38:22Z
RolandUnger
168
Update
72497
Scribunto
text/plain
-- Wikidata convenience utilities
-- documentation
local WikidataUtilities = {
suite = 'WikidataUtilities',
serial = '2026-05-17',
item = 65439025
}
-- i18n
local wd = {
version = 'P348',
startTime = "P580",
endTime = "P582",
retrieved = 'P813',
gregorianCalendar = { -- calendar models
Q12138 = 1, -- Gregorian
Q1985727 = 1 -- proleptic Gregorian
},
redirectBadges = {
Q70894304 = 1, -- intentional sitelink
Q70893996 = 1 -- redirect sitelink
}
}
-- module variable and administration
local wu = {
moduleInterface = WikidataUtilities,
currentTime = ''
}
-- table storing property ids used
local catTable = {
P0 = ''
}
local function isSet( arg )
return arg and arg ~= ''
end
function wu.getEntity( id )
local wrongQualifier = false
local entity = nil
if not isSet( id ) then
return '', entity, wrongQualifier
end
if mw.wikibase.isValidEntityId( id ) then
-- expensive function call
-- redirect ids marked false, too
entity = mw.wikibase.getEntity( id )
end
if not entity then
id = ''
wrongQualifier = true
end
return id, entity, wrongQualifier
end
function wu.getEntityId( id )
local wrongQualifier = false
local entity
if not isSet( id ) then
id = ''
elseif mw.wikibase.isValidEntityId( id ) and mw.wikibase.entityExists( id ) then
-- expensive function call
-- redirect ids marked false, too
entity = id
else
id = ''
wrongQualifier = true
end
return id, entity, wrongQualifier
end
function wu.getLabel( entity, lang, noFallback )
if not isSet( entity ) then
return nil
end
local tp = type( entity )
if tp == 'string' and mw.wikibase.isValidEntityId( entity ) then
return isSet( lang ) and mw.wikibase.getLabelByLang( entity, lang )
or ( not noFallback and mw.wikibase.getLabel( entity ) )
elseif tp == 'table' and entity.labels then -- really a wikidata entity?
return isSet( lang ) and entity:getLabel( lang )
or ( not noFallback and entity:getLabel() )
end
return nil
end
function wu.getAliases( entity, lang )
if type( entity ) == 'string' then -- is Q id
entity = mw.wikibase.getEntity( entity )
end
if not lang then
lang = mw.getContentLanguage():getCode()
end
local aliases = {}
if entity and entity.aliases and entity.aliases[ lang ] then
for i, alias in ipairs( entity.aliases[ lang ] ) do
table.insert( aliases, alias.value )
end
end
return aliases
end
function wu.getSitelink( entity, globalSiteId )
if not isSet( entity ) then
return nil
end
if type( entity ) == 'string' then -- entity is id
return mw.wikibase.getSitelink( entity, globalSiteId )
elseif entity and entity.labels then
return entity:getSitelink( globalSiteId )
end
return nil
end
local function getSitelinkTable( entity, globalSiteId )
if not isSet( entity ) or not isSet( globalSiteId ) then
return nil
elseif type( entity ) == 'string' then -- entity is id
entity = mw.wikibase.getEntity( entity )
end
if entity and entity.sitelinks then
return entity.sitelinks[ globalSiteId ]
end
return nil
end
-- getting sitelink title marking as redirect
function wu.getCheckedSitelink( entity, globalSiteId )
local isRedirect = false
local t = getSitelinkTable( entity, globalSiteId )
if not t or not t.title then
return nil, isRedirect
end
for i = 1, #t.badges do
if wd.redirectBadges[ t.badges[ i ] ] then
isRedirect = true
break
end
end
return t.title, isRedirect
end
-- getting sitelink title exclunding redirects
function wu.getFilteredSitelink( entity, globalSiteId )
local title, isRedirect = wu.getCheckedSitelink( entity, globalSiteId )
return ( title and not isRedirect ) and title or nil
end
-- convert from url to Q id
local function getUnitId( unit )
if isSet( unit ) and type( unit ) == 'string' then
return unit == '1' and unit or unit:sub( unit:find( 'Q', 1, true ), -1 )
end
return ''
end
local function getAmount( amount )
if amount:sub( 1, 1 ) == '+' then
amount = amount:sub( 2 )
end
return amount
end
local function getBestStatements( entity, p )
local tp = type( entity )
if tp == 'string' and mw.wikibase.isValidEntityId( entity ) then
return mw.wikibase.getBestStatements( entity, p )
elseif tp == 'table' and entity.labels then
return entity:getBestStatements( p )
end
return {}
end
local function getTime( statement, p )
local q
if statement and statement.qualifiers and statement.qualifiers[ p ] then
q = statement.qualifiers[ p ][ 1 ]
if q.snaktype == 'value' and q.datatype == 'time' then
q = q.datavalue.value.time
if q:sub( 1, 1 ) ~= '-' then -- B. C.
return q:sub( 1, 11 )
end
end
end
return nil
end
local function getStatements( entity, p, count )
local ar = {}
if not ( isSet( entity ) and isSet( p ) ) then
return ar
end
local statements = getBestStatements( entity, p )
count = math.min( count or #statements, #statements )
if count <= 0 then
return ar
end
local i = 0
local statement, outdated, startTime, endTime
repeat
i = i + 1
statement = statements[ i ].mainsnak
if statement.snaktype == 'value' then
if statement.datatype == 'quantity' then
statement.datavalue.value.amount =
getAmount( statement.datavalue.value.amount )
statement.datavalue.value.unit = getUnitId(
statement.datavalue.value.unit )
end
startTime = getTime( statements[ i ], wd.startTime )
endTime = getTime( statements[ i ], wd.endTime )
if wu.currentTime == '' and ( startTime or endTime ) then
wu.currentTime = '+' .. mw.getContentLanguage():formatDate( 'c' ):sub( 1, 10 )
end
if startTime and wu.currentTime < startTime then
outdated = true
else
outdated = endTime and wu.currentTime > endTime
end
if not outdated then
table.insert( ar, statements[ i ] )
end
end
until i >= #statements or #ar >= count
return ar
end
function wu.getValue( entity, p )
local statements = getStatements( entity, p, 1 )
if #statements > 0 then
catTable[ p ] = ''
return statements[ 1 ].mainsnak.datavalue.value
end
return ''
end
function wu.getId( entity, p )
local value = ''
local statements = getStatements( entity, p, 1 )
if #statements > 0 then
value = statements[ 1 ].mainsnak.datavalue.value
value = value.id or ''
if value ~= '' then
catTable[ p ] = ''
end
end
return value
end
function wu.getValues( entity, p, count )
local statements = getStatements( entity, p, count )
if #statements > 0 then
for i = 1, #statements, 1 do
statements[ i ] = statements[ i ].mainsnak.datavalue.value
end
catTable[ p ] = ''
end
return statements
end
function wu.getIds( entity, p, count )
local statements = getStatements( entity, p, count )
if #statements > 0 then
for i = #statements, 1, -1 do
statements[ i ] = statements[ i ].mainsnak.datavalue.value.id
if not statements[ i ] then
table.remove( statements, i )
end
end
if #statements > 0 then
catTable[ p ] = ''
end
end
return statements
end
function wu.getValuesByLang( entity, p, count, lang )
local ar = {}
local statements = getStatements( entity, p )
if #statements > 0 then
local value
for i = 1, #statements, 1 do
value = statements[ i ].mainsnak.datavalue.value
if value.language and lang == value.language then
table.insert( ar, value.text )
end
if count and #ar >= count then
break
end
end
end
if #ar > 0 then
catTable[ p ] = ''
end
return ar
end
-- get values array for monolingual text
function wu.getMonolingualValues( entity, p )
local result = {}
local statements = getStatements( entity, p, nil )
if #statements > 0 and statements[ 1 ].mainsnak.datatype == 'monolingualtext' then
local hyphen, lng, value
catTable[ p ] = ''
for i = 1, #statements, 1 do
value = statements[ i ].mainsnak.datavalue.value
lng = value.language
hyphen = lng:find( '-' )
if hyphen then
lng = lng:sub( 1, hyphen - 1 )
end
if not result[ lng ] then
result[ lng ] = value.text
end
end
end
return result
end
function wu.getValuesByQualifier( entity, p, qualifierP, defaultId )
local result = {}
if not isSet( qualifierP ) then
return result
elseif type( defaultId ) ~= 'string' or defaultId == '' then
defaultId = 'unknown'
end
local statements = getStatements( entity, p, nil )
if #statements > 0 then
catTable[ p ] = ''
local id, statement, value
for i = 1, #statements do
statement = statements[ i ]
-- defaultId is used if a qualifier is missing
id = defaultId
value = statement.mainsnak.datavalue.value
if statement.qualifiers and statement.qualifiers[ qualifierP ] then
for j, qualifier in ipairs( statement.qualifiers[ qualifierP ] ) do
if qualifier.snaktype == 'value' then
id = qualifier.datavalue.value.id
if id then
catTable[ qualifierP ] = ''
break
end
end
end
end
result[ id ] = value
end
end
return result
end
local function analyzeDatavalue( datavalue, labelFct, ... )
local v = datavalue.value
local t = datavalue.type
if type( v ) == 'table' then
-- items which can be reduced to a string
if t == 'wikibase-entityid' then
v = v.id
if type( labelFct ) == 'function' then
v = labelFct( v, ... )
end
elseif t == 'quantity' then
v.amount = getAmount( v.amount )
if tonumber( v.amount ) == 0 then
v.amount = '0'
end
if v.unit == '1' then
v = tonumber( v.amount ) or 1
else
v.unit = getUnitId( v.unit )
end
elseif t == 'time' then
v.calendarmodel = getUnitId( v.calendarmodel )
if wd.gregorianCalendar[ v.calendarmodel ] then -- is gregorian calendar?
v = v.time
end
end
end
return v, t
end
-- for qualifiers, references
-- { item1, item2, ... } : using named qualifiers/references
-- {} : using no qualifiers/references
-- nil : using all qualifiers/references
function wu.getValuesWithQualifiers( entity, p, values, qualifiers, references,
count, labelFct, ... )
local array, qual
local function toQualifierTable( tab, key, qualTab, aLabelFct, ... )
local v
if not tab[ key ] then
tab[ key ] = {}
end
for i = 1, #qualTab do
qual = qualTab[ i ]
if qual.snaktype == 'value' then
v, tab[ key .. '-type' ] =
analyzeDatavalue( qual.datavalue, aLabelFct, ... )
table.insert( tab[ key ], v )
end
end
if #tab[ key ] == 0 then
tab[ key ] = nil
tab[ key .. '-type' ] = nil
else
catTable[ key ] = ''
end
end
local function hasValue( tab, val )
for i = 1, #tab do
if tab[ i ] == val then
return true
end
end
return false
end
local results = {}
local statements = getStatements( entity, p, count )
if #statements == 0 then
return results
end
local v
if type( values ) == 'table' and #values > 0 then
for i = #statements, 1, -1 do
v = statements[ i ].mainsnak.datavalue.value
if type( v ) ~= 'string' then
v = v.id
end
if not isSet( v ) or not hasValue( values, v ) then
table.remove( statements, i )
end
end
if #statements == 0 then
return results
end
end
catTable[ p ] = ''
if type( qualifiers ) == 'string' then
qualifiers = { qualifiers }
end
if type( references ) == 'string' then
references = { references }
end
local reference, statement
for i = 1, #statements do
statement = statements[ i ]
array = { value = analyzeDatavalue( statement.mainsnak.datavalue, labelFct, ... ),
[ 'value-type' ] = statement.mainsnak.datavalue.type }
if statement.qualifiers then
if not qualifiers then -- all qualifier properties
for key, qualTab in pairs( statement.qualifiers ) do
toQualifierTable( array, key, qualTab, labelFct, ... )
end
else -- table of selected qualifier properties
local key
for j = 1, #qualifiers do
key = qualifiers[ j ]
if statement.qualifiers[ key ] then
toQualifierTable( array, key, statement.qualifiers[ key ], labelFct, ... )
end
end
end
end
array.references = {}
if statement.references then
for k = 1, #statement.references do
reference = statement.references[ k ]
if reference and reference.snaks then
table.insert( array.references, {} )
if not references then -- all references
for key2, refTab in pairs( reference.snaks ) do
toQualifierTable( array.references[ #array.references ],
key2, refTab )
end
else -- table of selected references
local key
for j = 1, #references do
key = references[ j ]
if reference.snaks[ key ] then
toQualifierTable( array.references[ #array.references ],
key, reference.snaks[ key ] )
end
end
end
end
end
end
table.insert( results, array )
end
-- clustering statements with identical value
local helper = {}
local sort1 = 0
local mult = false
local result
for i = 1, #results do
result = results[ i ]
if helper[ result.value ] then
helper[ result.value ].sort2 = helper[ result.value ].sort2 + 1
mult = true
else
sort1 = sort1 + 1
helper[ result.value ] = { sort1 = sort1, sort2 = 1 }
end
result.sort1 = helper[ result.value ].sort1
result.sort2 = helper[ result.value ].sort2
end
if sort1 > 1 and mult and #results > 2 then
table.sort( results,
function( a, b )
return a.sort1 < b.sort1 or
( a.sort1 == b.sort1 and a.sort2 < b.sort2 )
end
)
end
return results
end
-- extract date from time
function wu.getDateFromTime( t )
local model = '' -- is Gregorian
if type( t ) == 'table' then
model = t.calendarmodel
t = t.time
end
t = t:sub( 2, 11 )
return t, model
end
-- get lastEdit from reference retrieve date
function wu.getLastedit( lastEdit, statements )
local isBoolean = type( lastEdit ) == 'boolean'
if isBoolean and lastEdit == false then
return lastEdit
end
local le = ''
for i, statement in ipairs( statements ) do
if statement.references then
for j, reference in ipairs( statement.references ) do
if reference[ wd.retrieved ] then
for k, retrieved in ipairs( reference[ wd.retrieved ] ) do
retrieved = wu.getDateFromTime( retrieved )
if retrieved > le then
le = retrieved
end
end
end
end
end
end
if isBoolean then
return ( le ~= '' ) and le or lastEdit
else
return ( le > lastEdit ) and le or lastEdit
end
end
-- maintenance utilities
function wu.getCategories( formatStr )
if not isSet( formatStr ) then
formatStr = '[[Category:%s]]'
end
catTable.P0 = nil
local result = ''
for key, value in pairs( catTable ) do
result = result .. formatStr:format( key )
end
return result
end
return wu
eyileg93y3pvl4y206b19w870gjscd8
Modulo:CountryData
828
4820
72505
71062
2026-05-28T06:46:07Z
RolandUnger
168
Update
72505
Scribunto
text/plain
-- CountryData module
-- module variable and administration
local cm = {
moduleInterface = {
suite = 'CountryData',
serial = '2026-05-17',
item = 65431301
}
}
-- module import
-- require( 'strict' )
local cg = mw.loadData( 'Module:CountryData/Geography' )
local cu = mw.loadData( 'Module:CountryData/Currencies' ) -- additional currency symbols
local wu = require( 'Module:Wikidata utilities' )
local properties = {
continent = 'P30',
country = 'P17',
countryCode = 'P474',
currency = 'P38',
iso3166_1 = 'P297',
iso3166_2 = 'P300',
iso639 = 'P218',
locatedIn = 'P131',
officialLanguage = 'P37',
partOf = 'P361'
}
local exceptions = {
Q145 = '^+44' -- UK
}
local currencyformatters = {}
local function isSet( arg )
return arg and arg ~= ''
end
local function _getCountry( tab, id )
local item = tab[ id ]
if item and item.id then
item = tab[ item.id ]
end
if not item then
return nil
end
local c = {}
for k, v in pairs( item ) do -- item is read only
c[ k ] = v
end
if c and not c.id then
c.id = id
end
return c
end
local function getCountry( id )
return _getCountry( cg.countries, id )
end
local function getAdminEntity( id )
return _getCountry( cg.adminEntities, id )
end
local function getCountryTable( id )
return getAdminEntity( id ) or getCountry( id ) -- nil or table
end
local function checkTable( id )
if id == nil or id == '' then
return nil
end
return getCountryTable( id ) -- nil or table
end
local function checkTableFromEntity( anEntity )
if not anEntity then
return nil
end
local id, t
for i, prop in ipairs( { properties.locatedIn, properties.country, properties.partOf } ) do
for j, val in ipairs( wu.getValues( anEntity, prop ) ) do
id = val.id
t = checkTable( id )
if t then
return t
end
end
end
return nil
end
function cm.getDataFromTables( vcEntity, wikidata )
-- article id
local articleId = mw.wikibase.getEntityIdForCurrentPage()
-- article lemma
local t = cg.articles[ articleId ]
if t then
return getCountryTable( t )
end
-- if country or admin unit itself
if wikidata then
t = checkTable( wikidata )
if t then
return t
end
end
if not articleId and not vcEntity then
return nil
end
-- vCard entity
if vcEntity then
t = checkTableFromEntity( vcEntity )
if t then
return t
end
end
-- article entity
if articleId then
t = checkTable( articleId ) or checkTableFromEntity( articleId )
if t then
return t
end
end
-- not found in tables, get it now all from Wikidata
return nil
end
-- getting data for vCard
local function _getCountryDataByIso( iso_3166 )
for i, tab in ipairs( { 'countries', 'adminEntities' } ) do
for id, c in pairs( cg[ tab ] ) do
if c.iso_3166 and c.iso_3166 == iso_3166 then
local country = {}
for k, v in pairs( c ) do
country[ k ] = v
end
country.id = id
return country
end
end
end
return nil
end
local function _getCountryData( vcEntity, iso_3166, wikidata )
local t = cm.getDataFromTables( vcEntity, wikidata )
if t then
return t
end
-- use template country parameter iso_3166
if isSet( iso_3166 ) and iso_3166:match( '%a%a' ) then
t = _getCountryDataByIso( iso_3166:upper() )
if t then
return t
end
end
-- not found in CountryData table
-- return default country dataset if not in main namespace
if mw.title.getCurrentTitle().namespace ~= 0 and cg.articles[ '_default' ] then
return getCountry( cg.articles[ '_default' ] )
end
-- getting data from country entity
local country = {
id = wu.getId( vcEntity, properties.country ),
iso_3166 = '',
cont = '',
cc = '',
lang = '',
currency = '',
country = '',
show = '',
unknownCountry = isSet( iso_3166 )
}
local coEntity = country.id ~= '' and mw.wikibase.getEntity( country.id )
if coEntity then
country.fromWD = true
country.iso_3166 = wu.getValue( coEntity, properties.iso3166_1 ):upper()
country.cont = cg.continents[ wu.getId( coEntity, properties.continent ) ] or ''
country.cc = wu.getValue( coEntity, properties.countryCode ) -- country calling code
t = wu.getId( coEntity, properties.officialLanguage )
if t ~= '' then
country.lang = wu.getValue( t, properties.iso639 ):lower()
end
country.currency = wu.getId( coEntity, properties.currency )
end
return country
end
-- getting county data from country calling code
function cm.getCountryFromPhones( tab )
local country = {
id = '',
cont = '',
iso_3166 = '',
cc = '',
lang = '',
currency = '',
country = '',
show = ''
}
-- prepare phone numbers
for i = #tab, 1, -1 do
tab[ i ] = tab[ i ]:gsub( '^00', '+' )
:gsub( '^%+%+', '+' )
:gsub( '[^%+0-9A-Z]', '' )
if not tab[ i ]:match( '^%+%d%d%d%d' ) then
table.remove( tab, i )
end
end
if #tab == 0 then
return country
end
-- exceptions fur multiple used country calling codes
for i = 1, #tab, 1 do
for wdId, pattern in pairs( exceptions ) do
if tab[ i ]:match( pattern ) then
return getCountry( wdId )
end
end
end
-- make country calling codes table
local ccodes = {}
for i, cgTab in ipairs( { cg.countries, cg.adminEntities } ) do
for key, val in pairs( cgTab ) do
if val.cc and val.cc ~= '' then
ccodes[ val.cc:gsub( '-', '' ) ] = key
end
end
end
-- look for country code in phone numbers
local q
for i, phone in ipairs( tab ) do
phone = phone:sub( 1, 5 )
repeat
q = ccodes[ phone ]
phone = phone:sub( 1, -2 )
until phone == '' or q
if q then
country = getCountryTable( q )
break
end
end
return country
end
function cm.getCountryFromWeb( tab )
local at, count, domain, country, toplevel
for i, address in ipairs( tab ) do
address = mw.text.trim( address )
domain = ''
address, count = address:gsub( '^https?://', '' )
if count == 0 then
address, count = address:gsub( '^//', '' )
end
if count == 1 then -- it is maybe a web domain
domain = address
at = domain:find( '/' )
if at then
domain = domain:sub( 1, at - 1 )
end
else -- is maybe an email address
address, count = address:gsub( '@', '@' )
if count == 1 then
domain = address:gsub( '^.*@', '' )
end
end
if domain ~= '' then
-- get two letters country TLD
toplevel, count = domain:gsub( '^.*%.(%a%a)$', '%1' )
if count == 1 then
country = _getCountryDataByIso( toplevel:upper() )
if country then
return country
end
end
end
end
return {
id = '',
cont = '',
iso_3166 = '',
cc = '',
lang = '',
currency = '',
country = '',
show = ''
}
end
-- adding language-dependent parameters
function cm.setLanguageParams( langCode, wikiLang, country )
if langCode ~= '' then
country.lang = langCode
country.unknownLanguage = true
country.langName = mw.language.fetchLanguageName( langCode, wikiLang ) or ''
if country.langName ~= '' then
country.unknownLanguage = false
country.isRTL = mw.getLanguage( langCode ):isRTL()
end
end
end
-- main getCountryData function
-- entity: Wikidata entity or Wikidata id
-- phones: table of phone numbers with country calling code
-- iso_3166: is given by country parameter of listing/marker templates
-- wikidata: Wikidata id
-- web: table of urls and/or mail addressess
function cm.getCountryData( entity, phones, iso_3166, wikidata, web )
local country = _getCountryData( entity, iso_3166, wikidata )
if country.id == '' and web and #web > 0 then
country = cm.getCountryFromWeb( web )
end
if country.id == '' and phones and #phones > 0 then
country = cm.getCountryFromPhones( phones )
end
local c = cu.currencies[ country.currency ]
country.currency = c and c.iso or ''
country.addCurrency = country.currency
if c and c.add and c.add ~= '' then
country.addCurrency = country.addCurrency
.. ( country.addCurrency ~= '' and ', ' or '' ) .. c.add
end
country.unknownLanguage = true
cm.setLanguageParams( country.lang, mw.getContentLanguage():getCode(), country )
return country
end
-- getting first-order administrative-territorial entity code
function cm.getAdm1st( countryId )
local entityId = mw.wikibase.getEntityIdForCurrentPage()
if not entityId or not countryId or countryId == '' then
return nil
end
local i = 0
local iso3166_2
while entityId ~= '' and not getAdminEntity( entityId )
and not getCountry( entityId ) and i < 5 do
iso3166_2 = wu.getValue( entityId, properties.iso3166_2 )
if iso3166_2 ~= '' then
return iso3166_2
end
-- getting next administrative territorial entity
entityId = wu.getId( entityId, properties.locatedIn )
i = i + 1
end
end
function cm.getCategories( formatStr )
return wu.getCategories( formatStr )
end
-- getting data for LinkPhone
function cm.getCountryCode()
local t = cm.getDataFromTables( nil )
if t then
return t.cc, t.phoneDigits or 2
else
return '', 2
end
end
-- returns a single data set from Module:CountryData/Currencies
function cm.getCurrency( key )
return cu.currencies[ key ]
end
function cm.getCurrencyFormatter( qId )
qId = qId:upper()
if currencyformatters[ qId ] then
return currencyformatters[ qId ]
elseif qId:match( '^%a%a%a$' ) then -- ISO code
qId = cu.isoToQid[ qId ]
end
local currency = cu.currencies[ qId ]
if currency then
local formatter, unit
if currency.f then
formatter = currency.f
else
formatter = cu.currencies.default or '%s unit'
unit = currency.add and currency.add:gsub( ',.*', '' )
or currency.iso
formatter = formatter:gsub( 'unit', unit )
end
currencyformatters[ qId ] = formatter
currencyformatters[ currency.iso ] = formatter
return formatter
end
return nil
end
return cm
phevbgkq8beij0sg800d9yl5ud8fuot
Modulo:CountryData/Currencies
828
4822
72504
68963
2026-05-28T06:46:04Z
RolandUnger
168
Update
72504
Scribunto
text/plain
--[[
Currency properties table
Use only quotation marks for delimiters!
iso: ISO 4217 code
add: additional currency identifiers
mul: multiplier if not 1
f : formatter
]]--
return {
moduleInterface = {
suite = 'CountryData',
sub = 'Currencies',
serial = '2026-05-27',
item = 65455847
},
currencies = {
default = "%s unit",
Q1983857 = { iso = "ABA", add = "Аҧ" },
Q200294 = { iso = "AED", add = "DH" },
Q199471 = { iso = "AFN", add = "؋" },
Q125999 = { iso = "ALL", add = "L, q" },
Q130498 = { iso = "AMD", add = "֏" },
Q522701 = { iso = "ANG", add = "NAƒ" },
Q200337 = { iso = "AOA", add = "Kz" },
Q199578 = { iso = "ARS", add = "$", f = "%s AR$" }, -- former ARP
Q259502 = { iso = "AUD", add = "A$, c", f = "%s AU$" },
Q232270 = { iso = "AWG", add = "ƒ" },
Q483725 = { iso = "AZN", add = "m." },
Q179620 = { iso = "BAM", add = "KM" },
Q194351 = { iso = "BBD", add = "Bds$" },
Q194453 = { iso = "BDT", add = "Tk" },
Q172540 = { iso = "BGN", add = "лв" },
Q201871 = { iso = "BHD", add = "BD" },
Q238007 = { iso = "BIF", add = "FBu" },
Q210478 = { iso = "BMD", add = "BD$" },
Q206319 = { iso = "BND", add = "B$" },
Q200737 = { iso = "BOB", add = "Bs." },
Q173117 = { iso = "BRL", add = "R$" },
Q194339 = { iso = "BSD", add = "B$" },
Q201799 = { iso = "BTN", add = "Nu., Ch." },
Q186794 = { iso = "BWP", add = "P" },
Q160680 = { iso = "BYN", add = "Br" },
Q275112 = { iso = "BZD", add = "BZ$" },
Q1104069 = { iso = "CAD", add = "Can$, ¢", f = "%s CA$" },
Q4734 = { iso = "CDF", add = "CF" },
Q25344 = { iso = "CHF", add = "SFr", f = "%s SFr" },
Q507737 = { iso = "CKD", add = "CK$" },
Q200050 = { iso = "CLP", add = "CLP$" },
Q39099 = { iso = "CNY", add = "¥, RMB¥", f = "%s ¥" },
Q244819 = { iso = "COP", add = "COL$" },
Q242915 = { iso = "CRC", add = "₡" },
Q731350 = { iso = "CUC", add = "CUC$" },
Q201505 = { iso = "CUP", add = "$MN" },
Q4591 = { iso = "CVE", add = "$, CV$" },
Q131016 = { iso = "CZK", add = "Kč, h" },
Q4594 = { iso = "DJF", add = "Fdj" },
Q25417 = { iso = "DKK", add = "kr" },
Q242922 = { iso = "DOP", add = "RD$" },
Q199674 = { iso = "DZD", add = "DA" },
Q199462 = { iso = "EGP", add = "LE, pt.", f = "LE %s" },
Q2094914 = { iso = "EHP", add = "Pta, Pts" },
Q171503 = { iso = "ERN", add = "Nfk" },
Q206243 = { iso = "ETB", add = "Br" },
Q4916 = { iso = "EUR", add = "€, c, ct", f = "%s €" },
Q2377701 = { iso = "EUR", add = "€, c, ct", mul = 0.01, f = "%s €" }, -- Euro cent
Q4592 = { iso = "FJD", add = "FJ$" },
Q330044 = { iso = "FKP", add = "FK£" },
Q191068 = { iso = "FOK", add = "kr" }, -- Färöer islands
Q25224 = { iso = "GBP", add = "£, p", f = "%s £" },
Q4608 = { iso = "GEL", add = "₾" },
Q255792 = { iso = "GGP" },
Q183530 = { iso = "GHS", add = "GH₵" },
Q41429 = { iso = "GIP", add = "£" },
Q202885 = { iso = "GMD", add = "D" },
Q213311 = { iso = "GNF", add = "FG" },
Q207396 = { iso = "GTQ", add = "Q" },
Q213005 = { iso = "GYD", add = "G$" },
Q31015 = { iso = "HKD", add = "HK$", f = "%s HK$" },
Q4719 = { iso = "HNL", add = "L" },
Q26360 = { iso = "HRK", add = "kn, lp" },
Q203955 = { iso = "HTG", add = "G" },
Q47190 = { iso = "HUF", add = "Ft", f = "%s Ft" },
Q41588 = { iso = "IDR", add = "Rp" },
Q131309 = { iso = "ILS", add = "₪" },
Q27614 = { iso = "IMP" },
Q80524 = { iso = "INR", add = "₹", f = "%s ₹" },
Q193094 = { iso = "IQD", add = "د.ع" },
Q188608 = { iso = "IRR", add = "﷼" },
Q131473 = { iso = "ISK", add = "kr" },
Q270744 = { iso = "JEP" },
Q209792 = { iso = "JMD", add = "J$" },
Q203722 = { iso = "JOD", add = "JD" },
Q8146 = { iso = "JPY", add = "¥", f = "%s ¥" },
Q202882 = { iso = "KES", add = "Ksh" },
Q35881 = { iso = "KGS", add = "сом" },
Q204737 = { iso = "KHR", add = "៛" },
Q1049963 = { iso = "KID", add = "KI$" },
Q267264 = { iso = "KMF", add = "CF" },
Q106720 = { iso = "KPW", add = "₩" },
Q202040 = { iso = "KRW", add = "₩" },
Q193098 = { iso = "KWD", add = "K.D." },
Q319885 = { iso = "KYD", add = "CI$" },
Q173751 = { iso = "KZT", add = "₸" },
Q200055 = { iso = "LAK", add = "₭" },
Q201880 = { iso = "LBP", add = "LL" },
Q4596 = { iso = "LKR", add = "SLRs" },
Q242988 = { iso = "LRD", add = "L$" },
Q208039 = { iso = "LSL", add = "M" },
Q190699 = { iso = "LYD", add = "LD" },
Q200192 = { iso = "MAD", add = "DH" },
Q181129 = { iso = "MDL", add = "lei" },
Q4584 = { iso = "MGA", add = "Ar" },
Q177875 = { iso = "MKD", add = "DEN" },
Q201875 = { iso = "MMK", add = "K" },
Q183435 = { iso = "MNT", add = "₮" },
Q241214 = { iso = "MOP", add = "MOP$" },
Q207024 = { iso = "MRO", add = "UM" },
Q212967 = { iso = "MUR", add = "₨" },
Q206600 = { iso = "MVR", add = "Rf." },
Q211694 = { iso = "MWK", add = "MK" },
Q4730 = { iso = "MXN", add = "Mex$, ¢" },
Q163712 = { iso = "MYR", add = "RM", f = "%s RM" },
Q200753 = { iso = "MZN", add = "MT" },
Q202462 = { iso = "NAD", add = "N$" },
Q203567 = { iso = "NGN", add = "₦" },
Q207312 = { iso = "NIO", add = "C$" },
Q94418 = { iso = "NKD", add = "Dram" },
Q132643 = { iso = "NOK", add = "kr" },
Q202895 = { iso = "NPR", add = "N₨" },
Q4165057 = { iso = "NUD", add = "NU$" },
Q1472704 = { iso = "NZD", add = "NZ$, c", f = "%s NZ$" },
Q272290 = { iso = "OMR", add = "ر.ع." },
Q210472 = { iso = "PAB", add = "B/." },
Q204656 = { iso = "PEN", add = "S/." },
Q200759 = { iso = "PGK", add = "K" },
Q17193 = { iso = "PHP", add = "₱" },
Q188289 = { iso = "PKR", add = "₨" },
Q123213 = { iso = "PLN", add = "zł, gr" },
Q4165058 = { iso = "PND", add = "PN$" },
Q200979 = { iso = "PRB", add = "RUP" },
Q207514 = { iso = "PYG", add = "₲" },
Q206386 = { iso = "QAR", add = "QR" },
Q131645 = { iso = "RON", add = "lei" },
Q172524 = { iso = "RSD", add = "din." },
Q41044 = { iso = "RUB", add = "₽" },
Q4741 = { iso = "RWF", add = "FRw" },
Q199857 = { iso = "SAR", add = "SR." },
Q4597 = { iso = "SBD", add = "SI$" },
Q4595 = { iso = "SCR", add = "SRe" },
Q271206 = { iso = "SDG", add = "ج.س." },
Q122922 = { iso = "SEK", add = "kr" },
Q190951 = { iso = "SGD", add = "S$", f = "%s S$" },
Q374453 = { iso = "SHP", add = "£" },
Q4587 = { iso = "SLL", add = "Le" },
Q4603 = { iso = "SOS", add = "Sh.So." },
Q737384 = { iso = "SQS" },
Q202036 = { iso = "SRD", add = "SR$" },
Q244366 = { iso = "SSP" },
Q193712 = { iso = "STN", add = "₡, Db" }, -- former STD
Q829043 = { iso = "SVC", add = "₡" },
Q240468 = { iso = "SYP", add = "LS" },
Q4823 = { iso = "SZL", add = "E" },
Q177882 = { iso = "THB", add = "฿", f = "%s ฿" },
Q199886 = { iso = "TJS", add = "SM" },
Q572213 = { iso = "TLD" }, -- only coins
Q486637 = { iso = "TMT", add = "T" },
Q4602 = { iso = "TND", add = "DT" },
Q4613 = { iso = "TOP", add = "T$, ¢" },
Q172872 = { iso = "TRY", add = "₺" },
Q242890 = { iso = "TTD", add = "TT$" },
Q4406 = { iso = "TVD", add = "$T, TV$" },
Q208526 = { iso = "TWD", add = "NT$" },
Q4589 = { iso = "TZS", add = "TSh" },
Q81893 = { iso = "UAH", add = "₴" },
Q4598 = { iso = "UGX", add = "Ush" },
Q4917 = { iso = "USD", add = "$, ¢", f = "%s $" },
Q209272 = { iso = "UYU", add = "$U" },
Q487888 = { iso = "UZS", add = "So'm" },
Q56349362= { iso = "VES", add = "Bs." }, -- former VEF
Q192090 = { iso = "VND", add = "₫", f = "%s ₫" },
Q207523 = { iso = "VUV", add = "VT" },
Q4588 = { iso = "WST", add = "WS$" },
Q847739 = { iso = "XAF", add = "FCFA" },
Q26365 = { iso = "XCD", add = "EC$" },
Q737779 = { iso = "XCG", add = "CMg, ƒ" },
Q861690 = { iso = "XOF", add = "CFA, c" },
Q214393 = { iso = "XPF", add = "CPF" },
Q1148329 = { iso = "XSU", add = "Sucre" },
Q240512 = { iso = "YER", add = "﷼" },
Q181907 = { iso = "ZAR", add = "R, c", f = "%s R" },
Q21596813= { iso = "ZMW", add = "ZK" },
Q73408 = { iso = "ZWL", add = "Z$" }
},
isoToQid = {
ABA = "Q1983857",
AED = "Q200294",
AFN = "Q199471",
ALL = "Q125999",
AMD = "Q130498",
ANG = "Q522701",
AOA = "Q200337",
ARS = "Q199578",
AUD = "Q259502",
AWG = "Q232270",
AZN = "Q483725",
BAM = "Q179620",
BBD = "Q194351",
BDT = "Q194453",
BGN = "Q172540",
BHD = "Q201871",
BIF = "Q238007",
BMD = "Q210478",
BND = "Q206319",
BOB = "Q200737",
BRL = "Q173117",
BSD = "Q194339",
BTN = "Q201799",
BWP = "Q186794",
BYN = "Q160680",
BZD = "Q275112",
CAD = "Q1104069",
CDF = "Q4734",
CHF = "Q25344",
CKD = "Q507737",
CLP = "Q200050",
CNY = "Q39099",
COP = "Q244819",
CRC = "Q242915",
CUC = "Q731350",
CUP = "Q201505",
CVE = "Q4591",
CZK = "Q131016",
DJF = "Q4594",
DKK = "Q25417",
DOP = "Q242922",
DZD = "Q199674",
EGP = "Q199462",
EHP = "Q2094914",
ERN = "Q171503",
ETB = "Q206243",
EUR = "Q4916",
FJD = "Q4592",
FKP = "Q330044",
FOK = "Q191068",
GBP = "Q25224",
GEL = "Q4608",
GGP = "Q255792",
GHS = "Q183530",
GIP = "Q41429",
GMD = "Q202885",
GNF = "Q213311",
GTQ = "Q207396",
GYD = "Q213005",
HKD = "Q31015",
HNL = "Q4719",
HRK = "Q26360",
HTG = "Q203955",
HUF = "Q47190",
IDR = "Q41588",
ILS = "Q131309",
IMP = "Q27614",
INR = "Q80524",
IQD = "Q193094",
IRR = "Q188608",
ISK = "Q131473",
JEP = "Q270744",
JMD = "Q209792",
JOD = "Q203722",
JPY = "Q8146",
KES = "Q202882",
KGS = "Q35881",
KHR = "Q204737",
KID = "Q1049963",
KMF = "Q267264",
KPW = "Q106720",
KRW = "Q202040",
KWD = "Q193098",
KYD = "Q319885",
KZT = "Q173751",
LAK = "Q200055",
LBP = "Q201880",
LKR = "Q4596",
LRD = "Q242988",
LSL = "Q208039",
LYD = "Q190699",
MAD = "Q200192",
MDL = "Q181129",
MGA = "Q4584",
MKD = "Q177875",
MMK = "Q201875",
MNT = "Q183435",
MOP = "Q241214",
MRO = "Q207024",
MUR = "Q212967",
MVR = "Q206600",
MWK = "Q211694",
MXN = "Q4730",
MYR = "Q163712",
MZN = "Q200753",
NAD = "Q202462",
NGN = "Q203567",
NIO = "Q207312",
NKD = "Q94418",
NOK = "Q132643",
NPR = "Q202895",
NUD = "Q4165057",
NZD = "Q1472704",
OMR = "Q272290",
PAB = "Q210472",
PEN = "Q204656",
PGK = "Q200759",
PHP = "Q17193",
PKR = "Q188289",
PLN = "Q123213",
PND = "Q4165058",
PRB = "Q200979",
PYG = "Q207514",
QAR = "Q206386",
RON = "Q131645",
RSD = "Q172524",
RUB = "Q41044",
RWF = "Q4741",
SAR = "Q199857",
SBD = "Q4597",
SCR = "Q4595",
SDG = "Q271206",
SEK = "Q122922",
SGD = "Q190951",
SHP = "Q374453",
SLL = "Q4587",
SOS = "Q4603",
SQS = "Q737384",
SRD = "Q202036",
SSP = "Q244366",
STN = "Q193712",
SVC = "Q829043",
SYP = "Q240468",
SZL = "Q4823",
THB = "Q177882",
TJS = "Q199886",
TLD = "Q572213",
TMT = "Q486637",
TND = "Q4602",
TOP = "Q4613",
TRY = "Q172872",
TTD = "Q242890",
TVD = "Q4406",
TWD = "Q208526",
TZS = "Q4589",
UAH = "Q81893",
UGX = "Q4598",
USD = "Q4917",
UYU = "Q209272",
UZS = "Q487888",
VES = "Q56349362",
VND = "Q192090",
VUV = "Q207523",
WST = "Q4588",
XAF = "Q847739",
XCD = "Q26365",
XCG = "Q737779",
XOF = "Q861690",
XPF = "Q214393",
XSU = "Q1148329",
YER = "Q240512",
ZAR = "Q181907",
ZMW = "Q21596813",
ZWL = "Q73408"
}
}
3mbfe574g58jhctsu59qcj93y2lpvk6
Modulo:Hours
828
4824
72502
71061
2026-05-28T06:43:59Z
RolandUnger
168
Update
72502
Scribunto
text/plain
-- getting opening hours from Wikidata
-- module variable and administration
local hr = {
moduleInterface = {
suite = 'Hours',
serial = '2026-05-27',
item = 99600452
},
labelTable = nil,
typeTables = nil
}
-- module import
-- require( 'strict' )
local hi = require( 'Module:Hours/i18n' )
local wu = require( 'Module:Wikidata utilities' )
-- local variables
local categIds = {}
local showOptions = {}
local function isSet( s )
return s and s ~= ''
end
-- insert a value into a table only if it is set
local function tableInsert( tab, value )
if isSet( value ) then
table.insert( tab, value )
end
end
-- value count for any variable
local function getCount( tab )
return type( tab ) == 'table' and #tab or 0
end
local function getLabelFromTables( id )
local label = hi.dateIds[ id ]
if not label and hr.labelTable then
label = hr.labelTable[ id ]
end
if not label and hr.typeTables and hr.typeTables.idTable then
local item = hr.typeTables.typeTable[ hr.typeTables.idTable[ id ] ]
if item then
item = item.label or item.n or item
local at = mw.ustring.find( item, ',' )
if at then
item = mw.ustring.sub( item, 1, at - 1 )
end
label = mw.text.trim( item )
end
end
return label
end
-- getting normalized time hh:dd
local function getNormalizedTime( s )
local count
s, count = mw.ustring.gsub( s, hi.texts.timePattern, '%1:%2' )
return ( count > 0 ) and s or nil
end
function hr.formatTime( s )
local t = getNormalizedTime( s )
if not t then
return s
end
local formatStr = hi.texts.formatTime
t = mw.text.split( t, ':', true )
if #t == 1 then
t[ 2 ] = '00'
end
if hi.options.hour12 then
local isAM = true
local n = tonumber( t[ 1 ] )
if n > 12 then
isAM = false
t[ 1 ] = '' .. ( n - 12 )
end
formatStr = isAM and hi.texts.formatAM or hi.texts.formatPM
end
s = mw.ustring.format( formatStr, mw.text.trim( t[ 1 ] ),
mw.text.trim( t[ 2 ] ) )
if hi.options.leadingZero then
s = s:gsub( '^(%d):', '0%1:' )
else
s = s:gsub( '^0(%d):', '%1:' )
end
if hi.options.removeZeros then
s = s:gsub( '^(%d%d?):00', '%1' )
end
return s
end
-- getting label for a qualifier id
-- to save computing time firstly the id will fetched from Hours/i18n table
-- if available, otherwise from Wikidata
local function getLabelFromId( id, wikilang, fallbackLang )
if not isSet( id ) then
return ''
end
-- from table
local label = getLabelFromTables( id )
-- from Wikidata
if not label and mw.wikibase.isValidEntityId( id ) then
label = wu.getLabel( id, wikilang )
if not label and isSet( fallbackLang ) then
label = wu.getLabel( id, fallbackLang )
if label then
categIds.fallbackLabel = 1
end
end
if label then
categIds.hoursLabelFromWikidata = 1
end
end
-- abbreviate labels
if isSet( label ) then
for i, abbr in ipairs( hi.abbr ) do
label = mw.ustring.gsub( label, abbr.f, abbr.a )
end
label = mw.ustring.gsub( label, '', '' ) -- zero-width space
end
-- additional time formatting
if isSet( label ) then
if hi.months then
for full, short in pairs( hi.months ) do
label = mw.ustring.gsub( label, full, short )
end
end
label = hr.formatTime( label )
end
return label or ''
end
local function abbreviateTimeStr( s, all, pattern, repl )
if not isSet( s ) or not isSet( pattern ) or not repl then
return s or ''
end
if all then
s = mw.ustring.gsub( s, pattern, repl )
else
local matchPattern = mw.ustring.gsub( pattern, '%(%%d%)', '' )
local first, stop = mw.ustring.find( s, pattern )
if first then
local second = mw.ustring.find( s, pattern, stop + 1 )
if second and mw.ustring.match( s, matchPattern ) ==
mw.ustring.match( s, matchPattern, stop + 1 ) then
s = mw.ustring.gsub( s, pattern, repl, 1 )
end
end
end
return s
end
-- getting time period string
-- i: position in from and to arrays
-- id: label for P3035 value
local function getTimePeriod( from, to, i, id )
local result = ''
if id and ( id == getLabelFromTables( hi.times.daily )
or id == getLabelFromTables( hi.times.is24_7 ) )
and from and to and from[ i ] == getLabelFromTables( hi.times.Jan1 ) and
to[ i ] == getLabelFromTables( hi.times.Dec31 ) then
return ''
end
if from and isSet( from[ i ] ) and to and isSet( to[ i ] ) then
result = mw.ustring.format( hi.texts.fromTo, from[ i ], to[ i ] )
if isSet( hi.texts.hourPattern ) then
result = abbreviateTimeStr( result, hi.texts.hourReplAll,
hi.texts.hourPattern, hi.texts.hourRepl )
end
elseif from and isSet( from[ i ] ) then
result = mw.ustring.format( hi.texts.from, from[ i ] )
elseif to and isSet( to[ i ] ) then
result = mw.ustring.format( hi.texts.to, to[ i ] )
end
return result
end
-- collecting all maintenance categories
function hr.getCategories( formatStr )
local result = wu.getCategories( formatStr )
for k, v in pairs( categIds ) do
result = result .. ( hi.categories[ k ] or hi.categories.unknownError )
end
if showOptions.demo then
-- remove category links
result = result:gsub( '%[%[[^%[]*%]%]', '' )
end
return result
end
-- getting a string with listed days at which an establishment is closed
local function getClosed( arr )
return ( arr and #arr > 0 ) and mw.ustring.format( hi.texts.closed or '%s',
table.concat( arr, hi.texts.comma ) ) or ''
end
-- converting day range from Mo, Tu, We to Mo–We, and so on
local function getRange( arr, minPos, maxPos )
if maxPos > 0 and minPos > 0 and maxPos > minPos then
arr[ minPos ] = mw.ustring.format( hi.texts.fromTo, arr[ minPos ],
arr[ maxPos ] )
for i = maxPos, minPos + 1, -1 do
table.remove( arr, i )
end
end
end
-- looking for day ranges like Mo, Tu, We and so on and converting them
local function convertDayRange( arr )
local count = #arr
local minPos = 0
local maxPos = 0
local value, valueMin
while count > 0 do
value = hi.weekdays[ arr[ count ] ]
if not value then
getRange( arr, minPos, maxPos )
maxPos = 0
elseif maxPos == 0 then
maxPos = count
valueMin = value
elseif maxPos > 0 and value == valueMin - 1 then
minPos = count
valueMin = value
else
getRange( arr, minPos, maxPos )
maxPos = 0
end
count = count - 1
end
getRange( arr, minPos, maxPos )
end
-- concating non-empty strings
local function concatStrings( sep, str1, str2 )
local tab = {}
tableInsert( tab, str1 )
tableInsert( tab, str2 )
return table.concat( tab, sep )
end
-- add comment if not yet exists
local function addComment( tab, value )
if not isSet( value ) then
return
elseif #tab == 0 then
table.insert( tab, value )
else
for i = 1, #tab, 1 do
if tab[ i ] == value then
break
end
if i == #tab then
table.insert( tab, value )
end
end
end
end
-- main function for usage in Lua modules
-- entity: entity id or entity table
-- wikilang: content language of the wiki
-- fallbackLang: optional additional language for fallback
-- formatStr: optional format string for property categories
-- show: table of show options (addCategories, msg, nomsg) or nil
-- lastedit: dat of last edit. If false no date will be fetched
-- labelTabel: additional table with Q-id label pairs
function hr.getHoursFromWikidata( entity, wikilang, fallbackLang, formatStr,
show, lastEdit, labelTable, typeTables )
-- collecting days at which an establishment is closed
local closeDays = {}
local closeDaysHelper = {}
local withStateOfUse = false
local function mergeDays( days )
if not days or #days == 0 then
return
end
for i, day in ipairs( days ) do
if not closeDaysHelper[ day ] then
table.insert( closeDays, day )
closeDaysHelper[ day ] = ''
end
end
end
local function clearDays()
closeDays = {}
closeDaysHelper = {}
end
-- adding additional properties if an additional Q-id table is given
hr.labelTable = labelTable
hr.typeTables = typeTables
-- preparing show options
showOptions = show or {}
showOptions.addCategories = hi.options.addCategories
if showOptions.msg then
showOptions.addCategories = true
elseif showOptions.nomsg then
showOptions.addCategories = false
end
-- format string for property categories
if not isSet( formatStr ) then
formatStr = hi.categories.properties
end
-- 1st step: getting statements for P3025: open days
local statements = wu.getValuesWithQualifiers( entity, hi.wd.opened, nil,
hi.wd.all, hi.wd.retrieved, nil, getLabelFromId, wikilang, fallbackLang )
lastEdit = wu.getLastedit( lastEdit, statements )
-- converting statements to human-readable strings
local result = {}
local comments, s
local is24_7 = getLabelFromTables( hi.times.is24_7 )
for i, statement in ipairs( statements ) do
-- opening times
local times = {}
local count = math.max( getCount( statement[ hi.wd.hourOpenFrom ] ),
getCount( statement[ hi.wd.hourOpenTo ] ) )
if count > 0 then
for j = 1, count, 1 do
s = getTimePeriod( statement[ hi.wd.hourOpenFrom ],
statement[ hi.wd.hourOpenTo ], j )
if isSet( s ) then
table.insert( times, s )
elseif statement.value ~= is24_7 then
categIds.withoutTime = 1
end
end
elseif statement.value ~= is24_7 then
categIds.withoutTime = 1
end
s = table.concat( times, hi.texts.comma )
-- comments
comments = {}
count = math.max( getCount( statement[ hi.wd.dayOpenFrom ] ),
getCount( statement[ hi.wd.dayOpenTo ] ) )
for j = 1, count, 1 do
addComment( comments,
getTimePeriod( statement[ hi.wd.dayOpenFrom ],
statement[ hi.wd.dayOpenTo ], j, statement.value ) )
end
for j, key in ipairs( hi.wd.comments ) do
if statement[ key ] then
addComment( comments, table.concat( statement[ key ],
hi.texts.comma ) )
end
end
-- concating times and comments
times = {}
tableInsert( times, s )
s = table.concat( comments, hi.texts.comma )
if isSet( s ) then
table.insert( times, mw.ustring.format( hi.texts.parentheses, s ) )
end
local item = {}
tableInsert( item, table.concat( times, hi.texts.space ) )
-- close statements (P3026) as qualifiers for open days property (P3025)
mergeDays( statement[ hi.wd.closed ] )
if not hi.options.clusterClosed and ( i == #statements or
statements[ i ].value ~= statements[ i + 1 ].value ) then
convertDayRange( closeDays )
tableInsert( item, getClosed( closeDays ) )
clearDays()
end
s = table.concat( item, hi.texts.comma )
-- copying each statement to result table
if statement.sort2 == 1 then
tableInsert( result, { value = { statement.value }, times = s } )
elseif s ~= '' then
result[ #result ].times = concatStrings( hi.texts.comma,
result[ #result ].times, s )
end
end
-- checking for duplicates
for i = #result, 2, -1 do
if result[ i ].times == result[ i - 1 ].times then
for j, value in ipairs( result[ i ].value ) do
table.insert( result[ i - 1 ].value, value )
end
table.remove( result, i )
end
end
-- converting day range
for i = 1, #result, 1 do
local arr = result[ i ].value
convertDayRange( arr )
result[ i ] = concatStrings( hi.texts.space,
table.concat( arr, hi.texts.comma ), result[ i ].times )
end
-- 2nd step: getting separated close statements (P3026)
statements = wu.getValuesWithQualifiers( entity, hi.wd.closed,
nil, hi.wd.commentsForClosed, hi.wd.retrieved, nil, getLabelFromId, wikilang,
fallbackLang )
if #statements > 0 then
lastEdit = wu.getLastedit( lastEdit, statements )
-- getting closed values
local closed = {}
for i, statement in ipairs( statements ) do
local closedDate = {}
table.insert( closedDate, statement.value )
-- getting comments
comments = {}
for j, key in ipairs( hi.wd.commentsForClosed ) do
if statement[ key ] then
addComment( comments, table.concat( statement[ key ],
hi.texts.comma ) )
end
end
s = table.concat( comments, hi.texts.comma )
if isSet( s ) then
table.insert( closedDate, mw.ustring.format( hi.texts.parentheses, s ) )
end
table.insert( closed, table.concat( closedDate, hi.texts.space ) )
end
mergeDays( closed )
end
convertDayRange( closeDays )
tableInsert( result, getClosed( closeDays ) )
-- 3rd step: adding additional statements
statements = wu.getValuesWithQualifiers( entity, hi.wd.stateOfUse,
nil, {}, hi.wd.retrieved, nil, getLabelFromId, wikilang, fallbackLang )
if #statements > 0 then
lastEdit = wu.getLastedit( lastEdit, statements )
for i, statement in ipairs( statements ) do
if statement.value ~= '' then
withStateOfUse = true
table.insert( result, statement.value )
end
end
end
-- merging all statements
result = table.concat( result, hi.texts.semicolon )
-- adding maintenance categories
if result ~= '' then
categIds.hoursFromWikidata = 1
if withStateOfUse then
categIds.isClosed = 1
end
if showOptions.addCategories then
result = result .. hr.getCategories( formatStr )
end
end
return result, lastEdit
end
-- invoke helper functions
-- splitting show parameters
local function splitAndCheck( s )
local arr = {}
local err = {}
if isSet( s ) then
for i, v in ipairs( mw.text.split( s, ',', true ) ) do
v = mw.text.trim( v )
if not hi.show[ v ] then
table.insert( err, v )
else
arr[ v ] = ''
end
end
end
return arr, err
end
-- check if pareameters are valid
local function checkParameters( args )
local err = {}
if not args and type( args ) ~= 'table' then
return err
end
for k, v in pairs( args ) do
if not hi.params[ k ] then
table.insert( err, k )
end
end
return err
end
-- formating and concating error strings
local function getErrorStr( arr, formatStr )
return #arr == 0 and '' or
mw.ustring.format( formatStr, table.concat( arr, hi.texts.comma ) )
end
-- main function for template #invoke calls
-- id: Q id of an establishment
-- format: output format like 'opened at %s'
-- fallback: fallback language if labels are not available in content language
function hr.getHours( frame )
local args = frame.args
args.id = mw.text.trim( args.id or '' )
if not isSet( args.id ) or not mw.wikibase.isValidEntityId( args.id ) then
return hi.categories.invalidId
end
if not isSet( args.format ) then
args.format = hi.texts.format
else
local count
args.format, count = args.format:gsub( '%%s', '%%s' )
if count ~= 1 then
args.format = hi.texts.format
end
end
args.fallback = args.fallback or ''
local wikilang = mw.getContentLanguage():getCode()
local paramErr = checkParameters( args )
local show, showErr = splitAndCheck( args.show )
local result = hr.getHoursFromWikidata( args.id, wikilang,
args.fallback, '', show, false, nil )
if result ~= '' then
result = mw.ustring.format( args.format, result )
end
return result .. getErrorStr( paramErr, hi.categories.unknownParams )
.. getErrorStr( showErr, hi.categories.unknownShowOptions )
end
return hr
o2gau1a9fi7ssrdee6ezz6iml1aiml3
Modulo:LinkPhone
828
4826
72501
71075
2026-05-28T06:41:46Z
RolandUnger
168
Update
72501
Scribunto
text/plain
-- module variable and administration
local lp = {
moduleInterface = {
suite = 'LinkPhone',
serial = '2026-05-27',
item = 16354802
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local ln = require( 'Module:Link utilities/Phone numbers' )
ln.exceptions.service = li.serviceStrings
local lu = require( 'Module:Link utilities' )
local function formatNumber( number, size )
number = number:gsub( '-', ' ' )
if not li.options.formattingWikidata or size < 1 then
return number
end
local pos = number:match( '.* ()' ) -- find last space
if pos then
local first = number:sub( 1, pos - 1 )
local last = number:sub( pos, #number )
if tonumber( last ) then -- inserting additional spaces
local newLast = ''
while ( #last > size + 1 ) do
if newLast == '' then
newLast = last:sub( -size )
else
newLast = last:sub( -size ) .. ' ' .. newLast
end
last = last:sub( 1, #last - size )
end
if newLast ~= '' then
last = last .. ' ' .. newLast
end
end
pos = first:find( ' ' )
if li.options.addZeros and pos and ( pos ~= #first ) then
local country = first:sub( 1, pos - 1 )
local localCode = first:sub( pos + 1, #first )
if not ln.noZero[ country ] then
localCode = localCode:gsub( '[%(%)]', '' )
if localCode:sub( 1, 1 ) == '0' then
localCode = '(0)' .. localCode:sub( 2, #localCode )
else
localCode = '(0)' .. localCode
end
first = country .. ' ' .. localCode
end
end
number = first .. last
end
return number
end
-- look for phone-number patterns which are valid local numbers
local function checkNumberMatch( key, number )
local ar = ln.exceptions[ key ]
if not ar then
return false
end
for i = 1, #ar, 1 do
if number:find( ar[ i ] ) then
return true
end
end
return false
end
local function extractExtension( number )
local ext = ''
local t
for i, extension in ipairs( li.extensions ) do
t = mw.ustring.gsub( number, '^.*(' .. extension .. ')$', '%1' )
if t ~= number then
ext = t:gsub( '%s*=', ' ' ) -- RFC 3966
number = mw.ustring.gsub( number, '[%s%c]*(' .. extension .. ')$', '' )
break
end
end
return number, ext
end
-- handle a single phone number s
function lp.linkPhoneNumber( s, args, isDemo )
local number = mw.text.trim( s )
if number == '' then
return ''
end
local catPrefix = isDemo and ' [[:Category:' or '[[Category:'
local ext
local extraCats = ''
local comment, t
args.cc = args.cc:gsub( '%-', '' )
number, comment = lu.extractComment( number )
number, ext = extractExtension( number )
-- normalize country calling code
number = number:gsub( '^00+', '+' )
:gsub( '^%+%++', '+' )
-- add country calling code, remove lead zero
if args.cc ~= '' then
if li.options.withCountryCode and number:sub( 1, 1 ) ~= '+' then
number = args.cc .. ' ' .. number
end
if li.options.preventLeadZero and not ln.noZero[ args.cc ] then
number = number:gsub( '^(%' .. args.cc .. '%s+)%(+0%)+', '%1' )
:gsub( '%(+', '' ):gsub( '%)+', '' )
end
end
local exception = checkNumberMatch( args.cc,
mw.ustring.gsub( number, "[ '/%.%-%)]", '' ) )
-- formatting phone numbers retrieved from Wikidata
if args.format and not exception then
number = formatNumber( number, args.size )
end
if li.options.addZeros and not ln.zeroExceptions[ args.cc ] and not number:find( '^00' ) then
number = number:gsub( '^0', '(0)' )
end
if li.options.addZeros and args.cc ~= '' and not ln.zeroExceptions[ args.cc ] then
number = number:gsub( '^(%' .. args.cc .. ')( *)0', '%1%2(0)' )
end
-- plain is number for link
local plain = number
-- check if slashes are used
if plain:find( '/', 1, true ) then
extraCats = catPrefix .. li.categories.withSlash
end
-- remove delimiters -.()/' and spaces
-- including thin space
plain = mw.ustring.gsub( plain, "[ '/%.%-%)]", '' )
-- handling country code including ++49, 0049 etc.
if plain:sub( 1, 1 ) == '+' then
plain = plain:gsub( '%(0', '' ) -- zero in parenthesis
:gsub( '%(', '' )
else
plain = plain:gsub( '%(0', '0' )
if comment ~= '' and checkNumberMatch( 'service', comment ) then
exception = true
number = number:gsub( '[%(%)]', '' )
elseif args.isTollfree and checkNumberMatch( 'tollfree', plain ) then
exception = true
number = number:gsub( '[%(%)]', '' )
elseif checkNumberMatch( 'emergency', plain ) then
exception = true
number = number:gsub( '[%(%)]', '' )
elseif checkNumberMatch( args.cc, plain ) then
exception = true
elseif args.cc ~= '' then
if ln.noZero[ args.cc ] then
plain = args.cc .. plain:gsub( '^%(', '' )
elseif plain:sub( 1, 1 ) == '0' then
plain = args.cc .. plain:gsub( '^0', '' )
else
return s .. catPrefix .. li.categories.invalid
end
else
return s .. catPrefix .. li.categories.noCC
end
end
-- minimum 5 characters including country code
if not exception and #plain < 5 then
return s .. catPrefix .. li.categories.invalid
end
-- lower case letters for numbers are not allowed
if plain:find( '%l' ) then
return s .. catPrefix .. li.categories.invalid
elseif plain:find( '%u' ) then
-- substitude letters
local letters = { '', '[A-C]', '[D-F]', '[G-I]', '[J-L]', '[M-O]',
'[P-S]', '[T-V]', '[W-Z]' }
for i = 2, 9 do
plain = plain:gsub( letters[ i ], '' .. i )
end
end
-- remove zero from local area code
if args.cc ~= '' and not ln.zeroExceptions[ args.cc ] then
plain = plain:gsub( args.cc .. '0', args.cc )
end
-- final test
if not exception and not plain:match( '^%+%d+$' ) then
return s .. catPrefix .. li.categories.invalid
end
-- assemble number, link, ext, comment, and categories
t = '<span data-phone="' .. plain .. '" class="voy-listing-phone-number'
if not args.isFax then
t = t .. ' plainlinks nourlexpansion'
number = ( '[tel:%s %s]' ):format( plain, number )
end
if exception then
t = t .. ' voy-listing-phone-exception" title="' .. li.categories.onlyDomestic
end
t = t .. '">' .. number .. '</span>'
return t .. ( ext ~= '' and ( ' ' .. ext ) or '' ) ..
( comment ~= '' and ( ' ' .. comment ) or '' ) .. extraCats
end
function lp.linkPhoneNumbers( args )
local addNum = li.addNum
if args.isFax then
addNum = li.addNumFax
end
args.cc = args.cc:gsub( '^00', '+' ):gsub( '^%+%++', '+' )
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate numbers
local items = lu.splitItems( args.phone, li.delimiters )
-- analyse phone numbers
local result = ''
local i = 0
local s
for j, item in ipairs( items ) do
s = lp.linkPhoneNumber( item, args, isDemo )
if s ~= '' then
if result == '' then
result = s
else
if i == addNum then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > addNum then
result = result .. '</span>'
end
return result;
end
function lp.getTrunkPrefix( cc )
return ln.noZero[ cc ] and '' or '0'
end
return lp
mgnp1jmmcavg5bzb0kgoczzlqx2cceo
Modulo:LinkMail
828
4829
72499
72066
2026-05-28T06:41:40Z
RolandUnger
168
Update
72499
Scribunto
text/plain
-- module variable and administration
local lm = {
moduleInterface = {
suite = 'LinkMail',
serial = '2026-05-27',
item = 65157414
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )
-- check single email address
function lm._isEmail( s )
local result = 2
if s == nil or type( s ) ~= 'string' or #s > 254 or s:find( '%s' ) or
s:find( '%.%.' ) or s:find( '%.@' ) or s:find( '@[%.%-]' ) or
s:find( '%-%.' ) or s:find( '%.%-' ) or s:match( '^%.' ) then
return 0
end
local at
s, at = s:gsub( '@', '@' )
if at ~= 1 then
return 0
end
at = s:find( '@' )
local user = s:sub( 1, at - 1 )
local domain = s:sub( at + 1, #s )
if not user or not domain or #user > 64 or #domain > 253 then
return 0
end
-- handle user part
if not mw.ustring.match( user, "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
return 0
end
if not user:match( "^[%w!#&'/=_`{|}~%^%$%%%+%-%*%.%?]+$" ) then
result = 1
end
-- handle domain part
if not mw.ustring.match( domain, '^[%w%.%-]+%.%a%a+$' ) then
return 0
end
if not domain:match( '^[%w%.%-]+%.%a%a+$' ) then
result = 1
end
-- not yet analysed: texts in quotes in user part
-- added on demand
return result
end
function lm._linkMail( m, isDemo, ignoreUnicode )
m = mw.text.trim( m )
if m == '' then
return ''
end
local catPrefix = '[[Category:'
if isDemo then
catPrefix = ' [[:Category:'
end
local comment
m, comment = lu.extractComment( m )
m = m:gsub( 'mailto:', '' )
local isEmail = lm._isEmail( m )
local t
if isEmail > 0 then
t = '<span class="plainlinks nourlexpansion">[mailto:' .. m .. ' ' .. m .. ']</span>'
if isEmail == 1 and not ignoreUnicode then
t = t .. catPrefix .. li.categories.nonASCII
end
else
t = m .. catPrefix .. li.categories.invalidMail
end
if comment ~= '' then
t = t .. ' ' .. comment
end
return t
end
function lm.linkMailSet( args )
args.email = args.email or args[ 1 ] or ''
if args.email == '' then
return ''
end
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate email
local items = lu.splitItems( args.email, li.delimiters )
-- analyse emails
local result = ''
local i = 0
local s
for j, item in ipairs( items ) do
s = lm._linkMail( item, isDemo, args.ignoreUnicode )
if s ~= '' then
if result == '' then
result = s
else
if i == li.addMail then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > li.addMail then
result = result .. '</span>'
end
return result
end
-- #invoke call
function lm.linkMails( frame )
return lm.linkMailSet( frame.args )
end
-- template call
function lm.linkMailsTemplate( frame )
return lm.linkMailSet( frame:getParent().args )
end
return lm
bf08r1tvsqnb5fyluedwiaepzksmjyr
Modulo:LinkSkype
828
4830
72500
72063
2026-05-28T06:41:43Z
RolandUnger
168
Update
72500
Scribunto
text/plain
-- module variable and administration
local ls = {
moduleInterface = {
suite = 'LinkSkype',
serial = '2026-05-17',
item = 65157314
}
}
-- module import
-- require( 'strict' )
local li = require( 'Module:Link utilities/i18n' )
local lu = require( 'Module:Link utilities' )
-- check single skype name
function ls.isSkypeName( s )
if not s or type( s ) ~= 'string' then
return 0
end
local user = s
local param
local q = s:find( '?', 1, true )
if q then
user = s:sub( 1, q - 1 )
param = s:sub( q + 1, #s )
if not li.params[ param ] then
return 0
end
end
if #user > 32 or #user < 6 then
return 0
end
if not user:match( "^%l[%l%d%.,_%-]+$" ) then
return 0
end
return 1
end
function ls.SkypeLink( m, isDemo )
m = mw.text.trim( m )
if m == '' then -- empty string
return ''
end
local catPrefix = '[[Category:'
if isDemo then
catPrefix = ' [[:Category:'
end
local comment
local t
m, comment = lu.extractComment( m )
m = m:gsub( 'skype:', '' )
if ls.isSkypeName( m ) > 0 then
t = '<span class="voy-listing-skype-link">' .. m ..'</span>'
-- skype: link is performed by a JavaSript: MediaWiki:VCard.js
else
t = m .. catPrefix .. li.categories.invalidSkype
end
if comment ~= '' then
t = t .. ' ' .. comment
end
return t
end
function ls.linkSkypeSet( args )
args.skype = args.skype or args[ 1 ] or ''
if args.skype == '' then
return ''
end
local ns = mw.title.getCurrentTitle().namespace
local isDemo = ns == 10 or ns == 828
-- split separate Skype names
local items = lu.splitItems( args.skype, li.delimiters, ';' )
-- analyse Skype names
local i = 0
local s
local result = ''
for j = 1, #items, 1 do
s = ls.SkypeLink( items[ j ], isDemo )
if s ~= '' then
if result == '' then
result = s
else
if i == li.addSkype then
result = result .. '<span class="voy-listing-add-contact">'
end
result = result .. li.texts.comma .. s
end
i = i + 1
end
end
if i > li.addSkype then
result = result .. '</span>'
end
return result
end
-- #invoke call
function ls.linkSkype( frame )
return ls.linkSkypeSet( frame.args )
end
-- template call
function ls.linkSkypeTemplate( frame )
return ls.linkSkypeSet( frame:getParent().args )
end
return ls
7pawbh7zle417jgjqiwyfh6y2hehr1r
Ŝablono:Listigo/styles.css
10
4840
72509
72184
2026-05-28T06:51:12Z
RolandUnger
168
Update
72509
sanitized-css
text/css
/*
vCard and Marker styles
Version: 2026-05-17
*/
/*
Styles for Marker and vCard templates
*/
div.voy-vCard {
margin-top: 0.5em;
}
li div.voy-vCard {
margin-top: 0;
}
.voy-listing-outdent {
margin-left: 22px;
text-indent: -22px;
}
li .voy-listing-outdent {
margin-left: 0;
text-indent: -22px;
}
.voy-listing-name {
font-weight: bold;
}
.voy-listing-name-style-station {
background-color: var(--voy-header-background-base,#f0f0f0);
color: var(--color-base,#202122);
border: 1px solid #ddd;
}
.voy-listing-name-latin, .voy-listing-comment, .voy-listing-directions, .voy-listing-phone-exception {
font-style: italic;
}
.voy-listing-directions .mw-selflink {
font-weight: normal;
}
.voy-listing-hours, .voy-listing-checkin, .voy-listing-checkout, .voy-listing-price,
.voy-listing-payment, .voy-listing-subtype {
color: #888;
}
.voy-listing-phone-number {
white-space: nowrap;
}
.voy-listing-add-contact {
display: none;
}
.voy-vCard .voy-flag-icon {
position: relative;
top: 2px;
}
/*
Status and listing icons
*/
.voy-listing-icon, .voy-listing-social-media {
white-space: nowrap;
}
.voy-listing-icon:before, .voy-listing-social-media:before {
content: ' ';
white-space: normal;
}
.voy-listing-sister-wikidata:before {
content: none;
}
.voy-listing-icon-with-space {
white-space: normal !important;
}
.voy-listing-status-item {
list-style-type: none;
list-style-image: none;
text-indent: -20px;
}
.voy-listing-status-item li {
list-style-type: inherit;
text-indent: 0;
}
.vcard span, .vcard div.voy-listing-content {
text-indent: 0;
}
.voy-listing-status, .voy-listing-icon span, .voy-listing-social-media span {
display: inline-block;
position: relative;
top: 2px;
background-repeat: no-repeat;
background-position: left bottom;
background-size: 16px;
width: 16px;
height: 16px;
white-space: nowrap;
padding-left: 16px;
box-sizing: border-box;
overflow: hidden;
color: transparent;
}
.voy-listing-status + .voy-listing-status {
margin-left: 4px;
}
@media print {
.voy-listing-icon a, .voy-listing-icon bdi, .voy-listing-social-media a {
display: none !important;
}
.voy-listing-icon:before, .voy-listing-social-media:before {
content: '';
}
}
/* status icons */
.voy-listing-status-none, .voy-listing-status-stub {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/f3/Symbol_plain_grey.svg/120px-Symbol_plain_grey.svg.png');
}
.voy-listing-status-outline {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Start-icon.svg/120px-Start-icon.svg.png');
}
.voy-listing-status-usable {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d0/Symbol_keep_vote.svg/120px-Symbol_keep_vote.svg.png');
}
.voy-listing-status-guide {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/94/Symbol_support_vote.svg/120px-Symbol_support_vote.svg.png');
}
.voy-listing-status-star, .voy-listing-status-recommendation {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b4/Symbol_star_gold.svg/120px-Symbol_star_gold.svg.png');
}
.voy-listing-status-top-sight, .voy-listing-status-top-hotel, .voy-listing-status-top-restaurant {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/3/3a/Symbol_star2.svg/120px-Symbol_star2.svg.png');
}
/* Wikimedia sister site icons */
.voy-listing-sister-commons span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4a/Commons-logo.svg/120px-Commons-logo.svg.png');
background-size: auto 16px;
width: 12px;
padding-left: 12px;
}
.voy-listing-sister-wikidata span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d2/Wikidata-logo-without-paddings.svg/120px-Wikidata-logo-without-paddings.svg.png');
background-position: 0 4px;
}
.voy-listing-sister-wikipedia span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Antu_wikipedia.svg/120px-Antu_wikipedia.svg.png');
}
.voy-listing-sister-wikivoyage span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Wikivoyage-Logo-v3-icon.svg/120px-Wikivoyage-Logo-v3-icon.svg.png');
}
.voy-listing-sister-maps span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/4b/Antu_marble.svg/120px-Antu_marble.svg.png');
}
/* social-media site icons */
.voy-listing-social-media-facebook span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/b/b8/2021_Facebook_icon.svg/120px-2021_Facebook_icon.svg.png');
}
.voy-listing-social-media-flickr span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/44/Flickr.svg/120px-Flickr.svg.png');
}
.voy-listing-social-media-instagram span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/9/95/Instagram_logo_2022.svg/120px-Instagram_logo_2022.svg.png');
}
.voy-listing-social-media-rss span, .voy-listing-rss span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/4/43/Feed-icon.svg/120px-Feed-icon.svg.png');
}
.voy-listing-social-media-tiktok span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/d/d6/Iconoir_tiktok.svg/120px-Iconoir_tiktok.svg.png');
}
.voy-listing-social-media-x span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/c/ce/X_logo_2023.svg/120px-X_logo_2023.svg.png');
background-position: 0 2px;
}
.voy-listing-social-media-youtube span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/YouTube_full-color_icon_%282024%29.svg/120px-YouTube_full-color_icon_%282024%29.svg.png');
background-position: 0 3px;
}
/* additional icons */
.voy-listing-url span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/7/70/Applications-internet.svg/120px-Applications-internet.svg.png');
}
.voy-listing-unesco span {
background-image: url('//upload.wikimedia.org/wikipedia/commons/thumb/f/fd/WV-Unesco-icon-small.svg/120px-WV-Unesco-icon-small.svg.png');
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-night .voy-listing-social-media-x span {
filter: invert(100%);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-social-media-tiktok span,
html.skin-theme-clientpref-os .voy-listing-social-media-x span {
filter: invert(100%);
}
}
/* Wikidata icon is shown only for logged-in users. The class voy-user-login in
body tag is set by [[MediaWiki:InitListingTools.js]] script. */
.voy-listing-sister-wikidata a, .voy-listing-icon-with-space {
display: none;
}
body.voy-user-login .voy-listing-sister-wikidata a, body.voy-user-login .voy-listing-icon-with-space {
display: inline;
}
.voy-listing-subtype-icon + .voy-listing-subtype-icon {
margin-left: 2px;
}
.voy-listing-icon .external, .voy-listing-social-media .external, .voy-listing-url .external,
.voy-listing-rss .external {
color: #000;
background: none; /* unterdrücke Link-Symbol bei sozialen Medien */
padding-right: 0;
}
.voy-listing-content {
margin-top: 0.5em;
}
.voy-listing-content .voy-listing-next-paragraph { /* br-tag formatting in description */
display: block;
content: "";
margin-top: 0.5em;
}
.voy-listing-next-paragraph + div, .voy-listing-next-paragraph + style + div {
margin-top: 0 !important;
}
/*
Meta data
*/
.voy-listing-metadata {
font-size: 0.8em;
color: #888;
}
.voy-Marker .voy-listing-metadata {
display: none;
}
.voy-listing-metadata-item {
display: inline-block;
white-space: nowrap;
}
.voy-listing-outdated {
display: inline;
white-space: normal;
}
.voy-listing-item-dummy {
display: none;
}
.voy-listing-metadata-item:first-child:before,
.voy-listing-item-dummy + .voy-listing-metadata-item:before {
content: " (";
}
.voy-listing-metadata-item:after {
content: " | ";
}
.voy-listing-metadata-item:last-child:after {
content: ")";
}
.voy-listing-inline .voy-listing-metadata-item:before,
.voy-listing-inline .voy-listing-metadata-item:after {
content: "";
}
.voy-listing-inline .voy-listing-metadata-item {
box-sizing: border-box;
}
/* lastedit is not shown if the listing template is used within a text block.
voy-listing-inline is set in case of vCard parameter show = inline is set. */
.voy-listing-inline .voy-listing-lastedit {
display: none;
}
@media print {
.voy-listing-lastedit:after {
content: ")";
}
.voy-listing-inline .voy-listing-lastedit:after {
content: "";
}
}
.voy-listing-metadata-item button, .voy-listing-metadata .voy-listing-toSourcePage a {
display: inline-block;
border: none;
background-color: transparent;
color: #888;
font-family: sans-serif;
font-size: 1em;
cursor: pointer;
padding: 0;
}
.voy-listing-edit-button button, .voy-listing-metadata .voy-listing-toSourcePage a {
position: relative;
padding-left: 15px;
}
.voy-listing-info-button button {
position: relative;
padding-left: 12px;
}
.voy-listing-info-button button:before {
left: -2px;
top: -1px;
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/0/02/Maki-information-15.svg/120px-Maki-information-15.svg.png" );
background-size: 14px;
}
.voy-listing-metadata-item button:hover, .voy-listing-metadata-item button:focus,
.voy-listing-metadata-item button:active {
text-decoration: underline;
}
.voy-listing-inline .voy-listing-metadata-item button {
display: inline;
color: transparent;
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before,
.voy-listing-info-button button:before {
content: "";
display: block;
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 15px;
background-repeat: no-repeat;
background-position: 0 25%;
background-size: 12px;
filter: opacity(0.45);
}
.voy-listing-edit-button button:before, .voy-listing-toSourcePage a:before {
background-image: url( "//upload.wikimedia.org/wikipedia/commons/thumb/8/8a/OOjs_UI_icon_edit-ltr.svg/120px-OOjs_UI_icon_edit-ltr.svg.png" );
}
.voy-listing-inline .voy-listing-edit-button,
.voy-listing-inline .voy-listing-info-button {
width: 1.5em;
padding-left: 2px;
clip-path: polygon(0 0, 1.5em 0, 1.5em 100%, 0% 100%);
/* Workaround for overflow: clip */
}
@media screen {
html.skin-theme-clientpref-night .voy-listing-edit-button button:before,
html.skin-theme-clientpref-night .voy-listing-info-button button:before,
html.skin-theme-clientpref-night .voy-listing-toSourcePage a:before {
filter: invert(0.5);
}
}
@media screen and (prefers-color-scheme: dark) {
html.skin-theme-clientpref-os .voy-listing-edit-button button:before,
html.skin-theme-clientpref-os .voy-listing-info-button button:before,
html.skin-theme-clientpref-os .voy-listing-toSourcePage a:before {
filter: invert(0.5);
}
}
@media print {
.voy-listing-metadata .voy-listing-toSourcePage {
display: none;
}
}
.voy-listing-inline .voy-listing-info-button {
padding-left: 5px;
}
@media print {
.voy-listing-info-button, .voy-listing-edit-button {
display: none;
}
}
/*
CSS properties for marker-symbol wrapper
*/
.voy-listing-map {
display: inline-block;
position: relative;
border-radius: 3px;
line-height: 1.15em;
top: -1px;
}
.voy-listing-map a.external:link, .voy-listing-map a.external:visited, .voy-listing-map a.external:hover,
.voy-listing-map a.external:active {
text-decoration: none;
}
.voy-listing-map .mw-kartographer-maplink {
display: inline-block;
min-width: 1.5em;
height: 1.3em;
line-height: 1.3em;
padding: 1px;
border-radius: 3px;
/* for marker-copy */
top: 0;
position: relative;
font-size: 0.85em;
font-weight: bold;
font-style: normal;
text-align: center;
vertical-align: middle;
}
.mw-kartographer-maplink img {
vertical-align: -15%;
}
.voy-listing-map-inverse-img.voy-listing-map-is-symbol .mw-kartographer-maplink img {
filter: invert(100%);
}
/*
For media with missing or limited pointer capabilities, i.e. for mobile
devices etc. Secondary devices are considered, too.
See: https://www.w3.org/TR/mediaqueries-4/#any-input
*/
.voy-listing-tooltip-mobile .mw-kartographer-maplink {
min-width: 3em;
}
@media print {
.voy-listing-map .mw-kartographer-maplink {
min-width: 1.5em;
}
}
body.skin-minerva .voy-listing-map .mw-kartographer-maplink,
body.skin-timeless .voy-listing-map .mw-kartographer-maplink {
vertical-align: 10%;
}
kfics8v918bv0b9envzsatoho50fwpg