উইকিঅভিধান
bnwiktionary
https://bn.wiktionary.org/wiki/%E0%A6%AA%E0%A7%8D%E0%A6%B0%E0%A6%A7%E0%A6%BE%E0%A6%A8_%E0%A6%AA%E0%A6%BE%E0%A6%A4%E0%A6%BE
MediaWiki 1.47.0-wmf.4
case-sensitive
মিডিয়া
বিশেষ
আলাপ
ব্যবহারকারী
ব্যবহারকারী আলাপ
উইকিঅভিধান
উইকিঅভিধান আলোচনা
চিত্র
চিত্র আলোচনা
মিডিয়াউইকি
মিডিয়াউইকি আলোচনা
টেমপ্লেট
টেমপ্লেট আলোচনা
সাহায্য
সাহায্য আলোচনা
বিষয়শ্রেণী
বিষয়শ্রেণী আলোচনা
পরিশিষ্ট
পরিশিষ্ট আলোচনা
ছন্দ
ছন্দ আলোচনা
থিসরাস
থিসরাস আলোচনা
উদ্ধৃতি
উদ্ধৃতি আলোচনা
TimedText
TimedText talk
মডিউল
মডিউল আলাপ
ইভেন্ট
ইভেন্ট আলোচনা
উইকিঅভিধান:আলোচনাসভা
4
2595
509294
508727
2026-05-27T17:15:27Z
MediaWiki message delivery
2534
/* ২০২৬ সালের ইউ৪সি নির্বাচনে এখনই ভোট দিন */ নতুন অনুচ্ছেদ
509294
wikitext
text/x-wiki
{{উইকিঅভিধান:আলোচনাসভা/শীর্ষ}}[[বিষয়শ্রেণী:উইকিঅভিধানের প্রশাসন]]
<!-- অনুগ্রহপূর্বক নতুন আলোচনাসূত্র সবার নিচে যোগ করুন, ধন্যবাদ। -->
__NEWSECTIONLINK__
<!-- <div style='border:1px solid red; padding: 5px'>
{{উইকিঅভিধান:আলোচনাসভা/পাঠক প্রতিবেদন}}</div> -->
==উইকিমিডিয়া আন্দোলন সনদ সংক্রান্ত আলোচনায় যুক্ত হওয়ার জন্য আমন্ত্রণ (১)==
প্রিয় উইকিমিডিয়ানবৃন্দ,
আশা করি সকলেই ভালো আছেন। আপনারা অনেকেই হয়তো ইতোমধ্যে অবগত আছেন যে, উইকিমিডিয়া আন্দোলন সনদ খসড়া প্রণয়ন কমিটি (MCDC) বর্তমানে আন্দোলন সনদের খসড়া অধ্যায় সম্পর্কে বিভিন্ন উইকিমিডিয়া সম্প্রদায়ের মতামত সংগ্রহ করছে। তারই অংশ হিসেবে আমরা নিশ্চিত করতে চাই যে বাংলা উইকিমিডিয়ানদের সম্প্রদায়ও এই প্রক্রিয়ার সাথে সম্পূর্ণভাবে জড়িত হয়ে সুচিন্তিত প্রতিক্রিয়া প্রদান করতে পারে। এই লক্ষ্যে আগামী ২১ অক্টোবর বাংলাদেশ সময় রাত ৮:০০ টায় (ভারতীয় সময় ৭:৩০) আমরা একটি আলোচনা সভার আয়োজন করা হয়েছে।
উইকিমিডিয়া আন্দোলন সনদ তথা মুভমেন্ট চার্টারের সাথে নিজেকে পরিচিত করতে এবং প্রতিক্রিয়া, মন্তব্য ও অভিমত প্রদানের মাধ্যমে সনদ কমিটিকে সহযোগিতার জন্য আমরা আপনাকে আলোচনায় যুক্ত হতে অনুরোধ করছি। অনুগ্রহ করে [https://docs.google.com/forms/d/e/1FAIpQLSdKjsLENwWDz6JLDR2G6lGKY87jwR-CGVX2SJko2mnlFVQwqw/viewform?usp=sf_link '''এই ফর্মটি'''] পূরণ করে আমাদেরকে কথোপকথনটি প্রস্তুতে সহযোগিতা করুন।
<small style='color:grey'>বি.দ্র.
*আলোচনায় অংশগ্রহণকারীদের জন্য ইন্টারনেট ও অন্যান্য সহায়তা প্রদান করা হবে।
*কথোপকথনের পুর্বপ্রস্তুতি হিসেবে আপনি চাইলে খসড়া সনদটি [[m:Movement_Charter/Content/One-page_draft/bn|এখান থেকে]] পড়ে নিতে পারেন।
*আন্দোলন সনদ প্রতিনিধি কর্মসূচি সম্পর্ক জানতে [[m:Movement Charter Ambassador Program for Bengali Community|মেটা-পাতা দেখুন]]।
</small>
শুভেচ্ছান্তে,<br>
[[User:Aishik Rehman|'''ঐশিক রেহমান''']]<br>
আন্দোলন সনদ প্রতিনিধি (বাংলা উইকি সম্প্রদায়)<br>
১৬:২২, ২০ অক্টোবর ২০২৩ (ইউটিসি)
== The Vector 2022 skin as the default in three weeks? ==
{{atop
| status =
| result =
}}
<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">আলোচনা</span>]]) ০১:০৯, ২৬ অক্টোবর ২০২৩ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=User:SGrabarczuk_(WMF)/sandbox/MM/Varia&oldid=25791651-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:SGrabarczuk (WMF)@metawiki পাঠিয়েছেন -->
{{abot}}
== পুনরায় চালু হয়েছে "অভ্যর্থনা কমিটি বট" ==
এই উইকিতে "অভ্যর্থনা কমিটি বট"-এর বট অধিকার থাকলেও, বটটি অনেকদিন ধরে নিষ্ক্রিয় ছিল। পুনরায় চালু করেছি, তবে কার্যপদ্ধতিতে পরিবর্তন আছে। একটি পরিবর্তন হল, অ্যাকাউন্ট তৈরির পর নয়, প্রথম সম্পাদনার পরে বট স্বাগতম বার্তা দিবে (বাংলা উইকিপিডিয়ার মত) এবং আরেকটি হল পর্যাপ্ত বৈশ্বিক সম্পাদনা থাকলে বট আর স্বাগতম জানাবে না (কারণ আমার ধারণা বৈশ্বিক টহলকারীরা ইতিমধ্যেই অভিজ্ঞ, যেখানে স্বাগতম বার্তা মূলত নতুনদের জন্য)। পুনরায় চালু হওয়া ও কার্যপদ্ধতির পরিবর্তন নিয়ে আপনারা মতামত দিতে পারেন। [[ব্যবহারকারী:Ahmad Kanik|Ahmad Kanik]] ([[ব্যবহারকারী আলাপ:Ahmad Kanik|আলাপ]]) ০৮:৪৮, ২৯ নভেম্বর ২০২৩ (ইউটিসি)
== <span lang="en" dir="ltr" class="mw-content-ltr">(New) Feature on [[mw:Special:MyLanguage/Help:Extension:Kartographer|Kartographer]]: Adding geopoints via QID</span> ==
<div lang="en" dir="ltr" class="mw-content-ltr">
<section begin="Body"/>Since September 2022, it is possible to create geopoints using a QID. Many wiki contributors have asked for this feature, but it is not being used much. Therefore, we would like to remind you about it. More information can be found on the [[M:WMDE_Technical_Wishes/Geoinformation/Geopoints via QID|project page]]. If you have any comments, please let us know on the [[M:Talk:WMDE Technical Wishes/Geoinformation/Geopoints via QID|talk page]]. – Best regards, the team of Technical Wishes at Wikimedia Deutschland
<section end="Body"/>
</div>
[[M:User:Thereza Mengs (WMDE)|Thereza Mengs (WMDE)]] ১২:৩১, ১৩ ডিসেম্বর ২০২৩ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=25955829-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Thereza Mengs (WMDE)@metawiki পাঠিয়েছেন -->
== Do you use Wikidata in Wikimedia sibling projects? Tell us about your experiences ==
<div lang="en" dir="ltr" class="mw-content-ltr">
''Note: Apologies for cross-posting and sending in English.''
Hello, the '''[[m:WD4WMP|Wikidata for Wikimedia Projects]]''' team at Wikimedia Deutschland would like to hear about your experiences using Wikidata in the sibling projects. If you are interested in sharing your opinion and insights, please consider signing up for an interview with us in this '''[https://wikimedia.sslsurvey.de/Wikidata-for-Wikimedia-Interviews Registration form]'''.<br>
''Currently, we are only able to conduct interviews in English.''
The front page of the form has more details about what the conversation will be like, including how we would '''compensate''' you for your time.
For more information, visit our ''[[m:WD4WMP/AddIssue|project issue page]]'' where you can also share your experiences in written form, without an interview.<br>We look forward to speaking with you, [[m:User:Danny Benjafield (WMDE)|Danny Benjafield (WMDE)]] ([[m:User talk:Danny Benjafield (WMDE)|talk]]) 08:53, 5 January 2024 (UTC)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/WD4WMP/ScreenerInvite&oldid=26027495-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Danny Benjafield (WMDE)@metawiki পাঠিয়েছেন -->
== Reusing references: Can we look over your shoulder? ==
''Apologies for writing in English.''
The Technical Wishes team at Wikimedia Deutschland is planning to [[m:WMDE Technical Wishes/Reusing references|make reusing references easier]]. For our research, we are looking for wiki contributors willing to show us how they are interacting with references.
* The format will be a 1-hour video call, where you would share your screen. [https://wikimedia.sslsurvey.de/User-research-into-Reusing-References-Sign-up-Form-2024/en/ More information here].
* Interviews can be conducted in English, German or Dutch.
* [[mw:WMDE_Engineering/Participate_in_UX_Activities#Compensation|Compensation is available]].
* Sessions will be held in January and February.
* [https://wikimedia.sslsurvey.de/User-research-into-Reusing-References-Sign-up-Form-2024/en/ Sign up here if you are interested.]
* Please note that we probably won’t be able to have sessions with everyone who is interested. Our UX researcher will try to create a good balance of wiki contributors, e.g. in terms of wiki experience, tech experience, editing preferences, gender, disability and more. If you’re a fit, she will reach out to you to schedule an appointment.
We’re looking forward to seeing you, [[m:User:Thereza Mengs (WMDE)| Thereza Mengs (WMDE)]]
<!-- https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=25956752-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Thereza Mengs (WMDE)@metawiki পাঠিয়েছেন -->
== <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)]] ১৮:০৯, ১৯ জানুয়ারি ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25853527-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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)]] ১৭:০১, ৩১ জানুয়ারি ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=25853527-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== ইউসিওসি সমন্বয় কমিটির সনদ অনুমোদনের ভোটের ফলাফল ঘোষণা ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/wiki/Universal Code of Conduct/Coordinating Committee/Charter/Announcement - results|বার্তাটি মেটা-উইকিতে আরও একাধিক ভাষায় অনুবাদ করা হয়েছে।]] [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}}]''
প্রিয় সবাই,
সার্বজনীন আচরণবিধির অগ্রগতি অনুসরণ করার জন্য সবাইকে ধন্যবাদ। আমি আজকে আপনাদের [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|ইউসিওসি সমন্বয় কমিটির]] [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Charter/Voter_information|সনদ অনুমোদনের ভোটের]] ফলাফল জানানোর জন্য বার্তাটি দিচ্ছি। মোট 1746জন অবদানকারী সনদ অনুমোদনের প্রক্রিয়ায় ভোটদান করেছেন যার মধ্যে 1249জন ভোটার সনদটি সমর্থন করেছেন এবং 420জন ভোটার সমর্থন করেননি। ভোটদানের সময় ভোটারদের সনদটি সম্পর্কে মন্তব্য করার উপায়ও উন্মুক্ত ছিলো।
ভোটদানের পরিসংখ্যানের একটি প্রতিবেদন এবং ভোটারদের মন্তব্যের একটি সারসংক্ষেপ আগামী কয়েক সপ্তাহের মধ্যে মেটা-উইকিতে প্রকাশিত হবে।
পরবর্তী পদক্ষেপ সম্পর্কে শীঘ্রই জানার জন্য অনুগ্রহ করে অপেক্ষা করুন।
ইউসিওসি প্রকল্প দলের পক্ষে,<section end="announcement-content" />
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] ১৮:২৪, ১২ ফেব্রুয়ারি ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26160150-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== [[উইকিঅভিধান:উইকিঅভিধান লিখন প্রতিযোগিতা ২০২৪|উইকিঅভিধান লিখন প্রতিযোগিতা ২০২৪]] ==
সুপ্রিয় সুধী, আমি উইকি অভিধানে প্রথমবারের মতো একটি প্রতিযোগিতা আয়োজনের পরিকল্পনা করছি। এখানে নতুন ভুক্তি তৈরি ও বিদ্যমান অগোছালো ভুক্তিগুলো মান উন্নয়ন করা হবে। প্রতিযোগিতার লক্ষ্য হচ্ছে, যথাসম্ভব বাংলা ভুক্তির সংখ্যা বাড়ানো ও উইকিঅভিধানকে বিস্তৃত সম্প্রদায়ের সাথে পরিচিত করানো। এই প্রতিযোগিতা সফলভাবে সম্পন্ন করার লক্ষ্যে উইকিমিডিয়া ফাউন্ডেশন কাছে গ্ৰ্যান্ট চাওয়া হয়েছে, মেটা উইকিতে গ্ৰ্যান্টের পাতাটি প্রকাশিত হলে এখানে লিংক শেয়ার করা হবে। এই প্রতিযোগিতার পরিকল্পনা নিয়ে কারও কোনো মতামত বা পরামর্শ থাকলে এখানে কিংবা প্রয়োজন অনুসারে ব্যক্তিগতভাবে জানানোর অনুরোধ করছি। ধন্যবাদ -- [[ব্যবহারকারী:MdsShakil|MdsShakil]] ([[ব্যবহারকারী আলাপ:MdsShakil|আলাপ]]) ১৯:২২, ২৫ ফেব্রুয়ারি ২০২৪ (ইউটিসি)
:লিংক: https://meta.wikimedia.org/wiki/Grants:Programs/Wikimedia_Community_Fund/Rapid_Fund/Bangla_Wikibooks_and_Wiktionary_writing_contest_2024_(ID:_22472684) [[ব্যবহারকারী:MdsShakil|MdsShakil]] ([[ব্যবহারকারী আলাপ:MdsShakil|আলাপ]]) ১৫:৫৪, ২৬ ফেব্রুয়ারি ২০২৪ (ইউটিসি)
* {{সমর্থন}} --[[ব্যবহারকারী:আফতাবুজ্জামান|আফতাবুজ্জামান]] ([[ব্যবহারকারী আলাপ:আফতাবুজ্জামান|আলাপ]]) ১৮:৫৭, ২৭ ফেব্রুয়ারি ২০২৪ (ইউটিসি)
:এটা কি এখনো আছে? আমি এই প্রতিযোগিতায় অংশ নিতে আগ্রহী। পাশাপাশি এই প্রতিযোগিতা ছাড়াও এমনিতেও শব্দ ভাণ্ডার যোগ করতে চাই কিন্তু আমি জানি না কি করে করতে হয়, একটু সহায়তা চাই এই বিষয়ে । [[ব্যবহারকারী:Rifat Paradoxical|Rifat Paradoxical]] ([[ব্যবহারকারী আলাপ:Rifat Paradoxical|আলাপ]]) ০৮:৪০, ১৯ জুন ২০২৪ (ইউটিসি)
== <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)]] ১৬:২৫, ৫ মার্চ ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26276337-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== "ডাচ" ভাষার নাম পরিবর্তনের প্রস্তাব ==
বাংলায় [[গ্যাস]] ভুক্তি তৈরি করার সময় লক্ষ করেছি যে এখানে ওলন্দাজ ভাষাকে বোঝানোর জন্য ইংরেজি নাম "ডাচ" (Dutch) ব্যবহার করা হয়েছে, যা বাংলা উইকিপিডিয়ার সাথে সঙ্গত নয় (সেখানে একে "{{w|ওলন্দাজ ভাষা}}" বলে অভিহিত করা হয়েছে)। তাই উইকিঅভিধানে এই ভাষার নাম "ওলন্দাজ" রাখার প্রস্তাব রইল। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ০৮:৩৫, ১০ মার্চ ২০২৪ (ইউটিসি)
== <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)]]১৯:৫৭, ১২ মার্চ ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26349432-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:MPossoupe (WMF)@metawiki পাঠিয়েছেন -->
== আপনার উইকি শীঘ্রই পঠন মোডে যাবে ==
<section begin="server-switch"/><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|এই বার্তাটি অন্য ভাষায় পড়ুন]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
[[foundation:|উইকিমিডিয়া ফাউন্ডেশন]] তার উপাত্ত কেন্দ্রগুলির মধ্যে ট্রাফিক আনা-নেওয়ার বিষয়টি পরীক্ষা করবে। এটি নিশ্চিত করবে যে উইকিপিডিয়া এবং উইকিমিডিয়ার অন্যান্য উইকিসমূহ এমনকি একটি দুর্যোগের পরেও অনলাইন থাকবে।
সকল ট্রাফিক সুইচ করার তারিখ হলো '''{{#time:j xg|2024-03-20|bn}}'''। পরীক্ষাটি শুরু হবে '''[https://zonestamp.toolforge.org/{{#time:U|2024-03-20T14:00|en}} {{#time:H:i e|2024-03-20T14:00}}]'''-তে (বাংলাদেশ সময় রাত ৮টায় ও পশ্চিমবঙ্গ সময় রাত ৭টা ৩০ মিনিটে)।
দুর্ভাগ্যবশত, [[mw:Special:MyLanguage/Manual:What is MediaWiki?|মিডিয়াউইকির]] কিছু সীমাবদ্ধতার কারণে, এই পরিবর্তনের সময় সব সম্পাদনা অবশ্যই বন্ধ রাখতে হবে। এই ব্যাঘাত ঘটানোর জন্য আমরা ক্ষমাপ্রার্থী, এবং আমরা ভবিষ্যতে এটিকে হ্রাস করার জন্য কাজ করছি।
'''সব উইকিতে অল্প সময়ের জন্য, আপনি সম্পাদনা করতে পারবেন না, তবে আপনি উইকি পড়তে সক্ষম হবেন।'''
*আপনি {{#time:l j xg Y|2024-03-20|bn}}-এ প্রায় এক ঘণ্টা পর্যন্ত সম্পাদনা করতে পারবেন না।
*আপনি যদি এই সময়ে সম্পাদনা করার বা সংরক্ষণ করার চেষ্টা করেন, তাহলে আপনি একটি ত্রুটি বার্তা দেখতে পাবেন। আমরা আশা করি যে কোনও সম্পাদনা এই সময়ের মধ্যে নষ্ট হবে না, কিন্তু আমরা তার নিশ্চয়তা দিতে পারছি না। আপনি যদি ত্রুটি বার্তাটি দেখতে পান, তাহলে অনুগ্রহ করে অপেক্ষা করুন যতক্ষণ না সবকিছু স্বাভাবিক অবস্থায় ফিরে আসছে। এরপর আপনি আপনার সম্পাদনা সংরক্ষণ করতে সক্ষম হবেন। সতর্কতাস্বরূপ, আমরা সুপারিশ করছি যে উক্ত সময়ে আপনি আপনার সম্পাদনার একটি অনুলিপি তৈরি করে রাখুন।
''অন্যান্য প্রভাব'':
*পটভূমির কাজগুলো ধীর হবে এবং কিছু নাও কাজ করতে পারে। লাল লিঙ্কগুলো স্বাভাবিকের মত দ্রুত হালনাগাদ নাও হতে পারে। আপনি যদি একটি নিবন্ধ তৈরি করেন যা ইতিমধ্যে অন্য কোথাও সংযুক্ত আছে, সেক্ষেত্রে লিঙ্ক স্বাভাবিকের চেয়ে বেশি সময় ধরে লাল থাকবে। কিছু দীর্ঘ চলমান স্ক্রিপ্ট বন্ধ করতে হবে।
* আমরা আশা করি যে কোড হালনাগাদগুলি অন্য সপ্তাহের মতো চলবে। তবে যদি অপারেশনের পর প্রয়োজন হয়, কিছু ক্ষেত্রে কোড হালনাগাদ বন্ধ থাকতে পারে।
* [[mw:Special:MyLanguage/GitLab|গিটল্যাব]] প্রায় ৯০ মিনিটের জন্য অনুপলব্ধ থাকবে।
যদি প্রয়োজন হয় তাহলে এই প্রকল্পটি স্থগিত করা হতে পারে। আপনি [[wikitech:Switch_Datacenter|wikitech.wikimedia.org তে সময়সূচি পড়তে পারেন]]। যেকোনো পরিবর্তন সময়সূচীতে ঘোষণা করা হবে। এই সম্পর্কে আরও বিজ্ঞপ্তি দেওয়া হবে। এই কার্যক্রমটি শুরু হওয়ার ৩০ মিনিট পূর্বে সমস্ত উইকিতে একটি ব্যানার প্রদর্শন করা হবে। '''দয়া করে আপনার সম্প্রদায়কে এই তথ্যটি জানান।'''</div><section end="server-switch"/>
[[user:Trizek (WMF)|Trizek (WMF)]], ০০:০০, ১৫ মার্চ ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=25636619-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Trizek (WMF)@metawiki পাঠিয়েছেন -->
== <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)]] ২০:২১, ২৫ এপ্রিল ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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> ২১:২৩, ১৪ মে ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:SSethi (WMF)@metawiki পাঠিয়েছেন -->
== সহোদর প্রকল্পের জীবনচক্রের কার্যপ্রণালী সম্পর্কে মতামত জানাতে আমন্ত্রণ ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle/Invitation for feedback (MM)|মেটা উইকিতে আরো বেশ কিছু ভাষায় বার্তাটির অনূদিত সংস্করণ পাওয়া যাবে।]] [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]]
প্রিয় সম্প্রদায়ের সদস্যবৃন্দ,
[[:m:Special:MyLanguage/Wikimedia Foundation Board of Trustees|উইকিমিডিয়া ফাউন্ডেশনের ট্রাস্টি বোর্ডের]] [[:m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee|সম্প্রদায় বিষয়ক কমিটি]] (সিএসি) আপনাকে '''[[:m:Special:MyLanguage/Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle|সহোদর প্রকল্পের জীবনচক্রের কার্যপ্রণালীর খসড়ার]]''' উপর মতামত দেওয়ার জন্য আমন্ত্রণ জানাচ্ছে। এই খসড়ায় উইকিমিডিয়ার সহোদর প্রকল্পগুলি চালু এবং বন্ধ করার জন্য প্রস্তাবিত পদক্ষেপ এবং প্রয়োজনীয়তার রূপরেখা দেওয়া হয়েছে এবং এর লক্ষ্য যে কোনও নতুন অনুমোদিত প্রকল্প চালু করলে সেটি যেন সাফল্য পায় তা নিশ্চিত করা। এটি প্রকল্পের ভাষা সংস্করণ চালু বা বন্ধ করার পদ্ধতি থেকে পৃথক, যা [[:m:Special:MyLanguage/Language committee|ভাষা কমিটি]] বা [[m:Special:MyLanguage/Closing_projects_policy|প্রকল্প বন্ধকরণ নীতি]] দ্বারা পরিচালিত হয়।
আপনি [[:m:Special:MyLanguage/Talk:Wikimedia Foundation Community Affairs Committee/Procedure for Sibling Project Lifecycle#Review|এই পাতায়]] এই নিয়ে বিশদ তথ্য খুঁজে পেতে পারেন, পাশাপাশি আজ থেকে '''২৩ জুন ২০২৪''' তারিখ পর্যন্ত আপনার মতামত জানাতে পারেন।
এছাড়া আপনি কাজ করেন বা সমর্থন করেন এমন আগ্রহী প্রকল্পের সম্প্রদায়কে এই সম্পর্কে তথ্য জানাতে পারেন, এবং আপনি কার্যপ্রণালীটি আরও ভাষায় অনুবাদ করতে আমাদের সহায়তা করতে পারেন, যাতে লোকজন তাদের নিজস্ব ভাষা ব্যবহার করে আলোচনায় যোগ দিতে পারে।
সিএসি-র পক্ষ থেকে,<section end="announcement-content" />
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] ০২:২৬, ২২ মে ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== থিসরাসের পরিভাষা ==
থিসরাসে synonym (সমার্থক) ও antonym (বিপরীতার্থক) শব্দের বাংলা পরিভাষা জানা থাকলেও hypernym, hyponym, meronym ও holonym শব্দের পরিভাষা জানলে ভালো হতো। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ০৫:৩২, ২ জুন ২০২৪ (ইউটিসি)
:পরিভাষাগুলি হলো hypernym (অধ্যর্থক শব্দ), hyponym (উপার্থক শব্দ), meronym (অংশার্থক শব্দ) ও holonym (সমগ্রার্থক শব্দ)। - [[ব্যবহারকারী:Salil Kumar Mukherjee|Salil Kumar Mukherjee]] ([[ব্যবহারকারী আলাপ:Salil Kumar Mukherjee|আলাপ]]) ১৫:৩৮, ২ জুন ২০২৪ (ইউটিসি)
== প্রথম সর্বজনীন আচরণবিধি সমন্বয় কমিটি ঘোষণা ==
<section begin="announcement-content" />
:''[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024/Announcement – results|মেটা উইকিতে আরো বেশ কিছু ভাষায় বার্তাটির অনূদিত সংস্করণ পাওয়া যাবে।]] [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}}]''
প্রিয় সবাই,
পর্যালোচনাকারীরা ভোটের ফলাফল যাচাই-বাছাই করেছেন। আমরা প্রথম [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2024|সর্বজনীন আচরণবিধি সমন্বয় কমিটির নির্বাচনের]] ফলাফল ঘোষণা করছি।
আমরা নিম্নলিখিত ব্যক্তিদের ইউ৪সি-র আঞ্চলিক সদস্য হিসেবে ঘোষণা করতে পেরে আনন্দিত, যারা দুই বছর মেয়াদে দায়িত্ব পালন করবেন:
* উত্তর আমেরিকা (মার্কিন যুক্তরাষ্ট্র ও কানাডা)
** –
* উত্তর ও পশ্চিম ইউরোপ
** [[m:Special:MyLanguage/User:Ghilt|Ghilt]]
* লাতিন আমেরিকা ও ক্যারিবীয়
** –
* মধ্য ও পূর্ব ইউরোপ (সিইই)
** —
* উপ-সাহারীয় আফ্রিকা
** –
* মধ্যপ্রাচ্য ও উত্তর আফ্রিকা
** [[m:Special:MyLanguage/User:Ibrahim.ID|Ibrahim.ID]]
* পূর্ব, দক্ষিণ পূর্ব এশিয়া ও প্রশান্ত মহাসাগরীয় অঞ্চল (ইএসইএপি)
** [[m:Special:MyLanguage/User:0xDeadbeef|0xDeadbeef]]
* দক্ষিণ এশিয়া
** –
নিম্নলিখিত ব্যক্তিরা ইউ৪সি-র সম্প্রদায় সদস্য হিসেবে নির্বাচিত হয়েছেন, যারা এক বছর মেয়াদে দায়িত্ব পালন করবেন:
* [[m:Special:MyLanguage/User:Barkeep49|Barkeep49]]
* [[m:Special:MyLanguage/User:Superpes15|Superpes15]]
* [[m:Special:MyLanguage/User:Civvì|Civvì]]
* [[m:Special:MyLanguage/User:Luke081515|Luke081515]]
* –
* –
* –
* –
এই প্রক্রিয়ায় অংশগ্রহণকারী সকলকে আবারও ধন্যবাদ এবং উইকিমিডিয়া আন্দোলন ও সম্প্রদায়ের মধ্যে নেতৃত্বদানের জন্য এবং উৎসর্গের জন্য প্রার্থীদের প্রতি অনেক কৃতজ্ঞতা জানাচ্ছি।
আগামী কয়েক সপ্তাহের মধ্যে, ইউ৪সি, ইউসিওসি এবং প্রয়োগকারী নির্দেশিকাগুলি বাস্তবায়ন ও পর্যালোচনার জন্য ২০২৪-২৫ বছরের সভা এবং পরিকল্পনা শুরু করবে। [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|মেটা-উইকিতে]] তাদের কাজ অনুসরণ করুন।
ইউসিওসি প্রকল্প দলের পক্ষে,<section end="announcement-content" />
[[m:User:RamzyM (WMF)|RamzyM (WMF)]] ০৮:১৫, ৩ জুন ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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)]] ০৮:৪৫, ১১ জুন ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26390244-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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)]] ১০:৫২, ২৫ জুন ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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)]] ০৩:৪৭, ৮ জুলাই ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== বাংলা উইকিসম্মেলন ২০২৪: বৃত্তির আবেদন নেওয়া শুরু হয়েছে ==
[[চিত্র:Bangla WikiConference 2024 logo.svg|ডান|250px|বাংলা উইকিসম্মেলন ২০২৪]]
প্রিয় সবাই,
অত্যন্ত আনন্দের সাথে জানাচ্ছি যে, উইকিমিডিয়া বাংলাদেশ বাংলা উইকিমিডিয়া সম্প্রদায়ের বহুল প্রতিক্ষিত [[:wmbd:বাংলা উইকিসম্মেলন ২০২৪|বাংলা উইকিসম্মেলন ২০২৪]] আয়োজন করতে যাচ্ছে। এই সম্মেলনটি আগামী ১৮-১৯ অক্টোবর ঢাকার অদূরে গাজীপুরে অনুষ্ঠিত হবে। এই সম্মেলনের উদ্দেশ্য উইকিমিডিয়ানদের ব্যক্তিগতভাবে একত্রিত করার মধ্য দিয়ে তাদের মতামত শেয়ার, বিভিন্ন চ্যালেঞ্জ নিয়ে আলোচনার মাধ্যমে সর্বোত্তম অনুশীলন এবং অন্যান্য তথ্য বিনিময় করার জন্য একটি সাধারণ প্ল্যাটফর্ম প্রদান করা। সম্মেলনে অংশ নিতে আগ্রহী বাংলাদেশ এবং ভারতে অবস্থানরত বাংলাভাষী অংশগ্রহণকারীদের জন্য বৃত্তির ব্যবস্থা রয়েছে। এই বৃত্তির অধীনে ভ্রমণ ভাতা ও সম্মেলনে থাকা খাওয়ার ব্যবস্থা করা হবে। সম্মেলনে অংশ নিতে আগ্রহী প্রত্যেককেই বৃত্তির জন্য আবেদন করতে হবে এবং আবেদন সফল হওয়া অংশগ্রহণকারীগণ সম্মেলনে অংশ নিতে পারবেন।
নিম্নলিখিত শর্তাবলী পূরণ করা সাপেক্ষে একজন উইকিমিডিয়ান বৃত্তির জন্য আবেদন করতে পারবেন,
* উইকিমিডিয়া ব্যবহারকারী অ্যাকাউন্ট ৩১ ডিসেম্বর ২০২৩ বা এর আগে তৈরিকৃত হতে হবে।
* উক্ত অ্যাকাউন্টের অধীনে কমপক্ষে ১০০ বৈশ্বিক অবদান থাকতে হবে।
বৃত্তির জন্য আবেদন করতে [https://docs.google.com/forms/d/e/1FAIpQLSfCEqY3lwPpBx7JPYTyYtyi4MEPYf2M6qkH6ohbfvs9i7ZvgA/viewform?usp=sf_link এখানে ক্লিক করুন]। জমা পড়া আবেদনগুলো [[wmbd:বাংলা_উইকিসম্মেলন_২০২৪/আয়োজক#%E0%A6%AC%E0%A7%83%E0%A6%A4%E0%A7%8D%E0%A6%A4%E0%A6%BF|বৃত্তি নির্ধারণী উপদল]] কর্তৃক যাচাই-বাছাইয়ের পরে বৃত্তিপ্রাপ্তদের তালিকা চূড়ান্ত করা হবে।
বিস্তারিত তথ্যের জন্য ভিজিট করুন: https://w.wiki/AWeV
বৃত্তির আবেদন গ্রহণ ৩১ জুলাই, ২০২৪ পর্যন্ত চলবে। বৃত্তি সম্পর্কিত কোন জিজ্ঞাসা থাকলে [[wmbd:আলাপ:বাংলা_উইকিসম্মেলন_২০২৪/বৃত্তি|আলাপ পাতায়]] করুন অথবা [mailto:bnwikiconference@wikimedia.org.bd bnwikiconference@wikimedia.org.bd] ঠিকানায় ইমেইল করুন।
বৃত্তি নির্ধারণী উপদলের পক্ষে, [[ব্যবহারকারী:MdsShakil|MdsShakil]] ([[ব্যবহারকারী আলাপ:MdsShakil|আলাপ]]) ১৭:৫১, ৯ জুলাই ২০২৪ (ইউটিসি)
== <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]]) ০০:০৩, ১০ জুলাই ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== উইকিঅভিধান:উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৪ ==
'''[[উইকিঅভিধান:উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৪/ফলাফল|উইকিঅভিধান লিখন প্রতিযোগিতা ২০২৪]]''' বাংলা উইকিঅভিধানে আয়োজিত একটি নতুন ভুক্তি তৈরি ও বিদ্যমান ভুক্তির মানোন্নয়ন প্রতিযোগিতা প্রতিযোগিতা। এই প্রতিযোগিতায় বাংলা শব্দের নতুন ভুক্তি তৈরি করা হবে।
এই প্রতিযোগিতায় ন্যূনতম দশটি ভুক্তি করলেই তাকে ডিজিটাল সনদপত্র প্রদান করা হবে ([[উইকিঅভিধান:উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৪#পুরস্কার|পুরস্কারের বিস্তারিত দেখুন]])। যে কোনো প্রকার সাহায্যের জন্য [[উইকিঅভিধান আলোচনা:উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৪|এখানে ক্লিক করে বার্তা দিন]]।
[[ব্যবহারকারী:Greatder|Greatder]] ([[ব্যবহারকারী আলাপ:Greatder|আলাপ]]) ১৩:০১, ১০ জুলাই ২০২৪ (ইউটিসি)
== বুদ্ধিজীবি দিবস এর জন্য চিঠি ==
১৯৭১ সাল বাঙালির জীবনের স্নরণীয় বছর [[ব্যবহারকারী:Sukhi Akter|Sukhi Akter]] ([[ব্যবহারকারী আলাপ:Sukhi Akter|আলাপ]]) ১২:৫৮, ১৫ জুলাই ২০২৪ (ইউটিসি)
== বাংলা উইকিসম্মেলন ২০২৪-এর জন্য সেশন জমাদানের আবেদন গ্রহণ শুরু হয়েছে! ==
প্রিয় সুধী,
আনন্দের সাথে জানাচ্ছি যে, উইকিমিডিয়া বাংলাদেশ বাংলা উইকিমিডিয়া সম্প্রদায়ের বহুল প্রতিক্ষিত [[wmbd:বাংলা_উইকিসম্মেলন_২০২৪|বাংলা উইকিসম্মেলন ২০২৪]] আয়োজন করতে যাচ্ছে। এই সম্মেলনটি আগামী ১৮-১৯ অক্টোবর ঢাকার অদূরে গাজীপুরে অনুষ্ঠিত হবে। এই সম্মেলনের প্রতিপাদ্য হলো: '''জ্ঞান । বৈচিত্র্য । সহযোগিতা'''। এই প্রতিপাদ্যগুলো সম্মেলনের মূল লক্ষ্য ও উদ্দেশ্যকে প্রতিফলিত করে।
সম্মেলনের জন্য সেশন জমাদানের আবেদন গ্রহণ শুরু হয়েছে!
আবেদন গ্রহণ শেষ হবে '''৫ আগস্ট ২০২৪, রাত ১১:৫৯''' (ইউটিসি সময়)।
আপনার আবেদন জমা দিতে [https://docs.google.com/forms/d/1HmNDRGmyCM7fgxqf6Kim3Zdxmw_p1kyXdhpgWNlMeWc এখানে ক্লিক করুন]:
আপনার জমা দেওয়া আবেদন [[wmbd:বাংলা উইকিসম্মেলন ২০২৪/আয়োজক/অনুষ্ঠান|অনুষ্ঠান বিন্যাস উপদল]] কর্তৃক কয়েকটি ধাপে যাচাই-বাছাই করা হবে। এরপর চূড়ান্ত তালিকা প্রকাশ করা হবে এবং যাদের সেশন গৃহীত হবে তাদেরকে ইমেইলের মাধ্যমে জানানো হবে।
আপনারা নিম্নলিখিত বিষয়গুলোর উপর সেশন জমা দিতে পারেন:
* প্রেজেন্টেশন
* প্যানেল আলোচনা
* সংক্ষিপ্ত অধিবেশন
* কর্মশালা
* পোস্টার অধিবেশন
* হ্যাকাথন
* আড্ডা
* সাংস্কৃতিক অনুষ্ঠান
বিভিন্ন সেশন বিন্যাস সম্পর্কে বিস্তারিত তথ্যের জন্য, অনুগ্রহ করে দেখুন: [[:wmbd:বাংলা উইকিসম্মেলন ২০২৪/অনুষ্ঠানসূচি/বিন্যাস|'''এই পাতা''']]
অনুষ্ঠানের বিন্যাস সম্পর্কে কোন প্রশ্ন থাকলে, আলাপ পাতায় বার্তা রাখুন অথবা bnwikiconference@wikimedia.org.bd ঠিকানায় ইমেইল করুন।
অনুষ্ঠান বিন্যাস উপদলের পক্ষে, [[User:ZI Jony|<span style="color:#8B0000">'''''জনি'''''</span>]], ২০:০২, ১৫ জুলাই ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:ZI_Jony/Bangla_WikiConference/List&oldid=27116076-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== গাঙ্গে গাঙ্গে দেখা হয় বইনে বইনে দেখা হয় না ==
মেয়েরা বিয়ের পর স্বামীর বাড়ি চলে যায়, যে কারনে দুই বোনও আলাদা হয়ে যায়। বিয়ের পর তারা এতো সহজে দেখা করতে পারে না।তাই তাদের কষ্টকে প্রকাশ করতে এই প্রবাদ বাক্যটি ব্যবহার করা হয়।কেননা গাঙ্গ অথাৎ নদী মুক্ত হওয়ায় এক নদী অন্য নদীর সাথে মিলিত হতে পারে বা দেখা করতে পারে।আপন দুই বোন দুই ভিন্ন জায়গায় থাকায় এতো সহজে দেখা করতে পারে না। [[ব্যবহারকারী:Mst Beauty Akter|Mst Beauty Akter]] ([[ব্যবহারকারী আলাপ:Mst Beauty Akter|আলাপ]]) ০৫:৫০, ১৬ জুলাই ২০২৪ (ইউটিসি)
== <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>
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ১৭:৫৩, ১৮ জুলাই ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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)]] ০২:৪৭, ২৭ জুলাই ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=26989444-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== বাংলাদেশে অবস্থানরত উইকিমিডিয়ানদের জন্য বাংলা উইকিসম্মেলনে অংশগ্রহণের বৃত্তির আবেদনের সময়সীমা বৃদ্ধি করা হয়েছে ==
সুপ্রিয় সুধী,
কোটা সংস্কার আন্দোলনকে কেন্দ্র করে সৃষ্ট বাংলাদেশের সাম্প্রতিক পরিস্থিতি বিবেচনায় বৃত্তি নির্ধারণী উপদল শুধুমাত্র ভৌগলিকভাবে বাংলাদেশে অবস্থানরত উইকিমিডিয়ানদের জন্য বাংলা উইকিসম্মেলনে অংশগ্রহণের বৃত্তির আবেদনের সময়সীমা বৃদ্ধি করার সিদ্ধান্ত নিয়েছে। নতুন সময়সীমা অনুযায়ী বাংলাদেশে অবস্থানরত উইকিমিডিয়ানগণ আগামী '''৭ আগস্ট''' পর্যন্ত বৃত্তির জন্য আবেদন করতে পারবেন। নতুন সময়সীমা পূর্বে প্রকাশিত [[wmbd:বাংলা_উইকিসম্মেলন_২০২৪/বৃত্তি#%E0%A6%B8%E0%A6%AE%E0%A6%AF%E0%A6%BC%E0%A6%B0%E0%A7%87%E0%A6%96%E0%A6%BE|বৃত্তির আবেদন পর্যালোচনা প্রক্রিয়ার সময়রেখায়]] কোনো প্রভাব ফেলবে না। বিশেষভাবে উল্লেখ্য যে, ৩১ জুলাইয়ের পর কোনোভাবেই বাংলাদেশের বাইরে থেকে আসা কোনো বৃত্তির আবেদন বিবেচনায় নেওয়া হবে না।
বৃত্তির জন্য আবেদন করতে [https://docs.google.com/forms/d/e/1FAIpQLSfCEqY3lwPpBx7JPYTyYtyi4MEPYf2M6qkH6ohbfvs9i7ZvgA/viewform এখানে ক্লিক করুন]।
বিস্তারিত তথ্যের জন্য ভিজিট করুন: https://w.wiki/AWeV
বৃত্তি সম্পর্কিত কোন জিজ্ঞাসা থাকলে [[wmbd:আলাপ:বাংলা_উইকিসম্মেলন_২০২৪/বৃত্তি|আলাপ পাতা]] অথবা [mailto:bnwikiconference@wikimedia.org.bd bnwikiconference@wikimedia.org.bd] ঠিকানায় ইমেইল করার মাধ্যমে করতে পারেন।
বৃত্তি নির্ধারণী উপদলের পক্ষে, [[ব্যবহারকারী:MdsShakil|MdsShakil]] ([[ব্যবহারকারী আলাপ:MdsShakil|আলাপ]]) ১৪:৩৪, ৩১ জুলাই ২০২৪ (ইউটিসি)
== বাংলা উইকিসম্মেলন ২০২৪-এর জন্য সেশন জমাদান আবেদনের সময়সীমা বৃদ্ধি করা হয়েছে ==
প্রিয় সবাই,
আশা করি নিরাপদ ও সুস্থ আছেন। কোটা সংস্কার আন্দোলনকে কেন্দ্র করে সৃষ্ট বাংলাদেশের সাম্প্রতিক পরিস্থিতি ও ইন্টারনেট শাটডাউন বিবেচনায় ৩ আগস্ট শনিবার অনুষ্ঠান বিন্যাস উপদলের সাপ্তাহিক বৈঠকে [[wmbd:বাংলা_উইকিসম্মেলন_২০২৪|বাংলা উইকিসম্মেলন ২০২৪]]-এর জন্য সেশন জমাদানের আবেদনের সময়সীমা আগামী '''১৫ আগস্ট ২০২৪, রাত ১১:৫৯''' (ইউটিসি সময়) পর্যন্ত বৃদ্ধি করা হয়েছে! এই সম্মেলনটি আগামী ১৮-১৯ অক্টোবর ঢাকার অদূরে গাজীপুরে অনুষ্ঠিত হবে। এই সম্মেলনের প্রতিপাদ্য হলো: '''জ্ঞান । বৈচিত্র্য । সহযোগিতা'''। এই প্রতিপাদ্যগুলো সম্মেলনের মূল লক্ষ্য ও উদ্দেশ্যকে প্রতিফলিত করে।
আপনার আবেদন জমা দিতে [https://docs.google.com/forms/d/1HmNDRGmyCM7fgxqf6Kim3Zdxmw_p1kyXdhpgWNlMeWc এখানে ক্লিক করুন]
আপনার জমা দেওয়া আবেদন [[wmbd:বাংলা উইকিসম্মেলন ২০২৪/আয়োজক/অনুষ্ঠান|অনুষ্ঠান বিন্যাস উপদল]] কর্তৃক কয়েকটি ধাপে যাচাই-বাছাই করা হবে। এরপর চূড়ান্ত তালিকা প্রকাশ করা হবে এবং যাদের সেশন গৃহীত হবে তাদেরকে ইমেইলের মাধ্যমে জানানো হবে।
আপনারা নিম্নলিখিত বিষয়গুলোর উপর সেশন জমা দিতে পারেন:
* প্রেজেন্টেশন
* প্যানেল আলোচনা
* সংক্ষিপ্ত অধিবেশন
* কর্মশালা
* পোস্টার অধিবেশন
* হ্যাকাথন
* আড্ডা
* সাংস্কৃতিক অনুষ্ঠান
বিভিন্ন সেশন বিন্যাস সম্পর্কে বিস্তারিত তথ্যের জন্য, অনুগ্রহ করে দেখুন: [[:wmbd:বাংলা উইকিসম্মেলন ২০২৪/অনুষ্ঠানসূচি/বিন্যাস|'''এই পাতা''']]
অনুষ্ঠানের বিন্যাস সম্পর্কে কোন প্রশ্ন থাকলে, আলাপ পাতায় বার্তা রাখুন অথবা bnwikiconference@wikimedia.org.bd ঠিকানায় ইমেইল করুন।
'''বিশেষ দ্রষ্টব্য:''' অসম্পূর্ণ এবং অপ্রাসঙ্গিক (উইকির সাথে একেবারেই সম্পর্ক নেই) সেশনের আবেদন বাতিল বলে গণ্য হবে।
অনুষ্ঠান বিন্যাস উপদলের পক্ষে, [[User:ZI Jony|<span style="color:#8B0000">'''''জনি'''''</span>]], ১৬:০৫, ৪ আগস্ট ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:ZI_Jony/Bangla_WikiConference/List&oldid=27116076-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== <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]]) ১৫:৩০, ৬ আগস্ট ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== শীঘ্রই আসছে: উপ-তথ্যসূত্র যুক্ত করার নতুন একটি সুবিধা - ব্যবহার করে দেখুন! ==
<section begin="Sub-referencing"/>
[[File:Sub-referencing reuse visual.png|{{#ifeq:{{#dir}}|ltr|right|left}}|400px]]
হ্যালো! বহু বছর ধরে, সম্প্রদায়ের সদস্যরা পৃথক বিবরণ সহ একই তথ্যসূত্রের পুনঃব্যবহারের একটি সহজ উপায় তৈরির অনুরোধ করেছেন। এখন, এর একটি মিডিয়াউইকি সমাধান আসছে: নতুন এই উপ-তথ্যসূত্র যুক্তকরণ সুবিধাটি উইকিপাঠ্য এবং দৃশ্যমান সম্পাদনায় কাজ করবে এবং বিদ্যমান উপ-তথ্যসূত্র যুক্তকরণ সিস্টেমকে আরও উন্নত করবে। আপনি তথ্যসূত্র যুক্ত করার অন্য উপায়গুলো ব্যবহার করা চালিয়ে যেতে পারেন, তবে সম্ভবত খুব তাড়াতাড়িই আপনার নজরে পড়বে যে অন্যান্য ব্যবহারকারীরা নিবন্ধে উপ-তথ্যসূত্র ব্যবহার করছে। [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|প্রকল্প পাতা]] থেকে এই বিষয়ে আরও তথ্য জানতে পারবেন।
এই সুবিধাটি আপনার জন্য ভালোভাবে কাজ করছে কিনা তা নিশ্চিত করতে '''আমরা আপনার প্রতিক্রিয়া চাই''':
* অনুগ্রহ করে বেটা উইকিতে বর্তমান উন্নয়নশীল অবস্থায় সুবিধাটি [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#Test|ব্যবহার করে দেখুন]] এবং [[m:Talk:WMDE Technical Wishes/Sub-referencing|আপনার মতামত জানান]]।
* নিয়মিত হালনাগাদ পেতে এবং/অথবা ব্যবহারকারী গবেষণা কার্যক্রমে অংশগ্রহণের আমন্ত্রণ পেতে এখানে [[m:WMDE Technical Wishes/Sub-referencing/Sign-up|নিবন্ধন করুন]] ।
[[m:Special:MyLanguage/Wikimedia Deutschland|উইকিমিডিয়া জার্মানির]] [[m:Special:MyLanguage/WMDE Technical Wishes|প্রাযুক্তিক ইচ্ছে]] দল এই বছরের শেষের দিকে উইকিমিডিয়া উইকিগুলোতে এই বৈশিষ্ট্যটি আনার পরিকল্পনা করছে। আমরা এর আগেই তথ্যসূত্র সম্পর্কিত সরঞ্জাম এবং টেমপ্লেটের তৈরিকারক/রক্ষণাবেক্ষণকারীদের সাথে যোগাযোগ করব।
অনুগ্রহক করে বার্তাটি ছড়িয়ে দিতে আমাদেরকে সাহায্য করুন। --[[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"/>
<!-- https://meta.wikimedia.org/w/index.php?title=User:Johannes_Richter_(WMDE)/Sub-referencing/massmessage_list&oldid=27309345-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Johannes Richter (WMDE)@metawiki পাঠিয়েছেন -->
== 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!
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ২৩:২০, ২২ আগস্ট ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:SSethi (WMF)@metawiki পাঠিয়েছেন -->
== নতুন শব্দ মনোয়ন ==
উইকিঅভিধানে ব্যবহারকারী কোনো শব্দ ''নির্বাচিত শব্দ: মনোয়ন দিন'' এর জন্য মনোনিত করতে পারেন কি?
যদি করা যায়, তাহলে এর প্রক্রিয়া সম্পর্কে জানতে চাই। [[বিশেষ:অবদান/103.61.241.68|103.61.241.68]] ১৮:১৭, ২৮ আগস্ট ২০২৪ (ইউটিসি)
== <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)]] ১৪:০৭, ২ সেপ্টেম্বর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== আপনার মতামত দিন: ২০২৪ ট্রাস্টি বোর্ডের জন্য ভোট দিন! ==
<section begin="announcement-content" />
সবাইকে স্বাগত,
[[m:Special:MyLanguage/Wikimedia Foundation elections/2024|২০২৪ ট্রাস্টি বোর্ড নির্বাচনের]] ভোটদান শুরু হয়ে গেছে।
বোর্ডে চার (৪)টি আসনের জন্য প্রতিদ্বন্দ্বিতা করছেন বারো (১২) জন প্রার্থী৷
প্রার্থীদের [[m:Special:MyLanguage/Wikimedia Foundation elections/2024/Candidates|বিবৃতি পড়ে]] এবং [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2024/Questions_for_candidates|সম্প্রদায়ের প্রশ্নে তাঁদের উত্তর]] শুনে তাঁদের সম্পর্কে আরও জানুন।
আপনি প্রস্তুত থাকলে, ভোট দেওয়ার জন্য [[Special:SecurePoll/vote/400|SecurePoll]] ভোটদান পাতায় যান। '''ভোটদান ৩রা সেপ্টেম্বর ০০:০০ ইউটিসি থেকে ১৭ই সেপ্টেম্বর ২৩:৫৯ ইউটিসি পর্যন্ত খোলা থাকবে'''৷
আপনার ভোটদানের যোগ্যতা যাচাই করতে, অনুগ্রহ করে [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2024/Voter_eligibility_guidelines|ভোটারের যোগ্যতা পাতা]] দেখুন।
শুভেচ্ছান্তে,
নির্বাচন কমিটি এবং বোর্ড নির্বাচন ওয়ার্কিং গ্রুপ<section end="announcement-content" />
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ১২:১৫, ৩ সেপ্টেম্বর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== বাংলা শব্দের প্রতিবর্ণীকরণ অপসারণ ==
যেহেতু এটি বাংলা উইকিঅভিধান, সেহেতু এখানে বাংলা শব্দের প্রতিবর্ণীকরণের প্রয়োজন নেই। কিন্তু আমি লক্ষ করেছি যে [[কাংলাদেশ]] ভুক্তিতে প্রথম বন্ধনীতে ইংরেজি থেকে আমদানি করা [[মডিউল:bn-translit]] মডিউলের দৌলতে রোমান অক্ষরে বাংলা শব্দের প্রতিবর্ণীকরণ ফুটে উঠেছে। বাংলা ও অসমীয়া শব্দের প্রতিবর্ণীকরণ মডিউল অপসারণ করা উচিত। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ০৪:১০, ৪ সেপ্টেম্বর ২০২৪ (ইউটিসি)
:করা হয়েছে। [[ব্যবহারকারী:আফতাবুজ্জামান|আফতাবুজ্জামান]] ([[ব্যবহারকারী আলাপ:আফতাবুজ্জামান|আলাপ]]) ০০:০২, ১ জুলাই ২০২৫ (ইউটিসি)
== অপসারণের অনুরোধ ==
@[[ব্যবহারকারী:MdsShakil|MdsShakil]] [[এঁটোপাত কখনো স্বর্গে যায় না১]], [[এঁটোপাত কখনো স্বর্গে যায় না২]], [[এঁটোপাত কখনো স্বর্গে যায় না৩]]
অপসারণের অনুরোধ রইল। কারণ এর অন্তর্ভুক্ত সকল তথ্য [[এঁটোপাত কখনো স্বর্গে যায় না]] ভুক্তির মাঝে রয়েছে। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১৭:৪৩, ১৩ সেপ্টেম্বর ২০২৪ (ইউটিসি)
== আপনার উইকি শীঘ্রই পঠন মোডে যাবে ==
<section begin="server-switch"/><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|এই বার্তাটি অন্য ভাষায় পড়ুন]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
[[foundation:|উইকিমিডিয়া ফাউন্ডেশন]] তার উপাত্ত কেন্দ্রগুলির মধ্যে ট্রাফিক আনা-নেওয়ার বিষয়টি পরীক্ষা করবে। এটি নিশ্চিত করবে যে উইকিপিডিয়া এবং উইকিমিডিয়ার অন্যান্য উইকিসমূহ এমনকি একটি দুর্যোগের পরেও অনলাইন থাকবে।
সকল ট্রাফিক সুইচ করার তারিখ হলো '''{{#time:j xg|2024-09-25|bn}}'''। পরীক্ষাটি শুরু হবে '''[https://zonestamp.toolforge.org/{{#time:U|2024-09-25T15:00|en}} {{#time:H:i e|2024-09-25T15:00}}]'''-তে (বাংলাদেশ সময় রাত ৮টায় ও পশ্চিমবঙ্গ সময় রাত ৭টা ৩০ মিনিটে)।
দুর্ভাগ্যবশত, [[mw:Special:MyLanguage/Manual:What is MediaWiki?|মিডিয়াউইকির]] কিছু সীমাবদ্ধতার কারণে, এই পরিবর্তনের সময় সব সম্পাদনা অবশ্যই বন্ধ রাখতে হবে। এই ব্যাঘাত ঘটানোর জন্য আমরা ক্ষমাপ্রার্থী, এবং আমরা ভবিষ্যতে এটিকে হ্রাস করার জন্য কাজ করছি।
এই কার্যক্রমটি শুরু হওয়ার ৩০ মিনিট পূর্বে সমস্ত উইকিতে একটি ব্যানার প্রদর্শন করা হবে। এই ব্যানারটি অপারেশন শেষ না হওয়া পর্যন্ত দৃশ্যমান থাকবে।
'''সব উইকিতে অল্প সময়ের জন্য, আপনি সম্পাদনা করতে পারবেন না, তবে আপনি উইকি পড়তে সক্ষম হবেন।'''
*আপনি {{#time:l j xg Y|2024-09-25|bn}}-এ প্রায় এক ঘণ্টা পর্যন্ত সম্পাদনা করতে পারবেন না।
*আপনি যদি এই সময়ে সম্পাদনা করার বা সংরক্ষণ করার চেষ্টা করেন, তাহলে আপনি একটি ত্রুটি বার্তা দেখতে পাবেন। আমরা আশা করি যে কোনও সম্পাদনা এই সময়ের মধ্যে নষ্ট হবে না, কিন্তু আমরা তার নিশ্চয়তা দিতে পারছি না। আপনি যদি ত্রুটি বার্তাটি দেখতে পান, তাহলে অনুগ্রহ করে অপেক্ষা করুন যতক্ষণ না সবকিছু স্বাভাবিক অবস্থায় ফিরে আসছে। এরপর আপনি আপনার সম্পাদনা সংরক্ষণ করতে সক্ষম হবেন। সতর্কতাস্বরূপ, আমরা সুপারিশ করছি যে উক্ত সময়ে আপনি আপনার সম্পাদনার একটি অনুলিপি তৈরি করে রাখুন।
''অন্যান্য প্রভাব'':
*পটভূমির কাজগুলো ধীর হবে এবং কিছু নাও কাজ করতে পারে। লাল লিঙ্কগুলো স্বাভাবিকের মত দ্রুত হালনাগাদ নাও হতে পারে। আপনি যদি একটি নিবন্ধ তৈরি করেন যা ইতিমধ্যে অন্য কোথাও সংযুক্ত আছে, সেক্ষেত্রে লিঙ্ক স্বাভাবিকের চেয়ে বেশি সময় ধরে লাল থাকবে। কিছু দীর্ঘ চলমান স্ক্রিপ্ট বন্ধ করতে হবে।
* আমরা আশা করি যে কোড হালনাগাদগুলি অন্য সপ্তাহের মতো চলবে। তবে যদি অপারেশনের পর প্রয়োজন হয়, কিছু ক্ষেত্রে কোড হালনাগাদ বন্ধ থাকতে পারে।
* [[mw:Special:MyLanguage/GitLab|গিটল্যাব]] প্রায় ৯০ মিনিটের জন্য অনুপলব্ধ থাকবে।
যদি প্রয়োজন হয় তাহলে এই প্রকল্পটি স্থগিত করা হতে পারে। আপনি [[wikitech:Switch_Datacenter|wikitech.wikimedia.org তে সময়সূচি পড়তে পারেন]]। যেকোনো পরিবর্তন সময়সূচীতে ঘোষণা করা হবে।
'''দয়া করে আপনার সম্প্রদায়কে এই তথ্যটি জানান।'''</div><section end="server-switch"/>
[[User:Trizek_(WMF)|Trizek_(WMF)]], ০৯:৩৬, ২০ সেপ্টেম্বর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=27248326-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Trizek (WMF)@metawiki পাঠিয়েছেন -->
== '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> [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ১৮:৫৮, ২৭ সেপ্টেম্বর ২০২৪ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Test_List&oldid=27524260-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Danny Benjafield (WMDE)@metawiki পাঠিয়েছেন -->
== উইকিঅভিধান সংক্রান্ত প্রশ্ন ==
@[[ব্যবহারকারী:Aishik Rehman|Aishik Rehman]] উইকিঅভিধানে কি শুধু মাত্র বাংলা ও ইংরেজি ভুক্তি থাকবে? নাকি যে কোন ভাষা (যেমন- জার্মান, চীন, তুর্কি, হিন্দি) ভুক্তি যুক্ত করা যাবে? [[ব্যবহারকারী:Wiki loves question|Wiki loves question]] ([[ব্যবহারকারী আলাপ:Wiki loves question|আলাপ]]) ১৮:৫৪, ৫ অক্টোবর ২০২৪ (ইউটিসি)
:@[[ব্যবহারকারী:Wiki loves question|Wiki loves question]], যে কোনও ভাষার ভুক্তি যোগ করা যাবে। [[ব্যবহারকারী:আফতাবুজ্জামান|আফতাবুজ্জামান]] ([[ব্যবহারকারী আলাপ:আফতাবুজ্জামান|আলাপ]]) ১৭:৩৪, ৭ অক্টোবর ২০২৪ (ইউটিসি)
== Invitation to Participate in Wiki Loves Ramadan Community Engagement Survey ==
Dear all,
Apologies for writing in English. Please help to translate in your language.
We are excited to announce the upcoming [[m:Wiki Loves Ramadan|Wiki Loves Ramadan]] event, a global initiative aimed at celebrating Ramadan by enriching Wikipedia and its sister projects with content related to this significant time of year. As we plan to organize this event globally, your insights and experiences are crucial in shaping the best possible participation experience for the community.
To ensure that Wiki Loves Ramadan is engaging, inclusive, and impactful, we kindly invite you to participate in our community engagement survey. Your feedback will help us understand the needs of the community, set the event's focus, and guide our strategies for organizing this global event.
Survey link: https://forms.gle/f66MuzjcPpwzVymu5
Please take a few minutes to share your thoughts. Your input will make a difference!
Thank you for being a part of our journey to make Wiki Loves Ramadan a success.
Warm regards,
User:ZI Jony ০৩:১৯, ৬ অক্টোবর ২০২৪ (ইউটিসি)
Wiki Loves Ramadan Organizing Team
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=27510935-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== ২০২৪ সালের উইকিমিডিয়া ফাউন্ডেশন ট্রাস্টি বোর্ড নির্বাচনের প্রাথমিক ফলাফল ==
<section begin="announcement-content" />
সুধী সকল,
[[m:Special:MyLanguage/Wikimedia Foundation elections/2024|২০২৪ সালের উইকিমিডিয়া ফাউন্ডেশন ট্রাস্টি বোর্ড নির্বাচনে]] অংশগ্রহণকারী সকলকে ধন্যবাদ। এইবার 180টির বেশি প্রকল্পের প্রায় 6000 জন সম্প্রদায় সদস্য ভোট দিয়েছেন।
নিম্নলিখিত চার প্রার্থী সবচেয়ে বেশি ভোট পেয়েছেন:
# [[User:Kritzolina|Christel Steigenberger]]
# [[User:Nadzik|Maciej Artur Nadzikiewicz]]
# [[User:Victoria|Victoria Doronina]]
# [[User:Laurentius|Lorenzo Losa]]
যদিও এই প্রার্থীদের ভোটের ফলের মাধ্যমে স্থান দেওয়া হয়েছে, কিন্তু তাঁদের এখনও ট্রাস্টি বোর্ডে নিয়োগ করার প্রয়োজন আছে। তাদের একটি সফল প্রেক্ষাপট পরীক্ষা পাস করতে হবে এবং উপবিধিতে বর্ণিত যোগ্যতা পূরণ করতে হবে। ২০২৪ সালের ডিসেম্বরে পরবর্তী বোর্ড সভায় নতুন ট্রাস্টি নিয়োগ করা হবে।
[[m:Special:MyLanguage/Wikimedia_Foundation_elections/2024/Results|মেটা-উইকিতে ফলাফল সম্পর্কে আরও জানুন।]]
শুভেচ্ছান্তে,
নির্বাচন কমিটি এবং বোর্ড নির্বাচন ওয়ার্কিং গ্রুপ
<section end="announcement-content" />
[[User:MPossoupe_(WMF)|MPossoupe_(WMF)]] ০৮:২৬, ১৪ অক্টোবর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27183190-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:MPossoupe (WMF)@metawiki পাঠিয়েছেন -->
== আন্দোলনের বেশ কয়েকটি কমিটিতে যোগদানের জন্য স্বেচ্ছাসেবকদের সন্ধান ==
<section begin="announcement-content" />
প্রতি বছর, সাধারণত অক্টোবর থেকে ডিসেম্বর পর্যন্ত, আন্দোলনের বেশ কয়েকটি কমিটি নতুন স্বেচ্ছাসেবক খোঁজে।
কমিটিগুলির মেটা-উইকি পাতায় তাদের সম্পর্কে আরও পড়ুন:
* [[m:Special:MyLanguage/Affiliations_Committee/bn|অধিভুক্তি কমিটি (অ্যাফকম)]]
* [[m:Special:MyLanguage/Ombuds_commission/bn|ন্যায়পাল কমিশন (ওসি)]]
* [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|কেস রিভিউ কমিটি (সিআরসি)]]
কমিটির জন্য আবেদন খোলা হবে ১৬ অক্টোবর ২০২৪৷ অধিভুক্তি কমিটির আবেদন গ্রহণ ১৮ নভেম্বর ২০২৪ তারিখে শেষ হবে এবং ন্যায়পাল কমিশন ও কেস রিভিউ কমিটির জন্য আবেদন গ্রহণ ২ ডিসেম্বর ২০২৪ তারিখে শেষ হবে। কিভাবে আবেদন করতে হয় তা শিখুন [[m:Special:MyLanguage/Wikimedia_Foundation/Legal/Committee_appointments|মেটা-উইকিতে অ্যাপয়েন্টমেন্ট পাতায় গিয়ে]]। আলাপ পাতায় পোস্ট করুন অথবা আপনার যেকোন প্রশ্ন থাকলে [mailto:cst@wikimedia.org cst@wikimedia.org]-তে ইমেল করুন।
কমিটির সহায়তা দলের পক্ষ থেকে,
<section end="announcement-content" />
-- [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) ২৩:০৮, ১৬ অক্টোবর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27601062-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== Announcing Indic Wikimedia Hackathon Bhubaneswar 2024 & scholarship applications ==
Dear Wikimedians,
We hope you are well.
We are thrilled to announce the upcoming [[:metawiki:Indic Wikimedia Hackathon Bhubaneswar 2024|Indic Wikimedia Hackathon Bhubaneswar 2024]], hosted by the [[:metawiki:Indic MediaWiki Developers User Group|Indic MediaWiki Developers UG]] (aka Indic-TechCom) in collaboration with the [[:metawiki:Odia Wikimedians User Group|Odia Wikimedians UG]]. The event will take place in Bhubaneswar during 20-22 December 2024.
Wikimedia hackathons are spaces for developers, designers, content editors, and other community stakeholders to collaborate on building technical solutions that help improve the experience of contributors and consumers of Wikimedia projects. The event is intended for:
* Technical contributors active in the Wikimedia technical ecosystem, which includes developers, maintainers (admins/interface admins), translators, designers, researchers, documentation writers etc.
* Content contributors having in-depth understanding of technical issues in their home Wikimedia projects like Wikipedia, Wikisource, Wiktionary, etc.
* Contributors to any other FOSS community or have participated in Wikimedia events in the past, and would like to get started with contributing to Wikimedia technical spaces.
We encourage you to follow the essential details & updates on Meta-Wiki regarding this event.
Event Meta-Wiki page: https://meta.wikimedia.org/wiki/Indic_Wikimedia_Hackathon_Bhubaneswar_2024
Scholarship application form: [https://docs.google.com/forms/d/e/1FAIpQLSf07lWyPJc6bxOCKl_i2vuMBdWa9EAzMRUej4x1ii3jFjTIaQ/viewform Click here to apply ]
''(Scholarships are available to assist with your attendance, covering travel, accommodation, food, and related expenses.)''
Please read the application guidance on the Meta-Wiki page before applying.
The scholarship application is open until the end of the day 2 November 2024 (Saturday).
If you have any questions, concerns or need any support with the application, please start a discussion on the event talk page or reach out to us contact@indicmediawikidev.org via email.
Best,
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ০৯:৩৫, ১৯ অক্টোবর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/South_Asia_Village_Pumps&oldid=25720607-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:KCVelaga@metawiki পাঠিয়েছেন -->
== '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)]] ১১:২৯, ২২ অক্টোবর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Test_List&oldid=27535421-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Danny Benjafield (WMDE)@metawiki পাঠিয়েছেন -->
== Final Reminder: Join us in Making Wiki Loves Ramadan Success ==
Dear all,
We’re thrilled to announce the Wiki Loves Ramadan event, a global initiative to celebrate Ramadan by enhancing Wikipedia and its sister projects with valuable content related to this special time of year. As we organize this event globally, we need your valuable input to make it a memorable experience for the community.
Last Call to Participate in Our Survey: To ensure that Wiki Loves Ramadan is inclusive and impactful, we kindly request you to complete our community engagement survey. Your feedback will shape the event’s focus and guide our organizing strategies to better meet community needs.
* Survey Link: [https://docs.google.com/forms/d/e/1FAIpQLSffN4prPtR5DRSq9nH-t1z8hG3jZFBbySrv32YoxV8KbTwxig/viewform?usp=sf_link Complete the Survey]
* Deadline: November 10, 2024
Please take a few minutes to share your thoughts. Your input will truly make a difference!
'''Volunteer Opportunity''': Join the Wiki Loves Ramadan Team! We’re seeking dedicated volunteers for key team roles essential to the success of this initiative. If you’re interested in volunteer roles, we invite you to apply.
* Application Link: [https://docs.google.com/forms/d/e/1FAIpQLSfXiox_eEDH4yJ0gxVBgtL7jPe41TINAWYtpNp1JHSk8zhdgw/viewform?usp=sf_link Apply Here]
* Application Deadline: October 31, 2024
Explore Open Positions: For a detailed list of roles and their responsibilities, please refer to the position descriptions here: [https://docs.google.com/document/d/1oy0_tilC6kow5GGf6cEuFvdFpekcubCqJlaxkxh-jT4/ Position Descriptions]
Thank you for being part of this journey. We look forward to working together to make Wiki Loves Ramadan a success!
Warm regards,<br>
The Wiki Loves Ramadan Organizing Team ০৫:১১, ২৯ অক্টোবর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=27568454-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== বাংলায় হ্যাকাথনের আয়োজন ==
[[File:হ্যাকাথন বাংলা উইকিসম্মেলন-২০২৪.svg|right|400px]]
সুধীবৃন্দ!<br />
আপনারা হয়তো অবগত আছেন, আগামী ১৫-১৬ নভেম্বর ২০২৪ বাংলা উইকিসম্মেলন-২০২৪ অনুষ্ঠিত হতে যাচ্ছে। এই সম্মেলনের একটি বিশেষ আয়োজন হিসেবে বাংলায় প্রথমবারের মতো [[wmbd:বাংলা উইকিসম্মেলন ২০২৪/হ্যাকাথন|হ্যাকাথন]] অনুষ্ঠিত হতে যাচ্ছে। এই হ্যাকাথনটি [[:w:উইকিপিডিয়া:উইকিমিডিয়া সহপ্রকল্প|উইকিমিডিয়া প্রকল্পগুলোকে]] আরও সমৃদ্ধ করার লক্ষ্যে নতুন ধারণা ও প্রযুক্তি ব্যবহার করে একত্রিত হয়ে কাজ করার একটি সুযোগ প্রদান করবে।<br />
এই হ্যাকাথনে আমাদের মধ্য থেকে প্রোগ্রামার, ডিজাইনার, ডকুমেন্টেটর এবং অন্যান্য আগ্রহীরা একত্রিত হয়ে দলগতভাবে কাজ করবো এবং উইকিমিডিয়া প্রকল্পগুলোর জন্য নতুন টুল, বট বা অন্যান্য সমাধান তৈরি করবো। আপনি যদি মৌলিক প্রোগ্রামার, স্ক্রিপ্ট কিডি বা সাধারণ প্রোগ্রামার, ডকুমেন্টেটর বা অনুবাদক হিসেবে হ্যাকাথনে যুক্ত হতে চান; তাহলে আপনি আমাদের সাথে যুক্ত হতে পারেন।<br />
হ্যাকাথনটিতে অন্যান্য কারিগরি কাজের মধ্যে উল্লেখযোগ্যভাবে আপনি ফ্যাব্রিকেটরে বাংলা উইকিগুলির বাকি থাকা কাজ, খসড়া নামস্থান সংক্রান্ত কারিগরি কাজ ও এআই বা কৃত্রিম বুদ্ধিমত্তা সংক্রান্ত কাজ, নথিকরণসহ কারিগরি বা মৌলিক নীতিমালা অনুবাদের কাজও করতে পারবেন।
;একনজরে
* '''অনলাইন হ্যাকাথন''' : ১৪ - ১৬ নভেম্বর ২০২৪ (শেষদিন উইকিসম্মেলনে প্রদর্শনী হবে)
* '''উইকিসম্মেলন হ্যাকাথন''' : ১৫ নভেম্বর ২০২৪ (১৬ নভেম্বর উইকিসম্মেলনে প্রদর্শনী হবে)
* '''অংশগ্রহণকারী''' : প্রোগ্রামার, ডকুমেন্টেটর ও অনুবাদক
* '''নিবন্ধন ফরম''' : [https://docs.google.com/forms/d/e/1FAIpQLSet2nwJSzDMVkDXaZ1hNquPjx-7FqoAGea45OHmrMtuEuh5nA/viewform গুগল ফরমে] নিবন্ধন করুন
* '''নিবন্ধনের শেষ তারিখ''' : অনলাইনের জন্য নিবন্ধনের শেষ তারিখ নেই, উইকিসম্মেলনে অংশগ্রহণকারীদের জন্য ১২ নভেম্বর ২০২৪ (ইউটিসি ২৩:৫৯) পর্যন্ত।
প্রযুক্তিবিদ, প্রযুক্তিপ্রেমী ও উইকিপ্রেমীদের অংশগ্রহণের অনুরোধ করছি। নিবন্ধনের পর যোগ দিন [https://t.me/+UBThrVa3IvY5Y2M1 আমাদের টেলিগ্রাম গ্রুপে]।<br />
'''হ্যাকাথন আয়োজকদের পক্ষে,'''<br />
[[ব্যবহারকারী:Mehedi Abedin|Mehedi Abedin]] ([[ব্যবহারকারী আলাপ:Mehedi Abedin|আলাপ]]) ১০:৫৩, ৭ নভেম্বর ২০২৪ (ইউটিসি)
== ছদ্মনাম শব্দ যু্ক্ত নিয়ে প্রশ্ন ==
উইকিঅভিধানে কি কোন লেখকের বা কবির নাম বা ছদ্মনাম যুক্ত করা কি ঠিক হবে? উদাহরণস্বরূপ- [[টিউনেরোসা]] [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ০৯:৩০, ১২ নভেম্বর ২০২৪ (ইউটিসি)
:@[[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] যদি বহুল প্রচলিত হয়, তবে করা যেতে পারে। তবে এমনটা হলে ভালো হয় যে উইকিপিডিয়াতে সেই লেখকের নামে নিবন্ধ আছে; তাহলে বুঝা গেলো যে এটা মোটামুটি উল্লেখযোগ্য বা প্রচলিত শব্দ। '''[[User:Aishik Rehman|Aishik Rehman]]''' ([[User talk:Aishik Rehman|আলাপ]]) ০৬:০৭, ২৪ নভেম্বর ২০২৪ (ইউটিসি)
== 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]] ১৯:৫৫, ২১ নভেম্বর ২০২৪ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27746256-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:SSethi (WMF)@metawiki পাঠিয়েছেন -->
== ভাষার নাম ==
Khmer ভাষার বাংলা শব্দ কি হতে পারে? [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১৭:০৪, ৩০ নভেম্বর ২০২৪ (ইউটিসি)
:@[[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]], খমের। [[ব্যবহারকারী:আফতাবুজ্জামান|আফতাবুজ্জামান]] ([[ব্যবহারকারী আলাপ:আফতাবুজ্জামান|আলাপ]]) ০০:৩৩, ২ ডিসেম্বর ২০২৪ (ইউটিসি)
::@[[ব্যবহারকারী:আফতাবুজ্জামান|আফতাবুজ্জামান]] খেমার শব্দটি বাংলায় অধিক ব্যবহৃত। আমার বছরখানেক আগে পড়া ভ্রমণ সম্পর্কিত একটি বইয়ে খেমার ব্যবহার করতে দেখেছি। [[ব্যবহারকারী:Yahya|Yahya]] ([[ব্যবহারকারী আলাপ:Yahya|আলাপ]]) ১৫:৪৪, ২৯ ডিসেম্বর ২০২৪ (ইউটিসি)
== [[:m:Expressions of Interest to host Wikimania 2027 in India: Initial conversation|Expressions of Interest to host Wikimania 2027 in India: Initial conversation]] ==
<div lang="en" dir="ltr">
''{{int:please-translate}}''
Dear Wikimedians,
We are excited to '''Initiate the discussions about India’s potential bid to host [[:m:Wikimania 2027|Wikimania 2027]]''', the annual international conference of the Wikimedia movement. This is a call to the community to express interest and share ideas for organizing this flagship event in India.
Having a consortium of a good number of country groups, recognised affiliates, thematic groups or regional leaders primarily from Asia for this purpose will ultimately strengthen our proposal from the region. This is the first step in a collaborative journey. We invite all interested community members to contribute to the discussion, share your thoughts, and help shape the vision for hosting Wikimania 2027 in India.
Your participation will ensure this effort reflects the strength and diversity of the Indian Wikimedia community. Please join the conversation on [[:m:Expressions of Interest to host Wikimania 2027 in India: Initial conversation#Invitation to Join the Conversation|Meta page]] and help make this vision a reality!
Regards,
<br>
[[:m:Wikimedians of Kerala|Wikimedians of Kerala User Group]] and [[:m:Odia Wikimedians User Group|Odia Wikimedians User Group]]
<br>
This message was sent with [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) by [[m:User:Gnoeee|Gnoeee]] ([[m:User_talk:Gnoeee|talk]]) ১৫:১৪, ৪ ডিসেম্বর ২০২৪ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Indic_VPs&oldid=27906962-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Gnoeee@metawiki পাঠিয়েছেন -->
== প্রকল্প নামকরণ প্রস্তাবনা: উইকিকোষ ==
সুধী, বাংলায় "অ" শব্দের মাঝখানে হয়না। যদিও এটি সম্প্রদায়ের মাধ্যমে দীর্ঘদিন '''উইকিঅভিধান''' নামে ব্যবহৃত হয়ে এসেছে। কিন্তু আমি মনে করি, অশুদ্ধ ব্যবহার এর যাত্রাকে ব্যাহত করেছে। আমি আশা করবো, সম্প্রদায় শিরোনাম পরিবর্তন করে '''উইকিকোষ''' বা সমার্থক অন্য কোনো নাম গ্রহণ করবে। ~ [[ব্যবহারকারী:খাত্তাব হাসান|খাত্তাব]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ০৪:৫৩, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:{{বিরোধিতা}} — "কোষ" মানে "শব্দকোষ" ও "বিশ্বকোষ" উভয়কেই বোঝাতে পারে, অর্থাৎ "উইকিকোষ" বলতে উইকশনারি (শব্দকোষ) ও উইকিপিডিয়া (বিশ্বকোষ) উভয়কেই বোঝাতে পারে।
:''"সুধী, বাংলায় "অ" শব্দের মাঝখানে হয়না। যদিও এটি সম্প্রদায়ের মাধ্যমে দীর্ঘদিন উইকিঅভিধান নামে ব্যবহৃত হয়ে এসেছে। কিন্তু আমি মনে করি, অশুদ্ধ ব্যবহার এর যাত্রাকে ব্যাহত করেছে।"''
:আমি জানিনা বাংলা একাডেমির (বা পশ্চিমবঙ্গ বাংলা আকাদেমির) কোন গ্রন্থে লেখা আছে যে বাংলায় "অ" শব্দের মাঝখানে হয় না বা "উইকিঅভিধান"-এর মতো যৌগিক শব্দ "অশুদ্ধ"। আমি দেখেছি যে অতৎসম শব্দে একদা মাঝখানে "অ" লেখা হতো, যার জায়গায় এখন "য়" লেখা হয়। এক্ষেত্রে নামগত অসুবিধা হলে মাঝখানে হাইফেন দেওয়া যেতে পারে (যেমন "উইকি-অভিধান"), কিন্তু প্রকল্পের নাম পরিবর্তনের প্রয়োজনীয়তা বুঝতে পারছি না। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ০৫:৪২, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
::@[[ব্যবহারকারী:Sbb1413|Sbb1413]] মুক্ত 'অ' যে আধুনিক বাংলায় মাঝখানে হয়না, এটা আপনি জানেন না দেখে আশ্চর্যান্বিত হচ্ছি। আমাকে উৎস খুঁজতে হবে, কিন্তু এটা অবশ্যই নীতিমালার বইয়ে রয়েছে। আর এটা সর্বজনমান্য নিয়মই, কোনো বিতর্কিত বিষয় নয়। আগে যেসব ক্ষেত্রে 'অ' লেখা হতো, সেগুলোও বর্তমানে লেখা হয়না, যেমন আগে সফটঅয়্যার লেখা হতো, এখন সফটওয়্যার লেখা হয়। কেউ সফটঅয়্যার লেখার জন্য বিতর্ক করেছেন বলে শুনিনি।
::আপনার কথা ঠিক আছে, কোষ দিয়ে যেকোনো কোষ বুঝাতে পারে। তবে শুধু বিশ্বকোষ আর শব্দকোষ নয়। অন্য বিকল্পও দেখা যেতে পারে। তবে উইকি-অভিধানের মধ্যে হাইফেন দিলে প্রকল্পের নাম বা ব্র্যান্ড নাম হিসেবে খুব একটা সুন্দর হয়না। ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ০৬:১৯, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::@[[ব্যবহারকারী:খাত্তাব হাসান|খাত্তাব হাসান]] বাংলা একাডেমি অনু্যায়ী উইকি এবং অভিধান সন্ধি করলে উইক্যভিধান হয়ে যায়, কারণ একাডেমির ব্যাকরণ অনুযায়ী ই এবং অ যুক্ত করলে (ই+অ) য ফলা (্য) বসাতে হয়। তাই একদম শুদ্ধভাবে নামকরণে জটিলতা তৈরি হতে পারে। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১২:৪৭, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
::::হ্যাঁ, আমিও এরকম ভেবেছি, কিন্তু অতৎসম শব্দ হিসাবে "উইকি" কথাটিকে অপরিবর্তিত রাখতেই পছন্দ করি। বাংলায় কিছু অতৎসম শব্দ রয়েছে যা তৎসম ব্যাকরণ মেনে চলে (যেমন "দপ্তর" থেকে "দাপ্তরিক" (মূলভাষা ফার্সি), "নাবালক" থেকে "নাবালিকা" (মূলভাষা আরবি) ইত্যাদি), আবার কিছু শব্দ মেনে চলে না (যেমন "সরকারিকরণ", যদিও কেউ কেউ "সরকারীকরণ"ও লেখে)। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ১৩:৩০, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::@[[ব্যবহারকারী:খাত্তাব হাসান|খাত্তাব হাসান]] শব্দের মাঝে "অ" যুক্ত থাকতে পারে, যেমন - [https://accessibledictionary.gov.bd/bengali-to-bengali.php?q=%E0%A6%A6%E0%A7%81%E0%A6%85%E0%A6%9C এই শব্দটি] দেখুন। এটি বাংলা একাডেমি অভিধানের অংশ। হতে পারে এটি কোন পূর্বের রীতি। তাই, প্রয়োজনীয় তথ্যসূত্র যুক্ত করে আলোচনার মাধ্যমে সিদ্ধান্ত নেওয়া উত্তম। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১৩:৩৯, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
::::{{ping|Md. T Mahtab}} আমি আগেই খাত্তাব দাদাকে বলেছিলাম, "আমি দেখেছি যে অতৎসম শব্দে একদা মাঝখানে "অ" লেখা হতো, যার জায়গায় এখন "য়" লেখা হয়।" আর ঐ "দুঅজ" শব্দটি অতৎসম, যাকে বিকল্পে "দুয়জ"ও লেখা হয়েছে। যাইহোক, আমি আগেও বলেছি যে বর্তমান নাম নিয়ে কোনো অসুবিধা হলে মাঝখানে হাইফেন দেওয়া যেতে পারে (যেমন "উইকি-অভিধান"), কিন্তু এতে সৌন্দর্য ক্ষুণ্ণ হচ্ছে বলে খাত্তাব দাদা মনে করেন। এব্যাপারে আমি একটা কথা মনে করিয়ে দিতে চাই যে এই প্রকল্পেরই ইংরেজি নাম Wiktionary, আর এটাই উইকিমিডিয়ার একমাত্র প্রকল্প যেখানে অন্তত ইউরোপীয় ভাষাগুলিতে প্রকল্পটির নাম "wiki" দিয়ে শুরু হয় না (উইকিমিডিয়া কমন্সকে আমরা সংক্ষেপে "কমন্স" বলি, কিন্তু এর সম্পূর্ণ নাম "উইকি" দিয়ে শুরু)। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ১৩:৫৭, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::::@[[ব্যবহারকারী:Sbb1413|Sbb1413]] হাইফেনের ব্যাপারে আমি সমর্থন করি না। এটা ঠিক যে হাইফেন ব্যবহারে নামের সৌন্দর্যতা হারাবে। এর চেয়ে বরং অপরিবর্তিত রাখলে ভালো হয়। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১৫:০৫, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:"উইকি" ও "অভিধান" শব্দ দুটির সন্ধি করে নাম পরিবর্তন করা যেতে পারে। [[ব্যবহারকারী:Mehedi Abedin|Mehedi Abedin]] ([[ব্যবহারকারী আলাপ:Mehedi Abedin|আলাপ]]) ০৬:৫৭, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
::@[[ব্যবহারকারী:Mehedi Abedin|Mehedi Abedin]] উইকিশব্দকোষ বড় হয়ে যায়, উইকিভিধান কেমন হয়? অ-টা বাদ যাচ্ছে। তবে উইকিয়োভিধান বা উইকিওভিধানও করা যেতে পারে। মাঝখানের অ-কে "ও" তে রূপান্তর করার পুরাতন রীতি আছে। ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ০৭:০৩, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::'''উইকিভিধান''' নামের প্রতি সমর্থন। [[ব্যবহারকারী:Mehedi Abedin|Mehedi Abedin]] ([[ব্যবহারকারী আলাপ:Mehedi Abedin|আলাপ]]) ০৭:৪৯, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::<s>উইকিভিধান নামের প্রতি সমর্থন।</s> কিন্তু আমরা যেমন উইকিপিডিয়াকে সংক্ষেপে "উপি" লিখি, তেমনি উইকিভিধানের ক্ষেত্রে সংক্ষেপে কী লিখতে পারি? বর্তমান নামের ক্ষেত্রে আমরা একে সংক্ষেপে "উঅ" লিখি। '''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ১২:০৭, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
::::@[[ব্যবহারকারী:Sbb1413|Sbb1413]] ''উভি'' লেখা যেতে পারে। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১২:২৯, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::'''উইকিভিধান''' নামের প্রতি {{সমর্থন}}।--[[ব্যবহারকারী:Sajid Reza Karim|Sajid Reza Karim]] ([[ব্যবহারকারী আলাপ:Sajid Reza Karim|আলাপ]]) ১২:৪২, ২২ ডিসেম্বর ২০২৪ (ইউটিসি)
:::উইকিভিধান নামটিকে {{সমর্থন}} করছি।
:::ইংরেজি নামেও বিষয়টি লক্ষ্য করা যায় তারা wiki+ dictionary কে wikitionary লিখে, dic অংশটুকু বাদ দেয় তেমনি আমরাও উইকি + অভিধানকে অ বাদে উইকিভিধান লিখতে পারি যা শুনতেও খারাপ শোনায় না। [[ব্যবহারকারী:R1F4T|R1F4T]] ([[ব্যবহারকারী আলাপ:R1F4T|আলাপ]]) ১৭:১৬, ৩১ ডিসেম্বর ২০২৪ (ইউটিসি)
::::@[[ব্যবহারকারী:R1F4T|R1F4T]] ভাই, এখানে "উইকিঅভিধান" এবং "উইকিভিধান" এর মধ্যে শুদ্ধতার দিক দিয়ে ১ম টি অধিক গ্রহণযোগ্য বলে ধরা হচ্ছে। ইংরেজিতেও গ্রামার অনুযায়ী এবং গ্রহণযোগ্যর দিক দিয়ে "wikitionary" এর পরিবর্তে "wiktionary" গ্রহণ করা হয়েছে। যদিও উইকিভিধান উচ্চারণ এবং নামের দিক দিয়ে সুন্দর দেখায়, কিন্তু এতে ব্যাকরণের দিক দিয়ে শুদ্ধতার বিষয়ে প্রশ্ন উঠে। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১৭:৩৮, ৩১ ডিসেম্বর ২০২৪ (ইউটিসি)
:::::@[[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] আমার মতে নামের ক্ষেত্রে ব্যাকরণ মানতে হবে এমন কোনো কথা নেই। কোনো কিছুর নামকে ব্যাকরণ মানতে হবে কিনা এসম্পর্কে আমার ধারনা নেই। [[ব্যবহারকারী:R1F4T|R1F4T]] ([[ব্যবহারকারী আলাপ:R1F4T|আলাপ]]) ১৭:৪৫, ৩১ ডিসেম্বর ২০২৪ (ইউটিসি)
:নাম পরিবর্তনের {{বিরোধিতা|বিরুদ্ধে}}। [[ব্যবহারকারী:Redmin|Redmin]] ([[ব্যবহারকারী আলাপ:Redmin|আলাপ]]) ১৮:০৩, ২৬ ডিসেম্বর ২০২৪ (ইউটিসি)
: আমিও এখন উইকিঅভিধানের কোনো নাম পরিবর্তনকে সমর্থন করছি না। আর লিখতে অসুবিধা হলে প্রথমে "উইকি অভিধান" লিখুন, তারপর ঐ স্পেসটা বাদ দিন। --'''[[ব্যবহারকারী:Sbb1413|এসবিবি১৪১৩]]''' ([[ব্যবহারকারী আলাপ:Sbb1413|আলাপ]] • [[বিশেষ:অবদান/Sbb1413|অবদান]]) ০৫:৫১, ২৭ ডিসেম্বর ২০২৪ (ইউটিসি)
* নাম যেকোনো কিছু হতে পারে, নাম ব্যাকরণের নিয়ম মেনে রাখতে হবে এমন কোনো বাধ্যবাধকতা নেই। প্রস্তাবিত নামগুলোর চেয়ে বর্তমানের নামটিই আমার কাছে ভালো লাগছে। [[ব্যবহারকারী:MdsShakil|MdsShakil]] ([[ব্যবহারকারী আলাপ:MdsShakil|আলাপ]]) ০৭:৪৬, ৫ জানুয়ারি ২০২৫ (ইউটিসি)
== Open Community Call - [[:m:Expressions of Interest to host Wikimania 2027 in India: Initial conversation|Expressions of Interest to host Wikimania 2027 in India]] ==
<div lang="en" dir="ltr">
''{{int:please-translate}}''
Dear Wikimedians,
Happy 2025.. 😊
As you must have seen, members from Wikimedians of Kerala and Odia Wikimedia User Groups initiated preliminary discussions around submitting an Expression of Interest (EoI) to have Wikimania 2027 in India. You can find out more on the [[:m:Expressions of Interest to host Wikimania 2027 in India: Initial conversation|Meta Page]].
Our aim is to seek input and assess the overall community sentiment and thoughts from the Indian community before we proceed further with the steps involved in submitting the formal EOI.
As part of the same, we are hosting an '''open community call regarding India's Expression of Interest (EOI) to host Wikimania 2027'''. This is an opportunity to gather your valuable feedback, opinions, and suggestions to shape a strong and inclusive proposal.
* 📅 Date: Wednesday, January 15th 2025
* ⏰ Time: 7pm-8pm IST
* 📍 Platform: https://meet.google.com/sns-qebp-hck
Your participation is key to ensuring the EOI reflects the collective aspirations and potential of the vibrant South Asian community.
Let’s join together to make this a milestone event for the Wikimedia movement in South Asia.
We look forward to your presence!
<br>
Warm regards,
<br>
[[:m:Wikimedians of Kerala|Wikimedians of Kerala]] and [[:m:Odia Wikimedians User Group|Odia Wikimedians]] User Group's
<br>
This message was sent with [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) by [[m:User:Gnoeee|Gnoeee]] ([[m:User_talk:Gnoeee|talk]]) at ০৫:৫৫, ১৪ জানুয়ারি ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Indic_VPs&oldid=28100038-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Gnoeee@metawiki পাঠিয়েছেন -->
== Launching! Join Us for Wiki Loves Ramadan 2025! ==
Dear All,
We’re happy to announce the launch of [[m:Wiki Loves Ramadan 2025|Wiki Loves Ramadan 2025]], an annual international campaign dedicated to celebrating and preserving Islamic cultures and history through the power of Wikipedia. As an active contributor to the Local Wikipedia, you are specially invited to participate in the launch.
This year’s campaign will be launched for you to join us write, edit, and improve articles that showcase the richness and diversity of Islamic traditions, history, and culture.
* Topic: [[m:Event:Wiki Loves Ramadan 2025 Campaign Launch|Wiki Loves Ramadan 2025 Campaign Launch]]
* When: Jan 19, 2025
* Time: 16:00 Universal Time UTC and runs throughout Ramadan (starting February 25, 2025).
* Join Zoom Meeting: https://us02web.zoom.us/j/88420056597?pwd=NdrpqIhrwAVPeWB8FNb258n7qngqqo.1
* Zoom meeting hosted by [[m:Wikimedia Bangladesh|Wikimedia Bangladesh]]
To get started, visit the [[m:Wiki Loves Ramadan 2025|campaign page]] for details, resources, and guidelines: Wiki Loves Ramadan 2025.
Add [[m:Wiki Loves Ramadan 2025/Participant|your community here]], and organized Wiki Loves Ramadan 2025 in your local language.
Whether you’re a first-time editor or an experienced Wikipedian, your contributions matter. Together, we can ensure Islamic cultures and traditions are well-represented and accessible to all.
Feel free to invite your community and friends too. Kindly reach out if you have any questions or need support as you prepare to participate.
Let’s make Wiki Loves Ramadan 2025 a success!
For the [[m:Wiki Loves Ramadan 2025/Team|International Team]] ১২:০৭, ১৬ জানুয়ারি ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=27568454-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== তথ্যসূত্র প্রসঙ্গে ==
উইকিঅভিধানে ভুক্তির সঙ্গে কি তথ্যসূত্র যোগ করা হয় না? বেশিরভাগ ভুক্তিরই কোনো তথ্যসূত্র নেই! [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ১৫:২৫, ১৭ জানুয়ারি ২০২৫ (ইউটিসি)
:@[[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] উইকিঅভিধানে তথ্যসূত্র? বিস্তারিত দেখুন: [[:en:Wiktionary:References]]। ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ১৬:৪৩, ১৭ জানুয়ারি ২০২৫ (ইউটিসি)
== 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]]) ০১:১২, ২৪ জানুয়ারি ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=27746256-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== ব্যবহারকারী নাম প্রসঙ্গে ==
[[ব্যবহারকারী:Jgkjhbjyvvh]] এর নামটি ব্যবহারকারী নামকরণ নীতির সাথে সামঞ্জস্য হচ্ছে না। তাই, এই ব্যাপারে পদক্ষেপ নেওয়ার জন্য অনুরোধ জানাচ্ছি। [[ব্যবহারকারী:Md. T Mahtab|Md. T Mahtab]] ([[ব্যবহারকারী আলাপ:Md. T Mahtab|আলাপ]]) ০৮:১৫, ২৪ জানুয়ারি ২০২৫ (ইউটিসি)
==বাংলা উইকিসংযোগ এর জন্য স্বেচ্ছাসেবক আহবান==
সুধীবৃন্দ,
'''বাংলা উইকিসংযোগ''' (ইংরেজি: Bangla WikiConnect) হলো বাংলা ভাষার উইকিপিডিয়ানদের একটি সমন্বিত উদ্যোগ, যার মূল লক্ষ্য বাংলা উইকিমিডিয়া প্রকল্পগুলোতে বিভিন্ন প্রতিযোগিতা ও এডিটাথন আয়োজনে সমন্বয় সাধন করা। প্রতিবছর পৃথক পৃথক আয়োজনের কারণে আয়োজক ও উইকিমিডিয়া ফাউন্ডেশনের ওপর বাড়তি চাপ পড়ে। এই চ্যালেঞ্জ মোকাবিলা ও প্রতিযোগিতার ধারাবাহিকতা বজায় রাখতে উইকিমিডিয়া ফাউন্ডেশনের পরামর্শ অনুযায়ী আয়োজকরা একটি বছরব্যাপী পরিকল্পনা গ্রহণ করেছেন।
আমরা আনন্দের সঙ্গে ঘোষণা করছি যে, বাংলা উইকিসংযোগের আওতায় শীঘ্রই বিভিন্ন প্রতিযোগিতা আয়োজন করা হবে। এর ফলে অংশগ্রহণকারীরা সুসংগঠিত ও কার্যকরভাবে অবদান রাখতে পারবেন এবং প্রতিযোগিতার প্রভাব দীর্ঘমেয়াদি হবে।
আমাদের এই অগ্রযাত্রাকে ত্বরান্বিত করতে আপনিও যুক্ত হোন আমাদের সাথে। নিম্নোক্ত বিভাগে আমরা স্বেচ্ছাসেবক আহ্বান করছি।
* প্রতিযোগিতার আয়োজক ও পর্যালোচক
* প্রতিবেদন, ব্লগ, অন-উইকি নথি লেখা
* ফটোওয়াকে অংশগ্রহণ
* গ্রাফিক্স ডিজাইন
* ভিডিও সম্পাদনা
* টেমপ্লেট, মডিউল উন্নয়ন
* ডিজিটাল মার্কেটিং
আগ্রহী স্বেচ্ছাসেবীদের [https://docs.google.com/forms/d/e/1FAIpQLSebsy-4Dx1sv9eaFuT8jWVhmgKytiPGNt8bmXg238WCEJVmOg/viewform ফর্মটি] পূরণের জন্য উৎসাহিত করা হচ্ছে।
আশা করি, এই উদ্যোগের মাধ্যমে বাংলা উইকিমিডিয়া প্রকল্পসমূহ আরও সমৃদ্ধ হবে এবং অবদানকারীদের জন্য সহায়ক প্ল্যাটফর্ম হিসেবে গড়ে ওঠবে।
পক্ষে <br/>
[[User:RiazACU|রিয়াজ]]<br/>
[[:m:Bangla WikiConnect|বাংলা উইকিসংযোগ]] ০৬:২৬, ৩১ জানুয়ারি ২০২৫ (ইউটিসি)
== 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]]) ০০:৪৯, ৩ ফেব্রুয়ারি ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28198931-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== <span lang="en" dir="ltr">Migration to Parsoid</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Hello everyone! I am glad to inform you that as the next step in the [[mw:Special:MyLanguage/Parsoid/Parser Unification|Parser Unification]] project, Parsoid will soon be turned on as the default article renderer on your Wiktionary. We are gradually increasing the number of wikis using Parsoid, with the intention of making it the default wikitext parser for MediaWiki's next long-term support release. This will make our wikis more reliable and consistent for editors, readers, and tools to use, as well as making the development of future wikitext features easier.
If this transition disrupts your workflow, don’t worry! You can still opt out through a user preference or turn Parsoid off on the current page using the Tools submenu, as described in the [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]] documentation.
There is [[mw:Special:MyLanguage/Parsoid/Parser_Unification/Confidence_Framework|more information about our roll-out strategy]] available, including the testing done before we turn on Parsoid for a new wiki.
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]].
<section end="announcement-content" />
</div>
<em>[[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Parsoid Read Views/Wiktionary Announcement|{{MediaWiki:Please-translate}}]]</em>
<bdi lang="en" dir="ltr">[[mw:User:CAnanian (WMF)|C. Scott Ananian]] (Parsoid technical lead)</bdi> ২০:৪৮, ১২ ফেব্রুয়ারি ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Wikimedia_Foundation/Product_and_Technology/Parsoid_Read_Views/2025-02-12_Wiktionaries&oldid=28256121-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:CAnanian (WMF)@metawiki পাঠিয়েছেন -->
== প্রধান পাতায় শব্দছবির সংযোগ সরিয়ে দিয়েছি ==
যেহেতু এটি লাল সংযোগ ছিল। [[ব্যবহারকারী:Greatder|Greatder]] ([[ব্যবহারকারী আলাপ:Greatder|আলাপ]]) ১১:৫৭, ১৫ ফেব্রুয়ারি ২০২৫ (ইউটিসি)
== উইকিপত্রিকার নতুন সংখ্যা: ফাল্গুন ১৪৩১ ==
সুধী! উইকিপত্রিকার নতুন সংখ্যা প্রকাশিত হয়েছে। আপনি নিচের তালিকা থেকে পছন্দমত প্রবন্ধগুলি পড়তে পারেন।<div lang="bn" dir="ltr" class="mw-content-ltr"><div style="-moz-column-count:2; -webkit-column-count:2; column-count:2;"> * সম্পাদকীয়: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/সম্পাদকীয়|উইকিবসন্ত: পর্যালোচনা ও প্রস্তাবনা]]
* সাক্ষাৎকার: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/সাক্ষাৎকার|উইকিপিডিয়ায় বাংলা ভাষার প্রতি দায়িত্ববোধ থেকে লিখুন]]
* বিশেষ প্রতিবেদন: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/বিশেষ_প্রতিবেদন|শুদ্ধ বানানে উইকিপিডিয়া]]
* সাধারণ: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/সাধারণ|প্রজেক্ট ২০২৫ বনাম উইকিপিডিয়া]]
* উইকিপিডিয়া: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/উইকিপিডিয়া|উইকিপিডিয়ায় নিজেকে রাখুন সুরক্ষিত]]
* পরিসংখ্যান: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/পরিসংখ্যান|জানুয়ারি টপ টেন]]
* উইকিমিডিয়া সংবাদ: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ফাল্গুন_১৪৩১/উইকিমিডিয়া_সংবাদ|একুশে পদক পেলেন বাংলা উইকিমিডিয়া সম্প্রদায়ের দুইজন]]
</div>
{{flatlist|style= margin-top:10px; font-size:90%; padding-left:5px; font-family:Kalpurush, TiroBangla, Noto Sans Bengali, Siyam Rupali, Shonar Bangla; |
* '''[[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা|সম্পূর্ণ উইকিপত্রিকা পড়ুন]]'''
* [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/দেয়ালিকা|দেয়ালিকা]]
* [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/গ্রাহক_তালিকা|আনসাবস্ক্রাইব করুন]]
* [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বার্তাকক্ষ/দ্রুত_আরম্ভ|লেখা পাঠান]] (পাঠানোর শেষ তারিখ: ০৭ মার্চ ২০২৫)}}
-- [[:w:bn:উইকিপিডিয়া:WP/A|উইকিপত্রিকা সম্পাদকদল]]ের পক্ষে,<br /> ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ১৭:১৩, ২১ ফেব্রুয়ারি ২০২৫ (ইউটিসি)
== <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> ০৮:৩০, ২২ ফেব্রুয়ারি ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28217779-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:SSethi (WMF)@metawiki পাঠিয়েছেন -->
== শুরু হচ্ছে বাংলার প্রেমে উইকি ২০২৫! ==
[[File:বাংলার প্রেমে উইকি লোগো.svg|right|200px|frameless|link=Commons:Wiki Loves Bangla 2025]]
সুধী,
বাংলার প্রেমে উইকি দলের পক্ষ থেকে শুভেচ্ছা!
আমরা আনন্দের সঙ্গে ঘোষণা করছি, শীঘ্রই [[c:Commons:Wiki Loves Bangla 2025|বাংলার প্রেমে উইকি ২০২৫]] শুরু হতে যাচ্ছে! এবছর প্রতিযোগিতার থিম '''বাংলার পাখি''', যেখানে অংশগ্রহণকারীরা বাংলার বৈচিত্র্যময় পাখির ছবি ধারণ ও শেয়ার করতে পারবেন।
'''প্রতিযোগিতার বিস্তারিত'''
:📅 সময়: '''১ – ৩১ মার্চ ২০২৫'''
:📍 থিম: '''বাংলার পাখি'''
:🎯 আয়োজক: [[meta:Bangla WikiMoitree|বাংলা উইকিমৈত্রী]]
'''[[c:Commons:Wiki Loves Bangla 2025|বাংলার প্রেমে উইকি]]''' হল উইকিমিডিয়া কমন্সে আয়োজিত একটি আন্তর্জাতিক আলোকচিত্র প্রতিযোগিতা, যা বিশ্বজুড়ে বাংলা সংস্কৃতি ও ঐতিহ্যকে নথিভুক্ত করতে আয়োজিত হয়। [[meta:Bangla Culture and Heritage Collation Program|বাংলা সংস্কৃতি ও ঐতিহ্য সংরক্ষণ কর্মসূচী]]র অংশ হিসেবে, এটি প্রতিবছর একটি নির্দিষ্ট থিমকে কেন্দ্র করে আয়োজিত হয়, যেখানে অংশগ্রহণকারীরা মুক্ত জ্ঞান সম্প্রসারণের লক্ষ্যে উইকিমিডিয়া কমন্সে তাদের তোলা আলোকচিত্র জমা করেন। এই প্রতিযোগিতার মাধ্যমে আপনি এই সম্প্রদায়ের অংশ হয়ে উঠতে পারেন, যারা বাংলার পাখির সৌন্দর্য, আচরণ ও জীববৈচিত্র্য সংরক্ষণ ও প্রদর্শনের লক্ষ্যে কাজ করছে। এই উদ্যোগের লক্ষ্য হল বাংলার প্রাকৃতিক ঐতিহ্যের সমৃদ্ধি বিশ্ববাসীর কাছে তুলে ধরা।
'''আমি কীভাবে অংশ নিতে পারি?'''
প্রতিযোগিতাটি '''১ - ৩১ মার্চ ২০২৫''' পর্যন্ত উইকিমিডিয়া কমন্সে চলবে। অংশ নিতে আপনাকে যা করতে হবে—
:📷 '''বাংলার পাখি'''র ছবি তুলুন।.
:📤 উইকিমিডিয়া কমন্সে উইকি লাভস বাংলা ২০২৫ ক্যাটাগরির অধীনে আপনার ছবি আপলোড করুন।
:📖 প্রতিযোগিতার নিয়ম ও নির্দেশিকা জানতে [[c:Commons:Wiki Loves Bangla 2025|প্রতিযোগিতার পাতা]] দেখুন।
'''কেন অংশ নিবেন?'''
আপনার অবদানের মাধ্যমে বাংলার পাখি ও প্রকৃতির বৈচিত্র্য নথিভুক্ত হবে এবং সকলের জন্য জ্ঞান সহজলভ্য হবে। পাশাপাশি, রয়েছে [[c:Commons:Wiki Loves Bangla 2025#Prizes|আকর্ষণীয় পুরস্কার]]!
'''পুরস্কার'''
:[[File:Simple gold cup.svg|20px]] '''১ম পুরস্কার''': ৫০,০০০ টাকা, ক্রেস্ট এবং সনদপত্র
:[[File:Simple silver cup.svg|20px]] '''২য় পুরস্কার''': ২৫,০০০ টাকা, ক্রেস্ট এবং সনদপত্র
:[[File:Simple bronze cup.svg|20px]] '''৩য় পুরস্কার''': ১৫,০০০ টাকা, ক্রেস্ট এবং সনদপত্র
:[[File:Icons8 flat diploma 1.svg|20px]] '''৪র্থ-৫ম পুরস্কার''': ক্রেস্ট ও সনদপত্র
:[[File:Icons8 flat diploma 1.svg|20px]] '''৬ষ্ঠ-১০ম পুরস্কার''': সনদপত্র
:[[File:Icons8 flat diploma 1.svg|20px]] '''শীর্ষ আপলোডার পুরস্কার''': সনদপত্র
আপনি যদি এই আলোকচিত্র প্রতিযোগিতায় অংশ নিতে চান, তাহলে এখনই ছবি তোলা শুরু করুন এবং উইকিমিডিয়া কমন্সে আসন্ন প্রতিযোগিতার জন্য প্রস্তুত হন! প্রতিযোগিতার নিয়ম ও পরিসর সম্পর্কে আরও জানতে, [[c:Commons:Wiki Loves Bangla 2025#Competition Rules|এখানে]] দেখুন। কোনো প্রশ্ন থাকলে আমাদের [http://mailto::info@wikimedia.org.bd ইমেইল করুন] বা আমাদের [https://t.me/WikiLovesBangla টেলিগ্রাম গ্রুপে] যোগ দিন।
শুভেচ্ছান্তে,</br>
'''বাংলার প্রেমে উইকি আয়োজক দল'''
<nowiki>#WikiLovesBangla</nowiki></br> [[ব্যবহারকারী:Moheen|মহীন রীয়াদ]] ([[ব্যবহারকারী আলাপ:Moheen|আলাপ]]) ১২:৫২, ২৮ ফেব্রুয়ারি ২০২৫ (ইউটিসি)
== 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)]] ১৮:৫২, ৭ মার্চ ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28307738-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
==উইকিপত্রিকার নতুন সংখ্যা: চৈত্র ১৪৩১==
সুপ্রিয়!<br />উইকিপত্রিকার নতুন সংখ্যা প্রকাশিত হয়েছে। আপনি নিচের তালিকা থেকে পছন্দমত প্রবন্ধগুলি পড়তে পারেন।
<div lang="bn" dir="ltr" class="mw-content-ltr"><div style="-moz-column-count:2; -webkit-column-count:2; column-count:2;">
* সম্পাদকীয়: [[w:উইকিপিডিয়া:উইকিপত্রিকা/চৈত্র_১৪৩১/সম্পাদকীয়|ত্যাগের মাসে উইকিপিডিয়ায় অবদান]]
* সাক্ষাৎকার: [[w:উইকিপিডিয়া:উইকিপত্রিকা/চৈত্র_১৪৩১/সাক্ষাৎকার|বাংলা উইকিপিডিয়াকে আরও সমৃদ্ধ করতে হলে আমাদের সবাইকে একসাথে কাজ করতে হবে]]
* বিশেষ প্রতিবেদন: [[w:উইকিপিডিয়া:উইকিপত্রিকা/চৈত্র_১৪৩১/বিশেষ_প্রতিবেদন|বাংলা উইকিসংযোগের উদ্যোগ]]
* পরিসংখ্যান: [[w:উইকিপিডিয়া:উইকিপত্রিকা/চৈত্র_১৪৩১/পরিসংখ্যান|ফেব্রুয়ারির শীর্ষ দশ]]
* উইকিমিডিয়া সংবাদ: [[w:উইকিপিডিয়া:উইকিপত্রিকা/চৈত্র_১৪৩১/উইকিমিডিয়া_সংবাদ|বৈশ্বিকভাবে পরিচালিত হচ্ছে উইকি রমজান ভালোবাসে]]
</div>{{flatlist|style= margin-top:10px; font-size:90%; padding-left:5px; font-family:Kalpurush, TiroBangla, Noto Sans Bengali, Siyam Rupali, Shonar Bangla; |
* '''[[w:উইকিপিডিয়া:উইকিপত্রিকা|সম্পূর্ণ উইকিপত্রিকা পড়ুন]]'''
* [[w:উইকিপিডিয়া:উইকিপত্রিকা/দেয়ালিকা|দেয়ালিকা]]
* [[w:উইকিপিডিয়া:উইকিপত্রিকা/গ্রাহক_তালিকা|আনসাবস্ক্রাইব করুন]]
* [[w:উইকিপিডিয়া:উইকিপত্রিকা/বার্তাকক্ষ/দ্রুত_আরম্ভ|লেখা পাঠান]] (পাঠানোর শেষ তারিখ: ১৩ এপ্রিল ২০২৫)}}</div>
[[w:উইকিপিডিয়া:উইকিপত্রিকা/বৃত্তান্ত|উইকিপত্রিকা সম্পাদকদলের]] পক্ষে, ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ১৬:২৮, ৮ মার্চ ২০২৫ (ইউটিসি)
== আপনার উইকি শীঘ্রই পঠন মোডে যাবে ==
<section begin="server-switch"/><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|এই বার্তাটি অন্য ভাষায় পড়ুন]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
[[foundation:|উইকিমিডিয়া ফাউন্ডেশন]] তার উপাত্ত কেন্দ্রগুলির মধ্যে ট্রাফিক আনা-নেওয়ার বিষয়টি পরীক্ষা করবে। এটি নিশ্চিত করবে যে উইকিপিডিয়া এবং উইকিমিডিয়ার অন্যান্য উইকিসমূহ এমনকি একটি দুর্যোগের পরেও অনলাইন থাকবে।
সকল ট্রাফিক সুইচ করার তারিখ হলো '''{{#time:j xg|2025-03-19|bn}}'''। পরীক্ষাটি শুরু হবে '''[https://zonestamp.toolforge.org/{{#time:U|2025-03-19T14:00|en}} {{#time:H:i e|2025-03-19T14:00}}]'''-তে (বাংলাদেশ সময় রাত ৮টায় ও পশ্চিমবঙ্গ সময় রাত ৭টা ৩০ মিনিটে)।
দুর্ভাগ্যবশত, [[mw:Special:MyLanguage/Manual:What is MediaWiki?|মিডিয়াউইকির]] কিছু সীমাবদ্ধতার কারণে, এই পরিবর্তনের সময় সব সম্পাদনা অবশ্যই বন্ধ রাখতে হবে। এই ব্যাঘাত ঘটানোর জন্য আমরা ক্ষমাপ্রার্থী, এবং আমরা ভবিষ্যতে এটিকে হ্রাস করার জন্য কাজ করছি।
এই কার্যক্রমটি শুরু হওয়ার ৩০ মিনিট পূর্বে সমস্ত উইকিতে একটি ব্যানার প্রদর্শন করা হবে। এই ব্যানারটি অপারেশন শেষ না হওয়া পর্যন্ত দৃশ্যমান থাকবে।
'''সব উইকিতে অল্প সময়ের জন্য, আপনি সম্পাদনা করতে পারবেন না, তবে আপনি উইকি পড়তে সক্ষম হবেন।'''
*আপনি {{#time:l j xg Y|2025-03-19|bn}}-এ প্রায় এক ঘণ্টা পর্যন্ত সম্পাদনা করতে পারবেন না।
*আপনি যদি এই সময়ে সম্পাদনা করার বা সংরক্ষণ করার চেষ্টা করেন, তাহলে আপনি একটি ত্রুটি বার্তা দেখতে পাবেন। আমরা আশা করি যে কোনও সম্পাদনা এই সময়ের মধ্যে নষ্ট হবে না, কিন্তু আমরা তার নিশ্চয়তা দিতে পারছি না। আপনি যদি ত্রুটি বার্তাটি দেখতে পান, তাহলে অনুগ্রহ করে অপেক্ষা করুন যতক্ষণ না সবকিছু স্বাভাবিক অবস্থায় ফিরে আসছে। এরপর আপনি আপনার সম্পাদনা সংরক্ষণ করতে সক্ষম হবেন। সতর্কতাস্বরূপ, আমরা সুপারিশ করছি যে উক্ত সময়ে আপনি আপনার সম্পাদনার একটি অনুলিপি তৈরি করে রাখুন।
''অন্যান্য প্রভাব'':
*পটভূমির কাজগুলো ধীর হবে এবং কিছু নাও কাজ করতে পারে। লাল লিঙ্কগুলো স্বাভাবিকের মত দ্রুত হালনাগাদ নাও হতে পারে। আপনি যদি একটি নিবন্ধ তৈরি করেন যা ইতিমধ্যে অন্য কোথাও সংযুক্ত আছে, সেক্ষেত্রে লিঙ্ক স্বাভাবিকের চেয়ে বেশি সময় ধরে লাল থাকবে। কিছু দীর্ঘ চলমান স্ক্রিপ্ট বন্ধ করতে হবে।
* আমরা আশা করি যে কোড হালনাগাদগুলি অন্য সপ্তাহের মতো চলবে। তবে যদি অপারেশনের পর প্রয়োজন হয়, কিছু ক্ষেত্রে কোড হালনাগাদ বন্ধ থাকতে পারে।
* [[mw:Special:MyLanguage/GitLab|গিটল্যাব]] প্রায় ৯০ মিনিটের জন্য অনুপলব্ধ থাকবে।
যদি প্রয়োজন হয় তাহলে এই প্রকল্পটি স্থগিত করা হতে পারে। আপনি [[wikitech:Switch_Datacenter|wikitech.wikimedia.org তে সময়সূচি পড়তে পারেন]]। যেকোনো পরিবর্তন সময়সূচীতে ঘোষণা করা হবে।
'''দয়া করে আপনার সম্প্রদায়কে এই তথ্যটি জানান।'''</div><section end="server-switch"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> ২৩:১৫, ১৪ মার্চ ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=28307742-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Quiddity (WMF)@metawiki পাঠিয়েছেন -->
== 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]]) ০২:০৫, ৪ এপ্রিল ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28469465-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== Wikidata and Sister Projects: An online community event ==
''(Apologies for posting in English)''
Hello everyone, I am excited to share news of an upcoming online event called '''[[d:Event:Wikidata_and_Sister_Projects|Wikidata and Sister Projects]]''' celebrating the different ways Wikidata can be used to support or enhance with another Wikimedia project. The event takes place over 4 days between '''May 29 - June 1st, 2025'''.
We would like to invite speakers to present at this community event, to hear success stories, challenges, showcase tools or projects you may be working on, where Wikidata has been involved in Wikipedia, Commons, WikiSource and all other WM projects.
If you are interested in attending, please [[d:Special:RegisterForEvent/1291|register here]].
If you would like to speak at the event, please fill out this Session Proposal template on the [[d:Event_talk:Wikidata_and_Sister_Projects|event talk page]], where you can also ask any questions you may have.
I hope to see you at the event, in the audience or as a speaker, - [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ০৯:১৮, ১১ এপ্রিল ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Send_List&oldid=28525705-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Danny Benjafield (WMDE)@metawiki পাঠিয়েছেন -->
==উইকিপত্রিকার নতুন বর্ষের প্রথম সংখ্যা: বৈশাখ ১৪৩২==
সবাইকে নববর্ষের শুভেচ্ছা!<br/>
নতুন বর্ষের প্রথম সংখ্যা হিসেবে উইকিপত্রিকার নতুন সংখ্যা প্রকাশিত হয়েছে। আপনি নিচের তালিকা থেকে পছন্দমত প্রবন্ধগুলি পড়তে পারেন।
<div lang="bn" dir="ltr" class="mw-content-ltr"><div style="-moz-column-count:2; -webkit-column-count:2; column-count:2;">
* সম্পাদকীয়: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/সম্পাদকীয়|আগামীর পথে বাংলা উইকিপত্রিকা]]
* বিশেষ প্রতিবেদন: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/বিশেষ প্রতিবেদন|হাতি, ঘোড়া, রাণী শেষ! এবার চেকমেট!]]
* সাক্ষাৎকার: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/সাক্ষাৎকার|অনেক বন্ধুকে আমি সরাসরি উইকিপিডিয়ায় যুক্ত করেছি]]
* ছবিঘর: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/ছবিঘর|গল্পে গল্পে বাংলার প্রেমে উইকি ২০২৫-এর কিছু ছবি]]
* পরিসংখ্যান: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/পরিসংখ্যান|মার্চের শীর্ষ দশ]]
* উইকিমিডিয়া সংবাদ: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/উইকিমিডিয়া সংবাদ|ঢাকা উইকিমিডিয়া সম্প্রদায় গঠিত]]
* উইকিপ্রযুক্তি: [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বৈশাখ ১৪৩২/উইকিপ্রযুক্তি|উইকিমিডিয়া সংক্রান্ত প্রতিযোগিতার ভবিষ্যত]]
</div>
{{flatlist|style= margin-top:10px; font-size:90%; padding-left:5px; font-family:Kalpurush, TiroBangla, Noto Sans Bengali, Siyam Rupali, Shonar Bangla; |
* '''[[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা|সম্পূর্ণ উইকিপত্রিকা পড়ুন]]'''
* [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/দেয়ালিকা|দেয়ালিকা]]
* [[:w:bn:উইকিপিডিয়া:উইকিপত্রিকা/বার্তাকক্ষ/দ্রুত_আরম্ভ|লেখা পাঠান]] (পরবর্তী মাসের জন্য লেখা পাঠানোর শেষ তারিখ: '''১৫ মে ২০২৫''')}}
-- [[:w:bn:উইকিপিডিয়া:WP/A|উইকিপত্রিকা সম্পাদকদলের]] পক্ষে, ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ১৮:৫৩, ১৪ এপ্রিল ২০২৫ (ইউটিসি)
== 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]]) ০০:৩৫, ১৭ এপ্রিল ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28469465-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== ইউসিওসির প্রয়োগ নির্দেশিকা এবং ইউ৪সি সনদের প্রস্তাবিত পরিবর্তন নিয়ে ভোট চলছে ==
<section begin="announcement-content" />
সর্বজনীন আচরণবিধির প্রয়োগ নির্দেশিকা ও ইউ৪সি সনদের সংশোধনীর ভোটগ্রহণ পর্ব ১ মে ২০২৫ তারিখের ২৩:৫৯ ইউটিসি-তে শেষ হবে ([https://zonestamp.toolforge.org/1746162000 আপনার সময় অঞ্চলে দেখুন])। [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2025/Voter information|ভোট দেওয়ার আগে মেটা-উইকির ইউসিওসি পাতায় অংশগ্রহণের নিয়মাবলি পড়ুন এবং প্রস্তাবটি ভালোভাবে পর্যালোচনা করুন]]।
[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|সর্বজনীন আচরণবিধি সমন্বয় কমিটি (ইউ৪সি)]] একটি বৈশ্বিক দল, যেটি ইউসিওসি-এর ন্যায়সঙ্গত ও ধারাবাহিক বাস্তবায়ন নিশ্চিত করার জন্য কাজ করে। এই বার্ষিক পর্যালোচনাটি ইউ৪সি-এর পরিকল্পনা ও বাস্তবায়নের মাধ্যমে সম্পন্ন হয়েছে। ইউ৪সি সম্পর্কিত আরও তথ্য এবং তাদের দায়িত্ব সম্পর্কে জানতে চাইলে আপনি [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|ইউ৪সি সনদ]] দেখতে পারেন।
দয়া করে এই বার্তাটি আপনার সম্প্রদায়ের সদস্যদের জানান, যাতে তারাও এই প্রক্রিয়ায় অংশ নিতে পারে।
ইউ৪সি-র পক্ষে -- <section end="announcement-content" />
<div lang="en" dir="ltr" class="mw-content-ltr">
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) ০৩:৪২, ২৯ এপ্রিল ২০২৫ (ইউটিসি)</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28618011-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== We will be enabling the new Charts extension on your wiki soon! ==
''(Apologies for posting in English)''
Hi all! We have good news to share regarding the ongoing problem with graphs and charts affecting all wikis that use them.
As you probably know, the [[:mw:Special:MyLanguage/Extension:Graph|old Graph extension]] was disabled in 2023 [[listarchive:list/wikitech-l@lists.wikimedia.org/thread/EWL4AGBEZEDMNNFTM4FRD4MHOU3CVESO/|due to security reasons]]. We’ve worked in these two years to find a solution that could replace the old extension, and provide a safer and better solution to users who wanted to showcase graphs and charts in their articles. We therefore developed the [[:mw:Special:MyLanguage/Extension:Chart|Charts extension]], which will be replacing the old Graph extension and potentially also the [[:mw:Extension:EasyTimeline|EasyTimeline extension]].
After successfully deploying the extension on Italian, Swedish, and Hebrew Wikipedia, as well as on MediaWiki.org, as part of a pilot phase, we are now happy to announce that we are moving forward with the next phase of deployment, which will also include your wiki.
The deployment will happen in batches, and will start from '''May 6'''. Please, consult [[:mw:Special:MyLanguage/Extension:Chart/Project#Deployment Timeline|our page on MediaWiki.org]] to discover when the new Charts extension will be deployed on your wiki. You can also [[:mw:Special:MyLanguage/Extension:Chart|consult the documentation]] about the extension on MediaWiki.org.
If you have questions, need clarifications, or just want to express your opinion about it, please refer to the [[:mw:Special:MyLanguage/Extension_talk:Chart/Project|project’s talk page on Mediawiki.org]], or ping me directly under this thread. If you encounter issues using Charts once it gets enabled on your wiki, please report it on the [[:mw:Extension_talk:Chart/Project|talk page]] or at [[phab:tag/charts|Phabricator]].
Thank you in advance! -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) ১৫:০৮, ৬ মে ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=28663781-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Sannita (WMF)@metawiki পাঠিয়েছেন -->
== আন্তর্জাতিক জাদুঘর দিবস সম্পাদনাসভা ২০২৫ ==
<div style="margin: 1em 0; padding: 1em; border: 1px solid #6c8cc8; background-color: #f9f9f9; border-radius: 6px;">
সুপ্রিয়,
[[চিত্র:আন্তর্জাতিক জাদুঘর দিবস সম্পাদনা সভা ২০২৫ (ব্যানার).png|350px|right|link=উইকিপিডিয়া:আন্তর্জাতিক জাদুঘর দিবস সম্পাদনাসভা ২০২৫]]
'''আন্তর্জাতিক জাদুঘর দিবস''' উপলক্ষে <mark>'''২০২৫ সালের ১৮–২৪ মে'''</mark> বাংলা উইকিপিডিয়ায় এক সপ্তাহব্যাপী একটি বিশেষ অনলাইন সম্পাদনাসভার আয়োজন করা হয়েছে। ২০২৪ সালে প্রথমবার আয়োজিত এই উদ্যোগের ধারাবাহিকতায়, এ বছরেও আমাদের লক্ষ্য—বাংলা ভাষায় জাদুঘর ও সংশ্লিষ্ট বিষয়বস্তুসমূহের তথ্য সমৃদ্ধ ও মানোন্নয়ন করা। আপনার অবদান ও সম্পাদনার মাধ্যমে আপনি এই জ্ঞানভিত্তিক কার্যক্রমে অংশ নিতে পারেন। অংশগ্রহণকারীদের অবদানের স্বীকৃতিস্বরূপ প্রদান করা হবে '''উইকিপদক ও ডিজিটাল সনদপত্র'''। সম্পাদনাসভা সম্পর্কিত বিস্তারিত জানতে দেখুন '''[[w:bn:উইকিপিডিয়া:আন্তর্জাতিক জাদুঘর দিবস সম্পাদনাসভা ২০২৫|আয়োজনের মূল পাতা]]'''। আপনার অংশগ্রহণ বাংলা উইকিপিডিয়াকে আরও সমৃদ্ধ করার পথে একটি গুরুত্বপূর্ণ অবদান রাখবে।
আপনার সম্পাদনা শুভ হোক।
[[w:bn:উইকিমিডিয়া বাংলাদেশ|উইকিমিডিয়া বাংলাদেশের]] পক্ষে,<br/>
[[ব্যবহারকারী:Moheen|~'''মহীন''']] [[ব্যবহারকারী আলাপ:Moheen|<sup>(আলাপ)</sup>]] ২২:৩৩, ১২ মে ২০২৫ (ইউটিসি)
</div>
== Wikifunctions will be deployed on your wiki on May 27 ==
Hi all, we want to let you know that [[wikifunctions:Wikifunctions:Main_Page|Wikifunctions]] is coming to your project on May 27! When enabled, you will be able to call functions from your project, and integrate them in your articles.
A function is something that takes one or more inputs and transforms them into a desired output. Think of adding up two numbers, or converting miles into metres, or calculating how much time has passed since an event, or declining a word into a case. This is usually done with templates that are complicated to create or to import. With Wikifunctions, you will be able to do this with just a couple of clicks!
Please check out [[wikifunctions:Wikifunctions:Introduction|these tutorials]] for more details. You’re also invited to [[wikifunctions:Special:CreateObject|create]] functions that you find useful, or [[wikifunctions:Wikifunctions:Suggest_a_function|ask for help from the Wikifunctions community]].
We would like to invite you to contribute to Wikifunctions, by translating the existing functions labels into your language, so that more users in your community can more easily reuse them on the project.
Of course, we are happy to help in case there are questions or difficulties, and we are ready to listen to your feedback. Please ping me directly in case of necessity or reach out to me on my talk page. Thank you in advance! [[ব্যবহারকারী:Sannita (WMF)|Sannita (WMF)]] ([[ব্যবহারকারী আলাপ:Sannita (WMF)|আলাপ]]) ১৪:০৬, ১৫ মে ২০২৫ (ইউটিসি)
== সর্বজনীন আচরণবিধি সমন্বয় কমিটির জন্য আগ্রহী প্রার্থীদের প্রার্থীতা আহ্বান করা হচ্ছে ==
<section begin="announcement-content" />
সার্বজনীন আচরণবিধির বাস্তবায়ন নির্দেশিকা এবং সার্বজনীন আচরণবিধি সমন্বয় কমিটির (ইউ৪সি) সনদের উপর ভোটের ফলাফল [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2025#Results|মেটা-উইকিতে উপলব্ধ]] রয়েছে।
আপনি এখন থেকে ২৯ মে ২০২৫ তারিখ ১২:০০ ইউটিসি পর্যন্ত [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2025/Candidates|ইউ৪সি-তে আপনার প্রার্থীতা জমা দিতে]] পারেন। [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Election/2025|যোগ্যতা, প্রক্রিয়া এবং সময়সীমা সম্পর্কিত তথ্য মেটা-উইকিতে]] রয়েছে। প্রার্থীদের নিয়ে ১ জুন ২০২৫ তারিখ থেকে ভোট শুরু হবে এবং দুই সপ্তাহ ধরে চলে ১৫ জুন ২০২৫ তারিখ ১২:০০ ইউটিসিতে শেষ হবে।
আপনার যদি কোনো প্রশ্ন থাকে, তবে আপনি তা [[m:Talk:Universal Code of Conduct/Coordinating Committee/Election/2025|নির্বাচনের আলোচনা পাতায়]] জিজ্ঞাসা করতে পারেন। -- ইউ৪সির পক্ষে, </div><section end="announcement-content" />
<bdi lang="en" dir="ltr">[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User_talk:Keegan (WMF)|আলোচনা]])</bdi> ২২:০৮, ১৫ মে ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28618011-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== 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>]]) ১৫:২৭, ২২ মে ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=User:Sannita_(WMF)/Mass_sending_test&oldid=28768453-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Sannita (WMF)@metawiki পাঠিয়েছেন -->
== উইকিমিডিয়া ফাউন্ডেশনের ট্রাস্টি বোর্ড ২০২৫ নির্বাচন এবং প্রশ্নের জন্য আহ্বান ==
<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}}]''
প্রিয় সবাই,
এই বছর, উইকিমিডিয়া ফাউন্ডেশনের ট্রাস্টি বোর্ডের সম্প্রদায়- এবং অধিভুক্ত-নির্বাচিত ২ (দুই) জন ট্রাস্টির মেয়াদ শেষ হবে [১]। বোর্ড সমগ্র আন্দোলনকে এই বছরের নির্বাচন প্রক্রিয়ায় অংশগ্রহণ করার জন্য এবং সেই আসনগুলি পূরণের উদ্দেশ্যে ভোট দেওয়ার জন্য আমন্ত্রণ জানাচ্ছে।
নির্বাচন কমিটি ফাউন্ডেশন কর্মীদের সহায়তায় এই প্রক্রিয়াটি তদারকি করবে [২]। শাসন কমিটি ২০২৫ সালের ট্রাস্টি নির্বাচন প্রক্রিয়ার জন্য বোর্ড তত্ত্বাবধান প্রদান করেছে এবং তারা বোর্ডকে অবহিত রাখার ক্ষেত্রে দায়িত্বপ্রাপ্ত। এই কমিটি ২০২৫ সালের সম্প্রদায়- এবং অধিভুক্ত-নির্বাচিত ট্রাস্টি নির্বাচন প্রক্রিয়ার প্রার্থী নন এমন ট্রাস্টিদের (রাজু নারিসেত্তি, শানি ইভেনস্টাইন সিগালভ, লরেঞ্জো লোসা, ক্যাথি কলিন্স, ভিক্টোরিয়া ডোরোনিনা এবং এসরা’আ আল শাফেই)[৩] নিয়ে গঠিত। নির্বাচন কমিটি, বোর্ড এবং কর্মীদের ভূমিকা সম্পর্কে আরও বিশদ এখানে পাওয়া যাবে [৪]।
এখানে মূল পরিকল্পিত তারিখগুলি দেওয়া হল:
* ২২শে মে – ৫ই জুল: ঘোষণা (এই যোগাযোগের) এবং প্রশ্ন আহ্বানের সময়কাল [৬]
* ১৭ই জুন – ১লা জুলাই, ২০২৫: প্রার্থী পদ আহ্বান
* জুলাই ২০২৫: ১০ জন বা তার বেশি আবেদন করলে প্রয়োজনে, অধিভুক্তরা ভোট দিয়ে প্রার্থীদের বাছাই করবে [৫]
* আগস্ট ২০২৫: প্রচারের সময়কাল
* আগস্ট – সেপ্টেম্বর ২০২৫: সম্প্রদায়ের ভোটদানের জন্য দুই সপ্তাহের সময়কাল
* অক্টোবর – নভেম্বর ২০২৫: নির্বাচিত প্রার্থীদের ব্যাকগ্রাউন্ড পরীক্ষা
* ২০২৫ সালের ডিসেম্বরে বোর্ডের সভা: নতুন ট্রাস্টিদের বসানো হবে
এই মেটা-উইকি পাতায় ২০২৫ সালের নির্বাচন প্রক্রিয়া সম্পর্কে আরও জানুন - যার মধ্যে রয়েছে বিস্তারিত সময়রেখা, প্রার্থীতা প্রক্রিয়া, প্রচারণার নিয়ম এবং ভোটার যোগ্যতার মানদণ্ড। [[m:Special:MyLanguage/Wikimedia_Foundation_elections/2025|[লিঙ্ক]]]।
'''প্রশ্নের জন্য আহ্বান'''
প্রতিটি নির্বাচন প্রক্রিয়ায়, সম্প্রদায়ের ট্রাস্টি বোর্ডের প্রার্থীদের জন্য প্রশ্ন জমা দেওয়ার সুযোগ রয়েছে, যেগুলির উত্তর তাঁরা দেবেন। নির্বাচন কমিটি সম্প্রদায় কর্তৃক তৈরি তালিকা থেকে প্রশ্ন নির্বাচন করবে, যার উত্তর প্রার্থীরা দেবেন। যোগ্য হওয়ার জন্য আবেদনপত্রে প্রয়োজনীয় সমস্ত প্রশ্নের উত্তর প্রার্থীদের দিতে হবে; অন্যথায় তাঁদের আবেদন অযোগ্য ঘোষণা করা হবে। এই বছর, নির্বাচন কমিটি প্রার্থীদের উত্তর দেওয়ার জন্য ৫টি প্রশ্ন নির্বাচন করবে। নির্বাচিত প্রশ্নগুলি সম্প্রদায়ের জমা দেওয়া প্রশ্নগুলির সংমিশ্রণ হতে পারে, যদি সেগুলি একই রকম বা সম্পর্কিত হয়।[[m:Special:MyLanguage/Wikimedia_Foundation_elections/2025/Questions_for_candidates|[লিঙ্ক]]]
'''নির্বাচনী স্বেচ্ছাসেবক'''
২০২৫ সালের নির্বাচন প্রক্রিয়ার সাথে জড়িত থাকার আরেকটি উপায় হল একজন নির্বাচনী স্বেচ্ছাসেবক হওয়া। নির্বাচনী স্বেচ্ছাসেবকরা নির্বাচন কমিটি এবং তাদের নিজ নিজ সম্প্রদায়ের মধ্যে একটি সেতুবন্ধন। তাঁরা তাদের সম্প্রদায়ের প্রতিনিধিত্ব নিশ্চিত করতে সাহায্য করেন এবং তাদের ভোট দেওয়ার জন্য সংগঠিত করেন। প্রোগ্রামটি এবং কিভাবে যোগদান করবেন সে সম্পর্কে আরও জানুন এই মেটা-উইকি পাতায়। [[m:Wikimedia_Foundation_elections/2025/Election_volunteers|[লিঙ্ক]]]
ধন্যবাদ!
[১] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2022/Results
[২] https://foundation.wikimedia.org/wiki/Committee:Elections_Committee_Charter
[৩] https://foundation.wikimedia.org/wiki/Resolution:Committee_Membership,_December_2024
[৪] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections_committee/Roles
[৫] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2025/FAQ
[৬] https://meta.wikimedia.org/wiki/Wikimedia_Foundation_elections/2025/Questions_for_candidates
শুভেচ্ছান্তে,
ভিক্টোরিয়া ডোরোনিনা
নির্বাচন কমিটি বোর্ড লিয়াজোঁ
প্রশাসন কমিটি<section end="announcement-content" />
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ০৩:০৮, ২৮ মে ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28618011-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== 📣 Announcing the South Asia Newsletter – Get Involved! 🌏 ==
<div lang="en" dir="ltr">
''{{int:please-translate}}''
Hello Wikimedians of South Asia! 👋
We’re excited to launch the planning phase for the '''South Asia Newsletter''' – a bi-monthly, community-driven publication that brings news, updates, and original stories from across our vibrant region, to one page!
We’re looking for passionate contributors to join us in shaping this initiative:
* Editors/Reviewers – Craft and curate impactful content
* Technical Contributors – Build and maintain templates, modules, and other magic on meta.
* Community Representatives – Represent your Wikimedia Affiliate or community
If you're excited to contribute and help build a strong regional voice, we’d love to have you on board!
👉 Express your interest though [https://docs.google.com/forms/d/e/1FAIpQLSfhk4NIe3YwbX88SG5hJzcF3GjEeh5B1dMgKE3JGSFZ1vtrZw/viewform this link].
Please share this with your community members.. Let’s build this together! 💬
This message was sent with [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) by [[m:User:Gnoeee|Gnoeee]] ([[m:User_talk:Gnoeee|talk]]) at ১৫:৪২, ৬ জুন ২০২৫ (ইউটিসি)
</div>
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/South_Asia_Village_Pumps&oldid=25720607-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Gnoeee@metawiki পাঠিয়েছেন -->
== উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৫-এর ব্যানার প্রদর্শন ==
বাংলা উইকিসংযোগ দলের আয়োজনে আগামী জুলাইয়ে অনুষ্ঠেয় [[:wikt:bn:উইকিঅভিধান:উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৫|উইকিঅভিধান ভুক্তি প্রতিযোগিতা ২০২৫]]-এর জন্য ব্যানার প্রদর্শনের লক্ষ্যে [[metawiki:CentralNotice/Request/Bangla_Wiktionary_Entry_Contest_2025|এখানে]] কেন্দ্রীয় বিজ্ঞপ্তির অনুরোধ করা হয়েছে। এই বিষয়ে সম্প্রদায়ের কোনো মতামত থাকলে জানাতে পারেন। ধন্যবাদ — '''[[User:Aishik Rehman|Aishik Rehman]]''' ([[User talk:Aishik Rehman|আলাপ]]) ২০:৫৫, ১৩ জুন ২০২৫ (ইউটিসি)
== 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]]) ২৩:০১, ১৩ জুন ২০২৫ (ইউটিসি) </div>
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28848819-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== ছোট সহপ্রকল্প ও উইকিপত্রিকা বিষয়ে অনলাইন সভার আমন্ত্রণ ==
প্রিয় সুধী,<br />
উইকিমিডিয়ার বাংলা ভাষায় চলমান প্রকল্পগুলোর মধ্যে কিছু ছোট প্রকল্প রয়েছে, যেগুলোর গতি ধীর হওয়ায় ভবিষ্যৎ পরিকল্পনার জন্য একটি সমন্বিত আলোচনা প্রয়োজন। একইসাথে সম্প্রদায়ের সাম্প্রতিক উদ্যোগ “উইকিপত্রিকা” নিয়েও কিছু আলোচনা করা জরুরি। এই প্রেক্ষাপটে, আগামী ২০ জুন ২০২৫, শুক্রবার রাত ৯টা থেকে সর্বোচ্চ রাত ১১টা পর্যন্ত একটি উন্মুক্ত অনলাইন সভার আয়োজন করা হয়েছে।<br />
'''গুগল মিট''': https://meet.google.com/ctu-okwe-qju <br />
'''গুগল ক্যালেন্ডার''': https://calendar.app.google/QLkX7vy3SzC1uU1R6
;আলোচ্যসূচি (এজেন্ডা)
* ইনকিউবেটরে থাকা প্রকল্প দুইটির ভবিষ্যৎ
**উইকিসংবাদ
**উইকিবিশ্ববিদ্যালয়
* প্রতিযোগিতা-পরবর্তী উইকিবই, উইকিঅভিধান উইকিভ্রমণ, উইকিউক্তির অবস্থা ও করণীয়
* উইকিসংকলন ছোট প্রকল্পের আওতায় পড়ে কিনা
* উইকিপ্রজাতি, উইকিউপাত্ত প্রভৃতি বহুভাষিক প্রকল্প, যেখানে প্রয়োজনীয় বাংলা কার্যক্রম তুলনামূলকভাবে স্থির
* একটি ছোট উইকি প্রকল্পের জন্য দল গঠন ও নাম নির্ধারণ
* উইকিপত্রিকা সংক্রান্ত কিছু প্রশ্নোত্তর
আপনাদের প্রত্যেকের মতামত ও পরামর্শ এই আলোচনায় অত্যন্ত গুরুত্বপূর্ণ। তাই উপস্থিত থেকে সক্রিয় অংশগ্রহণ করার জন্য অনুরোধ জানানো যাচ্ছে। ~ [[ব্যবহারকারী:খাত্তাব হাসান|কাপুদান পাশা]] <sup>[[বিশেষ:অবদান/খাত্তাব হাসান|অ]], [[ব্যবহারকারী আলাপ:খাত্তাব হাসান|আ]], [[বিশেষ:ইমেইল/খাত্তাব হাসান|ই]]...</sup> ০৪:১৭, ১৬ জুন ২০২৫ (ইউটিসি)
== উইকিমিডিয়া ফাউন্ডেশন বোর্ড অফ ট্রাস্টি ২০২৫ - প্রার্থীদের জন্য আহ্বান ==
<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>
সকলকে স্বাগতম,
[[m:Special:MyLanguage/Wikimedia Foundation elections/2025|২০২৫ উইকিমিডিয়া ফাউন্ডেশন ট্রাস্টি বোর্ডের নির্বাচনের উদ্দেশ্যে প্রার্থীপদের আহ্বান]] ১৭ জুন, ২০২৫ থেকে ২ জুলাই, ২০২৫ রাত ১১:৫৯ ইউটিসি পর্যন্ত খোলা আছে [১]। ট্রাস্টি বোর্ড উইকিমিডিয়া ফাউন্ডেশনের কাজ তত্ত্বাবধান করে এবং প্রতি ট্রাস্টি তিন বছরের মেয়াদে [২] দায়িত্ব পালন করেন। এটি একটি স্বেচ্ছাসেবক পদ।
এই বছর, ফাউন্ডেশন বোর্ডের দুটি (২) আসন পূরণের জন্য উইকিমিডিয়া সম্প্রদায় ২০২৫ সালের আগস্টের শেষের দিক থেকে সেপ্টেম্বর পর্যন্ত ভোট দেবে। আপনি-অথবা আপনার পরিচিত কেউ-কি উইকিমিডিয়া ফাউন্ডেশনের ট্রাস্টি বোর্ডে যোগদানের জন্য উপযুক্ত হতে পারেন? [৩]
এই নেতৃত্বের পদের জন্য দাঁড়াতে কি কি প্রয়োজন এবং [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidate application|এই মেটা-উইকি পাতা]]য় কিভাবে আপনার প্রার্থীতা জমা দেবেন অথবা অন্য কাউকে এই বছরের নির্বাচনে প্রতিদ্বন্দ্বিতা করতে উৎসাহিত করবেন সে সম্পর্কে আরও জানুন।
শুভেচ্ছান্তে,
অভিষেক সূর্যবংশী<br />
নির্বাচন কমিটির সভাপতি
নির্বাচন কমিটি এবং পরিচালনা কমিটির পক্ষ থেকে
[১] https://meta.wikimedia.org/wiki/Special:MyLanguage/Wikimedia_Foundation_elections/2025/Call_for_candidates
[২] https://foundation.wikimedia.org/wiki/Legal:Bylaws#(B)_Term.
[৩] https://meta.wikimedia.org/wiki/Special:MyLanguage/Wikimedia_Foundation_elections/2025/Resources_for_candidates<section end="announcement-content" />
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ১৭:৪৪, ১৭ জুন ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=28866958-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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, ২০:৫৭, ২৭ জুন ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Sister_project_MassMassage_on_behalf_of_Victoria/Target_list&oldid=28911188-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Johan (WMF)@metawiki পাঠিয়েছেন -->
== Wikidata Item and Property labels soon displayed in Wiki Watchlist/Recent Changes ==
''(Apologies for posting in English, you can help by translating into your language)''
Hello everyone, the [[m:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Resolve_Labels|Wikidata For Wikimedia Projects]] team is excited to announce an upcoming change in how Wikidata edit changelogs are displayed in your [[Special:Watchlist|Watchlists]] and [[Special:RecentChanges|Recent Changes]] lists. If an edit is made on Wikidata that affects a page in another Wikimedia Project, the changelog will contain some information about the nature of the edit. This can include a QID (or Q-number), a PID (or P-number) and a value (which can be text, numbers, dates, or also QID or PID’s). Confused by these terms? See the [[d:Special:MyLanguage/Wikidata:Glossary|Wikidata:Glossary]] for further explanations.
The upcoming change is scheduled for '''17.07.2025''', between '''1300 - 1500 UTC'''.
The change will display the label (item name) alongside any QID or PIDs, as seen in the image below:
[[File:Apr10 edit summary on Wikidata.png|An edit sum entry on Wikidata, labels display alongside their P- and Q-no.'s]]
These changes will only be visible if you have Wikidata edits enabled in your User Preferences for Watchlists and Recent Changes, or have the active filter ‘Wikidata edits’ checkbox toggled on, directly on the Watchlist and Recent Changes pages.
Your bot and gadget may be affected! There are thousands of bots, gadgets and user-scripts and whilst we have researched potential effects to many of them, we cannot guarantee there won’t be some that are broken or affected by this change.
Further information and context about this change, including how your bot may be affected can be found on this [[m:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Resolve_Labels|project task page]]. We welcome your questions and feedback, please write to us on this dedicated [[m:Talk:Wikidata_For_Wikimedia_Projects/Clearer_Wikidata_Edit_Summaries/Resolve_Labels|Talk page]].
Thank you, - [[m:User:Danny_Benjafield_(WMDE)|Danny Benjafield (WMDE)]] on behalf of the Wikidata For Wikimedia Projects Team. [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ১২:৪৬, ১৪ জুলাই ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=User:Danny_Benjafield_(WMDE)/MassMessage_Test_List&oldid=28981877-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Danny Benjafield (WMDE)@metawiki পাঠিয়েছেন -->
== বিশ্ব আদিবাসী দিবস সম্পাদনাসভা ২০২৫-এ অংশ নিন! ==
<div style="padding:15px; font-size:120%; line-height: 1.6; margin:10px 0;border: 1px solid #D01313;background-color: #FFFFFF; border-radius:8px;">
[[File:বিশ্ব আদিবাসী দিবস সম্পাদনাসভা ২০২৫.png|link=w:bn:উইকিপিডিয়া:বিশ্ব আদিবাসী দিবস সম্পাদনাসভা ২০২৫|right|250px]]
সুধী,
'''[[w:bn:বিশ্ব আদিবাসী দিবস|বিশ্ব আদিবাসী দিবস]]''' উপলক্ষে বাংলা উইকিপিডিয়ায় প্রথমবারের মতো <mark>'''৯ – ১৫ আগস্ট ২০২৫'''</mark> তারিখে একটি '''সপ্তাহব্যাপী অনলাইন সম্পাদনাসভা''' আয়োজন করা হয়েছে।
এই সম্পাদনাসভার মূল উদ্দেশ্য হলো আদিবাসী জনগোষ্ঠীর অধিকার, ইতিহাস, ঐতিহ্য, ভাষা, সংস্কৃতি বিষয়ক নিবন্ধ তৈরি ও উন্নত করার মাধ্যমে বাংলা উইকিপিডিয়াকে আরও অন্তর্ভুক্তিমূলক করে তোলা।
উন্মুক্ত এই সম্পাদনাসভায় অংশ নিয়ে আপনিও বাংলা উইকিপিডিয়া সমৃদ্ধ করতে সাহায্য করতে পারেন। আপনার অবদানের স্বীকৃতিস্বরূপ প্রদান করা হবে '''উইকিপদক ও সনদপত্র'''।
বিস্তারিত জানতে এবং অংশগ্রহণের জন্য দেখুন: '''[[w:bn:উইকিপিডিয়া:বিশ্ব আদিবাসী দিবস সম্পাদনাসভা ২০২৫|আয়োজনের মূল পাতা]]'''।
<div style="text-align:left;">
{{ক্লিকযোগ্য বোতাম ২|অংশগ্রহণ করুন|url=https://bn.wikipedia.org/w/index.php?title=উইকিপিডিয়া:বিশ্ব_আদিবাসী_দিবস_সম্পাদনাসভা_২০২৫/অংশগ্রহণকারী|class=mw-ui-progressive}}</div>
আপনার সম্পাদনা শুভ হোক!<br/>
--[[ব্যবহারকারী:Moheen|<b style="text-shadow:#c5C3e3 0.2em 0.2em 0.2em; fontcolor: #3b5998">~মহীন</b>]] [[ব্যবহারকারী আলাপ:Moheen|<sup>(আলাপ)</sup>]] ১৮:৫০, ২ আগস্ট ২০২৫ (ইউটিসি)
</div>
== ''উইকিপত্রিকা'': ভাদ্র ১৪৩২ ==
<div lang="en" dir="ltr" class="mw-content-ltr" style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;">[[File:উইকিপত্রিকা আইকন.svg|40px|right]] ''সুপ্রিয়! উইকিপত্রিকার নতুন সংখ্যা প্রকাশিত হয়েছে। আপনি নিচের তালিকা থেকে পছন্দমত প্রবন্ধগুলি পড়তে পারেন।''</div>
<div style="column-count:2;">
* বিশেষ প্রতিবেদন: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/বিশেষ প্রতিবেদন|উইকিফাংশন্সের দ্বিতীয় বর্ষপূর্তি]]
* উইকিমিডিয়া সংবাদ: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/উইকিমিডিয়া সংবাদ|হয়ে গেল উইকিম্যানিয়া]]
* সাক্ষাৎকার: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/সাক্ষাৎকার|যদি শুরু না করেন তাহলে কোনোদিনই হবেনা]]
* সম্পাদকীয়: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/সম্পাদকীয়|উইকিপত্রিকা চলবে]]
* গণমাধ্যমে: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/গণমাধ্যমে|বাংলা সম্প্রদায়কে ফাউন্ডেশনের সিইও এবং উইকিপিডিয়ার প্রতিষ্ঠাতা]]
* পরিসংখ্যান: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/পরিসংখ্যান|জুলাইয়ের শীর্ষ দশ]]
* সহপ্রকল্প: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/ভাদ্র ১৪৩২/সহপ্রকল্প|জুলাই মাসের সহপ্রকল্পের বিবরণ]]
</div>
<div style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;">'''[[w:bn:উইকিপিডিয়া:উইকিপত্রিকা|সম্পূর্ণ উইকিপত্রিকা পড়ুন]]''' · [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/দেয়ালিকা|দেয়ালিকা]] · [[m:উইকিপত্রিকা/গ্রাহক তালিকা|আনসাবস্ক্রাইব করুন]] · [[m:MassMessage/bn#বৈশ্বিক_বার্তা_বিতরণ|বৈশ্বিক বার্তা বিতরণ]] ১৬:১০, ১৮ আগস্ট ২০২৫ (ইউটিসি)
<!-- Sent via script ([[w:en:User:R1F4T/উইকিপ্রকাশক]]) --></div>
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF%E0%A6%AA%E0%A6%A4%E0%A7%8D%E0%A6%B0%E0%A6%BF%E0%A6%95%E0%A6%BE&oldid=29140158-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:MdsShakil@metawiki পাঠিয়েছেন -->
== অস্থায়ী অ্যাকাউন্টগুলি শীঘ্রই চালু করা হবে। ==
<section begin="body"/>
নমস্কার, আমরা উইকিমিডিয়া ফাউন্ডেশনের [[mw:Special:MyLanguage/Product Safety and Integrity|পণ্য সুরক্ষা এবং ন্যায্যতা]] দল। আমরা ঘোষণা করতে চাই যে '''আমরা ১ সেপ্টেম্বরের সপ্তাহে এই উইকির জন্য [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|অস্থায়ী অ্যাকাউন্ট]] সক্রিয় করার পরিকল্পনা করছি।'''
অস্থায়ী অ্যাকাউন্টগুলি ৩০টি উইকিতে সফলভাবে সক্রিয় রয়েছে, যার মধ্যে জার্মান, জাপানি এবং ফরাসির মতো অনেক বড় ভাষা সম্প্রদায় রয়েছে। তাদের আনা পরিবর্তনটি বিশেষ করে লগ-ইন না করা সম্পাদকদের জন্য প্রাসঙ্গিক, যাঁদের সুরক্ষার জন্য এই বৈশিষ্ট্যটি তৈরি করা হয়েছে। কিন্তু এটি সম্প্রদায়ের অন্য সদস্যদের জন্যও প্রাসঙ্গিক, যেমন পরামর্শদাতা, টহলদার এবং প্রশাসক - যাঁরা উইকিগুলিকে নিরাপদ এবং নির্ভুল রাখার ক্রিয়াকাণ্ড হিসেবে সম্পাদনা ফিরিয়ে আনেন, ব্যবহারকারীদের ব্লক করেন, অথবা লগ-ইন না করা সম্পাদকদের সাথে অন্যভাবে যোগাযোগ করেন।
'''কেন আমরা অস্থায়ী অ্যাকাউন্ট তৈরি করছি'''
আমাদের উইকিগুলিতে লগ-আউট অবস্থায় থাকা সম্পাদকদের সম্পাদনা করা স্বয়ংক্রিয়ভাবে আরও নিরাপদ হওয়া উচিত। অস্থায়ী অ্যাকাউন্টগুলি ব্যবহারকারী অ্যাকাউন্ট তৈরি না করেই উইকি সম্পাদনা চালিয়ে যাওয়ার সুযোগ দেয়, একই সাথে তাদের সম্পাদনাগুলি তাদের আইপি ঠিকানার সাথে প্রকাশ্যভাবে সংযুক্ত হয়না। আমরা বিশ্বাস করি যাঁরা আমাদের উইকিগুলিতে মূল্যবান অবদান রাখেন এবং যাঁরা পরে অ্যাকাউন্ট তৈরি করে আমাদের সম্পাদক, প্রশাসক এবং অন্যান্য ভূমিকায় সম্প্রদায়কে সমৃদ্ধ করতে পারেন সেইসব লগ-ইন না করা সম্পাদকদের সর্বোত্তম স্বার্থে এটি তৈরি হয়েছে। যদিও উইকিগুলি লগ-ইন না করা সম্পাদকদের সতর্ক করে যে তাঁদের আইপি ঠিকানা তাঁদের সম্পাদনার সাথে যুক্ত করা হবে, অনেকেই হয়তো বুঝতে পারেন না যে আইপি ঠিকানা কি, অথবা তাঁদের সম্পর্কে অন্যান্য তথ্যের সাথে এমনভাবে সংযুক্ত করতে এটি ব্যবহার করা যেতে পারে যা তাঁরা ভাবতেও পারে না।
অতিরিক্তভাবে, আমাদের পর্যবেক্ষণমূলক সফটওয়্যার এবং সরঞ্জামগুলি ব্যবহারকারী ও তাদের কার্যক্রমের ধরণ শনাক্ত করার জন্য নেটওয়ার্ক উৎসের (আইপি ঠিকানা) ওপর অত্যধিকভাবে নির্ভরশীল, বিশেষ করে যখন আইপি ঠিকানাগুলি নিজেরাই স্থায়ী শনাক্তকারী হিসেবে ক্রমশ কম কার্যকর হয়ে যাচ্ছে। অস্থায়ী অ্যাকাউন্টগুলির মাধ্যমে লগ-ইন না করা সম্পাদকদের সঙ্গে আরও নির্দিষ্টভাবে যোগাযোগ করার সুযোগ পাওয়া যায়, যার মধ্যে রয়েছে আরও নির্দিষ্টভাবে ব্লক করার সুবিধা। এর ফলে আমরা যখন খারাপ উদ্দেশ্য-যুক্ত ব্যবহারকারীদের মতো একই আইপি ঠিকানা ব্যবহার করা সৎ উদ্দেশ্য-যুক্ত ব্যবহারকারীদেরও ভুলবশত ব্লক করে ফেলি, সেই ঘটনাগুলিও কমে যায়।
'''অস্থায়ী অ্যাকাউন্টগুলি কিভাবে কাজ করে'''
[[File:Temporary account banner and empty talk page.png|thumb]]
যখনই কোনও ব্যবহারকারী লগ-ইন না করে এই উইকিতে কোনও সম্পাদনা প্রকাশ করবেন, তখনই এই ব্যবহারকারীর ব্রাউজারে একটি কুকি সেট করা হবে এবং এই কুকির সাথে সংযুক্ত একটি অস্থায়ী অ্যাকাউন্ট স্বয়ংক্রিয়ভাবে তৈরি হবে। এই অ্যাকাউন্টের নামটি এই প্যাটার্ন অনুসরণ করবে: <code dir=ltr>~2025-12345-67</code> (একটি টিল্ডা, বর্তমান বছর, একটি সংখ্যা)। সাম্প্রতিক পরিবর্তন বা পাতার ইতিহাসের মতো পাতাগুলিতে, এই নামটি প্রদর্শিত হবে। কুকি তৈরির ৯০ দিন পর এর মেয়াদ শেষ হয়ে যাবে। যতক্ষণ পর্যন্ত এটি বিদ্যমান থাকবে, ততক্ষণ পর্যন্ত এই ডিভাইস থেকে করা সমস্ত সম্পাদনা এই অস্থায়ী অ্যাকাউন্টের সাথে সম্পর্কিত হবে। আইপি ঠিকানা পরিবর্তন হলেও এটি একই অ্যাকাউন্ট থাকবে, যদি না ব্যবহারকারীরা তাদের কুকিগুলি পরিষ্কার করে অথবা ভিন্ন ডিভাইস বা ওয়েব ব্রাউজার ব্যবহার করে। প্রতিটি সম্পাদনার সময় ব্যবহৃত আইপি ঠিকানার একটি রেকর্ড সম্পাদনার পর ৯০ দিনের জন্য সংরক্ষণ করা হবে। তবে, শুধুমাত্র কিছু লগ-ইন ব্যবহারকারী এটি দেখতে সক্ষম হবেন।
'''বিভিন্ন ব্যবহারকারী গোষ্ঠীর জন্য এর অর্থ কি?'''
'''লগ-আউট করা সম্পাদকদের জন্য'''
* এটি গোপনীয়তা বৃদ্ধি করে: বর্তমানে, যদি আপনি সম্পাদনার জন্য একটি নিবন্ধিত অ্যাকাউন্ট ব্যবহার না করেন, তাহলে ৯০ দিন পরেও সবাই আপনার করা সম্পাদনার আইপি ঠিকানা দেখতে পাবে। এই উইকিতে আর তা সম্ভব হবে না।
* যদি আপনি গত ৯০ দিনে বিভিন্ন স্থান থেকে সম্পাদনা করার জন্য একটি অস্থায়ী অ্যাকাউন্ট ব্যবহার করেন (উদাহরণস্বরূপ বাড়িতে এবং একটি কফি শপে), তাহলে এখন একই অস্থায়ী অ্যাকাউন্টের জন্য সেই সমস্ত স্থানের সম্পাদনা ইতিহাস এবং আইপি ঠিকানা একসাথে রেকর্ড করা হবে। [[foundation:Special:MyLanguage/Policy:Access_to_temporary_account_IP_addresses|প্রাসঙ্গিক প্রয়োজনীয়তা পূরণকারী]] ব্যবহারকারীরা এই তথ্য দেখতে পারবেন। যদি এটি আপনার জন্য কোনও ব্যক্তিগত নিরাপত্তা উদ্বেগ তৈরি করে, তাহলে পরামর্শের জন্য দয়া করে wikimedia.org-এ talktohumanrights-এর সাথে যোগাযোগ করুন।
'''লগ-আউট করা সম্পাদকদের সাথে আলাপচারিতাকারী সম্প্রদায়ের সদস্যদের জন্য'''
* একটি অস্থায়ী অ্যাকাউন্ট একটি ডিভাইসের সাথে অনন্যভাবে লিঙ্ক করা থাকে। তুলনামূলকভাবে, একটি আইপি ঠিকানা বিভিন্ন ডিভাইস এবং মানুষের সাথে শেয়ার করা যেতে পারে (উদাহরণস্বরূপ, স্কুলে বা কর্মক্ষেত্রে বিভিন্ন ব্যক্তির একই আইপি ঠিকানা থাকতে পারে)।
* বর্তমান অবস্থার তুলনায়, এটা ধরে নেওয়া নিরাপদ হবে যে একজন অস্থায়ী ব্যবহারকারীর আলাপ পাতা শুধুমাত্র একজন ব্যক্তির থাকবে, এবং সেখানে থাকা বার্তাগুলি তাঁরাই পড়বেন। স্ক্রিনশটে দেখা যাচ্ছে, অস্থায়ী অ্যাকাউন্ট ব্যবহারকারীরা বিজ্ঞপ্তি পাবেন। সম্পাদনার জন্য তাঁদের ধন্যবাদ জানানো যাবে, আলোচনার জন্য পিং করা এবং সম্প্রদায়ের সাথে আরও বেশি জড়িত হওয়ার জন্য তাঁদের আমন্ত্রণ জানানোও সম্ভব হবে।
'''উইকি নিয়ন্ত্রণ এবং রক্ষণাবেক্ষণের জন্য আইপি ঠিকানার তথ্য ব্যবহার করেন এমন ব্যবহারকারীদের জন্য'''
* '''টহলদারদের জন্য''' যাঁরা ক্রমাগত নির্যাতনকারীদের ট্র্যাক করেন, নীতি লঙ্ঘনের তদন্ত করেন, ইত্যাদি: [[foundation:Special:MyLanguage/Policy:Access_to_temporary_account_IP_addresses|প্রয়োজনীয়তা পূরণকারী]] ব্যবহারকারীরা অস্থায়ী ব্যবহারকারীদের আইপি ঠিকানা এবং একটি নির্দিষ্ট আইপি ঠিকানা বা পরিসর ([[Special:IPContributions]]) থেকে অস্থায়ী অ্যাকাউন্টগুলির দ্বারা করা সমস্ত অবদান প্রকাশ করতে সক্ষম হবেন। [[mw:Special:MyLanguage/Trust and Safety Product/IP Info|আইপি তথ্য]] বৈশিষ্ট্যটির সাহায্যে, তাঁরা আইপি ঠিকানাগুলি সম্পর্কে গুরুত্বপূর্ণ তথ্যও পাবেন। অস্থায়ী অ্যাকাউন্টগুলির সাথে কাজ করার জন্য আরও অনেক সফ্টওয়্যার তৈরি বা সমন্বয় করা হয়েছে, যার মধ্যে রয়েছে অ্যাবিউজফিল্টার, বৈশ্বিক বাধাদান, বৈশ্বিক ব্যবহারকারী অবদান এবং আরও অনেক কিছু। (স্বেচ্ছাসেবক ডেভেলপারদের জন্য আপনার টুলের কোড কিভাবে আপডেট করবেন সে সম্পর্কে তথ্যের জন্য - বার্তার শেষ অংশটি দেখুন।)
* '''লগ-আউট সম্পাদকদের বাধাদান করা প্রশাসকদের জন্য''':
** অনেক অপব্যবহারকারীর অস্থায়ী অ্যাকাউন্ট ব্লক করেই তাদের বাধাদান করা সম্ভব হবে। যদি প্রশাসক [[mw:Special:MyLanguage/Autoblock|অটোব্লক]] বিকল্পটি নির্বাচন করেন, তাহলে একজন বাধাপ্রাপ্ত ব্যক্তি দ্রুত নতুন অস্থায়ী অ্যাকাউন্ট তৈরি করতে পারবেন না।
** তবুও একটি আইপি ঠিকানা বা আইপি পরিসর ব্লক করা সম্ভব হবে।
* অস্থায়ী অ্যাকাউন্টগুলি চালু হওয়ার আগে করা অবদানগুলির ক্ষেত্রে এটি প্রযোজ্য হবে না। বিশেষ: অবদানে, আপনি বিদ্যমান আইপি ব্যবহারকারীর অবদান দেখতে পারবেন, কিন্তু সেই আইপি ঠিকানায় অস্থায়ী অ্যাকাউন্টগুলির দ্বারা করা নতুন অবদান দেখতে পারবেন না। পরিবর্তে, এর জন্য আপনার Special:IPContributions ব্যবহার করা উচিত।
'''আপনার জন্য আমাদের অনুরোধ, এবং পরবর্তী পদক্ষেপ'''
* যদি আপনার কোন টুল, বট, গ্যাজেট ইত্যাদির সম্বন্ধে জানা থাকে যা আইপি ঠিকানা সম্পর্কে তথ্য ব্যবহার করে অথবা লগ-আউট ব্যবহারকারীদের জন্য উপলব্ধ, তাহলে আপনি পরীক্ষা করে দেখতে পারেন যে তারা [[testwiki:Main_Page|টেস্টউইকি]] অথবা [[test2wiki:Main_Page|টেস্ট২উইকি]]তে কাজ করে কিনা। আপনি যদি একজন স্বেচ্ছাসেবক ডেভেলপার হন, তাহলে [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/For developers|ডেভেলপারদের জন্য আমাদের ডকুমেন্টেশন]] পড়ুন, এবং বিশেষ করে, [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/For developers#How should I update my code?|আপনার কোড কিভাবে হালনাগাদ করার প্রয়োজন হতে পারে]] বিভাগটি পড়ুন।
* যদি আপনি অস্থায়ী অ্যাকাউন্টের অভিজ্ঞতা পরীক্ষা করতে চান, উদাহরণস্বরূপ, এটি কেমন লাগছে তা পরীক্ষা করার জন্য, তাহলে টেস্টউইকি অথবা টেস্ট২উইকিতে যান এবং লগ ইন না করেই সম্পাদনা করুন।
* আপনার যদি এমন কোনও অসুবিধার কথা জানা থাকে যার সমাধান করা প্রয়োজন, তাহলে আমাদের জানান। আমরা সাহায্য করার চেষ্টা করব, এবং যদি আমরা সক্ষম না হই, তাহলে আমরা উপলব্ধ বিকল্পগুলি বিবেচনা করব।
* বর্ধিত অধিকার নেই এমন ব্যবহারকারী, যাদের আইপি ঠিকানা অধিগত করার প্রয়োজন হতে পারে, তাদের জন্য প্রয়োজনীয়তা সম্পর্কে আমাদের [[m:Meta:Babel#Temporary_Accounts:_access_to_IP_addresses_and_next_steps|পূর্ববর্তী বার্তা]] দেখুন।
প্রকল্পটি সম্পর্কে আরও জানতে, [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/FAQ|আমাদের প্রাজিপ্র]] দেখুন – আপনি সেখানে অনেক প্রয়োজনীয় উত্তর পাবেন। আপনি [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts/Updates|হালনাগাদগুলিও দেখতে পারেন]] (আমরা সবেমাত্র একটি পোস্ট করেছি) এবং [[mw:Newsletter:Product Safety and Integrity|আমাদের নতুন নিউজলেটারে সাবস্ক্রাইব করতে পারেন]]। যদি আপনি উইকির বাইরে আমার (জাইমন) সাথে কথা বলতে চান, তাহলে আমাকে ডিসকর্ড এবং টেলিগ্রামে পাবেন। ধন্যবাদ!<section end="body" />
<bdi lang="en" dir="ltr">[[m:user:NKohli (WMF)|NKohli (WMF)]], [[m:user:SGrabarczuk (WMF)|SGrabarczuk (WMF)]]</bdi> ২১:৩৭, ২৬ আগস্ট ২০২৫ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=User:Quiddity_(WMF)/sandbox6&oldid=29181713-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Quiddity (WMF)@metawiki পাঠিয়েছেন -->
== আপনার উইকি শীঘ্রই পঠন মোডে যাবে ==
<section begin="server-switch"/><div class="plainlinks">
[[:m:Special:MyLanguage/Tech/Server switch|এই বার্তাটি অন্য ভাষায় পড়ুন]] • [https://meta.wikimedia.org/w/index.php?title=Special:Translate&group=page-Tech%2FServer+switch&language=&action=page&filter= {{int:please-translate}}]
[[foundation:|উইকিমিডিয়া ফাউন্ডেশন]] তার উপাত্ত কেন্দ্রগুলির মধ্যে ট্রাফিক আনা-নেওয়ার বিষয়টি পরীক্ষা করবে। এটি নিশ্চিত করবে যে উইকিপিডিয়া এবং উইকিমিডিয়ার অন্যান্য উইকিসমূহ এমনকি একটি দুর্যোগের পরেও অনলাইন থাকবে।
সকল ট্রাফিক সুইচ করার তারিখ হলো '''{{#time:j xg|2025-09-24|bn}}'''। পরীক্ষাটি শুরু হবে '''[https://zonestamp.toolforge.org/{{#time:U|2025-09-24T15:00|en}} {{#time:H:i e|2025-09-24T15:00}}]'''-তে (বাংলাদেশ সময় রাত ৮টায় ও পশ্চিমবঙ্গ সময় রাত ৭টা ৩০ মিনিটে)।
দুর্ভাগ্যবশত, [[mw:Special:MyLanguage/Manual:What is MediaWiki?|মিডিয়াউইকির]] কিছু সীমাবদ্ধতার কারণে, এই পরিবর্তনের সময় সব সম্পাদনা অবশ্যই বন্ধ রাখতে হবে। এই ব্যাঘাত ঘটানোর জন্য আমরা ক্ষমাপ্রার্থী, এবং আমরা ভবিষ্যতে এটিকে হ্রাস করার জন্য কাজ করছি।
এই কার্যক্রমটি শুরু হওয়ার ৩০ মিনিট পূর্বে সমস্ত উইকিতে একটি ব্যানার প্রদর্শন করা হবে। এই ব্যানারটি অপারেশন শেষ না হওয়া পর্যন্ত দৃশ্যমান থাকবে।
<span lang="en" dir="ltr" class="mw-content-ltr">You can contribute to the [https://meta.wikimedia.org/w/index.php?title=Special%3ATranslate&group=Centralnotice-tgroup-read_only_banner&task=view&language=&filter=&action=translate translation or proofreading] of this banner text.</span>
'''সব উইকিতে অল্প সময়ের জন্য, আপনি সম্পাদনা করতে পারবেন না, তবে আপনি উইকি পড়তে সক্ষম হবেন।'''
*আপনি {{#time:l j xg Y|2025-09-24|bn}}-এ প্রায় এক ঘণ্টা পর্যন্ত সম্পাদনা করতে পারবেন না।
*আপনি যদি এই সময়ে সম্পাদনা করার বা সংরক্ষণ করার চেষ্টা করেন, তাহলে আপনি একটি ত্রুটি বার্তা দেখতে পাবেন। আমরা আশা করি যে কোনও সম্পাদনা এই সময়ের মধ্যে নষ্ট হবে না, কিন্তু আমরা তার নিশ্চয়তা দিতে পারছি না। আপনি যদি ত্রুটি বার্তাটি দেখতে পান, তাহলে অনুগ্রহ করে অপেক্ষা করুন যতক্ষণ না সবকিছু স্বাভাবিক অবস্থায় ফিরে আসছে। এরপর আপনি আপনার সম্পাদনা সংরক্ষণ করতে সক্ষম হবেন। সতর্কতাস্বরূপ, আমরা সুপারিশ করছি যে উক্ত সময়ে আপনি আপনার সম্পাদনার একটি অনুলিপি তৈরি করে রাখুন।
''অন্যান্য প্রভাব'':
*পটভূমির কাজগুলো ধীর হবে এবং কিছু নাও কাজ করতে পারে। লাল লিঙ্কগুলো স্বাভাবিকের মত দ্রুত হালনাগাদ নাও হতে পারে। আপনি যদি একটি নিবন্ধ তৈরি করেন যা ইতিমধ্যে অন্য কোথাও সংযুক্ত আছে, সেক্ষেত্রে লিঙ্ক স্বাভাবিকের চেয়ে বেশি সময় ধরে লাল থাকবে। কিছু দীর্ঘ চলমান স্ক্রিপ্ট বন্ধ করতে হবে।
* আমরা আশা করি যে কোড হালনাগাদগুলি অন্য সপ্তাহের মতো চলবে। তবে যদি অপারেশনের পর প্রয়োজন হয়, কিছু ক্ষেত্রে কোড হালনাগাদ বন্ধ থাকতে পারে।
* [[mw:Special:MyLanguage/GitLab|গিটল্যাব]] প্রায় ৯০ মিনিটের জন্য অনুপলব্ধ থাকবে।
যদি প্রয়োজন হয় তাহলে এই প্রকল্পটি স্থগিত করা হতে পারে। আপনি [[wikitech:Switch_Datacenter|wikitech.wikimedia.org তে সময়সূচি পড়তে পারেন]]। যেকোনো পরিবর্তন সময়সূচীতে ঘোষণা করা হবে।
'''দয়া করে আপনার সম্প্রদায়কে এই তথ্যটি জানান।'''</div><section end="server-switch"/>
<span dir=ltr>[[m:User:Trizek (WMF)|Trizek (WMF)]] ([[m:User talk:Trizek (WMF)|{{int:talk}}]])</span> ১৫:৪২, ১৮ সেপ্টেম্বর ২০২৫ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29170715-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Trizek (WMF)@metawiki পাঠিয়েছেন -->
== উইকিপত্রিকা: আশ্বিন ১৪৩২ ==
<div lang="en" dir="ltr" class="mw-content-ltr" style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Kalpurush, TiroBangla, Noto Sans Bengali, Siyam Rupali, Shonar Bangla;">[[File:উইকিপত্রিকা আইকন.svg|40px|right]] ''সুপ্রিয়! উইকিপত্রিকার নতুন সংখ্যা প্রকাশিত হয়েছে। আপনি নিচের তালিকা থেকে পছন্দমত প্রবন্ধগুলি পড়তে পারেন।''</div>
<div style="column-count:2;">
* পরিসংখ্যান: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/পরিসংখ্যান|আগস্টের শীর্ষ দশ]]
* গণমাধ্যমে: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/গণমাধ্যমে|উন্মুক্ত জ্ঞানের জন্য একটি মাইলফলক]]
* সাক্ষাৎকার: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/সাক্ষাৎকার|আমাদের বর্তমান সভ্যতা পূর্বসূরিদের কাঁধে দাঁড়িয়ে আছে]]
* উইকিমিডিয়া সংবাদ: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/উইকিমিডিয়া সংবাদ|এখন আরো নিরাপদ আইপি ব্যবহারকারীরা]]
* সহপ্রকল্প: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/সহপ্রকল্প|আগস্ট মাসের সহপ্রকল্পের বিবরণ]]
* সম্পাদকীয়: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/সম্পাদকীয়|কিসে কাটবে স্থবিরতা]]
* উইকিপ্রযুক্তি: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/আশ্বিন ১৪৩২/উইকিপ্রযুক্তি|প্রযুক্তি খবর]]
</div>
<div style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;">'''[[w:bn:উইকিপিডিয়া:উইকিপত্রিকা|সম্পূর্ণ উইকিপত্রিকা পড়ুন]]''' · [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/দেয়ালিকা|দেয়ালিকা]] · [[m:উইকিপত্রিকা/গ্রাহক তালিকা|আনসাবস্ক্রাইব করুন]] </div> [[m:MassMessage/bn#বৈশ্বিক_বার্তা_বিতরণ|বৈশ্বিক বার্তা বিতরণ]] ০৬:৫৮, ২০ সেপ্টেম্বর ২০২৫ (ইউটিসি)
<!-- ([[w:en:User:R1F4T/উইকিপ্রকাশক]]) স্ক্রিপ্ট দ্বারা প্রেরিত-->
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF%E0%A6%AA%E0%A6%A4%E0%A7%8D%E0%A6%B0%E0%A6%BF%E0%A6%95%E0%A6%BE&oldid=29299040-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Yahya@metawiki পাঠিয়েছেন -->
== মানসিক অসুস্থতা সচেতনতা সপ্তাহ সম্পাদনাসভা ২০২৫-এ আমন্ত্রণ! ==
<div style="padding:15px; font-size:120%; line-height: 1.6; margin:10px 0;border: 1px solid #CBE0D5;background-color: #DBF3EC; border-radius:8px;">
[[File:Edvard Munch, 1893, The Scream, oil, tempera and pastel on cardboard, 91 x 73 cm, National Gallery of Norway.jpg|link=উইকিপিডিয়া:মানসিক অসুস্থতা সচেতনতা সপ্তাহ সম্পাদনাসভা ২০২৫|right|250px | এডভার্ড মুঙ্খ অঙ্কিত ১৮৩২ সালের চিত্রকর্ম "আর্তনাদ"]]
সুপ্রিয় '''উইকিপিডিয়ান'''!
'''[[w:উইকিপিডিয়া:মানসিক অসুস্থতা সচেতনতা সপ্তাহ সম্পাদনাসভা ২০২৫|মানসিক অসুস্থতা সচেতনতা সপ্তাহ সম্পাদনাসভা ২০২৫]]''' উপলক্ষে বাংলা উইকিপিডিয়ায় দ্বিতীয়বারের মতো <mark>'''৫ – ১১ অক্টোবর ২০২৫'''</mark>, সপ্তাহব্যাপী অনলাইন সম্পাদনাসভা আয়োজন করা হয়েছে।
এই আয়োজনের মূল উদ্দেশ্য হলো মানসিক অসুস্থতা সম্পর্কে সচেতনতা বৃদ্ধি করা এবং সংশ্লিষ্ট বিষয়ের উপর নিবন্ধ তৈরি ও উন্নত করার মাধ্যমে বাংলা উইকিপিডিয়াকে আরও সমৃদ্ধ ও অন্তর্ভুক্তিমূলক করে তোলা। উন্মুক্ত এই সম্পাদনাসভায় অংশ নিয়ে আপনিও বাংলা উইকিপিডিয়ার জ্ঞানভাণ্ডার সম্প্রসারণে মূল্যবান অবদান রাখতে পারেন। আপনার অবদানের স্বীকৃতিস্বরূপ প্রদান করা হবে '''সনদপত্র ও উইকিপদক'''।
বিস্তারিত জানতে এবং অংশগ্রহণের জন্য দেখুন: '''[[w:উইকিপিডিয়া:মানসিক অসুস্থতা সচেতনতা সপ্তাহ সম্পাদনাসভা ২০২৫|আয়োজনের মূল পাতা]]'''।
<div style="text-align:left;">
{{ক্লিকযোগ্য বোতাম ২|অংশগ্রহণ করুন|url=https://bn.wikipedia.org/w/index.php?title=উইকিপিডিয়া:মানসিক_অসুস্থতা_সচেতনতা_সপ্তাহ_সম্পাদনাসভা_২০২৫/অংশগ্রহণকারী|class=mw-ui-progressive}}</div>
আপনার সম্পাদনা শুভ হোক!<br/>
শুভেচ্ছান্তে,<br/>
[[ব্যবহারকারী:Moheen|মহীন]]<br/>
আয়োজক, মানসিক অসুস্থতা সচেতনতা সপ্তাহ সম্পাদনাসভা ২০২৫<br/>
১১:৫৪, ৩ অক্টোবর ২০২৫ (ইউটিসি)
</div>
== আপনার মতামত জানান: ২০২৫ সালের ট্রাস্টি বোর্ডের জন্য ভোট দিন ==
<section begin="announcement-content" />
সকলকে স্বাগতম,
[[m:Special:MyLanguage/Wikimedia Foundation elections/2025|২০২৫ বোর্ড অফ ট্রাস্টি নির্বাচনের]] ভোটগ্রহণ এখন শুরু হয়েছে। প্রার্থীরা বোর্ডের দুটি (২) আসনের জন্য প্রতিদ্বন্দ্বিতা করছেন।
আপনার ভোটার যোগ্যতা যাচাই করতে, অনুগ্রহ করে [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Voter eligibility guidelines|ভোটার যোগ্যতা পাতা]] দেখুন।
[[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidates|তাঁদের আবেদনপত্র পড়ে এবং তাঁদের প্রার্থীতা ভিডিও দেখে]] তাঁদের সম্পর্কে আরও জানুন।
যখন আপনি প্রস্তুত হবেন, ভোট দিতে [[m:Special:SecurePoll/vote/405|সিকিওরপোল ভোটিং পাতায় যান]]।
'''৮ই অক্টোবর ০০:০০ ইউটিসি থেকে ২২শে অক্টোবর ২৩:৫৯ ইউটিসি পর্যন্ত ভোটদান চালু থাকবে।'''
শুভেচ্ছান্তে,
অভিষেক সূর্যবংশী<br />চেয়ার, নির্বাচন কমিটি<section end="announcement-content" />
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ০৪:৪৯, ৯ অক্টোবর ২০২৫ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29360896-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:RamzyM (WMF)@metawiki পাঠিয়েছেন -->
== <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]]) ১১:৪৪, ২০ অক্টোবর ২০২৫ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29432175-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Sannita (WMF)@metawiki পাঠিয়েছেন -->
== উইকিপত্রিকা: কার্তিক ১৪৩২ ==
<div lang="en" dir="ltr" class="mw-content-ltr" style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Kalpurush, TiroBangla, Noto Sans Bengali, Siyam Rupali, Shonar Bangla;">[[File:উইকিপত্রিকা আইকন.svg|40px|right]] ''সুপ্রিয়! উইকিপত্রিকার নতুন সংখ্যা প্রকাশিত হয়েছে। আপনি নিচের তালিকা থেকে পছন্দমত প্রবন্ধগুলি পড়তে পারেন।''</div>
<div style="column-count:2;">
* সম্পাদকীয়: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/কার্তিক ১৪৩২/সম্পাদকীয়|কেন অফলাইন কার্যক্রম বাড়াতে হবে]]
* সাক্ষাৎকার: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/কার্তিক ১৪৩২/সাক্ষাৎকার|জ্ঞান সৃজন ও বিতরণের মাধ্যমে জ্ঞানভাণ্ডার সমৃদ্ধ হয়]]
* সহপ্রকল্প: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/কার্তিক ১৪৩২/সহপ্রকল্প|সেপ্টেম্বর মাসের সহপ্রকল্পের বিবরণ]]
* পরিসংখ্যান: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/কার্তিক ১৪৩২/পরিসংখ্যান|সেপ্টেম্বরের শীর্ষ দশ]]
* উইকিমিডিয়া সংবাদ: [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/কার্তিক ১৪৩২/উইকিমিডিয়া সংবাদ|অক্টোবরের ব্যস্ত বাংলা উইকি সম্প্রদায়]]
</div>
<div style="margin-top:10px; font-size:90%; padding-left:5px; font-family:Georgia, Palatino, Palatino Linotype, Times, Times New Roman, serif;">'''[[w:bn:উইকিপিডিয়া:উইকিপত্রিকা|সম্পূর্ণ উইকিপত্রিকা পড়ুন]]''' · [[w:bn:উইকিপিডিয়া:উইকিপত্রিকা/দেয়ালিকা|দেয়ালিকা]] · [[m:উইকিপত্রিকা/গ্রাহক তালিকা|আনসাবস্ক্রাইব করুন]] </div> [[m:MassMessage/bn#বৈশ্বিক_বার্তা_বিতরণ|বৈশ্বিক বার্তা বিতরণ]] ১৮:২৫, ২১ অক্টোবর ২০২৫ (ইউটিসি)
<!-- ([[w:en:User:R1F4T/উইকিপ্রকাশক]]) স্ক্রিপ্ট দ্বারা প্রেরিত-->
<!-- https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/%E0%A6%89%E0%A6%87%E0%A6%95%E0%A6%BF%E0%A6%AA%E0%A6%A4%E0%A7%8D%E0%A6%B0%E0%A6%BF%E0%A6%95%E0%A6%BE&oldid=29299040-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:MdsShakil@metawiki পাঠিয়েছেন -->
== আন্দোলনের বেশ কয়েকটি কমিটিতে যোগদানের জন্য স্বেচ্ছাসেবকদের সন্ধান ==
<section begin="announcement-content" />
প্রতি বছর, সাধারণত অক্টোবর থেকে ডিসেম্বর পর্যন্ত, আন্দোলনের বেশ কয়েকটি কমিটি নতুন স্বেচ্ছাসেবক খোঁজে।
কমিটিগুলির মেটা-উইকি পাতায় তাদের সম্পর্কে আরও পড়ুন:
* [[m:Special:MyLanguage/Affiliations Committee|অধিভুক্তি কমিটি (অ্যাফকম)]]
* [[m:Special:MyLanguage/Ombuds commission|ন্যায়পাল কমিশন (ওসি)]]
* [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|কেস রিভিউ কমিটি (সিআরসি)]]
কমিটির জন্য আবেদন খোলা হবে ৩০ অক্টোবর ২০২৫৷ অধিভুক্তি কমিটির, ন্যায়পাল কমিশন ও কেস রিভিউ কমিটির জন্য আবেদন গ্রহণ ১১ ডিসেম্বর ২০২৫ তারিখে শেষ হবে। কিভাবে আবেদন করতে হয় তা শিখুন [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Committee appointments|মেটা-উইকিতে অ্যাপয়েন্টমেন্ট পাতায় গিয়ে]]। আলাপ পাতায় পোস্ট করুন অথবা আপনার যেকোন প্রশ্ন থাকলে cst[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org-তে ইমেল করুন।
কমিটির সহায়তা দলের পক্ষ থেকে,
<section end="announcement-content" />
-[[m:User:MKaur (WMF)| MKaur (WMF)]] ১৪:১৩, ৩০ অক্টোবর ২০২৫ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29517125-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:MKaur (WMF)@metawiki পাঠিয়েছেন -->
== <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]]) ১৪:২৩, ২০ নভেম্বর ২০২৫ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29583860-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Sannita (WMF)@metawiki পাঠিয়েছেন -->
== Thank You for Last Year – Join Wiki Loves Ramadan 2026 ==
Dear Wikimedia communities,
We hope you are doing well, and we wish you a happy New Year.
''Last year, we captured light. This year, we’ll capture legacy.''
In 2025, communities around the world shared the glow of Ramadan nights and the warmth of collective iftars. In 2026, ''Wiki Loves Ramadan'' is expanding, bringing more stories, more cultures, and deeper global connections across Wikimedia projects.
We invite you to explore the ''Wiki Loves Ramadan 2026'' [[m:Special:MyLanguage/Wiki Loves Ramadan 2026|Meta page]] to learn how you can participate and [[m:Special:MyLanguage/Wiki Loves Ramadan 2026/Participating communities|sign up]] your community.
📷 ''Photo campaign on '' [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan 2026|Wikimedia Commons]]
If you have questions about the project, please refer to the FAQs:
* [[m:Special:MyLanguage/Wiki Loves Ramadan/FAQ/|Meta-Wiki]]
* [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan/FAQ|Wikimedia Commons]]
''Early registration for updates is now open via the '''[[m:Special:RegisterForEvent/2710|Event page]]'''''
''Stay connected and receive updates:''
* [https://t.me/WikiLovesRamadan Telegram channel]
* [https://lists.wikimedia.org/postorius/lists/wikilovesramadan.lists.wikimedia.org/ Mailing list]
We look forward to collaborating with you and your community.
'''The Wiki Loves Ramadan 2026 Organizing Team''' ১৯:৪৫, ১৬ জানুয়ারি ২০২৬ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== সার্বজনীন আচরণবিধি ও প্রয়োগ নির্দেশিকার বার্ষিক পর্যালোচনা ==
<section begin="announcement-content" />
আপনাকে জানানো হচ্ছে যে, সার্বজনীন আচরণবিধি ও প্রয়োগ নির্দেশিকার বার্ষিক পর্যালোচনার সময়কাল শুরু হয়েছে। আপনি ৯ ফেব্রুয়ারি ২০২৬ পর্যন্ত যেকোন পরিবর্তনের প্রস্তাব দিতে পারেন। বার্ষিক পর্যালোচনার নির্ধারিত ধাপগুলোর মধ্যে এটিই প্রথম। [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|আরও বিস্তারিত জানতে এবং মেটা-উইকির UCoC পাতায় চলমান আলোচনায় অংশ গ্রহণ করতে এখানে ক্লিক করুন]]।
[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|সার্বজনীন আচরণবিধি সমন্বয় কমিটি]] (ইউ৪সি) একটি বৈশ্বিক দল, যা সার্বজনীন আচরণবিধির ন্যায্য ও ধারাবাহিক প্রয়োগ নিশ্চিত করতে কাজ করে। এই বার্ষিক পর্যালোচনাটি ইউ৪সি কর্তৃক পরিকল্পিত ও বাস্তবায়িত হচ্ছে। ইউ৪সি এবং এর দায়িত্বসমূহ সম্পর্কে আরও বিস্তারিত জানতে, আপনি [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|ইউ৪সি সনদ দেখতে পারেন]]।
দয়া করে এই তথ্যটি আপনার সম্প্রদায়ের অন্যান্য সদস্যদের সাথে এবং অন্য যে কোনও উপযুক্ত স্থানে শেয়ার করুন।
-- ইউ৪সি-এর সহযোগিতায়, [[m:User:Keegan (WMF)|কিগান (WMF)]] ([[m:User talk:Keegan (WMF)|আলাপ]])<section end="announcement-content" />
২১:০২, ১৯ জানুয়ারি ২০২৬ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
== গুরুত্বপূর্ণ: প্রশাসক কার্যকলাপ পর্যালোচনা ==
হ্যালো। ২০১৩ সালে [[:m:Requests for comment/Activity levels of advanced administrative rights holders|বৈশ্বিক সম্প্রদায়ের ঐক্যমত্য]] "উন্নত অধিকার" (প্রশাসক, ব্যুরোক্রেট, ইন্টারফেজ প্রশাসক ইত্যাদি) অপসারণ সংক্রান্ত একটি নীতি গৃহীত হয়। এই নীতি অনুযায়ী, [[:m:stewards|স্টুয়ার্ডগণ]] উইকিমিডিয়া ফাউন্ডেশনের সকল উইকির যাদের কোন নিষ্ক্রিয়তা নীতিমালা নেই তাদের প্রশাসকদের কার্যকলাপ পর্যালোচনা করেন। আমরা যতটা জানি, আপনার উইকিতে নিষ্ক্রিয় অ্যাকাউন্ট থেকে "উন্নত অধিকার" অপসারণের জন্য কোন আনুষ্ঠানিক প্রক্রিয়া নেই। এর মানে হল যে স্ট্যুয়ার্ডরা [[:m:Admin activity review|প্রশাসক কার্যকলাপ পর্যালোচনা]] অনুযায়ী এই কাজটি করবেন।
আমরা নির্ধারিত করেছি যে নিম্নলিখিত ব্যবহারকারীরা নিষ্ক্রিয়তার মানদণ্ড পূরণ করে (২ বছরের বেশি সময় ধরে কোনও সম্পাদনা এবং কোনও লগ ক্রিয়া নেই):
# [[User:Ashiq Shawon]] (প্রশাসক)
এই ব্যবহারকারীরা শীঘ্রই একটি বিজ্ঞপ্তি পাবেন এবং তাদেরকে একটি সম্প্রদায় আলোচনা শুরু করার জন্য জিজ্ঞাসা করা হবে যে তারা তাদের কিছু বা সব অধিকার বজায় রাখতে চান কিনা। ব্যবহারকারীরা কোন সাড়া না দিলে, তাদের উন্নত অধিকারগুলি স্টুয়ার্ড দ্বারা সরানো হবে।
যাইহোক, যদি আপনি একটি সম্প্রদায় হিসেবে বৈশ্বিক নীতির পরিবর্তে আপনার নিজস্ব কার্যকলাপ পর্যালোচনার নীতি তৈরি করতে চান, এই নিষ্ক্রিয় অধিকারধারীদের সম্পর্কে আরেকটি সিদ্ধান্ত নিতে চান, অথবা ইতিমধ্যে আমরা যদি না জেনে থাকি যে আপনাদের একটি নীতি আছে, তাহলে অনুগ্রহ করে [[:m:Stewards' noticeboard|মেটা-উইকিতে স্ট্যুয়ার্ডদের]] জানান তাহলে আমরা আপনার উইকিতে অধিকার পর্যালোচনা করতে অগ্রসর হব না। ধন্যবাদ। [[ব্যবহারকারী:EPIC|EPIC]] ([[ব্যবহারকারী আলাপ:EPIC|আলাপ]]) ১৭:১৬, ১৪ ফেব্রুয়ারি ২০২৬ (ইউটিসি)
== Action Required: Update templates/modules for electoral maps (Migrating from P1846 to P14226) ==
Hello everyone,
This is a notice regarding an ongoing data migration on Wikidata that may affect your election-related templates and Lua modules (such as <code>Module:Itemgroup/list</code>).
'''The Change:'''<br />
Currently, many templates pull electoral maps from Wikidata using the property [[:d:Property:P1846|P1846]], combined with the qualifier [[:d:Property:P180|P180]]: [[:d:Q19571328|Q19571328]].
We are migrating this data (across roughly 4,000 items) to a newly created, dedicated property: '''[[:d:Property:P14226|P14226]]'''.
'''What You Need To Do:'''<br />
To ensure your templates and infoboxes do not break or lose their maps, please update your local code to fetch data from [[:d:Property:P14226|P14226]] instead of the old [[:d:Property:P1846|P1846]] + [[:d:Property:P180|P180]] structure. A [[m:Wikidata/Property Migration: P1846 to P14226/List|list of pages]] was generated using Wikimedia Global Search.
'''Deadline:'''<br />
We are temporarily retaining the old data on [[:d:Property:P1846|P1846]] to allow for a smooth transition. However, to complete the data cleanup on Wikidata, the old [[:d:Property:P1846|P1846]] statements will be removed after '''May 1, 2026'''. Please update your modules and templates before this date to prevent any disruption to your wiki's election articles.
Let us know if you have any questions or need assistance with the query logic. Thank you for your help! [[User:ZI Jony|ZI Jony]] using [[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ১৭:১২, ৩ এপ্রিল ২০২৬ (ইউটিসি)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:ZI Jony@metawiki পাঠিয়েছেন -->
== উইকিকনফারেন্স ইন্ডিয়া ২০২৬-এর জন্য স্কলারশিপ আবেদন খোলা ==
স্বাগতম,
উইকিকনফারেন্স ইন্ডিয়া ২০২৬-এর জন্য স্কলারশিপের আবেদন গ্রহণ শুরু হয়েছে। এই সম্মেলনটি ২০২৬ সালের ৪ঠা থেকে ৬ই সেপ্টেম্বর পর্যন্ত ভারতের কোচি শহরে অনুষ্ঠিত হবে।
ভারত, দক্ষিণ এশিয়া এবং এর বাইরের বিভিন্ন প্রান্ত থেকে উইকিমিডিয়ান, কমিউনিটি সংগঠক এবং অবদানকারীরা উইকিকনফারেন্স ইন্ডিয়া সম্মেলনে একত্রিত হন। মুক্ত জ্ঞান আন্দোলনকে শক্তিশালী করার লক্ষ্যে সংযোগ স্থাপন, শেখা, অভিজ্ঞতা বিনিময় এবং সহযোগিতার একটি ক্ষেত্র হল এই সম্মেলন।
আপনি যদি উইকিমিডিয়া প্রকল্পে সক্রিয় অবদানকারী হন অথবা সামাজিক কর্মকাণ্ডে জড়িত থাকেন, তবে আপনাকে এই বৃত্তির জন্য আবেদন করতে উৎসাহিত করা হচ্ছে। [[diffblog:2026/03/19/namukku-othukoodam-scholarships-now-open-for-wikiconference-india-2026/|বিস্তারিত ঘোষণা]] এখানে রয়েছে। 🙂
আবেদন জমা দেওয়ার শেষ তারিখ: ১৫ই এপ্রিল ২০২৬, রাত ১১:৫৯ মিনিট (আইএসটি)
আবেদনের লিঙ্ক: [https://docs.google.com/forms/d/e/1FAIpQLSdA3rR9xX_k31dzJrjM5MTDNYNUIRcAB45S4TflsYCbGJNrzg/viewform আবেদন লিঙ্ক]
আরও তথ্য: [[metawiki:WikiConference_India_2026/Scholarship|মেটা পেজের লিঙ্ক]]
আপনার সম্প্রদায়ের সাথে নির্দ্বিধায় এই ঘোষণাটি শেয়ার করুন।
ধন্যবাদ।
উইকিকনফারেন্স ইন্ডিয়া ২০২৬ আয়োজক দল
-[[ব্যবহারকারী:Gnoeee|Gnoeee]] ([[ব্যবহারকারী আলাপ:Gnoeee|আলাপ]]) ১৩:৪৭, ৪ এপ্রিল ২০২৬ (ইউটিসি)
== বাংলার প্রেমে উইকি ২০২৬ শুরু হয়েছে, এখনই অংশ নিন! ==
<div style="padding:15px; font-size:120%; line-height:1.6; margin:10px 0; border:2px solid #c90023; background-color:#FFFFFF; border-radius:8px;">
সুধী,
[[File:বাংলার প্রেমে উইকি লোগো.svg|right|100px|frameless|link=Commons:Wiki Loves Bangla 2025]]
আমরা আনন্দের সাথে জানাচ্ছি যে [[c:Commons:Wiki Loves Bangla 2026|বাংলার প্রেমে উইকি ২০২৬]] শুরু হয়েছে! এ বছরের প্রতিযোগিতার বিষয় '''বাংলার উৎসব''', যেখানে অংশগ্রহণকারীদের বাংলার বিভিন্ন সাংস্কৃতিক উৎসবের ছবি ও ভিডিও ধারণ করে শেয়ার করার জন্য আহ্বান জানানো হচ্ছে।
'''[[c:Commons:Wiki Loves Bangla|বাংলার প্রেমে উইকি]]''' হলো উইকিমিডিয়া কমন্সে আয়োজিত একটি আন্তর্জাতিক আলোকচিত্র প্রতিযোগিতা, যার লক্ষ্য বিশ্বব্যাপী বাংলা সংস্কৃতি ও ঐতিহ্য নথিভুক্ত করা। এটি [[meta:Bangla Culture and Heritage Collation Program|বাংলা সংস্কৃতি ও ঐতিহ্য সংরক্ষণ কর্মসূচীর]] অংশ হিসেবে প্রতি বছর নির্দিষ্ট প্রতিপাদ্য নিয়ে আয়োজিত হয়।
'''আপনি কিভাবে অংশ নেবেন''', প্রক্রিয়াটি সহজ—আপনার প্রতিটি অবদান বিশ্বের সবচেয়ে বড় মুক্ত জ্ঞানভাণ্ডারকে সমৃদ্ধ করবে:
[[File:পাতি মাছরাঙ্গা (Alcedo atthis), জাতীয় উদ্ভিদ উদ্যান ঢাকা.jpg|thumb|right|250px|link=Commons:Wiki Loves Bangla 2025|বাংলার প্রেমে উইকি ২০২৫-এর বিজয়ী ছবি]]
* '''ছবি তুলুন''': বাংলার উৎসবের ছবি তুলুন বা ভিডিও ধারণ করুন।
* '''আপলোড করুন''': আপনার ফাইলগুলো '''১৪ এপ্রিল থেকে ১৫ মে ২০২৬''' তারিখের মধ্যে উইকিমিডিয়া কমন্সে আপলোড করুন।
* '''জিতুন''': মোট '''১,১০০ মার্কিন ডলার''' পুরস্কার।
শুরু করতে প্রস্তুত? [https://commons.wikimedia.org/w/index.php?title=Special:UploadWizard&uselang=bn&campaign=Wlbangla এখানে ক্লিক করে আপনার মিডিয়া আপলোড করুন], অথবা বিস্তারিত জানতে [[c:Commons:Wiki Loves Bangla 2026|প্রতিযোগিতার মূল পাতা]] দেখুন।
আপনার অবদান বাংলার সমৃদ্ধ সংস্কৃতি ও ঐতিহ্যকে বিশ্বব্যাপী সংরক্ষণ ও উপস্থাপনে গুরুত্বপূর্ণ ভূমিকা রাখবে।
কোনো প্রশ্ন থাকলে আমাদের ইমেইল করুন অথবা আমাদের [https://t.me/WikiLovesBangla টেলিগ্রাম গ্রুপে] যুক্ত হোন।
শুভেচ্ছান্তে,<br>
'''বাংলার প্রেমে উইকি দল'''<br>
<nowiki>#WikiLovesBangla</nowiki><br>
</div> [[ব্যবহারকারী:Moheen|~'''মহীন''']] [[ব্যবহারকারী আলাপ:Moheen|<sup>(আলাপ)</sup>]] ২০:২৪, ২১ এপ্রিল ২০২৬ (ইউটিসি)
== 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}}
[[ব্যবহারকারী:MediaWiki message delivery|MediaWiki message delivery]] ([[ব্যবহারকারী আলাপ:MediaWiki message delivery|আলাপ]]) ০০:৫৮, ২৬ এপ্রিল ২০২৬ (ইউটিসি)
</bdi>
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Codename Noreste@metawiki পাঠিয়েছেন -->
== [স্বেচ্ছাসেবক আহ্বান] বাংলা উইকিসম্মেলন ২০২৬-এর আয়োজক দলে যোগ দিন! ==
সুপ্রিয় উইকিমিডিয়ান ও শুভানুধ্যায়ী,
আশা করি ভালো আছেন।
আনন্দের সাথে জানাচ্ছি যে, আমরা আমাদের আসন্ন '''‘বাংলা উইকিসম্মেলন ২০২৬’''' সফলভাবে আয়োজনের প্রস্তুতি শুরু করেছি। উইকিমিডিয়া আন্দোলনের এই বৃহত্তর আয়োজনকে সফল করতে আমরা একদল উৎসাহী এবং নিবেদিতপ্রাণ স্বেচ্ছাসেবক খুঁজছি।
আপনি যদি এই সম্মেলনের নেপথ্যে থেকে গুরুত্বপূর্ণ ভূমিকা পালন করতে আগ্রহী হন, তবে আমরা আপনাকে নিচের যেকোনো একটি দলে যুক্ত হওয়ার জন্য আমন্ত্রণ জানাচ্ছি:
=== আমরা মূলত তিনটি দলের জন্য স্বেচ্ছাসেবক খুঁজছি: ===
# '''অনুষ্ঠান বিন্যাস দল:''' সেশন পরিকল্পনা, স্পিকারদের সাথে সমন্বয় এবং ইভেন্টের সার্বিক এজেন্ডা ব্যবস্থাপনা।
# '''কার্য পরিচালন দল:''' লজিস্টিকস, ভেন্যু ব্যবস্থাপনা, রেজিস্ট্রেশন এবং অনুষ্ঠানের সার্বিক পরিচালনা।
# '''বৃত্তি পর্যালোচনা দল:''' অংশগ্রহণকারীদের বৃত্তির আবেদনগুলো যাচাই-বাছাই ও মূল্যায়ন।
=== আবেদন করবেন যেভাবে: ===
আপনি যদি এই চ্যালেঞ্জ গ্রহণ করতে প্রস্তুত থাকেন, তবে অনুগ্রহ করে আগামী '''২০ মে ২০২৬''' তারিখের মধ্যে নিচের লিঙ্কে গিয়ে আবেদন ফর্মটি পূরণ করুন: '''https://docs.google.com/forms/u/5/d/e/1FAIpQLSdlX3Bm-A2zyBDFbeawk5rSjYuGCGjdOcsSBeP_pd03BWZkJA/viewform?usp=send_form'''
আপনার শ্রম ও মেধা বাংলা উইকিসম্মেলনকে আরও প্রাণবন্ত ও সফল করে তুলবে বলে আমাদের বিশ্বাস।
আয়োজক দলের পক্ষে, [[ব্যবহারকারী:MdsShakil|MdsShakil]] ([[ব্যবহারকারী আলাপ:MdsShakil|আলাপ]]) ০৬:২৬, ১১ মে ২০২৬ (ইউটিসি)
== ২০২৬ সালের ইউ৪সি নির্বাচনে এখনই ভোট দিন ==
<section begin="announcement-content" />
যোগ্য ভোটারদের ২০২৬ সালের [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|সর্বজনীন আচরণবিধি সমন্বয় কমিটির]] নির্বাচনে অংশগ্রহণের জন্য আহ্বান জানানো হচ্ছে। যোগ্যতা যাচাই, ভোটদান প্রক্রিয়া, প্রার্থীদের তথ্য এবং ভোটদানের লিঙ্কসহ আরও তথ্য মেটার [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|২০২৬ সালের নির্বাচনী তথ্যপাতায়]] পাওয়া যাবে। ভোটগ্রহণ ২০২৬ সালের ২ জুন [https://zonestamp.toolforge.org/1780358400 ০০:০০ ইউটিসিতে] শেষ হবে।
আপনার অ্যাকাউন্ট যোগ্যতার মানদণ্ড পূরণ করে থাকলে অনুগ্রহ করে ভোট দিন। ফলাফল ১৪ জুন ২০২৬-এর মধ্যে প্রকাশ করা হবে। -- ইউ৪সির পক্ষে,<section end="announcement-content" />
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) ১৭:১৫, ২৭ মে ২০২৬ (ইউটিসি)
(এই বার্তাটি [[:উইকিঅভিধান:প্রশাসকদের আলোচনাসভা]] পাতায় পাঠানো হয়েছিল ও একটি পুনর্নির্দেশের কারণে এখানে পোস্ট করা হচ্ছে।)
<!-- https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30513860-এর তালিকা ব্যবহার করে বার্তাটি ব্যবহারকারী:Keegan (WMF)@metawiki পাঠিয়েছেন -->
explx0fmekuh90gtm9v96us3xyeqf75
মডিউল:আভিধানিক উপাত্ত
828
50158
509301
509293
2026-05-28T07:47:43Z
Redmin
6857
509301
Scribunto
text/plain
local p = {}
local i18n = require('মডিউল:আভিধানিক উপাত্ত/i18n')
local references = require('মডিউল:উইকিউপাত্ত তথ্যসূত্র বিন্যাসকরণ').format
local getArgs = require('Module:Arguments').getArgs
local wb = mw.wikibase
local ustring = mw.ustring
local html = mw.html
local mw_lang = mw.language
local entity_cache = {}
local reference_cache = {}
local forms
local lang_code
local lex_cat
local function wrapStringInWikilinks(str)
local exceptions = i18n.nolinks
local result = str:gsub('(%S+)', function(token)
local word, trailing_char = token:match('^(.-)([;,]*)$')
local wrapped = word:gsub('[^(-/]+', function(part)
if exceptions[part] then
return part
else
return '[[' .. part .. '#' .. i18n['content_lang_name'] .. '|' .. part .. ']]'
end
end)
return wrapped .. trailing_char
end)
return result
end
local function serializeTable(val, name, skipnewlines, depth) -- https://stackoverflow.com/a/6081639
skipnewlines = skipnewlines or false
depth = depth or 0
local tmp = string.rep(" ", depth)
if name then tmp = tmp .. name .. " = " end
if type(val) == "table" then
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
for k, v in pairs(val) do
tmp = tmp .. serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
end
tmp = tmp .. string.rep(" ", depth) .. "}"
elseif type(val) == "number" then
tmp = tmp .. tostring(val)
elseif type(val) == "string" then
tmp = tmp .. string.format("%q", val)
elseif type(val) == "boolean" then
tmp = tmp .. (val and "true" or "false")
else
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
end
return tmp
end
-- Use this to safely expand templates when you are not sure that they exist.
local function safeExpand(frame, title, args)
local _, result = pcall(function()
return frame:expandTemplate{ title = title, args = args }
end)
if result:find('does not exist') then -- expandTemplate{} doesn't seem to throw any error that can be handled with pcall() so string search is the only viable option.
return nil
end
return result
end
-- Use this function to get the label of an item even if that item does not have any label in the wiki's content language or English.
local function getLabel(id)
if id == 'Q11051hi' then
return 'হিন্দি'
elseif id == 'Q11051ur' then
return 'উর্দু'
elseif id == 'Q56356571fa' then
return 'নয়া ফার্সি'
elseif id == 'Q56356571tg' then
return 'তাজিক'
elseif id == 'Q58635pa' or id == 'Q58635pnb' then
return 'পাঞ্জাবি'
end
local label = wb.getLabel(id)
if label then
return label
end
local labels = wb.getEntity(id).labels
if not labels then
return id
end
for _, v in pairs(labels) do
if v and v.value then
return v.value
end
end
end
local function getReference( id, reference )
local out_id = nil
local url_value
if reference_cache[id] == nil then
local ref_text = references(reference, wb, mw_lang, i18n['content_lang_code'], i18n['wikipedia'])
if reference.snaks ~= nil then
if reference.snaks['P248'] ~= nil then
for _, snak in pairs(reference.snaks['P248']) do
if snak.datavalue and snak.datavalue.value.id == 'Q428' then -- কুরআন
ref_text = ustring.gsub(ref_text, 'নামক অনুচ্ছেদ', 'নং আয়াত')
break
end
end
end
if reference.snaks['P854'] ~= nil then
local snak = reference.snaks['P854'][1]
if snak.datavalue then
url_value = snak.datavalue.value
end
end
end
if url_value ~= nil then
ref_text = ref_text .. ', [' .. url_value .. ' সংযোগ]'
end
reference_cache[id] = ref_text
else
out_id = id
end
return {out_id, reference_cache[id]}
end
local function getEntity( id )
if entity_cache[id] == nil then
entity_cache[id] = wb.getEntity(id)
end
return entity_cache[id] ~= false and entity_cache[id] or nil
end
local function getLexemeLanguageCode(current_lexeme)
local lang_item_id = current_lexeme:getLanguage()
if lang_item_id == nil then
return nil
end
local lang_entity = getEntity(lang_item_id)
if lang_entity == nil then
return nil
end
for i, statement_property in ipairs({'P305','P424', 'P220'}) do -- আইইটিএফ ভাষা ট্যাগ, উইকিমিডিয়া ভাষা কোড, আইএসও ৬৩৯-৩
local statements = lang_entity:getBestStatements(statement_property)
if statements[1] ~= nil then
return statements[1].mainsnak.datavalue.value
end
end
return nil
end
-- Return the first form of the lexeme which has exactly the given grammatical feature.
local function formWithSingleGrammaticalFeature( item_id )
for i = 1, #forms do
local grammaticalFeatures = forms[i]:getGrammaticalFeatures()
if #grammaticalFeatures == 1 and grammaticalFeatures[1] == item_id then
return forms[i]
end
end
return nil
end
local function getArticleLinkTemplate(frame, stmt_value)
local template = ''
local sitelink = getEntity(stmt_value):getSitelink(i18n['wikipedia'])
if sitelink ~= nil then
template = frame:expandTemplate{
title=i18n['template_wikipedia'],
args={sitelink}
}
end
return template
end
local function getArticleLinks (frame, sense )
local article_links = ''
for i, stmt in pairs(sense:getAllStatements('P5137')) do -- এই অর্থের জন্য আইটেম
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
for i, stmt in pairs(sense:getAllStatements('P9970')) do -- এই অর্থের জন্য বিধেয়
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
return article_links
end
-- @TODO: Generalise
local function expandTemplateForProperty(frame, object, property, template)
local lemmas = {}
local n = 0
for _, stmt in pairs(object:getAllStatements(property)) do
local lex = wb.lexeme.splitLexemeId(stmt.mainsnak.datavalue.value.id)
lex = getEntity(lex)
n = n + 1
lemmas[n] = lex:getLemma(lang_code)
end
if not lang_code or n == 0 then
return ''
end
-- Build args: first lang_code, then lemmas
local args = {lang_code}
for i = 1, n do
args[#args + 1] = lemmas[i]
end
return frame:expandTemplate{
title = template,
args = args
}
end
local function getExternalLinks( entity ) -- T418639
local external_links = {}
if entity.claims == nil then return external_links end
local formatter_urls = require('মডিউল:আভিধানিক উপাত্ত/urls').formatter_urls
for property_id, statements in pairs(entity.claims) do
local formatter_url = formatter_urls[property_id]
if formatter_url ~= nil then
local property_source = wb.getBestStatements(property_id, 'P9073')
local source_name
if next(property_source) ~= nil then
source_name = getLabel(property_source[1].mainsnak.datavalue.value.id)
or property_source[1].mainsnak.datavalue.value.id
else
source_name = getLabel(property_id) or property_id
end
for i = 1, #statements do
local stmt = statements[i]
if stmt.mainsnak.datavalue then
local formatted_link = ustring.gsub(
ustring.gsub(formatter_url, '$1', stmt.mainsnak.datavalue.value),
' ', '+'
)
table.insert(external_links,
'[' .. formatted_link .. ' ' .. source_name .. ']')
end
end
end
end
return external_links
end
p.getExternalLinks = getExternalLinks -- রেখে দিন যাতে ডিবাগিং সম্ভব হয়
local function termSpan( term )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( text )
return tostring( span )
end
local function termLink( term, lang_qid )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( '[[' .. text .. '#' .. getLabel(lang_qid) .. '|' .. text .. ']]' )
return tostring( span )
end
local function getLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termSpan(rep)
else
lemma_string = lemma_string .. '/' .. termSpan(rep)
end
end
return lemma_string
end
local function getLinkedLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termLink(rep, current_lexeme:getLanguage())
else
lemma_string = lemma_string .. '/' .. termLink(rep, current_lexeme:getLanguage())
end
end
return lemma_string
end
local function getExamples( current_lexeme, sense_id, references_seen )
local examples = html.create('dl')
for i, stmt in pairs(current_lexeme:getAllStatements('P5831')) do -- ব্যবহারের উদাহরণ
if stmt.qualifiers ~= nil and stmt.qualifiers['P6072'] ~= nil and stmt.qualifiers['P6072'][1].datavalue.value.id == sense_id then -- বিষয়ে লেক্সিমের অর্থ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_strs = {}
if stmt.qualifiers['P1810'] ~= nil then
table.insert(example_form_strs, stmt.qualifiers['P1810'][1].datavalue.value)
elseif stmt.qualifiers['P5830'] ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
for i, rep in pairs(example_form:getRepresentations()) do
table.insert(example_form_strs, rep[1])
end
end
example_str = nil
for i, example_form_str in pairs(example_form_strs) do
new_example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
if new_example_text ~= example_text then
example_str = termSpan({new_example_text, example_lang})
break
end
new_example_text = example_text
end
if example_str == nil then
example_str = termSpan({example_text, example_lang})
end
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
end
for i, stmt in pairs(wb.getAllStatements(sense_id, 'P5831')) do -- ব্যবহারের উদাহরণ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_str = nil
if stmt.qualifers ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
if stmt.qualifiers['P1810'] ~= nil then
example_form_str = stmt.qualifiers['P1810'][1].datavalue.value
end
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentation(i18n['content_lang_code'])
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentations()[1][1]
end
if example_form_str ~= nil then
example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
end
example_str = termSpan({example_text, example_lang})
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
return { tostring(examples) , references_seen }
end
-- This calls frame:preprocess() instead of :callParserFunction() because the latter does not work for Wikifunctions function calls yet (see https://www.wikifunctions.org/wiki/Wikifunctions:Embedded_function_calls).
local function callWikifunctionsFunction(args, frame)
return frame:preprocess('{{#function:' .. args .. '}}')
end
local function checkTitleCodePointInRange(title, start_point, end_point)
return ustring.find( title, '[' ..ustring.char(start_point) .. '-' .. ustring.char(end_point) .. ']' )
end
local function getLanguageForCategories( lang_id, current_page_title )
-- বিশেষ ভাষার জন্য
if lang_id == 'Q11051' then -- হিন্দি/উর্দু
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- উর্দু
lang_id = 'Q11051ur'
elseif checkTitleCodePointInRange(current_page_title, 0x0900, 0x097f) ~= nil then -- হিন্দি
lang_id = 'Q11051hi'
end
elseif lang_id == 'Q58635' then -- পাঞ্জাবি
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- শাহমুখী
lang_id = 'Q58635pnb'
elseif checkTitleCodePointInRange(current_page_title, 0x0a00, 0x0a7f) ~= nil then -- গুরুমুখী
lang_id = 'Q58635pa'
end
elseif lang_id == 'Q56356571' then -- নয়া ফার্সি ভাষা
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- ফার্সি (ইরান/আফগানিস্তান)
lang_id = 'Q56356571fa'
elseif checkTitleCodePointInRange(current_page_title, 0x0400, 0x04ff) ~= nil then -- তাজিক
lang_id = 'Q56356571tg'
end
end
return lang_id
end
local function getOneStringForProperty(object, property)
local val
local stmts = object:getAllStatements(property)
if #stmts ~= 0 then
val = stmts[1].mainsnak.datavalue.value
end
return val
end
local function getTranslations(frame, senses) -- TODO: woefully incomplete until T185313 and T199887 are resolved
if #senses == 0 then
return nil
end
local all_translations = {}
for _, sense in pairs(senses) do
local translation_set = {}
local gloss = sense:getGloss('bn')
for _, stmt in pairs(sense:getAllStatements('P5972')) do
local translation = stmt.mainsnak.datavalue.value.id
local lexeme_id = wb.lexeme.splitLexemeId(translation)
local language = getLabel(getEntity(lexeme_id):getLanguage())
table.insert(translation_set, language .. ': ' .. getLinkedLemmata(getEntity(lexeme_id)) .. '<br/>')
end
if #translation_set > 0 then
local block = frame:expandTemplate{ title = i18n['template_trans-top'], args = { gloss } }
block = block .. table.concat(translation_set, '\n') .. frame:expandTemplate{ title = i18n['template_trans-bottom'] }
table.insert(all_translations, block)
end
end
if #all_translations == 0 then
return nil
end
return '====' .. i18n['heading_translation'] .. '==== \n' .. table.concat(all_translations, '\n')
end
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. "File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n['edit_wikidata']
.. "|link=https://www.wikidata.org/entity/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n['edit_wikidata'] .. "]]</span>"
return icon
end
local function getMeanings( frame, args, current_lexeme, senses, references_seen, language_name)
if #senses == 0 then
return {createicon(i18n['content_lang_code'], current_lexeme:getId()) .. "''" .. i18n['text_category_rfdef'] .. "''" .. i18n.tocatlink(i18n['category_rfdef']), references_seen}
end
local meanings = html.create( 'ol' )
local idlinkset = {}
for i, sense in pairs(senses) do
local gloss_text_parts = {}
local main_gloss_text = frame:expandTemplate{
title=i18n['template_anchor'],
args={sense:getId()}
}
local specifiers = {}
for k, property_id in ipairs({'P6084', 'P6191', 'P9488'}) do -- অবস্থান যেখানে শব্দার্থ ব্যবহৃত, যে রীতিতে শব্দার্থ ব্যবহৃত হয়, যে ক্ষেত্রে ব্যবহৃত
for i, stmt in pairs(sense:getAllStatements(property_id)) do
local stmt_value = stmt.mainsnak.datavalue.value.id
local reference_text = ''
local refs = stmt.references
if refs ~= nil then
for j, reference in pairs(refs) do
table.insert(references_seen, reference.hash)
got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. frame:extensionTag('ref', got_reference[2])
end
local val = getLabel(stmt_value)
table.insert(specifiers, val .. reference_text)
if property_id == 'P9488' then
table.insert(specifiers, i18n.tocatlink(lang_code .. val))
end
end
end
end
if #specifiers > 0 then
main_gloss_text = main_gloss_text .. "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local gloss = sense:getGloss( i18n['content_lang_code'] )
if gloss ~= nil then
main_gloss_text = main_gloss_text .. wrapStringInWikilinks(gloss)
if gloss:match('^প্রদত্ত%s*(%S-)%s*নাম$') then -- given names
main_gloss_text = main_gloss_text .. i18n.tocatlink(language_name .. ' ' .. i18n['category_given_names'])
end
else
local other_gloss_text = nil
local other_gloss_lang = nil
local item_label_gloss_parts = {}
for k, stmt in pairs(sense:getAllStatements('P5137')) do -- যদি 'এই অর্থের জন্য আইটেম' মানের বাংলা লেবেল থাকে
local stmt_value = stmt.mainsnak.datavalue.value.id
local stmt_label = getLabel(stmt_value)
if stmt_label ~= nil then
table.insert(item_label_gloss_parts, '[[:d:' .. stmt_value .. '|' .. stmt_label .. ']]')
end
end
if #item_label_gloss_parts > 0 then
other_gloss_text = table.concat(item_label_gloss_parts, '; ')
end
if other_gloss_text == nil then
for i, fallback_lang in ipairs(mw_lang.getFallbacksFor( i18n['content_lang_code'] )) do
if sense:getGloss( fallback_lang ) ~= nil then
other_gloss_text, other_gloss_lang = sense:getGloss( fallback_lang )
end
end
if other_gloss_lang == nil then
local glosses = sense:getGlosses()
for j, gloss in pairs(glosses) do
other_gloss_text = gloss[1]
other_gloss_lang = gloss[2]
break
end
end
main_gloss_text = main_gloss_text .. other_gloss_text .. "<sup><em>" .. mw_lang.fetchLanguageName(other_gloss_lang, i18n['content_lang_code']) .. "</em></sup>"
else
main_gloss_text = main_gloss_text .. "''" .. other_gloss_text .. "''"
end
main_gloss_text = main_gloss_text .. i18n.tocatlink(i18n['category_rfdef_equivalent'])
end
local synonym = expandTemplateForProperty(frame, sense, 'P5973', i18n['template_synonym'])
if synonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. synonym
end
local antonym = expandTemplateForProperty(frame, sense, 'P5974', i18n['template_antonym'])
if antonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. antonym
end
local hypernym = expandTemplateForProperty(frame, sense, 'P6593', i18n['template_hypernym'])
if hypernym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. hypernym
end
if lex_cat == 'Q1084' or lex_cat == 'Q147276' then -- noun or proper noun
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-noun'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
elseif lex_cat == 'Q34698' then
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-adj'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
end
table.insert(gloss_text_parts, main_gloss_text .. createicon(i18n['content_lang_code'], sense:getId()))
for i, stmt in pairs(sense:getAllStatements('P8394')) do -- টিপ্পনীর উদ্ধৃতি
gloss_quote = termSpan({stmt.mainsnak.datavalue.value.text, stmt.mainsnak.datavalue.value.language})
if stmt.references[1] ~= nil then
local got_reference = getReference ( stmt.references[1].hash, stmt.references[1] )
gloss_quote = '"' .. gloss_quote .. '" ' .. got_reference[2]
end
table.insert(references_seen, stmt.references[1].hash)
table.insert(gloss_text_parts, frame:extensionTag('ref', gloss_quote))
end
for i, stmt in pairs(sense:getAllStatements('P1343')) do -- বর্ণিত উৎস
-- TODO: do away with making fake reference objects
local fake_reference = { ['snaks'] = {} }
fake_reference.snaks['P248'] = { [1] = stmt.mainsnak }
qualifiers_order = stmt['qualifiers-order']
if qualifiers_order ~= nil then
for i, k in ipairs(qualifiers_order) do fake_reference.snaks[k] = stmt.qualifiers[k] end
end
fake_reference.hash = mw.hash.hashValue('sha3-512', serializeTable(fake_reference))
table.insert(references_seen, fake_reference.hash)
local got_reference = getReference(fake_reference.hash, fake_reference)
if got_reference[1] == nil then
table.insert(gloss_text_parts, frame:extensionTag('ref', got_reference[2], {name = fake_reference.hash}))
else
table.insert(gloss_text_parts, frame:extensionTag{name = 'ref', content='', args = {name = got_reference[1]}})
end
end
local first_sense_image = ''
local sense_images = sense:getAllStatements('P18')
if next(sense_images) ~= nil then
first_sense_image = sense_images[1].mainsnak.datavalue.value
end
if first_sense_image ~= '' then
table.insert(gloss_text_parts, '[[চিত্র:' .. first_sense_image .. "|thumb|'''" .. getLemmata(current_lexeme) .. "'''—" .. main_gloss_text .. ']]')
end
local idlinks = getExternalLinks(sense)
if #idlinks > 0 then
local idlinktext = '<small>('
for _, idlink in pairs(idlinks) do
idlinktext = idlinktext .. idlink .. '\n'
end
idlinktext = idlinktext .. ')</small>'
table.insert(gloss_text_parts, idlinktext)
table.insert(idlinkset, idlinks)
end
local externallinks = getArticleLinks(frame, sense)
if externallinks ~= '' then
table.insert(gloss_text_parts, externallinks)
end
local new_notes = {}
local sense_keys = { sense:getId(), string.sub(sense:getId(), string.find(sense:getId(), '-')+1) }
for _, v in ipairs(sense_keys) do
if args[v] ~= nil then
table.insert(new_notes, args[v])
end
end
if #new_notes > 0 then
for _, v in ipairs(new_notes) do
if i == 1 then
table.insert(gloss_text_parts, '<br/>' .. v)
else
table.insert(gloss_text_parts, v)
end
end
end
local examples, references_seen = unpack(getExamples( current_lexeme, sense:getId(), references_seen ))
local gloss_text = table.concat(gloss_text_parts, '\n')
meanings:tag('li'):wikitext(gloss_text):wikitext(examples)
end
return {meanings, references_seen, idlinkset}
end
local function getPronunciationBaseForm( lang_name, lex_cat)
local base_form = nil
-- (!) অন্য ভাষার শব্দের যদি অন্য রকম মূল ফর্ম থাকে সেগুলো এখানে নতুন if বিবৃতি দিয়ে যোগ করা যায়।
if lang_name == 'বাংলা' then
if lex_cat == 'Q1084' then -- বিশেষ্য
base_form = formWithSingleGrammaticalFeature( 'Q131105' ) -- কর্তৃকারক
elseif lex_cat == 'Q24905' then -- ক্রিয়া
base_form = formWithSingleGrammaticalFeature( 'Q1350145' ) -- ক্রিয়া বিশেষ্য
end
end
if base_form == nil then
for i, form in pairs(forms) do
base_form = form
break
end
end
return base_form
end
local function getCombines( current_lexeme, frame )
local combines = ''
local index_mappings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P5238')) do
if stmt.qualifiers ~= nil and stmt.qualifiers['P1545'] ~= nil then -- ক্রম
local current_index = tonumber(stmt.qualifiers['P1545'][1].datavalue.value)
index_mappings[current_index] = stmt
end
end
if #index_mappings ~= 0 then
for i, stmt in ipairs(index_mappings) do
if stmt.mainsnak.datavalue ~= nil then
local part_lexeme_id = stmt.mainsnak.datavalue.value.id
local part_lexeme = getEntity(part_lexeme_id)
local current_substring = getLinkedLemmata(part_lexeme)
local part_etymology = getEtymology(part_lexeme, frame, 'partial')
if part_etymology ~= '' and part_etymology ~= nil then
current_substring = current_substring .. ' (← ' .. part_etymology .. ')'
end
if combines == '' then
combines = current_substring
else -- @TODO: This shoukd use the 'affix' and 'compound' templates instead.
combines = combines .. ' + ' .. current_substring
end
end
end
end
return combines
end
function getRoots( current_lexeme )
local stmts = current_lexeme:getAllStatements('P5920')
if #stmts == 0 then return '' end
local root_lexeme = getEntity(stmts[1].mainsnak.datavalue.value.id)
return getLexemeLanguageCode(root_lexeme), '√' .. getLinkedLemmata(root_lexeme), root_lexeme:getLemma('ar')
end
function getEtymology( current_lexeme, frame, mode )
-- @TODO: Fix the etymology chains that are not possible to render
local etymology = ''
local current_combines = getCombines(current_lexeme, frame)
local root_lang, current_roots, root_str = getRoots(current_lexeme)
if mode ~= 'partial' and root_str ~= nil then
frame:expandTemplate{title=i18n['template_root'], args={lang_code, root_lang, root_str}}
end
local stmts = current_lexeme:getAllStatements('P5191')
local new_etymology_string
if #stmts == 0 then
if current_roots ~= '' and current_combines ~= '' and current_roots ~= nil then
return current_roots .. '<br/>(' .. current_combines .. ')'
elseif current_roots ~= '' then
if lang_code == 'ar' and mode ~= 'partial' then
return frame:expandTemplate{title=i18n['template_ar-rootbox'], args={root_str}}
else
return current_roots
end
else
return current_combines
end
end
local origin_lexeme_string
for i, stmt in pairs(stmts) do
local origin_lexeme_dv = stmt.mainsnak.datavalue -- If this is nil, the origin lexeme is not known.
if origin_lexeme_dv ~= nil then
local origin_lexeme = getEntity(origin_lexeme_dv.value.id)
local origin_lexeme_lang = getLabel(origin_lexeme:getLanguage())
local sitelink = i18n.wplink(origin_lexeme:getLanguage(), origin_lexeme_lang, wb)
if sitelink ~= '' then
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. sitelink .. ')'
else
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. origin_lexeme_lang .. ')'
end
if stmt.qualifiers ~= nil and stmt.qualifiers['P5886'] ~= nil then
local mode_of_derivation = stmt.qualifiers['P5886'][1].datavalue.value.id
if mode_of_derivation == 'Q1345001' then
-- @TODO: Add support for showing gender
origin_lexeme_string = frame:expandTemplate{title=i18n['template_borrowed'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_borrowing']
elseif mode_of_derivation == 'Q845079' then
origin_lexeme_string = ustring.gsub(i18n['etymology_learned_borrowing'], '$1', origin_lexeme_string)
elseif mode_of_derivation == 'Q56611986' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_inherited'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_inheritance']
elseif mode_of_derivation == 'Q189743' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_ellipsis'], args={lang_code, getLemmata(origin_lexeme)}} .. ' ' .. i18n['etymology_ellipsis']
end
end
local origin_origin = getEtymology(origin_lexeme, frame)
if origin_origin ~= '' and origin_origin ~= nil then
new_etymology_string = origin_lexeme_string .. ' ← ' .. origin_origin
else
new_etymology_string = origin_lexeme_string
end
end
if etymology == '' then
etymology = new_etymology_string
elseif origin_lexeme_string ~= nil and etymology ~= nil then
etymology = etymology .. ' ' .. origin_lexeme_string
elseif origin_lexeme_string ~= nil and etymology == nil then
etymology = origin_lexeme_string
end
end
if current_roots ~= '' and etymology ~= nil and current_roots ~= nil then
etymology = etymology .. ' ' .. current_roots
elseif current_roots ~= '' and etymology == nil then
etymology = current_roots
end
if current_combines ~= '' and etymology ~= nil then
etymology = etymology .. '<br/>(' .. current_combines .. ')'
end
return etymology
end
local function pronunciationBlock(block, value)
return '* ' .. i18n['text_' .. block] .. ' ' .. value
end
local function getPronunciation( frame, current_lexeme, lang_name, lex_cat )
local pronunciations = {}
local base_form = getPronunciationBaseForm(lang_name, lex_cat )
if base_form ~= nil then
for i, stmt in pairs(base_form:getAllStatements('P443')) do -- উচ্চারণের অডিও
local pronunciation_file = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in pairs(stmt.qualifiers[property_id]) do
local stmt_value = qual.datavalue.value.id
table.insert(specifiers, getLabel(stmt_value))
end
end
end
if #specifiers > 0 then
specifier_text = table.concat(specifiers, "'', ''")
end
local audio_text
if specifier_text ~= '' then
audio_text = i18n['text_audio'] .. ' (' .. specifier_text .. ')'
else
audio_text = i18n['text_audio']
end
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title= i18n['template_audio'],
args = {lang_name, pronunciation_file, audio_text}
})
end
local ipa_transcription = base_form:getAllStatements('P898') -- - আধ্বব প্রতিলিপিকরণ
local iso15919_transcription = getOneStringForProperty(base_form, 'P5825') -- আইএসও ১৫৯১৯ প্রতিলিপিকরণ
local itrans = getOneStringForProperty(base_form, 'P8881') -- ITRANS
local iast = getOneStringForProperty(base_form, 'P7581') -- আইএএসটি প্রতিলিপিকরণ
local xsampa = getOneStringForProperty(base_form, 'P2859')
-- @TODO: অডিও ও প্রতিলিপিকরণ দুটোই থাকলে সেই ক্ষেত্রে একটার ঠিক পরেই আরেকটা দেখানো উচিত
if #ipa_transcription ~= 0 then
for i, stmt in pairs(ipa_transcription) do
local ipa_text = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in ipairs(stmt.qualifiers[property_id]) do
table.insert(specifiers, getLabel( qual.datavalue.value.id ))
end
end
end
if #specifiers > 0 then
specifier_text = "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local syllable_count
if lang_code == 'tr' then
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z10029|' .. ipa_text, frame)
else
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z30837|' .. ipa_text, frame)
end
table.insert(pronunciations, '* ' .. specifier_text .. frame:expandTemplate{
title= i18n['template_ipa'],
args = {lang_name, ipa_text}
} .. '\n* ' .. syllable_count)
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
elseif lang_name == 'বাংলা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='bn-IPA',
})
elseif lang_name == 'আরবি' then
local lemma = current_lexeme:getLemma('ar')
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ar-IPA',
args={lemma}
})
elseif lang_name == 'ফালা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fax-pron',
})
elseif lang_code == 'fi' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fi-IPA',
})
elseif lang_code == 'ko' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ko-IPA',
})
end
if iso15919_transcription ~= nil then
table.insert(pronunciations, pronunciationBlock('iso15919', iso15919_transcription))
end
if itrans ~= nil then
table.insert(pronunciations, pronunciationBlock('itrans', itrans))
end
if iast ~= nil then
table.insert(pronunciations, pronunciationBlock('iast', iast))
end
if xsampa ~= nil then
table.insert(pronunciations, pronunciationBlock('xsampa', xsampa))
end
end -- {{আধ্বব|en|/ˈɪntəvjuː/}}
return table.concat(pronunciations, '\n')
end
local function getAlternativeSpellings( current_lexeme )
local alt_spellings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P11577')) do -- বিকল্প বানান
if stmt.mainsnak.datavalue ~= nil then
table.insert(alt_spellings, '* ' .. getLinkedLemmata(getEntity(stmt.mainsnak.datavalue.value.id)))
end
end
return table.concat(alt_spellings, '\n')
end
local function heading_level(text, level)
local heading_delimiter = string.rep('=', level)
return heading_delimiter .. ' ' .. text .. ' ' .. heading_delimiter
end
function get_any_notes(sections, args, keys)
local notes = {}
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(notes, args[v])
end
end
return notes
end
function add_specific_notes(sections, notes)
for i, v in ipairs(notes) do
table.insert(sections, v)
end
end
local function add_any_notes(sections, args, keys)
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(sections, args[v])
end
end
end
local function getMatchingLemmaForPageTitle(lexeme, title)
local lemmas = lexeme:getLemmas()
local matched_lemma
for _, lemma_entry in ipairs(lemmas) do
local lemma = lemma_entry[1]
if lemma == title then
matched_lemma = lemma
break
end
end
if matched_lemma == nil and lang_code == 'ar' then -- Arabic lemmas do not match the title of the entry because those are written with different characters stripped out on Wiktionary
matched_lemma = lexeme:getLemma('ar')
end
return matched_lemma
end
local function buildLanguageAgnosticInflectionTable()
local has_image = false
local form_images = {}
for i, form in ipairs(forms) do
local form_image = form:getAllStatements('P7407')
if next(form_image) ~= nil then
form_images[i] = form_image[1].mainsnak.datavalue.value
has_image = true
end
end
local table_class = "wikitable mw-collapsible sortable"
if not has_image then
table_class = table_class .. " mw-collapsed"
end
local text = "{| class='" .. table_class .. "' style='border:solid 1px rgb(80%,80%,100%); text-align:center;'\n"
text = text .. "|+ " .. i18n['heading_inflection_table'] .. "\n"
text = text .. "|- \n"
text = text .. "! " .. i18n['heading_form'] .. " !! " .. i18n['heading_grammatical_features']
if has_image then
text = text .. " !! " .. (i18n['heading_image'])
end
text = text .. " \n"
for i, form in ipairs(forms) do
local rep = form:getRepresentations()
local feat = form:getGrammaticalFeatures()
local rep_text = ""
for j, r in pairs(rep) do
if rep_text == "" then
rep_text = r[1]
else
rep_text = rep_text .. " / " .. r[1]
end
end
local feat_text = ""
if feat ~= nil then
for j, f in ipairs(feat) do
local label = getLabel(f) or f
if feat_text == "" then
feat_text = label
else
feat_text = feat_text .. ", " .. label
end
end
end
text = text .. "|-\n"
text = text .. "| " .. (rep_text ~= "" and rep_text or "—")
text = text .. " || " .. (feat_text ~= "" and feat_text or "—")
if has_image then
local image_cell = "—"
if form_images[i] ~= nil then
image_cell = "[[চিত্র:" .. form_images[i] .. "|50px]]"
end
text = text .. " || " .. image_cell
end
text = text .. "\n"
end
text = text .. "|}"
return text
end
function p.all( frame )
local args = getArgs(frame)
local lexeme_id = args[1]
local current_lexeme = getEntity(lexeme_id)
local current_language = current_lexeme:getLanguage()
local senses = current_lexeme:getSenses()
local add_heading = true
forms = current_lexeme:getForms()
if args[2] ~= nil then
local val = mw.text.trim(tostring(args[2]))
if val == "false" or val == "0" or val == "না" then
add_heading = false
end
end
local references_seen = {}
local sections = {}
local title = mw.title.getCurrentTitle().text
local lang_category = getLanguageForCategories(current_language, title)
local lang_name = getLabel(lang_category)
if add_heading == true then
local lang_heading = "== " .. lang_name .. " =="
table.insert(sections, lang_heading)
end
lex_cat = current_lexeme:getLexicalCategory()
lang_code = getLexemeLanguageCode(current_lexeme)
local cat = i18n.lang_category(getLabel(lex_cat), lang_name)
local lex_cat_template
if cat ~= nil then
table.insert(sections, '===' .. getLabel(lex_cat) .. cat .. frame:expandTemplate{
title = i18n['template_anchor'],
args = { lexeme_id }
} .. '===')
table.insert(sections, frame:expandTemplate{
title= i18n['template_lexeme'],
args = {lexeme_id}
})
add_any_notes(sections, args, i18n['manual_category'])
local etymology = getEtymology( current_lexeme, frame )
if etymology ~= '' and etymology ~= nil then
table.insert(sections, heading_level(i18n['heading_etymology'], 4))
table.insert(sections, tostring(etymology))
end
add_any_notes(sections, args, i18n['manual_etymology'])
local pronunciation = getPronunciation( frame, current_lexeme, lang_name, lex_cat )
if pronunciation ~= '' then
table.insert(sections, heading_level(i18n['heading_pronunciation'], 4))
table.insert(sections, tostring(pronunciation))
end
add_any_notes(sections, args, i18n['manual_pronunciation'])
local alternative_spellings = getAlternativeSpellings( current_lexeme )
if alternative_spellings ~= '' then
table.insert(sections, heading_level(i18n['heading_alternative_spellings'], 4))
table.insert(sections, alternative_spellings)
end
if lang_code ~= nil and lang_code ~= 'ksy' and lang_code ~= 'rkt' then -- Skip for Kharia Thar, Rangpuri
if lex_cat == 'Q34698' then -- বিশেষণ
if lang_code == 'en' or lang_code == 'bn' then
if #forms <= 1 then
lex_cat_template = frame:expandTemplate{title= lang_code .. '-বিশেষণ'}
end
else
lex_cat_template = safeExpand(frame, lang_code .. '-adj')
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. '-বিশেষণ')
end
end
elseif lex_cat == 'Q1084' then -- @TODO: Also check for plural forms
local gender
local stmts = current_lexeme:getAllStatements('P5185') -- ব্যাকরণগত লিঙ্গ
if #stmts ~= 0 then
if #stmts == 1 then
local gender_qid = stmts[1].mainsnak.datavalue.value.id
if gender_qid == 'Q499327' then
gender = 'm'
elseif gender_qid == 'Q1775415' then
gender = 'f'
elseif gender_qid == 'Q1775461' then
gender = 'n'
elseif gender_qid == 'Q1305037' then
gender = 'c'
end
end
else
for i, stmt in pairs(stmts) do
local qid = stmts[i].mainsnak.datavalue.value.id
if qid == 'Q499327' then
gender = gender .. 'm'
elseif qid == 'Q1775415' then
gender = gender .. 'f'
end
end
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
if current_language == 'Q13955' then
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
lex_cat_template = safeExpand(frame, {title='ar-noun', args={matched_lemma,gender}})
else
lex_cat_template = frame:expandTemplate{title='ar-noun', args={nil,gender}}
end
elseif current_language == 'Q29919' then
lex_cat_template = frame:expandTemplate{title='arz-noun', args={g=gender}}
elseif current_language == 'Q397' then
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
lex_cat_template = frame:expandTemplate{title='la-noun', args={matched_lemma,g=gender}}
end
elseif current_language == 'Q11059' then
lex_cat_template = frame:expandTemplate{title='sa-noun', args={g=gender}}
elseif current_language ~= 'Q1860' then -- These templates require the gender to be passed as the 1st argument.
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix'], {gender})
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix_fallback'], {gender})
end
end
end
end
-- elseif lex_cat == 'Q147276' then
-- lex_cat_template = safeExpand(frame, lang_code .. '-proper noun', {gender})
-- if not lex_cat_template then
-- lex_cat_template = safeExpand(frame, lang_code .. '-নামবাচক বিশেষ্য', {gender})
-- end
end
if lex_cat_template ~= nil then
table.insert(sections, lex_cat_template)
else
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
table.insert(sections, heading_level(matched_lemma, 4))
else
table.insert(sections, i18n.tocatlink(i18n['category_no_matching_lemma']))
end
end
local meanings, references_seen, sense_extlinks = unpack(getMeanings( frame, args, current_lexeme, senses, references_seen, lang_name))
table.insert(sections, tostring(meanings))
add_any_notes(sections, args, i18n['manual_meaning'])
local instance_of = current_lexeme:getAllStatements('P31') -- সত্ত্বার ধরন
if #instance_of ~= 0 then
local instance_of_entity = instance_of[1].mainsnak.datavalue.value.id
if instance_of_entity == 'Q40437546' or instance_of_entity == 'Q120831827' or instance_of_entity == 'Q120717979' or instance_of_entity == 'Q124476844' then -- @TODO: generalise this so all types of roots are shown
table.insert(sections, i18n['text_instance_of'] .. ' ' .. getLabel(instance_of_entity))
elseif instance_of_entity == 'Q376431' then -- বর্ণের নাম
table.insert(sections, i18n.tocatlink(lang_code .. ':রং'))
end
end
local translations = getTranslations(frame, senses)
if translations ~= nil then
table.insert(sections, translations)
end
-- (!) বিশেষ ভাষার বিভক্তির সারণি যদি থাকে সেগুলো এখানে নতুন if বিবৃতি যোগ করা যায়।
if next(forms) ~= nil then
if current_language == 'Q9610' then -- বাংলা
if lex_cat == 'Q24905' then
local conjTable = require('মডিউল:আভিধানিক উপাত্ত/Q9610').getConjTable(frame, forms)
table.insert(sections, conjTable)
elseif lex_cat == 'Q1084' then
--table.insert(sections, callWikifunctionsFunction('Z33243|' .. lexeme_id .. '|', frame))
table.insert(sections, buildLanguageAgnosticInflectionTable())
elseif lex_cat == 'Q34698' then
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
--elseif current_language == 'Q13955' then -- আরবি
-- if lex_cat == 'Q1084' then
-- table.insert(sections, frame:expandTemplate{title='ar-decl-noun', args={lemma}})
-- end
elseif current_language == 'Q188' then -- জার্মান
if lex_cat == 'Q1084' then
table.insert(sections, callWikifunctionsFunction('Z28602|' .. lexeme_id .. '|', frame))
end
else
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
end
local reference_notes = get_any_notes(sections, args, i18n['manual_reference'])
if #references_seen > 0 or #reference_notes > 0 then
table.insert(sections, heading_level(i18n['heading_references'], 4))
table.insert(sections, frame:extensionTag('references'))
add_specific_notes(sections, reference_notes)
end
local external_link_table = getExternalLinks ( current_lexeme )
if #external_link_table > 0 then
local external_links = '* ' .. table.concat(external_link_table, '\n* ')
table.insert(sections, heading_level(i18n['heading_external_links'], 4))
table.insert(sections, external_links)
end
add_any_notes(sections, args, i18n['manual_external_link'])
if #references_seen == 0 and #reference_notes == 0 and sense_extlinks ~= nil and #sense_extlinks == 0 and #external_link_table == 0 and #get_any_notes(sections, args, i18n['manual_external_link']) == 0 then
table.insert(sections, i18n.rfref_category(lang_name))
end
return table.concat(sections,"\n\n")
end
return p
42xhnzkckbbyz3xqy4xvxnc6329332q
509303
509301
2026-05-28T09:28:11Z
Redmin
6857
Escape % in reference URLs
509303
Scribunto
text/plain
local p = {}
local i18n = require('মডিউল:আভিধানিক উপাত্ত/i18n')
local references = require('মডিউল:উইকিউপাত্ত তথ্যসূত্র বিন্যাসকরণ').format
local getArgs = require('Module:Arguments').getArgs
local wb = mw.wikibase
local ustring = mw.ustring
local html = mw.html
local mw_lang = mw.language
local entity_cache = {}
local reference_cache = {}
local forms
local lang_code
local lex_cat
local function wrapStringInWikilinks(str)
local exceptions = i18n.nolinks
local result = str:gsub('(%S+)', function(token)
local word, trailing_char = token:match('^(.-)([;,]*)$')
local wrapped = word:gsub('[^(-/]+', function(part)
if exceptions[part] then
return part
else
return '[[' .. part .. '#' .. i18n['content_lang_name'] .. '|' .. part .. ']]'
end
end)
return wrapped .. trailing_char
end)
return result
end
local function serializeTable(val, name, skipnewlines, depth) -- https://stackoverflow.com/a/6081639
skipnewlines = skipnewlines or false
depth = depth or 0
local tmp = string.rep(" ", depth)
if name then tmp = tmp .. name .. " = " end
if type(val) == "table" then
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
for k, v in pairs(val) do
tmp = tmp .. serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
end
tmp = tmp .. string.rep(" ", depth) .. "}"
elseif type(val) == "number" then
tmp = tmp .. tostring(val)
elseif type(val) == "string" then
tmp = tmp .. string.format("%q", val)
elseif type(val) == "boolean" then
tmp = tmp .. (val and "true" or "false")
else
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
end
return tmp
end
-- Use this to safely expand templates when you are not sure that they exist.
local function safeExpand(frame, title, args)
local _, result = pcall(function()
return frame:expandTemplate{ title = title, args = args }
end)
if result:find('does not exist') then -- expandTemplate{} doesn't seem to throw any error that can be handled with pcall() so string search is the only viable option.
return nil
end
return result
end
-- Use this function to get the label of an item even if that item does not have any label in the wiki's content language or English.
local function getLabel(id)
if id == 'Q11051hi' then
return 'হিন্দি'
elseif id == 'Q11051ur' then
return 'উর্দু'
elseif id == 'Q56356571fa' then
return 'নয়া ফার্সি'
elseif id == 'Q56356571tg' then
return 'তাজিক'
elseif id == 'Q58635pa' or id == 'Q58635pnb' then
return 'পাঞ্জাবি'
end
local label = wb.getLabel(id)
if label then
return label
end
local labels = wb.getEntity(id).labels
if not labels then
return id
end
for _, v in pairs(labels) do
if v and v.value then
return v.value
end
end
end
local function getReference( id, reference )
local out_id = nil
local url_value
if reference_cache[id] == nil then
local ref_text = references(reference, wb, mw_lang, i18n['content_lang_code'], i18n['wikipedia'])
if reference.snaks ~= nil then
if reference.snaks['P248'] ~= nil then
for _, snak in pairs(reference.snaks['P248']) do
if snak.datavalue and snak.datavalue.value.id == 'Q428' then -- কুরআন
ref_text = ustring.gsub(ref_text, 'নামক অনুচ্ছেদ', 'নং আয়াত')
break
end
end
end
if reference.snaks['P854'] ~= nil then
local snak = reference.snaks['P854'][1]
if snak.datavalue then
url_value = snak.datavalue.value
end
end
end
if url_value ~= nil then
ref_text = ref_text .. ', [' .. url_value .. ' সংযোগ]'
end
reference_cache[id] = ref_text
else
out_id = id
end
return {out_id, reference_cache[id]}
end
local function getEntity( id )
if entity_cache[id] == nil then
entity_cache[id] = wb.getEntity(id)
end
return entity_cache[id] ~= false and entity_cache[id] or nil
end
local function getLexemeLanguageCode(current_lexeme)
local lang_item_id = current_lexeme:getLanguage()
if lang_item_id == nil then
return nil
end
local lang_entity = getEntity(lang_item_id)
if lang_entity == nil then
return nil
end
for i, statement_property in ipairs({'P305','P424', 'P220'}) do -- আইইটিএফ ভাষা ট্যাগ, উইকিমিডিয়া ভাষা কোড, আইএসও ৬৩৯-৩
local statements = lang_entity:getBestStatements(statement_property)
if statements[1] ~= nil then
return statements[1].mainsnak.datavalue.value
end
end
return nil
end
-- Return the first form of the lexeme which has exactly the given grammatical feature.
local function formWithSingleGrammaticalFeature( item_id )
for i = 1, #forms do
local grammaticalFeatures = forms[i]:getGrammaticalFeatures()
if #grammaticalFeatures == 1 and grammaticalFeatures[1] == item_id then
return forms[i]
end
end
return nil
end
local function getArticleLinkTemplate(frame, stmt_value)
local template = ''
local sitelink = getEntity(stmt_value):getSitelink(i18n['wikipedia'])
if sitelink ~= nil then
template = frame:expandTemplate{
title=i18n['template_wikipedia'],
args={sitelink}
}
end
return template
end
local function getArticleLinks (frame, sense )
local article_links = ''
for i, stmt in pairs(sense:getAllStatements('P5137')) do -- এই অর্থের জন্য আইটেম
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
for i, stmt in pairs(sense:getAllStatements('P9970')) do -- এই অর্থের জন্য বিধেয়
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
return article_links
end
-- @TODO: Generalise
local function expandTemplateForProperty(frame, object, property, template)
local lemmas = {}
local n = 0
for _, stmt in pairs(object:getAllStatements(property)) do
local lex = wb.lexeme.splitLexemeId(stmt.mainsnak.datavalue.value.id)
lex = getEntity(lex)
n = n + 1
lemmas[n] = lex:getLemma(lang_code)
end
if not lang_code or n == 0 then
return ''
end
-- Build args: first lang_code, then lemmas
local args = {lang_code}
for i = 1, n do
args[#args + 1] = lemmas[i]
end
return frame:expandTemplate{
title = template,
args = args
}
end
local function getExternalLinks( entity ) -- T418639
local external_links = {}
if entity.claims == nil then return external_links end
local formatter_urls = require('মডিউল:আভিধানিক উপাত্ত/urls').formatter_urls
for property_id, statements in pairs(entity.claims) do
local formatter_url = formatter_urls[property_id]
if formatter_url ~= nil then
local property_source = wb.getBestStatements(property_id, 'P9073')
local source_name
if next(property_source) ~= nil then
source_name = getLabel(property_source[1].mainsnak.datavalue.value.id)
or property_source[1].mainsnak.datavalue.value.id
else
source_name = getLabel(property_id) or property_id
end
for i = 1, #statements do
local stmt = statements[i]
if stmt.mainsnak.datavalue then
local formatted_link = ustring.gsub(
ustring.gsub(formatter_url, '$1', ustring.gsub(stmt.mainsnak.datavalue.value, '%%', '%%%%')),
' ', '+'
)
table.insert(external_links,
'[' .. formatted_link .. ' ' .. source_name .. ']')
end
end
end
end
return external_links
end
p.getExternalLinks = getExternalLinks -- রেখে দিন যাতে ডিবাগিং সম্ভব হয়
local function termSpan( term )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( text )
return tostring( span )
end
local function termLink( term, lang_qid )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( '[[' .. text .. '#' .. getLabel(lang_qid) .. '|' .. text .. ']]' )
return tostring( span )
end
local function getLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termSpan(rep)
else
lemma_string = lemma_string .. '/' .. termSpan(rep)
end
end
return lemma_string
end
local function getLinkedLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termLink(rep, current_lexeme:getLanguage())
else
lemma_string = lemma_string .. '/' .. termLink(rep, current_lexeme:getLanguage())
end
end
return lemma_string
end
local function getExamples( current_lexeme, sense_id, references_seen )
local examples = html.create('dl')
for i, stmt in pairs(current_lexeme:getAllStatements('P5831')) do -- ব্যবহারের উদাহরণ
if stmt.qualifiers ~= nil and stmt.qualifiers['P6072'] ~= nil and stmt.qualifiers['P6072'][1].datavalue.value.id == sense_id then -- বিষয়ে লেক্সিমের অর্থ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_strs = {}
if stmt.qualifiers['P1810'] ~= nil then
table.insert(example_form_strs, stmt.qualifiers['P1810'][1].datavalue.value)
elseif stmt.qualifiers['P5830'] ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
for i, rep in pairs(example_form:getRepresentations()) do
table.insert(example_form_strs, rep[1])
end
end
example_str = nil
for i, example_form_str in pairs(example_form_strs) do
new_example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
if new_example_text ~= example_text then
example_str = termSpan({new_example_text, example_lang})
break
end
new_example_text = example_text
end
if example_str == nil then
example_str = termSpan({example_text, example_lang})
end
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
end
for i, stmt in pairs(wb.getAllStatements(sense_id, 'P5831')) do -- ব্যবহারের উদাহরণ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_str = nil
if stmt.qualifers ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
if stmt.qualifiers['P1810'] ~= nil then
example_form_str = stmt.qualifiers['P1810'][1].datavalue.value
end
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentation(i18n['content_lang_code'])
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentations()[1][1]
end
if example_form_str ~= nil then
example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
end
example_str = termSpan({example_text, example_lang})
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
return { tostring(examples) , references_seen }
end
-- This calls frame:preprocess() instead of :callParserFunction() because the latter does not work for Wikifunctions function calls yet (see https://www.wikifunctions.org/wiki/Wikifunctions:Embedded_function_calls).
local function callWikifunctionsFunction(args, frame)
return frame:preprocess('{{#function:' .. args .. '}}')
end
local function checkTitleCodePointInRange(title, start_point, end_point)
return ustring.find( title, '[' ..ustring.char(start_point) .. '-' .. ustring.char(end_point) .. ']' )
end
local function getLanguageForCategories( lang_id, current_page_title )
-- বিশেষ ভাষার জন্য
if lang_id == 'Q11051' then -- হিন্দি/উর্দু
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- উর্দু
lang_id = 'Q11051ur'
elseif checkTitleCodePointInRange(current_page_title, 0x0900, 0x097f) ~= nil then -- হিন্দি
lang_id = 'Q11051hi'
end
elseif lang_id == 'Q58635' then -- পাঞ্জাবি
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- শাহমুখী
lang_id = 'Q58635pnb'
elseif checkTitleCodePointInRange(current_page_title, 0x0a00, 0x0a7f) ~= nil then -- গুরুমুখী
lang_id = 'Q58635pa'
end
elseif lang_id == 'Q56356571' then -- নয়া ফার্সি ভাষা
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- ফার্সি (ইরান/আফগানিস্তান)
lang_id = 'Q56356571fa'
elseif checkTitleCodePointInRange(current_page_title, 0x0400, 0x04ff) ~= nil then -- তাজিক
lang_id = 'Q56356571tg'
end
end
return lang_id
end
local function getOneStringForProperty(object, property)
local val
local stmts = object:getAllStatements(property)
if #stmts ~= 0 then
val = stmts[1].mainsnak.datavalue.value
end
return val
end
local function getTranslations(frame, senses) -- TODO: woefully incomplete until T185313 and T199887 are resolved
if #senses == 0 then
return nil
end
local all_translations = {}
for _, sense in pairs(senses) do
local translation_set = {}
local gloss = sense:getGloss('bn')
for _, stmt in pairs(sense:getAllStatements('P5972')) do
local translation = stmt.mainsnak.datavalue.value.id
local lexeme_id = wb.lexeme.splitLexemeId(translation)
local language = getLabel(getEntity(lexeme_id):getLanguage())
table.insert(translation_set, language .. ': ' .. getLinkedLemmata(getEntity(lexeme_id)) .. '<br/>')
end
if #translation_set > 0 then
local block = frame:expandTemplate{ title = i18n['template_trans-top'], args = { gloss } }
block = block .. table.concat(translation_set, '\n') .. frame:expandTemplate{ title = i18n['template_trans-bottom'] }
table.insert(all_translations, block)
end
end
if #all_translations == 0 then
return nil
end
return '====' .. i18n['heading_translation'] .. '==== \n' .. table.concat(all_translations, '\n')
end
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. "File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n['edit_wikidata']
.. "|link=https://www.wikidata.org/entity/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n['edit_wikidata'] .. "]]</span>"
return icon
end
local function getMeanings( frame, args, current_lexeme, senses, references_seen, language_name)
if #senses == 0 then
return {createicon(i18n['content_lang_code'], current_lexeme:getId()) .. "''" .. i18n['text_category_rfdef'] .. "''" .. i18n.tocatlink(i18n['category_rfdef']), references_seen}
end
local meanings = html.create( 'ol' )
local idlinkset = {}
for i, sense in pairs(senses) do
local gloss_text_parts = {}
local main_gloss_text = frame:expandTemplate{
title=i18n['template_anchor'],
args={sense:getId()}
}
local specifiers = {}
for k, property_id in ipairs({'P6084', 'P6191', 'P9488'}) do -- অবস্থান যেখানে শব্দার্থ ব্যবহৃত, যে রীতিতে শব্দার্থ ব্যবহৃত হয়, যে ক্ষেত্রে ব্যবহৃত
for i, stmt in pairs(sense:getAllStatements(property_id)) do
local stmt_value = stmt.mainsnak.datavalue.value.id
local reference_text = ''
local refs = stmt.references
if refs ~= nil then
for j, reference in pairs(refs) do
table.insert(references_seen, reference.hash)
got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. frame:extensionTag('ref', got_reference[2])
end
local val = getLabel(stmt_value)
table.insert(specifiers, val .. reference_text)
if property_id == 'P9488' then
table.insert(specifiers, i18n.tocatlink(lang_code .. val))
end
end
end
end
if #specifiers > 0 then
main_gloss_text = main_gloss_text .. "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local gloss = sense:getGloss( i18n['content_lang_code'] )
if gloss ~= nil then
main_gloss_text = main_gloss_text .. wrapStringInWikilinks(gloss)
if gloss:match('^প্রদত্ত%s*(%S-)%s*নাম$') then -- given names
main_gloss_text = main_gloss_text .. i18n.tocatlink(language_name .. ' ' .. i18n['category_given_names'])
end
else
local other_gloss_text = nil
local other_gloss_lang = nil
local item_label_gloss_parts = {}
for k, stmt in pairs(sense:getAllStatements('P5137')) do -- যদি 'এই অর্থের জন্য আইটেম' মানের বাংলা লেবেল থাকে
local stmt_value = stmt.mainsnak.datavalue.value.id
local stmt_label = getLabel(stmt_value)
if stmt_label ~= nil then
table.insert(item_label_gloss_parts, '[[:d:' .. stmt_value .. '|' .. stmt_label .. ']]')
end
end
if #item_label_gloss_parts > 0 then
other_gloss_text = table.concat(item_label_gloss_parts, '; ')
end
if other_gloss_text == nil then
for i, fallback_lang in ipairs(mw_lang.getFallbacksFor( i18n['content_lang_code'] )) do
if sense:getGloss( fallback_lang ) ~= nil then
other_gloss_text, other_gloss_lang = sense:getGloss( fallback_lang )
end
end
if other_gloss_lang == nil then
local glosses = sense:getGlosses()
for j, gloss in pairs(glosses) do
other_gloss_text = gloss[1]
other_gloss_lang = gloss[2]
break
end
end
main_gloss_text = main_gloss_text .. other_gloss_text .. "<sup><em>" .. mw_lang.fetchLanguageName(other_gloss_lang, i18n['content_lang_code']) .. "</em></sup>"
else
main_gloss_text = main_gloss_text .. "''" .. other_gloss_text .. "''"
end
main_gloss_text = main_gloss_text .. i18n.tocatlink(i18n['category_rfdef_equivalent'])
end
local synonym = expandTemplateForProperty(frame, sense, 'P5973', i18n['template_synonym'])
if synonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. synonym
end
local antonym = expandTemplateForProperty(frame, sense, 'P5974', i18n['template_antonym'])
if antonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. antonym
end
local hypernym = expandTemplateForProperty(frame, sense, 'P6593', i18n['template_hypernym'])
if hypernym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. hypernym
end
if lex_cat == 'Q1084' or lex_cat == 'Q147276' then -- noun or proper noun
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-noun'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
elseif lex_cat == 'Q34698' then
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-adj'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
end
table.insert(gloss_text_parts, main_gloss_text .. createicon(i18n['content_lang_code'], sense:getId()))
for i, stmt in pairs(sense:getAllStatements('P8394')) do -- টিপ্পনীর উদ্ধৃতি
gloss_quote = termSpan({stmt.mainsnak.datavalue.value.text, stmt.mainsnak.datavalue.value.language})
if stmt.references[1] ~= nil then
local got_reference = getReference ( stmt.references[1].hash, stmt.references[1] )
gloss_quote = '"' .. gloss_quote .. '" ' .. got_reference[2]
end
table.insert(references_seen, stmt.references[1].hash)
table.insert(gloss_text_parts, frame:extensionTag('ref', gloss_quote))
end
for i, stmt in pairs(sense:getAllStatements('P1343')) do -- বর্ণিত উৎস
-- TODO: do away with making fake reference objects
local fake_reference = { ['snaks'] = {} }
fake_reference.snaks['P248'] = { [1] = stmt.mainsnak }
qualifiers_order = stmt['qualifiers-order']
if qualifiers_order ~= nil then
for i, k in ipairs(qualifiers_order) do fake_reference.snaks[k] = stmt.qualifiers[k] end
end
fake_reference.hash = mw.hash.hashValue('sha3-512', serializeTable(fake_reference))
table.insert(references_seen, fake_reference.hash)
local got_reference = getReference(fake_reference.hash, fake_reference)
if got_reference[1] == nil then
table.insert(gloss_text_parts, frame:extensionTag('ref', got_reference[2], {name = fake_reference.hash}))
else
table.insert(gloss_text_parts, frame:extensionTag{name = 'ref', content='', args = {name = got_reference[1]}})
end
end
local first_sense_image = ''
local sense_images = sense:getAllStatements('P18')
if next(sense_images) ~= nil then
first_sense_image = sense_images[1].mainsnak.datavalue.value
end
if first_sense_image ~= '' then
table.insert(gloss_text_parts, '[[চিত্র:' .. first_sense_image .. "|thumb|'''" .. getLemmata(current_lexeme) .. "'''—" .. main_gloss_text .. ']]')
end
local idlinks = getExternalLinks(sense)
if #idlinks > 0 then
local idlinktext = '<small>('
for _, idlink in pairs(idlinks) do
idlinktext = idlinktext .. idlink .. '\n'
end
idlinktext = idlinktext .. ')</small>'
table.insert(gloss_text_parts, idlinktext)
table.insert(idlinkset, idlinks)
end
local externallinks = getArticleLinks(frame, sense)
if externallinks ~= '' then
table.insert(gloss_text_parts, externallinks)
end
local new_notes = {}
local sense_keys = { sense:getId(), string.sub(sense:getId(), string.find(sense:getId(), '-')+1) }
for _, v in ipairs(sense_keys) do
if args[v] ~= nil then
table.insert(new_notes, args[v])
end
end
if #new_notes > 0 then
for _, v in ipairs(new_notes) do
if i == 1 then
table.insert(gloss_text_parts, '<br/>' .. v)
else
table.insert(gloss_text_parts, v)
end
end
end
local examples, references_seen = unpack(getExamples( current_lexeme, sense:getId(), references_seen ))
local gloss_text = table.concat(gloss_text_parts, '\n')
meanings:tag('li'):wikitext(gloss_text):wikitext(examples)
end
return {meanings, references_seen, idlinkset}
end
local function getPronunciationBaseForm( lang_name, lex_cat)
local base_form = nil
-- (!) অন্য ভাষার শব্দের যদি অন্য রকম মূল ফর্ম থাকে সেগুলো এখানে নতুন if বিবৃতি দিয়ে যোগ করা যায়।
if lang_name == 'বাংলা' then
if lex_cat == 'Q1084' then -- বিশেষ্য
base_form = formWithSingleGrammaticalFeature( 'Q131105' ) -- কর্তৃকারক
elseif lex_cat == 'Q24905' then -- ক্রিয়া
base_form = formWithSingleGrammaticalFeature( 'Q1350145' ) -- ক্রিয়া বিশেষ্য
end
end
if base_form == nil then
for i, form in pairs(forms) do
base_form = form
break
end
end
return base_form
end
local function getCombines( current_lexeme, frame )
local combines = ''
local index_mappings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P5238')) do
if stmt.qualifiers ~= nil and stmt.qualifiers['P1545'] ~= nil then -- ক্রম
local current_index = tonumber(stmt.qualifiers['P1545'][1].datavalue.value)
index_mappings[current_index] = stmt
end
end
if #index_mappings ~= 0 then
for i, stmt in ipairs(index_mappings) do
if stmt.mainsnak.datavalue ~= nil then
local part_lexeme_id = stmt.mainsnak.datavalue.value.id
local part_lexeme = getEntity(part_lexeme_id)
local current_substring = getLinkedLemmata(part_lexeme)
local part_etymology = getEtymology(part_lexeme, frame, 'partial')
if part_etymology ~= '' and part_etymology ~= nil then
current_substring = current_substring .. ' (← ' .. part_etymology .. ')'
end
if combines == '' then
combines = current_substring
else -- @TODO: This shoukd use the 'affix' and 'compound' templates instead.
combines = combines .. ' + ' .. current_substring
end
end
end
end
return combines
end
function getRoots( current_lexeme )
local stmts = current_lexeme:getAllStatements('P5920')
if #stmts == 0 then return '' end
local root_lexeme = getEntity(stmts[1].mainsnak.datavalue.value.id)
return getLexemeLanguageCode(root_lexeme), '√' .. getLinkedLemmata(root_lexeme), root_lexeme:getLemma('ar')
end
function getEtymology( current_lexeme, frame, mode )
-- @TODO: Fix the etymology chains that are not possible to render
local etymology = ''
local current_combines = getCombines(current_lexeme, frame)
local root_lang, current_roots, root_str = getRoots(current_lexeme)
if mode ~= 'partial' and root_str ~= nil then
frame:expandTemplate{title=i18n['template_root'], args={lang_code, root_lang, root_str}}
end
local stmts = current_lexeme:getAllStatements('P5191')
local new_etymology_string
if #stmts == 0 then
if current_roots ~= '' and current_combines ~= '' and current_roots ~= nil then
return current_roots .. '<br/>(' .. current_combines .. ')'
elseif current_roots ~= '' then
if lang_code == 'ar' and mode ~= 'partial' then
return frame:expandTemplate{title=i18n['template_ar-rootbox'], args={root_str}}
else
return current_roots
end
else
return current_combines
end
end
local origin_lexeme_string
for i, stmt in pairs(stmts) do
local origin_lexeme_dv = stmt.mainsnak.datavalue -- If this is nil, the origin lexeme is not known.
if origin_lexeme_dv ~= nil then
local origin_lexeme = getEntity(origin_lexeme_dv.value.id)
local origin_lexeme_lang = getLabel(origin_lexeme:getLanguage())
local sitelink = i18n.wplink(origin_lexeme:getLanguage(), origin_lexeme_lang, wb)
if sitelink ~= '' then
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. sitelink .. ')'
else
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. origin_lexeme_lang .. ')'
end
if stmt.qualifiers ~= nil and stmt.qualifiers['P5886'] ~= nil then
local mode_of_derivation = stmt.qualifiers['P5886'][1].datavalue.value.id
if mode_of_derivation == 'Q1345001' then
-- @TODO: Add support for showing gender
origin_lexeme_string = frame:expandTemplate{title=i18n['template_borrowed'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_borrowing']
elseif mode_of_derivation == 'Q845079' then
origin_lexeme_string = ustring.gsub(i18n['etymology_learned_borrowing'], '$1', origin_lexeme_string)
elseif mode_of_derivation == 'Q56611986' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_inherited'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_inheritance']
elseif mode_of_derivation == 'Q189743' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_ellipsis'], args={lang_code, getLemmata(origin_lexeme)}} .. ' ' .. i18n['etymology_ellipsis']
end
end
local origin_origin = getEtymology(origin_lexeme, frame)
if origin_origin ~= '' and origin_origin ~= nil then
new_etymology_string = origin_lexeme_string .. ' ← ' .. origin_origin
else
new_etymology_string = origin_lexeme_string
end
end
if etymology == '' then
etymology = new_etymology_string
elseif origin_lexeme_string ~= nil and etymology ~= nil then
etymology = etymology .. ' ' .. origin_lexeme_string
elseif origin_lexeme_string ~= nil and etymology == nil then
etymology = origin_lexeme_string
end
end
if current_roots ~= '' and etymology ~= nil and current_roots ~= nil then
etymology = etymology .. ' ' .. current_roots
elseif current_roots ~= '' and etymology == nil then
etymology = current_roots
end
if current_combines ~= '' and etymology ~= nil then
etymology = etymology .. '<br/>(' .. current_combines .. ')'
end
return etymology
end
local function pronunciationBlock(block, value)
return '* ' .. i18n['text_' .. block] .. ' ' .. value
end
local function getPronunciation( frame, current_lexeme, lang_name, lex_cat )
local pronunciations = {}
local base_form = getPronunciationBaseForm(lang_name, lex_cat )
if base_form ~= nil then
for i, stmt in pairs(base_form:getAllStatements('P443')) do -- উচ্চারণের অডিও
local pronunciation_file = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in pairs(stmt.qualifiers[property_id]) do
local stmt_value = qual.datavalue.value.id
table.insert(specifiers, getLabel(stmt_value))
end
end
end
if #specifiers > 0 then
specifier_text = table.concat(specifiers, "'', ''")
end
local audio_text
if specifier_text ~= '' then
audio_text = i18n['text_audio'] .. ' (' .. specifier_text .. ')'
else
audio_text = i18n['text_audio']
end
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title= i18n['template_audio'],
args = {lang_name, pronunciation_file, audio_text}
})
end
local ipa_transcription = base_form:getAllStatements('P898') -- - আধ্বব প্রতিলিপিকরণ
local iso15919_transcription = getOneStringForProperty(base_form, 'P5825') -- আইএসও ১৫৯১৯ প্রতিলিপিকরণ
local itrans = getOneStringForProperty(base_form, 'P8881') -- ITRANS
local iast = getOneStringForProperty(base_form, 'P7581') -- আইএএসটি প্রতিলিপিকরণ
local xsampa = getOneStringForProperty(base_form, 'P2859')
-- @TODO: অডিও ও প্রতিলিপিকরণ দুটোই থাকলে সেই ক্ষেত্রে একটার ঠিক পরেই আরেকটা দেখানো উচিত
if #ipa_transcription ~= 0 then
for i, stmt in pairs(ipa_transcription) do
local ipa_text = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in ipairs(stmt.qualifiers[property_id]) do
table.insert(specifiers, getLabel( qual.datavalue.value.id ))
end
end
end
if #specifiers > 0 then
specifier_text = "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local syllable_count
if lang_code == 'tr' then
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z10029|' .. ipa_text, frame)
else
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z30837|' .. ipa_text, frame)
end
table.insert(pronunciations, '* ' .. specifier_text .. frame:expandTemplate{
title= i18n['template_ipa'],
args = {lang_name, ipa_text}
} .. '\n* ' .. syllable_count)
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
elseif lang_name == 'বাংলা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='bn-IPA',
})
elseif lang_name == 'আরবি' then
local lemma = current_lexeme:getLemma('ar')
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ar-IPA',
args={lemma}
})
elseif lang_name == 'ফালা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fax-pron',
})
elseif lang_code == 'fi' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fi-IPA',
})
elseif lang_code == 'ko' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ko-IPA',
})
end
if iso15919_transcription ~= nil then
table.insert(pronunciations, pronunciationBlock('iso15919', iso15919_transcription))
end
if itrans ~= nil then
table.insert(pronunciations, pronunciationBlock('itrans', itrans))
end
if iast ~= nil then
table.insert(pronunciations, pronunciationBlock('iast', iast))
end
if xsampa ~= nil then
table.insert(pronunciations, pronunciationBlock('xsampa', xsampa))
end
end -- {{আধ্বব|en|/ˈɪntəvjuː/}}
return table.concat(pronunciations, '\n')
end
local function getAlternativeSpellings( current_lexeme )
local alt_spellings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P11577')) do -- বিকল্প বানান
if stmt.mainsnak.datavalue ~= nil then
table.insert(alt_spellings, '* ' .. getLinkedLemmata(getEntity(stmt.mainsnak.datavalue.value.id)))
end
end
return table.concat(alt_spellings, '\n')
end
local function heading_level(text, level)
local heading_delimiter = string.rep('=', level)
return heading_delimiter .. ' ' .. text .. ' ' .. heading_delimiter
end
function get_any_notes(sections, args, keys)
local notes = {}
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(notes, args[v])
end
end
return notes
end
function add_specific_notes(sections, notes)
for i, v in ipairs(notes) do
table.insert(sections, v)
end
end
local function add_any_notes(sections, args, keys)
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(sections, args[v])
end
end
end
local function getMatchingLemmaForPageTitle(lexeme, title)
local lemmas = lexeme:getLemmas()
local matched_lemma
for _, lemma_entry in ipairs(lemmas) do
local lemma = lemma_entry[1]
if lemma == title then
matched_lemma = lemma
break
end
end
if matched_lemma == nil and lang_code == 'ar' then -- Arabic lemmas do not match the title of the entry because those are written with different characters stripped out on Wiktionary
matched_lemma = lexeme:getLemma('ar')
end
return matched_lemma
end
local function buildLanguageAgnosticInflectionTable()
local has_image = false
local form_images = {}
for i, form in ipairs(forms) do
local form_image = form:getAllStatements('P7407')
if next(form_image) ~= nil then
form_images[i] = form_image[1].mainsnak.datavalue.value
has_image = true
end
end
local table_class = "wikitable mw-collapsible sortable"
if not has_image then
table_class = table_class .. " mw-collapsed"
end
local text = "{| class='" .. table_class .. "' style='border:solid 1px rgb(80%,80%,100%); text-align:center;'\n"
text = text .. "|+ " .. i18n['heading_inflection_table'] .. "\n"
text = text .. "|- \n"
text = text .. "! " .. i18n['heading_form'] .. " !! " .. i18n['heading_grammatical_features']
if has_image then
text = text .. " !! " .. (i18n['heading_image'])
end
text = text .. " \n"
for i, form in ipairs(forms) do
local rep = form:getRepresentations()
local feat = form:getGrammaticalFeatures()
local rep_text = ""
for j, r in pairs(rep) do
if rep_text == "" then
rep_text = r[1]
else
rep_text = rep_text .. " / " .. r[1]
end
end
local feat_text = ""
if feat ~= nil then
for j, f in ipairs(feat) do
local label = getLabel(f) or f
if feat_text == "" then
feat_text = label
else
feat_text = feat_text .. ", " .. label
end
end
end
text = text .. "|-\n"
text = text .. "| " .. (rep_text ~= "" and rep_text or "—")
text = text .. " || " .. (feat_text ~= "" and feat_text or "—")
if has_image then
local image_cell = "—"
if form_images[i] ~= nil then
image_cell = "[[চিত্র:" .. form_images[i] .. "|50px]]"
end
text = text .. " || " .. image_cell
end
text = text .. "\n"
end
text = text .. "|}"
return text
end
function p.all( frame )
local args = getArgs(frame)
local lexeme_id = args[1]
local current_lexeme = getEntity(lexeme_id)
local current_language = current_lexeme:getLanguage()
local senses = current_lexeme:getSenses()
local add_heading = true
forms = current_lexeme:getForms()
if args[2] ~= nil then
local val = mw.text.trim(tostring(args[2]))
if val == "false" or val == "0" or val == "না" then
add_heading = false
end
end
local references_seen = {}
local sections = {}
local title = mw.title.getCurrentTitle().text
local lang_category = getLanguageForCategories(current_language, title)
local lang_name = getLabel(lang_category)
if add_heading == true then
local lang_heading = "== " .. lang_name .. " =="
table.insert(sections, lang_heading)
end
lex_cat = current_lexeme:getLexicalCategory()
lang_code = getLexemeLanguageCode(current_lexeme)
local cat = i18n.lang_category(getLabel(lex_cat), lang_name)
local lex_cat_template
if cat ~= nil then
table.insert(sections, '===' .. getLabel(lex_cat) .. cat .. frame:expandTemplate{
title = i18n['template_anchor'],
args = { lexeme_id }
} .. '===')
table.insert(sections, frame:expandTemplate{
title= i18n['template_lexeme'],
args = {lexeme_id}
})
add_any_notes(sections, args, i18n['manual_category'])
local etymology = getEtymology( current_lexeme, frame )
if etymology ~= '' and etymology ~= nil then
table.insert(sections, heading_level(i18n['heading_etymology'], 4))
table.insert(sections, tostring(etymology))
end
add_any_notes(sections, args, i18n['manual_etymology'])
local pronunciation = getPronunciation( frame, current_lexeme, lang_name, lex_cat )
if pronunciation ~= '' then
table.insert(sections, heading_level(i18n['heading_pronunciation'], 4))
table.insert(sections, tostring(pronunciation))
end
add_any_notes(sections, args, i18n['manual_pronunciation'])
local alternative_spellings = getAlternativeSpellings( current_lexeme )
if alternative_spellings ~= '' then
table.insert(sections, heading_level(i18n['heading_alternative_spellings'], 4))
table.insert(sections, alternative_spellings)
end
if lang_code ~= nil and lang_code ~= 'ksy' and lang_code ~= 'rkt' then -- Skip for Kharia Thar, Rangpuri
if lex_cat == 'Q34698' then -- বিশেষণ
if lang_code == 'en' or lang_code == 'bn' then
if #forms <= 1 then
lex_cat_template = frame:expandTemplate{title= lang_code .. '-বিশেষণ'}
end
else
lex_cat_template = safeExpand(frame, lang_code .. '-adj')
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. '-বিশেষণ')
end
end
elseif lex_cat == 'Q1084' then -- @TODO: Also check for plural forms
local gender
local stmts = current_lexeme:getAllStatements('P5185') -- ব্যাকরণগত লিঙ্গ
if #stmts ~= 0 then
if #stmts == 1 then
local gender_qid = stmts[1].mainsnak.datavalue.value.id
if gender_qid == 'Q499327' then
gender = 'm'
elseif gender_qid == 'Q1775415' then
gender = 'f'
elseif gender_qid == 'Q1775461' then
gender = 'n'
elseif gender_qid == 'Q1305037' then
gender = 'c'
end
end
else
for i, stmt in pairs(stmts) do
local qid = stmts[i].mainsnak.datavalue.value.id
if qid == 'Q499327' then
gender = gender .. 'm'
elseif qid == 'Q1775415' then
gender = gender .. 'f'
end
end
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
if current_language == 'Q13955' then
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
lex_cat_template = safeExpand(frame, {title='ar-noun', args={matched_lemma,gender}})
else
lex_cat_template = frame:expandTemplate{title='ar-noun', args={nil,gender}}
end
elseif current_language == 'Q29919' then
lex_cat_template = frame:expandTemplate{title='arz-noun', args={g=gender}}
elseif current_language == 'Q397' then
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
lex_cat_template = frame:expandTemplate{title='la-noun', args={matched_lemma,g=gender}}
end
elseif current_language == 'Q11059' then
lex_cat_template = frame:expandTemplate{title='sa-noun', args={g=gender}}
elseif current_language ~= 'Q1860' then -- These templates require the gender to be passed as the 1st argument.
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix'], {gender})
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix_fallback'], {gender})
end
end
end
end
-- elseif lex_cat == 'Q147276' then
-- lex_cat_template = safeExpand(frame, lang_code .. '-proper noun', {gender})
-- if not lex_cat_template then
-- lex_cat_template = safeExpand(frame, lang_code .. '-নামবাচক বিশেষ্য', {gender})
-- end
end
if lex_cat_template ~= nil then
table.insert(sections, lex_cat_template)
else
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
table.insert(sections, heading_level(matched_lemma, 4))
else
table.insert(sections, i18n.tocatlink(i18n['category_no_matching_lemma']))
end
end
local meanings, references_seen, sense_extlinks = unpack(getMeanings( frame, args, current_lexeme, senses, references_seen, lang_name))
table.insert(sections, tostring(meanings))
add_any_notes(sections, args, i18n['manual_meaning'])
local instance_of = current_lexeme:getAllStatements('P31') -- সত্ত্বার ধরন
if #instance_of ~= 0 then
local instance_of_entity = instance_of[1].mainsnak.datavalue.value.id
if instance_of_entity == 'Q40437546' or instance_of_entity == 'Q120831827' or instance_of_entity == 'Q120717979' or instance_of_entity == 'Q124476844' then -- @TODO: generalise this so all types of roots are shown
table.insert(sections, i18n['text_instance_of'] .. ' ' .. getLabel(instance_of_entity))
elseif instance_of_entity == 'Q376431' then -- বর্ণের নাম
table.insert(sections, i18n.tocatlink(lang_code .. ':রং'))
end
end
local translations = getTranslations(frame, senses)
if translations ~= nil then
table.insert(sections, translations)
end
-- (!) বিশেষ ভাষার বিভক্তির সারণি যদি থাকে সেগুলো এখানে নতুন if বিবৃতি যোগ করা যায়।
if next(forms) ~= nil then
if current_language == 'Q9610' then -- বাংলা
if lex_cat == 'Q24905' then
local conjTable = require('মডিউল:আভিধানিক উপাত্ত/Q9610').getConjTable(frame, forms)
table.insert(sections, conjTable)
elseif lex_cat == 'Q1084' then
--table.insert(sections, callWikifunctionsFunction('Z33243|' .. lexeme_id .. '|', frame))
table.insert(sections, buildLanguageAgnosticInflectionTable())
elseif lex_cat == 'Q34698' then
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
--elseif current_language == 'Q13955' then -- আরবি
-- if lex_cat == 'Q1084' then
-- table.insert(sections, frame:expandTemplate{title='ar-decl-noun', args={lemma}})
-- end
elseif current_language == 'Q188' then -- জার্মান
if lex_cat == 'Q1084' then
table.insert(sections, callWikifunctionsFunction('Z28602|' .. lexeme_id .. '|', frame))
end
else
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
end
local reference_notes = get_any_notes(sections, args, i18n['manual_reference'])
if #references_seen > 0 or #reference_notes > 0 then
table.insert(sections, heading_level(i18n['heading_references'], 4))
table.insert(sections, frame:extensionTag('references'))
add_specific_notes(sections, reference_notes)
end
local external_link_table = getExternalLinks ( current_lexeme )
if #external_link_table > 0 then
local external_links = '* ' .. table.concat(external_link_table, '\n* ')
table.insert(sections, heading_level(i18n['heading_external_links'], 4))
table.insert(sections, external_links)
end
add_any_notes(sections, args, i18n['manual_external_link'])
if #references_seen == 0 and #reference_notes == 0 and sense_extlinks ~= nil and #sense_extlinks == 0 and #external_link_table == 0 and #get_any_notes(sections, args, i18n['manual_external_link']) == 0 then
table.insert(sections, i18n.rfref_category(lang_name))
end
return table.concat(sections,"\n\n")
end
return p
kw5l8dw6bjyhdzbwzqwex57wbqq09x1
509304
509303
2026-05-28T09:51:04Z
Redmin
6857
509304
Scribunto
text/plain
local p = {}
local i18n = require('মডিউল:আভিধানিক উপাত্ত/i18n')
local references = require('মডিউল:উইকিউপাত্ত তথ্যসূত্র বিন্যাসকরণ').format
local getArgs = require('Module:Arguments').getArgs
local wb = mw.wikibase
local ustring = mw.ustring
local html = mw.html
local mw_lang = mw.language
local entity_cache = {}
local reference_cache = {}
local forms
local lang_code
local lex_cat
local function wrapStringInWikilinks(str)
local exceptions = i18n.nolinks
local result = str:gsub('(%S+)', function(token)
local word, trailing_char = token:match('^(.-)([;,]*)$')
local wrapped = word:gsub('[^(-/]+', function(part)
if exceptions[part] then
return part
else
return '[[' .. part .. '#' .. i18n['content_lang_name'] .. '|' .. part .. ']]'
end
end)
return wrapped .. trailing_char
end)
return result
end
local function serializeTable(val, name, skipnewlines, depth) -- https://stackoverflow.com/a/6081639
skipnewlines = skipnewlines or false
depth = depth or 0
local tmp = string.rep(" ", depth)
if name then tmp = tmp .. name .. " = " end
if type(val) == "table" then
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
for k, v in pairs(val) do
tmp = tmp .. serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
end
tmp = tmp .. string.rep(" ", depth) .. "}"
elseif type(val) == "number" then
tmp = tmp .. tostring(val)
elseif type(val) == "string" then
tmp = tmp .. string.format("%q", val)
elseif type(val) == "boolean" then
tmp = tmp .. (val and "true" or "false")
else
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
end
return tmp
end
-- Use this to safely expand templates when you are not sure that they exist.
local function safeExpand(frame, title, args)
local _, result = pcall(function()
return frame:expandTemplate{ title = title, args = args }
end)
if result:find('does not exist') then -- expandTemplate{} doesn't seem to throw any error that can be handled with pcall() so string search is the only viable option.
return nil
end
return result
end
-- Use this function to get the label of an item even if that item does not have any label in the wiki's content language or English.
local function getLabel(id)
if id == 'Q11051hi' then
return 'হিন্দি'
elseif id == 'Q11051ur' then
return 'উর্দু'
elseif id == 'Q56356571fa' then
return 'নয়া ফার্সি'
elseif id == 'Q56356571tg' then
return 'তাজিক'
elseif id == 'Q58635pa' or id == 'Q58635pnb' then
return 'পাঞ্জাবি'
end
local label = wb.getLabel(id)
if label then
return label
end
local labels = wb.getEntity(id).labels
if not labels then
return id
end
for _, v in pairs(labels) do
if v and v.value then
return v.value
end
end
end
local function getReference( id, reference )
local out_id = nil
local url_value
if reference_cache[id] == nil then
local ref_text = references(reference, wb, mw_lang, i18n['content_lang_code'], i18n['wikipedia'])
if reference.snaks ~= nil then
if reference.snaks['P248'] ~= nil then
for _, snak in pairs(reference.snaks['P248']) do
if snak.datavalue and snak.datavalue.value.id == 'Q428' then -- কুরআন
ref_text = ustring.gsub(ref_text, 'নামক অনুচ্ছেদ', 'নং আয়াত')
break
end
end
end
if reference.snaks['P854'] ~= nil then
local snak = reference.snaks['P854'][1]
if snak.datavalue then
url_value = snak.datavalue.value
end
end
end
if url_value ~= nil then
ref_text = ref_text .. ', [' .. url_value .. ' সংযোগ]'
end
reference_cache[id] = ref_text
else
out_id = id
end
return {out_id, reference_cache[id]}
end
local function getEntity( id )
if entity_cache[id] == nil then
entity_cache[id] = wb.getEntity(id)
end
return entity_cache[id] ~= false and entity_cache[id] or nil
end
local function getLexemeLanguageCode(current_lexeme)
local lang_item_id = current_lexeme:getLanguage()
if lang_item_id == nil then
return nil
end
local lang_entity = getEntity(lang_item_id)
if lang_entity == nil then
return nil
end
for i, statement_property in ipairs({'P305','P424', 'P220'}) do -- আইইটিএফ ভাষা ট্যাগ, উইকিমিডিয়া ভাষা কোড, আইএসও ৬৩৯-৩
local statements = lang_entity:getBestStatements(statement_property)
if statements[1] ~= nil then
return statements[1].mainsnak.datavalue.value
end
end
return nil
end
-- Return the first form of the lexeme which has exactly the given grammatical feature.
local function formWithSingleGrammaticalFeature( item_id )
for i = 1, #forms do
local grammaticalFeatures = forms[i]:getGrammaticalFeatures()
if #grammaticalFeatures == 1 and grammaticalFeatures[1] == item_id then
return forms[i]
end
end
return nil
end
local function getArticleLinkTemplate(frame, stmt_value)
local template = ''
local sitelink = getEntity(stmt_value):getSitelink(i18n['wikipedia'])
if sitelink ~= nil then
template = frame:expandTemplate{
title=i18n['template_wikipedia'],
args={sitelink}
}
end
return template
end
local function getArticleLinks (frame, sense )
local article_links = ''
for i, stmt in pairs(sense:getAllStatements('P5137')) do -- এই অর্থের জন্য আইটেম
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
for i, stmt in pairs(sense:getAllStatements('P9970')) do -- এই অর্থের জন্য বিধেয়
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
return article_links
end
-- @TODO: Generalise
local function expandTemplateForProperty(frame, object, property, template)
local lemmas = {}
local n = 0
for _, stmt in pairs(object:getAllStatements(property)) do
local lex = wb.lexeme.splitLexemeId(stmt.mainsnak.datavalue.value.id)
lex = getEntity(lex)
n = n + 1
lemmas[n] = lex:getLemma(lang_code)
end
if not lang_code or n == 0 then
return ''
end
-- Build args: first lang_code, then lemmas
local args = {lang_code}
for i = 1, n do
args[#args + 1] = lemmas[i]
end
return frame:expandTemplate{
title = template,
args = args
}
end
local function getExternalLinks( entity ) -- T418639
local external_links = {}
if entity.claims == nil then return external_links end
local formatter_urls = require('মডিউল:আভিধানিক উপাত্ত/urls').formatter_urls
for property_id, statements in pairs(entity.claims) do
local formatter_url = formatter_urls[property_id]
if formatter_url ~= nil then
local property_source = wb.getBestStatements(property_id, 'P9073')
local source_name
if next(property_source) ~= nil then
source_name = getLabel(property_source[1].mainsnak.datavalue.value.id)
or property_source[1].mainsnak.datavalue.value.id
else
source_name = getLabel(property_id) or property_id
end
for i = 1, #statements do
local stmt = statements[i]
if stmt.mainsnak.datavalue then
local formatted_link = ustring.gsub(
ustring.gsub(formatter_url, '$1', ustring.gsub(stmt.mainsnak.datavalue.value, '%%', '%%%%')),
' ', '+'
)
table.insert(external_links,
'[' .. formatted_link .. ' ' .. source_name .. ']')
end
end
end
end
return external_links
end
p.getExternalLinks = getExternalLinks -- রেখে দিন যাতে ডিবাগিং সম্ভব হয়
local function termSpan( term )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( text )
return tostring( span )
end
local function termLink( term, lang_qid )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( '[[' .. text .. '#' .. getLabel(lang_qid) .. '|' .. text .. ']]' )
return tostring( span )
end
local function getLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termSpan(rep)
else
lemma_string = lemma_string .. '/' .. termSpan(rep)
end
end
return lemma_string
end
local function getLinkedLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termLink(rep, current_lexeme:getLanguage())
else
lemma_string = lemma_string .. '/' .. termLink(rep, current_lexeme:getLanguage())
end
end
return lemma_string
end
local function getExamples( current_lexeme, sense_id, references_seen )
local examples = html.create('dl')
local example_text, example_lang, example_form, example_str
for i, stmt in pairs(current_lexeme:getAllStatements('P5831')) do -- ব্যবহারের উদাহরণ
if stmt.qualifiers ~= nil and stmt.qualifiers['P6072'] ~= nil and stmt.qualifiers['P6072'][1].datavalue.value.id == sense_id then -- বিষয়ে লেক্সিমের অর্থ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_strs = {}
if stmt.qualifiers['P1810'] ~= nil then
table.insert(example_form_strs, stmt.qualifiers['P1810'][1].datavalue.value)
elseif stmt.qualifiers['P5830'] ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
for _, rep in pairs(example_form:getRepresentations()) do
table.insert(example_form_strs, rep[1])
end
end
for i, example_form_str in pairs(example_form_strs) do
new_example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
if new_example_text ~= example_text then
example_str = termSpan({new_example_text, example_lang})
break
end
new_example_text = example_text
end
if example_str == nil then
example_str = termSpan({example_text, example_lang})
end
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
end
for i, stmt in pairs(wb.getAllStatements(sense_id, 'P5831')) do -- ব্যবহারের উদাহরণ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_str = nil
if stmt.qualifers ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
if stmt.qualifiers['P1810'] ~= nil then
example_form_str = stmt.qualifiers['P1810'][1].datavalue.value
end
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentation(i18n['content_lang_code'])
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentations()[1][1]
end
if example_form_str ~= nil then
example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
end
example_str = termSpan({example_text, example_lang})
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
return { tostring(examples) , references_seen }
end
-- This calls frame:preprocess() instead of :callParserFunction() because the latter does not work for Wikifunctions function calls yet (see https://www.wikifunctions.org/wiki/Wikifunctions:Embedded_function_calls).
local function callWikifunctionsFunction(args, frame)
return frame:preprocess('{{#function:' .. args .. '}}')
end
local function checkTitleCodePointInRange(title, start_point, end_point)
return ustring.find( title, '[' ..ustring.char(start_point) .. '-' .. ustring.char(end_point) .. ']' )
end
local function getLanguageForCategories( lang_id, current_page_title )
-- বিশেষ ভাষার জন্য
if lang_id == 'Q11051' then -- হিন্দি/উর্দু
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- উর্দু
lang_id = 'Q11051ur'
elseif checkTitleCodePointInRange(current_page_title, 0x0900, 0x097f) ~= nil then -- হিন্দি
lang_id = 'Q11051hi'
end
elseif lang_id == 'Q58635' then -- পাঞ্জাবি
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- শাহমুখী
lang_id = 'Q58635pnb'
elseif checkTitleCodePointInRange(current_page_title, 0x0a00, 0x0a7f) ~= nil then -- গুরুমুখী
lang_id = 'Q58635pa'
end
elseif lang_id == 'Q56356571' then -- নয়া ফার্সি ভাষা
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- ফার্সি (ইরান/আফগানিস্তান)
lang_id = 'Q56356571fa'
elseif checkTitleCodePointInRange(current_page_title, 0x0400, 0x04ff) ~= nil then -- তাজিক
lang_id = 'Q56356571tg'
end
end
return lang_id
end
local function getOneStringForProperty(object, property)
local val
local stmts = object:getAllStatements(property)
if #stmts ~= 0 then
val = stmts[1].mainsnak.datavalue.value
end
return val
end
local function getTranslations(frame, senses) -- TODO: woefully incomplete until T185313 and T199887 are resolved
if #senses == 0 then
return nil
end
local all_translations = {}
for _, sense in pairs(senses) do
local translation_set = {}
local gloss = sense:getGloss('bn')
for _, stmt in pairs(sense:getAllStatements('P5972')) do
local translation = stmt.mainsnak.datavalue.value.id
local lexeme_id = wb.lexeme.splitLexemeId(translation)
local language = getLabel(getEntity(lexeme_id):getLanguage())
table.insert(translation_set, language .. ': ' .. getLinkedLemmata(getEntity(lexeme_id)) .. '<br/>')
end
if #translation_set > 0 then
local block = frame:expandTemplate{ title = i18n['template_trans-top'], args = { gloss } }
block = block .. table.concat(translation_set, '\n') .. frame:expandTemplate{ title = i18n['template_trans-bottom'] }
table.insert(all_translations, block)
end
end
if #all_translations == 0 then
return nil
end
return '====' .. i18n['heading_translation'] .. '==== \n' .. table.concat(all_translations, '\n')
end
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. "File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n['edit_wikidata']
.. "|link=https://www.wikidata.org/entity/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n['edit_wikidata'] .. "]]</span>"
return icon
end
local function getMeanings( frame, args, current_lexeme, senses, references_seen, language_name)
if #senses == 0 then
return {createicon(i18n['content_lang_code'], current_lexeme:getId()) .. "''" .. i18n['text_category_rfdef'] .. "''" .. i18n.tocatlink(i18n['category_rfdef']), references_seen}
end
local meanings = html.create( 'ol' )
local idlinkset = {}
for i, sense in pairs(senses) do
local gloss_text_parts = {}
local main_gloss_text = frame:expandTemplate{
title=i18n['template_anchor'],
args={sense:getId()}
}
local specifiers = {}
for k, property_id in ipairs({'P6084', 'P6191', 'P9488'}) do -- অবস্থান যেখানে শব্দার্থ ব্যবহৃত, যে রীতিতে শব্দার্থ ব্যবহৃত হয়, যে ক্ষেত্রে ব্যবহৃত
for i, stmt in pairs(sense:getAllStatements(property_id)) do
local stmt_value = stmt.mainsnak.datavalue.value.id
local reference_text = ''
local refs = stmt.references
if refs ~= nil then
for j, reference in pairs(refs) do
table.insert(references_seen, reference.hash)
got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. frame:extensionTag('ref', got_reference[2])
end
local val = getLabel(stmt_value)
table.insert(specifiers, val .. reference_text)
if property_id == 'P9488' then
table.insert(specifiers, i18n.tocatlink(lang_code .. val))
end
end
end
end
if #specifiers > 0 then
main_gloss_text = main_gloss_text .. "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local gloss = sense:getGloss( i18n['content_lang_code'] )
if gloss ~= nil then
main_gloss_text = main_gloss_text .. wrapStringInWikilinks(gloss)
if gloss:match('^প্রদত্ত%s*(%S-)%s*নাম$') then -- given names
main_gloss_text = main_gloss_text .. i18n.tocatlink(language_name .. ' ' .. i18n['category_given_names'])
end
else
local other_gloss_text = nil
local other_gloss_lang = nil
local item_label_gloss_parts = {}
for k, stmt in pairs(sense:getAllStatements('P5137')) do -- যদি 'এই অর্থের জন্য আইটেম' মানের বাংলা লেবেল থাকে
local stmt_value = stmt.mainsnak.datavalue.value.id
local stmt_label = getLabel(stmt_value)
if stmt_label ~= nil then
table.insert(item_label_gloss_parts, '[[:d:' .. stmt_value .. '|' .. stmt_label .. ']]')
end
end
if #item_label_gloss_parts > 0 then
other_gloss_text = table.concat(item_label_gloss_parts, '; ')
end
if other_gloss_text == nil then
for i, fallback_lang in ipairs(mw_lang.getFallbacksFor( i18n['content_lang_code'] )) do
if sense:getGloss( fallback_lang ) ~= nil then
other_gloss_text, other_gloss_lang = sense:getGloss( fallback_lang )
end
end
if other_gloss_lang == nil then
local glosses = sense:getGlosses()
for j, gloss in pairs(glosses) do
other_gloss_text = gloss[1]
other_gloss_lang = gloss[2]
break
end
end
main_gloss_text = main_gloss_text .. other_gloss_text .. "<sup><em>" .. mw_lang.fetchLanguageName(other_gloss_lang, i18n['content_lang_code']) .. "</em></sup>"
else
main_gloss_text = main_gloss_text .. "''" .. other_gloss_text .. "''"
end
main_gloss_text = main_gloss_text .. i18n.tocatlink(i18n['category_rfdef_equivalent'])
end
local synonym = expandTemplateForProperty(frame, sense, 'P5973', i18n['template_synonym'])
if synonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. synonym
end
local antonym = expandTemplateForProperty(frame, sense, 'P5974', i18n['template_antonym'])
if antonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. antonym
end
local hypernym = expandTemplateForProperty(frame, sense, 'P6593', i18n['template_hypernym'])
if hypernym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. hypernym
end
if lex_cat == 'Q1084' or lex_cat == 'Q147276' then -- noun or proper noun
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-noun'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
elseif lex_cat == 'Q34698' then
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-adj'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
end
table.insert(gloss_text_parts, main_gloss_text .. createicon(i18n['content_lang_code'], sense:getId()))
for i, stmt in pairs(sense:getAllStatements('P8394')) do -- টিপ্পনীর উদ্ধৃতি
gloss_quote = termSpan({stmt.mainsnak.datavalue.value.text, stmt.mainsnak.datavalue.value.language})
if stmt.references[1] ~= nil then
local got_reference = getReference ( stmt.references[1].hash, stmt.references[1] )
gloss_quote = '"' .. gloss_quote .. '" ' .. got_reference[2]
end
table.insert(references_seen, stmt.references[1].hash)
table.insert(gloss_text_parts, frame:extensionTag('ref', gloss_quote))
end
for i, stmt in pairs(sense:getAllStatements('P1343')) do -- বর্ণিত উৎস
-- TODO: do away with making fake reference objects
local fake_reference = { ['snaks'] = {} }
fake_reference.snaks['P248'] = { [1] = stmt.mainsnak }
qualifiers_order = stmt['qualifiers-order']
if qualifiers_order ~= nil then
for i, k in ipairs(qualifiers_order) do fake_reference.snaks[k] = stmt.qualifiers[k] end
end
fake_reference.hash = mw.hash.hashValue('sha3-512', serializeTable(fake_reference))
table.insert(references_seen, fake_reference.hash)
local got_reference = getReference(fake_reference.hash, fake_reference)
if got_reference[1] == nil then
table.insert(gloss_text_parts, frame:extensionTag('ref', got_reference[2], {name = fake_reference.hash}))
else
table.insert(gloss_text_parts, frame:extensionTag{name = 'ref', content='', args = {name = got_reference[1]}})
end
end
local first_sense_image = ''
local sense_images = sense:getAllStatements('P18')
if next(sense_images) ~= nil then
first_sense_image = sense_images[1].mainsnak.datavalue.value
end
if first_sense_image ~= '' then
table.insert(gloss_text_parts, '[[চিত্র:' .. first_sense_image .. "|thumb|'''" .. getLemmata(current_lexeme) .. "'''—" .. main_gloss_text .. ']]')
end
local idlinks = getExternalLinks(sense)
if #idlinks > 0 then
local idlinktext = '<small>('
for _, idlink in pairs(idlinks) do
idlinktext = idlinktext .. idlink .. '\n'
end
idlinktext = idlinktext .. ')</small>'
table.insert(gloss_text_parts, idlinktext)
table.insert(idlinkset, idlinks)
end
local externallinks = getArticleLinks(frame, sense)
if externallinks ~= '' then
table.insert(gloss_text_parts, externallinks)
end
local new_notes = {}
local sense_keys = { sense:getId(), string.sub(sense:getId(), string.find(sense:getId(), '-')+1) }
for _, v in ipairs(sense_keys) do
if args[v] ~= nil then
table.insert(new_notes, args[v])
end
end
if #new_notes > 0 then
for _, v in ipairs(new_notes) do
if i == 1 then
table.insert(gloss_text_parts, '<br/>' .. v)
else
table.insert(gloss_text_parts, v)
end
end
end
local examples, references_seen = unpack(getExamples( current_lexeme, sense:getId(), references_seen ))
local gloss_text = table.concat(gloss_text_parts, '\n')
meanings:tag('li'):wikitext(gloss_text):wikitext(examples)
end
return {meanings, references_seen, idlinkset}
end
local function getPronunciationBaseForm( lang_name, lex_cat)
local base_form = nil
-- (!) অন্য ভাষার শব্দের যদি অন্য রকম মূল ফর্ম থাকে সেগুলো এখানে নতুন if বিবৃতি দিয়ে যোগ করা যায়।
if lang_name == 'বাংলা' then
if lex_cat == 'Q1084' then -- বিশেষ্য
base_form = formWithSingleGrammaticalFeature( 'Q131105' ) -- কর্তৃকারক
elseif lex_cat == 'Q24905' then -- ক্রিয়া
base_form = formWithSingleGrammaticalFeature( 'Q1350145' ) -- ক্রিয়া বিশেষ্য
end
end
if base_form == nil then
for i, form in pairs(forms) do
base_form = form
break
end
end
return base_form
end
local function getCombines( current_lexeme, frame )
local combines = ''
local index_mappings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P5238')) do
if stmt.qualifiers ~= nil and stmt.qualifiers['P1545'] ~= nil then -- ক্রম
local current_index = tonumber(stmt.qualifiers['P1545'][1].datavalue.value)
index_mappings[current_index] = stmt
end
end
if #index_mappings ~= 0 then
for i, stmt in ipairs(index_mappings) do
if stmt.mainsnak.datavalue ~= nil then
local part_lexeme_id = stmt.mainsnak.datavalue.value.id
local part_lexeme = getEntity(part_lexeme_id)
local current_substring = getLinkedLemmata(part_lexeme)
local part_etymology = getEtymology(part_lexeme, frame, 'partial')
if part_etymology ~= '' and part_etymology ~= nil then
current_substring = current_substring .. ' (← ' .. part_etymology .. ')'
end
if combines == '' then
combines = current_substring
else -- @TODO: This shoukd use the 'affix' and 'compound' templates instead.
combines = combines .. ' + ' .. current_substring
end
end
end
end
return combines
end
function getRoots( current_lexeme )
local stmts = current_lexeme:getAllStatements('P5920')
if #stmts == 0 then return '' end
local root_lexeme = getEntity(stmts[1].mainsnak.datavalue.value.id)
return getLexemeLanguageCode(root_lexeme), '√' .. getLinkedLemmata(root_lexeme), root_lexeme:getLemma('ar')
end
function getEtymology( current_lexeme, frame, mode )
-- @TODO: Fix the etymology chains that are not possible to render
local etymology = ''
local current_combines = getCombines(current_lexeme, frame)
local root_lang, current_roots, root_str = getRoots(current_lexeme)
if mode ~= 'partial' and root_str ~= nil then
frame:expandTemplate{title=i18n['template_root'], args={lang_code, root_lang, root_str}}
end
local stmts = current_lexeme:getAllStatements('P5191')
local new_etymology_string
if #stmts == 0 then
if current_roots ~= '' and current_combines ~= '' and current_roots ~= nil then
return current_roots .. '<br/>(' .. current_combines .. ')'
elseif current_roots ~= '' then
if lang_code == 'ar' and mode ~= 'partial' then
return frame:expandTemplate{title=i18n['template_ar-rootbox'], args={root_str}}
else
return current_roots
end
else
return current_combines
end
end
local origin_lexeme_string
for i, stmt in pairs(stmts) do
local origin_lexeme_dv = stmt.mainsnak.datavalue -- If this is nil, the origin lexeme is not known.
if origin_lexeme_dv ~= nil then
local origin_lexeme = getEntity(origin_lexeme_dv.value.id)
local origin_lexeme_lang = getLabel(origin_lexeme:getLanguage())
local sitelink = i18n.wplink(origin_lexeme:getLanguage(), origin_lexeme_lang, wb)
if sitelink ~= '' then
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. sitelink .. ')'
else
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. origin_lexeme_lang .. ')'
end
if stmt.qualifiers ~= nil and stmt.qualifiers['P5886'] ~= nil then
local mode_of_derivation = stmt.qualifiers['P5886'][1].datavalue.value.id
if mode_of_derivation == 'Q1345001' then
-- @TODO: Add support for showing gender
origin_lexeme_string = frame:expandTemplate{title=i18n['template_borrowed'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_borrowing']
elseif mode_of_derivation == 'Q845079' then
origin_lexeme_string = ustring.gsub(i18n['etymology_learned_borrowing'], '$1', origin_lexeme_string)
elseif mode_of_derivation == 'Q56611986' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_inherited'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_inheritance']
elseif mode_of_derivation == 'Q189743' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_ellipsis'], args={lang_code, getLemmata(origin_lexeme)}} .. ' ' .. i18n['etymology_ellipsis']
end
end
local origin_origin = getEtymology(origin_lexeme, frame)
if origin_origin ~= '' and origin_origin ~= nil then
new_etymology_string = origin_lexeme_string .. ' ← ' .. origin_origin
else
new_etymology_string = origin_lexeme_string
end
end
if etymology == '' then
etymology = new_etymology_string
elseif origin_lexeme_string ~= nil and etymology ~= nil then
etymology = etymology .. ' ' .. origin_lexeme_string
elseif origin_lexeme_string ~= nil and etymology == nil then
etymology = origin_lexeme_string
end
end
if current_roots ~= '' and etymology ~= nil and current_roots ~= nil then
etymology = etymology .. ' ' .. current_roots
elseif current_roots ~= '' and etymology == nil then
etymology = current_roots
end
if current_combines ~= '' and etymology ~= nil then
etymology = etymology .. '<br/>(' .. current_combines .. ')'
end
return etymology
end
local function pronunciationBlock(block, value)
return '* ' .. i18n['text_' .. block] .. ' ' .. value
end
local function getPronunciation( frame, current_lexeme, lang_name, lex_cat )
local pronunciations = {}
local base_form = getPronunciationBaseForm(lang_name, lex_cat )
if base_form ~= nil then
for i, stmt in pairs(base_form:getAllStatements('P443')) do -- উচ্চারণের অডিও
local pronunciation_file = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in pairs(stmt.qualifiers[property_id]) do
local stmt_value = qual.datavalue.value.id
table.insert(specifiers, getLabel(stmt_value))
end
end
end
if #specifiers > 0 then
specifier_text = table.concat(specifiers, "'', ''")
end
local audio_text
if specifier_text ~= '' then
audio_text = i18n['text_audio'] .. ' (' .. specifier_text .. ')'
else
audio_text = i18n['text_audio']
end
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title= i18n['template_audio'],
args = {lang_name, pronunciation_file, audio_text}
})
end
local ipa_transcription = base_form:getAllStatements('P898') -- - আধ্বব প্রতিলিপিকরণ
local iso15919_transcription = getOneStringForProperty(base_form, 'P5825') -- আইএসও ১৫৯১৯ প্রতিলিপিকরণ
local itrans = getOneStringForProperty(base_form, 'P8881') -- ITRANS
local iast = getOneStringForProperty(base_form, 'P7581') -- আইএএসটি প্রতিলিপিকরণ
local xsampa = getOneStringForProperty(base_form, 'P2859')
-- @TODO: অডিও ও প্রতিলিপিকরণ দুটোই থাকলে সেই ক্ষেত্রে একটার ঠিক পরেই আরেকটা দেখানো উচিত
if #ipa_transcription ~= 0 then
for i, stmt in pairs(ipa_transcription) do
local ipa_text = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in ipairs(stmt.qualifiers[property_id]) do
table.insert(specifiers, getLabel( qual.datavalue.value.id ))
end
end
end
if #specifiers > 0 then
specifier_text = "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local syllable_count
if lang_code == 'tr' then
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z10029|' .. ipa_text, frame)
else
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z30837|' .. ipa_text, frame)
end
table.insert(pronunciations, '* ' .. specifier_text .. frame:expandTemplate{
title= i18n['template_ipa'],
args = {lang_name, ipa_text}
} .. '\n* ' .. syllable_count)
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
elseif lang_name == 'বাংলা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='bn-IPA',
})
elseif lang_name == 'আরবি' then
local lemma = current_lexeme:getLemma('ar')
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ar-IPA',
args={lemma}
})
elseif lang_name == 'ফালা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fax-pron',
})
elseif lang_code == 'fi' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fi-IPA',
})
elseif lang_code == 'ko' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ko-IPA',
})
end
if iso15919_transcription ~= nil then
table.insert(pronunciations, pronunciationBlock('iso15919', iso15919_transcription))
end
if itrans ~= nil then
table.insert(pronunciations, pronunciationBlock('itrans', itrans))
end
if iast ~= nil then
table.insert(pronunciations, pronunciationBlock('iast', iast))
end
if xsampa ~= nil then
table.insert(pronunciations, pronunciationBlock('xsampa', xsampa))
end
end -- {{আধ্বব|en|/ˈɪntəvjuː/}}
return table.concat(pronunciations, '\n')
end
local function getAlternativeSpellings( current_lexeme )
local alt_spellings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P11577')) do -- বিকল্প বানান
if stmt.mainsnak.datavalue ~= nil then
table.insert(alt_spellings, '* ' .. getLinkedLemmata(getEntity(stmt.mainsnak.datavalue.value.id)))
end
end
return table.concat(alt_spellings, '\n')
end
local function heading_level(text, level)
local heading_delimiter = string.rep('=', level)
return heading_delimiter .. ' ' .. text .. ' ' .. heading_delimiter
end
function get_any_notes(sections, args, keys)
local notes = {}
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(notes, args[v])
end
end
return notes
end
function add_specific_notes(sections, notes)
for i, v in ipairs(notes) do
table.insert(sections, v)
end
end
local function add_any_notes(sections, args, keys)
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(sections, args[v])
end
end
end
local function getMatchingLemmaForPageTitle(lexeme, title)
local lemmas = lexeme:getLemmas()
local matched_lemma
for _, lemma_entry in ipairs(lemmas) do
local lemma = lemma_entry[1]
if lemma == title then
matched_lemma = lemma
break
end
end
if matched_lemma == nil and lang_code == 'ar' then -- Arabic lemmas do not match the title of the entry because those are written with different characters stripped out on Wiktionary
matched_lemma = lexeme:getLemma('ar')
end
return matched_lemma
end
local function buildLanguageAgnosticInflectionTable()
local has_image = false
local form_images = {}
for i, form in ipairs(forms) do
local form_image = form:getAllStatements('P7407')
if next(form_image) ~= nil then
form_images[i] = form_image[1].mainsnak.datavalue.value
has_image = true
end
end
local table_class = "wikitable mw-collapsible sortable"
if not has_image then
table_class = table_class .. " mw-collapsed"
end
local text = "{| class='" .. table_class .. "' style='border:solid 1px rgb(80%,80%,100%); text-align:center;'\n"
text = text .. "|+ " .. i18n['heading_inflection_table'] .. "\n"
text = text .. "|- \n"
text = text .. "! " .. i18n['heading_form'] .. " !! " .. i18n['heading_grammatical_features']
if has_image then
text = text .. " !! " .. (i18n['heading_image'])
end
text = text .. " \n"
for i, form in ipairs(forms) do
local rep = form:getRepresentations()
local feat = form:getGrammaticalFeatures()
local rep_text = ""
for j, r in pairs(rep) do
if rep_text == "" then
rep_text = r[1]
else
rep_text = rep_text .. " / " .. r[1]
end
end
local feat_text = ""
if feat ~= nil then
for j, f in ipairs(feat) do
local label = getLabel(f) or f
if feat_text == "" then
feat_text = label
else
feat_text = feat_text .. ", " .. label
end
end
end
text = text .. "|-\n"
text = text .. "| " .. (rep_text ~= "" and rep_text or "—")
text = text .. " || " .. (feat_text ~= "" and feat_text or "—")
if has_image then
local image_cell = "—"
if form_images[i] ~= nil then
image_cell = "[[চিত্র:" .. form_images[i] .. "|50px]]"
end
text = text .. " || " .. image_cell
end
text = text .. "\n"
end
text = text .. "|}"
return text
end
function p.all( frame )
local args = getArgs(frame)
local lexeme_id = args[1]
local current_lexeme = getEntity(lexeme_id)
local current_language = current_lexeme:getLanguage()
local senses = current_lexeme:getSenses()
local add_heading = true
forms = current_lexeme:getForms()
if args[2] ~= nil then
local val = mw.text.trim(tostring(args[2]))
if val == "false" or val == "0" or val == "না" then
add_heading = false
end
end
local references_seen = {}
local sections = {}
local title = mw.title.getCurrentTitle().text
local lang_category = getLanguageForCategories(current_language, title)
local lang_name = getLabel(lang_category)
if add_heading == true then
local lang_heading = "== " .. lang_name .. " =="
table.insert(sections, lang_heading)
end
lex_cat = current_lexeme:getLexicalCategory()
lang_code = getLexemeLanguageCode(current_lexeme)
local cat = i18n.lang_category(getLabel(lex_cat), lang_name)
local lex_cat_template
if cat ~= nil then
table.insert(sections, '===' .. getLabel(lex_cat) .. cat .. frame:expandTemplate{
title = i18n['template_anchor'],
args = { lexeme_id }
} .. '===')
table.insert(sections, frame:expandTemplate{
title= i18n['template_lexeme'],
args = {lexeme_id}
})
add_any_notes(sections, args, i18n['manual_category'])
local etymology = getEtymology( current_lexeme, frame )
if etymology ~= '' and etymology ~= nil then
table.insert(sections, heading_level(i18n['heading_etymology'], 4))
table.insert(sections, tostring(etymology))
end
add_any_notes(sections, args, i18n['manual_etymology'])
local pronunciation = getPronunciation( frame, current_lexeme, lang_name, lex_cat )
if pronunciation ~= '' then
table.insert(sections, heading_level(i18n['heading_pronunciation'], 4))
table.insert(sections, tostring(pronunciation))
end
add_any_notes(sections, args, i18n['manual_pronunciation'])
local alternative_spellings = getAlternativeSpellings( current_lexeme )
if alternative_spellings ~= '' then
table.insert(sections, heading_level(i18n['heading_alternative_spellings'], 4))
table.insert(sections, alternative_spellings)
end
if lang_code ~= nil and lang_code ~= 'ksy' and lang_code ~= 'rkt' then -- Skip for Kharia Thar, Rangpuri
if lex_cat == 'Q34698' then -- বিশেষণ
if lang_code == 'en' or lang_code == 'bn' then
if #forms <= 1 then
lex_cat_template = frame:expandTemplate{title= lang_code .. '-বিশেষণ'}
end
else
lex_cat_template = safeExpand(frame, lang_code .. '-adj')
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. '-বিশেষণ')
end
end
elseif lex_cat == 'Q1084' then -- @TODO: Also check for plural forms
local gender
local stmts = current_lexeme:getAllStatements('P5185') -- ব্যাকরণগত লিঙ্গ
if #stmts ~= 0 then
if #stmts == 1 then
local gender_qid = stmts[1].mainsnak.datavalue.value.id
if gender_qid == 'Q499327' then
gender = 'm'
elseif gender_qid == 'Q1775415' then
gender = 'f'
elseif gender_qid == 'Q1775461' then
gender = 'n'
elseif gender_qid == 'Q1305037' then
gender = 'c'
end
end
else
for i, stmt in pairs(stmts) do
local qid = stmts[i].mainsnak.datavalue.value.id
if qid == 'Q499327' then
gender = gender .. 'm'
elseif qid == 'Q1775415' then
gender = gender .. 'f'
end
end
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
if current_language == 'Q13955' then
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
lex_cat_template = safeExpand(frame, {title='ar-noun', args={matched_lemma,gender}})
else
lex_cat_template = frame:expandTemplate{title='ar-noun', args={nil,gender}}
end
elseif current_language == 'Q29919' then
lex_cat_template = frame:expandTemplate{title='arz-noun', args={g=gender}}
elseif current_language == 'Q397' then
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
lex_cat_template = frame:expandTemplate{title='la-noun', args={matched_lemma,g=gender}}
end
elseif current_language == 'Q11059' then
lex_cat_template = frame:expandTemplate{title='sa-noun', args={g=gender}}
elseif current_language ~= 'Q1860' then -- These templates require the gender to be passed as the 1st argument.
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix'], {gender})
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix_fallback'], {gender})
end
end
end
end
-- elseif lex_cat == 'Q147276' then
-- lex_cat_template = safeExpand(frame, lang_code .. '-proper noun', {gender})
-- if not lex_cat_template then
-- lex_cat_template = safeExpand(frame, lang_code .. '-নামবাচক বিশেষ্য', {gender})
-- end
end
if lex_cat_template ~= nil then
table.insert(sections, lex_cat_template)
else
local matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
if matched_lemma ~= nil then
table.insert(sections, heading_level(matched_lemma, 4))
else
table.insert(sections, i18n.tocatlink(i18n['category_no_matching_lemma']))
end
end
local meanings, references_seen, sense_extlinks = unpack(getMeanings( frame, args, current_lexeme, senses, references_seen, lang_name))
table.insert(sections, tostring(meanings))
add_any_notes(sections, args, i18n['manual_meaning'])
local instance_of = current_lexeme:getAllStatements('P31') -- সত্ত্বার ধরন
if #instance_of ~= 0 then
local instance_of_entity = instance_of[1].mainsnak.datavalue.value.id
if instance_of_entity == 'Q40437546' or instance_of_entity == 'Q120831827' or instance_of_entity == 'Q120717979' or instance_of_entity == 'Q124476844' then -- @TODO: generalise this so all types of roots are shown
table.insert(sections, i18n['text_instance_of'] .. ' ' .. getLabel(instance_of_entity))
elseif instance_of_entity == 'Q376431' then -- বর্ণের নাম
table.insert(sections, i18n.tocatlink(lang_code .. ':রং'))
end
end
local translations = getTranslations(frame, senses)
if translations ~= nil then
table.insert(sections, translations)
end
-- (!) বিশেষ ভাষার বিভক্তির সারণি যদি থাকে সেগুলো এখানে নতুন if বিবৃতি যোগ করা যায়।
if next(forms) ~= nil then
if current_language == 'Q9610' then -- বাংলা
if lex_cat == 'Q24905' then
local conjTable = require('মডিউল:আভিধানিক উপাত্ত/Q9610').getConjTable(frame, forms)
table.insert(sections, conjTable)
elseif lex_cat == 'Q1084' then
--table.insert(sections, callWikifunctionsFunction('Z33243|' .. lexeme_id .. '|', frame))
table.insert(sections, buildLanguageAgnosticInflectionTable())
elseif lex_cat == 'Q34698' then
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
--elseif current_language == 'Q13955' then -- আরবি
-- if lex_cat == 'Q1084' then
-- table.insert(sections, frame:expandTemplate{title='ar-decl-noun', args={lemma}})
-- end
elseif current_language == 'Q188' then -- জার্মান
if lex_cat == 'Q1084' then
table.insert(sections, callWikifunctionsFunction('Z28602|' .. lexeme_id .. '|', frame))
end
else
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
end
local reference_notes = get_any_notes(sections, args, i18n['manual_reference'])
if #references_seen > 0 or #reference_notes > 0 then
table.insert(sections, heading_level(i18n['heading_references'], 4))
table.insert(sections, frame:extensionTag('references'))
add_specific_notes(sections, reference_notes)
end
local external_link_table = getExternalLinks ( current_lexeme )
if #external_link_table > 0 then
local external_links = '* ' .. table.concat(external_link_table, '\n* ')
table.insert(sections, heading_level(i18n['heading_external_links'], 4))
table.insert(sections, external_links)
end
add_any_notes(sections, args, i18n['manual_external_link'])
if #references_seen == 0 and #reference_notes == 0 and sense_extlinks ~= nil and #sense_extlinks == 0 and #external_link_table == 0 and #get_any_notes(sections, args, i18n['manual_external_link']) == 0 then
table.insert(sections, i18n.rfref_category(lang_name))
end
return table.concat(sections,"\n\n")
end
return p
com4utunmssf1ht56ylqc7mxb5t2v4s
509305
509304
2026-05-28T10:37:12Z
Redmin
6857
509305
Scribunto
text/plain
local p = {}
local i18n = require('মডিউল:আভিধানিক উপাত্ত/i18n')
local references = require('মডিউল:উইকিউপাত্ত তথ্যসূত্র বিন্যাসকরণ').format
local getArgs = require('Module:Arguments').getArgs
local wb = mw.wikibase
local ustring = mw.ustring
local html = mw.html
local mw_lang = mw.language
local entity_cache = {}
local reference_cache = {}
local forms
local lang_code
local lex_cat
local matched_lemma
local function wrapStringInWikilinks(str)
local exceptions = i18n.nolinks
local result = str:gsub('(%S+)', function(token)
local word, trailing_char = token:match('^(.-)([;,]*)$')
local wrapped = word:gsub('[^(-/]+', function(part)
if exceptions[part] then
return part
else
return '[[' .. part .. '#' .. i18n['content_lang_name'] .. '|' .. part .. ']]'
end
end)
return wrapped .. trailing_char
end)
return result
end
local function serializeTable(val, name, skipnewlines, depth) -- https://stackoverflow.com/a/6081639
skipnewlines = skipnewlines or false
depth = depth or 0
local tmp = string.rep(" ", depth)
if name then tmp = tmp .. name .. " = " end
if type(val) == "table" then
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
for k, v in pairs(val) do
tmp = tmp .. serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
end
tmp = tmp .. string.rep(" ", depth) .. "}"
elseif type(val) == "number" then
tmp = tmp .. tostring(val)
elseif type(val) == "string" then
tmp = tmp .. string.format("%q", val)
elseif type(val) == "boolean" then
tmp = tmp .. (val and "true" or "false")
else
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
end
return tmp
end
-- Use this to safely expand templates when you are not sure that they exist.
local function safeExpand(frame, title, args)
local _, result = pcall(function()
return frame:expandTemplate{ title = title, args = args }
end)
if result:find('does not exist') then -- expandTemplate{} doesn't seem to throw any error that can be handled with pcall() so string search is the only viable option.
return nil
end
return result
end
-- Use this function to get the label of an item even if that item does not have any label in the wiki's content language or English.
local function getLabel(id)
if id == 'Q11051hi' then
return 'হিন্দি'
elseif id == 'Q11051ur' then
return 'উর্দু'
elseif id == 'Q56356571fa' then
return 'নয়া ফার্সি'
elseif id == 'Q56356571tg' then
return 'তাজিক'
elseif id == 'Q58635pa' or id == 'Q58635pnb' then
return 'পাঞ্জাবি'
end
local label = wb.getLabel(id)
if label then
return label
end
local labels = wb.getEntity(id).labels
if not labels then
return id
end
for _, v in pairs(labels) do
if v and v.value then
return v.value
end
end
end
local function getReference( id, reference )
local out_id = nil
local url_value
if reference_cache[id] == nil then
local ref_text = references(reference, wb, mw_lang, i18n['content_lang_code'], i18n['wikipedia'])
if reference.snaks ~= nil then
if reference.snaks['P248'] ~= nil then
for _, snak in pairs(reference.snaks['P248']) do
if snak.datavalue and snak.datavalue.value.id == 'Q428' then -- কুরআন
ref_text = ustring.gsub(ref_text, 'নামক অনুচ্ছেদ', 'নং আয়াত')
break
end
end
end
if reference.snaks['P854'] ~= nil then
local snak = reference.snaks['P854'][1]
if snak.datavalue then
url_value = snak.datavalue.value
end
end
end
if url_value ~= nil then
ref_text = ref_text .. ', [' .. url_value .. ' সংযোগ]'
end
reference_cache[id] = ref_text
else
out_id = id
end
return {out_id, reference_cache[id]}
end
local function getEntity( id )
if entity_cache[id] == nil then
entity_cache[id] = wb.getEntity(id)
end
return entity_cache[id] ~= false and entity_cache[id] or nil
end
local function getLexemeLanguageCode(current_lexeme)
local lang_item_id = current_lexeme:getLanguage()
if lang_item_id == nil then
return nil
end
local lang_entity = getEntity(lang_item_id)
if lang_entity == nil then
return nil
end
for i, statement_property in ipairs({'P305','P424', 'P220'}) do -- আইইটিএফ ভাষা ট্যাগ, উইকিমিডিয়া ভাষা কোড, আইএসও ৬৩৯-৩
local statements = lang_entity:getBestStatements(statement_property)
if statements[1] ~= nil then
return statements[1].mainsnak.datavalue.value
end
end
return nil
end
-- Return the first form of the lexeme which has exactly the given grammatical feature.
local function formWithSingleGrammaticalFeature( item_id )
for i = 1, #forms do
local grammaticalFeatures = forms[i]:getGrammaticalFeatures()
if #grammaticalFeatures == 1 and grammaticalFeatures[1] == item_id then
return forms[i]
end
end
return nil
end
local function getArticleLinkTemplate(frame, stmt_value)
local template = ''
local sitelink = getEntity(stmt_value):getSitelink(i18n['wikipedia'])
if sitelink ~= nil then
template = frame:expandTemplate{
title=i18n['template_wikipedia'],
args={sitelink}
}
end
return template
end
local function getArticleLinks (frame, sense )
local article_links = ''
for i, stmt in pairs(sense:getAllStatements('P5137')) do -- এই অর্থের জন্য আইটেম
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
for i, stmt in pairs(sense:getAllStatements('P9970')) do -- এই অর্থের জন্য বিধেয়
article_links = article_links .. getArticleLinkTemplate(frame, stmt.mainsnak.datavalue.value.id)
end
return article_links
end
-- @TODO: Generalise
local function expandTemplateForProperty(frame, object, property, template)
local lemmas = {}
local n = 0
for _, stmt in pairs(object:getAllStatements(property)) do
local lex = wb.lexeme.splitLexemeId(stmt.mainsnak.datavalue.value.id)
lex = getEntity(lex)
n = n + 1
lemmas[n] = lex:getLemma(lang_code)
end
if not lang_code or n == 0 then
return ''
end
-- Build args: first lang_code, then lemmas
local args = {lang_code}
for i = 1, n do
args[#args + 1] = lemmas[i]
end
return frame:expandTemplate{
title = template,
args = args
}
end
local function getExternalLinks( entity ) -- T418639
local external_links = {}
if entity.claims == nil then return external_links end
local formatter_urls = require('মডিউল:আভিধানিক উপাত্ত/urls').formatter_urls
for property_id, statements in pairs(entity.claims) do
local formatter_url = formatter_urls[property_id]
if formatter_url ~= nil then
local property_source = wb.getBestStatements(property_id, 'P9073')
local source_name
if next(property_source) ~= nil then
source_name = getLabel(property_source[1].mainsnak.datavalue.value.id)
or property_source[1].mainsnak.datavalue.value.id
else
source_name = getLabel(property_id) or property_id
end
for i = 1, #statements do
local stmt = statements[i]
if stmt.mainsnak.datavalue then
local formatted_link = ustring.gsub(
ustring.gsub(formatter_url, '$1', ustring.gsub(stmt.mainsnak.datavalue.value, '%%', '%%%%')),
' ', '+'
)
table.insert(external_links,
'[' .. formatted_link .. ' ' .. source_name .. ']')
end
end
end
end
return external_links
end
p.getExternalLinks = getExternalLinks -- রেখে দিন যাতে ডিবাগিং সম্ভব হয়
local function termSpan( term )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( text )
return tostring( span )
end
local function termLink( term, lang_qid )
local text = term[1]
local lang = term[2]
local dir = mw_lang.new( lang ):getDir()
local span = html.create( 'span' )
span:attr( 'lang', lang )
:attr( 'dir', dir )
:wikitext( '[[' .. text .. '#' .. getLabel(lang_qid) .. '|' .. text .. ']]' )
return tostring( span )
end
local function getLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termSpan(rep)
else
lemma_string = lemma_string .. '/' .. termSpan(rep)
end
end
return lemma_string
end
local function getLinkedLemmata( current_lexeme )
local lemma_string = ''
for i, rep in pairs(current_lexeme:getLemmas()) do
if lemma_string == '' then
lemma_string = termLink(rep, current_lexeme:getLanguage())
else
lemma_string = lemma_string .. '/' .. termLink(rep, current_lexeme:getLanguage())
end
end
return lemma_string
end
local function getExamples( current_lexeme, sense_id, references_seen )
local examples = html.create('dl')
local example_text, example_lang, example_form, example_str
for i, stmt in pairs(current_lexeme:getAllStatements('P5831')) do -- ব্যবহারের উদাহরণ
if stmt.qualifiers ~= nil and stmt.qualifiers['P6072'] ~= nil and stmt.qualifiers['P6072'][1].datavalue.value.id == sense_id then -- বিষয়ে লেক্সিমের অর্থ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_strs = {}
if stmt.qualifiers['P1810'] ~= nil then
table.insert(example_form_strs, stmt.qualifiers['P1810'][1].datavalue.value)
elseif stmt.qualifiers['P5830'] ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
for _, rep in pairs(example_form:getRepresentations()) do
table.insert(example_form_strs, rep[1])
end
end
for i, example_form_str in pairs(example_form_strs) do
new_example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
if new_example_text ~= example_text then
example_str = termSpan({new_example_text, example_lang})
break
end
new_example_text = example_text
end
if example_str == nil then
example_str = termSpan({example_text, example_lang})
end
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
end
for i, stmt in pairs(wb.getAllStatements(sense_id, 'P5831')) do -- ব্যবহারের উদাহরণ
example_text = ustring.gsub(stmt.mainsnak.datavalue.value.text, ' / ','<br/>')
example_lang = stmt.mainsnak.datavalue.value.language
local example_form_str = nil
if stmt.qualifers ~= nil then
example_form = getEntity(stmt.qualifiers['P5830'][1].datavalue.value.id) -- বিষয়ে লেক্সিমের রূপ
if stmt.qualifiers['P1810'] ~= nil then
example_form_str = stmt.qualifiers['P1810'][1].datavalue.value
end
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentation(i18n['content_lang_code'])
end
if example_form ~= nil and example_form_str == nil then
example_form_str = example_form:getRepresentations()[1][1]
end
if example_form_str ~= nil then
example_text = ustring.gsub(example_text, example_form_str, "'''" .. example_form_str .. "'''")
end
example_str = termSpan({example_text, example_lang})
local reference_text = ''
if stmt.references ~= nil then
for j, reference in pairs(stmt.references) do
table.insert(references_seen, reference.hash)
local got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. got_reference[2]
end
end
if example_str ~= nil then
examples:tag('dd'):wikitext("''" .. example_str .. "''")
if reference_text ~= '' then
examples:done():tag('dd'):css('text-indent', '2em'):wikitext(reference_text)
end
end
end
return { tostring(examples) , references_seen }
end
-- This calls frame:preprocess() instead of :callParserFunction() because the latter does not work for Wikifunctions function calls yet (see https://www.wikifunctions.org/wiki/Wikifunctions:Embedded_function_calls).
local function callWikifunctionsFunction(args, frame)
return frame:preprocess('{{#function:' .. args .. '}}')
end
local function checkTitleCodePointInRange(title, start_point, end_point)
return ustring.find( title, '[' ..ustring.char(start_point) .. '-' .. ustring.char(end_point) .. ']' )
end
local function getLanguageForCategories( lang_id, current_page_title )
-- বিশেষ ভাষার জন্য
if lang_id == 'Q11051' then -- হিন্দি/উর্দু
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- উর্দু
lang_id = 'Q11051ur'
elseif checkTitleCodePointInRange(current_page_title, 0x0900, 0x097f) ~= nil then -- হিন্দি
lang_id = 'Q11051hi'
end
elseif lang_id == 'Q58635' then -- পাঞ্জাবি
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- শাহমুখী
lang_id = 'Q58635pnb'
elseif checkTitleCodePointInRange(current_page_title, 0x0a00, 0x0a7f) ~= nil then -- গুরুমুখী
lang_id = 'Q58635pa'
end
elseif lang_id == 'Q56356571' then -- নয়া ফার্সি ভাষা
if checkTitleCodePointInRange(current_page_title, 0x0600, 0x06ff) ~= nil then -- ফার্সি (ইরান/আফগানিস্তান)
lang_id = 'Q56356571fa'
elseif checkTitleCodePointInRange(current_page_title, 0x0400, 0x04ff) ~= nil then -- তাজিক
lang_id = 'Q56356571tg'
end
end
return lang_id
end
local function getOneStringForProperty(object, property)
local val
local stmts = object:getAllStatements(property)
if #stmts ~= 0 then
val = stmts[1].mainsnak.datavalue.value
end
return val
end
local function getTranslations(frame, senses) -- TODO: woefully incomplete until T185313 and T199887 are resolved
if #senses == 0 then
return nil
end
local all_translations = {}
for _, sense in pairs(senses) do
local translation_set = {}
local gloss = sense:getGloss('bn')
for _, stmt in pairs(sense:getAllStatements('P5972')) do
local translation = stmt.mainsnak.datavalue.value.id
local lexeme_id = wb.lexeme.splitLexemeId(translation)
local language = getLabel(getEntity(lexeme_id):getLanguage())
table.insert(translation_set, language .. ': ' .. getLinkedLemmata(getEntity(lexeme_id)) .. '<br/>')
end
if #translation_set > 0 then
local block = frame:expandTemplate{ title = i18n['template_trans-top'], args = { gloss } }
block = block .. table.concat(translation_set, '\n') .. frame:expandTemplate{ title = i18n['template_trans-bottom'] }
table.insert(all_translations, block)
end
end
if #all_translations == 0 then
return nil
end
return '====' .. i18n['heading_translation'] .. '==== \n' .. table.concat(all_translations, '\n')
end
local createicon = function(langcode, entityID, propertyID)
langcode = langcode or ""
propertyID = propertyID or ""
local icon = " <span class='penicon autoconfirmed-show'>[["
-- " <span data-bridge-edit-flow='overwrite' class='penicon'>[[" -> enable Wikidata Bridge
.. "File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="
.. i18n['edit_wikidata']
.. "|link=https://www.wikidata.org/entity/" .. entityID
if langcode ~= "" then icon = icon .. "?uselang=" .. langcode end
if propertyID ~= "" then icon = icon .. "#" .. propertyID end
icon = icon .. "|" .. i18n['edit_wikidata'] .. "]]</span>"
return icon
end
local function getMeanings( frame, args, current_lexeme, senses, references_seen, language_name)
if #senses == 0 then
return {createicon(i18n['content_lang_code'], current_lexeme:getId()) .. "''" .. i18n['text_category_rfdef'] .. "''" .. i18n.tocatlink(i18n['category_rfdef']), references_seen}
end
local meanings = html.create( 'ol' )
local idlinkset = {}
for i, sense in pairs(senses) do
local gloss_text_parts = {}
local main_gloss_text = frame:expandTemplate{
title=i18n['template_anchor'],
args={sense:getId()}
}
local specifiers = {}
for k, property_id in ipairs({'P6084', 'P6191', 'P9488'}) do -- অবস্থান যেখানে শব্দার্থ ব্যবহৃত, যে রীতিতে শব্দার্থ ব্যবহৃত হয়, যে ক্ষেত্রে ব্যবহৃত
for i, stmt in pairs(sense:getAllStatements(property_id)) do
local stmt_value = stmt.mainsnak.datavalue.value.id
local reference_text = ''
local refs = stmt.references
if refs ~= nil then
for j, reference in pairs(refs) do
table.insert(references_seen, reference.hash)
got_reference = getReference(reference.hash, reference)
reference_text = reference_text .. '\n\n' .. frame:extensionTag('ref', got_reference[2])
end
local val = getLabel(stmt_value)
table.insert(specifiers, val .. reference_text)
if property_id == 'P9488' then
table.insert(specifiers, i18n.tocatlink(lang_code .. val))
end
end
end
end
if #specifiers > 0 then
main_gloss_text = main_gloss_text .. "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local gloss = sense:getGloss( i18n['content_lang_code'] )
if gloss ~= nil then
main_gloss_text = main_gloss_text .. wrapStringInWikilinks(gloss)
if gloss:match('^প্রদত্ত%s*(%S-)%s*নাম$') then -- given names
main_gloss_text = main_gloss_text .. i18n.tocatlink(language_name .. ' ' .. i18n['category_given_names'])
end
else
local other_gloss_text = nil
local other_gloss_lang = nil
local item_label_gloss_parts = {}
for k, stmt in pairs(sense:getAllStatements('P5137')) do -- যদি 'এই অর্থের জন্য আইটেম' মানের বাংলা লেবেল থাকে
local stmt_value = stmt.mainsnak.datavalue.value.id
local stmt_label = getLabel(stmt_value)
if stmt_label ~= nil then
table.insert(item_label_gloss_parts, '[[:d:' .. stmt_value .. '|' .. stmt_label .. ']]')
end
end
if #item_label_gloss_parts > 0 then
other_gloss_text = table.concat(item_label_gloss_parts, '; ')
end
if other_gloss_text == nil then
for i, fallback_lang in ipairs(mw_lang.getFallbacksFor( i18n['content_lang_code'] )) do
if sense:getGloss( fallback_lang ) ~= nil then
other_gloss_text, other_gloss_lang = sense:getGloss( fallback_lang )
end
end
if other_gloss_lang == nil then
local glosses = sense:getGlosses()
for j, gloss in pairs(glosses) do
other_gloss_text = gloss[1]
other_gloss_lang = gloss[2]
break
end
end
main_gloss_text = main_gloss_text .. other_gloss_text .. "<sup><em>" .. mw_lang.fetchLanguageName(other_gloss_lang, i18n['content_lang_code']) .. "</em></sup>"
else
main_gloss_text = main_gloss_text .. "''" .. other_gloss_text .. "''"
end
main_gloss_text = main_gloss_text .. i18n.tocatlink(i18n['category_rfdef_equivalent'])
end
local synonym = expandTemplateForProperty(frame, sense, 'P5973', i18n['template_synonym'])
if synonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. synonym
end
local antonym = expandTemplateForProperty(frame, sense, 'P5974', i18n['template_antonym'])
if antonym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. antonym
end
local hypernym = expandTemplateForProperty(frame, sense, 'P6593', i18n['template_hypernym'])
if hypernym ~= '' then
main_gloss_text = main_gloss_text .. ' <br/> ' .. hypernym
end
if lex_cat == 'Q1084' or lex_cat == 'Q147276' then -- noun or proper noun
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-noun'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
elseif lex_cat == 'Q34698' then
local demonym = expandTemplateForProperty(frame, sense, 'P6271', i18n['template_demonym-adj'])
main_gloss_text = main_gloss_text .. ' <br/> ' .. demonym
end
table.insert(gloss_text_parts, main_gloss_text .. createicon(i18n['content_lang_code'], sense:getId()))
for i, stmt in pairs(sense:getAllStatements('P8394')) do -- টিপ্পনীর উদ্ধৃতি
gloss_quote = termSpan({stmt.mainsnak.datavalue.value.text, stmt.mainsnak.datavalue.value.language})
if stmt.references[1] ~= nil then
local got_reference = getReference ( stmt.references[1].hash, stmt.references[1] )
gloss_quote = '"' .. gloss_quote .. '" ' .. got_reference[2]
end
table.insert(references_seen, stmt.references[1].hash)
table.insert(gloss_text_parts, frame:extensionTag('ref', gloss_quote))
end
for i, stmt in pairs(sense:getAllStatements('P1343')) do -- বর্ণিত উৎস
-- TODO: do away with making fake reference objects
local fake_reference = { ['snaks'] = {} }
fake_reference.snaks['P248'] = { [1] = stmt.mainsnak }
qualifiers_order = stmt['qualifiers-order']
if qualifiers_order ~= nil then
for i, k in ipairs(qualifiers_order) do fake_reference.snaks[k] = stmt.qualifiers[k] end
end
fake_reference.hash = mw.hash.hashValue('sha3-512', serializeTable(fake_reference))
table.insert(references_seen, fake_reference.hash)
local got_reference = getReference(fake_reference.hash, fake_reference)
if got_reference[1] == nil then
table.insert(gloss_text_parts, frame:extensionTag('ref', got_reference[2], {name = fake_reference.hash}))
else
table.insert(gloss_text_parts, frame:extensionTag{name = 'ref', content='', args = {name = got_reference[1]}})
end
end
local first_sense_image = ''
local sense_images = sense:getAllStatements('P18')
if next(sense_images) ~= nil then
first_sense_image = sense_images[1].mainsnak.datavalue.value
end
if first_sense_image ~= '' then
table.insert(gloss_text_parts, '[[চিত্র:' .. first_sense_image .. "|thumb|'''" .. getLemmata(current_lexeme) .. "'''—" .. main_gloss_text .. ']]')
end
local idlinks = getExternalLinks(sense)
if #idlinks > 0 then
local idlinktext = '<small>('
for _, idlink in pairs(idlinks) do
idlinktext = idlinktext .. idlink .. '\n'
end
idlinktext = idlinktext .. ')</small>'
table.insert(gloss_text_parts, idlinktext)
table.insert(idlinkset, idlinks)
end
local externallinks = getArticleLinks(frame, sense)
if externallinks ~= '' then
table.insert(gloss_text_parts, externallinks)
end
local new_notes = {}
local sense_keys = { sense:getId(), string.sub(sense:getId(), string.find(sense:getId(), '-')+1) }
for _, v in ipairs(sense_keys) do
if args[v] ~= nil then
table.insert(new_notes, args[v])
end
end
if #new_notes > 0 then
for _, v in ipairs(new_notes) do
if i == 1 then
table.insert(gloss_text_parts, '<br/>' .. v)
else
table.insert(gloss_text_parts, v)
end
end
end
local examples, references_seen = unpack(getExamples( current_lexeme, sense:getId(), references_seen ))
local gloss_text = table.concat(gloss_text_parts, '\n')
meanings:tag('li'):wikitext(gloss_text):wikitext(examples)
end
return {meanings, references_seen, idlinkset}
end
local function getPronunciationBaseForm( lang_name, lex_cat)
local base_form = nil
-- (!) অন্য ভাষার শব্দের যদি অন্য রকম মূল ফর্ম থাকে সেগুলো এখানে নতুন if বিবৃতি দিয়ে যোগ করা যায়।
if lang_name == 'বাংলা' then
if lex_cat == 'Q1084' then -- বিশেষ্য
base_form = formWithSingleGrammaticalFeature( 'Q131105' ) -- কর্তৃকারক
elseif lex_cat == 'Q24905' then -- ক্রিয়া
base_form = formWithSingleGrammaticalFeature( 'Q1350145' ) -- ক্রিয়া বিশেষ্য
end
end
if base_form == nil then
for i, form in pairs(forms) do
base_form = form
break
end
end
return base_form
end
local function getCombines( current_lexeme, frame )
local combines = ''
local index_mappings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P5238')) do
if stmt.qualifiers ~= nil and stmt.qualifiers['P1545'] ~= nil then -- ক্রম
local current_index = tonumber(stmt.qualifiers['P1545'][1].datavalue.value)
index_mappings[current_index] = stmt
end
end
if #index_mappings ~= 0 then
for i, stmt in ipairs(index_mappings) do
if stmt.mainsnak.datavalue ~= nil then
local part_lexeme_id = stmt.mainsnak.datavalue.value.id
local part_lexeme = getEntity(part_lexeme_id)
local current_substring = getLinkedLemmata(part_lexeme)
local part_etymology = getEtymology(part_lexeme, frame, 'partial')
if part_etymology ~= '' and part_etymology ~= nil then
current_substring = current_substring .. ' (← ' .. part_etymology .. ')'
end
if combines == '' then
combines = current_substring
else -- @TODO: This shoukd use the 'affix' and 'compound' templates instead.
combines = combines .. ' + ' .. current_substring
end
end
end
end
return combines
end
function getRoots( current_lexeme )
local stmts = current_lexeme:getAllStatements('P5920')
if #stmts == 0 then return '' end
local root_lexeme = getEntity(stmts[1].mainsnak.datavalue.value.id)
return getLexemeLanguageCode(root_lexeme), '√' .. getLinkedLemmata(root_lexeme), root_lexeme:getLemma('ar')
end
function getEtymology( current_lexeme, frame, mode )
-- @TODO: Fix the etymology chains that are not possible to render
local etymology = ''
local current_combines = getCombines(current_lexeme, frame)
local root_lang, current_roots, root_str = getRoots(current_lexeme)
if mode ~= 'partial' and root_str ~= nil then
frame:expandTemplate{title=i18n['template_root'], args={lang_code, root_lang, root_str}}
end
local stmts = current_lexeme:getAllStatements('P5191')
local new_etymology_string
if #stmts == 0 then
if current_roots ~= '' and current_combines ~= '' and current_roots ~= nil then
return current_roots .. '<br/>(' .. current_combines .. ')'
elseif current_roots ~= '' then
if lang_code == 'ar' and mode ~= 'partial' then
return frame:expandTemplate{title=i18n['template_ar-rootbox'], args={root_str}}
else
return current_roots
end
else
return current_combines
end
end
local origin_lexeme_string
for i, stmt in pairs(stmts) do
local origin_lexeme_dv = stmt.mainsnak.datavalue -- If this is nil, the origin lexeme is not known.
if origin_lexeme_dv ~= nil then
local origin_lexeme = getEntity(origin_lexeme_dv.value.id)
local origin_lexeme_lang = getLabel(origin_lexeme:getLanguage())
local sitelink = i18n.wplink(origin_lexeme:getLanguage(), origin_lexeme_lang, wb)
if sitelink ~= '' then
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. sitelink .. ')'
else
origin_lexeme_string = getLinkedLemmata(origin_lexeme) .. ' (' .. origin_lexeme_lang .. ')'
end
if stmt.qualifiers ~= nil and stmt.qualifiers['P5886'] ~= nil then
local mode_of_derivation = stmt.qualifiers['P5886'][1].datavalue.value.id
if mode_of_derivation == 'Q1345001' then
-- @TODO: Add support for showing gender
origin_lexeme_string = frame:expandTemplate{title=i18n['template_borrowed'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_borrowing']
elseif mode_of_derivation == 'Q845079' then
origin_lexeme_string = ustring.gsub(i18n['etymology_learned_borrowing'], '$1', origin_lexeme_string)
elseif mode_of_derivation == 'Q56611986' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_inherited'], args={lang_code, getLexemeLanguageCode(origin_lexeme), getLemmata(origin_lexeme), pos=getLabel(lex_cat)}} .. ' ' .. i18n['etymology_inheritance']
elseif mode_of_derivation == 'Q189743' then
origin_lexeme_string = frame:expandTemplate{title=i18n['template_ellipsis'], args={lang_code, getLemmata(origin_lexeme)}} .. ' ' .. i18n['etymology_ellipsis']
end
end
local origin_origin = getEtymology(origin_lexeme, frame)
if origin_origin ~= '' and origin_origin ~= nil then
new_etymology_string = origin_lexeme_string .. ' ← ' .. origin_origin
else
new_etymology_string = origin_lexeme_string
end
end
if etymology == '' then
etymology = new_etymology_string
elseif origin_lexeme_string ~= nil and etymology ~= nil then
etymology = etymology .. ' ' .. origin_lexeme_string
elseif origin_lexeme_string ~= nil and etymology == nil then
etymology = origin_lexeme_string
end
end
if current_roots ~= '' and etymology ~= nil and current_roots ~= nil then
etymology = etymology .. ' ' .. current_roots
elseif current_roots ~= '' and etymology == nil then
etymology = current_roots
end
if current_combines ~= '' and etymology ~= nil then
etymology = etymology .. '<br/>(' .. current_combines .. ')'
end
return etymology
end
local function pronunciationBlock(block, value)
return '* ' .. i18n['text_' .. block] .. ' ' .. value
end
local function getPronunciation( frame, current_lexeme, lang_name, lex_cat )
local pronunciations = {}
local base_form = getPronunciationBaseForm(lang_name, lex_cat )
if base_form ~= nil then
for i, stmt in pairs(base_form:getAllStatements('P443')) do -- উচ্চারণের অডিও
local pronunciation_file = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in pairs(stmt.qualifiers[property_id]) do
local stmt_value = qual.datavalue.value.id
table.insert(specifiers, getLabel(stmt_value))
end
end
end
if #specifiers > 0 then
specifier_text = table.concat(specifiers, "'', ''")
end
local audio_text
if specifier_text ~= '' then
audio_text = i18n['text_audio'] .. ' (' .. specifier_text .. ')'
else
audio_text = i18n['text_audio']
end
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title= i18n['template_audio'],
args = {lang_name, pronunciation_file, audio_text}
})
end
local ipa_transcription = base_form:getAllStatements('P898') -- - আধ্বব প্রতিলিপিকরণ
local iso15919_transcription = getOneStringForProperty(base_form, 'P5825') -- আইএসও ১৫৯১৯ প্রতিলিপিকরণ
local itrans = getOneStringForProperty(base_form, 'P8881') -- ITRANS
local iast = getOneStringForProperty(base_form, 'P7581') -- আইএএসটি প্রতিলিপিকরণ
local xsampa = getOneStringForProperty(base_form, 'P2859')
-- @TODO: অডিও ও প্রতিলিপিকরণ দুটোই থাকলে সেই ক্ষেত্রে একটার ঠিক পরেই আরেকটা দেখানো উচিত
if #ipa_transcription ~= 0 then
for i, stmt in pairs(ipa_transcription) do
local ipa_text = stmt.mainsnak.datavalue.value
local specifier_text = ''
local specifiers = {}
if stmt.qualifiers ~= nil then
for k, property_id in ipairs({'P5237'}) do -- উচ্চারণের ধরন
for l, qual in ipairs(stmt.qualifiers[property_id]) do
table.insert(specifiers, getLabel( qual.datavalue.value.id ))
end
end
end
if #specifiers > 0 then
specifier_text = "(''" .. table.concat(specifiers, "'', ''") .. "'') "
end
local syllable_count
if lang_code == 'tr' then
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z10029|' .. ipa_text, frame)
else
syllable_count = i18n['text_syllable_count'] .. callWikifunctionsFunction('Z30837|' .. ipa_text, frame)
end
table.insert(pronunciations, '* ' .. specifier_text .. frame:expandTemplate{
title= i18n['template_ipa'],
args = {lang_name, ipa_text}
} .. '\n* ' .. syllable_count)
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
elseif lang_name == 'বাংলা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='bn-IPA',
})
elseif lang_name == 'আরবি' then
local lemma = current_lexeme:getLemma('ar')
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ar-IPA',
args={lemma}
})
elseif lang_name == 'ফালা' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fax-pron',
})
elseif lang_code == 'fi' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='fi-IPA',
})
elseif lang_code == 'ko' then
table.insert(pronunciations, '* ' .. frame:expandTemplate{
title='ko-IPA',
})
end
if iso15919_transcription ~= nil then
table.insert(pronunciations, pronunciationBlock('iso15919', iso15919_transcription))
end
if itrans ~= nil then
table.insert(pronunciations, pronunciationBlock('itrans', itrans))
end
if iast ~= nil then
table.insert(pronunciations, pronunciationBlock('iast', iast))
end
if xsampa ~= nil then
table.insert(pronunciations, pronunciationBlock('xsampa', xsampa))
end
end -- {{আধ্বব|en|/ˈɪntəvjuː/}}
return table.concat(pronunciations, '\n')
end
local function getAlternativeSpellings( current_lexeme )
local alt_spellings = {}
for i, stmt in pairs(current_lexeme:getAllStatements('P11577')) do -- বিকল্প বানান
if stmt.mainsnak.datavalue ~= nil then
table.insert(alt_spellings, '* ' .. getLinkedLemmata(getEntity(stmt.mainsnak.datavalue.value.id)))
end
end
return table.concat(alt_spellings, '\n')
end
local function heading_level(text, level)
local heading_delimiter = string.rep('=', level)
return heading_delimiter .. ' ' .. text .. ' ' .. heading_delimiter
end
function get_any_notes(sections, args, keys)
local notes = {}
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(notes, args[v])
end
end
return notes
end
function add_specific_notes(sections, notes)
for i, v in ipairs(notes) do
table.insert(sections, v)
end
end
local function add_any_notes(sections, args, keys)
for i, v in ipairs(keys) do
if args[v] ~= nil then
table.insert(sections, args[v])
end
end
end
local function getMatchingLemmaForPageTitle(lexeme, title)
local lemmas = lexeme:getLemmas()
local matched_lemma
for _, lemma_entry in ipairs(lemmas) do
local lemma = lemma_entry[1]
if lemma == title then
matched_lemma = lemma
break
end
end
if matched_lemma == nil and lang_code == 'ar' then -- Arabic lemmas do not match the title of the entry because those are written with different characters stripped out on Wiktionary
matched_lemma = lexeme:getLemma('ar')
end
return matched_lemma
end
local function buildLanguageAgnosticInflectionTable()
local has_image = false
local form_images = {}
for i, form in ipairs(forms) do
local form_image = form:getAllStatements('P7407')
if next(form_image) ~= nil then
form_images[i] = form_image[1].mainsnak.datavalue.value
has_image = true
end
end
local table_class = "wikitable mw-collapsible sortable"
if not has_image then
table_class = table_class .. " mw-collapsed"
end
local text = "{| class='" .. table_class .. "' style='border:solid 1px rgb(80%,80%,100%); text-align:center;'\n"
text = text .. "|+ " .. i18n['heading_inflection_table'] .. "\n"
text = text .. "|- \n"
text = text .. "! " .. i18n['heading_form'] .. " !! " .. i18n['heading_grammatical_features']
if has_image then
text = text .. " !! " .. (i18n['heading_image'])
end
text = text .. " \n"
for i, form in ipairs(forms) do
local rep = form:getRepresentations()
local feat = form:getGrammaticalFeatures()
local rep_text = ""
for j, r in pairs(rep) do
if rep_text == "" then
rep_text = r[1]
else
rep_text = rep_text .. " / " .. r[1]
end
end
local feat_text = ""
if feat ~= nil then
for j, f in ipairs(feat) do
local label = getLabel(f) or f
if feat_text == "" then
feat_text = label
else
feat_text = feat_text .. ", " .. label
end
end
end
text = text .. "|-\n"
text = text .. "| " .. (rep_text ~= "" and rep_text or "—")
text = text .. " || " .. (feat_text ~= "" and feat_text or "—")
if has_image then
local image_cell = "—"
if form_images[i] ~= nil then
image_cell = "[[চিত্র:" .. form_images[i] .. "|50px]]"
end
text = text .. " || " .. image_cell
end
text = text .. "\n"
end
text = text .. "|}"
return text
end
function p.all( frame )
local args = getArgs(frame)
local lexeme_id = args[1]
local current_lexeme = getEntity(lexeme_id)
local current_language = current_lexeme:getLanguage()
local senses = current_lexeme:getSenses()
local add_heading = true
forms = current_lexeme:getForms()
if args[2] ~= nil then
local val = mw.text.trim(tostring(args[2]))
if val == "false" or val == "0" or val == "না" then
add_heading = false
end
end
local references_seen = {}
local sections = {}
local title = mw.title.getCurrentTitle().text
local lang_category = getLanguageForCategories(current_language, title)
local lang_name = getLabel(lang_category)
if add_heading == true then
local lang_heading = "== " .. lang_name .. " =="
table.insert(sections, lang_heading)
end
matched_lemma = getMatchingLemmaForPageTitle(current_lexeme, title)
lex_cat = current_lexeme:getLexicalCategory()
lang_code = getLexemeLanguageCode(current_lexeme)
local cat = i18n.lang_category(getLabel(lex_cat), lang_name)
local lex_cat_template
if cat ~= nil then
table.insert(sections, '===' .. getLabel(lex_cat) .. cat .. frame:expandTemplate{
title = i18n['template_anchor'],
args = { lexeme_id }
} .. '===')
table.insert(sections, frame:expandTemplate{
title= i18n['template_lexeme'],
args = {lexeme_id}
})
add_any_notes(sections, args, i18n['manual_category'])
local etymology = getEtymology( current_lexeme, frame )
if etymology ~= '' and etymology ~= nil then
table.insert(sections, heading_level(i18n['heading_etymology'], 4))
table.insert(sections, tostring(etymology))
end
add_any_notes(sections, args, i18n['manual_etymology'])
local pronunciation = getPronunciation( frame, current_lexeme, lang_name, lex_cat )
if pronunciation ~= '' then
table.insert(sections, heading_level(i18n['heading_pronunciation'], 4))
table.insert(sections, tostring(pronunciation))
end
add_any_notes(sections, args, i18n['manual_pronunciation'])
local alternative_spellings = getAlternativeSpellings( current_lexeme )
if alternative_spellings ~= '' then
table.insert(sections, heading_level(i18n['heading_alternative_spellings'], 4))
table.insert(sections, alternative_spellings)
end
if lang_code ~= nil and lang_code ~= 'ksy' and lang_code ~= 'rkt' then -- Skip for Kharia Thar, Rangpuri
if lex_cat == 'Q34698' then -- বিশেষণ
if lang_code == 'en' or lang_code == 'bn' then
if #forms <= 1 then
lex_cat_template = frame:expandTemplate{title= lang_code .. '-বিশেষণ'}
end
else
lex_cat_template = safeExpand(frame, lang_code .. '-adj')
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. '-বিশেষণ')
end
end
elseif lex_cat == 'Q1084' then -- @TODO: Also check for plural forms
local gender
local stmts = current_lexeme:getAllStatements('P5185') -- ব্যাকরণগত লিঙ্গ
if #stmts ~= 0 then
if #stmts == 1 then
local gender_qid = stmts[1].mainsnak.datavalue.value.id
if gender_qid == 'Q499327' then
gender = 'm'
elseif gender_qid == 'Q1775415' then
gender = 'f'
elseif gender_qid == 'Q1775461' then
gender = 'n'
elseif gender_qid == 'Q1305037' then
gender = 'c'
end
end
else
for i, stmt in pairs(stmts) do
local qid = stmts[i].mainsnak.datavalue.value.id
if qid == 'Q499327' then
gender = gender .. 'm'
elseif qid == 'Q1775415' then
gender = gender .. 'f'
end
end
end
-- The following checks are ordered based on which one is expected to be true in a higher number of cases.
if current_language == 'Q13955' then
if matched_lemma ~= nil then
lex_cat_template = safeExpand(frame, {title='ar-noun', args={matched_lemma,gender}})
else
lex_cat_template = frame:expandTemplate{title='ar-noun', args={nil,gender}}
end
elseif current_language == 'Q29919' then
lex_cat_template = frame:expandTemplate{title='arz-noun', args={g=gender}}
elseif current_language == 'Q397' then
if matched_lemma ~= nil then
lex_cat_template = frame:expandTemplate{title='la-noun', args={matched_lemma,g=gender}}
end
elseif current_language == 'Q11059' then
lex_cat_template = frame:expandTemplate{title='sa-noun', args={g=gender}}
elseif current_language ~= 'Q1860' then -- These templates require the gender to be passed as the 1st argument.
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix'], {gender})
if not lex_cat_template then
lex_cat_template = safeExpand(frame, lang_code .. i18n['noun_template_suffix_fallback'], {gender})
end
end
end
end
-- elseif lex_cat == 'Q147276' then
-- lex_cat_template = safeExpand(frame, lang_code .. '-proper noun', {gender})
-- if not lex_cat_template then
-- lex_cat_template = safeExpand(frame, lang_code .. '-নামবাচক বিশেষ্য', {gender})
-- end
end
if lex_cat_template ~= nil then
table.insert(sections, lex_cat_template)
else
if matched_lemma ~= nil then
table.insert(sections, heading_level(matched_lemma, 4))
else
table.insert(sections, i18n.tocatlink(i18n['category_no_matching_lemma']))
end
end
local meanings, references_seen, sense_extlinks = unpack(getMeanings( frame, args, current_lexeme, senses, references_seen, lang_name))
table.insert(sections, tostring(meanings))
add_any_notes(sections, args, i18n['manual_meaning'])
local instance_of = current_lexeme:getAllStatements('P31') -- সত্ত্বার ধরন
if #instance_of ~= 0 then
local instance_of_entity = instance_of[1].mainsnak.datavalue.value.id
if instance_of_entity == 'Q40437546' or instance_of_entity == 'Q120831827' or instance_of_entity == 'Q120717979' or instance_of_entity == 'Q124476844' then -- @TODO: generalise this so all types of roots are shown
table.insert(sections, i18n['text_instance_of'] .. ' ' .. getLabel(instance_of_entity))
elseif instance_of_entity == 'Q376431' then -- বর্ণের নাম
table.insert(sections, i18n.tocatlink(lang_code .. ':রং'))
end
end
local translations = getTranslations(frame, senses)
if translations ~= nil then
table.insert(sections, translations)
end
-- (!) বিশেষ ভাষার বিভক্তির সারণি যদি থাকে সেগুলো এখানে নতুন if বিবৃতি যোগ করা যায়।
if next(forms) ~= nil then
if current_language == 'Q9610' then -- বাংলা
if lex_cat == 'Q24905' then
local conjTable = require('মডিউল:আভিধানিক উপাত্ত/Q9610').getConjTable(frame, forms)
table.insert(sections, conjTable)
elseif lex_cat == 'Q1084' then
--table.insert(sections, callWikifunctionsFunction('Z33243|' .. lexeme_id .. '|', frame))
table.insert(sections, buildLanguageAgnosticInflectionTable())
elseif lex_cat == 'Q34698' then
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
--elseif current_language == 'Q13955' then -- আরবি
-- if lex_cat == 'Q1084' then
-- table.insert(sections, frame:expandTemplate{title='ar-decl-noun', args={lemma}})
-- end
elseif current_language == 'Q188' then -- জার্মান
if lex_cat == 'Q1084' then
table.insert(sections, callWikifunctionsFunction('Z28602|' .. lexeme_id .. '|', frame))
end
else
if #forms > 1 then
table.insert(sections, buildLanguageAgnosticInflectionTable())
end
end
end
if lex_cat == 'Q134830' then
table.insert(sections, frame:expandTemplate{title='prefixsee', args={lang_code}})
-- elseif lex_cat == 'Q111029' then
-- table.insert(sections, frame:expandTemplate{title='rootsee', args={'+', lang_code, matched_lemma}})
end
local reference_notes = get_any_notes(sections, args, i18n['manual_reference'])
if #references_seen > 0 or #reference_notes > 0 then
table.insert(sections, heading_level(i18n['heading_references'], 4))
table.insert(sections, frame:extensionTag('references'))
add_specific_notes(sections, reference_notes)
end
local external_link_table = getExternalLinks ( current_lexeme )
if #external_link_table > 0 then
local external_links = '* ' .. table.concat(external_link_table, '\n* ')
table.insert(sections, heading_level(i18n['heading_external_links'], 4))
table.insert(sections, external_links)
end
add_any_notes(sections, args, i18n['manual_external_link'])
if #references_seen == 0 and #reference_notes == 0 and sense_extlinks ~= nil and #sense_extlinks == 0 and #external_link_table == 0 and #get_any_notes(sections, args, i18n['manual_external_link']) == 0 then
table.insert(sections, i18n.rfref_category(lang_name))
end
return table.concat(sections,"\n\n")
end
return p
4p8hdbyhqk10etd17ivk5xcr3ttagdf
ব্যবহারকারী:Redmin/খেলাঘর
2
66884
509298
509047
2026-05-28T06:57:24Z
Redmin
6857
509298
wikitext
text/x-wiki
[[:বিষয়শ্রেণী:IPA pronunciations with invalid IPA characters]]
[[চলা]] P9295, P5186, P5187, P11053, P11054, P9488, P5972, P9971, P6072 with P5831, P9970, P2288, P8881, P1552, P5975 (needs T185313), P8471, P5976, P10822, P282, P5978, P6719, P7219, P7220, P7221, P10339, P10927, P12027, P12028, P12410, P13045, P7481, P13504, P5548, P5401, P5426, P2440, P9021, P10822, P1249<br />
Z29940, Z17866, Z32787, Z32793, Z11795, Z31772, Z33644, Z30837 (templates), Z33814, Z32347, Z32340, Z32343, Z26333
Combine Z22853 and Z23489 to make a translation table function<br />
Etymology failing to render: [[আদর্শ]]
[[d:Lexeme:L3441]], [[throw]], [[গোলাকার]], [[:বিষয়শ্রেণী:উইকিউপাত্ত আভিধানিক উপাত্ত থেকে আমদানিকৃত]]
Pronunciation of forms
[[d:User:Rua/Wikidata for Wiktionarians]]
[[-গুলি]]
=p.all(
mw.getCurrentFrame():newChild{
title="Module: আভিধানিক উপাত্ত",
args={"L143"}
}
)
{{লে|L1422918}}
{{#invoke:আভিধানিক উপাত্ত/sandbox|all|L34813}}
{{#function:Z28602|L300026|}}
{{#function:Z27861|<div style="text-align: center;">Test</div>}}
{{#function:Z28602|L1425972|Z1011}}
{{#function:Z28602|L14259|Z1011}}
{{#function:Z30837|/ɡolakaɾ/}}
{{#function:Z33837|L511-S1}}
tcyy1i2lo7cxyc0dcvl190ub3ngxscm
খিস্তি
0
87960
509302
472720
2026-05-28T07:54:37Z
Snusho
9548
/* বাংলা */
509302
wikitext
text/x-wiki
== {{ভাষা|bn}} ==
=== উচ্চারণ ===
* {{bn-IPA}}
=== বিশেষ্য ===
{{bn-বিশেষ্য}}
# [[অমার্জিত]] ভাষায় [[গালাগাল]], [[ঝগড়া]], [[খেউড়]], খিস্তি-খেউড়, খিস্তি-খামারি।
cws8xpg3l7vfc6thg8vws5zqf1xd52x
মডিউল:headword/page
828
122077
509297
507759
2026-05-28T03:39:10Z
Redmin
6857
[[en:Module:headword/page]] থেকে হালনাগাদ করা হলো
509297
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local string_compare_module = "Module:string/compare"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_parser_module = "Module:template parser"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local concat = table.concat
local find = string.find
local format = string.format
local gsub = string.gsub
local insert = table.insert
local load_data = mw.loadData
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local require = require
local sub = string.sub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD
local ugsub = ustring.gsub
local function class_else_type(...)
class_else_type = require(template_parser_module).class_else_type
return class_else_type(...)
end
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function get_category(...)
get_category = require(maintenance_category_module).get_category
return get_category(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function parse(...)
parse = require(template_parser_module).parse
return parse(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function physical_to_logical_pagename_if_mammoth(...)
physical_to_logical_pagename_if_mammoth = require(pages_module).physical_to_logical_pagename_if_mammoth
return physical_to_logical_pagename_if_mammoth(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function string_compare(...)
string_compare = require(string_compare_module)
return string_compare(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local langnames
local function get_langnames()
langnames, get_langnames = load_data("Module:languages/canonical names"), nil
return langnames
end
-- Combining character data used when categorising unusual characters. These resolve into two patterns, used to find
-- single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character +
-- diacritic(s) + character).
-- Charsets are in the format used by Unicode's UnicodeSet tool: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp.
-- Single combining characters.
-- Charset: [[:M:]&[:^Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
-- Note: concatenating hundreds of lines at once gives an error, so () are used every 150 lines to break it up into chunks.
local comb_chars_single =
("\204\128-\205\142" .. -- U+0300-U+034E
"\205\144-\205\155" .. -- U+0350-U+035B
"\205\163-\205\175" .. -- U+0363-U+036F
"\210\131-\210\137" .. -- U+0483-U+0489
"\214\145-\214\189" .. -- U+0591-U+05BD
"\214\191" .. -- U+05BF
"\215\129" .. -- U+05C1
"\215\130" .. -- U+05C2
"\215\132" .. -- U+05C4
"\215\133" .. -- U+05C5
"\215\135" .. -- U+05C7
"\216\144-\216\154" .. -- U+0610-U+061A
"\217\139-\217\159" .. -- U+064B-U+065F
"\217\176" .. -- U+0670
"\219\150-\219\156" .. -- U+06D6-U+06DC
"\219\159-\219\164" .. -- U+06DF-U+06E4
"\219\167" .. -- U+06E7
"\219\168" .. -- U+06E8
"\219\170-\219\173" .. -- U+06EA-U+06ED
"\220\145" .. -- U+0711
"\220\176-\221\138" .. -- U+0730-U+074A
"\222\166-\222\176" .. -- U+07A6-U+07B0
"\223\171-\223\179" .. -- U+07EB-U+07F3
"\223\189" .. -- U+07FD
"\224\160\150-\224\160\153" .. -- U+0816-U+0819
"\224\160\155-\224\160\163" .. -- U+081B-U+0823
"\224\160\165-\224\160\167" .. -- U+0825-U+0827
"\224\160\169-\224\160\173" .. -- U+0829-U+082D
"\224\161\153-\224\161\155" .. -- U+0859-U+085B
"\224\162\151-\224\162\159" .. -- U+0897-U+089F
"\224\163\138-\224\163\161" .. -- U+08CA-U+08E1
"\224\163\163-\224\164\131" .. -- U+08E3-U+0903
"\224\164\186-\224\164\188" .. -- U+093A-U+093C
"\224\164\190-\224\165\143" .. -- U+093E-U+094F
"\224\165\145-\224\165\151" .. -- U+0951-U+0957
"\224\165\162" .. -- U+0962
"\224\165\163" .. -- U+0963
"\224\166\129-\224\166\131" .. -- U+0981-U+0983
"\224\166\188" .. -- U+09BC
"\224\166\190-\224\167\132" .. -- U+09BE-U+09C4
"\224\167\135" .. -- U+09C7
"\224\167\136" .. -- U+09C8
"\224\167\139-\224\167\141" .. -- U+09CB-U+09CD
"\224\167\151" .. -- U+09D7
"\224\167\162" .. -- U+09E2
"\224\167\163" .. -- U+09E3
"\224\167\190" .. -- U+09FE
"\224\168\129-\224\168\131" .. -- U+0A01-U+0A03
"\224\168\188" .. -- U+0A3C
"\224\168\190-\224\169\130" .. -- U+0A3E-U+0A42
"\224\169\135" .. -- U+0A47
"\224\169\136" .. -- U+0A48
"\224\169\139-\224\169\141" .. -- U+0A4B-U+0A4D
"\224\169\145" .. -- U+0A51
"\224\169\176" .. -- U+0A70
"\224\169\177" .. -- U+0A71
"\224\169\181" .. -- U+0A75
"\224\170\129-\224\170\131" .. -- U+0A81-U+0A83
"\224\170\188" .. -- U+0ABC
"\224\170\190-\224\171\133" .. -- U+0ABE-U+0AC5
"\224\171\135-\224\171\137" .. -- U+0AC7-U+0AC9
"\224\171\139-\224\171\141" .. -- U+0ACB-U+0ACD
"\224\171\162" .. -- U+0AE2
"\224\171\163" .. -- U+0AE3
"\224\171\186-\224\171\191" .. -- U+0AFA-U+0AFF
"\224\172\129-\224\172\131" .. -- U+0B01-U+0B03
"\224\172\188" .. -- U+0B3C
"\224\172\190-\224\173\132" .. -- U+0B3E-U+0B44
"\224\173\135" .. -- U+0B47
"\224\173\136" .. -- U+0B48
"\224\173\139-\224\173\141" .. -- U+0B4B-U+0B4D
"\224\173\149-\224\173\151" .. -- U+0B55-U+0B57
"\224\173\162" .. -- U+0B62
"\224\173\163" .. -- U+0B63
"\224\174\130" .. -- U+0B82
"\224\174\190-\224\175\130" .. -- U+0BBE-U+0BC2
"\224\175\134-\224\175\136" .. -- U+0BC6-U+0BC8
"\224\175\138-\224\175\141" .. -- U+0BCA-U+0BCD
"\224\175\151" .. -- U+0BD7
"\224\176\128-\224\176\132" .. -- U+0C00-U+0C04
"\224\176\188" .. -- U+0C3C
"\224\176\190-\224\177\132" .. -- U+0C3E-U+0C44
"\224\177\134-\224\177\136" .. -- U+0C46-U+0C48
"\224\177\138-\224\177\141" .. -- U+0C4A-U+0C4D
"\224\177\149" .. -- U+0C55
"\224\177\150" .. -- U+0C56
"\224\177\162" .. -- U+0C62
"\224\177\163" .. -- U+0C63
"\224\178\129-\224\178\131" .. -- U+0C81-U+0C83
"\224\178\188" .. -- U+0CBC
"\224\178\190-\224\179\132" .. -- U+0CBE-U+0CC4
"\224\179\134-\224\179\136" .. -- U+0CC6-U+0CC8
"\224\179\138-\224\179\141" .. -- U+0CCA-U+0CCD
"\224\179\149" .. -- U+0CD5
"\224\179\150" .. -- U+0CD6
"\224\179\162" .. -- U+0CE2
"\224\179\163" .. -- U+0CE3
"\224\179\179" .. -- U+0CF3
"\224\180\128-\224\180\131" .. -- U+0D00-U+0D03
"\224\180\187" .. -- U+0D3B
"\224\180\188" .. -- U+0D3C
"\224\180\190-\224\181\132" .. -- U+0D3E-U+0D44
"\224\181\134-\224\181\136" .. -- U+0D46-U+0D48
"\224\181\138-\224\181\141" .. -- U+0D4A-U+0D4D
"\224\181\151" .. -- U+0D57
"\224\181\162" .. -- U+0D62
"\224\181\163" .. -- U+0D63
"\224\182\129-\224\182\131" .. -- U+0D81-U+0D83
"\224\183\138" .. -- U+0DCA
"\224\183\143-\224\183\148" .. -- U+0DCF-U+0DD4
"\224\183\150" .. -- U+0DD6
"\224\183\152-\224\183\159" .. -- U+0DD8-U+0DDF
"\224\183\178" .. -- U+0DF2
"\224\183\179" .. -- U+0DF3
"\224\184\177" .. -- U+0E31
"\224\184\180-\224\184\186" .. -- U+0E34-U+0E3A
"\224\185\135-\224\185\142" .. -- U+0E47-U+0E4E
"\224\186\177" .. -- U+0EB1
"\224\186\180-\224\186\188" .. -- U+0EB4-U+0EBC
"\224\187\136-\224\187\142" .. -- U+0EC8-U+0ECE
"\224\188\152" .. -- U+0F18
"\224\188\153" .. -- U+0F19
"\224\188\181" .. -- U+0F35
"\224\188\183" .. -- U+0F37
"\224\188\185" .. -- U+0F39
"\224\188\190" .. -- U+0F3E
"\224\188\191" .. -- U+0F3F
"\224\189\177-\224\190\132" .. -- U+0F71-U+0F84
"\224\190\134" .. -- U+0F86
"\224\190\135" .. -- U+0F87
"\224\190\141-\224\190\151" .. -- U+0F8D-U+0F97
"\224\190\153-\224\190\188" .. -- U+0F99-U+0FBC
"\224\191\134" .. -- U+0FC6
"\225\128\171-\225\128\190" .. -- U+102B-U+103E
"\225\129\150-\225\129\153" .. -- U+1056-U+1059
"\225\129\158-\225\129\160" .. -- U+105E-U+1060
"\225\129\162-\225\129\164" .. -- U+1062-U+1064
"\225\129\167-\225\129\173" .. -- U+1067-U+106D
"\225\129\177-\225\129\180" .. -- U+1071-U+1074
"\225\130\130-\225\130\141" .. -- U+1082-U+108D
"\225\130\143" .. -- U+108F
"\225\130\154-\225\130\157" .. -- U+109A-U+109D
"\225\141\157-\225\141\159" .. -- U+135D-U+135F
"\225\156\146-\225\156\149" .. -- U+1712-U+1715
"\225\156\178-\225\156\180" .. -- U+1732-U+1734
"\225\157\146" .. -- U+1752
"\225\157\147" .. -- U+1753
"\225\157\178" .. -- U+1772
"\225\157\179" .. -- U+1773
"\225\158\180-\225\159\147") .. -- U+17B4-U+17D3
("\225\159\157" .. -- U+17DD
"\225\162\133" .. -- U+1885
"\225\162\134" .. -- U+1886
"\225\162\169" .. -- U+18A9
"\225\164\160-\225\164\171" .. -- U+1920-U+192B
"\225\164\176-\225\164\187" .. -- U+1930-U+193B
"\225\168\151-\225\168\155" .. -- U+1A17-U+1A1B
"\225\169\149-\225\169\158" .. -- U+1A55-U+1A5E
"\225\169\160-\225\169\188" .. -- U+1A60-U+1A7C
"\225\169\191" .. -- U+1A7F
"\225\170\176-\225\171\142" .. -- U+1AB0-U+1ACE
"\225\172\128-\225\172\132" .. -- U+1B00-U+1B04
"\225\172\180-\225\173\132" .. -- U+1B34-U+1B44
"\225\173\171-\225\173\179" .. -- U+1B6B-U+1B73
"\225\174\128-\225\174\130" .. -- U+1B80-U+1B82
"\225\174\161-\225\174\173" .. -- U+1BA1-U+1BAD
"\225\175\166-\225\175\179" .. -- U+1BE6-U+1BF3
"\225\176\164-\225\176\183" .. -- U+1C24-U+1C37
"\225\179\144-\225\179\146" .. -- U+1CD0-U+1CD2
"\225\179\148-\225\179\168" .. -- U+1CD4-U+1CE8
"\225\179\173" .. -- U+1CED
"\225\179\180" .. -- U+1CF4
"\225\179\183-\225\179\185" .. -- U+1CF7-U+1CF9
"\225\183\128-\225\183\140" .. -- U+1DC0-U+1DCC
"\225\183\142-\225\183\187" .. -- U+1DCE-U+1DFB
"\225\183\189-\225\183\191" .. -- U+1DFD-U+1DFF
"\226\131\144-\226\131\176" .. -- U+20D0-U+20F0
"\226\179\175-\226\179\177" .. -- U+2CEF-U+2CF1
"\226\181\191" .. -- U+2D7F
"\226\183\160-\226\183\191" .. -- U+2DE0-U+2DFF
"\227\128\170-\227\128\175" .. -- U+302A-U+302F
"\227\130\153" .. -- U+3099
"\227\130\154" .. -- U+309A
"\234\153\175-\234\153\178" .. -- U+A66F-U+A672
"\234\153\180-\234\153\189" .. -- U+A674-U+A67D
"\234\154\158" .. -- U+A69E
"\234\154\159" .. -- U+A69F
"\234\155\176" .. -- U+A6F0
"\234\155\177" .. -- U+A6F1
"\234\160\130" .. -- U+A802
"\234\160\134" .. -- U+A806
"\234\160\139" .. -- U+A80B
"\234\160\163-\234\160\167" .. -- U+A823-U+A827
"\234\160\172" .. -- U+A82C
"\234\162\128" .. -- U+A880
"\234\162\129" .. -- U+A881
"\234\162\180-\234\163\133" .. -- U+A8B4-U+A8C5
"\234\163\160-\234\163\177" .. -- U+A8E0-U+A8F1
"\234\163\191" .. -- U+A8FF
"\234\164\166-\234\164\173" .. -- U+A926-U+A92D
"\234\165\135-\234\165\147" .. -- U+A947-U+A953
"\234\166\128-\234\166\131" .. -- U+A980-U+A983
"\234\166\179-\234\167\128" .. -- U+A9B3-U+A9C0
"\234\167\165" .. -- U+A9E5
"\234\168\169-\234\168\182" .. -- U+AA29-U+AA36
"\234\169\131" .. -- U+AA43
"\234\169\140" .. -- U+AA4C
"\234\169\141" .. -- U+AA4D
"\234\169\187-\234\169\189" .. -- U+AA7B-U+AA7D
"\234\170\176" .. -- U+AAB0
"\234\170\178-\234\170\180" .. -- U+AAB2-U+AAB4
"\234\170\183" .. -- U+AAB7
"\234\170\184" .. -- U+AAB8
"\234\170\190" .. -- U+AABE
"\234\170\191" .. -- U+AABF
"\234\171\129" .. -- U+AAC1
"\234\171\171-\234\171\175" .. -- U+AAEB-U+AAEF
"\234\171\181" .. -- U+AAF5
"\234\171\182" .. -- U+AAF6
"\234\175\163-\234\175\170" .. -- U+ABE3-U+ABEA
"\234\175\172" .. -- U+ABEC
"\234\175\173" .. -- U+ABED
"\239\172\158" .. -- U+FB1E
"\239\184\160-\239\184\175" .. -- U+FE20-U+FE2F
"\240\144\135\189" .. -- U+101FD
"\240\144\139\160" .. -- U+102E0
"\240\144\141\182-\240\144\141\186" .. -- U+10376-U+1037A
"\240\144\168\129-\240\144\168\131" .. -- U+10A01-U+10A03
"\240\144\168\133" .. -- U+10A05
"\240\144\168\134" .. -- U+10A06
"\240\144\168\140-\240\144\168\143" .. -- U+10A0C-U+10A0F
"\240\144\168\184-\240\144\168\186" .. -- U+10A38-U+10A3A
"\240\144\168\191" .. -- U+10A3F
"\240\144\171\165" .. -- U+10AE5
"\240\144\171\166" .. -- U+10AE6
"\240\144\180\164-\240\144\180\167" .. -- U+10D24-U+10D27
"\240\144\181\169-\240\144\181\173" .. -- U+10D69-U+10D6D
"\240\144\186\171" .. -- U+10EAB
"\240\144\186\172" .. -- U+10EAC
"\240\144\187\188-\240\144\187\191" .. -- U+10EFC-U+10EFF
"\240\144\189\134-\240\144\189\144" .. -- U+10F46-U+10F50
"\240\144\190\130-\240\144\190\133" .. -- U+10F82-U+10F85
"\240\145\128\128-\240\145\128\130" .. -- U+11000-U+11002
"\240\145\128\184-\240\145\129\134" .. -- U+11038-U+11046
"\240\145\129\176" .. -- U+11070
"\240\145\129\179" .. -- U+11073
"\240\145\129\180" .. -- U+11074
"\240\145\129\191-\240\145\130\130" .. -- U+1107F-U+11082
"\240\145\130\176-\240\145\130\186" .. -- U+110B0-U+110BA
"\240\145\131\130" .. -- U+110C2
"\240\145\132\128-\240\145\132\130" .. -- U+11100-U+11102
"\240\145\132\167-\240\145\132\180" .. -- U+11127-U+11134
"\240\145\133\133" .. -- U+11145
"\240\145\133\134" .. -- U+11146
"\240\145\133\179" .. -- U+11173
"\240\145\134\128-\240\145\134\130" .. -- U+11180-U+11182
"\240\145\134\179-\240\145\135\128" .. -- U+111B3-U+111C0
"\240\145\135\137-\240\145\135\140" .. -- U+111C9-U+111CC
"\240\145\135\142" .. -- U+111CE
"\240\145\135\143" .. -- U+111CF
"\240\145\136\172-\240\145\136\183" .. -- U+1122C-U+11237
"\240\145\136\190" .. -- U+1123E
"\240\145\137\129" .. -- U+11241
"\240\145\139\159-\240\145\139\170" .. -- U+112DF-U+112EA
"\240\145\140\128-\240\145\140\131" .. -- U+11300-U+11303
"\240\145\140\187" .. -- U+1133B
"\240\145\140\188" .. -- U+1133C
"\240\145\140\190-\240\145\141\132" .. -- U+1133E-U+11344
"\240\145\141\135" .. -- U+11347
"\240\145\141\136" .. -- U+11348
"\240\145\141\139-\240\145\141\141" .. -- U+1134B-U+1134D
"\240\145\141\151" .. -- U+11357
"\240\145\141\162" .. -- U+11362
"\240\145\141\163" .. -- U+11363
"\240\145\141\166-\240\145\141\172" .. -- U+11366-U+1136C
"\240\145\141\176-\240\145\141\180" .. -- U+11370-U+11374
"\240\145\142\184-\240\145\143\128" .. -- U+113B8-U+113C0
"\240\145\143\130" .. -- U+113C2
"\240\145\143\133" .. -- U+113C5
"\240\145\143\135-\240\145\143\138" .. -- U+113C7-U+113CA
"\240\145\143\140-\240\145\143\144" .. -- U+113CC-U+113D0
"\240\145\143\146" .. -- U+113D2
"\240\145\143\161" .. -- U+113E1
"\240\145\143\162" .. -- U+113E2
"\240\145\144\181-\240\145\145\134" .. -- U+11435-U+11446
"\240\145\145\158" .. -- U+1145E
"\240\145\146\176-\240\145\147\131" .. -- U+114B0-U+114C3
"\240\145\150\175-\240\145\150\181" .. -- U+115AF-U+115B5
"\240\145\150\184-\240\145\151\128" .. -- U+115B8-U+115C0
"\240\145\151\156" .. -- U+115DC
"\240\145\151\157" .. -- U+115DD
"\240\145\152\176-\240\145\153\128" .. -- U+11630-U+11640
"\240\145\154\171-\240\145\154\183" .. -- U+116AB-U+116B7
"\240\145\156\157-\240\145\156\171" .. -- U+1171D-U+1172B
"\240\145\160\172-\240\145\160\186" .. -- U+1182C-U+1183A
"\240\145\164\176-\240\145\164\181" .. -- U+11930-U+11935
"\240\145\164\183" .. -- U+11937
"\240\145\164\184" .. -- U+11938
"\240\145\164\187-\240\145\164\190" .. -- U+1193B-U+1193E
"\240\145\165\128") .. -- U+11940
("\240\145\165\130" .. -- U+11942
"\240\145\165\131" .. -- U+11943
"\240\145\167\145-\240\145\167\151" .. -- U+119D1-U+119D7
"\240\145\167\154-\240\145\167\160" .. -- U+119DA-U+119E0
"\240\145\167\164" .. -- U+119E4
"\240\145\168\129-\240\145\168\138" .. -- U+11A01-U+11A0A
"\240\145\168\179-\240\145\168\185" .. -- U+11A33-U+11A39
"\240\145\168\187-\240\145\168\190" .. -- U+11A3B-U+11A3E
"\240\145\169\135" .. -- U+11A47
"\240\145\169\145-\240\145\169\155" .. -- U+11A51-U+11A5B
"\240\145\170\138-\240\145\170\153" .. -- U+11A8A-U+11A99
"\240\145\176\175-\240\145\176\182" .. -- U+11C2F-U+11C36
"\240\145\176\184-\240\145\176\191" .. -- U+11C38-U+11C3F
"\240\145\178\146-\240\145\178\167" .. -- U+11C92-U+11CA7
"\240\145\178\169-\240\145\178\182" .. -- U+11CA9-U+11CB6
"\240\145\180\177-\240\145\180\182" .. -- U+11D31-U+11D36
"\240\145\180\186" .. -- U+11D3A
"\240\145\180\188" .. -- U+11D3C
"\240\145\180\189" .. -- U+11D3D
"\240\145\180\191-\240\145\181\133" .. -- U+11D3F-U+11D45
"\240\145\181\135" .. -- U+11D47
"\240\145\182\138-\240\145\182\142" .. -- U+11D8A-U+11D8E
"\240\145\182\144" .. -- U+11D90
"\240\145\182\145" .. -- U+11D91
"\240\145\182\147-\240\145\182\151" .. -- U+11D93-U+11D97
"\240\145\187\179-\240\145\187\182" .. -- U+11EF3-U+11EF6
"\240\145\188\128" .. -- U+11F00
"\240\145\188\129" .. -- U+11F01
"\240\145\188\131" .. -- U+11F03
"\240\145\188\180-\240\145\188\186" .. -- U+11F34-U+11F3A
"\240\145\188\190-\240\145\189\130" .. -- U+11F3E-U+11F42
"\240\145\189\154" .. -- U+11F5A
"\240\147\145\128" .. -- U+13440
"\240\147\145\135-\240\147\145\149" .. -- U+13447-U+13455
"\240\150\132\158-\240\150\132\175" .. -- U+1611E-U+1612F
"\240\150\171\176-\240\150\171\180" .. -- U+16AF0-U+16AF4
"\240\150\172\176-\240\150\172\182" .. -- U+16B30-U+16B36
"\240\150\189\143" .. -- U+16F4F
"\240\150\189\145-\240\150\190\135" .. -- U+16F51-U+16F87
"\240\150\190\143-\240\150\190\146" .. -- U+16F8F-U+16F92
"\240\150\191\164" .. -- U+16FE4
"\240\150\191\176" .. -- U+16FF0
"\240\150\191\177" .. -- U+16FF1
"\240\155\178\157" .. -- U+1BC9D
"\240\155\178\158" .. -- U+1BC9E
"\240\156\188\128-\240\156\188\173" .. -- U+1CF00-U+1CF2D
"\240\156\188\176-\240\156\189\134" .. -- U+1CF30-U+1CF46
"\240\157\133\165-\240\157\133\169" .. -- U+1D165-U+1D169
"\240\157\133\173-\240\157\133\178" .. -- U+1D16D-U+1D172
"\240\157\133\187-\240\157\134\130" .. -- U+1D17B-U+1D182
"\240\157\134\133-\240\157\134\139" .. -- U+1D185-U+1D18B
"\240\157\134\170-\240\157\134\173" .. -- U+1D1AA-U+1D1AD
"\240\157\137\130-\240\157\137\132" .. -- U+1D242-U+1D244
"\240\157\168\128-\240\157\168\182" .. -- U+1DA00-U+1DA36
"\240\157\168\187-\240\157\169\172" .. -- U+1DA3B-U+1DA6C
"\240\157\169\181" .. -- U+1DA75
"\240\157\170\132" .. -- U+1DA84
"\240\157\170\155-\240\157\170\159" .. -- U+1DA9B-U+1DA9F
"\240\157\170\161-\240\157\170\175" .. -- U+1DAA1-U+1DAAF
"\240\158\128\128-\240\158\128\134" .. -- U+1E000-U+1E006
"\240\158\128\136-\240\158\128\152" .. -- U+1E008-U+1E018
"\240\158\128\155-\240\158\128\161" .. -- U+1E01B-U+1E021
"\240\158\128\163" .. -- U+1E023
"\240\158\128\164" .. -- U+1E024
"\240\158\128\166-\240\158\128\170" .. -- U+1E026-U+1E02A
"\240\158\130\143" .. -- U+1E08F
"\240\158\132\176-\240\158\132\182" .. -- U+1E130-U+1E136
"\240\158\138\174" .. -- U+1E2AE
"\240\158\139\172-\240\158\139\175" .. -- U+1E2EC-U+1E2EF
"\240\158\147\172-\240\158\147\175" .. -- U+1E4EC-U+1E4EF
"\240\158\151\174" .. -- U+1E5EE
"\240\158\151\175" .. -- U+1E5EF
"\240\158\163\144-\240\158\163\150" .. -- U+1E8D0-U+1E8D6
"\240\158\165\132-\240\158\165\138") -- U+1E944-U+1E94A
-- Double combining characters.
-- Charset: [[:M:]&[:Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
local comb_chars_double =
"\205\156-\205\162" .. -- U+035C-U+0362
"\225\183\141" .. -- U+1DCD
"\225\183\188" -- U+1DFC
-- Variation selectors etc.; separated out so that we don't get categories for them.
-- Charset: [[:M:]&[[:subhead=Grapheme joiner:][:Variation_Selector=Yes:]]].
local comb_chars_other =
"\205\143" .. -- U+034F
"\225\160\139-\225\160\141" .. -- U+180B-U+180D
"\225\160\143" .. -- U+180F
"\239\184\128-\239\184\143" .. -- U+FE00-U+FE0F
"\243\160\132\128-\243\160\135\175" -- U+E0100-U+E01EF
local comb_chars_all = comb_chars_single .. comb_chars_double .. comb_chars_other
local comb_chars = {
combined_single = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]+%f[^" .. comb_chars_all .. "]",
combined_double = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]*[" .. comb_chars_double .. "]+[" .. comb_chars_all .. "]*.[" .. comb_chars_single .. comb_chars_other .. "]*",
diacritics_single = "[" .. comb_chars_single .. "]",
diacritics_double = "[" .. comb_chars_double .. "]",
diacritics_all = "[" .. comb_chars_all .. "]"
}
-- Somewhat curated list from https://unicode.org/Public/emoji/16.0/emoji-sequences.txt.
-- NOTE: There are lots more emoji sequences involving non-emoji Plane 0 symbols followed by 0xFE0F, which we don't
-- (yet?) handle.
local emoji_chars =
"\226\140\154" .. -- U+231A (⌚)
"\226\140\155" .. -- U+231B (⌛)
"\226\140\168" .. -- U+2328 (⌨)
"\226\143\143" .. -- U+23CF (⏏)
"\226\143\169-\226\143\179" .. -- U+23E9-U+23F3 (⏩-⏳)
"\226\143\184-\226\143\186" .. -- U+23F8-U+23FA (⏸-⏺)
"\226\150\170" .. -- U+25AA (▪)
"\226\150\171" .. -- U+25AB (▫)
"\226\150\182" .. -- U+25B6 (▶)
"\226\151\128" .. -- U+25C0 (◀)
"\226\151\187-\226\151\190" .. -- U+25FB-U+25FE (◻-◾)
"\226\152\128-\226\152\132" .. -- U+2600-U+2604 (☀-☄)
"\226\152\142" .. -- U+260E (☎)
"\226\152\145" .. -- U+2611 (☑)
"\226\152\148" .. -- U+2614 (☔)
"\226\152\149" .. -- U+2615 (☕)
"\226\152\152" .. -- U+2618 (☘)
"\226\152\157" .. -- U+261D (☝)
"\226\152\160" .. -- U+2620 (☠)
"\226\152\162" .. -- U+2622 (☢)
"\226\152\163" .. -- U+2623 (☣)
"\226\152\166" .. -- U+2626 (☦)
"\226\152\170" .. -- U+262A (☪)
"\226\152\174" .. -- U+262E (☮)
"\226\152\175" .. -- U+262F (☯)
"\226\152\184-\226\152\186" .. -- U+2638-U+263A (☸-☺)
"\226\153\136-\226\153\147" .. -- U+2648-U+2653 (♈-♓)
"\226\153\159" .. -- U+265F (♟)
"\226\153\160" .. -- U+2660 (♠)
"\226\153\163" .. -- U+2663 (♣)
"\226\153\165" .. -- U+2665 (♥)
"\226\153\166" .. -- U+2666 (♦)
"\226\153\168" .. -- U+2668 (♨)
"\226\153\187" .. -- U+267B (♻)
"\226\153\190" .. -- U+267E (♾)
"\226\153\191" .. -- U+267F (♿)
"\226\154\146-\226\154\151" .. -- U+2692-U+2697 (⚒-⚗)
"\226\154\153" .. -- U+2699 (⚙)
"\226\154\155" .. -- U+269B (⚛)
"\226\154\156" .. -- U+269C (⚜)
"\226\154\160" .. -- U+26A0 (⚠)
"\226\154\161" .. -- U+26A1 (⚡)
"\226\154\170" .. -- U+26AA (⚪)
"\226\154\171" .. -- U+26AB (⚫)
"\226\154\176" .. -- U+26B0 (⚰)
"\226\154\177" .. -- U+26B1 (⚱)
"\226\154\189" .. -- U+26BD (⚽)
"\226\154\190" .. -- U+26BE (⚾)
"\226\155\132" .. -- U+26C4 (⛄)
"\226\155\133" .. -- U+26C5 (⛅)
"\226\155\136" .. -- U+26C8 (⛈)
"\226\155\142" .. -- U+26CE (⛎)
"\226\155\143" .. -- U+26CF (⛏)
"\226\155\145" .. -- U+26D1 (⛑)
"\226\155\147" .. -- U+26D3 (⛓)
"\226\155\148" .. -- U+26D4 (⛔)
"\226\155\169" .. -- U+26E9 (⛩)
"\226\155\170" .. -- U+26EA (⛪)
"\226\155\176-\226\155\181" .. -- U+26F0-U+26F5 (⛰-⛵)
"\226\155\183-\226\155\186" .. -- U+26F7-U+26FA (⛷-⛺)
"\226\155\189" .. -- U+26FD (⛽)
"\226\156\130" .. -- U+2702 (✂)
"\226\156\133" .. -- U+2705 (✅)
"\226\156\136-\226\156\141" .. -- U+2708-U+270D (✈-✍)
"\226\156\143" .. -- U+270F (✏)
"\226\156\146" .. -- U+2712 (✒)
"\226\156\148" .. -- U+2714 (✔)
"\226\156\150" .. -- U+2716 (✖)
"\226\156\157" .. -- U+271D (✝)
"\226\156\161" .. -- U+2721 (✡)
"\226\156\168" .. -- U+2728 (✨)
"\226\156\179" .. -- U+2733 (✳)
"\226\156\180" .. -- U+2734 (✴)
"\226\157\132" .. -- U+2744 (❄)
"\226\157\135" .. -- U+2747 (❇)
"\226\157\140" .. -- U+274C (❌)
"\226\157\142" .. -- U+274E (❎)
"\226\157\147-\226\157\149" .. -- U+2753-U+2755 (❓-❕)
"\226\157\151" .. -- U+2757 (❗)
"\226\157\163" .. -- U+2763 (❣)
"\226\157\164" .. -- U+2764 (❤)
"\226\158\149-\226\158\151" .. -- U+2795-U+2797 (➕-➗)
"\226\158\161" .. -- U+27A1 (➡)
"\226\158\176" .. -- U+27B0 (➰)
"\226\158\191" .. -- U+27BF (➿)
"\226\164\180" .. -- U+2934 (⤴)
"\226\164\181" .. -- U+2935 (⤵)
"\226\172\133-\226\172\135" .. -- U+2B05-U+2B07 (⬅-⬇)
"\226\172\155" .. -- U+2B1B (⬛)
"\226\172\156" .. -- U+2B1C (⬜)
"\226\173\144" .. -- U+2B50 (⭐)
"\226\173\149" .. -- U+2B55 (⭕)
"\227\128\176" .. -- U+3030 (〰)
"\227\128\189" .. -- U+303D (〽)
"\227\138\151" .. -- U+3297 (㊗)
"\227\138\153" .. -- U+3299 (㊙)
"\240\159\128\132" .. -- U+1F004 (🀄)
"\240\159\131\143" .. -- U+1F0CF (🃏)
"\240\159\133\176" .. -- U+1F170 (🅰)
"\240\159\133\177" .. -- U+1F171 (🅱)
"\240\159\133\190" .. -- U+1F17E (🅾)
"\240\159\133\191" .. -- U+1F17F (🅿)
"\240\159\134\142" .. -- U+1F18E (🆎)
"\240\159\134\145-\240\159\134\154" .. -- U+1F191-U+1F19A (🆑-🆚)
"\240\159\136\129" .. -- U+1F201 (🈁)
"\240\159\136\130" .. -- U+1F202 (🈂)
"\240\159\136\154" .. -- U+1F21A (🈚)
"\240\159\136\175" .. -- U+1F22F (🈯)
"\240\159\136\178-\240\159\136\186" .. -- U+1F232-U+1F23A (🈲-🈺)
"\240\159\137\144" .. -- U+1F250 (🉐)
"\240\159\137\145" .. -- U+1F251 (🉑)
"\240\159\140\128-\240\159\153\143" .. -- U+1F300-U+1F64F (🌀-🙏)
"\240\159\154\128-\240\159\155\151" .. -- U+1F680-U+1F6D7 (🚀-🛗)
"\240\159\155\156-\240\159\155\172" .. -- U+1F6DC-U+1F6EC (🛜-🛬)
"\240\159\155\176-\240\159\155\188" .. -- U+1F6F0-U+1F6FC (🛰-🛼)
"\240\159\159\160-\240\159\159\171" .. -- U+1F7E0-U+1F7EB (🟠-🟫)
"\240\159\159\176" .. -- U+1F7F0 (🟰)
"\240\159\164\140-\240\159\169\147" .. -- U+1F90C-U+1FA53 (🤌-🩓)
"\240\159\169\160-\240\159\169\173" .. -- U+1FA60-U+1FA6D (🩠-🩭)
"\240\159\169\176-\240\159\169\188" .. -- U+1FA70-U+1FA7C (🩰-🩼)
"\240\159\170\128-\240\159\170\137" .. -- U+1FA80-U+1FA89 (🪀-)
"\240\159\170\143-\240\159\171\134" .. -- U+1FA8F-U+1FAC6 (-)
"\240\159\171\142-\240\159\171\156" .. -- U+1FACE-U+1FADC (🫎-)
"\240\159\171\159-\240\159\171\169" .. -- U+1FADF-U+1FAE9 (-)
"\240\159\171\176-\240\159\171\184" -- U+1FAF0-U+1FAF8 (🫰-🫸)
local unsupported_characters
local function get_unsupported_characters()
unsupported_characters, get_unsupported_characters = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_characters) do
unsupported_characters[v] = k
end
return unsupported_characters
end
-- The list of unsupported titles and invert it (so the keys are pagenames and values are canonical titles).
local unsupported_titles
local function get_unsupported_titles()
unsupported_titles, get_unsupported_titles = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_titles) do
unsupported_titles[v] = k
end
return unsupported_titles
end
-- To save on memory, we only cache names with either non-ASCII characters in them or ASCII characters to be removed or
-- transformed (apostrophe, double quote, hyphen).
local L2_sort_key_cache = {}
function export.get_L2_sort_key(L2)
if L2 == "Translingual" then
return "\1"
elseif L2 == "English" then
return "\2"
elseif match(L2, "^[%z\1-\b\14-!#-&(-,.-\127]+$") then
return L2
end
local sort_key = L2_sort_key_cache[L2]
if sort_key then
return sort_key
end
sort_key = toNFC(ugsub(ugsub(toNFD(L2), "[" .. comb_chars_all .. "'\"ʻʼ]+", ""), "[%s%-]+", " "))
L2_sort_key_cache[L2] = sort_key
return sort_key
end
--[==[
Given a pagename (or {nil} for the current page), create and return a data structure describing the page. The returned
object includes the following fields:
* `comb_chars`: A table containing various Lua character class patterns for different types of combined characters
(those that decompose into multiple characters in the NFD decomposition). The patterns are meant to be used with
{mw.ustring.find()}. The keys are:
** `single`: Single combining characters (character + diacritic), without surrounding brackets;
** `double`: Double combining characters (character + diacritic + character), without surrounding brackets;
** `vs`: Variation selectors, without surrounding brackets;
** `all`: Concatenation of `single` + `double` + `vs`, without surrounding brackets;
** `diacritics_single`: Like `single` but with surrounding brackets;
** `diacritics_double`: Like `double` but with surrounding brackets;
** `diacritics_all`: Like `all` but with surrounding brackets;
** `combined_single`: Lua pattern for matching a spacing character followed by one or more single combining characters;
** `combined_double`: Lua pattern for matching a combination of two spacing characters separated by one or more double
combining characters, possibly also with single combining characters;
* `emoji_pattern`: A Lua character class pattern (including surrounding brackets) that matches emojis. Meant to be used
with {mw.ustring.find()}.
* `L2_list`: Ordered list of L2 headings on the page, with the extra key `n` that gives the length of the list.
* `L2_sections`: Lookup table of L2 headings on the page, where the key is the section number assigned by the preprocessor, and the value is the L2 heading name. Once an invocation has got its actual section number from get_current_L2 in [[Module:pages]], it can use this table to determine its parent L2. TODO: We could expand this to include subsections, to check POS headings are correct etc.
* `unsupported_titles`: Map from pagenames to canonical titles for unsupported-title pages.
* `namespace`: Namespace of the pagename.
* `ns`: Namespace table for the page from mw.site.namespaces (TODO: merge with `namespace` above).
* `full_raw_pagename`: Full version of the '''RAW''' pagename (i.e. unsupported-title pages aren't canonicalized);
including the namespace and the base (portion before the slash).
* `pagename`: Canonicalized subpage portion of the pagename (unsupported-title pages are canonicalized).
* `pagename_with_base`: Same as `pagename` in the main namespace; otherwise, the whole pagename without the namespace.
* `decompose_pagename`: Equivalent of `pagename` in NFD decomposition.
* `pagename_len`: Length of `pagename` in Unicode chars, where combinations of spacing character + decomposed diacritic
are treated as single characters.
* `explode_pagename`: Set of characters found in `pagename`. The keys are characters (where combinations of spacing
character + decomposed diacritic are treated as single characters).
* `encoded_pagename`: FIXME: Document me.
* `pagename_defaultsort`: FIXME: Document me.
* `raw_defaultsort`: FIXME: Document me.
* `wikitext_topic_cat`: FIXME: Document me.
* `wikitext_langname_cat`: FIXME: Document me.
`no_fetch_content` says to not fetch and parse the content or set a DEFAULTSORT sort key, in order to save time on
test and documentation pages that have lots of template invocations that set `|pagename=`. It turns out nearly all the
time of this function is contained in the line `frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)`,
so we skip it on test and documentation pages where it accomplishes nothing in any case.
]==]
function export.process_page(pagename, no_fetch_content)
local data = {
comb_chars = comb_chars,
emoji_pattern = "[" .. emoji_chars .. "]",
unsupported_titles = unsupported_titles or get_unsupported_titles()
}
local cats = {}
data.cats = cats
-- We cannot store `raw_title` in `data` because it contains a metatable.
local raw_title
local function bad_pagename()
if not pagename then
error("Internal error: Something wrong, `data.pagename` not specified but current title contains illegal characters")
else
error(format("Bad value for `data.pagename`: '%s', which must not contain illegal characters", pagename))
end
end
if pagename then -- for testing, doc pages, etc.
raw_title = new_title(pagename)
if not raw_title then
bad_pagename()
end
else
raw_title = mw.title.getCurrentTitle()
end
local nsText = raw_title.nsText
local namespace_is_reconstruction = nsText == "Reconstruction"
data.namespace = nsText
data.ns = mw.site.namespaces[raw_title.namespace]
local full_raw_pagename = raw_title.fullText
data.full_raw_pagename = full_raw_pagename
local frame = mw.getCurrentFrame()
-- WARNING: `content` may be nil, e.g. if we're substing a template like {{ja-new}} on a not-yet-created page
-- or if the module specifies the subpage as `data.pagename` (which many modules do) and we're in an Appendix
-- or other non-mainspace page. We used to make the latter an error but there are too many modules that do it,
-- and substing on a nonexistent page is totally legit, and we don't actually need to be able to access the
-- content of the page.
local content = not no_fetch_content and raw_title:getContent() or nil
-- Get the pagename.
pagename = physical_to_logical_pagename_if_mammoth(raw_title)
pagename = gsub(pagename, "^Unsupported titles/(.+)", function(m)
insert(cats, "Unsupported titles")
local title = (unsupported_titles or get_unsupported_titles())[m]
if title then
return title
end
-- Substitute pairs of "`". Those not used for escaping should be escaped as "`grave`", but might not be,
-- so if a pair don't form a match, the closing "`" should become the opening "`" of the next match attempt.
-- This has to be done manually, instead of using gsub.
local open_pos = find(m, "`")
if not open_pos then
return m
end
title = {sub(m, 1, open_pos - 1)}
while true do
local close_pos = find(m, "`", open_pos + 1)
if not close_pos then
-- Add "`" plus any remaining characters.
insert(title, sub(m, open_pos))
break
end
local escape = sub(m, open_pos, close_pos)
local ch = (unsupported_characters or get_unsupported_characters())[escape]
-- Match found, so substitute the character and move to the first "`" after the match if found, or
-- otherwise return.
if ch then
insert(title, ch)
local nxt_pos = close_pos + 1
open_pos = find(m, "`", nxt_pos)
-- Add any characters between the match and the next "`" or end.
if open_pos then
insert(title, sub(m, nxt_pos, open_pos - 1))
else
insert(title, sub(m, nxt_pos))
break
end
-- Match not found, so make the closing "`" the opening "`" of the next attempt.
else
-- Add the failed match, except for the closing "`".
insert(title, sub(m, open_pos, close_pos - 1))
open_pos = close_pos
end
end
return concat(title)
end)
-- Save pagename, as the local variable will be destructively modified.
data.pagename = pagename
if nsText == "" then
data.pagename_with_base = pagename
else
data.pagename_with_base = raw_title.text
end
-- Decompose the pagename in Unicode normalization form D.
data.decompose_pagename = toNFD(pagename)
-- Explode the current page name into a character table, taking decomposed combining characters into account.
local explode_pagename = {}
local pagename_len = 0
local function explode(char)
explode_pagename[char] = true
pagename_len = pagename_len + 1
return ""
end
pagename = ugsub(pagename, comb_chars.combined_double, explode)
pagename = gsub(ugsub(pagename, comb_chars.combined_single, explode), ".[\128-\191]*", explode)
data.explode_pagename = explode_pagename
data.pagename_len = pagename_len
-- Generate DEFAULTSORT.
data.encoded_pagename = encode_entities(data.pagename)
data.pagename_defaultsort = get_lang("mul"):makeSortKey(data.encoded_pagename)
if not no_fetch_content then
frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)
end
data.raw_defaultsort = uupper(raw_title.text)
-- Make `L2_list` and `L2_sections`, note raw wikitext use of {{DEFAULTSORT:}} and {{DISPLAYTITLE:}}, then add categories if any unwanted L1 headings are found, the L2 headings are in the wrong order, or they don't match a canonical language name.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
do
local L2_list, L2_list_len, L2_sections = {}, 0, {}
local prev, rc
local new_cats, L2_wrong_order = {}
local function handle_heading(heading)
local level = heading.level
if level > 2 then
return
end
local name = heading:get_name()
-- heading:get_name() will return nil if there are any newline characters in the preprocessed heading name (e.g. from an expanded template). In such cases, the preprocessor section count still increments (since it's calculated pre-expansion), but the heading will fail, so the L2 count shouldn't be incremented.
if name == nil then
return
end
L2_list_len = L2_list_len + 1
L2_list[L2_list_len] = name
L2_sections[heading.section] = name
-- Also add any L1s, since they terminate the preceding L2, but add a maintenance category since it's probably a mistake.
if level == 1 then
new_cats["Pages with unwanted L1 headings"] = true
end
-- Check the heading is in the right order.
-- FIXME: we need a more sophisticated sorting method which handles non-diacritic special characters (e.g. Magɨ).
if prev and not (
L2_wrong_order or
string_compare(export.get_L2_sort_key(prev), export.get_L2_sort_key(name))
) then
new_cats["Pages with language headings in the wrong order"] = true
L2_wrong_order = true
end
-- Check it's a canonical language name.
if not (langnames or get_langnames())[name] then
new_cats["Pages with nonstandard language headings"] = true
end
prev = name
end
local function handle_template(template)
-- Turn off redirect checking except in the Reconstruction namespace because the rc flag is only
-- used in the Reconstruction namespace and the other names are parser functions, which AFAIK can't
-- be redirected to.
local name = template:get_name(nil, not namespace_is_reconstruction and "no_redirect" or nil)
if name == "DEFAULTSORT:" then
new_cats["Pages with DEFAULTSORT conflicts"] = true
elseif name == "DISPLAYTITLE:" then
new_cats["Pages with DISPLAYTITLE conflicts"] = true
elseif name == "reconstructed" then
rc = true
end
end
if content then
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "heading" then
handle_heading(node)
elseif node_class == "template" then
handle_template(node)
elseif node_class == "parameter" then
new_cats["Pages with raw triple-brace template parameters"] = true
end
end
end
L2_list.n = L2_list_len
data.L2_list = L2_list
data.L2_sections = L2_sections
insert(cats, get_category("Pages with entries"))
insert(cats, get_category(format("Pages with %s entr%s", L2_list_len, L2_list_len == 1 and "y" or "ies")))
for cat in pairs(new_cats) do
insert(cats, get_category(cat))
end
if namespace_is_reconstruction and not rc then
local langname = match(full_raw_pagename, "^Reconstruction:([^/]+)/.")
if langname then
insert(cats, get_category(langname .. " entries missing Template:reconstructed"))
end
end
end
------ 4. Parse page for maintenance categories. ------
-- Use of tab characters.
if content and find(content, "\t", 1, true) then
insert(cats, get_category("Pages with tab characters"))
end
-- Unencoded character(s) in title.
local IDS = list_to_set{"⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "", "", "", "", ""}
for char in pairs(explode_pagename) do
if IDS[char] and char ~= data.pagename then
insert(cats, "Terms containing unencoded characters")
break
end
end
-- Raw wikitext use of a topic or langname category. Also check if any raw sortkeys have been used.
do
local wikitext_topic_cat = {}
local wikitext_langname_cat = {}
local raw_sortkey
-- If a raw sortkey has been found, add it to the relevant table.
-- If there's no table (or the index is just `true`), create one first.
local function add_cat_table(t, lang, sortkey)
local t_lang = t[lang]
if not sortkey then
if not t_lang then
t[lang] = true
end
return
elseif t_lang == true or not t_lang then
t_lang = {}
t[lang] = t_lang
end
t_lang[uupper(decode_entities(sortkey))] = true
end
local function process_category(content, cat, colon, nxt)
local pipe = find(cat, "|", colon + 1, true)
-- Categories cannot end "|]]".
if pipe == #cat then
return
end
local title = new_title(pipe and sub(cat, 1, pipe - 1) or cat)
if not (title and title.namespace == 14) then
return
end
-- Get the sortkey (if any), then canonicalize category title.
local sortkey = pipe and sub(cat, pipe + 1) or nil
cat = title.text
if sortkey then
raw_sortkey = true
-- If the sortkey contains "[", the first "]" of a final "]]]" is treated as part of the sortkey.
if find(sortkey, "[", 1, true) and sub(content, nxt, nxt) == "]" then
sortkey = sortkey .. "]"
end
end
local code = match(cat, "^([%w%-.]+):")
if code then
add_cat_table(wikitext_topic_cat, code, sortkey)
return
end
-- Split by word.
cat = split(cat, " ", true, true)
-- Formerly we looked for the language name anywhere in the category. This is simply wrong
-- because there are no categories like 'Alsatian French lemmas' (only L2 languages
-- have langname categories), but doing it this way wrongly catches things like [[Category:Shapsug Adyghe]]
-- in [[Category:Adyghe entries with language name categories using raw markup]].
local n = #cat - 1
if n <= 0 then
return
end
-- Go from longest to shortest and stop once we've found a language name. Going from shortest
-- to longest or not stopping after a match risks falsely matching (e.g.) German Low German
-- categories as German.
repeat
local name = concat(cat, " ", 1, n)
if (langnames or get_langnames())[name] then
add_cat_table(wikitext_langname_cat, name, sortkey)
return
end
n = n - 1
until n == 0
end
if content then
-- Remove comments, then iterate over category links.
content = remove_comments(content, "BOTH")
local head = find(content, "[[", 1, true)
while head do
local close = find(content, "]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = find(content, "[[", head + 2, true)
while open and open < close do
head = open
open = find(content, "[[", head + 2, true)
end
local cat = sub(content, head + 2, close - 1)
-- Locate the colon, and weed out most unwanted links. "[ _\128-\244]*" catches valid whitespace, and ensures any category links using the colon trick are ignored. We match all non-ASCII characters, as there could be multibyte spaces, and mw.title.new will filter out any remaining false-positives; this is a lot faster than running mw.title.new on every link.
local colon = match(cat, "^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
process_category(content, cat, colon, close + 2)
end
head = open
end
end
data.wikitext_topic_cat = wikitext_topic_cat
data.wikitext_langname_cat = wikitext_langname_cat
if raw_sortkey then
insert(cats, get_category("Pages with raw sortkeys"))
end
end
return data
end
return export
0esb0zcz2sjpy8aqh1uv1deoe3q625h
509299
509297
2026-05-28T06:59:06Z
Redmin
6857
509299
Scribunto
text/plain
local export = {}
local languages_module = "Module:languages"
local maintenance_category_module = "Module:maintenance category"
local pages_module = "Module:pages"
local string_compare_module = "Module:string/compare"
local string_decode_entities_module = "Module:string/decodeEntities"
local string_remove_comments_module = "Module:string/removeComments"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local template_parser_module = "Module:template parser"
local mw = mw
local string = string
local table = table
local ustring = mw.ustring
local concat = table.concat
local find = string.find
local format = string.format
local gsub = string.gsub
local insert = table.insert
local load_data = mw.loadData
local match = string.match
local new_title = mw.title.new
local pairs = pairs
local require = require
local sub = string.sub
local toNFC = ustring.toNFC
local toNFD = ustring.toNFD
local ugsub = ustring.gsub
local function class_else_type(...)
class_else_type = require(template_parser_module).class_else_type
return class_else_type(...)
end
local function decode_entities(...)
decode_entities = require(string_decode_entities_module)
return decode_entities(...)
end
local function encode_entities(...)
encode_entities = require(string_utilities_module).encode_entities
return encode_entities(...)
end
local function get_category(...)
get_category = require(maintenance_category_module).get_category
return get_category(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function list_to_set(...)
list_to_set = require(table_module).listToSet
return list_to_set(...)
end
local function parse(...)
parse = require(template_parser_module).parse
return parse(...)
end
local function remove_comments(...)
remove_comments = require(string_remove_comments_module)
return remove_comments(...)
end
local function physical_to_logical_pagename_if_mammoth(...)
physical_to_logical_pagename_if_mammoth = require(pages_module).physical_to_logical_pagename_if_mammoth
return physical_to_logical_pagename_if_mammoth(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function string_compare(...)
string_compare = require(string_compare_module)
return string_compare(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local langnames
local function get_langnames()
langnames, get_langnames = load_data("Module:languages/canonical names"), nil
return langnames
end
-- Combining character data used when categorising unusual characters. These resolve into two patterns, used to find
-- single combining characters (i.e. character + diacritic(s)) or double combining characters (i.e. character +
-- diacritic(s) + character).
-- Charsets are in the format used by Unicode's UnicodeSet tool: https://util.unicode.org/UnicodeJsps/list-unicodeset.jsp.
-- Single combining characters.
-- Charset: [[:M:]&[:^Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
-- Note: concatenating hundreds of lines at once gives an error, so () are used every 150 lines to break it up into chunks.
local comb_chars_single =
("\204\128-\205\142" .. -- U+0300-U+034E
"\205\144-\205\155" .. -- U+0350-U+035B
"\205\163-\205\175" .. -- U+0363-U+036F
"\210\131-\210\137" .. -- U+0483-U+0489
"\214\145-\214\189" .. -- U+0591-U+05BD
"\214\191" .. -- U+05BF
"\215\129" .. -- U+05C1
"\215\130" .. -- U+05C2
"\215\132" .. -- U+05C4
"\215\133" .. -- U+05C5
"\215\135" .. -- U+05C7
"\216\144-\216\154" .. -- U+0610-U+061A
"\217\139-\217\159" .. -- U+064B-U+065F
"\217\176" .. -- U+0670
"\219\150-\219\156" .. -- U+06D6-U+06DC
"\219\159-\219\164" .. -- U+06DF-U+06E4
"\219\167" .. -- U+06E7
"\219\168" .. -- U+06E8
"\219\170-\219\173" .. -- U+06EA-U+06ED
"\220\145" .. -- U+0711
"\220\176-\221\138" .. -- U+0730-U+074A
"\222\166-\222\176" .. -- U+07A6-U+07B0
"\223\171-\223\179" .. -- U+07EB-U+07F3
"\223\189" .. -- U+07FD
"\224\160\150-\224\160\153" .. -- U+0816-U+0819
"\224\160\155-\224\160\163" .. -- U+081B-U+0823
"\224\160\165-\224\160\167" .. -- U+0825-U+0827
"\224\160\169-\224\160\173" .. -- U+0829-U+082D
"\224\161\153-\224\161\155" .. -- U+0859-U+085B
"\224\162\151-\224\162\159" .. -- U+0897-U+089F
"\224\163\138-\224\163\161" .. -- U+08CA-U+08E1
"\224\163\163-\224\164\131" .. -- U+08E3-U+0903
"\224\164\186-\224\164\188" .. -- U+093A-U+093C
"\224\164\190-\224\165\143" .. -- U+093E-U+094F
"\224\165\145-\224\165\151" .. -- U+0951-U+0957
"\224\165\162" .. -- U+0962
"\224\165\163" .. -- U+0963
"\224\166\129-\224\166\131" .. -- U+0981-U+0983
"\224\166\188" .. -- U+09BC
"\224\166\190-\224\167\132" .. -- U+09BE-U+09C4
"\224\167\135" .. -- U+09C7
"\224\167\136" .. -- U+09C8
"\224\167\139-\224\167\141" .. -- U+09CB-U+09CD
"\224\167\151" .. -- U+09D7
"\224\167\162" .. -- U+09E2
"\224\167\163" .. -- U+09E3
"\224\167\190" .. -- U+09FE
"\224\168\129-\224\168\131" .. -- U+0A01-U+0A03
"\224\168\188" .. -- U+0A3C
"\224\168\190-\224\169\130" .. -- U+0A3E-U+0A42
"\224\169\135" .. -- U+0A47
"\224\169\136" .. -- U+0A48
"\224\169\139-\224\169\141" .. -- U+0A4B-U+0A4D
"\224\169\145" .. -- U+0A51
"\224\169\176" .. -- U+0A70
"\224\169\177" .. -- U+0A71
"\224\169\181" .. -- U+0A75
"\224\170\129-\224\170\131" .. -- U+0A81-U+0A83
"\224\170\188" .. -- U+0ABC
"\224\170\190-\224\171\133" .. -- U+0ABE-U+0AC5
"\224\171\135-\224\171\137" .. -- U+0AC7-U+0AC9
"\224\171\139-\224\171\141" .. -- U+0ACB-U+0ACD
"\224\171\162" .. -- U+0AE2
"\224\171\163" .. -- U+0AE3
"\224\171\186-\224\171\191" .. -- U+0AFA-U+0AFF
"\224\172\129-\224\172\131" .. -- U+0B01-U+0B03
"\224\172\188" .. -- U+0B3C
"\224\172\190-\224\173\132" .. -- U+0B3E-U+0B44
"\224\173\135" .. -- U+0B47
"\224\173\136" .. -- U+0B48
"\224\173\139-\224\173\141" .. -- U+0B4B-U+0B4D
"\224\173\149-\224\173\151" .. -- U+0B55-U+0B57
"\224\173\162" .. -- U+0B62
"\224\173\163" .. -- U+0B63
"\224\174\130" .. -- U+0B82
"\224\174\190-\224\175\130" .. -- U+0BBE-U+0BC2
"\224\175\134-\224\175\136" .. -- U+0BC6-U+0BC8
"\224\175\138-\224\175\141" .. -- U+0BCA-U+0BCD
"\224\175\151" .. -- U+0BD7
"\224\176\128-\224\176\132" .. -- U+0C00-U+0C04
"\224\176\188" .. -- U+0C3C
"\224\176\190-\224\177\132" .. -- U+0C3E-U+0C44
"\224\177\134-\224\177\136" .. -- U+0C46-U+0C48
"\224\177\138-\224\177\141" .. -- U+0C4A-U+0C4D
"\224\177\149" .. -- U+0C55
"\224\177\150" .. -- U+0C56
"\224\177\162" .. -- U+0C62
"\224\177\163" .. -- U+0C63
"\224\178\129-\224\178\131" .. -- U+0C81-U+0C83
"\224\178\188" .. -- U+0CBC
"\224\178\190-\224\179\132" .. -- U+0CBE-U+0CC4
"\224\179\134-\224\179\136" .. -- U+0CC6-U+0CC8
"\224\179\138-\224\179\141" .. -- U+0CCA-U+0CCD
"\224\179\149" .. -- U+0CD5
"\224\179\150" .. -- U+0CD6
"\224\179\162" .. -- U+0CE2
"\224\179\163" .. -- U+0CE3
"\224\179\179" .. -- U+0CF3
"\224\180\128-\224\180\131" .. -- U+0D00-U+0D03
"\224\180\187" .. -- U+0D3B
"\224\180\188" .. -- U+0D3C
"\224\180\190-\224\181\132" .. -- U+0D3E-U+0D44
"\224\181\134-\224\181\136" .. -- U+0D46-U+0D48
"\224\181\138-\224\181\141" .. -- U+0D4A-U+0D4D
"\224\181\151" .. -- U+0D57
"\224\181\162" .. -- U+0D62
"\224\181\163" .. -- U+0D63
"\224\182\129-\224\182\131" .. -- U+0D81-U+0D83
"\224\183\138" .. -- U+0DCA
"\224\183\143-\224\183\148" .. -- U+0DCF-U+0DD4
"\224\183\150" .. -- U+0DD6
"\224\183\152-\224\183\159" .. -- U+0DD8-U+0DDF
"\224\183\178" .. -- U+0DF2
"\224\183\179" .. -- U+0DF3
"\224\184\177" .. -- U+0E31
"\224\184\180-\224\184\186" .. -- U+0E34-U+0E3A
"\224\185\135-\224\185\142" .. -- U+0E47-U+0E4E
"\224\186\177" .. -- U+0EB1
"\224\186\180-\224\186\188" .. -- U+0EB4-U+0EBC
"\224\187\136-\224\187\142" .. -- U+0EC8-U+0ECE
"\224\188\152" .. -- U+0F18
"\224\188\153" .. -- U+0F19
"\224\188\181" .. -- U+0F35
"\224\188\183" .. -- U+0F37
"\224\188\185" .. -- U+0F39
"\224\188\190" .. -- U+0F3E
"\224\188\191" .. -- U+0F3F
"\224\189\177-\224\190\132" .. -- U+0F71-U+0F84
"\224\190\134" .. -- U+0F86
"\224\190\135" .. -- U+0F87
"\224\190\141-\224\190\151" .. -- U+0F8D-U+0F97
"\224\190\153-\224\190\188" .. -- U+0F99-U+0FBC
"\224\191\134" .. -- U+0FC6
"\225\128\171-\225\128\190" .. -- U+102B-U+103E
"\225\129\150-\225\129\153" .. -- U+1056-U+1059
"\225\129\158-\225\129\160" .. -- U+105E-U+1060
"\225\129\162-\225\129\164" .. -- U+1062-U+1064
"\225\129\167-\225\129\173" .. -- U+1067-U+106D
"\225\129\177-\225\129\180" .. -- U+1071-U+1074
"\225\130\130-\225\130\141" .. -- U+1082-U+108D
"\225\130\143" .. -- U+108F
"\225\130\154-\225\130\157" .. -- U+109A-U+109D
"\225\141\157-\225\141\159" .. -- U+135D-U+135F
"\225\156\146-\225\156\149" .. -- U+1712-U+1715
"\225\156\178-\225\156\180" .. -- U+1732-U+1734
"\225\157\146" .. -- U+1752
"\225\157\147" .. -- U+1753
"\225\157\178" .. -- U+1772
"\225\157\179" .. -- U+1773
"\225\158\180-\225\159\147") .. -- U+17B4-U+17D3
("\225\159\157" .. -- U+17DD
"\225\162\133" .. -- U+1885
"\225\162\134" .. -- U+1886
"\225\162\169" .. -- U+18A9
"\225\164\160-\225\164\171" .. -- U+1920-U+192B
"\225\164\176-\225\164\187" .. -- U+1930-U+193B
"\225\168\151-\225\168\155" .. -- U+1A17-U+1A1B
"\225\169\149-\225\169\158" .. -- U+1A55-U+1A5E
"\225\169\160-\225\169\188" .. -- U+1A60-U+1A7C
"\225\169\191" .. -- U+1A7F
"\225\170\176-\225\171\142" .. -- U+1AB0-U+1ACE
"\225\172\128-\225\172\132" .. -- U+1B00-U+1B04
"\225\172\180-\225\173\132" .. -- U+1B34-U+1B44
"\225\173\171-\225\173\179" .. -- U+1B6B-U+1B73
"\225\174\128-\225\174\130" .. -- U+1B80-U+1B82
"\225\174\161-\225\174\173" .. -- U+1BA1-U+1BAD
"\225\175\166-\225\175\179" .. -- U+1BE6-U+1BF3
"\225\176\164-\225\176\183" .. -- U+1C24-U+1C37
"\225\179\144-\225\179\146" .. -- U+1CD0-U+1CD2
"\225\179\148-\225\179\168" .. -- U+1CD4-U+1CE8
"\225\179\173" .. -- U+1CED
"\225\179\180" .. -- U+1CF4
"\225\179\183-\225\179\185" .. -- U+1CF7-U+1CF9
"\225\183\128-\225\183\140" .. -- U+1DC0-U+1DCC
"\225\183\142-\225\183\187" .. -- U+1DCE-U+1DFB
"\225\183\189-\225\183\191" .. -- U+1DFD-U+1DFF
"\226\131\144-\226\131\176" .. -- U+20D0-U+20F0
"\226\179\175-\226\179\177" .. -- U+2CEF-U+2CF1
"\226\181\191" .. -- U+2D7F
"\226\183\160-\226\183\191" .. -- U+2DE0-U+2DFF
"\227\128\170-\227\128\175" .. -- U+302A-U+302F
"\227\130\153" .. -- U+3099
"\227\130\154" .. -- U+309A
"\234\153\175-\234\153\178" .. -- U+A66F-U+A672
"\234\153\180-\234\153\189" .. -- U+A674-U+A67D
"\234\154\158" .. -- U+A69E
"\234\154\159" .. -- U+A69F
"\234\155\176" .. -- U+A6F0
"\234\155\177" .. -- U+A6F1
"\234\160\130" .. -- U+A802
"\234\160\134" .. -- U+A806
"\234\160\139" .. -- U+A80B
"\234\160\163-\234\160\167" .. -- U+A823-U+A827
"\234\160\172" .. -- U+A82C
"\234\162\128" .. -- U+A880
"\234\162\129" .. -- U+A881
"\234\162\180-\234\163\133" .. -- U+A8B4-U+A8C5
"\234\163\160-\234\163\177" .. -- U+A8E0-U+A8F1
"\234\163\191" .. -- U+A8FF
"\234\164\166-\234\164\173" .. -- U+A926-U+A92D
"\234\165\135-\234\165\147" .. -- U+A947-U+A953
"\234\166\128-\234\166\131" .. -- U+A980-U+A983
"\234\166\179-\234\167\128" .. -- U+A9B3-U+A9C0
"\234\167\165" .. -- U+A9E5
"\234\168\169-\234\168\182" .. -- U+AA29-U+AA36
"\234\169\131" .. -- U+AA43
"\234\169\140" .. -- U+AA4C
"\234\169\141" .. -- U+AA4D
"\234\169\187-\234\169\189" .. -- U+AA7B-U+AA7D
"\234\170\176" .. -- U+AAB0
"\234\170\178-\234\170\180" .. -- U+AAB2-U+AAB4
"\234\170\183" .. -- U+AAB7
"\234\170\184" .. -- U+AAB8
"\234\170\190" .. -- U+AABE
"\234\170\191" .. -- U+AABF
"\234\171\129" .. -- U+AAC1
"\234\171\171-\234\171\175" .. -- U+AAEB-U+AAEF
"\234\171\181" .. -- U+AAF5
"\234\171\182" .. -- U+AAF6
"\234\175\163-\234\175\170" .. -- U+ABE3-U+ABEA
"\234\175\172" .. -- U+ABEC
"\234\175\173" .. -- U+ABED
"\239\172\158" .. -- U+FB1E
"\239\184\160-\239\184\175" .. -- U+FE20-U+FE2F
"\240\144\135\189" .. -- U+101FD
"\240\144\139\160" .. -- U+102E0
"\240\144\141\182-\240\144\141\186" .. -- U+10376-U+1037A
"\240\144\168\129-\240\144\168\131" .. -- U+10A01-U+10A03
"\240\144\168\133" .. -- U+10A05
"\240\144\168\134" .. -- U+10A06
"\240\144\168\140-\240\144\168\143" .. -- U+10A0C-U+10A0F
"\240\144\168\184-\240\144\168\186" .. -- U+10A38-U+10A3A
"\240\144\168\191" .. -- U+10A3F
"\240\144\171\165" .. -- U+10AE5
"\240\144\171\166" .. -- U+10AE6
"\240\144\180\164-\240\144\180\167" .. -- U+10D24-U+10D27
"\240\144\181\169-\240\144\181\173" .. -- U+10D69-U+10D6D
"\240\144\186\171" .. -- U+10EAB
"\240\144\186\172" .. -- U+10EAC
"\240\144\187\188-\240\144\187\191" .. -- U+10EFC-U+10EFF
"\240\144\189\134-\240\144\189\144" .. -- U+10F46-U+10F50
"\240\144\190\130-\240\144\190\133" .. -- U+10F82-U+10F85
"\240\145\128\128-\240\145\128\130" .. -- U+11000-U+11002
"\240\145\128\184-\240\145\129\134" .. -- U+11038-U+11046
"\240\145\129\176" .. -- U+11070
"\240\145\129\179" .. -- U+11073
"\240\145\129\180" .. -- U+11074
"\240\145\129\191-\240\145\130\130" .. -- U+1107F-U+11082
"\240\145\130\176-\240\145\130\186" .. -- U+110B0-U+110BA
"\240\145\131\130" .. -- U+110C2
"\240\145\132\128-\240\145\132\130" .. -- U+11100-U+11102
"\240\145\132\167-\240\145\132\180" .. -- U+11127-U+11134
"\240\145\133\133" .. -- U+11145
"\240\145\133\134" .. -- U+11146
"\240\145\133\179" .. -- U+11173
"\240\145\134\128-\240\145\134\130" .. -- U+11180-U+11182
"\240\145\134\179-\240\145\135\128" .. -- U+111B3-U+111C0
"\240\145\135\137-\240\145\135\140" .. -- U+111C9-U+111CC
"\240\145\135\142" .. -- U+111CE
"\240\145\135\143" .. -- U+111CF
"\240\145\136\172-\240\145\136\183" .. -- U+1122C-U+11237
"\240\145\136\190" .. -- U+1123E
"\240\145\137\129" .. -- U+11241
"\240\145\139\159-\240\145\139\170" .. -- U+112DF-U+112EA
"\240\145\140\128-\240\145\140\131" .. -- U+11300-U+11303
"\240\145\140\187" .. -- U+1133B
"\240\145\140\188" .. -- U+1133C
"\240\145\140\190-\240\145\141\132" .. -- U+1133E-U+11344
"\240\145\141\135" .. -- U+11347
"\240\145\141\136" .. -- U+11348
"\240\145\141\139-\240\145\141\141" .. -- U+1134B-U+1134D
"\240\145\141\151" .. -- U+11357
"\240\145\141\162" .. -- U+11362
"\240\145\141\163" .. -- U+11363
"\240\145\141\166-\240\145\141\172" .. -- U+11366-U+1136C
"\240\145\141\176-\240\145\141\180" .. -- U+11370-U+11374
"\240\145\142\184-\240\145\143\128" .. -- U+113B8-U+113C0
"\240\145\143\130" .. -- U+113C2
"\240\145\143\133" .. -- U+113C5
"\240\145\143\135-\240\145\143\138" .. -- U+113C7-U+113CA
"\240\145\143\140-\240\145\143\144" .. -- U+113CC-U+113D0
"\240\145\143\146" .. -- U+113D2
"\240\145\143\161" .. -- U+113E1
"\240\145\143\162" .. -- U+113E2
"\240\145\144\181-\240\145\145\134" .. -- U+11435-U+11446
"\240\145\145\158" .. -- U+1145E
"\240\145\146\176-\240\145\147\131" .. -- U+114B0-U+114C3
"\240\145\150\175-\240\145\150\181" .. -- U+115AF-U+115B5
"\240\145\150\184-\240\145\151\128" .. -- U+115B8-U+115C0
"\240\145\151\156" .. -- U+115DC
"\240\145\151\157" .. -- U+115DD
"\240\145\152\176-\240\145\153\128" .. -- U+11630-U+11640
"\240\145\154\171-\240\145\154\183" .. -- U+116AB-U+116B7
"\240\145\156\157-\240\145\156\171" .. -- U+1171D-U+1172B
"\240\145\160\172-\240\145\160\186" .. -- U+1182C-U+1183A
"\240\145\164\176-\240\145\164\181" .. -- U+11930-U+11935
"\240\145\164\183" .. -- U+11937
"\240\145\164\184" .. -- U+11938
"\240\145\164\187-\240\145\164\190" .. -- U+1193B-U+1193E
"\240\145\165\128") .. -- U+11940
("\240\145\165\130" .. -- U+11942
"\240\145\165\131" .. -- U+11943
"\240\145\167\145-\240\145\167\151" .. -- U+119D1-U+119D7
"\240\145\167\154-\240\145\167\160" .. -- U+119DA-U+119E0
"\240\145\167\164" .. -- U+119E4
"\240\145\168\129-\240\145\168\138" .. -- U+11A01-U+11A0A
"\240\145\168\179-\240\145\168\185" .. -- U+11A33-U+11A39
"\240\145\168\187-\240\145\168\190" .. -- U+11A3B-U+11A3E
"\240\145\169\135" .. -- U+11A47
"\240\145\169\145-\240\145\169\155" .. -- U+11A51-U+11A5B
"\240\145\170\138-\240\145\170\153" .. -- U+11A8A-U+11A99
"\240\145\176\175-\240\145\176\182" .. -- U+11C2F-U+11C36
"\240\145\176\184-\240\145\176\191" .. -- U+11C38-U+11C3F
"\240\145\178\146-\240\145\178\167" .. -- U+11C92-U+11CA7
"\240\145\178\169-\240\145\178\182" .. -- U+11CA9-U+11CB6
"\240\145\180\177-\240\145\180\182" .. -- U+11D31-U+11D36
"\240\145\180\186" .. -- U+11D3A
"\240\145\180\188" .. -- U+11D3C
"\240\145\180\189" .. -- U+11D3D
"\240\145\180\191-\240\145\181\133" .. -- U+11D3F-U+11D45
"\240\145\181\135" .. -- U+11D47
"\240\145\182\138-\240\145\182\142" .. -- U+11D8A-U+11D8E
"\240\145\182\144" .. -- U+11D90
"\240\145\182\145" .. -- U+11D91
"\240\145\182\147-\240\145\182\151" .. -- U+11D93-U+11D97
"\240\145\187\179-\240\145\187\182" .. -- U+11EF3-U+11EF6
"\240\145\188\128" .. -- U+11F00
"\240\145\188\129" .. -- U+11F01
"\240\145\188\131" .. -- U+11F03
"\240\145\188\180-\240\145\188\186" .. -- U+11F34-U+11F3A
"\240\145\188\190-\240\145\189\130" .. -- U+11F3E-U+11F42
"\240\145\189\154" .. -- U+11F5A
"\240\147\145\128" .. -- U+13440
"\240\147\145\135-\240\147\145\149" .. -- U+13447-U+13455
"\240\150\132\158-\240\150\132\175" .. -- U+1611E-U+1612F
"\240\150\171\176-\240\150\171\180" .. -- U+16AF0-U+16AF4
"\240\150\172\176-\240\150\172\182" .. -- U+16B30-U+16B36
"\240\150\189\143" .. -- U+16F4F
"\240\150\189\145-\240\150\190\135" .. -- U+16F51-U+16F87
"\240\150\190\143-\240\150\190\146" .. -- U+16F8F-U+16F92
"\240\150\191\164" .. -- U+16FE4
"\240\150\191\176" .. -- U+16FF0
"\240\150\191\177" .. -- U+16FF1
"\240\155\178\157" .. -- U+1BC9D
"\240\155\178\158" .. -- U+1BC9E
"\240\156\188\128-\240\156\188\173" .. -- U+1CF00-U+1CF2D
"\240\156\188\176-\240\156\189\134" .. -- U+1CF30-U+1CF46
"\240\157\133\165-\240\157\133\169" .. -- U+1D165-U+1D169
"\240\157\133\173-\240\157\133\178" .. -- U+1D16D-U+1D172
"\240\157\133\187-\240\157\134\130" .. -- U+1D17B-U+1D182
"\240\157\134\133-\240\157\134\139" .. -- U+1D185-U+1D18B
"\240\157\134\170-\240\157\134\173" .. -- U+1D1AA-U+1D1AD
"\240\157\137\130-\240\157\137\132" .. -- U+1D242-U+1D244
"\240\157\168\128-\240\157\168\182" .. -- U+1DA00-U+1DA36
"\240\157\168\187-\240\157\169\172" .. -- U+1DA3B-U+1DA6C
"\240\157\169\181" .. -- U+1DA75
"\240\157\170\132" .. -- U+1DA84
"\240\157\170\155-\240\157\170\159" .. -- U+1DA9B-U+1DA9F
"\240\157\170\161-\240\157\170\175" .. -- U+1DAA1-U+1DAAF
"\240\158\128\128-\240\158\128\134" .. -- U+1E000-U+1E006
"\240\158\128\136-\240\158\128\152" .. -- U+1E008-U+1E018
"\240\158\128\155-\240\158\128\161" .. -- U+1E01B-U+1E021
"\240\158\128\163" .. -- U+1E023
"\240\158\128\164" .. -- U+1E024
"\240\158\128\166-\240\158\128\170" .. -- U+1E026-U+1E02A
"\240\158\130\143" .. -- U+1E08F
"\240\158\132\176-\240\158\132\182" .. -- U+1E130-U+1E136
"\240\158\138\174" .. -- U+1E2AE
"\240\158\139\172-\240\158\139\175" .. -- U+1E2EC-U+1E2EF
"\240\158\147\172-\240\158\147\175" .. -- U+1E4EC-U+1E4EF
"\240\158\151\174" .. -- U+1E5EE
"\240\158\151\175" .. -- U+1E5EF
"\240\158\163\144-\240\158\163\150" .. -- U+1E8D0-U+1E8D6
"\240\158\165\132-\240\158\165\138") -- U+1E944-U+1E94A
-- Double combining characters.
-- Charset: [[:M:]&[:Canonical_Combining_Class=/^Double_/:]&[:^subhead=Grapheme joiner:]&[:^Variation_Selector=Yes:]]
local comb_chars_double =
"\205\156-\205\162" .. -- U+035C-U+0362
"\225\183\141" .. -- U+1DCD
"\225\183\188" -- U+1DFC
-- Variation selectors etc.; separated out so that we don't get categories for them.
-- Charset: [[:M:]&[[:subhead=Grapheme joiner:][:Variation_Selector=Yes:]]].
local comb_chars_other =
"\205\143" .. -- U+034F
"\225\160\139-\225\160\141" .. -- U+180B-U+180D
"\225\160\143" .. -- U+180F
"\239\184\128-\239\184\143" .. -- U+FE00-U+FE0F
"\243\160\132\128-\243\160\135\175" -- U+E0100-U+E01EF
local comb_chars_all = comb_chars_single .. comb_chars_double .. comb_chars_other
local comb_chars = {
combined_single = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]+%f[^" .. comb_chars_all .. "]",
combined_double = "[^" .. comb_chars_all .. "][" .. comb_chars_single .. comb_chars_other .. "]*[" .. comb_chars_double .. "]+[" .. comb_chars_all .. "]*.[" .. comb_chars_single .. comb_chars_other .. "]*",
diacritics_single = "[" .. comb_chars_single .. "]",
diacritics_double = "[" .. comb_chars_double .. "]",
diacritics_all = "[" .. comb_chars_all .. "]"
}
-- Somewhat curated list from https://unicode.org/Public/emoji/16.0/emoji-sequences.txt.
-- NOTE: There are lots more emoji sequences involving non-emoji Plane 0 symbols followed by 0xFE0F, which we don't
-- (yet?) handle.
local emoji_chars =
"\226\140\154" .. -- U+231A (⌚)
"\226\140\155" .. -- U+231B (⌛)
"\226\140\168" .. -- U+2328 (⌨)
"\226\143\143" .. -- U+23CF (⏏)
"\226\143\169-\226\143\179" .. -- U+23E9-U+23F3 (⏩-⏳)
"\226\143\184-\226\143\186" .. -- U+23F8-U+23FA (⏸-⏺)
"\226\150\170" .. -- U+25AA (▪)
"\226\150\171" .. -- U+25AB (▫)
"\226\150\182" .. -- U+25B6 (▶)
"\226\151\128" .. -- U+25C0 (◀)
"\226\151\187-\226\151\190" .. -- U+25FB-U+25FE (◻-◾)
"\226\152\128-\226\152\132" .. -- U+2600-U+2604 (☀-☄)
"\226\152\142" .. -- U+260E (☎)
"\226\152\145" .. -- U+2611 (☑)
"\226\152\148" .. -- U+2614 (☔)
"\226\152\149" .. -- U+2615 (☕)
"\226\152\152" .. -- U+2618 (☘)
"\226\152\157" .. -- U+261D (☝)
"\226\152\160" .. -- U+2620 (☠)
"\226\152\162" .. -- U+2622 (☢)
"\226\152\163" .. -- U+2623 (☣)
"\226\152\166" .. -- U+2626 (☦)
"\226\152\170" .. -- U+262A (☪)
"\226\152\174" .. -- U+262E (☮)
"\226\152\175" .. -- U+262F (☯)
"\226\152\184-\226\152\186" .. -- U+2638-U+263A (☸-☺)
"\226\153\136-\226\153\147" .. -- U+2648-U+2653 (♈-♓)
"\226\153\159" .. -- U+265F (♟)
"\226\153\160" .. -- U+2660 (♠)
"\226\153\163" .. -- U+2663 (♣)
"\226\153\165" .. -- U+2665 (♥)
"\226\153\166" .. -- U+2666 (♦)
"\226\153\168" .. -- U+2668 (♨)
"\226\153\187" .. -- U+267B (♻)
"\226\153\190" .. -- U+267E (♾)
"\226\153\191" .. -- U+267F (♿)
"\226\154\146-\226\154\151" .. -- U+2692-U+2697 (⚒-⚗)
"\226\154\153" .. -- U+2699 (⚙)
"\226\154\155" .. -- U+269B (⚛)
"\226\154\156" .. -- U+269C (⚜)
"\226\154\160" .. -- U+26A0 (⚠)
"\226\154\161" .. -- U+26A1 (⚡)
"\226\154\170" .. -- U+26AA (⚪)
"\226\154\171" .. -- U+26AB (⚫)
"\226\154\176" .. -- U+26B0 (⚰)
"\226\154\177" .. -- U+26B1 (⚱)
"\226\154\189" .. -- U+26BD (⚽)
"\226\154\190" .. -- U+26BE (⚾)
"\226\155\132" .. -- U+26C4 (⛄)
"\226\155\133" .. -- U+26C5 (⛅)
"\226\155\136" .. -- U+26C8 (⛈)
"\226\155\142" .. -- U+26CE (⛎)
"\226\155\143" .. -- U+26CF (⛏)
"\226\155\145" .. -- U+26D1 (⛑)
"\226\155\147" .. -- U+26D3 (⛓)
"\226\155\148" .. -- U+26D4 (⛔)
"\226\155\169" .. -- U+26E9 (⛩)
"\226\155\170" .. -- U+26EA (⛪)
"\226\155\176-\226\155\181" .. -- U+26F0-U+26F5 (⛰-⛵)
"\226\155\183-\226\155\186" .. -- U+26F7-U+26FA (⛷-⛺)
"\226\155\189" .. -- U+26FD (⛽)
"\226\156\130" .. -- U+2702 (✂)
"\226\156\133" .. -- U+2705 (✅)
"\226\156\136-\226\156\141" .. -- U+2708-U+270D (✈-✍)
"\226\156\143" .. -- U+270F (✏)
"\226\156\146" .. -- U+2712 (✒)
"\226\156\148" .. -- U+2714 (✔)
"\226\156\150" .. -- U+2716 (✖)
"\226\156\157" .. -- U+271D (✝)
"\226\156\161" .. -- U+2721 (✡)
"\226\156\168" .. -- U+2728 (✨)
"\226\156\179" .. -- U+2733 (✳)
"\226\156\180" .. -- U+2734 (✴)
"\226\157\132" .. -- U+2744 (❄)
"\226\157\135" .. -- U+2747 (❇)
"\226\157\140" .. -- U+274C (❌)
"\226\157\142" .. -- U+274E (❎)
"\226\157\147-\226\157\149" .. -- U+2753-U+2755 (❓-❕)
"\226\157\151" .. -- U+2757 (❗)
"\226\157\163" .. -- U+2763 (❣)
"\226\157\164" .. -- U+2764 (❤)
"\226\158\149-\226\158\151" .. -- U+2795-U+2797 (➕-➗)
"\226\158\161" .. -- U+27A1 (➡)
"\226\158\176" .. -- U+27B0 (➰)
"\226\158\191" .. -- U+27BF (➿)
"\226\164\180" .. -- U+2934 (⤴)
"\226\164\181" .. -- U+2935 (⤵)
"\226\172\133-\226\172\135" .. -- U+2B05-U+2B07 (⬅-⬇)
"\226\172\155" .. -- U+2B1B (⬛)
"\226\172\156" .. -- U+2B1C (⬜)
"\226\173\144" .. -- U+2B50 (⭐)
"\226\173\149" .. -- U+2B55 (⭕)
"\227\128\176" .. -- U+3030 (〰)
"\227\128\189" .. -- U+303D (〽)
"\227\138\151" .. -- U+3297 (㊗)
"\227\138\153" .. -- U+3299 (㊙)
"\240\159\128\132" .. -- U+1F004 (🀄)
"\240\159\131\143" .. -- U+1F0CF (🃏)
"\240\159\133\176" .. -- U+1F170 (🅰)
"\240\159\133\177" .. -- U+1F171 (🅱)
"\240\159\133\190" .. -- U+1F17E (🅾)
"\240\159\133\191" .. -- U+1F17F (🅿)
"\240\159\134\142" .. -- U+1F18E (🆎)
"\240\159\134\145-\240\159\134\154" .. -- U+1F191-U+1F19A (🆑-🆚)
"\240\159\136\129" .. -- U+1F201 (🈁)
"\240\159\136\130" .. -- U+1F202 (🈂)
"\240\159\136\154" .. -- U+1F21A (🈚)
"\240\159\136\175" .. -- U+1F22F (🈯)
"\240\159\136\178-\240\159\136\186" .. -- U+1F232-U+1F23A (🈲-🈺)
"\240\159\137\144" .. -- U+1F250 (🉐)
"\240\159\137\145" .. -- U+1F251 (🉑)
"\240\159\140\128-\240\159\153\143" .. -- U+1F300-U+1F64F (🌀-🙏)
"\240\159\154\128-\240\159\155\151" .. -- U+1F680-U+1F6D7 (🚀-🛗)
"\240\159\155\156-\240\159\155\172" .. -- U+1F6DC-U+1F6EC (🛜-🛬)
"\240\159\155\176-\240\159\155\188" .. -- U+1F6F0-U+1F6FC (🛰-🛼)
"\240\159\159\160-\240\159\159\171" .. -- U+1F7E0-U+1F7EB (🟠-🟫)
"\240\159\159\176" .. -- U+1F7F0 (🟰)
"\240\159\164\140-\240\159\169\147" .. -- U+1F90C-U+1FA53 (🤌-🩓)
"\240\159\169\160-\240\159\169\173" .. -- U+1FA60-U+1FA6D (🩠-🩭)
"\240\159\169\176-\240\159\169\188" .. -- U+1FA70-U+1FA7C (🩰-🩼)
"\240\159\170\128-\240\159\170\137" .. -- U+1FA80-U+1FA89 (🪀-)
"\240\159\170\143-\240\159\171\134" .. -- U+1FA8F-U+1FAC6 (-)
"\240\159\171\142-\240\159\171\156" .. -- U+1FACE-U+1FADC (🫎-)
"\240\159\171\159-\240\159\171\169" .. -- U+1FADF-U+1FAE9 (-)
"\240\159\171\176-\240\159\171\184" -- U+1FAF0-U+1FAF8 (🫰-🫸)
local unsupported_characters
local function get_unsupported_characters()
unsupported_characters, get_unsupported_characters = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_characters) do
unsupported_characters[v] = k
end
return unsupported_characters
end
-- The list of unsupported titles and invert it (so the keys are pagenames and values are canonical titles).
local unsupported_titles
local function get_unsupported_titles()
unsupported_titles, get_unsupported_titles = {}, nil
for k, v in pairs(load_data("Module:links/data").unsupported_titles) do
unsupported_titles[v] = k
end
return unsupported_titles
end
-- To save on memory, we only cache names with either non-ASCII characters in them or ASCII characters to be removed or
-- transformed (apostrophe, double quote, hyphen).
local L2_sort_key_cache = {}
function export.get_L2_sort_key(L2)
if L2 == "Translingual" then
return "\1"
elseif L2 == "English" then
return "\2"
elseif match(L2, "^[%z\1-\b\14-!#-&(-,.-\127]+$") then
return L2
end
local sort_key = L2_sort_key_cache[L2]
if sort_key then
return sort_key
end
sort_key = toNFC(ugsub(ugsub(toNFD(L2), "[" .. comb_chars_all .. "'\"ʻʼ]+", ""), "[%s%-]+", " "))
L2_sort_key_cache[L2] = sort_key
return sort_key
end
--[==[
Given a pagename (or {nil} for the current page), create and return a data structure describing the page. The returned
object includes the following fields:
* `comb_chars`: A table containing various Lua character class patterns for different types of combined characters
(those that decompose into multiple characters in the NFD decomposition). The patterns are meant to be used with
{mw.ustring.find()}. The keys are:
** `single`: Single combining characters (character + diacritic), without surrounding brackets;
** `double`: Double combining characters (character + diacritic + character), without surrounding brackets;
** `vs`: Variation selectors, without surrounding brackets;
** `all`: Concatenation of `single` + `double` + `vs`, without surrounding brackets;
** `diacritics_single`: Like `single` but with surrounding brackets;
** `diacritics_double`: Like `double` but with surrounding brackets;
** `diacritics_all`: Like `all` but with surrounding brackets;
** `combined_single`: Lua pattern for matching a spacing character followed by one or more single combining characters;
** `combined_double`: Lua pattern for matching a combination of two spacing characters separated by one or more double
combining characters, possibly also with single combining characters;
* `emoji_pattern`: A Lua character class pattern (including surrounding brackets) that matches emojis. Meant to be used
with {mw.ustring.find()}.
* `L2_list`: Ordered list of L2 headings on the page, with the extra key `n` that gives the length of the list.
* `L2_sections`: Lookup table of L2 headings on the page, where the key is the section number assigned by the preprocessor, and the value is the L2 heading name. Once an invocation has got its actual section number from get_current_L2 in [[Module:pages]], it can use this table to determine its parent L2. TODO: We could expand this to include subsections, to check POS headings are correct etc.
* `unsupported_titles`: Map from pagenames to canonical titles for unsupported-title pages.
* `namespace`: Namespace of the pagename.
* `ns`: Namespace table for the page from mw.site.namespaces (TODO: merge with `namespace` above).
* `full_raw_pagename`: Full version of the '''RAW''' pagename (i.e. unsupported-title pages aren't canonicalized);
including the namespace and the base (portion before the slash).
* `pagename`: Canonicalized subpage portion of the pagename (unsupported-title pages are canonicalized).
* `pagename_with_base`: Same as `pagename` in the main namespace; otherwise, the whole pagename without the namespace.
* `decompose_pagename`: Equivalent of `pagename` in NFD decomposition.
* `pagename_len`: Length of `pagename` in Unicode chars, where combinations of spacing character + decomposed diacritic
are treated as single characters.
* `explode_pagename`: Set of characters found in `pagename`. The keys are characters (where combinations of spacing
character + decomposed diacritic are treated as single characters).
* `encoded_pagename`: FIXME: Document me.
* `pagename_defaultsort`: FIXME: Document me.
* `raw_defaultsort`: FIXME: Document me.
* `wikitext_topic_cat`: FIXME: Document me.
* `wikitext_langname_cat`: FIXME: Document me.
`no_fetch_content` says to not fetch and parse the content or set a DEFAULTSORT sort key, in order to save time on
test and documentation pages that have lots of template invocations that set `|pagename=`. It turns out nearly all the
time of this function is contained in the line `frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)`,
so we skip it on test and documentation pages where it accomplishes nothing in any case.
]==]
function export.process_page(pagename, no_fetch_content)
local data = {
comb_chars = comb_chars,
emoji_pattern = "[" .. emoji_chars .. "]",
unsupported_titles = unsupported_titles or get_unsupported_titles()
}
local cats = {}
data.cats = cats
-- We cannot store `raw_title` in `data` because it contains a metatable.
local raw_title
local function bad_pagename()
if not pagename then
error("Internal error: Something wrong, `data.pagename` not specified but current title contains illegal characters")
else
error(format("Bad value for `data.pagename`: '%s', which must not contain illegal characters", pagename))
end
end
if pagename then -- for testing, doc pages, etc.
raw_title = new_title(pagename)
if not raw_title then
bad_pagename()
end
else
raw_title = mw.title.getCurrentTitle()
end
local nsText = raw_title.nsText
local namespace_is_reconstruction = nsText == "Reconstruction"
data.namespace = nsText
data.ns = mw.site.namespaces[raw_title.namespace]
local full_raw_pagename = raw_title.fullText
data.full_raw_pagename = full_raw_pagename
local frame = mw.getCurrentFrame()
-- WARNING: `content` may be nil, e.g. if we're substing a template like {{ja-new}} on a not-yet-created page
-- or if the module specifies the subpage as `data.pagename` (which many modules do) and we're in an Appendix
-- or other non-mainspace page. We used to make the latter an error but there are too many modules that do it,
-- and substing on a nonexistent page is totally legit, and we don't actually need to be able to access the
-- content of the page.
local content = not no_fetch_content and raw_title:getContent() or nil
-- Get the pagename.
pagename = physical_to_logical_pagename_if_mammoth(raw_title)
pagename = gsub(pagename, "^Unsupported titles/(.+)", function(m)
insert(cats, "Unsupported titles")
local title = (unsupported_titles or get_unsupported_titles())[m]
if title then
return title
end
-- Substitute pairs of "`". Those not used for escaping should be escaped as "`grave`", but might not be,
-- so if a pair don't form a match, the closing "`" should become the opening "`" of the next match attempt.
-- This has to be done manually, instead of using gsub.
local open_pos = find(m, "`")
if not open_pos then
return m
end
title = {sub(m, 1, open_pos - 1)}
while true do
local close_pos = find(m, "`", open_pos + 1)
if not close_pos then
-- Add "`" plus any remaining characters.
insert(title, sub(m, open_pos))
break
end
local escape = sub(m, open_pos, close_pos)
local ch = (unsupported_characters or get_unsupported_characters())[escape]
-- Match found, so substitute the character and move to the first "`" after the match if found, or
-- otherwise return.
if ch then
insert(title, ch)
local nxt_pos = close_pos + 1
open_pos = find(m, "`", nxt_pos)
-- Add any characters between the match and the next "`" or end.
if open_pos then
insert(title, sub(m, nxt_pos, open_pos - 1))
else
insert(title, sub(m, nxt_pos))
break
end
-- Match not found, so make the closing "`" the opening "`" of the next attempt.
else
-- Add the failed match, except for the closing "`".
insert(title, sub(m, open_pos, close_pos - 1))
open_pos = close_pos
end
end
return concat(title)
end)
-- Save pagename, as the local variable will be destructively modified.
data.pagename = pagename
if nsText == "" then
data.pagename_with_base = pagename
else
data.pagename_with_base = raw_title.text
end
-- Decompose the pagename in Unicode normalization form D.
data.decompose_pagename = toNFD(pagename)
-- Explode the current page name into a character table, taking decomposed combining characters into account.
local explode_pagename = {}
local pagename_len = 0
local function explode(char)
explode_pagename[char] = true
pagename_len = pagename_len + 1
return ""
end
pagename = ugsub(pagename, comb_chars.combined_double, explode)
pagename = gsub(ugsub(pagename, comb_chars.combined_single, explode), ".[\128-\191]*", explode)
data.explode_pagename = explode_pagename
data.pagename_len = pagename_len
-- Generate DEFAULTSORT.
data.encoded_pagename = encode_entities(data.pagename)
data.pagename_defaultsort = get_lang("mul"):makeSortKey(data.encoded_pagename)
if not no_fetch_content then
frame:callParserFunction("DEFAULTSORT", data.pagename_defaultsort)
end
data.raw_defaultsort = uupper(raw_title.text)
-- Make `L2_list` and `L2_sections`, note raw wikitext use of {{DEFAULTSORT:}} and {{DISPLAYTITLE:}}, then add categories if any unwanted L1 headings are found, the L2 headings are in the wrong order, or they don't match a canonical language name.
-- Note: HTML comments shouldn't be removed from `content` until after this step, as they can affect the result.
do
local L2_list, L2_list_len, L2_sections = {}, 0, {}
local prev, rc
local new_cats, L2_wrong_order = {}
local function handle_heading(heading)
local level = heading.level
if level > 2 then
return
end
local name = heading:get_name()
-- heading:get_name() will return nil if there are any newline characters in the preprocessed heading name (e.g. from an expanded template). In such cases, the preprocessor section count still increments (since it's calculated pre-expansion), but the heading will fail, so the L2 count shouldn't be incremented.
if name == nil then
return
end
L2_list_len = L2_list_len + 1
L2_list[L2_list_len] = name
L2_sections[heading.section] = name
-- Also add any L1s, since they terminate the preceding L2, but add a maintenance category since it's probably a mistake.
if level == 1 then
new_cats["Pages with unwanted L1 headings"] = true
end
-- Check the heading is in the right order.
-- FIXME: we need a more sophisticated sorting method which handles non-diacritic special characters (e.g. Magɨ).
if prev and not (
L2_wrong_order or
string_compare(export.get_L2_sort_key(prev), export.get_L2_sort_key(name))
) then
new_cats["Pages with language headings in the wrong order"] = true
L2_wrong_order = true
end
-- Check it's a canonical language name.
if not (langnames or get_langnames())[name] then
new_cats["Pages with nonstandard language headings"] = true
end
prev = name
end
local function handle_template(template)
-- Turn off redirect checking except in the Reconstruction namespace because the rc flag is only
-- used in the Reconstruction namespace and the other names are parser functions, which AFAIK can't
-- be redirected to.
local name = template:get_name(nil, not namespace_is_reconstruction and "no_redirect" or nil)
if name == "DEFAULTSORT:" then
new_cats["Pages with DEFAULTSORT conflicts"] = true
elseif name == "DISPLAYTITLE:" then
new_cats["Pages with DISPLAYTITLE conflicts"] = true
elseif name == "reconstructed" then
rc = true
end
end
if content then
for node in parse(content):iterate_nodes() do
local node_class = class_else_type(node)
if node_class == "heading" then
handle_heading(node)
elseif node_class == "template" then
handle_template(node)
elseif node_class == "parameter" then
new_cats["Pages with raw triple-brace template parameters"] = true
end
end
end
L2_list.n = L2_list_len
data.L2_list = L2_list
data.L2_sections = L2_sections
for cat in pairs(new_cats) do
insert(cats, get_category(cat))
end
if namespace_is_reconstruction and not rc then
local langname = match(full_raw_pagename, "^Reconstruction:([^/]+)/.")
if langname then
insert(cats, get_category(langname .. " entries missing Template:reconstructed"))
end
end
end
------ 4. Parse page for maintenance categories. ------
-- Use of tab characters.
if content and find(content, "\t", 1, true) then
insert(cats, get_category("Pages with tab characters"))
end
-- Unencoded character(s) in title.
local IDS = list_to_set{"⿰", "⿱", "⿲", "⿳", "⿴", "⿵", "⿶", "⿷", "⿸", "⿹", "⿺", "⿻", "", "", "", "", ""}
for char in pairs(explode_pagename) do
if IDS[char] and char ~= data.pagename then
insert(cats, "Terms containing unencoded characters")
break
end
end
-- Raw wikitext use of a topic or langname category. Also check if any raw sortkeys have been used.
do
local wikitext_topic_cat = {}
local wikitext_langname_cat = {}
local raw_sortkey
-- If a raw sortkey has been found, add it to the relevant table.
-- If there's no table (or the index is just `true`), create one first.
local function add_cat_table(t, lang, sortkey)
local t_lang = t[lang]
if not sortkey then
if not t_lang then
t[lang] = true
end
return
elseif t_lang == true or not t_lang then
t_lang = {}
t[lang] = t_lang
end
t_lang[uupper(decode_entities(sortkey))] = true
end
local function process_category(content, cat, colon, nxt)
local pipe = find(cat, "|", colon + 1, true)
-- Categories cannot end "|]]".
if pipe == #cat then
return
end
local title = new_title(pipe and sub(cat, 1, pipe - 1) or cat)
if not (title and title.namespace == 14) then
return
end
-- Get the sortkey (if any), then canonicalize category title.
local sortkey = pipe and sub(cat, pipe + 1) or nil
cat = title.text
if sortkey then
raw_sortkey = true
-- If the sortkey contains "[", the first "]" of a final "]]]" is treated as part of the sortkey.
if find(sortkey, "[", 1, true) and sub(content, nxt, nxt) == "]" then
sortkey = sortkey .. "]"
end
end
local code = match(cat, "^([%w%-.]+):")
if code then
add_cat_table(wikitext_topic_cat, code, sortkey)
return
end
-- Split by word.
cat = split(cat, " ", true, true)
-- Formerly we looked for the language name anywhere in the category. This is simply wrong
-- because there are no categories like 'Alsatian French lemmas' (only L2 languages
-- have langname categories), but doing it this way wrongly catches things like [[Category:Shapsug Adyghe]]
-- in [[Category:Adyghe entries with language name categories using raw markup]].
local n = #cat - 1
if n <= 0 then
return
end
-- Go from longest to shortest and stop once we've found a language name. Going from shortest
-- to longest or not stopping after a match risks falsely matching (e.g.) German Low German
-- categories as German.
repeat
local name = concat(cat, " ", 1, n)
if (langnames or get_langnames())[name] then
add_cat_table(wikitext_langname_cat, name, sortkey)
return
end
n = n - 1
until n == 0
end
if content then
-- Remove comments, then iterate over category links.
content = remove_comments(content, "BOTH")
local head = find(content, "[[", 1, true)
while head do
local close = find(content, "]]", head + 2, true)
if not close then
break
end
-- Make sure there are no intervening "[[" between head and close.
local open = find(content, "[[", head + 2, true)
while open and open < close do
head = open
open = find(content, "[[", head + 2, true)
end
local cat = sub(content, head + 2, close - 1)
-- Locate the colon, and weed out most unwanted links. "[ _\128-\244]*" catches valid whitespace, and ensures any category links using the colon trick are ignored. We match all non-ASCII characters, as there could be multibyte spaces, and mw.title.new will filter out any remaining false-positives; this is a lot faster than running mw.title.new on every link.
local colon = match(cat, "^[ _\128-\244]*[Cc][Aa][Tt][EeGgOoRrYy _\128-\244]*():")
if colon then
process_category(content, cat, colon, close + 2)
end
head = open
end
end
data.wikitext_topic_cat = wikitext_topic_cat
data.wikitext_langname_cat = wikitext_langname_cat
if raw_sortkey then
insert(cats, get_category("Pages with raw sortkeys"))
end
end
return data
end
return export
ep58z05f82tr4tq60vsiqvp46fsv8vk
মডিউল:আভিধানিক উপাত্ত/i18n
828
148710
509300
509292
2026-05-28T07:03:24Z
Redmin
6857
509300
Scribunto
text/plain
local p = {}
p['wikipedia'] = 'bnwiki'
p['fallback_wikipedia'] = 'enwiki'
p['content_lang_name'] = 'বাংলা'
p['content_lang_code'] = 'bn'
p['heading_etymology'] = 'ব্যুৎপত্তি'
p['heading_pronunciation'] = 'উচ্চারণ'
p['heading_translation'] = 'অনুবাদ'
p['heading_references'] = 'তথ্যসূত্র'
p['heading_external_links'] = 'বহিঃসংযোগ'
p['heading_alternative_spellings'] = 'বিকল্প বানান'
p['heading_inflection_table'] = 'বিভক্তির সারণী'
p['heading_form'] = 'রূপ'
p['heading_grammatical_features'] = 'ব্যাকরণিক বৈশিষ্ট্য'
p['heading_image'] = 'চিত্র'
p['heading_alternative_script'] = 'বিকল্প রূপ'
p['text_instance_of'] = 'একটি'
p['text_audio'] = 'অডিও'
p['text_iso15919'] = '[[w:আইএসও ১৫৯১৯|আইএসও ১৫৯১৯]]:'
p['text_iast'] = '[[w:সংস্কৃত লিপ্যন্তরের আন্তর্জাতিক বর্ণমালা|সলিআব]]:'
p['text_itrans'] = '[[w:en:ITRANS|ITRANS]]:'
p['text_xsampa'] = '[[w:এক্স-সাম্পা|এক্স-সাম্পা]]:'
p['text_syllable_count'] = '[[w:অক্ষর (সিলেবল)|অক্ষর]] সংখ্যা:'
p['template_lexeme'] = 'উইকিউপাত্ত লেক্সিম' -- Q81739987
p['template_wikipedia'] = 'উইকিপিডিয়া' -- Q6275256
p['template_audio'] = 'অডিও ভাষার নাম' -- Q138620346
p['template_anchor'] = 'anchor' -- Q5412976
p['template_rfdef'] = 'rfdef' -- Q30733154
p['template_ipa'] = 'আধ্বব ভাষার নাম' -- Q138608718
p['template_trans-top'] = 'অনুবাদ-শীর্ষ' -- Q30528422
p['template_trans-bottom'] = 'অনুবাদ-নিচ' -- Q30528419
p['template_antonym'] = 'বিপরীতার্থক' -- Q35305357
p['template_synonym'] = 'synonyms' -- Q32751230
p['template_hypernym'] = 'hypernyms' -- Q35305454
p['template_demonym-noun'] = 'demonym-noun' -- Q130360250
p['template_demonym-adj'] = 'demonym-adj' -- Q135184225
p['template_homophones'] = 'সমোচ্চারিত' -- Q30557565
p['template_borrowed'] = 'ধারকৃত শব্দ' -- Q30872304
p['template_inherited'] = 'inherited' -- Q30864051
p['template_ar-rootbox'] = 'ar-rootbox' -- Q115627074
p['template_root'] = 'root' -- Q104521645
p['template_ellipsis'] = 'ellipsis' -- Q107037827
p['noun_template_suffix'] = '-noun'
p['noun_template_suffix_fallback'] = '-বিশেষ্য'
p['proper noun_template_suffix'] = '-proper noun'
p['proper noun_template_suffix_fallback'] = '-নামবাচক বিশেষ্য'
p['verb_template_suffix'] = '-verb'
p['verb_template_suffix_fallback'] = '-ক্রিয়া'
p['manual_category'] = {'বিষয়শ্রেণী', 'category'}
p['manual_etymology'] = {'ব্যুৎপত্তি', 'etymology'}
p['manual_pronunciation'] = {'উচ্চারণ', 'pronunciation'}
p['manual_meaning'] = {'অর্থ', 'meaning'}
p['manual_reference'] = {'তথ্যসূত্র', 'reference'}
p['manual_external_link'] = {'বহিঃসংযোগ', 'external_link'}
p['etymology_borrowing'] = 'থেকে [[w:ঋণশব্দ|ঋণকৃত]]'
p['etymology_learned_borrowing'] = '$1 থেকে [[d:Q845079|শিক্ষিতভাবে ঋণকৃত]]'
p['etymology_inheritance'] = 'থেকে [[উত্তরলব্ধ]]'
p['etymology_ellipsis'] = '[[w:en:Ellipsis (linguistics)|সংক্ষিপ্ত হয়ে]] উপলব্ধ'
-- অংশচ্ছেদ (ভাষাবিজ্ঞান)
p['edit_wikidata'] = 'উইকিউপাত্তে সম্পাদনা করুন'
-- বিষয়শ্রেণী যেগুলো অন্য উইকিঅভিধানে আছে
p['category_rfdef'] = 'ভাষা অনুযায়ী সংজ্ঞার জন্য অনুরোধ' -- Q33129136
p['category_rfdef_equivalent'] = 'শব্দার্থের বাংলা মানের অনুরোধ' -- [[:wikt:en:Category:Requests for English equivalent term by language]]-এর কাছাকাছি
p['category_no_matching_lemma'] = 'যেসব ভুক্তিতে লেমার হেডিং দেখানো অসম্ভব' -- Entries will be put in this category whenever a lemma heading cannot be rendered because no lemma of the linked lexeme matched the page title.
p['category_given_names'] = 'প্রদত্ত নাম' -- Q8492384
-- বিষয়শ্রেণী যেগুলো অন্য উইকিঅভিধানে নেই
p['text_category_rfdef'] = 'এই শব্দের লেক্সিমে অর্থ প্রয়োজন। দয়া করে লেক্সিম পাতায় গিয়ে একটি অর্থ যোগ করুন, যাতে অন্য পাঠকরা জানতে পারবে এটা মানে কি।'
function p.tocatlink(str)
return '[[বিষয়শ্রেণী:' .. str .. ']]'
end
function p.lang_category(lex_cat, language)
local cat_text = p.tocatlink(language .. ' লেমা')
cat_text = cat_text .. p.tocatlink(language .. ' ' .. lex_cat)
return cat_text
end
function p.wplink(qid, display_text, wb)
local link = wb.getSitelink(qid, p['wikipedia'])
if link == nil then
link = wb.getSitelink(qid, p['fallback_wikipedia'])
if link ~= nil then
return '[[w:en:' .. link .. '|' .. display_text .. ']]'
end
else
return '[[w:' .. link .. '|' .. display_text .. ']]'
end
return ''
end
function p.rfref_category(language)
local cat_text = p.tocatlink('তথ্যসূত্রহীন ' .. language .. ' শব্দ',language)
return cat_text
end
p.nolinks = { -- These are words that are so commonly used that links to entries about them are unnecessary.
['করা'] = true,
['হওয়া'] = true,
['যাওয়া'] = true,
['যে'] = true,
['ও'] = true,
['তার'] = true,
['এবং'] = true,
['যার'] = true,
['যায়'] = true,
}
return p
dsa5hhr4ejvogae8kqivms2qnz7vj8f
509306
509300
2026-05-28T10:37:20Z
Redmin
6857
509306
Scribunto
text/plain
local p = {}
p['wikipedia'] = 'bnwiki'
p['fallback_wikipedia'] = 'enwiki'
p['content_lang_name'] = 'বাংলা'
p['content_lang_code'] = 'bn'
p['heading_etymology'] = 'ব্যুৎপত্তি'
p['heading_pronunciation'] = 'উচ্চারণ'
p['heading_translation'] = 'অনুবাদ'
p['heading_references'] = 'তথ্যসূত্র'
p['heading_external_links'] = 'বহিঃসংযোগ'
p['heading_alternative_spellings'] = 'বিকল্প বানান'
p['heading_inflection_table'] = 'বিভক্তির সারণী'
p['heading_form'] = 'রূপ'
p['heading_grammatical_features'] = 'ব্যাকরণিক বৈশিষ্ট্য'
p['heading_image'] = 'চিত্র'
p['heading_alternative_script'] = 'বিকল্প রূপ'
p['text_instance_of'] = 'একটি'
p['text_audio'] = 'অডিও'
p['text_iso15919'] = '[[w:আইএসও ১৫৯১৯|আইএসও ১৫৯১৯]]:'
p['text_iast'] = '[[w:সংস্কৃত লিপ্যন্তরের আন্তর্জাতিক বর্ণমালা|সলিআব]]:'
p['text_itrans'] = '[[w:en:ITRANS|ITRANS]]:'
p['text_xsampa'] = '[[w:এক্স-সাম্পা|এক্স-সাম্পা]]:'
p['text_syllable_count'] = '[[w:অক্ষর (সিলেবল)|অক্ষর]] সংখ্যা:'
p['template_lexeme'] = 'উইকিউপাত্ত লেক্সিম' -- Q81739987
p['template_wikipedia'] = 'উইকিপিডিয়া' -- Q6275256
p['template_audio'] = 'অডিও ভাষার নাম' -- Q138620346
p['template_anchor'] = 'anchor' -- Q5412976
p['template_rfdef'] = 'rfdef' -- Q30733154
p['template_ipa'] = 'আধ্বব ভাষার নাম' -- Q138608718
p['template_trans-top'] = 'অনুবাদ-শীর্ষ' -- Q30528422
p['template_trans-bottom'] = 'অনুবাদ-নিচ' -- Q30528419
p['template_antonym'] = 'বিপরীতার্থক' -- Q35305357
p['template_synonym'] = 'synonyms' -- Q32751230
p['template_hypernym'] = 'hypernyms' -- Q35305454
p['template_demonym-noun'] = 'demonym-noun' -- Q130360250
p['template_demonym-adj'] = 'demonym-adj' -- Q135184225
p['template_homophones'] = 'সমোচ্চারিত' -- Q30557565
p['template_borrowed'] = 'ধারকৃত শব্দ' -- Q30872304
p['template_inherited'] = 'inherited' -- Q30864051
p['template_ar-rootbox'] = 'ar-rootbox' -- Q115627074
p['template_root'] = 'root' -- Q104521645
p['template_ellipsis'] = 'ellipsis' -- Q107037827
p['template_prefixsee'] = 'prefixsee' -- Q47517865
p['template_rootsee'] = 'rootsee' -- Q105987491
p['template_prefixsee'] = 'prefixsee' --
p['template_prefixsee'] = 'prefixsee' --
p['noun_template_suffix'] = '-noun'
p['noun_template_suffix_fallback'] = '-বিশেষ্য'
p['proper noun_template_suffix'] = '-proper noun'
p['proper noun_template_suffix_fallback'] = '-নামবাচক বিশেষ্য'
p['verb_template_suffix'] = '-verb'
p['verb_template_suffix_fallback'] = '-ক্রিয়া'
p['manual_category'] = {'বিষয়শ্রেণী', 'category'}
p['manual_etymology'] = {'ব্যুৎপত্তি', 'etymology'}
p['manual_pronunciation'] = {'উচ্চারণ', 'pronunciation'}
p['manual_meaning'] = {'অর্থ', 'meaning'}
p['manual_reference'] = {'তথ্যসূত্র', 'reference'}
p['manual_external_link'] = {'বহিঃসংযোগ', 'external_link'}
p['etymology_borrowing'] = 'থেকে [[w:ঋণশব্দ|ঋণকৃত]]'
p['etymology_learned_borrowing'] = '$1 থেকে [[d:Q845079|শিক্ষিতভাবে ঋণকৃত]]'
p['etymology_inheritance'] = 'থেকে [[উত্তরলব্ধ]]'
p['etymology_ellipsis'] = '[[w:en:Ellipsis (linguistics)|সংক্ষিপ্ত হয়ে]] উপলব্ধ'
-- অংশচ্ছেদ (ভাষাবিজ্ঞান)
p['edit_wikidata'] = 'উইকিউপাত্তে সম্পাদনা করুন'
-- বিষয়শ্রেণী যেগুলো অন্য উইকিঅভিধানে আছে
p['category_rfdef'] = 'ভাষা অনুযায়ী সংজ্ঞার জন্য অনুরোধ' -- Q33129136
p['category_rfdef_equivalent'] = 'শব্দার্থের বাংলা মানের অনুরোধ' -- [[:wikt:en:Category:Requests for English equivalent term by language]]-এর কাছাকাছি
p['category_no_matching_lemma'] = 'যেসব ভুক্তিতে লেমার হেডিং দেখানো অসম্ভব' -- Entries will be put in this category whenever a lemma heading cannot be rendered because no lemma of the linked lexeme matched the page title.
p['category_given_names'] = 'প্রদত্ত নাম' -- Q8492384
-- বিষয়শ্রেণী যেগুলো অন্য উইকিঅভিধানে নেই
p['text_category_rfdef'] = 'এই শব্দের লেক্সিমে অর্থ প্রয়োজন। দয়া করে লেক্সিম পাতায় গিয়ে একটি অর্থ যোগ করুন, যাতে অন্য পাঠকরা জানতে পারবে এটা মানে কি।'
function p.tocatlink(str)
return '[[বিষয়শ্রেণী:' .. str .. ']]'
end
function p.lang_category(lex_cat, language)
local cat_text = p.tocatlink(language .. ' লেমা')
cat_text = cat_text .. p.tocatlink(language .. ' ' .. lex_cat)
return cat_text
end
function p.wplink(qid, display_text, wb)
local link = wb.getSitelink(qid, p['wikipedia'])
if link == nil then
link = wb.getSitelink(qid, p['fallback_wikipedia'])
if link ~= nil then
return '[[w:en:' .. link .. '|' .. display_text .. ']]'
end
else
return '[[w:' .. link .. '|' .. display_text .. ']]'
end
return ''
end
function p.rfref_category(language)
local cat_text = p.tocatlink('তথ্যসূত্রহীন ' .. language .. ' শব্দ',language)
return cat_text
end
p.nolinks = { -- These are words that are so commonly used that links to entries about them are unnecessary.
['করা'] = true,
['হওয়া'] = true,
['যাওয়া'] = true,
['যে'] = true,
['ও'] = true,
['তার'] = true,
['এবং'] = true,
['যার'] = true,
['যায়'] = true,
}
return p
n2l0mj485dv0v3jy6xqle4ymhhc0uf1
মডিউল:etymon
828
162844
509307
461889
2026-05-28T10:54:02Z
Redmin
6857
509307
Scribunto
text/plain
local export = {}
local anchors_module = "Module:anchors"
local etymology_module = "Module:etymology"
local headword_data_module = "Module:headword/data"
local languages_module = "Module:languages"
local languages_errorgetby_module = "Module:languages/errorGetBy"
local links_module = "Module:links"
local pages_module = "Module:pages"
local parameters_module = "Module:parameters"
local parameters_data_module = "Module:parameters/data"
local string_utilities_module = "Module:string utilities"
local template_parser_module = "Module:template parser"
local templatestyles_module = "Module:TemplateStyles"
local utilities_module = "Module:utilities"
local debug_module = "Module:debug"
local concat = table.concat
local find = string.find
local gsub = string.gsub
local html_create = mw.html.create
local insert = table.insert
local match = string.match
local max = math.max
local new_title = mw.title.new
local next = next
local require = require
local sub = string.sub
local tostring = tostring
local type = type
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local function track(page)
trackfn("etymon/" .. page)
return true
end
local unallowed_langs = { ["zh"] = { ["ref"] = "[[Wiktionary:Beer_parlour/2025/May#etymon_for_Chinese]]" } }
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function check_ancestor(...)
check_ancestor = require(etymology_module).check_ancestor
return check_ancestor(...)
end
local function find_templates(...)
find_templates = require(template_parser_module).find_templates
return find_templates(...)
end
local function format_categories(...)
format_categories = require(utilities_module).format_categories
return format_categories(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function get_link_page(...)
get_link_page = require(links_module).get_link_page
return get_link_page(...)
end
local function get_section(...)
get_section = require(pages_module).get_section
return get_section(...)
end
local function language_anchor(...)
language_anchor = require(anchors_module).language_anchor
return language_anchor(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function templatestyles(...)
templatestyles = require(templatestyles_module)
return templatestyles(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function trackfn(...)
trackfn = require(debug_module).track
return trackfn(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local content_page
local function is_content_page()
content_page, is_content_page = require(pages_module).is_content_page(mw.title.getCurrentTitle()), nil
return content_page
end
local page_data
local function get_page_data()
page_data, get_page_data = mw.loadData(headword_data_module).page, nil
return page_data
end
local frame
-- Generate an HTML link.
local function makeLink(params)
-- [[Wiktionary:Beer_parlour/2025/May#{{etymon}}_for_Chinese]]
if params["lang"]:getCode() == "zh" then
params["tr"] = ""
end
return full_link(params, "term")
end
-- Get a language object.
local function getLang(code)
return get_lang(code, nil, true) or require(languages_errorgetby_module).code(code, true, true)
end
-- Normalize the language so that special handling of Chinese is accounted for.
-- This is everything in the Sinitic family which isn't a creole, pidgin or mixed language.
local function getNormLang(lang)
if lang:inFamily("zhx") and not lang:inFamily("qfa-cnt") then
return get_lang("zh")
end
return lang
end
-- Given an etymon param, return its parts.
local function getParts(templateLang, etymonParam)
local etymonLang, etymonLangcode, etymonPage, etymonId
local parts = split(etymonParam, ">", true)
local n = #parts
for i = 1, n do
parts[i] = trim(parts[i])
end
-- FIXME: this doesn't work properly if nested templates output HTML tags, which is likely to cause bugs that are hard for ordinary users to fix.
if n == 2 then
-- Assume language is the same as the template call if none is provided.
etymonLang, etymonPage, etymonId = templateLang, unpack(parts)
else
etymonLangcode, etymonPage, etymonId = unpack(parts)
etymonLang = getLang(etymonLangcode)
end
return etymonLang, etymonPage, etymonId
end
local argsOf = {}
local disambiguationCount = {}
local function scrapePage(etymonPage, etymonTitle, key, etymonLang, etymonId, redirectedFrom)
local content = etymonTitle:getContent()
if content == nil then
argsOf[key] = "redlink"
return
end
-- Search only the relevant L2 entry, unless it's a redirect, in which case search the whole page.
local redirectTarget = etymonTitle.redirectTarget
if not redirectTarget then
content = get_section(content, etymonLang:getFullName(), 2)
if content == nil then
argsOf[key] = "missing"
return
end
end
local etymonLangcode = etymonLang:getFullCode()
local L2_key = etymonLangcode .. ">" .. etymonPage
-- Search for the template on the page (even if this is a redirect page).
-- FIXME: mw.uri.anchorEncode on IDs. Not possible to implement until ">" syntax is fixed (see comment in getParts).
for template in find_templates(content) do
if template:get_name() == "etymon" then
local templateArgs = template:get_arguments()
if templateArgs[1] == etymonLangcode then
argsOf[L2_key .. ">" .. templateArgs["id"]] = templateArgs
disambiguationCount[L2_key] = (disambiguationCount[L2_key] or 0) + 1
end
end
end
if redirectedFrom and disambiguationCount[L2_key] then
disambiguationCount[redirectedFrom] = (disambiguationCount[redirectedFrom] or 0) + disambiguationCount[L2_key]
end
-- If scraping produced a result, there's nothing left to do.
if argsOf[key] then
return
-- Else if we've already followed a redirect and still found nothing, record the template as missing.
elseif redirectedFrom then
argsOf[key] = "missing"
return
end
-- Check if the page is a redirect, and if not record the template as missing.
if not redirectTarget then
argsOf[key] = "missing"
return
end
-- Otherwise, try again with the redirect target.
etymonPage = redirectTarget.prefixedText
scrapePage(etymonPage, redirectTarget, L2_key .. ">" .. etymonId, etymonLang, etymonId, L2_key)
-- Record the value as the same as the redirect's.
argsOf[key] = argsOf[etymonLangcode .. ">" .. etymonPage .. ">" .. etymonId]
end
-- Given an etymon, scrape the page and get its parameters.
-- This function returns either: a table of the params, "missing", "redlink", or "nolink"
local function getArgs(templateLang, etymonParam)
-- Get normalized parts of the etymon parameter.
local etymonLang, etymonPage, etymonId = getParts(templateLang, etymonParam)
-- "?" is a special value that unlinks the page. TODO: Figure this out...
if etymonId == "?" then
return "nolink"
end
-- If multiple terms are linked like A//B, only look at A.
etymonPage = match(etymonPage, "^(.-)//") or etymonPage
etymonPage = get_link_page(etymonPage, etymonLang)
etymonLang = getNormLang(etymonLang)
-- Find the parameters by scraping etymonPage.
-- Store data in the argsOf table to save time in case the same etymon is accessed again.
-- The key is a normalized version of etymonParam.
local key = etymonLang:getFullCode() .. ">" .. etymonPage .. ">" .. etymonId
if argsOf[key] == nil then
local etymonTitle = new_title(etymonPage)
if not etymonTitle then
-- This shouldn't happen: all unsupported titles should be resolved at this stage.
error("Invalid page title \"" .. etymonPage .. "\" encountered.")
end
scrapePage(etymonPage, etymonTitle, key, etymonLang, etymonId)
end
return argsOf[key]
end
-- [tag]: {abbreviation, label glossary anchor, start text, start text plus, middle text, forms groups}
-- Note: the keywords `root`, `afeq`, `conf`, and `unc` are also recognized, but do not use this dictionary.
-- Please do not add any new keywords without discussion or this list will get extremely unwieldy.
-- If we decide to add keywords for each thing I will have to figure out a systematic way to organize them.
local keywordDict = {
["from"] = {false, false, "From", "From", "from", false, false},
["uder"] = {false, false, "From", "From", "from", false, false},
["inh"] = {false, false, "From", "[[Appendix:Glossary#inherited|Inherited]] from", "from", false},
["af"] = {false, false, "From", "From", "from", true},
["blend"] = {"blend.", "blend", "Blend of", "[[Appendix:Glossary#blend|Blend]] of", "a blend of", true},
["bor"] = {"bor.", "borrowing", "Borrowed from", "[[Appendix:Glossary#borrowing|Borrowed]] from", "borrowed from", false},
["lbor"] = {"lbor.", "learned_borrowing", "Learned borrowing from", "[[Appendix:Glossary#learned_borrowing|Learned borrowing]] from", "borrowed from", false},
["obor"] = {"obor.", "orthographic_borrowing", "Orthographic borrowing from", "[[Appendix:Glossary#orthographic_borrowing|Orthographic borrowing]] from", "borrowed from", false},
["slbor"] = {"slbor.", "semi-learned_borrowing", "Semi-learned borrowing from", "[[Appendix:Glossary#semi-learned_borrowing|Semi-learned borrowing]] from", "borrowed from", false},
["der"] = {"der.", "derived_terms", "Derived from", "[[Appendix:Glossary#derived_terms|Derived]] from", "from", false},
["calque"] = {"calq.", "calque", "Calque of", "[[Appendix:Glossary#calque|Calque]] of", "a calque of", false},
["sl"] = {"sl.", "semantic loan", "Semantic loan of", "[[Appendix:Glossary#semantic_loan|Semantic loan]] of", "a semantic loan of", false},
["bf"] = {"bf.", "back-formation", "Back-formation from", "[[Appendix:Glossary#Back-formation|Back-formation]] from", "a back-formation from", false},
["translit"] = {"translit.", "transliteration", "Transliteration of", "[[Appendix:Glossary#transliteration|Transliteration]] of", "borrowed from", false},
["vrd"] = {"vrd.", "vṛddhi derivative", "Vṛddhi derivative of", "[[vṛddhi|Vṛddhi]] derivative of", "a vṛddhi derivative of", false},
["aphetic"] = {"aph.", "aphesis", "Aphetic form of", "[[Appendix:Glossary#aphesis|Aphetic form]] of", "an aphetic form of", false},
["influence"] = {"influ.", "contamination", "", "", "", false}
}
-- This function takes an etymon and recursively builds a tree to display in an entry.
local function etyTree(currTitle, lang, args, alreadySeen, isTopLevel, isUncertain, label)
local treeWidth = 0
local treeHeight = 0
local subtree, subtreeHeight, subtreeWidth, etymonLang, etymonPage, etymonArgs
local subtrees = {}
local currId = ""
if type(args) == "table" then
currId = args["id"]
end
local key = getNormLang(lang):getFullCode() .. ">" .. get_link_page(currTitle, lang) .. ">" .. currId
local derType, confidence, ignoreEtymons = "from", "conf", false
-- Only recurse when an etymon has params and was not included in the tree previously.
if type(args) == "table" and alreadySeen[key] == nil then
local i, templateLang = 1, getLang(args[1])
-- Add the page to alreadySeen, which keeps track of what's already been added to the tree and the depth reached.
alreadySeen[key] = true
-- Loop over each parameter in the current template, starting from 2.
while true do
i = i + 1
local param = args[i]
if param == nil then
break
elseif find(param, ">", nil, true) and not ignoreEtymons then
etymonLang, etymonPage = getParts(templateLang, param)
-- Scrape the page and get the parameters.
etymonArgs = getArgs(templateLang, param)
-- Recurse into the etymon and append its tree to the list of subtrees.
subtree, subtreeHeight, subtreeWidth = etyTree(etymonPage, etymonLang, etymonArgs, alreadySeen, false, confidence == "unc", derType)
insert(subtrees, subtree)
treeHeight = max(treeHeight, subtreeHeight)
treeWidth = treeWidth + subtreeWidth
else
-- Reached a keyword.
if param == "conf" or param == "unc" then
confidence = param
elseif keywordDict[param] ~= nil then
ignoreEtymons = false
confidence = "conf"
derType = param
else
ignoreEtymons = true
end
end
end
end
-- Create link.
local link = "<span style=\"display:inline-block\" class=\"etyl\">" .. lang:getCanonicalName() .. "</span> <span style=\"display:inline-block\">"
if isTopLevel then
link = link .. makeLink({lang = lang, alt = "'''" .. currTitle .. "'''"})
elseif currId == "" then
link = link .. makeLink({lang = lang, term = currTitle})
else
link = link .. makeLink({lang = lang, term = currTitle, id = currId})
end
link = link .. "</span>"
-- Create tree.
local tree = ""
if #subtrees == 1 then
-- Add long top connector.
tree = tree .. "<span style=\"position:relative;height:20px;border-right:2px solid var(--wikt-palette-grey,#9e9e9e)\"></span>"
elseif #subtrees >= 2 then
--Add short top connector.
tree = tree .. "<span style=\"position:relative;height:10px;border-right:2px solid var(--wikt-palette-grey,#9e9e9e)\"></span>"
end
--Create term block.
tree = tree .. "<div style=\"position:relative;text-align:center;padding:5px 10px;background:var(--wikt-palette-beige,#fffbf2);color:inherit;border:1px solid var(--wikt-palette-lightgrey,#ccc);border-radius:4px\">" .. link
-- Add derivation and uncertainty labels.
-- TODO: make the CSS less horrible.
if (label ~= "" and keywordDict[label][1] ~= false) or isUncertain then
tree = tree .. "<span style=\"z-index:1;position:absolute;transform:translate(-50%);top:calc(100% + 5px);left:50%;border-radius:2px;background:var(--wikt-palette-cyan,#eaffff);color:inherit;font-size:12px;height:10px;line-height:10px\">"
if label ~= "" and keywordDict[label][1] ~= false then
tree = tree .. "[[Appendix:Glossary#" .. keywordDict[label][2] .. "|<abbr title=\"" .. gsub(keywordDict[label][2], "_", " ") .. "\" style=\"color:var(--wikt-palette-black,#202122);font-style:italic;text-decoration:none\">" .. keywordDict[label][1] .. "</abbr>]]"
if isUncertain then
-- Add uncertainty label next to the derivation label.
tree = tree .. "<abbr title=\"uncertain\" style=\"position:absolute;top:50%;transform:translate(0,-48%);left:calc(100% + 2px);font-size:10px;border-radius:2px;background:var(--wikt-palette-pink,#ffe0f0);color:inherit;padding:1px 2px;font-weight:bold;text-decoration:none\">?</abbr>"
end
elseif isUncertain then
-- Add uncertainty label in the middle.
tree = tree .. "<abbr title=\"uncertain\" style=\"position:absolute;top:50%;left:50%;transform:translate(calc(-50% - 1px),-50%);font-size:10px;border-radius:2px;background:var(--wikt-palette-pink,#ffe0f0);color:inherit;padding:1px 2px;font-weight:bold;text-decoration:none\">?</span>"
end
tree = tree .. "</span>"
end
tree = tree .. "</div>"
-- Append subtrees.
local n_subtrees = #subtrees
if n_subtrees == 1 then
tree = subtrees[1] .. tree
elseif n_subtrees >= 2 then
local i, subtreeString = 0, ""
while true do
i = i + 1
local v = subtrees[i]
if v == nil then
break
elseif i == 1 then
-- Add left connector.
v = v .. "<span style=\"align-self:start;left:50%;width:calc(50% + 0.25em);height:10px;position:relative;border-bottom:2px solid var(--wikt-palette-grey,#9e9e9e);border-left:2px solid var(--wikt-palette-grey,#9e9e9e);border-bottom-left-radius:4px\"></span>"
elseif i == n_subtrees then
-- Add right connector.
v = v .. "<span style=\"align-self:end;right:50%;width:calc(50% + 0.25em);height:10px;position:relative;border-bottom:2px solid var(--wikt-palette-grey,#9e9e9e);border-right:2px solid var(--wikt-palette-grey,#9e9e9e);border-bottom-right-radius:4px\"></span>"
else
-- Add a short bottom connector and middle connector.
v = v .. "<span style=\"position:relative;height:10px;border-right:2px solid var(--wikt-palette-grey,#9e9e9e)\"></span><span style=\"position:relative;width:calc(100% + 0.5em);border-bottom:2px solid var(--wikt-palette-grey,#9e9e9e)\"></span>"
end
-- Add column div.
v = "<div style=\"display:flex;flex-direction:column;align-items:center\">" .. v .. "</div>"
subtreeString = subtreeString .. v
end
tree = "<div style=\"position:relative;display:flex;column-gap:0.5em;align-items:end\">" .. subtreeString .. "</div>" .. tree
else
--Reached a leaf node.
treeWidth = treeWidth + 1
end
-- Add outer divs.
if isTopLevel then
tree = "<div style=\"width:fit-content;margin:auto;padding:0.5em;display:flex;flex-direction:column;align-items:center\">" .. tree .. "</div>"
tree = "<div class=\"etytree NavFrame\" data-etytree-height=\"" .. treeHeight + 1 .. "\" data-etytree-width=\"" .. treeWidth .. "\"><div class=\"NavHead\" style=\"background:var(--wikt-palette-lightergrey,#eeeeee);color:inherit\"><div style=\"width:25em\">Etymology tree</div></div><div class=\"NavContent\" style=\"overflow:auto\">" .. tree .. "</div></div>"
end
return tree, treeHeight + 1, treeWidth
end
-- This function takes an etymon and generates some text to display in an entry.
-- Currently, it is only able to handle simple combinations of parameters.
local function etyText(title, lang, args, usePlusTemplates, maxDepth)
local text = ""
local depth = 1
local alreadyWritten = {}
local key, currLang, group, groupType, groupConfidence, confidence, derType, foundGroup, complexParams, ignoreEtymons, etymonLang, etymonTitle, etymonId, templateLang
-- Loop and continuously expand the sentence until we reach the end of the chain.
while not maxDepth or depth <= maxDepth do
group, groupType, groupConfidence, confidence, derType, foundGroup, complexParams, ignoreEtymons, currLang = {}, "from", "conf", "conf", "from", false, false, false, lang
key = getNormLang(lang):getFullCode() .. ">" .. get_link_page(title, lang) .. ">" .. args["id"]
templateLang = getLang(args[1])
-- Stop if we encounter an already-seen term.
if alreadyWritten[key] ~= nil then
break
end
alreadyWritten[key] = true
local i = 1 -- Iterate from 2.
while true do
i = i + 1
local param = args[i]
if param == nil then
break
elseif find(param, ">", nil, true) and not ignoreEtymons then
-- The text should only continue if `args` is either (not including `influence` or `afeq` etymons):
-- A single etymon, or single `af` group. Otherwise the parameters are too "complex" and are rejected.
-- TODO: add smarter handling for complex parameters.
if foundGroup or (#group == 1 and not keywordDict[derType][6]) then
complexParams = true
break
end
groupType = derType
if confidence == "unc" then
groupConfidence = "unc"
end
insert(group, param)
else
-- Reached a keyword.
if param == "unc" then
confidence = param
elseif param == "afeq" or param == "influence" or param == "root" then
ignoreEtymons = true
if #group == 1 then
foundGroup = true
end
else
ignoreEtymons = false
confidence = "conf"
derType = param
if #group == 1 then
foundGroup = true
end
end
end
end
if complexParams or #group == 0 then
break
end
if #group == 1 then
args = getArgs(templateLang, group[1])
end
if text == "" then
-- Start the sentence.
if groupConfidence == "conf" and not usePlusTemplates then
text = keywordDict[groupType][3]
elseif groupConfidence == "conf" and usePlusTemplates then
text = keywordDict[groupType][4]
else
text = "Possibly " .. keywordDict[groupType][5]
end
else
-- Add a phrase onto the sentence.
if groupConfidence == "conf" then
text = text .. ", " .. keywordDict[groupType][5]
else
text = text .. ", possibly " .. keywordDict[groupType][5]
end
end
-- Add the links.
for i = 1, #group do
etymonLang, etymonTitle, etymonId = getParts(templateLang, group[i])
--Make sure ID exists prior to linking to it.
if type(getArgs(templateLang, group[i])) ~= "table" then
etymonId = nil
end
if etymonLang:getCanonicalName() ~= currLang:getCanonicalName() then
group[i] = etymonLang:makeWikipediaLink() .. " " .. makeLink({lang = etymonLang, term = etymonTitle, id = etymonId})
currLang = etymonLang
else
group[i] = makeLink({lang = etymonLang, term = etymonTitle, id = etymonId})
end
end
text = text .. " " .. concat(group, " + ")
depth = depth + 1
if #group >= 2 then
break
end
lang = etymonLang
title = etymonTitle
if type(args) ~= "table" then
break
end
end
-- Add a period at the end of the sentence.
if text ~= "" then
text = text .. "."
end
return text
end
-- This function take an etymon and recursively generates categories to add to the entry.
-- Currently the behaviour tries to emulate existing templates including {{dercat}}.
-- More specific and useful categories are planned pending consensus (e.g. take confidence into account).
local function etyCategories(title, langName, args, passedThroughOtherLanguage, inInhChain, categories, seen)
local etymonLang, categoryEtymonTitle, etymonTitle, normTitle, etymonId, etymonLangName, etymonNormLangName, etymonArgs, key, L2_key, etymonPassedThroughOtherLanguage, etymonInInhChain, categoryName
local templateLang, currGroupLength, derType, isTopLevel = getLang(args[1]), 0, "from"
if categories == nil then
categories, isTopLevel = {}, true
end
local i = 1 -- Iterate from 2.
while true do
i = i + 1
local param = args[i]
if param == nil then
break
elseif find(param, ">", nil, true) then
currGroupLength = currGroupLength + 1
etymonLang, etymonTitle, etymonId = getParts(templateLang, param)
normTitle = get_link_page(etymonTitle, etymonLang)
L2_key = getNormLang(etymonLang):getFullCode() .. ">" .. normTitle
key = L2_key .. ">" .. etymonId
etymonLangName = etymonLang:getCanonicalName()
etymonNormLangName = getNormLang(etymonLang):getFullName()
etymonInInhChain = inInhChain and (derType == "from" or derType == "inh")
etymonPassedThroughOtherLanguage = passedThroughOtherLanguage or langName ~= etymonNormLangName
etymonArgs = getArgs(templateLang, param)
-- FIXME: this should use :getCanonicalName() for the target language name and :getDisplayForm() for the source language name. Currently uses :getCanonicalName() for both.
if isTopLevel then
--Add a maintenance category if an invalid ID is provided.
if etymonArgs == "missing" or etymonArgs == "redlink" then
if content_page == nil and is_content_page() or content_page then
categories[langName .. " entries referencing etymons with invalid IDs"] = true
else
categories["Entries referencing etymons with invalid IDs/hidden"] = true
end
end
-- Add borrowing categories at the top level only.
if derType == "bor" or derType == "lbor" or derType == "slbor" then
categories[langName .. " terms borrowed from " .. etymonLangName] = true
end
if derType == "uder" then
categories[langName .. " undefined derivations"] = true
elseif derType == "lbor" then
categories[langName .. " learned borrowings from " .. etymonLangName] = true
elseif derType == "calque" then
categories[langName .. " terms calqued from " .. etymonLangName] = true
elseif derType == "sl" then
categories[langName .. " semantic loans from " .. etymonLangName] = true
elseif derType == "slbor" then
categories[langName .. " semi-learned borrowings from " .. etymonLangName] = true
elseif derType == "translit" then
categories[langName .. " transliterations of " .. etymonLangName .. " terms"] = true
elseif derType == "bf" then
categories[langName .. " back-formations"] = true
elseif derType == "blend" then
categories[langName .. " blends"] = true
elseif derType == "vrd" then
categories[langName .. " vrddhi derivatives"] = true
elseif derType == "aphetic" then
categories[langName .. " aphetic forms"] = true
elseif derType == "obor" then
categories[langName .. " orthographic borrowings from " .. etymonLangName] = true
end
end
-- Add basic derivation categories.
if etymonPassedThroughOtherLanguage and langName == etymonNormLangName then
categories[langName .. " terms borrowed back into " .. etymonLangName] = true
end
if etymonNormLangName ~= langName then
categories[langName .. " terms derived from " .. etymonLangName] = true
end
if etymonNormLangName ~= langName and etymonInInhChain then
categories[langName .. " terms inherited from " .. etymonLangName] = true
end
categoryEtymonTitle = normTitle
if sub(categoryEtymonTitle, 1, 15) == "Reconstruction:" then
categoryEtymonTitle = gsub(categoryEtymonTitle, "^Reconstruction:[^/]+/", "*")
end
-- Add affix categories.
if type(etymonArgs) == "table" and etymonArgs["pos"] ~= nil and (derType == "af" or derType == "afeq") and isTopLevel then
if (etymonArgs["pos"] == "prefix" or etymonArgs["pos"] == "suffix" or etymonArgs["pos"] == "interfix" or etymonArgs["pos"] == "infix") then
if etymonArgs["pos"] == "prefix" then
categoryName = categoryEtymonTitle .. " উপসর্গ দ্বারা গঠিত " .. langName .. " শব্দ"
elseif etymonArgs["pos"] == "suffix" then
categoryName = langName .. " terms suffixed with " .. categoryEtymonTitle
elseif etymonArgs["pos"] == "interfix" then
categoryName = langName .. " terms interfixed with " .. categoryEtymonTitle
elseif etymonArgs["pos"] == "infix" then
categoryName = langName .. " terms infixed with " .. categoryEtymonTitle
end
-- Add ID if necessary for disambiguation.
if disambiguationCount[L2_key] > 1 then
categoryName = categoryName .. " (" .. etymonId .. ")"
end
categories[categoryName] = true
end
end
-- Add root categories.
-- TODO: there are currently two ways of specifying roots: pos=root on the etymon,
-- and the special root keyword. Maybe we should clean this up.
if (type(etymonArgs) == "table" and etymonArgs["pos"] == "root") or derType == "root" then
if etymonPassedThroughOtherLanguage then
categoryName = langName .. " terms derived from the " .. etymonLangName .. " root " .. categoryEtymonTitle
else
categoryName = langName .. " terms belonging to the root " .. categoryEtymonTitle
end
-- Add ID if necessary for disambiguation.
if (disambiguationCount[L2_key] or 0) > 1 then
categoryName = categoryName .. " (" .. etymonId .. ")"
end
categories[categoryName] = true
end
-- Recurse into the etymon.
if (
not (derType == "afeq" or derType == "influence" or derType == "root") and
(seen == nil or seen[key] == nil) and
type(etymonArgs) == "table"
) then
if seen == nil then
seen = {}
end
seen[key] = true
etyCategories(title, langName, etymonArgs, etymonPassedThroughOtherLanguage, etymonInInhChain, categories, seen)
end
elseif not (param == "unc" or param == "conf") then
derType = param
currGroupLength = 0
end
end
return categories
end
-- TODO: this should all be integrated into etyCategories at the top-level pass.
local function paramsSanityCheck(lang, params, id, title, pos)
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters. See the [[Template:etymon/documentation#Parameters|documentation]] for more details.")
elseif id == title or id == (page_data or get_page_data()).pagename then
error("The `id` parameter must not be the same as the page title. Be more creative. See the [[Template:etymon/documentation#Parameters|documentation]] for more details.")
end
if pos and pos ~= "prefix" and pos ~= "suffix" and pos ~= "interfix" and pos ~= "infix" and pos ~= "root" then
error("Unknown value provided for `pos`. Allowed values are: prefix, suffix, interfix, infix, root.")
end
local i, currKeyword, singleAfParam, paramLang = 0, "from", "not in group"
while true do
i = i + 1
local param = params[i]
if param == nil then
break
elseif find(param, ">", nil, true) then
--In this case, `templateLang` is the same as `lang` because we are at the top level.
paramLang = getParts(lang, param)
if currKeyword == "from" then
if paramLang:getFullCode() ~= lang:getFullCode() then
error(param .. " is associated with `from` (same-language derivation) but is of language `" .. paramLang:getFullCode() .. "`, which does not match the current entry language (`" .. lang:getFullCode() .. "`); see the [[Template:etymon/documentation#Derivation keywords|documentation]] for more details.")
end
elseif currKeyword == "inh" then
if lang:getFullCode() == paramLang:getFullCode() then
error("The `inh` keyword cannot be used for same-language derivation (use `from`); this error might be due to a missing `>` (i.e. lang>term rather than lang>term>id)")
end
check_ancestor(lang, paramLang)
elseif keywordDict[currKeyword] and keywordDict[currKeyword][6] then
singleAfParam = singleAfParam ~= "not in group" and "found group" or param
elseif (currKeyword == "bor" or currKeyword == "lbor" or currKeyword == "obor" or currKeyword == "slbor" or currKeyword == "der" or currKeyword == "uder" or currKeyword == "calque" or currKeyword == "sl") and (paramLang:getCode() == lang:getCode()) then
error(param .. " is associated with `" .. currKeyword .. "` but has the same language (`" .. paramLang:getCode() .. "`) as the current entry; see the [[Template:etymon/documentation#Derivation keywords|documentation]] for more details.")
end
elseif param ~= "unc" and param ~= "conf" and param ~= "afeq" and param ~= "root" and keywordDict[param] == nil then
error("Received unknown keyword: " .. param)
elseif param ~= "unc" and param ~= "conf" then
currKeyword = param
if singleAfParam == "found group" then
singleAfParam = "not in group"
end
end
end
if singleAfParam ~= "not in group" and singleAfParam ~= "found group" then
error("Detected `af` or group containing only a single etymon: `" .. singleAfParam .. "`; note that `af` and `afeq` groups must have at least two etymons. See the [[Template:etymon/documentation#Derivation keywords|documentation]] for more details.")
end
end
function export.main(_frame)
frame = _frame
-- Process argument input.
local args = process_params(frame:getParent().args, mw.loadData(parameters_data_module).etymon)
local lang = args[1]
-- Store non-numeric parameters as locals, then treat the main numeric list as `args`.
local id = args["id"]
local title = args["title"]
local text = args["text"]
local tree = args["tree"]
local exnihilo = args["exnihilo"]
local pos = args["pos"]
args = args[2]
-- The `title` parameter is used for overriding the page title.
if title == nil then
-- Get the canonical pagename.
title = (page_data or get_page_data()).pagename
-- Determine if current term is reconstructed.
if page_data.namespace == "Reconstruction" then
title = "*" .. title
end
end
paramsSanityCheck(lang, args, id, title, pos)
-- Add the langcode and `id`, to match the format of scraped parameters.
insert(args, 1, lang:getCode())
args["id"] = id
argsOf[args[1] .. ">" .. title .. ">" .. id] = args
-- Add anchor to output.
local output = {tostring(html_create("ul")
:attr("id", language_anchor(lang, id))
:allDone()
)}
local langName, categories = lang:getFullName(), {}
if content_page == nil and is_content_page() or content_page then
local categorySet = etyCategories(title, langName, args, false, true)
for category in next, categorySet do
insert(categories, category)
end
end
-- Special categories.
if exnihilo then
insert(categories, langName .. " terms coined ex nihilo")
end
-- Insert tree.
if tree then
if unallowed_langs[lang:getCode()] then
local error_text = "etymology trees are not allowed for " .. lang:getFullName()
if unallowed_langs[lang:getCode()]["ref"] then error_text = error_text .. "; see " .. unallowed_langs[lang:getCode()]["ref"] else error_text = error_text .. "." end
error(error_text)
end
insert(output, templatestyles("Module:etymon/styles.css"))
insert(output, (etyTree(title, lang, args, {}, true, false, "")))
insert(categories, langName .. " entries with etymology trees")
end
-- Insert text.
if text then
if unallowed_langs[lang:getCode()] then
local error_text = "etymology texts are not allowed for " .. lang:getFullName()
if unallowed_langs[lang:getCode()]["ref"] then error_text = error_text .. "; see " .. unallowed_langs[lang:getCode()]["ref"] else error_text = error_text .. "." end
error(error_text)
end
insert(categories, langName .. " entries with etymology texts")
end
if text == "++" then
insert(output, etyText(title, lang, args, true, false))
elseif text == "+" then
insert(output, etyText(title, lang, args, true, 1))
elseif text == "-" then
insert(output, etyText(title, lang, args, false, 1))
elseif text ~= nil then
insert(output, etyText(title, lang, args, false, false))
end
-- [[https://en.wiktionary.org/wiki/Wiktionary:Beer_parlour/2025/May#etymon_for_Chinese]]
if #categories > 0 and lang:getCode() ~= "zh" then
insert(output, format_categories(categories, lang))
end
return concat(output)
end
return export
qh48ewtbxag1gr95simdrybfmrlih77
دماغ
0
168089
509295
2026-05-27T20:46:23Z
LexemeBot
14414
উইকিউপাত্ত লেক্সিমের জন্য একটি নতুন ভুক্তি তৈরি করছি
509295
wikitext
text/x-wiki
{{লে|L1078947}}
jnwnfrza95dd4jvy0fs5x0re3q3a8di
ਦਿਮਾਗ਼
0
168090
509296
2026-05-27T20:46:23Z
LexemeBot
14414
উইকিউপাত্ত লেক্সিমের জন্য একটি নতুন ভুক্তি তৈরি করছি
509296
wikitext
text/x-wiki
{{লে|L1078947}}
jnwnfrza95dd4jvy0fs5x0re3q3a8di