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 .. '&#x202F;' .. 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 = '&rlm;%s&lrm;' elseif not country.isRTL and page.isRTL then dir = 'ltr' fStr = '&lrm;%s&rlm;' 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( '%[', '&#x005B;' ):gsub( '%]', '&#x005D;' ) 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&#x202F;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&#x202F;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&#x202F;AR$" }, -- former ARP Q259502 = { iso = "AUD", add = "A$, c", f = "%s&#x202F;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&#x202F;CA$" }, Q4734 = { iso = "CDF", add = "CF" }, Q25344 = { iso = "CHF", add = "SFr", f = "%s&#x202F;SFr" }, Q507737 = { iso = "CKD", add = "CK$" }, Q200050 = { iso = "CLP", add = "CLP$" }, Q39099 = { iso = "CNY", add = "¥, RMB¥", f = "%s&#x202F;¥" }, 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&#x202F;%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&#x202F;€" }, Q2377701 = { iso = "EUR", add = "€, c, ct", mul = 0.01, f = "%s&#x202F;€" }, -- 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&#x202F;£" }, 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&#x202F;HK$" }, Q4719 = { iso = "HNL", add = "L" }, Q26360 = { iso = "HRK", add = "kn, lp" }, Q203955 = { iso = "HTG", add = "G" }, Q47190 = { iso = "HUF", add = "Ft", f = "%s&#x202F;Ft" }, Q41588 = { iso = "IDR", add = "Rp" }, Q131309 = { iso = "ILS", add = "₪" }, Q27614 = { iso = "IMP" }, Q80524 = { iso = "INR", add = "₹", f = "%s&#x202F;₹" }, 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&#x202F;¥" }, 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&#x202F;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&#x202F;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&#x202F;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&#x202F;฿" }, 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&#x202F;$" }, Q209272 = { iso = "UYU", add = "$U" }, Q487888 = { iso = "UZS", add = "So'm" }, Q56349362= { iso = "VES", add = "Bs." }, -- former VEF Q192090 = { iso = "VND", add = "₫", f = "%s&#x202F;₫" }, 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&#x202F;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