Wiktionary viwiktionary https://vi.wiktionary.org/wiki/Wiktionary:Trang_Ch%C3%ADnh MediaWiki 1.46.0-wmf.23 case-sensitive Phương tiện Đặc biệt Thảo luận Thành viên Thảo luận Thành viên Wiktionary Thảo luận Wiktionary Tập tin Thảo luận Tập tin MediaWiki Thảo luận MediaWiki Bản mẫu Thảo luận Bản mẫu Trợ giúp Thảo luận Trợ giúp Thể loại Thảo luận Thể loại Phụ lục Thảo luận Phụ lục TimedText TimedText talk Mô đun Thảo luận Mô đun Event Event talk hond 0 1636 2345102 2120163 2026-04-14T03:02:08Z Hiyuune 50834 2345102 wikitext text/x-wiki {{also|Hond|hönd|hǫnd|Hond.}} {{-afr-}} {{wikipedia|lang=af}} [[Tập tin:Bloodhound duke 1.jpg|nhỏ|'n '''hond''' (một con '''chó''').]] {{-etym-}} Từ {{etym-inh|af|nl|hond}}. {{-pron-}} * {{IPA4|af|/ɦɔnt/}} * {{audio|af|LL-Q14196 (afr)-Oesjaar-hond.wav|Âm thanh (Johannesburg)}} {{-noun-}} {{af-noun|honde|hondjie}} # Con [[chó]]. {{C|af|Chó}} {{-nld-}} {{nl-biến danh|honden|hondje}} {{-noun-}} {{nld-noun|m|honden|hondje}} # Con [[chó]]. {{-prov-}} Als twee '''honden''' vechten om een been, loopt een derde ermee heen. &ndash; ''Nếu hai con chó đánh nhau vì một cái xương, thì con thứ ba ra đi với nó.'' Nếu người ta cãi nhau về cái gì đó, thì không ai sẽ có nó. {{-drv-}} [[hondenleven]], [[hondenweer]], [[hondenbaan]], [[hondenhok]], [[rashond]], [[straathond]] {{-related-}} [[reu]], [[teef]], [[puppy]] {{C|nl|Chó}} 7asksid4sj85x8rsziq5hfuohirtpfv dromen 0 2951 2344947 2120741 2026-04-13T12:42:38Z Hiyuune 50834 2344947 wikitext text/x-wiki =={{langname|nl}}== ==={{section|pron}}=== * {{IPA4|nl|/ˈdroːmə(n)/}} * {{audio|nl|Nl-dromen.ogg}} * {{hyphenation|nl|dro|men}} * {{rhymes|nl|oːmən|s=2}} ==={{section|etym}} 1=== Từ {{inh|nl|dum|drômen}}, từ {{inh|nl|odt|*drōmen}}, từ {{inh|nl|gmw-pro|*draumijan}}, từ {{inh|nl|gem-pro|*draumijaną}}. ===={{section|v}}==== {{nl-verb}} # {{lb|nl|intransitive}} [[mơ màng|Mơ màng]]. ====={{section|forms}}===== {{nl-conj-wk|droom|drome}} ====={{section|drv}}===== {{col|nl |afdromen |bedromen |dagdromen |doordromen |dromer |dromerig |terugdromen |toedromen |uitdromen |verdromen |voortdromen |wegdromen }} ====={{section|rel}}===== * {{l|nl|droom}} ====={{section|desc}}===== * {{desc|gmw-jdt|drôme}} * {{desc|dcr|droom|drom}} ** {{desc|vic|drom|bor=1}} {{q|cổ xưa}} ==={{section|etym}} 2=== {{nonlemma}} ===={{section|n}}==== {{head|nl|Biến thể hình thái danh từ}} # {{plural of|nl|droom}} ====={{section|desc}}===== * {{desc|pap|drumi|bor=1}} ==={{section|ana}}=== * {{l|nl|morden}} =={{langname|dum}}== ==={{section|etym}}=== {{dercat|dum|gem-pro|inh=1}} Từ {{inh|dum|odt|*drōmen}}, từ {{inh|dum|gmw-pro|*draumijan}}. ==={{section|v}}=== {{dum-verb|head=drômen}} # [[mơ màng|Mơ màng]]. ===={{section|infl}}==== {{dum-conj-wk|drôm}} ===={{section|desc}}==== * {{desc|nl|dromen}} * {{desc|li|droume|dröjme}} ==={{section|further}}=== * {{R:VMNW|ID58912|II}} * {{R:MNW|07807|I}} 7yqagst4vvet4sm23yilh9hgmp8tr44 tin cá 0 83195 2344984 2344643 2026-04-13T13:55:28Z TheHighFighter2 42988 TheHighFighter2 đã đổi [[Tin cá]] thành [[tin cá]] (đã tắt đổi hướng) 2344643 wikitext text/x-wiki {{Delete|out of scope}} {{-vie-}} {{-pron-}} {{vie-pron|Tin|cá}} {{-pr-noun-}} '''Tin cá''' # [[do|Do]] [[chữ]] [["Ngư]] [[tín"]], chỉ [[tin tức]], [[thư từ]] [[nói chung]]. # [[nhữ|Nhữ]] [[Nam]] [[tiên hiền]] [[truyện]]. #: ''Cát.'' #: ''Nguyên thấy có người bán một con cá to, bèn nói với anh ta: "Xin tạm phiền nhờ con cá ấy đến chỗ ở của.'' #: ''Hà.'' #: ''Bá.".'' #: ''Người bán cá đáp cá đã chết..'' #: ''Nguyên bèn lấy đan thư bỏ vào miệng cá rồi thả xuống nước, một lát con cá nhảy lên bờ nhả ra một bức thư màu xanh đen như lá cây rồi bay mất'' {{-trans-}} {{-ref-}} {{R:FVDP}} [[Thể loại:Danh từ riêng tiếng Việt]] ht79dtni6wzqqrqkmbut77mockevxzl 2344985 2344984 2026-04-13T13:58:03Z TheHighFighter2 42988 2344985 wikitext text/x-wiki =={{langname|vi}}== ==={{ĐM|etym}}=== {{calque|vi|zh|魚信|tr=ngư tín}}. ==={{ĐM|pron}}=== {{vi-pron}} ==={{ĐM|noun}}=== {{vi-noun}} # {{nhãn|vi|không còn dùng}} [[tin tức|Tin tức]], [[thư từ]] nói chung. #* Tác giả khuyết danh, ''[https://www.thivien.net/Khuy%E1%BA%BFt-danh-Vi%E1%BB%87t-Nam/Ph%E1%BB%A5-m%E1%BA%ABu-t%E1%BB%B1-t%C3%ACnh/poem-H_M7IV948Mm1JIG0pH4wSA Lâm Tuyền kỳ ngộ]'': #*: {{quote|vi|Trao mượn thư hồng khôn nẻo tới,</br>Ngóng trông '''tin cá''' luống ngày qua.}} #* {{quote-book|vi|translator=w:Nhượng Tống|by=w:Từ Chẩm Á|chapter=[[s:Dưới hoa/XII|XII. — Tình địch]]|title=Dưới hoa (Ngọc lê hồn)|volume=IV|location=Hà Nội|publisher=Nhà in Thụy Ký|year=1928|origyear=1913|original=玉梨魂|page=104|passage=Trong một tuần, tất có mấy bức thư đi về. '''Tin cá''' năng đưa, làm vất vả cả người phu trạm.}} ==={{ĐM|ref}}=== * {{R:FVDP}} kwce0847sx3zsdxfj3g3oes2smgy9aj vịt 0 92254 2345078 2088331 2026-04-14T01:19:00Z Hiyuune 50834 2345078 wikitext text/x-wiki {{-vie-}} {{-info-}} {{-pron-}} {{vie-pron|vịt}} {{-nôm-}} {{top}} *[[曰]]: [[vất]], [[vắt]], [[vết]], [[viết]], [[vịt]], [[vít]] *[[𩿠]]: [[vẹt]], [[vịt]] *[[𩾲]]: [[vịt]] {{mid}} *[[𪆧]]: [[vẹt]], [[vịt]] *[[鴨]]: [[áp]], [[vịt]] {{bottom}} {{-paro-}} :* [[vít]] {{-noun-}} [[File:Vịt lông trắng.jpg|nhỏ|200px|phải |Vịt lông trắng ở [[An Giang]].]] '''vịt''' # [[gia cầm|Gia cầm]] [[mỏ]] [[dẹp]] và [[rộng]], [[chân]] [[thấp]] có [[màng]] [[da]] giữa các [[ngón]], [[bơi]] [[giỏi]], [[bay]] [[kém]]. #: ''Chạy như '''vịt'''.'' # Đồ đựng có [[hình dáng]] [[giống]] [[con]] [[vịt]] hoặc có [[bộ phận]] giống như [[mỏ]] [[con]] [[vịt]]. #: '''''Vịt''' đựng cá.'' #: '''''Vịt''' dầu.'' #: '''''Vịt''' nước mắm.'' {{-drv-}} * {{l|vi|trứng khôn hơn vịt}} {{-trans-}} * {{eng}}: [[duck]] {{Commons|Duck|Vịt}} {{-ref-}} {{R:FVDP}} {{R:WinVNKey:Lê Sơn Thanh}} {{C|vi|Vịt}} {{-nuo-}} {{-pron-}} * {{IPA4|nuo|/vit⁸/}} {{-noun-}} {{pn}} # {{term|Cổ Liêm}} [[vịt#Tiếng Việt|vịt]]. [[Thể loại:Danh từ tiếng Nguồn]] {{-hnu-}} {{-pron-}} * {{IPA4|hnu|/viːt/}} {{-noun-}} {{pn}} # [[vịt#Tiếng Việt|vịt]]. [[Thể loại:Danh từ tiếng Pọng]] {{-tou-}} {{-noun-}} {{pn}} # [[vịt#Tiếng Việt|vịt]]. [[Thể loại:Danh từ tiếng Thổ]] p2ki1vwpk0rqn81jveb72bna5ycwndy ngỗng 0 92904 2345073 2079896 2026-04-14T01:14:51Z Hiyuune 50834 2345073 wikitext text/x-wiki {{also|ngóng|ngõng|ngỏng|ngọng|ngông|ngồng|ngɔ́ŋ}} =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|etym}} 1=== ===={{section|n}}==== {{vi-noun|cls=con|[[𪄌]], [[鵝]], [[𤞒]]}} # [[loài|Loài]] [[chim]] cùng [[họ]] với [[vịt]] nhưng [[cổ]] [[dài]]. #: {{ux|vi|Em bé chăn đàn '''ngỗng''' ra bãi cỏ.}} ====={{section|drv}}===== * {{l|vi|gan ngỗng béo}} ====={{section|trans}}===== {{trans-top|loài chim cùng họ vịt nhưng cổ dài}} * {{langname|en}}: {{t+|en|goose}} * {{langname|blt}}: {{t|blt|ꪬ꪿ꪱꪙ}} {{trans-bottom}} ==={{section|etym}} 2=== ===={{section|n}}==== {{vi-noun}} # [[con số|Con số]]. # {{lb|vi|thông tục}} Điểm [[xấu]] (0 điểm). #: {{ux|vi|Hôm nay nó bị hai con '''ngỗng'''.}} ==={{section|etym}} 3=== ===={{section|n}}==== {{vi-noun|cls=cái}} # [[be|Be]] [[rượu]] có [[cổ]] [[dài]]. #: {{ux|vi|Lão ta ngồi tu một '''ngỗng''' rượu.}} ==={{section|ref}}=== * {{R:FVDP}} * {{R:WinVNKey:Lê Sơn Thanh}} ==={{section|further}}=== * Blench, Roger. "[http://www.academia.edu/5165573/Reconstructing_Austroasiatic_prehistory Reconstructing Austroasiatic prehistory - Final Version]" trong ''Handbook of the Austroasiatic Languages.'' Jenny, M. & P. Sidwell (eds.). 2015. H Leiden: Brill. Chưa được xuất bản. {{C|vi|Ngỗng}} plhczpxponkvtrzcecop53clxzfr1jm Thảo luận Wiktionary:Thảo luận 5 103987 2345016 2342978 2026-04-13T15:19:14Z MediaWiki message delivery 19980 Mục mới: /* Bản tin Kỹ thuật: Tuần 16-2026 */ 2345016 wikitext text/x-wiki <!-- Xin bắt đầu cuộc thảo luận mói ở CUỐI trang! Cám ơn. --> {{Lưu trữ}} == Upcoming Dark Mode user interface rollout for anonymous Wikimedia sites users == <div lang="en" dir="ltr"> {{int:Hello}} Wikimedians, Apologies if this message is not in your language. {{int:please-translate}}. The [[mw:Special:MyLanguage/Reading/Web|Reader Experience team]] will launch the Dark mode feature for anonymous users on all Wikimedia sites, including yours, on October 29, 2025. [[:en:Special:MyLanguage/Light-on-dark color scheme|Dark mode]] is an option that allows users to view pages in light-coloured text, and icons on a dark background. Once it is available for anonymous users, they can enable it when using various devices. More information on ways to enable it can be found on [[:en:Special:MyLanguage/Wikipedia:Dark mode#Options for anyone|this page]]. Given many pages are still not compatible with dark mode this will be an opt-in feature and not automatically apply to pages. Dark mode requires modifications to content pages and templates, and since our initial launch [https://diff.wikimedia.org/2024/07/17/dark-modes-bright-future-how-dark-mode-will-transform-wikipedias-accessibility/ in July 2024], we have been working with communities and helping them prepare for dark mode. Before the rollout, it is essential that template authors and technical contributors test dark mode and read [[mw:Special:MyLanguage/Reading/Web/Accessibility for reading/Updates/2024-04|this page]] to learn how to make pages Dark mode-ready and address any compatibility issues found in templates. We will fix most color compatibility issues only on the most-viewed pages on projects with over 5 million monthly page views. Technical contributors with an account should opt into dark mode currently using preferences or settings and test pages and seek help before the release to ensure everything complies before the enablement. If you have any questions or need help, please [[mw:Special:MyLanguage/Talk:Reading/Web/Accessibility for reading#|contact the Reader Experience team]] for support. Thank you! </div> <bdi lang="en" dir="ltr">[[User:UOzurumba (WMF)|UOzurumba (WMF)]]</bdi> 02:08, ngày 30 tháng 9 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:UOzurumba_(WMF)/sandbox_Dark_mode_deployment_mass_message_list_(October_2025)&oldid=29358561 --> == Bản tin Kỹ thuật: Tuần 41-2025 == <section begin="technews-2025-W41"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/41|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[mw:Special:MyLanguage/Help:Edit check#paste|Kiểm tra Nội dung Dán (Paste Check)]] là một tính năng Kiểm tra Sửa đổi mới để giúp phòng tránh và chống lại các hành vi vi phạm bản quyền. Khi biên tập viên dán văn bản vào bài viết, Kiểm tra Nội dung Dán sẽ nhắc họ xác nhận nguồn gốc và giấy phép của nội dung được dán đó. Bắt đầu từ thứ 4, ngày 8 tháng 10, [[phab:T403680|22 wiki sẽ thử nghiệm tính năng Kiểm tra Nội dung Dán]]. Kiểm tra Nội dung Dán sẽ giúp các tình nguyện viên mới hiểu và tuân theo các quy định và hướng dẫn cần thiết để thực hiện những đóng góp mang tính xây dựng cho các dự án Wikipedia. '''Cập nhật cho biên tập viên''' * Các thiết bị di động sẽ hiển thị các bài viết trên trang di động trực tiếp trên tên miền chuẩn (như <code>en.wikipedia.org</code>), thay vì thông qua việc đổi hướng tới tên miền "m" (như <code>en.m.wikipedia.org</code>). Thay đổi này nhằm cải thiện hiệu năng. Nó sẽ được kích hoạt trên các trang Wikipedia trong tuần này. Liên kết URL di động và tùy chọn "Phiên bản máy tính" vẫn sẽ tiếp tục khả dụng. [[mw:Requests for comment/Mobile domain sunsetting/2025 Announcement|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T214998] * [[mw:Special:MyLanguage/Help:CirrusSearch#creationdate and lasteditdate|Bộ lọc ngày]] mới, <code dir=ltr>creationdate:</code> và <code dir=ltr>lasteditdate:</code>, nay có sẵn trong bộ máy tìm kiếm của wiki. Những bộ lọc này cho phép người dùng lọc kết quả tìm kiếm theo bản sửa đổi đầu tiên hoặc cuối cùng của trang. Bộ lọc hỗ trợ các toán tử so sánh (v.d. <code dir=ltr>>2024</code>) và ngày dạng tương đối (v.d. <code dir=ltr>today-1d</code>), giúp việc tìm nội dung hoặc trang được cập nhật gần đây trong khoảng năm cụ thể trở nên dễ dàng hơn. [https://phabricator.wikimedia.org/T403593] * [[f:|Wikifunctions]] nay hỗ trợ văn bản giàu tính chất (rich text) trong lời gọi hàm nhúng trên 150 wiki đã kích hoạt nó. Để giới thiệu tính năng này, nhóm đã tạo [[f:Z26333|bảng biến cách tiếng Latin]] mà biên tập viên Wiktionary có thể sử dụng để tự động tạo ra các dạng danh từ, nhằm tạo ra những kết quả rõ ràng và được định dạng — xem một [[f:Wikifunctions:Embedded function calls/Wiktionary tables demonstration|ví dụ đầu ra]] cụ thể. Nếu bạn cần hỗ trợ hay có bất kỳ phản hồi nào, vui lòng [[f:Wikifunctions:Project chat|liên hệ nhóm Wikifunctions]]. [https://phabricator.wikimedia.org/T397402] * Một liên kết sửa đổi nay sẽ hiển thị trong hộp thể loại trên các trang bài viết đối với người dùng đã đăng nhập, khi nhấn vào sẽ khởi động trực tiếp hộp thoại thể loại bằng Trình Soạn thảo Trực quan (VisualEditor). [https://phabricator.wikimedia.org/T291691] * [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:34}} {{PLURAL:34|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, tuần trước đã có vấn đề khi tải các tập tin pdf và hiện nó đã được giải quyết. [https://phabricator.wikimedia.org/T405957] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Trường <code dir=ltr>rev_sha1</code> trong bảng cơ sở dữ liệu bản sửa đổi đang chuẩn bị được loại bỏ để thay thế bằng trường <code dir=ltr>content_sha1</code> trong bảng cơ sở dữ liệu nội dung. Xem [https://lists.wikimedia.org/hyperkitty/list/cloud@lists.wikimedia.org/thread/2D2M3SP4WHR6BXXKTZ2PBLZQYR3EGQVR/ thông báo này] để biết thêm thông tin. * [[mw:Special:MyLanguage/Reading/Web|Nhóm Trải nghiệm Người đọc]] sẽ triển khai giao diện người dùng [[w:en:Light-on-dark color scheme|Chế độ Tối]] trên tất cả các trang Wikimedia vào ngày 29 tháng 10 năm 2025. Tất cả thành viên vô danh trên các trang Wikimedia sẽ có tùy chọn kích hoạt bảng màu có văn bản màu sáng trên nền tối. Chế độ này được thiết kế để cung cấp trải nghiệm đọc thoải mái hơn, đặc biệt trong những trường hợp thiếu sáng. Tác giả bản mẫu và biên tập viên kỹ thuật được khuyến khích [[mw:Special:MyLanguage/Reading/Web/Accessibility for reading/Updates/2024-04|tìm hiểu cách chuẩn bị các trang để tương thích với Chế độ tối]] và giải quyết bất kỳ vấn đề tương thích nào xuất hiện trong các bản mẫu trên wiki của họ trước thời điểm kích hoạt. Vui lòng liên hệ nhóm Web nếu có bất kỳ câu hỏi hay cần sự trợ giúp nào trên [[mw:Talk:Reading/Web/Accessibility for reading#|trang thảo luận này]] trước ngày kích hoạt. [https://phabricator.wikimedia.org/T395628] * Bắt đầu từ thứ 2, ngày 6 tháng 10, các điểm cuối API theo đường dẫn <code>rest.php</code> sẽ được định tuyến lại qua Cổng API nội bộ mới. Mỗi wiki sẽ được cập nhật dựa trên các nhóm phát hành tiêu chuẩn, với tổng lưu lượng truy cập tăng dần theo thời gian. Thay đổi này dự kiến không gây ra bất kỳ sự gián đoạn gì. Nếu phát hiện thấy có bất kỳ vấn đề nào, vui lòng tạo tác vụ Phabricator gửi lên [[phab:tag/serviceops/|bảng của nhóm Vận hành Dịch vụ]]. [https://phabricator.wikimedia.org/T400130] * [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.22|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/41|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W41"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:23, ngày 6 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29400897 --> == <span lang="en" dir="ltr">Have your say: vote for the 2025 Board of Trustees</span> == <div lang="en" dir="ltr"> <section begin="announcement-content" /> Hello all, The voting period for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025|2025 Board of Trustees election]] is now open. Candidates are running for two (2) seats on the Board. To check your voter eligibility, please visit the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Voter eligibility guidelines|voter eligibility page]]. Learn more about them by [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidates|reading their application statements and watch their candidacy videos]]. When you are ready, go to the [[m:Special:SecurePoll/vote/405|SecurePoll voting page to vote]]. '''The vote is open from October 8 at 00:00 UTC to October 22 at 23:59 UTC.''' Best regards, Abhishek Suryawanshi<br />Chair, Elections Committee<section end="announcement-content" /> </div> [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 04:49, ngày 9 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:RamzyM (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29360896 --> == Bản tin Kỹ thuật: Tuần 42-2025 == <section begin="technews-2025-W42"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/42|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Tuần trước, chúng tôi đã tiến hành triển khai những cải tiến về các tính năng bảo mật tài khoản và xác thực hai yếu tố (2FA) trên tất cả các wiki. Những thay đổi đó bao gồm cải tiến giao diện người dùng cho trang [https://auth.wikimedia.org/metawiki/wiki/Special:AccountSecurity Đặc biệt:Bảo mật tài khoản], hỗ trợ nhiều phương thức xác thực 2FA thông qua các ứng dụng xác thực và khóa bảo mật di động (trước đây người dùng chỉ có thể kích hoạt một phương thức xác thực), và mô đun Mã Khôi phục mới giúp giảm thiểu tình trạng khóa tài khoản do mất ứng dụng và thiết bị xác thực hai yếu tố. Là một phần của dự án [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]], quá trình này sẽ tiếp tục trong phần còn lại của năm 2025 để cải thiện nhiều hơn trải nghiệm người dùng, cùng việc thêm hỗ trợ cho mã khóa làm phương thức xác thực thứ hai thay thế. '''Cập nhật cho biên tập viên''' * Một phần khác của dự án Bảo mật tài khoản là cung cấp 2FA cho tất cả người dùng. Bên cạnh biên tập viên có quyền nâng cao, chẳng hạn như bảo quản viên và hành chính viên, 40% biên tập viên nay có quyền truy cập vào 2FA. Bạn có thể kiểm tra xem bạn có quyền truy cập đó không tại [https://auth.wikimedia.org/metawiki/wiki/Special:AccountSecurity Đặc biệt: Bảo mật tài khoản]. Hướng dẫn kích hoạt có trên trang được liên kết theo. Kế hoạch là tiếp tục tăng cường tính khả dụng nếu xác định rằng khả năng hỗ trợ người dùng có thể hỗ trợ việc sử dụng toàn cục của nó. [https://phabricator.wikimedia.org/T400579] * Tuần này, người dùng trên các wiki mà mặc định đã có sẵn tính năng [[mw:Special:MyLanguage/Talk pages project/Usability|Cải tiến Khả năng Sử dụng]] trên trang thảo luận (tất cả ''trừ'' 12 wiki được liệt kê trong tác vụ [[phab:T379264|T379264]]) sẽ có được khả năng gửi lời cảm ơn bình luận trực tiếp trên trang thảo luận mà nó xuất hiện. Trước thay đổi này, việc cảm ơn chỉ có thể được thực hiện bằng cách truy cập lịch sử sửa đổi của trang thảo luận. Bạn có thể [[diffblog:2025/10/13/revolutionizing-gratitude-a-new-era-of-thanking-comments/|tìm hiểu thêm về thay đổi này]]. [https://phabricator.wikimedia.org/T366095] * Người dùng chưa [[Special:Preferences#mw-prefsection-personal-email|xác thực địa chỉ email của mình]] sẽ sớm nhận thông báo hàng tháng nhắc họ làm điều này. Điều này là bởi vì người dùng đã xác thực email của họ có thể dễ dàng khôi phục tài khoản của mình hơn. Những lời nhắc này sẽ không được gửi nếu người dùng không hoạt động hoặc đã loại bỏ email chưa được xác thực khỏi tài khoản của mình. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Email_confirmation][https://phabricator.wikimedia.org/T58074] * [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, đã có một bản sửa lỗi nhằm giải quyết một lỗi thỉnh thoảng xảy ra khi lưu các đoạn đã được dịch trong công cụ Dịch Nội dung, cùng với đó các thông báo lỗi có liên quan giờ dễ nhìn hơn. [https://phabricator.wikimedia.org/T376531] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Nhóm Công cụ Không được Hỗ trợ đã chọn [[c:Special:MyLanguage/Commons:Video2commons|Video2Commons]] làm công cụ đầu tiên cho chu kỳ thí điểm của họ. Nhóm sẽ tìm hiểu cách để cải tiến và duy trì công cụ này trong những tháng tiếp theo. [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|Tìm hiểu thêm trên Meta]]. * [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.23|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/42|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W42"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:59, ngày 13 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29434481 --> == <span lang="en" dir="ltr">Help us decide the name of the new Abstract Wikipedia project</span> == <div lang="en" dir="ltr"> <section begin="function1"/> {{int:Hello}}. Please help pick a name for the new Abstract Wikipedia wiki project. This project will be a wiki that will enable users to combine functions from [[:f:|Wikifunctions]] and data from Wikidata in order to generate natural language sentences in any supported languages. These sentences can then be used by any Wikipedia (or elsewhere). There will be two rounds of voting, each followed by legal review of candidates, with votes beginning on 20 October and 17 November 2025. Our goal is to have a final project name selected on mid-December 2025. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki. {{Int:Feedback-thanks-title}} <section end="function1"/> </div> -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 11:44, ngày 20 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Sannita (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29432175 --> == Bản tin Kỹ thuật: Tuần 43-2025 == <section begin="technews-2025-W43"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/43|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Để tối ưu hóa cách dữ liệu người dùng được lưu trong cơ sở dữ liệu của chúng tôi, các tùy chọn được lưu của người dùng chưa đăng nhập trong vòng hơn 5 năm và có ít hơn 100 sửa đổi sẽ bị xóa. Khi những người dùng đó quay lại, tùy chọn mặc định sẽ được áp dụng. [https://phabricator.wikimedia.org/T406724] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:20}} {{PLURAL:20|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, đã có một liên kết hỏng từ thông điệp giao diện Đóng góp toàn cục đến trang Đóng góp toàn cục trên XTools mà hiện đã được giải quyết. [https://phabricator.wikimedia.org/T406415] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Việc định tuyến lại toàn bộ lưu lượng đến các điểm cuối API theo cổng <code dir=ltr><nowiki>rest.php</nowiki></code> thông qua một cổng API chung hiện đã hoàn tất. Nếu phát hiện bất kỳ vấn đề nào, vui lòng gửi tác vụ phabricator lên [[phab:tag/serviceops/|bảng tác vụ của nhóm Vận hành Dịch vụ]]. * Các sửa đổi đối với chú thích hoặc từ hạn định Wikidata nay sẽ ít hiển thị thường xuyên hơn trên các mục Thay đổi gần đây và Danh sách theo dõi trên các wiki khác, nhằm giảm bớt các thông báo không cần thiết. Thay đổi này sẽ giảm tổng số lượng các khoản mục 'gây nhiễu'. Bản thân các trang Wikidata sẽ không có sự thay đổi nào. [https://phabricator.wikimedia.org/T401290] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.24|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/43|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W43"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:36, ngày 20 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29478670 --> == Bản tin Kỹ thuật: Tuần 44-2025 == <section begin="technews-2025-W44"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/44|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Ứng dụng Wikipedia dành cho iOS đã ra mắt thử nghiệm A/B/C nhằm cải tiến tính năng duyệt theo thẻ cho một số khu vực và ngôn ngữ nhất định. Thử nghiệm mang tên “Nhiều thẻ động hơn” này sẽ khám phá trải nghiệm trên thẻ mới cùng với việc bổ sung đề xuất bài viết ở mục “Bạn có biết” và “Vì bạn đã đọc”. Bạn có thể [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/Tabbed Browsing (Tabs)/New Tab Experience and Recommendations Experiment|đọc thêm thông tin trên trang dự án này]]. * Thành viên tự xác nhận trên các wiki [[git:operations/mediawiki-config/+/a2d2aaab9ace84280dd2f4c70a33bb69cd73850f/dblists/small.dblist|nhỏ]] và [[git:operations/mediawiki-config/+/a2d2aaab9ace84280dd2f4c70a33bb69cd73850f/dblists/medium.dblist|vừa]] đã triển khai phần mở rộng CampaignEvents nay có thể sử dụng công cụ [[m:Special:MyLanguage/Event Center/Registration|Đăng ký Sự kiện]] mà không cần quyền Người tổ chức Sự kiện. Tính năng này cho phép người tổ chức kích hoạt việc đăng ký, quản lý người tham gia, và cho phép các thành viên đăng ký chỉ với một cú nhấp chuột thay vì phải ký vào trang sự kiện. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:31}} {{PLURAL:31|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề về màu sắc nhấp nháy khi giữ hoặc nhấn phím mũi tên trong phần cài đặt chế độ tối của giao diện Vector 2022 nay đã được giải quyết. [https://phabricator.wikimedia.org/T402285] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Phần mở rộng CampaignEvents sẽ được triển khai trên tất cả những wiki còn lại trong tuần từ ngày 17 tháng 11 năm 2025. Phần mở rộng này hiện bao gồm ba tính năng: Đăng ký Sự kiện, Danh sách Cộng tác, và Danh sách Mời. Trong đợt triển khai này, Danh sách Lời mời sẽ không được kích hoạt cho Wikifunctions và MediaWiki cho đến khi những cộng đồng này yêu cầu kích hoạt. [[m:Special:MyLanguage/CampaignEvents/Deployment status|Truy cập trang thông tin triển khai để biết thêm thông tin]]. * Trải nghiệm chỗ thử REST dựa trên SwaggerUI nay đã có mặt trên tất cả các dự án wiki. Chỗ thử này có thể truy cập được thông qua trang [[{{#special:RestSandbox}}]]. Vui lòng báo cáo bất kỳ vấn đề nào lên bảng tin của nhóm Giao diện MediaWiki, hoặc tham gia thảo luận trên trang [[mw:Special:MyLanguage/MediaWiki Interfaces Team/Feature Feedback/REST Sandbox|khởi động dự án]] này. [https://phabricator.wikimedia.org/project/board/6931/] * Những điểm cuối chuyển đổi với đường dẫn kết thúc bằng dấu gạch chéo trong REST API của MediaWiki hiện đang được đánh dấu là lỗi thời. Chúng vẫn sẽ tiếp tục hoạt động trong thời gian này, tuy nhiên dự kiến chúng sẽ bị loại bỏ vào cuối tháng 1 năm 2026. Toàn bộ người dùng API đang gọi chúng được khuyến khích chuyển sang bản đường dẫn không kết thúc bằng dấu gạch chéo. Cả hai biến thể điểm cuối này đều có thể tìm thấy và thử được sử dụng [https://test.wikipedia.org/w/index.php?api=mw-extra&title=Special%3ARestSandbox Chỗ thử REST]. Xem trang [[mw:API/Deprecation|Ngừng hỗ trợ với REST API MediaWiki]] để biết thêm thông tin chi tiết về các chính sách và thủ tục trong việc ngừng hỗ trợ API. * [[mw:API:REST API/Changelog|Nhật trình thay đổi chuyên biệt nay đã có sẵn cho REST API của MediaWiki]]. Nhật trình thay đổi này cung cấp tổng quan về những thay đổi này, giúp các nhà phát triển dễ dàng theo dõi những cải tiến và lần lặp lại của chúng. Mọi thông báo cũng sẽ tiếp tục được gửi thông qua các kênh truyền thông chính, bao gồm Bản tin Kỹ thuật và danh sách phân phối qua thư điện tử, nhưng nay có thể dễ dàng tham khảo hơn từ một vị trí trung tâm. Nếu bạn có bất kỳ phản hồi nào về định dạng, cấu trúc, hoặc nội dung về nhật trình thay đổi này, vui lòng [[mw:API talk:REST API/Changelog|tham gia thảo luận tại đây]]. * Bảo quản viên nay có thể xóa thể loại theo dõi mà trước đây được thêm bởi phần mở rộng JsonConfig, do nó không còn được sử dụng. Xem các thể loại được liên kết từ [[d:Q130635582#sitelinks-wikipedia|Q130635582]]. Việc vẫn còn trang được liệt kê trên thể loại này là bình thường vì nó chỉ là vấn đề về bộ nhớ đệm, và chúng sẽ tự động được xóa khi các trang đó được sửa đổi trong lần tiếp theo. [https://phabricator.wikimedia.org/T378352] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.25|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/44|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W44"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:31, ngày 27 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29513638 --> == <span lang="en" dir="ltr">Seeking volunteers to join several of the movement’s committees</span> == <div lang="en" dir="ltr"> <section begin="announcement-content" /> Each year, typically from October through December, several of the movement’s committees seek new volunteers. Read more about the committees on their Meta-wiki pages: * [[m:Special:MyLanguage/Affiliations Committee|Affiliations Committee (AffCom)]] * [[m:Special:MyLanguage/Ombuds commission|Ombuds commission (OC)]] * [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|Case Review Committee (CRC)]] Applications for the committees open on October 30, 2025. Applications for the Affiliations Committee, Ombuds commission and the Case Review Committee close on December 11, 2025. Learn how to apply by [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Committee appointments|visiting the appointment page on Meta-wiki]]. Post to the talk page or email cst[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org with any questions you may have. For the Committee Support team, <section end="announcement-content" /> </div> -[[m:User:MKaur (WMF)| MKaur (WMF)]] 14:14, ngày 30 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:MKaur (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29517125 --> == Bản tin Kỹ thuật: Tuần 45-2025 == <section begin="technews-2025-W45"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/45|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Các bảo quản viên giờ đây sẽ thấy rằng [[{{#special:MergeHistory}}]] đã trở nên linh hoạt hơn đáng kể trong việc hợp nhất. Nó có thể hợp nhất các phần được lấy từ giữa lịch sử của trang nguồn (thay vì chỉ từ phần đầu), và chèn các phiên bản vào bất kỳ vị trí nào trong lịch sử của trang đích (thay vì chỉ ở phần đầu). [https://phabricator.wikimedia.org/T382958] * Đối với những người dùng đã kích hoạt "{{int:discussiontools-preference-autotopicsub}}" [[Special:Preferences#mw-prefsection-editing|trong tùy chọn của họ]], việc bắt đầu một chủ đề mới hoặc thêm một phản hồi vào một chủ đề hiện có giờ đây sẽ tự động đăng ký họ theo dõi các phản hồi mới trong chủ đề đó. Trước đây, điều này chỉ xảy ra nếu người dùng sử dụng tiện ích "{{int:Skin-action-addsection}}" hoặc "{{int:Discussiontools-replybutton}}" của DiscussionTools. Khi DiscussionTools mới được ra mắt, các tài khoản hiện có không được tự động bật tính năng theo dõi chủ đề, vì vậy thay đổi này chủ yếu sẽ ảnh hưởng đến các tài khoản mới hơn và những người dùng đã chủ động thay đổi tùy chọn của mình kể từ thời điểm đó. [https://phabricator.wikimedia.org/T290778] * Các mô đun Scribunto giờ đây có thể được dùng để [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#SVG library|tạo ảnh SVG]]. Tính năng này cho phép tạo biểu đồ, đồ họa và các hình minh họa khác một cách linh hoạt thông qua Lua, giúp giảm nhu cầu phải tạo chúng bên ngoài rồi tải lên dưới dạng tập tin. [https://phabricator.wikimedia.org/T405861] * Các trang web của Wikimedia giờ đây sẽ cung cấp cho tất cả người dùng ẩn danh tùy chọn bật chế độ tối, với giao diện chữ sáng trên nền tối. Cải tiến này nhằm mang lại trải nghiệm đọc dễ chịu hơn, đặc biệt là trong môi trường thiếu sáng. [https://phabricator.wikimedia.org/T395628] * Những người dùng có danh sách theo dõi lớn từ lâu đã gặp lỗi quá thời gian khi chỉnh sửa [[Special:EditWatchlist|Special:EditWatchlist]]. Trang này nay sẽ tải các mục theo từng phần nhỏ thay vì tải toàn bộ cùng lúc nhờ bản cập nhật phân trang, giúp mọi người có thể chỉnh sửa danh sách theo dõi mượt mà hơn. Trong quá trình cập nhật cơ sở dữ liệu, tính năng sắp xếp theo thời hạn đã bị loại bỏ vì chậm hơn hơn 100 lần so với sắp xếp theo tên trang. Một [https://meta.wikimedia.org/wiki/Community_Wishlist/W454 yêu cầu từ cộng đồng] đã được tạo để tìm các cách thay thế nhằm khôi phục tính năng sắp xếp theo thời hạn. Nếu bạn thấy tính năng này quan trọng, hãy ủng hộ yêu cầu đó! [https://phabricator.wikimedia.org/T41510] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:31}} {{PLURAL:31|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, việc khắc phục lỗi tô sáng vẫn còn hiển thị sau khi sử dụng tính năng tìm và thay thế của VisualEditor trong quá trình tìm kiếm. [https://phabricator.wikimedia.org/T407318] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Từ năm 2019, [[m:Special:MyLanguage/Wikimedia URL Shortener|Trình rút gọn URL của Wikimedia]] tại https://w.wiki đã có sẵn cho tất cả các wiki của Wikimedia để tạo liên kết ngắn đến bài viết, liên kết cố định, bản so sánh, v.v. Tính năng này có trong thanh bên với tên "Lấy URL rút gọn". Hiện có 30 wiki vẫn đang sử dụng tiện ích mở rộng cũ "ShortUrl". Tiện ích cũ này sẽ sớm bị gỡ bỏ. Điều này có nghĩa là các URL dạng <code>/s/</code> sẽ không còn được hiển thị dưới tiêu đề bài viết thông qua thẻ HTML <code dir=ltr>class="title-shortlink"</code>. Tuy nhiên, các URL dạng <code>/s/</code> vẫn sẽ tiếp tục hoạt động. [https://phabricator.wikimedia.org/T107188] * Vào thứ Năm, ngày 30 tháng 10, các nhóm [[:mw:Special:MyLanguage/MediaWiki Interfaces Team|Giao diện MediaWiki]] và [[:mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|Vận hành Dịch vụ SRE]] đã bắt đầu chuyển hướng lưu lượng của Action API thông qua một cổng API chung. Các wiki riêng lẻ sẽ được cập nhật theo từng nhóm phát hành tiêu chuẩn, với tổng lưu lượng được tăng dần theo thời gian. Thay đổi này được kỳ vọng sẽ không gây ra lỗi hoặc gián đoạn. Nếu bạn phát hiện bất kỳ sự cố nào, vui lòng gửi báo cáo trên bảng [https://phabricator.wikimedia.org/tag/serviceops/ của nhóm Vận hành Dịch vụ]. * Việc triển khai MediaWiki Train sẽ tạm dừng trong hai tuần cuối cùng của năm 2025: ngày 22 và 29 tháng 12. Các khung thời gian backport cũng sẽ tạm ngưng từ thứ Hai, ngày 22 tháng 12 năm 2025 đến thứ Năm, ngày 2 tháng 1 năm 2026. "Backport window" là khoảng thời gian được lên lịch để bổ sung các nội dung như bản vá lỗi và thay đổi cấu hình. Hiện vẫn còn bảy đợt triển khai MediaWiki Train nữa trong năm 2025. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/SMWTEAES4SDLDUSK4HMWNBSKNCXZAWYN/] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.26|MediaWiki]] '''Chuyên sâu''' * Năm 2025, Quỹ Wikimedia báo cáo rằng các hệ thống AI và công cụ tìm kiếm ngày càng sử dụng nội dung từ Wikipedia mà không dẫn người dùng quay lại trang, góp phần khiến lượng lượt xem từ người dùng thực giảm 8% so với năm 2024. Sau khi phát hiện các bot giả dạng người dùng thật, Wikimedia đã cập nhật dữ liệu truy cập để phản ánh sự thay đổi này. Bạn có thể đọc thêm về xu hướng người dùng hiện nay trên Wikipedia trong [[diffblog:2025/10/17/new-user-trends-on-wikipedia/|bài viết trên blog Diff]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/45|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W45"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:34, ngày 3 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29552512 --> == Bản tin Kỹ thuật: Tuần 46-2025 == <section begin="technews-2025-W46"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/46|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' [[File:Talk pages default look (April 2023).jpg|thumb|alt=Hình chụp những thay đổi về mặt trực quan được thực hiện trên trang thảo luận|Ví dụ về trang thảo luận với thiết kế mới, bằng tiếng Pháp.]] * Kể từ ngày 12 tháng 11, người dùng sẽ nhận thấy sự thay đổi về [[m:Special:MyLanguage/Talk pages project/Feature summary#Usability improvements|giao diện của các trang thảo luận]] trên [[Phab:T379264|một số trang Wikipedia]]. Hầu hết [[phab:T392121|toàn bộ các wiki]] đã có được thay đổi về mặt thiết kế này; những thay đổi này sẽ được thực hiện sau trên [[phab:T409297|Wikipedia tiếng Anh]]. Bạn có thể đọc thêm [[diffblog:2024/05/02/making-talk-pages-better-for-everyone/|trên ''Diff'']]. Người dùng có thể chọn không thực hiện thay đổi này [[Special:Preferences#mw-prefsection-editing|trong tùy chọn người dùng của mình]] ở tùy chọn "{{int:discussiontools-preference-visualenhancements}}". [https://phabricator.wikimedia.org/T379264] * MediaWiki nay có thể hiển thị [[mw:Special:MyLanguage/Help:Protection indicators|chỉ báo trên trang]] tự động khi một trang bị khóa. Tính năng này được tắt theo mặc định. Nó có thể được bật theo [[m:Special:MyLanguage/Requesting wiki configuration changes|yêu cầu của cộng đồng]]. [https://phabricator.wikimedia.org/T12347] * Việc sử dụng các nút "{{int:showpreview}}" hoặc "{{int:showdiff}}" trong trình soạn thảo mã nguồn nay sẽ đi kèm một số tham số URL nhất định như '[[mw:Special:MyLanguage/Manual:Parameters to index.php#useskin|useskin]]', '[[mw:Special:MyLanguage/Manual:Parameters to index.php#uselang|uselang]]' và '[[mw:Special:MyLanguage/Help:Section#Editing sections|section]]'. Bản cập nhật này đồng thời cũng sửa một vấn đề mà, nếu trình duyệt bị sập khi đang xem trước sửa đổi một đề mục duy nhất, việc lưu sửa đổi này có thể ghi đè toàn bộ trang chỉ bằng nội dung của đề mục đó. [https://phabricator.wikimedia.org/T62744][https://phabricator.wikimedia.org/T24029][https://phabricator.wikimedia.org/T155097] * Các wiki Wikivoyage có thể dùng [[mw:Special:MyLanguage/Help:Extension:Kartographer#Markers and counters|điểm đánh dấu bản đồ bằng màu trong nội dung văn bản của bài viết]]. Nội dung văn bản của những điểm đánh dấu đó nay sẽ được hiển thị bằng màu đen hoặc trắng tương phản, thay vì luôn luôn là màu trắng. Cộng đồng có thể loại bỏ các phương pháp giải quyết cục bộ cho vấn đề này. [https://phabricator.wikimedia.org/T369454] * Tab Hoạt động trên ứng dụng Wikipedia dành cho Android nay có sẵn cho tất cả người dùng. Tab mới này cung cấp thông tin chuyên sâu được cá nhân hóa về hoạt động đọc, sửa đổi, và quyên góp, đồng thời đơn giản hóa việc điều hướng và giúp cho việc sử dụng ứng dụng trở nên hấp dẫn hơn. [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/Activity_Tab_Experiment] * Nhóm Phát triển Độc giả (Reader Growth) chuẩn bị khởi động thử nghiệm mang tên "Duyệt hình ảnh" để kiểm tra cách giúp người đọc dễ dàng duyệt và khám phá hình ảnh trên các bài viết Wikipedia hơn. Thử nghiệm này, một thử nghiệm A/B dành riêng cho thiết bị di động, sẽ bắt đầu được thực hiện vào tuần từ ngày 17 tháng 11 và sẽ kéo dài trong bốn tuần, ảnh hưởng đến 0,05% người dùng trên wiki tiếng Anh. Thử nghiệm này đã bắt đầu vào ngày 3 tháng 11 trên các wiki tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia và tiếng Việt, ảnh hưởng đến tối đa 10% người dùng trên những wiki này. [https://www.mediawiki.org/wiki/Readers/Reader_Growth/WE3.1.3_Image_Browsing] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:27}} {{PLURAL:27|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ như đã khắc phục việc không thể khóa tài khoản trên trang web dành cho di động. [https://phabricator.wikimedia.org/T256185] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[wikitech:Help talk:Toolforge/Toolforge standards committee#November 2025 committee nominations|Wikitech đang mở đề cử]] chọn thành viên mới của [[wikitech:Help:Toolforge/Toolforge standards committee|Ủy ban tiêu chuẩn của Toolforge]]. Ủy ban này giám sát [[wikitech:Help:Toolforge/Right to fork policy|Chính sách quyền sử dụng bản sao]] và [[wikitech:Help:Toolforge/Abandoned tool policy|Chính sách cho công cụ bị bỏ rơi]] của Toolforge cùng nhiều nhiệm vụ khác. Đề cử sẽ tiếp tục mở đến hết ngày 28 tháng 11 năm 2025. * [[w:JSON Web Token#Standard fields|Trường bên cung cấp JWT]] trong [[mw:Special:MyLanguage/OAuth/For Developers#OAuth 2|mã truy cập OAuth 2]] dành cho [[m:Special:MyLanguage/Help:Unified login|wiki SUL]] (đăng nhập trung ương) đã được thay đổi thành <code><nowiki>https://meta.wikimedia.org</nowiki></code>. Các mã truy cập cũ vẫn sẽ hoạt động. [https://phabricator.wikimedia.org/T399199] * [[w:JSON Web Token#Standard fields|Trường chủ đề JWT]] trong [[mw:Special:MyLanguage/OAuth/For Developers#OAuth 2|mã truy cập OAuth 2]] sẽ sớm thay đổi từ <code><user id></code> sang <code dir=ltr style="white-space:nowrap">mw:<identity type>:<user id></code>, trong đó <code><identity type></code> thường là <code dir=ltr>CentralAuth:</code><!-- not a typo --> (đối với [[m:Special:MyLanguage/Help:Unified login|wiki SUL]]) hoặc <code dir=ltr style="white-space:nowrap">local:<wiki id></code> (đối với các wiki khác). Điều này là nhằm tránh xung đột giữa các loại ID người dùng khác nhau, và để mã truy cập OAuth 2 và cookie <code>sessionJwt</code> trở nên giống nhau hơn. Các mã truy cập cũ vẫn sẽ hoạt động. [https://phabricator.wikimedia.org/T399199] * Các thông điệp cấm của MediaWiki ([[MediaWiki:Blockedtext|blockedtext]], [[MediaWiki:Blockedtext-partial|blockedtext-partial]], [[MediaWiki:Autoblockedtext|autoblockedtext]], [[MediaWiki:Systemblockedtext|systemblockedtext]], [[MediaWiki:Blockedtext-tempuser|blockedtext-tempuser]], [[MediaWiki:Autoblockedtext-tempuser|autoblockedtext-tempuser]]) nay hỗ trợ thêm các tham số bổ sung nhằm chỉ ra xem người dùng đó có bị cấm sửa đổi trang thảo luận của mình <code><nowiki>$9</nowiki></code> hoặc gửi thư điện tử cho người dùng khác <code><nowiki>$</nowiki><nowiki>10</nowiki></code> hay không. [https://phabricator.wikimedia.org/T285612] * Nhánh <code>REL1_45</code> cho lõi MediaWiki và từng phần mở rộng cùng giao diện trong git của Wikimedia đã được tạo. Đây là bước đầu tiên trong quá trình phát hành phiên bản MediaWiki 1.45.0, được lên kế hoạch triển khai vào cuối tháng 11 năm 2025. Nếu bạn đang thực hiện việc khắc phục lỗi nghiêm trọng hoặc thực hiện tính năng mới, bạn có thể cần phải lưu ý thay đổi này. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/ZUY7TY3Z6XPZWZVAZV63OPO5OW52Q6GE/] * Quy trình tạo bản dump CirrusSearch đã được cập nhật do hiệu suất bị chậm. Nếu bạn gặp bất kỳ sự cố nào khi chuyển sang bản dump thay thế, vui lòng liên hệ với Nhóm Nền tảng Tìm kiếm để được hỗ trợ. [https://phabricator.wikimedia.org/T366248][https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/3KQPOR6ACVN6OVLMLZPIBXQSWQKW4E3K/] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.2|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/46|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W46"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:38, ngày 10 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29606150 --> == Bản tin Kỹ thuật: Tuần 47-2025 == <section begin="technews-2025-W47"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/47|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] đang thử nghiệm tính năng [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4_Reading lists|danh sách đọc trên trang di động]], cho phép người đọc đã đăng nhập chưa thực hiện sửa đổi nào có thể lưu danh sách bài viết riêng tư để đọc sau. Thử nghiệm đang được thực hiện trên các Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia, và tiếng Việt kể từ tuần ngày 10 tháng 11, và sẽ bắt đầu trên Wikipedia tiếng Anh trong tuần ngày 17 tháng 11. * Người dùng không thể nhận được mã xác nhận qua thư điện tử khi đăng nhập nay có thể nhờ hỗ trợ bằng cách gửi biểu mẫu trên trang đặc biệt mới. Cập nhật này là một phần của sáng kiến [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. Nếu tài khoản của bạn có địa chỉ thư điện tử, hãy đảm bảo rằng bạn vẫn có quyền truy cập vào nó. Trong quá trình đăng nhập từ thiết bị hoặc địa điểm mới mà không có 2FA, bạn có thể được yêu cầu nhập mã 6 ký tự được gửi từ thư điện tử để hoàn tất đăng nhập. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Why are you requiring me to enter a code from my email to log in? Can I opt out of this?|Tìm hiểu thêm]]. * Một wiki mới đã được tạo ra: {{int:project-localized-name-group-wikisource}} tiếng [[d:Q13324|Minangkabau]] ([[s:min:|<code>s:min:</code>]]) [https://phabricator.wikimedia.org/T408317] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Là một phần của dự án [[mw:Special:MyLanguage/Parsoid/Parser Unification|Hợp nhất Trình Phân tích Cú pháp]], Nhóm Chuyển đổi Nội dung đã triển khai Parsoid làm trình phân tích cú pháp mặc định cho nhiều trang Wikipedia có lưu lượng truy cập thấp và đang chuẩn bị tiếp tục bước tiếp theo để triển khai đến những trang có lưu lượng truy cập cao. Tin nhắn này là lời mời cho bạn tham gia vào Parsoid, như được miêu tả trong tài liệu [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]], và tìm ra bất kỳ vấn đề nào mà bạn có thể gặp phải với quy trình làm việc của mình khi sử dụng bot, tiện ích hoặc đoạn mã người dùng. Hãy cho chúng tôi biết thông qua liên kết ''"Báo cáo lỗi hiển thị"'' trên thanh bên Công cụ hoặc tạo một tác vụ phab và gắn thẻ [[phab:project/view/5846|Nhóm Chuyển đổi Nội dung trên Phabricator]]. * Dự án Công cụ Không được Hỗ trợ: Một vài vấn đề với [[:c:Special:MyLanguage/Commons:Video2commons|Video2Commons]] đã được giải quyết, bao gồm lỗi tải lên liên quan đến tên tập tin, nhập video bị đen, và xử lý việc thử lại. Hỗ trợ cho AV1 cũng đã được thêm vào. Những công việc đang được tiến hành tập trung vào tính ổn định của backend, lỗi ffmpeg, nhập phụ đề, xử lý siêu dữ liệu, và tải lên danh sách phát. Để theo dõi các tác vụ cụ thể, hãy kiểm tra [[phab:tag/video2commons/|bảng tác vụ trên Phabricator]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.3|MediaWiki]] '''Các cuộc họp và sự kiện''' * Hãy lưu lịch ngay cho Hackathon Wikimedia tiếp theo sẽ diễn ra tại Milan, Ý từ ngày 1–3 tháng 5 năm 2026. Cổng đăng ký sẽ được mở vào tháng 1 năm 2026. [https://pretix.eu/wikimedia/Hackathon-2026/ Đơn đăng ký nhận học bổng hiện đang được mở], và sẽ đóng vào ngày 28 tháng 11 năm 2025. Nếu bạn có bất kỳ câu hỏi nào, vui lòng gửi thư đến <bdi lang="en" dir="ltr">hackathon@wikimedia.org</bdi>. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/47|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W47"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:26, ngày 17 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29627455 --> == <span lang="en" dir="ltr">Reminder: Help us decide the name of the new Abstract Wikipedia project</span> == <div lang="en" dir="ltr"> <section begin="function2"/> {{int:Hello}}. Reminder: Please help to choose name for the new Abstract Wikipedia wiki project. The finalist vote starts today. The finalists for the name are: <span lang="en" dir="ltr" class="mw-content-ltr">Abstract Wikipedia, Multilingual Wikipedia, Wikiabstracts, Wikigenerator, Proto-Wiki</span>. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki. {{Int:Feedback-thanks-title}} <section end="function2"/> </div> -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 14:23, ngày 20 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Sannita (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29583860 --> == Bản tin Kỹ thuật: Tuần 48-2025 == <section begin="technews-2025-W48"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/48|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Tuần trước, [[mw:Special:MyLanguage/Wikimedia Search Platform|Nhóm Tìm kiếm Wikimedia]] đã tạo lại chức năng của tiện ích "DWIM" (Do What I Mean - Làm những gì bạn muốn) trên máy chủ, cho Wikipedia tiếng Nga và tiếng Do Thái. Tính năng này bổ sung gợi ý đa bàn phím vào gợi ý trên hộp tìm kiếm tiêu chuẩn. Ví dụ, khi tìm kiếm ''<span lang="und" dir="ltr">cxfcnmt</span>'' trên Wikipedia tiếng Nga giờ đây sẽ bổ sung thêm gợi ý cho ''<span lang="ru" dir="ltr">счастье</span>'' ("sự hạnh phúc") mà người dùng có thể có ý định tìm tới. Họ dự kiến sẽ kích hoạt tính năng này trên các wiki khác bằng tiếng Nga và tiếng Do Thái trong tuần này. [https://phabricator.wikimedia.org/T408734] * Cuối tuần này, người dùng [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] "{{int:codemirror-beta-feature-title}}" sẽ có thể sử dụng tính năng tô màu cú pháp trong [[mw:Special:MyLanguage/Help:DiscussionTools|Công cụ Thảo luận]]. Điều này yêu cầu phải thiết lập tùy chọn "{{int:discussiontools-preference-sourcemodetoolbar}}". [https://phabricator.wikimedia.org/T407918] * [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|Phần mở rộng chiến dịch sự kiện]] – một bộ công cụ để phối hợp tổ chức sự kiện và các hoạt động cộng tác khác trên wiki nay đã được triển khai tới tất cả các wiki của Wikimedia. Một tính năng mới được gọi là [[m:Special:MyLanguage/CampaignEvents/Collaborative contributions|Đóng góp cộng tác]] cũng đã được thêm vào để giúp những người tổ chức và người tham gia thấy được tác động của những hoạt động đó. Hãy tham gia [[m:Special:MyLanguage/Event:Connection learning session 3|buổi học sắp tới]] để xem tính năng mới đó hoạt động thực tế như thế nào và chia sẻ phản hồi của bạn. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:24}} {{PLURAL:24|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho CodeReviewBot ngừng hoạt động hiện đã được giải quyết. [https://phabricator.wikimedia.org/T410417] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Người dùng API của Wikimedia có thể tham gia nghiên cứu khả năng sử dụng để giúp xác thực thiết kế mới dành cho chỗ thử REST API của Wikimedia. Những người có hứng thú tham gia cần điền vào [https://wikimediafoundation.limesurvey.net/487662 biểu mẫu khảo sát tham gia] này. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/IREJRRWTZTGCYWQHDMSNJFTQAEPOOAE3/] * Nhóm Giao diện MediaWiki đang trong quá trình ngừng hỗ trợ các bảng định dạng (stylesheet) kiểu XSLT trong Action API. Hỗ trợ cho <code dir=ltr>format=xml'''&xlst={stylesheet}'''</code> sẽ bị loại bỏ khỏi các dự án Wikimedia vào cuối tháng 11 năm 2025. Ngoài ra, nó sẽ sớm mặc định bị vô hiệu hóa trong các phiên bản phát hành của MediaWiki: v1.43 (LTS), v1.44, và v1.45. Hỗ trợ cho các bảng định dạng kiểu XSLT sẽ bị loại bỏ hoàn toàn khỏi MediaWiki v1.46 (dự kiến phát hành vào khoảng thời gian từ tháng 4 đến tháng 5 năm 2026). [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/5AX7UWAVVUNUSBOIRHMNOKWOZ5EZI3JX/] * Điểm cuối kế thừa của WDQS ([https://query-legacy-full.wikidata.org/ query-legacy-full.wikidata.org]) sẽ ngừng hoạt động vào cuối tháng 12 năm 2025, và sẽ chính thức bị vô hiệu hóa vào ngày 7 tháng 1 năm 2026. Sau ngày này, người dùng sẽ nhận thấy những yêu cầu đến query.wikidata.org mà yêu cầu toàn bộ biểu đồ bị lỗi hoặc trả về kết quả không hợp lệ nếu chúng không được viết lại để sử dụng liên kết SPARQL. Nhóm khuyên người dùng cần đảm bảo các công cụ và quy trình làm việc sử dụng các điểm cuối WDQS được hỗ trợ (<span dir=ltr><nowiki>https://query.wikidata.org/</nowiki></span> - Biểu đồ chính hoặc <span dir=ltr><nowiki>https://query-scholarly.wikidata.org/</nowiki></span> - Biểu đồ học thuật). Để được hỗ trợ chuyển đổi các trường hợp sử dụng (use case), vui lòng xem lại các trang [[d:Special:MyLanguage/Wikidata:Data_access|Truy cập Dữ liệu]] và [[d:Wikidata:Request_a_query|Yêu cầu Truy vấn]] để biết thêm thông tin và được hỗ trợ về các phương thức truy cập thay thế. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.4|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/48|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W48"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:56, ngày 24 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29702226 --> == Bản tin Kỹ thuật: Tuần 49-2025 == <section begin="technews-2025-W49"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/49|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Bảng Nhìn lại Một Năm Wikipedia 2025 sẽ có mặt vào ngày 2 tháng 12 dành cho người dùng ứng dụng Wikipedia trên iOS và Android, gồm thông tin chuyên sâu được cá nhân hóa, những điểm nổi bật để đọc được cập nhật, cùng thiết kế đã được làm mới. Tìm hiểu thêm trên [[mw:Special:MyLanguage/Wikimedia Apps/Team/Wikipedia Year in Review/Updates|trang dự án]] của tính năng nhìn lại này. * Nhóm Tăng trưởng đang nỗ lực cải thiện nội dung và cách trình bày của Email Xác minh được gửi tới người dùng mới để chúng trở nên thân thiện, hữu ích và có thêm nhiều thông tin hơn. Một số văn bản mới đã được soạn thảo cho thử nghiệm A/B và bạn có thể giúp đỡ bằng cách dịch chúng. Xem [[phab:T396155|Phabricator]]. * Tính năng [[mw:Special:MyLanguage/Help:Growth/Tools/Add a link|Thêm liên kết]] nay sẽ được triển khai tới Wikipedia tiếng Nhật, tiếng Urdu và tiếng Trung vào ngày 2 tháng 12. Thêm liên kết được dựa trên mô hình dự đoán nhằm gợi ý liên kết cần được thêm vào bài viết. Trong khi tính năng này đã có mặt trên hầu hết các trang Wikipedia, mô hình dự đoán đó không thể hỗ trợ một số ngôn ngữ nhất định. Một mô hình mới đã được phát triển để xử lý những ngôn ngữ này, và mô hình đó sẽ dần được triển khai sang các trang Wikipedia khác theo thời gian. Nếu bạn muốn được biết thêm thông tin, vui lòng liên hệ [[mw:user:Trizek (WMF)|Trizek (WMF)]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:34}} {{PLURAL:34|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà hộp tìm kiếm trên một số trang Commons không hiển thị kết quả nào do việc chuyển đổi từ SpecialSearch sang MediaSearch, hiện đã được giải quyết. [https://phabricator.wikimedia.org/T399476] * Hai wiki mới đã được tạo ra: ** {{int:project-localized-name-group-wikipedia}} tiếng [[d:Q36846|Toki Pona]] ([[w:tok:|<code>w:tok:</code>]]) [https://phabricator.wikimedia.org/T404457] ** {{int:project-localized-name-group-wikiquote}} tiếng [[d:Q33655|Pidgin Nigeria]] ([[q:pcm:|<code>q:pcm:</code>]]) [https://phabricator.wikimedia.org/T408318] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.5|MediaWiki]] '''Chuyên sâu''' * Quỹ Wikimedia đang trong giai đoạn đầu của việc khám phá các phương pháp tiếp cận cho '''Chỉ dẫn bài viết'''. Sáng kiến này nhằm mục đích xác định các phương pháp can thiệp có thể giúp các biên tập viên mới dễ dàng hiểu và áp dụng các quy tắc và chính sách hiện hành của Wikipedia khi tạo bài viết. Dự án đang trong giai đoạn khám phá và thiết kế thử nghiệm giai đoạn đầu. Tất cả các thành viên cộng đồng được khuyến khích [[mw:Special:MyLanguage/Article guidance|tìm hiểu thêm]] về dự án, và chia sẻ suy nghĩ của họ trên [[mw:Special:MyLanguage/Talk:Article guidance|trang thảo luận này]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/49|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W49"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:58, ngày 1 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29732328 --> == Bản tin Kỹ thuật: Tuần 50-2025 == <section begin="technews-2025-W50"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/50|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Bất kỳ ai muốn bảo mật tài khoản người dùng của mình nay có thể sử dụng tính năng [[m:Special:MyLanguage/Help:Two-factor authentication|xác thực hai yếu tố]] (2FA). Tính năng này có sẵn cho tất cả người dùng của toàn bộ các dự án Wikimedia. Đây là một phần của sáng kiến [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. Sau này, 2FA sẽ được yêu cầu đối với tất cả người dùng có thể thực hiện các hành động mang tính nhạy cảm về bảo mật hoặc quyền riêng tư. '''Cập nhật cho biên tập viên''' * Tiếp nối đợt triển khai lần trước, tính năng [[mw:Special:MyLanguage/Help:Growth/Tools/Add a link|Thêm liên kết]], một tính năng cho phép biên tập viên thêm liên kết được đề xuất trong quá trình sửa đổi, sẽ có mặt trên [[Phab:T410469|33 trang Wikipedia]] kể từ ngày 9 tháng 12. Việc mở rộng này có được nhờ mô hình dự đoán mới nay hỗ trợ tất cả các ngôn ngữ, kể cả những ngôn ngữ mà chưa được đề cập trước đây. Dù tính năng này đã có mặt trên hầu hết các trang Wikipedia được một thời gian, nhưng lần triển khai này sẽ giúp chúng tôi tiến gần hơn đến việc sử dụng mô hình được cải tiến này ở mọi nơi. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn được biết thêm thông tin chi tiết vui lòng liên hệ với [[mw:user:Trizek (WMF)|Trizek (WMF)]]. * Tuần trước, [[mw:Special:MyLanguage/Wikimedia Search Platform|nhóm Nền tảng Tìm kiếm]] đã thêm gợi ý tìm kiếm [[w:vi:Chuyển tự|được chuyển tự]] khi bạn nhập tới các wiki bằng tiếng Georgia. Nếu chỉ có một vài gợi ý tìm kiếm thông thường, thì các truy vấn bằng chữ Latinh hoặc Kirin [[phab:T127003|nay sẽ được viết lại thành chữ Georgia]] để có thể tìm kiếm được nhiều kết quả trùng khớp hơn. Ví dụ, tìm kiếm <bdi lang="ka-Latn" dir="ltr">''bedniereba''</bdi> hoặc <bdi lang="ka-Cyrl" dir="ltr">''бедниереба''</bdi> nay sẽ gợi ý bài viết hiện có về <bdi lang="ka" dir="ltr">ბედნიერება</bdi> ("sự hạnh phúc"). Bạn có thể đề xuất những ngôn ngữ khác mà việc gợi ý được chuyển tự có thể hữu ích [[phab:T375215|trên Phabricator]] để dùng cho quá trình phát triển sau này. * Cuối tuần này, một thử nghiệm có kiểm soát sẽ bắt đầu dành cho các biên tập viên trên 100 trang Wikipedia lớn nhất khi đang thực hiện sửa đổi một đề mục bằng trình soạn thảo trực quan trên trang web di động. 50% số biên tập viên đó sẽ nhận thấy nút "Sửa đổi toàn bộ trang" mới cho phép họ mở rộng phiên sửa đổi của mình lên toàn bộ trang đó. Tính năng này nhằm mục đích giúp người dùng trên trang web di động sửa đổi bất kỳ đề mục nào trong bài viết một cách dễ dàng hơn, bất kể việc họ chạm vào biểu tượng sửa đề mục nào để bắt đầu sửa đổi. Thử nghiệm này sẽ kéo dài khoảng 4 tuần. Bạn có thể tìm hiểu [[phab:T409112|thêm thông tin]] về dự án này. * Cuối tuần này, [[mw:Special:MyLanguage/Readers/Reader Growth|nhóm Tăng trưởng Độc giả]] sẽ khởi động [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.1.14 Expanded Mobile Sections|thử nghiệm trên trang web di động]] để mở rộng tất cả đề mục bài viết theo mặc định (hiện giờ chúng được mặc định thu gọn lại) và ghim tiêu đề của đề mục mà người dùng hiện đang đọc lên đầu trang. Thử nghiệm này sẽ ảnh hưởng tới 10% người dùng trên Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia và tiếng Việt. [https://phabricator.wikimedia.org/T409485] * [[mw:Special:MyLanguage/Wikimedia Apps/Team/Wikipedia Year in Review/2025 Year in Review|Tổng kết Một Năm Wikipedia 2025]], một tính năng trong ứng dụng Wikipedia dành cho thiết bị di động (iOS và Android) nhằm cung cấp cho người dùng bản tóm tắt được cá nhân hóa về mức độ tương tác của họ với Wikipedia xuyên suốt trong một năm, nay đã có mặt trên ứng dụng iOS và Android. Phiên bản này bao gồm những thông tin chuyên sâu được mở rộng và cá nhân hóa, cải thiện những điểm nổi bật trong quá trình đọc, thông điệp mới cho nhà quyên góp, cùng thiết kế được cập nhật. Hãy mở ứng dụng để xem chuyên mục Tổng kết Năm và khám phá hành trình đọc của bạn trong năm 2025 nhé. * Một lỗi phần mềm xảy ra gần đây khiến cho các sửa đổi được thực hiện bằng Trình Soạn thảo Trực quan thực hiện những thay đổi không mong muốn với mã nguồn wiki, trong đó có việc loại bỏ khoảng trắng và thay thế các dấu cách bằng dấu gạch dưới trong các liên kết wiki bên trong chú thích. Vấn đề này đã được giải quyết một phần vào tuần trước, và việc giải quyết vấn đề vẫn đang tiếp tục được thực hiện. Các biên tập viên sử dụng Trình Soạn thảo Trực quan trong các ngày từ 28 tháng 11 đến 2 tháng 12 nên kiểm tra lại sửa đổi của mình để tìm ra những thay đổi ngoài ý muốn. [https://phabricator.wikimedia.org/T411238] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề về việc xử lý không đúng các đường dẫn URL được sao chép từ thanh địa chỉ của người dùng Microsoft Edge đã được giải quyết. [https://phabricator.wikimedia.org/T341281] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Bắt đầu từ tuần này, người dùng [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] "{{int:codemirror-beta-feature-title}}" sẽ sử dụng [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] làm trình sửa đổi dành cho các kiểu nội dung Lua, JavaScript, CSS, JSON và Vue, thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]]. Với thay đổi này, [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|các linter]] sẽ được nâng cấp. Đây là một phần trong nỗ lực lớn hơn nhằm thay thế CodeEditor và mang tới trải nghiệm sửa đổi mã nguồn một cách nhất quán. [https://phabricator.wikimedia.org/T373711] * Các nhà phát triển được khuyến khích tham gia [https://wikimediafoundation.limesurvey.net/552643 Khảo sát Mức độ Hài lòng của Nhà phát triển năm 2025], hiện vẫn đang được mở đến hết ngày 5 tháng 1 năm 2026. Nếu bạn tham gia vào việc xây dựng phần mềm cho hệ sinh thái Wikimedia và muốn chia sẻ kinh nghiệm hoặc phản hồi của mình, thì chúng tôi sẽ rất trân trọng sự tham gia của bạn. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/W4WBKO6Q55UWWCCSFWQATKEXBEHP3QNR/] * Tuần này không có phiên bản MediaWiki mới nào. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/50|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W50"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:45, ngày 8 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29738112 --> == Bản tin Kỹ thuật: Tuần 51-2025 == <section begin="technews-2025-W51"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/51|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:18}} {{PLURAL:18|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một trong số đó là việc giải quyết vấn đề khi tài khoản tạm thời chèn liên kết URL ngoài, việc này kích hoạt yêu cầu hCaptcha trong nhiều trường hợp hơn so với dự định, và không hiển thị popup cần thiết trong lần thử xuất bản sửa đổi đầu tiên. [https://phabricator.wikimedia.org/T411927] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * <span class="mw-translate-fuzzy">Để cải thiện hiệu suất cho cơ sở dữ liệu và trang web, các liên kết ngoài tới các dự án Wikimedia sẽ không còn được lưu trữ trong cơ sở dữ liệu. Điều này có nghĩa là chúng sẽ không thể được tìm thấy trong [[{{#special:LinkSearch}}]], sẽ không được kiểm tra bởi Danh sách đen về spam hoặc Bộ lọc Sai phạm dưới dạng liên kết mới, và sẽ không có trong bảng <code dir=ltr>externallinks</code> trên các bản sao cơ sở dữ liệu. Trong tương lai nó có thể được mở rộng sang những trang web khác đáng tin cậy được liên kết nhiều trên cơ sở từng wiki, chẳng hạn như liên kết Creative Commons trên Wikimedia Commons.</span> [https://phabricator.wikimedia.org/T405005] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.7|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/51|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W51"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:03, ngày 15 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29796010 --> == Bản tin Kỹ thuật: Tuần 52-2025 == <section begin="technews-2025-W52"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/52|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Kể từ tháng 1, các bộ lọc sai phạm [[mw:Special:MyLanguage/Extension:AbuseFilter/Access flags|có thể được thiết lập]] để tự động loại bỏ chi tiết bộ lọc chẳng hạn như quy tắc và danh sách các sửa đổi và tác vụ thực hiện được ghi lại. Điều này sẽ giúp người giám sát sử dụng các bộ lọc sai phạm để ngăn chặn doxxing hoặc nội dung khác có thể bị loại bỏ. [https://phabricator.wikimedia.org/T290324] * Số tiếp theo của Bản tin Kỹ thuật sẽ được phát hành vào ngày 12 tháng 1 năm 2026 do trùng vào kỳ nghỉ cuối năm. Xin cảm ơn tất cả các biên dịch viên cùng những người đã gửi nội dung hoặc phản hồi trong năm nay. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:16}} {{PLURAL:16|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, sự cố xảy ra khiến cho ứng dụng bị sập khi chạm vào mục "Bước Đầu tiên" trong mục Nhìn lại Một năm trên ứng dụng Wikipedia dành cho Android nay đã được giải quyết, và tính năng này được mở như mong đợi. [https://phabricator.wikimedia.org/T411546] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Những thành phần giao diện như khác biệt giữa các phiên bản và thể loại được tạo bởi MediaWiki từng có thuộc tính <code dir=ltr>data-mw="interface"</code> để phân biệt với nội dung wiki. Thuộc tính này đã được thay thế bằng <code dir=ltr>data-mw-interface=""</code>, nhằm tránh khả năng gây xung đột với những thuộc tính <code dir=ltr>data-mw</code> khác được tạo bởi Parsoid. [https://phabricator.wikimedia.org/T409187] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Không có phiên bản MediaWiki mới nào trong tuần này hoặc tuần tới. '''Các cuộc họp và sự kiện''' * [[mw:Wikimedia Hackathon Northwestern Europe 2026|Wikimedia Hackathon Tây Bắc Âu năm 2026]] sẽ diễn ra vào các ngày 13-14 tháng 3 năm 2026 tại Arnhem, Hà Lan. Đơn đăng ký vừa được mở vào giữa tháng 12 và sẽ đóng vào giữa tháng 1 hoặc có thể đóng sớm hơn nếu hết chỗ. Do sự kiện giới hạn khoảng 100 người tham gia, chúng tôi khuyến khích bạn đăng ký thật sớm. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/52|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W52"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:45, ngày 22 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29831856 --> == Bản tin Kỹ thuật: Tuần 03-2026 == <section begin="technews-2026-W03"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/03|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Quỹ Wikimedia đã chia sẻ một số câu hỏi định hướng cho Kế hoạch Thường niên giai đoạn tháng 7 năm 2026–tháng 6 năm 2027 trên [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] và ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Những câu hỏi này tập trung vào những xu hướng toàn cầu, những thử nghiệm nhanh và hiệu quả hơn, hỗ trợ tốt hơn cho người mới, tăng cường năng lực cho biên tập viên và người dùng có quyền nâng cao, cải thiện sự cộng tác giữa các dự án, cũng như phát triển và duy trì lượng người đọc. Mọi phản hồi và ý kiến đóng góp đều được hoan nghênh trên [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|trang thảo luận]]. '''Cập nhật cho biên tập viên''' * Là một phần của công việc hiện do nhóm Công nghệ Cộng đồng thực hênj xoay quanh dự án [[m:Special:MyLanguage/Community Wishlist/W372|Nhiều danh sách theo dõi]] (Multiple watchlists), việc hiển thị của tính năng [[Special:EditWatchlist|Sửa đổi Danh sách theo dõi]] (EditWatchlist) sẽ được cập nhật làm bước đầu tiên hướng tới việc có được nhiều danh sách theo dõi. Ngoài ra, việc phân trang của trang [[Special:Search|Tìm kiếm]] cũng sẽ được cập nhật như là một phần của công việc liên quan đến mong muốn [[m:Special:MyLanguage/Community Wishlist/W186|Cải tiến phân trang / điều hướng trang]]. [https://phabricator.wikimedia.org/T411596] * [[m:Special:GlobalWatchlist|Danh sách theo dõi toàn cục]] là [[mw:Special:MyLanguage/Extension:GlobalWatchlist|phần mở rộng]] của MediaWiki cho phép bạn xem danh sách theo dõi của bạn từ các wiki khác nhau trên cùng một trang. Danh sách này gần đây đã được cập nhật để trông giống như [[Special:Watchlist|Danh sách theo dõi]] thông thường hơn, chẳng hạn như tiền xử lý các tài khoản tạm thời để che giấu địa chỉ IP (trong đó có việc chuyển hướng liên kết người dùng đến các trang đóng góp), in đậm tiêu đề trang, và mở các liên kết trong phần tóm lược sửa đổi và thẻ trong tab trình duyệt mới. [https://phabricator.wikimedia.org/T398361][https://phabricator.wikimedia.org/T298919][https://phabricator.wikimedia.org/T273526][https://phabricator.wikimedia.org/T286309] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:28}} {{PLURAL:28|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề mà việc cấm tài khoản toàn cục không có tùy chọn cấm gửi thư điện tử, nay đã được giải quyết, và sẽ có thể sử dụng kể từ tuần ngày 13 tháng 1. [https://phabricator.wikimedia.org/T401293] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[mw:Special:MyLanguage/VisualEditor/Citation tool|Công cụ chú thích của Soạn thảo Trực quan]] và [[mw:Special:MyLanguage/Help:Reference Previews|Xem trước Chú thích]] nay hỗ trợ kiểu chú thích dạng "bản đồ". [https://phabricator.wikimedia.org/T411083] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.10|MediaWiki]]/[[mw:MediaWiki 1.46/wmf.11|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/03|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W03"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:33, ngày 12 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29907192 --> == 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''' 19:45, ngày 16 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:ZI Jony@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549 --> == Bản tin Kỹ thuật: Tuần 04-2026 == <section begin="technews-2026-W04"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/04|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Khay được hiển thị trên [[Special:Diff|Đặc biệt:Khác]] trong chế độ xem di động đã được thiết kế lại. Giờ đây nó mặc định được thu gọn, đồng thời tích hợp một liên kết để lùi lại sửa đổi đang được hiển thị trên màn hình, giúp các biên tập viên và người duyệt bài trên điện thoại di động dễ dàng thực hiện tác vụ mà vẫn giữ giao diện thật gọn gàng. [https://phabricator.wikimedia.org/T402297] * [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi từ nhiều wiki khác nhau trên cùng một trang. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] này tiếp tục được cải thiện — nay nó có thể tự động xác định hướng văn bản (nhằm đảm bảo việc hiển thị chính xác các trang web mà có tên miền bất thường) và hiển thị chi tiết phần miêu tả cho các tác vụ được lưu trong nhật trình. Cuối tuần này, một liên kết thường trực mới cho các tác vụ tạo trang cùng các lớp CSS cho từng mục nhập sẽ được thêm vào. [https://phabricator.wikimedia.org/T412505][https://phabricator.wikimedia.org/T287929][https://phabricator.wikimedia.org/T262768][https://phabricator.wikimedia.org/T414135] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:32}} {{PLURAL:32|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà được ghi nhận trước đây trong giao diện Vector 2022 mà các liên kết anchor đích bị che khuất bởi tiêu đề cố định nay đã được giải quyết. [https://phabricator.wikimedia.org/T406114] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Như đã đề cập trong [[m:Special:MyLanguage/Tech/News/2025/44|thông báo ngừng hỗ trợ vào tháng 10 năm 2025]], nhóm Giao diện MediaWiki sẽ bắt đầu loại bỏ toàn bộ điểm cuối chuyển đổi có dấu gạch chéo ở cuối khỏi API REST của MediaWiki vào tuần từ ngày 26 tháng 1. Những thay đổi này dự kiến sẽ được triển khai tới tất cả các wiki chậm nhất vào ngày 30 tháng 1. Tất cả người dùng API đang gọi những điểm cuối này được khuyên chuyển đổi sang những phiên bản không có dấu gạch chéo ở cuối. Cả hai loại biến thể điểm cuối này đều có thể được tìm thấy, so sánh và kiểm tra sử dụng [https://test.wikipedia.org/wiki/Special:RestSandbox Chỗ thử REST]. Nếu bạn có thắc mắc hay gặp bất kỳ sự cố nào, hãy gửi yêu cầu bằng cách tạo một tác vụ trong Phabricator gửi tới [https://phabricator.wikimedia.org/project/view/6931/ bảng tin #MW-Interfaces-Team]. * Tài liệu tham khảo trực quan cho [[mw:Special:MyLanguage/Wikimedia REST API|API REST của Wikimedia]] đã được chuyển. Những yêu cầu đến các tài liệu API trước đây được lưu trữ thông qua [[mw:Special:MyLanguage/RESTBase|RESTBase]] (v.d.: <code dir=ltr>https://en.wikipedia.org/api/rest_v1/</code>) nay được chuyển hướng tới [[w:en:Special:RestSandbox|Chỗ thử REST]]. * [[mw:Special:MyLanguage/Wikidata Platform|Nhóm Nền tảng Wikidata của WMF]] (WDP) đã phát hành [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|bản tin tháng 1 năm 2026]]. Bản tin bao gồm những cập nhật về việc ngừng hoạt động điểm cuối biểu đồ đầy đủ (full-graph) cũ, thay đổi về chính sách User-Agent, thời gian làm việc hàng tháng của kế hoạch chuyển đổi sang Blazegraph, cùng những nỗ lực nhằm giảm thiểu những lỗi hồi quy gây ra bởi việc ngừng điểm cuối cũ. Xin nhắc lại rằng bạn có thể [[m:Special:MyLanguage/Global message delivery/Targets/WDP team updates|đăng ký nhận bản tin WDP đó]]! * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.12|MediaWiki]] '''Các cuộc họp và sự kiện''' * [[mw:Wikimedia Hackathon Northwestern Europe 2026|Cuộc thi Hackathon Wikimedia khu vực Tây Bắc Châu Âu năm 2026]] sẽ diễn ra vào ngày 13-14 tháng 3 năm 2026 tại Arnhem, Hà Lan. Cổng đăng ký đã được mở vào giữa tháng 12 và sẽ sớm đóng lại hoặc đóng ngay khi đã đủ số lượng người tham gia. Đây là cuộc thi hackathon kéo dài hai ngày, tập trung vào mảng kỹ thuật và quy tụ các thành viên Wikimedia từ khắp khu vực. Hy vọng sẽ gặp lại bạn tại đó! '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/04|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W04"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:29, ngày 19 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29943403 --> == Rà soát thường niên Bộ Quy tắc Ứng xử Chung và Hướng dẫn Thực thi == <section begin="announcement-content" /> Tôi viết thư này để thông báo với bạn rằng thời gian xem xét hàng năm đối với Bộ Quy tắc Ứng xử và Hướng dẫn Thực thi hiện đã bắt đầu. Bạn có thể đưa ra các đề xuất thay đổi đến hết ngày 9 tháng 2 năm 2026. Đây là bước đầu tiên trong nhiều bước cần thực hiện cho quá trình xem xét hàng năm. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Đọc thêm thông tin và tìm cuộc thảo luận để tham gia trên trang UCoC trên Meta]]. [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Ủy ban Điều phối Bộ Quy tắc Ứng xử Toàn cầu]] (U4C) là một nhóm toàn cầu chuyên trách việc thực hiện Bộ Quy tắc Ứng xử Toàn cầu một cách công bằng và nhất quán. Đánh giá thường niên này được lên kế hoạch và thực hiện bởi U4C. Để biết thêm thông tin và trách nhiệm của U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|bạn có thể xem Hiến chương U4C]]. Vui lòng chia sẻ thông tin này với các thành viên khác trong cộng đồng của bạn ở bất cứ nơi nào phù hợp. -- Hợp tác với U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" /> 21:02, ngày 19 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:Keegan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 --> == Bản tin Kỹ thuật: Tuần 05-2026 == <section begin="technews-2026-W05"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/05|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Quỹ Wikimedia mời mọi người đóng góp ý kiến cho [[m:Special:MyLanguage/Product and Technology Advisory Council/Year1 Reflections and Proposed Way Forward 2026 Update|đề xuất kế hoạch tương lai]] của [[:m:Special:MyLanguage/Product and Technology Advisory Council|Hội đồng Cố vấn Sản phẩm và Công nghệ]] chậm nhất ngày 28 tháng 2. * Tất cả người dùng đã đăng ký tài khoản nay có thể sử dụng passkey (mã xác thực) cho việc [[m:Special:MyLanguage/Help:Two-factor authentication|xác thực hai yếu tố]] (2FA). Passkey là một cách đơn giản để đăng nhập mà không cần phải sử dụng thiết bị thứ hai. Chúng sẽ xác thực danh tính của người dùng sử dụng vân tay, nhận diện khuôn mặt, hoặc dùng mã PIN. Để thiết lập một passkey, đầu tiên hãy thiết lập phương thức xác thực 2FA thông thường. Hiện tại, để đăng nhập bằng passkey, người dùng cũng phải sử dụng cả mật khẩu. Vào cuối quý này, tính năng đăng nhập không cần mật khẩu sẽ cho phép người dùng đăng nhập chỉ bằng một cú nhấn chuột và passkey. Người dùng có quyền nâng cao cũng sẽ bắt buộc phải kích hoạt xác thực 2FA. Đây là một phần của dự án [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. * Những người đóng góp chưa đăng ký tài khoản trên các IP hoặc dải IP bị cấm nay có thể tương tác trên wiki để chống lại quyết định cấm trên trang thảo luận thành viên, trừ khi tùy chọn "ngăn người dùng này sửa đổi trang thảo luận của họ" được bật. Điều này giúp giải quyết vấn đề rằng người dùng chưa đăng nhập không thể sử dụng quy trình bỏ cấm mặc định thông qua trang thảo luận thành viên. [https://phabricator.wikimedia.org/T398673] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:20}} {{PLURAL:20|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, phần miêu tả phương thức Xác thực hai yếu tố (2FA) trên trang quản lý đã được cập nhật. Giờ đây nó trở nên rõ ràng và dễ hiểu hơn, giúp người dùng dễ dàng sử dụng hơn. [https://phabricator.wikimedia.org/T332385] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Một biến Bộ lọc Sai phạm mới, <code>account_type</code>, đã được thêm vào để cung cấp một cách đáng tin cậy trong việc xác định loại tài khoản được tạo trong các tác vụ <code>createaccount</code> và <code>autocreateaccount</code>. Là một phần của thay đổi này, biến <code>accountname</code> đã được đổi tên thành <code>account_name</code>, và <code>accountname</code> nay đã lỗi thời. Những người quản lý bộ lọc sai phạm nên cập nhật bất kỳ bộ lọc nào đang sử dụng biến kiểm tra loại tài khoản mã hóa cứng hoặc đã lỗi thời nào nếu có. [https://phabricator.wikimedia.org/T414049] * Các hình thu nhỏ được yêu cầu với kích thước không chuẩn và sử dụng các phương thức không chuẩn như yêu cầu trực tiếp đến <code dir=ltr><nowiki>upload.wikimedia.org/…</nowiki></code> sẽ ngừng hoạt động trong thời gian tới. Thay đổi này nhằm ngăn chặn việc các trình thu thập dữ liệu web và bot từ bên ngoài lạm dụng. Một số người dùng có đoạn mã CSS/JS tùy chỉnh, các bảo quản viên giao diện có thể sửa tiện ích và giao diện cục bộ, cùng người viết công cụ sẽ cần cập nhật đoạn mã của mình để sử dụng kích thước hình thu nhỏ tiêu chuẩn. [[phab:T414805|Thông tin chi tiết, các liên kết tìm kiếm, cùng ví dụ về cách giải quyết chúng có sẵn trong tác vụ này]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.13|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/05|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W05"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:17, ngày 26 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29969530 --> == Bản tin Kỹ thuật: Tuần 06-2026 == <section begin="technews-2026-W06"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/06|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Tính năng "{{int:pageinfo-toolboxlink}}", một tính năng cung cấp thông tin xác thực về một trang ([{{fullurl:{{FULLPAGENAME}}|action=info}} ví dụ]), nay có thêm cả phần mục lục được tạo tự động. Nếu có trang [[MediaWiki:Pageinfo-header]] được người dùng tạo cục bộ, giờ nó có thể được xóa đi. [https://phabricator.wikimedia.org/T363726] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, Trình Soạn thảo Trực quan trước đây đã thêm chức năng in đậm hoặc nghiêng vào phần miêu tả liên kết, làm cho mã wiki trở nên phức tạp. Vấn đề này hiện đã được giải quyết. [https://phabricator.wikimedia.org/T409669] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Không có bản dump XML nào được tạo ra vào ngày 20 tháng 1. Ngoài ra, kể từ giờ, các bản dump sẽ chỉ được tạo một lần mỗi tháng. [https://phabricator.wikimedia.org/T414389] * Nhóm Giao diện MediaWiki đã ngừng hỗ trợ tất cả điểm cuối chuyển đổi có dấu gạch chéo ở cuối khỏi [https://www.mediawiki.org/wiki/Special:MyLanguage/API:REST%20API API REST của MediaWiki]. Tất cả người dùng API hiện đang gọi những điểm cuối đó được khuyến khích chuyển sang các bản không có dấu gạch chéo ở cuối. Nếu bạn có thắc mắc hoặc gặp bất kỳ sự cố nào, vui lòng gửi tác vụ phabricator tới [https://phabricator.wikimedia.org/project/view/6931/ bảng tin của #MW-Interfaces-Team]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.14|MediaWiki]] '''Nổi bật trong tuần''' * Xin nhắc tới người dùng rằng Quỹ Wikimedia đã chia sẻ một số câu hỏi định hướng cho Kế hoạch Hàng năm giai đoạn tháng 7 năm 2026–tháng 6 năm 2027 trên [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] và ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Những câu hỏi này tập trung vào những xu hướng toàn cầu, thử nghiệm nhanh hơn và hiệu quả hơn, hỗ trợ tốt hơn cho người mới, nâng cao năng lực cho biên tập viên và người dùng có quyền nâng cao, cải thiện việc cộng tác giữa các dự án, cũng như phát triển và giữ chân độc giả. Mọi phản hồi và ý kiến đóng góp đều được hoan nghênh trên [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|trang thảo luận]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/06|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W06"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:43, ngày 2 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30000986 --> == Bản tin Kỹ thuật: Tuần 07-2026 == <section begin="technews-2026-W07"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/07|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Mục Mong muốn cộng đồng]] <span lang="en" dir="ltr" class="mw-content-ltr">Logged-in contributors who manage large or complex watchlists can now organise and filter watched pages in ways that improve their workflows with the new [[mw:Special:MyLanguage/Help:Watchlist labels|Watchlist labels]] feature. By adding custom labels (for example: pages you created, pages being monitored for vandalism, or discussion pages) users can more quickly identify what needs attention, reduce cognitive load, and respond more efficiently. This improves watchlist usability, especially for highly active editors.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">A new feature available on [[Special:Contributions|Special:Contributions]] shows [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|temporary accounts]] that are likely operated by the same person, and so makes patrolling less time-consuming. Upon checking contributions of a temporary account, users with access to temporary account IP addresses can now see a view of contributions from the related temporary accounts. The feature looks up all the IPs associated with a given temporary account within the data retention period and shows all the contributions of all temporary accounts that have used these IPs. [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts#February 2026: Improvements to the patroller tooling|Learn more]].</span> [https://phabricator.wikimedia.org/T415674] * <span lang="en" dir="ltr" class="mw-content-ltr">When editors preview a wikitext edit, the reminder box that they are only seeing a preview (which is shown at the top), now has a grey/neutral background instead of a yellow/warning background. This makes it easier to distinguish preview notes from actual warnings (for example, edit conflicts or problematic redirect targets), which will now be shown in separate warning or error boxes.</span> [https://phabricator.wikimedia.org/T414742] * <span lang="en" dir="ltr" class="mw-content-ltr">The [[m:Special:GlobalWatchlist|Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continues to improve — it now properly supports more than one Wikibase site, for example both [[d:|Wikidata]] and [[testwikidata:|testwikidata]]. In addition, issues regarding text direction have been fixed for users who prefer Wikidata or other Wikibase sites in right-to-left (RTL) languages.</span> [https://phabricator.wikimedia.org/T415440][https://phabricator.wikimedia.org/T415458] * <span lang="en" dir="ltr" class="mw-content-ltr">The automatic "magic links" for ISBN, RFC, and PMID numbers have been [[mw:Special:MyLanguage/Help:Magic links|deprecated in wikitext since 2021]] due to inflexibility and difficulties with localization. Several wikis have successfully replaced RFC and PMID magic links with equivalent external links, but a template was often required to replace the functionality of the ISBN magic link. There is now a new [[mw:Special:MyLanguage/Help:Magic words#isbn|built-in parser function]] <code dir=ltr><nowiki>{{#isbn}}</nowiki></code> available to replace the basic functionality of the ISBN magic link. This makes it easier for wikis who wish to migrate off of the deprecated magic link functionality to do so.</span> [https://phabricator.wikimedia.org/T145604] * <span lang="en" dir="ltr" class="mw-content-ltr">Two new wikis have been created:</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">a {{int:project-localized-name-group-wikipedia}} in [[d:Q35401|Jju]]</span> ([[w:kaj:|<code>w:kaj:</code>]]) [https://phabricator.wikimedia.org/T413283] ** <span lang="en" dir="ltr" class="mw-content-ltr">a {{int:project-localized-name-group-wikipedia}} in [[d:Q1186896|Nawat]]</span> ([[w:ppl:|<code>w:ppl:</code>]]) [https://phabricator.wikimedia.org/T413273] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * <span lang="en" dir="ltr" class="mw-content-ltr">A new global user group has been created: [[{{int:grouppage-local-bot}}|{{int:group-local-bot}}]]. It will be used internally by the software to allow community bots to bypass rate limits that are applied to abusive [[w:en:Web scraping|web scrapers]]. Accounts that are approved as bots on at least one Wikimedia wiki will be automatically added to this group. It will not change what user permissions the bot has.</span> [https://phabricator.wikimedia.org/T415588] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.15|MediaWiki]] '''Các cuộc họp và sự kiện''' * <span lang="en" dir="ltr" class="mw-content-ltr">The [[mw:Special:MyLanguage/MediaWiki Users and Developers Conference Spring 2026|MediaWiki Users and Developers Conference, Spring 2026]] will be held March 25–27 in Salt Lake City, USA. This event is organized by and for the third-party MediaWiki community. You can propose sessions and register to attend.</span> [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/AZBWVI46SDEB65PGR5J6E4TYOQQEZXM7/] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/07|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W07"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 23:30, ngày 9 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30026671 --> == Bản tin Kỹ thuật: Tuần 08-2026 == <section begin="technews-2026-W08"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/08|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|Nhóm SRE]] sẽ tiến hành dọn dẹp phiên bản [[m:Special:MyLanguage/Etherpad|Etherpad]] của Wikimedia, một trình sửa đổi trên web dành cho việc sửa đổi tài liệu cộng tác theo thời gian thực. Tất cả pad sẽ bị xóa vĩnh viễn sau ngày 30 tháng 4 năm 2026 – trường hợp nếu còn dự án vẫn đang được tiến hành di chuyển vào thời điểm đó thì nhóm có thể xem xét lại thời gian đó tùy từng trường hợp. Vui lòng tạo bản sao lưu cục bộ cho bất kỳ nội dung nào mà bạn muốn giữ lại, vì dữ liệu đã bị xóa không thể khôi phục được nữa. Việc dọn dẹp này sẽ giúp giảm bớt kích thước cơ sở dữ liệu và giảm thiểu lãng phí (dấu ấn) cơ sở hạ tầng. Etherpad sẽ tiếp tục hỗ trợ cộng tác theo thời gian thực, nhưng không kỳ vọng vào khả năng lưu trữ lâu dài. Những đợt dọn dẹp khác có thể xảy ra trong tương lai mà không cần báo trước. [https://phabricator.wikimedia.org/T415237] '''Cập nhật cho biên tập viên''' * Nhóm Tìm kiếm Thông tin sẽ triển khai [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|thử nghiệm trên ứng dụng di động dùng Android]] nhằm kiểm tra khả năng tìm kiếm kết hợp, có thể xử lý cả các truy vấn tìm theo ngữ nghĩa và theo từ khóa. Việc cải thiện tìm kiếm trên nền tảng này sẽ giúp người đọc dễ dàng tìm thấy những gì mà họ đang tìm kiếm hơn ngay trên Wikipedia. Thử nghiệm này sẽ bắt đầu được triển khai trước tiên là trên Wikipedia tiếng Hy Lạp vào cuối tháng 2, sau đó là các wiki tiếng Anh, tiếng Pháp và tiếng Bồ Đào Nha vào tháng 3. [https://diff.wikimedia.org/2026/01/08/semantic-search-making-it-easier-to-find-the-information-readers-want/ Đọc thêm] trên blog Diff. [https://www.mediawiki.org/wiki/Readers/Information_Retrieval] * Nhóm Phát triển Độc giả sẽ tiến hành [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.10.2 Mobile Table of Contents|một thử nghiệm]] cho người dùng web trên thiết bị di động nhằm thêm mục lục và tự động mở rộng tất cả các đề mục trong bài viết, nhằm tìm hiểu thêm về những vấn đề về điều hướng mà họ gặp phải. Thử nghiệm này sẽ có mặt trên các Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Anh, tiếng Pháp, tiếng Indonesia và tiếng Việt. * Trước đây, các thông báo đầu trang ([[{{ns:8}}:Sitenotice]] và [[{{ns:8}}:Anonnotice]]) chỉ được hiển thị trên trang web dành cho máy tính để bàn. Giờ đây, chúng sẽ được hiển thị trên mọi nền tảng. Người dùng trên trang web di động nay sẽ thấy được những thông báo này và được thông báo. Các bảo quản viên trang web nên sẵn sàng kiểm tra và sửa các thông báo đầu trang trên các thiết bị di động để tránh xung đột với bài viết. Để từ chối, bảo quản viên giao diện có thể thêm <code dir="ltr">#siteNotice { display: none; }</code> vào [[{{ns:8}}:Minerva.css]]. [https://phabricator.wikimedia.org/T138572][https://phabricator.wikimedia.org/T416644] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:19}} {{PLURAL:19|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề trên [[Special:RecentChanges|Đặc biệt:Thay đổi gần đây]] đã được giải quyết. Trước đây, nhấn vào nút ẩn trên các bộ lọc đang được áp dụng khiến cho nút "xem những thay đổi mới từ…" biến mất, dù nó đáng lẽ phải được hiển thị. Nút này giờ đây sẽ hoạt động như mong đợi. [https://phabricator.wikimedia.org/T406339] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Hiện đã có tài liệu mới giúp biên tập viên gỡ lỗi các tính năng tìm kiếm trên trang. Nó hỗ trợ việc khắc phục sự cố khi các trang xuất hiện trong kết quả tìm kiếm, khi thứ hạng có vẻ không như mong đợi và khi bạn cần kiểm tra nội dung nào đang được lập chỉ mục, giúp việc tìm hiểu và phân tích hành vi tìm kiếm trở nên dễ dàng hơn. [[mw:Help:CirrusSearch/Debug|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T411169] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.16|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/08|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W08"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:17, ngày 16 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30086330 --> == Bản tin Kỹ thuật: Tuần 09-2026 == <section begin="technews-2026-W09"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/09|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Tính năng [[mw:Special:MyLanguage/Edit check/Reference Check|Kiểm tra Nguồn Tham khảo]] đã được triển khai tới Wikipedia tiếng Anh, điều này có nghĩa là việc triển khai tính năng trên tất cả các trang Wikipedia đã hoàn thành. Tính năng này nhắc những người mới thêm nguồn tham khảo trước khi đăng nội dung mới, giúp giảm thiểu việc lùi sửa liên quan đến các vấn đề nguồn tham khảo phổ biến và cải thiện khả năng kiểm chứng được. Trong quá trình thử nghiệm A/B, tính năng này mang lại hiệu quả rất đáng kể: những người mới có hiển thị Kiểm tra Nguồn Tham khảo có khả năng thêm nguồn tham khảo cao hơn khoảng 2,2 lần trên trang web dành cho máy tính và cao hơn khoảng 17,5 lần trên trang web dành cho di động. [https://analytics.wikimedia.org/published/reports/editing/reference_check_ab_test_report_final_2025.html] '''Cập nhật cho biên tập viên''' * [[mw:Special:MyLanguage/Extension:InterwikiSorting|Phần mở rộng InterwikiSorting]], một phần mở rộng cho phép [[m:Special:MyLanguage/Interwiki sorting order|sắp xếp các liên kết liên wiki]], đã bị gỡ bỏ khỏi Wikipedia. Do đó, những biên tập viên đã bật tính năng sắp xếp liên kết liên wiki ở chế độ không rút gọn (định dạng danh sách đầy đủ) sẽ thấy được rằng các liên kết được sắp xếp lại. Các liên kết từ nay trở đi sẽ được liệt kê theo thứ tự bảng chữ cái dựa trên mã ngôn ngữ. [https://phabricator.wikimedia.org/T253764] * Cuối tuần này, người dùng sửa đổi một đề mục của trang bằng cách sử dụng trình soạn thảo trực quan trên thiết bị di động, sẽ nhìn thấy một nút mới có tên "Sửa đổi toàn bộ trang". Khi chạm vào nút đó, bạn sẽ có thể sửa đổi toàn bộ bài viết. Điều này sẽ giúp ích khi thay đổi bạn muốn thực hiện nằm ngoài đề mục mà bạn mở ban đầu. [https://phabricator.wikimedia.org/T387175][https://phabricator.wikimedia.org/T409112] * [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] đang mời các biên tập viên đánh giá xem chế độ tối có nên tiếp tục được coi là ở giai đoạn "thử nghiệm" (beta) trên wiki của họ hay không, dựa trên kinh nghiệm của họ về mức độ hoạt động tốt hay không của chế độ này trên máy tính và thiết bị di động. Nếu tính năng này được đánh giá là hoàn thiện rồi, thì các biên tập viên có thể cập nhật các thông báo giao diện trong <code dir=ltr>MediaWiki:skin-theme-description</code> và <code dir=ltr>MediaWiki:Vector-night-mode-beta-tag</code> để cho biết rằng chế độ tối đã sẵn sàng và không còn được coi là trong giai đoạn thử nghiệm nữa. * [[mw:Wikimedia_Apps/Team/iOS/Activity_Tab|Tab Hoạt động]] được cải tiến mà hiển thị thông tin chuyên sâu về người dùng nay có sẵn cho tất cả người dùng ứng dụng Wikipedia trên (phiên bản 7.9.0 trở lên). Sau quá trình thử nghiệm A/B trước đây cho thấy tỷ lệ tạo tài khoản trong số những người dùng có quyền truy cập vào tính năng này cao hơn, tính năng này đã được triển khai cho 100% người dùng kèm vài cập nhật. Tab Hoạt động nay hiển thị các bài viết bạn đã sửa đổi trên dòng thời gian, cung cấp thông tin chi tiết về tác động của việc sửa đổi chẳng hạn như số lượng đóng góp và xu hướng xem bài viết, cùng những tùy chọn tùy chỉnh để cải thiện trải nghiệm dành cho người dùng trong ứng dụng. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho [[mw:Special:MyLanguage/Extension:DiscussionTools|Công cụ Thảo luận (DiscussionTools)]] không thể hoạt động trên thiết bị di động, từ đó khôi phục đầy đủ tất cả chức năng. [https://phabricator.wikimedia.org/T415303] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi từ nhiều wiki trên cùng một trang. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] giúp thực hiện được điều này tiếp tục được cải tiến. Cải tiến mới nhất là việc bổ sung [[mw:Extension:GlobalWatchlist#hook|hook mới]], <code dir=ltr>ext.globalwatchlist.rebuild</code>, được kích hoạt sau mỗi lần xây dựng lại danh sách theo dõi. Điều này cho phép bạn chạy các tiện ích và đoạn mã người dùng cho trang Đặc biệt. [https://phabricator.wikimedia.org/T275159] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.17|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/09|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W09"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:03, ngày 23 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30119102 --> == Bản tin Kỹ thuật: Tuần 10-2026 == <section begin="technews-2026-W10"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/10|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments|Chế độ Sinh nhật]] Wikipedia 25 nay đã có mặt trên các trang Wikipedia tiếng Betawi, tiếng Breton, tiếng Trung, tiếng Séc, tiếng Hà Lan, tiếng Anh, tiếng Pháp, tiếng Gorontalo, tiếng Indonesia, tiếng Ý, tiếng Luxembourg, tiếng Madura, tiếng Sicilia, tiếng Tây Ban Nha, tiếng Thái và tiếng Việt! Tính năng chiến dịch hữu hạn này kỷ niệm 25 năm thành lập Wikipedia cùng linh vật cho ngày sinh nhật, Quả cầu Nhỏ (Baby Globe). Khi được bật, Quả cầu Nhỏ được hiển thị trên [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments/article configuration|~2,500 bài viết]], chờ người đọc khám phá. Cộng đồng có thể chọn bật chế độ Sinh nhật bằng cách đạt đồng thuận từ cộng đồng của mình và yêu cầu một bảo quản viên bật tính năng đó cũng như tùy chỉnh nó thông qua [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments#Community Configuration Demo|cấu hình cộng đồng]] trên wiki cục bộ. '''Cập nhật cho biên tập viên''' * [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Tham chiếu phụ (sub-referencing)]], một tính năng mới để tái sử dụng nguồn tham khảo với những chi tiết khác đã được triển khai tới Wikipedia tiếng Thụy Điển, Wikipedia tiếng Ba Lan và [[:phab:T418209|một vài trang wiki khác]]. Bạn có thể [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#test|thử tính năng này]] trên những dự án đó hoặc trên testwiki và [https://en.wikipedia.beta.wmcloud.org/wiki/Sub-referencing betawiki]. Kinh nghiệm từ wiki thí điểm đầu tiên Wikipedia tiếng Đức đã được [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing/Learnings|công bố trong báo cáo]]. Hãy liên hệ với nhóm Wikimedia Deutschland nếu bạn [[:m:Talk:WMDE Technical Wishes/Sub-referencing#Pilot wikis|quan tâm đến việc trở thành một wiki thí điểm]]. * [[mw:Special:MyLanguage/Help:Edit check#Paste check|Kiểm tra Chép dán]] (Paste Check) sẽ có mặt trên mọi trang Wikipedia trong tuần này. Tính năng này nhắc những người mới dán các đoạn văn bản mà họ không chắc viết vào Trình Soạn thảo Trực quan cân nhắc xem làm như thế có nguy cơ vi phạm bản quyền hay không. Kiểm tra Chép dán [[mw:Special:MyLanguage/Edit check/Tags|gắn thẻ]] tất cả sửa đổi mà nó hiển thị để có thể xem xét tiếp. Các bảo quản viên cục bộ có thể thiết lập cấu hình cho các khía cạnh khác nhau của tính năng này thông qua [[{{#special:EditChecks}}]]. [[mw:Special:MyLanguage/Edit check/Paste Check#A/B Experiment|Nghiên cứu]] trên 22 wiki cho thấy Kiểm tra Chép dán giúp giảm 18% số lượng sửa đổi bị lùi lại wikis found that so với nhóm đối chứng. Các biên dịch viên có thể [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-visualeditor-ve-mw-editcheck&filter=&optional=1&action=translate giúp biên dịch] tính năng này cùng những tính năng có liên quan. * [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] sẽ chuẩn hóa menu người dùng ở góc trên bên phải cho tất cả người dùng di động nhằm giúp nó gần giống trải nghiệm trên máy tính hơn. Hiện tại menu người dùng này chỉ hiển thị cho những người đã bật Chế độ Điều khiển Di động Nâng cao (AMC). Thay đổi duy nhất là một vài nút trước đây ở menu bên trái sẽ chuyển sang góc trên bên phải cho người dùng không bật chế độ AMC. Thay đổi này dự kiến được triển khai vào ngày 9 tháng 3 và nhằm mục đích cải thiện giao diện người dùng. [https://phabricator.wikimedia.org/T413912] * Bắt đầu từ tuần ngày 2 tháng 3, các email được gửi khi thêm, xóa hoặc sửa địa chỉ email của tài khoản sẽ chuyển sang định dạng email HTML đẹp mắt và rõ ràng hơn nhiều so với định dạng email văn bản thuần túy trước đây. [https://phabricator.wikimedia.org/T410807] * Thông báo hiện chỉ giới hạn lưu 2.000 mục lịch sử cho mỗi người dùng, điều này kéo dài trở về năm 2013 khi tính năng này mới được phát hành. Giờ nó sẽ thay đổi thành việc lưu các Thông báo trong 5 năm trở lại đây, nhưng mở rộng lên tối đa 10.000 mục. Điều này sẽ giúp bảo vệ cơ sở hạ tầng và giúp ngăn việc những thông báo xuất hiện gần đây hơn biến mất quá sớm. [https://phabricator.wikimedia.org/T383948] * [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi của bạn từ nhiều wiki khác nhau trên cùng một trang tiếp tục được cải tiến. Lần cập nhật gần đây nhất cải thiện trải nghiệm sử dụng nhãn. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] nay cho phép kích hoạt [[mw:Special:MyLanguage/Manual:Language#Fallback languages|hệ thống ngôn ngữ dự phòng]] cho các khoản mục Wikidata không có nhãn bằng ngôn ngữ được xem, đồng thời hiển thị những nhãn đó trong ngôn ngữ Wikidata yêu thích của người dùng nếu không cung cấp tham số URL <code dir=ltr>uselang=</code>. [https://phabricator.wikimedia.org/T373686][https://phabricator.wikimedia.org/T416111] * Nhóm Wikipedia dành cho Android đã bắt đầu cuộc thử nghiệm beta cho tính năng [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|tìm kiếm kết hợp]] (hybrid search) trên Wikipedia tiếng Hy Lạp. Khả năng tìm kiếm kết hợp có thể xử lý cả truy vấn ngữ nghĩa và từ khóa giúp người đọc dễ dàng tìm kiếm những gì họ muốn tìm kiếm ngay trên Wikipedia hơn. * Vì lý do bảo mật, thành viên của một vài nhóm người dùng nhất định [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|bắt buộc phải bật tính năng xác thực hai yếu tố]] (2FA). Hiện tại, 2FA bắt buộc phải được bật để sử dụng nhóm người dùng, nhưng không cần phải là để trở thành thành viên nhóm đó. Do mô hình này vẫn còn một vài lỗ hổng, tình hình này sẽ [[phab:T418580|dần dần thay đổi vào tháng 3]]. Các thành viên thuộc những nhóm người dùng đó sẽ không thể tắt phương thức 2FA cuối cùng có trên tài khoản của họ, và sẽ không thể thêm người dùng không dùng 2FA vào những nhóm này. Người dùng vẫn sẽ có thể thêm phương thức xác thực mới hoặc loại bỏ chúng, miễn là còn ít nhất một phương thức được bật. Trong khoảng nửa sau của tháng 3, những người dùng mà không có 2FA sẽ bị loại bỏ khỏi những nhóm này. Điều này áp dụng cho: Bảo quản viên Thông báo Trung ương, kiểm định viên, bảo quản viên giao diện, giám sát viên, nhân viên Wikidata, nhân viên Wikifunctions, bộ phận CNTT của Văn phòng WMF và bộ phận Tin cậy & An toàn của and WMF. Sẽ không có gì thay đổi với những người dùng khác. Xem tác vụ được liên kết để biết khung thời gian triển khai. [https://phabricator.wikimedia.org/T418580] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:27}} {{PLURAL:27|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề ngăn người dùng tạo một phiên bản trong [https://www.wikibase.cloud/ Wikibase.cloud] hiện đã được giải quyết. [https://phabricator.wikimedia.org/T416807] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Để giúp đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng cơ sở hạ tầng một cách hợp lý]], trong tháng tới Quỹ Wikimedia sẽ triển khai giới hạn truy cập API toàn cục trên tất cả các API của chúng tôi. Vào đầu tháng 3, các giới hạn nghiêm ngặt hơn sẽ được áp dụng cho các yêu cầu không xác định từ bên ngoài Toolforge/WMCS và các yêu cầu API được thực hiện từ các trình duyệt web. Vào tháng 4, những giới hạn cao hơn sẽ được áp dụng cho lưu lượng truy cập được xác định. Những giới hạn này được cố ý đặt ở mức cao nhất có thể nhằm giảm thiểu tác động đến cộng đồng. Các bot chạy trong Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào sẽ không bị ảnh hưởng vào lúc này. Tuy vậy, mọi nhà phát triển được khuyến cáo làm theo những lời khuyên thực tiễn được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn truy cập]]. * Điểm cuối Truy vấn Dữ liệu được Liên kết (LDF) của Dịch vụ Truy vấn Wikidata sẽ ngừng hoạt động vào tháng 2. Điểm cuối này phục vụ lưu lượng truy cập hạn chế, lưu lượng này đã được chuyển đổi thành công sang các phương thức truy cập dữ liệu khác phù hợp hơn để hỗ trợ các trường hợp sử dụng (use case) hiện có. Phần cứng được sử dụng để hỗ trợ điểm cuối LDF sẽ được phân bổ lại để hỗ trợ những nỗ lực chuyển đổi hệ thống backend đang diễn ra. [https://phabricator.wikimedia.org/T415696] * Trình phân tích cú pháp Parsoid mới [[mw:Special:MyLanguage/Parsoid/Parser Unification/Updates|tiếp tục được triển khai đến nhiều wiki hơn]], nhằm cải thiện tính bền vững của nền tảng và giúp việc giới thiệu các tính năng đọc và sửa đổi mới trở nên dễ dàng hơn. Parsoid nay là trình phân tích cú pháp mặc định trên 488 trang wiki của WMF (268 trang Wikipedia), hiện chiếm hơn 10% tổng số lượt xem trang Wikipedia. * Quy trình và tiêu chí để [[Special:MyLanguage/Wikimedia Enterprise#Access|yêu cầu quyền truy cập đặc biệt]] vào nguồn cấp dữ liệu khối lượng lớn của API ''Wikimedia Enterprise'' (miễn phí cho các trường hợp sử dụng phù hợp với nhiệm vụ), [[m:Talk:Wikimedia Enterprise#Exceptional access criteria|hiện đã được công bố]]. Điều này nhằm cung cấp tài liệu đầy đủ và rõ ràng hơn cho người dùng. * [https://techblog.wikimedia.org/ Blog Kỹ thuật], một blog dành riêng cho cộng đồng kỹ thuật Wikimedia [https://techblog.wikimedia.org/2026/02/24/a-tech-blog-diff/ sẽ được chuyển] sang [[diffblog:|Diff]], blog tin tức và sự kiện cộng đồng. Việc chuyển đổi dự kiến sẽ được hoàn thành vào tháng 4 năm 2026, sau thời điểm này các bài viết mới sẽ được chấp nhận xuất bản. Người đọc sẽ có thể truy cập các bài đăng – cả bài cũ và mới – trên trang đích này tại https://diff.wikimedia.org/techblog. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.18|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/10|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W10"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:51, ngày 2 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30137798 --> == Bản tin Kỹ thuật: Tuần 11-2026 == <section begin="technews-2026-W11"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/11|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[m:Special:MyLanguage/Tech/Server switch|Tất cả các wiki sẽ chuyển sang chế độ chỉ đọc trong vòng vài phút]] vào thứ 4, ngày 25 tháng 3 năm 2026 lúc [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. Điều này là nhằm phục vụ cho việc thử nghiệm chuyển đổi máy chủ cơ sở dữ liệu dự phòng, [[wikitech:Deployments/Yearly calendar|diễn ra hai lần trong một năm]]. Trong quá trình chuyển đổi này, toàn bộ lưu lượng trên các trang web của Wikimedia được chuyển từ trung tâm dữ liệu chính sang trung tâm dữ liệu dự phòng nhằm kiểm tra tính khả dụng và ngăn ngừa việc gián đoạn dịch vụ ngay cả trong những trường hợp khẩn cấp. * Tuần trước, tất cả các wiki đều bị giới hạn ở chế độ chỉ đọc trong vòng 2 giờ đồng hồ, cùng với đó các đoạn mã người dùng và tiện ích cũng không khả dụng trong thời gian được kéo dài. Điều này là do một sự cố bảo mật mà đã được khắc phục sau đó. Chúng tôi đang tiếp tục cố gắng để ngăn điều này tái diễn. Để cập nhật thông tin vui lòng xem [[m:Steward's noticeboard#Statement on Meta about today's user script security incident|bài đăng trên bảng tin của Nhân viên]] ([[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Product Safety and Integrity/March 2026 User Script Incident|bản dịch]]). '''Cập nhật cho biên tập viên''' * Người dùng đang gặp phải nhiều lệnh cấm trên thiết bị di động nay sẽ thấy lý do cấm cho từng lần cấm riêng thay vì một thông báo chung chung. Điều này giúp họ hiểu tại sao mình bị cấm và cần thực hiện những bước nào để giải quyết vấn đề. Ví dụ, người dùng bị ảnh hưởng do sử dụng VPN phổ biến (chẳng hạn như [[Special:MyLanguage/Apple iCloud Private Relay|iCloud Private Relay]]) sẽ nhận được hướng dẫn rõ ràng hơn những việc cần làm để bắt đầu lại việc sửa đổi. [https://phabricator.wikimedia.org/T357118] * Cuối tuần này, [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Chế độ Đề xuất]] sẽ được cung cấp dưới dạng tính năng beta trong trình soạn thảo trực quan trên tất cả các trang Wikipedia. Tính năng này chủ động đề xuất nhiều loại hành động mà người dùng có thể cân nhắc thực hiện để cải thiện các bài viết trên Wikipedia, đồng thời tìm hiểu về các hướng dẫn có liên quan. Tính năng này có thể được cấu hình cục bộ và cũng có thể được mở rộng cục bộ với bằng việc tùy chỉnh Đề xuất. Cài đặt hiện tại có thể xem được tại trang [[Special:EditChecks]] và có [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators %E2%80%93 local customization|hướng dẫn cách bảo quản viên có thể tùy chỉnh]] các liên kết để chỉ tới những trang hướng dẫn cục bộ. Tính năng này được kết nối với tính năng [[mw:Special:MyLanguage/Help:Edit check|Kiểm tra sửa đổi]], một tính năng đưa ra đề xuất cải thiện trong khi người nào đó viết nội dung mới. Trong tương lai, nhóm Sửa đổi dự kiến đánh giá tác động của tính năng này đối với người dùng mới thông qua một thử nghiệm có kiểm soát. [https://phabricator.wikimedia.org/T404600] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố liên quan đến việc con trỏ bị lệch khi sử dụng tính năng tô sáng cú pháp của CodeMirror, một tính năng giúp mã wiki (wikitext) và mã code dễ đọc hơn, nay đã được giải quyết. Vấn đề này đặc biệt ảnh hưởng đến những người dùng đã định nghĩa quy tắc phông chữ trong stylesheet tùy chỉnh khi tạo chủ đề mới bằng Công cụ Thảo luận. [https://phabricator.wikimedia.org/T418793] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Cập nhật về giới hạn truy vấn API: Để giúp đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng hợp lý cơ sở hạ tầng]], giới hạn truy vấn API toàn cục sẽ được áp dụng trong tuần này cho các yêu cầu không có User-Agent hợp lệ bắt nguồn từ bên ngoài Toolforge/WMCS cùng các yêu cầu chưa được xác thực được thực hiện từ trình duyệt web. Trong tháng 4 tới sẽ thiết lập giới hạn cao hơn cho lưu lượng truy cập được xác định. Các bot chạy trên Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào hiện sẽ không bị ảnh hưởng vì điều này. Tuy vậy, mọi nhà phát triển được khuyến cáo nên tuân theo những hướng dẫn thực tiễn tốt nhất được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn truy vấn]]. * API GraphQL mới đã được phát hành. API này được phát triển như một giải pháp thay thế linh hoạt cho một số tính năng nhất định của Dịch vụ Truy vấn Wikidata (WDQS), nhằm cải thiện trải nghiệm và khả năng thích ứng của nhà phát triển, đồng thời giúp truy cập dữ liệu hiệu quả. Hãy dùng thử và [[d:Wikidata:Wikibase GraphQL#Feedback and development|gửi phản hồi]] của mình. Bạn cũng có thể [https://greatquestion.co/wikimediadeutschland/GraphQLAPI/apply đăng ký tham gia các bài kiểm tra về khả năng sẵn dùng]. * Vào tháng 2 [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|Nhóm Làm việc cho Công cụ Không được Hỗ trợ PTAC]] đã tiếp tục cải tiến [[commons:Special:MyLanguage/Commons:Video2commons#|Video2Commons]], trong đó sửa các lỗi liên quan đến lỗi xác thực, xử lý tệp lớn, khả năng hiển thị hàng đợi tác vụ và làm rõ hơn hành vi tải lên. Hiện một số lĩnh vực vẫn đang được tiến hành thực hiện, trong đó có những thay đổi liên quan đến việc tải lên từ phía máy chủ đã lỗi thời. Hãy đọc [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group#February 2026|phần cập nhật này]] để tìm hiểu thêm. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.19|MediaWiki]] '''Chuyên sâu''' * Nhóm Hướng dẫn Bài viết mời các biên tập viên Wikipedia có kinh nghiệm từ một số [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators#Collaborators|wiki thí điểm]] được chọn cùng những người đóng góp có quan tâm từ các trang Wikipedia khác điền vào bảng câu hỏi này, có sẵn bằng [https://docs.google.com/forms/d/e/1FAIpQLSfmLeVWnxmsCbPoI_UF2jyRcn73WRGWCVPHzerXb4Cz97X_Ag/viewform tiếng Anh], [https://docs.google.com/forms/d/e/1FAIpQLSd6rzr4XXQw8r4024fE3geTPFe13M_6w7Mitj-YJi0sOlWTAw/viewform?usp=header tiếng Ả Rập], [https://docs.google.com/forms/d/e/1FAIpQLSdok3-RfB18lcugYTUMGkpwmqG_8p760Wv4dCXitOXOszjUDw/viewform?usp=header tiếng Bengali], [https://docs.google.com/forms/d/e/1FAIpQLSfjTfYp4jEo0akA4B1e-Nfg3QZPCudUjhJzHzzDi6AHyAaMGA/viewform?usp=header tiếng Nhật], [https://docs.google.com/forms/d/e/1FAIpQLScteVoI29Aue4xc72dekk-6RYtvmMgQxzMI900UOawrFrSTWg/viewform?usp=header tiếng Bồ Đào Nha], [https://docs.google.com/forms/d/e/1FAIpQLSetdxnYwL3ub2vqA7awCg5hJZPMIYcDPaiTe12rY9h0GYnVlw/viewform?usp=header tiếng Ba Tư] và [https://docs.google.com/forms/d/e/1FAIpQLScNvfJF-Ot-4pzA4qAN771_0QDJ4Li19YcUsaTgSKW8Nc7U_Q/viewform?usp=header tiếng Thổ Nhĩ Kỳ]. Phản hồi của bạn sẽ giúp nhóm tùy chỉnh hướng dẫn cho các biên tập viên ít kinh nghiệm hơn và giúp họ tìm hiểu các chính sách và thực tiễn của cộng đồng khi tạo bài viết. Tìm hiểu thêm [[mw:Special:MyLanguage/Article guidance|trên trang dự án]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/11|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W11"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:53, ngày 9 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30213008 --> == Bản tin Kỹ thuật: Tuần 12-2026 == <section begin="technews-2026-W12"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/12|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], còn được biết đến với tên [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], được sử dụng để tô sáng cú pháp mã wiki kể từ tháng 11 năm 2024. Tính năng này sẽ chính thức kết thúc giai đoạn thử nghiệm beta vào tháng 5 năm 2026 nhằm đưa những cải tiến và [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Features|tính năng]] mới cho tất cả biên tập viên sử dụng trình tô sáng cú pháp tiêu chuẩn. Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào về việc kết thúc giai đoạn thử nghiệm beta cho tính năng này, [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|vui lòng chia sẻ với chúng tôi]]. [https://phabricator.wikimedia.org/T259059] * Một số thay đổi đối với quyền nhóm người dùng cục bộ được tiếp viên trên Meta-Wiki thực hiện và nhật trình về những thay đổi này chỉ được ghi lại trên đó. Giờ đây, thay đổi về quyền liên wiki sẽ được ghi lại trên cả Meta-Wiki và wiki của người dùng mục tiêu để giúp dễ dàng truy cập vào toàn bộ bản ghi thay đổi quyền người dùng trên wiki cục bộ hơn. Những mục nhật trình trước đây về những thay đổi này sẽ được cập nhật trong những tuần tiếp theo. [https://phabricator.wikimedia.org/T6055] * Trên các wiki sử dụng [[m:Special:MyLanguage/Flagged Revisions|Thay đổi Được gắn cờ (Flagged Revisions)]], số lượng thay đổi đang chờ được hiển thị trên [[{{#Special:PendingChanges}}]] trước đây tính cả những trang mà không còn ở trong trạng thái đang chờ xem xét, do chúng đã bị xóa khỏi hệ thống mà không được xem xét lại, v.d. do bị xóa, được di chuyển sang không gian tên khác, hoặc do thay đổi cấu hình wiki. Bộ đếm giờ sẽ được hiển thị chính xác. Trên một số wiki số lượng thay đổi được hiển thị sẽ nhỏ hơn nhiều so với trước đây. Bản thân danh sách các trang sẽ không có thay đổi gì. [https://phabricator.wikimedia.org/T413016] * Ngôn ngữ soạn thảo của Wikifunctions đã được viết lại, tạo ra một phiên bản mới của ngôn ngữ này. Thay đổi này nhằm mục đích tăng cường tính ổn định của dịch vụ bằng cách giảm mức tiêu thụ bộ nhớ của trình điều phối. Việc viết lại này cũng giúp cho phép giảm đáng kể độ trễ, đơn giản hóa mã nguồn và tạo ra các lớp trừu tượng tốt hơn, nhằm mở ra cơ hội bổ sung thêm các tính năng khác trong tương lai. Đọc thêm về [[f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-11|các thay đổi này]]. * Người dùng nay có thể sắp xếp kết quả tìm kiếm theo thứ tự bảng chữ cái dựa trên tiêu đề trang. Lần cập nhật này cung cấp thêm một tùy chọn giúp cho việc tìm kiếm trang trở nên dễ dàng và nhanh chóng hơn. Trước đây, kết quả có thể được sắp xếp theo Ngày sửa đổi, Ngày tạo, hoặc Mức độ liên quan. Để sử dụng tùy chọn mới này, hãy mở 'Tìm kiếm nâng cao' trên trang kết quả tìm kiếm và chọn 'Thứ tự bảng chữ cái' trong mục 'Thứ tự sắp xếp'. [https://phabricator.wikimedia.org/T403775] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:28}} {{PLURAL:28|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho Trình tải lên tập tin (UploadWizard) trên Wikimedia Commons không thể nhập tập tin từ Flickr nay đã được giải quyết. [https://phabricator.wikimedia.org/T419263] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Một trang đặc biệt mới, [[{{#special:LintTemplateErrors}}]], đã được tạo ra để liệt kê các trang nhúng được đánh dấu là chứa lỗi lint để giúp người dùng dễ dàng phát hiện chúng hơn. Danh sách được sắp xếp theo số lượng các trang được nhúng mà có lỗi. Ví dụ: [[{{#special:LintTemplateErrors}}/night-mode-unaware-background-color]]. [https://phabricator.wikimedia.org/T170874] * Người dùng tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] hiện đang sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] để tô sáng cú pháp khi sửa đổi các trang nội dung JavaScript, CSS, JSON, Vue và Lua, trong một khoảng thời gian. Cùng với việc kết thúc thử nghiệm beta cho CodeMirror 6, kế hoạch là thay thế CodeEditor để trở thành trình soạn thảo tiêu chuẩn cho những kiểu nội dung này vào tháng 5 năm 2026. [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|Mọi phản hồi hoặc ý kiến đóng góp đều được hoan nghênh]]. [https://phabricator.wikimedia.org/T419332] * Các mô đun JavaScript cho [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] JavaScript sẽ sớm được nâng cấp lên CodeMirror 6. Trước thời điểm nâng cấp này, việc tải các mô đun <code dir=ltr>ext.CodeMirror</code> hoặc <code dir=ltr>ext.CodeMirror.lib</code> từ các tiện ích và đoạn mã người dùng đã bị loại bỏ vào tháng 7 năm 2025. Việc sử dụng hook <code dir=ltr>ext.CodeMirror.switch</code> cũng đã bị loại bỏ vào tháng 3 năm 2025. Những người đóng góp nay có thể làm cho các đoạn mã hoặc tiện ích của mình tương thích với CodeMirror 6. Xem [[mw:Special:MyLanguage/Extension:CodeMirror#Gadgets and user scripts|hướng dẫn chuyển đổi]] để biết thêm thông tin. [https://phabricator.wikimedia.org/T373720] * Nhóm Giao diện MediaWiki đang mở rộng phạm vi định nghĩa mô đun API REST để bao gồm cả [[mw:Special:MyLanguage/API:REST API/Extensions|các API mở rộng]]. Mô đun API REST là nhóm các điểm cuối có liên quan mà có thể được quản lý và đánh phiên bản độc lập. Hiện đã có các mô đun cho API [https://phabricator.wikimedia.org/T414470 GrowthExperiments] và [https://phabricator.wikimedia.org/T419053 Wikifunctions]. Khi chúng tôi chuyển đổi các API mở rộng sang cấu trúc này, tài liệu sẽ được chuyển ra khỏi phần đặc tả chính cho OpenAPI của MediaWiki cùng chế độ xem REST Sandbox, và thay vào đó sẽ có thể truy cập được thông qua tùy chọn dành riêng cho mô đun trong menu thả xuống trên [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox] (nghĩa là, [[{{#Special:RestSandbox}}]], có sẵn trên tất cả các dự án wiki). * Phần mở rộng [[mw:Special:MyLanguage/Extension:Scribunto|Scribunto]] cung cấp nhiều thông tin khác nhau về wiki nơi mô đun đang được sử dụng thông qua thư viện [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual|mw.site]]. Kể từ tuần trước, thư viện này cũng cung cấp một [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#mw.site.wikiId|cách]] truy cập [[mw:Special:MyLanguage/Manual:Wiki ID|ID của wiki]] có thể được sử dụng để hỗ trợ bảo trì mô đun liên wiki. [https://phabricator.wikimedia.org/T146616] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.20|MediaWiki]] '''Chuyên sâu''' * [[m:Special:MyLanguage/Coolest Tool Award|Giải thưởng Công cụ Tuyệt vời nhất năm 2026]] nhằm tôn vinh những công cụ xuất sắc do cộng đồng tạo ra, nay đã mở nhận đề cử! Hãy đề cử công cụ yêu thích của bạn bằng cách sử dụng biểu mẫu [https://wikimediafoundation.limesurvey.net/435684?lang=en khảo sát đề cử] trước ngày 23 tháng 3 năm 2026. Để biết thêm thông tin về quyền riêng tư và xử lý dữ liệu, vui lòng xem [[foundation:Special:MyLanguage/Legal:Coolest_Tool_Award_2026_Survey_Privacy_Statement|tuyên bố về quyền riêng tư của khảo sát]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/12|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W12"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:35, ngày 16 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30260505 --> == Bản tin Kỹ thuật: Tuần 13-2026 == <section begin="technews-2026-W13"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/13|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Người dùng các trang Wikimedia nay có thể đăng nhập mà không cần mật khẩu bằng cách sử dụng khóa truy cập (passkey). Đây là một phương thức bảo mật sử dụng vân tay, nhận diện khuôn mặt hoặc mã PIN. Với thay đổi này, tất cả người dùng chọn đăng nhập không cần mật khẩu sẽ có thể đăng nhập vào tài khoản của mình một cách dễ dàng, nhanh chóng và an toàn hơn trên mọi thiết bị. Tùy chọn đăng nhập mới bằng khóa truy cập hiện hiển thị dưới dạng gợi ý tự động điền trong trường tên người dùng. [[phab:T417120|Nút "Đăng nhập bằng khóa truy cập"]] bổ sung sẽ sớm được cung cấp cho những người dùng đã bật tùy chọn sử dụng khóa truy cập. Lần cập nhật này sẽ cải thiện bảo mật cũng như trải nghiệm người dùng. [[c:File:Passwordless_login_screencast.webm|Bản ghi lại màn hình]] này sẽ minh họa từng bước quy trình đăng nhập không cần mật khẩu. * [[m:Special:MyLanguage/Tech/Server switch|Tất cả các wiki sẽ chuyển sang chế độ chỉ đọc trong vòng vài phút]] vào thứ 4, ngày 25 tháng 3 năm 2026 lúc [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. Điều này là nhằm phục vụ cho việc thử nghiệm chuyển đổi máy chủ cơ sở dữ liệu dự phòng, [[wikitech:Deployments/Yearly calendar|diễn ra hai lần trong một năm]]. Trong quá trình chuyển đổi này, toàn bộ lưu lượng trên các trang web của Wikimedia được chuyển từ trung tâm dữ liệu chính sang trung tâm dữ liệu dự phòng nhằm kiểm tra tính khả dụng và ngăn ngừa việc gián đoạn dịch vụ ngay cả trong những trường hợp khẩn cấp. '''Cập nhật cho biên tập viên''' * Người dùng các trang web của Wikimedia nay có thể xuất các thông báo cách đây hơn 5 năm của mình bằng cách sử dụng [[toolforge:echo-chamber|công cụ Toolforge mới]]. Điều này sẽ đảm bảo rằng người dùng có thể giữ lại được những thông báo quan trọng và tránh bị mất chúng do việc thay đổi theo kế hoạch nhằm xóa đi các thông báo cũ hơn 5 năm, như đã thông báo trước đó. [https://phabricator.wikimedia.org/T383948] * Các biên tập viên Wikipedia tiếng Indonesia, tiếng Thái, tiếng Thổ Nhĩ Kỳ, và tiếng Anh Đơn giản nay có thể truy cập vào Đặc biệt:Bảng điều khiển cá nhân. Đây là [[mw:Special:MyLanguage/Moderator Tools/Dashboard|phiên bản trải nghiệm sớm]] giúp các biên tập viên mới làm quen với quy trình tuần tra, giúp họ dễ dàng chuyển từ việc sửa đổi sang tham gia vào những công việc kiểm duyệt nâng cao hơn trên dự án của mình. [https://phabricator.wikimedia.org/T402647] * Trang [[vi:Special:Block|Đặc_biệt:Cấm]] nay có hai thay đổi nhỏ về mặt giao diện. Bảo quản viên nay có thể dễ dàng thực hiện lệnh cấm vô hạn thông qua nút chọn (nút radio) chuyên dụng trong mục thời hạn. Ngoài ra, việc chọn thời hạn là vô hạn sẽ cung cấp một bộ lý do phổ biến khác để lựa chọn, nó có thể được thay đổi tại: [[MediaWiki:Ipbreason-indef-dropdown]]. [https://phabricator.wikimedia.org/T401823] * Biên tập viên sử dụng thiết bị di động [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#Logged-out|tại một số wiki]] nay có thể nhìn thấy cải tiến về cảnh báo sửa đổi khi chưa đăng nhập, điều này là nhờ cập nhật gần đây từ nhóm Phát triển. Những thay đổi được phát hành vào tuần trước này là một phần trong những nỗ lực và thử nghiệm đang được thực hiện nhằm nâng cao [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|trải nghiệm trong việc tạo tài khoản trên thiết bị di động]] và từ đó giúp tăng cường sự tham gia của họ. [https://phabricator.wikimedia.org/T408484] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:36}} {{PLURAL:36|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến người dùng web trên thiết bị di động không thể nhìn thấy thông tin cấm khi có nhiều lệnh cấm đồng thời được áp dụng đã được giải quyết. Họ giờ có thể xem được tin nhắn cho tất cả các lệnh cấm hiện đang được áp dụng cho họ khi họ truy cập Wikipedia. '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Những image (ảnh) được dựng bằng Toolforge sẽ sớm được nâng cấp lên phiên bản buildpack mới, mang đến việc hỗ trợ các phiên bản ngôn ngữ mới hơn cùng những cải tiến và sửa lỗi khác tại thượng nguồn. Nếu bạn sử dụng Dịch vụ Dựng của Toolforge, hãy xem lại [https://lists.wikimedia.org/hyperkitty/list/cloud-announce@lists.wikimedia.org/thread/EMYTA32EV2V5SQ2JIEOD2CL66YFIZEKV/ email cloud-announce] gần đây và cập nhật cấu hình bản dựng của bạn nếu cần để đảm bảo các công cụ của bạn tương thích với phiên bản mới này. [https://wikitech.wikimedia.org/w/index.php?title=Help:Toolforge/Building_container_images&oldid=2392097#Buildpack_environment_upgrade_process][https://phabricator.wikimedia.org/T380127] * Wiki tài liệu [https://api.wikimedia.org/wiki/Main_Page Cổng API] sẽ ngừng hoạt động vào tháng 6 năm 2026. Các khóa API được tạo trên Cổng API sẽ tiếp tục hoạt động bình thường. Các điểm cuối của api.wikimedia.org sẽ dần bị loại bỏ bắt đầu từ tháng 7 năm 2026. Tài liệu trên Cổng API đang được chuyển sang [[mw:Wikimedia APIs|mediawiki.org]]. Tìm hiểu thêm trên [[wikitech:API Portal/Deprecation|trang dự án]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.21|MediaWiki]] '''Chuyên sâu''' * [[m:Special:MyLanguage/WMDE Technical Wishes|Nhóm Mong muốn – Kỹ thuật của WMDE]] đang xem xét cải tiến [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|tên chú thích được tạo tự động trong Trình Soạn thảo Trực quan (VisualEditor)]]. Vui lòng xem qua [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names#Proposed solutions|những giải pháp được đề xuất]] và tham gia vào [[m:Talk:WMDE Technical Wishes/References/VisualEditor automatic reference names#Request for comment|thảo luận này]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/13|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W13"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:51, ngày 23 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30268305 --> == Bản tin Kỹ thuật: Tuần 14-2026 == <section begin="technews-2026-W14"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/14|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Phiên bản Beta của [[abstract:|Abstract Wikipedia]] một dự án Wikimedia mới không phụ thuộc ngôn ngữ, đã được khởi động vào tuần trước. Dự án cho phép các cộng đồng xây dựng các bài viết Wikipedia bằng ngôn ngữ mẹ đẻ của họ, và các thành viên khác có thể dễ dàng truy cập các bài viết đó bằng ngôn ngữ của riêng họ. Wiki này hoạt động dựa trên chỉ dẫn từ Wikifunctions và cũng dựa trên nội dung có cấu trúc từ Wikidata. [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-26|Đọc thêm]]. '''Cập nhật cho biên tập viên''' * Nhóm Phát triển đang tiến hành thử nghiệm A/B để đánh giá cho một thông điệp rõ ràng hơn, thân thiện hơn với người dùng nhằm khuyến khích việc tạo tài khoản trên wiki. Hiện tại, khi người dùng di động chưa đăng nhập bắt đầu sửa đổi, họ sẽ thấy một thông báo cảnh báo khó chịu, có thể khiến cho họ có cảm giác đột ngột và nản lòng. Điều này cũng làm cho việc sửa đổi bằng tài khoản tạm thời trở thành mặc định thay vì khuyến khích việc tạo tài khoản. Thử nghiệm đang được thực hiện trên mười trang Wikipedia, bao gồm tiếng Ả Rập, tiếng Pháp, tiếng Tây Ban Nha và tiếng Đức. [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#2. Improve logged-out warning message (T415160)|Đọc thêm]]. * Nhóm Ứng dụng Wikimedia đang mời mọi người đóng góp ý kiến về [[mw:Special:MyLanguage/Wikimedia Apps/Team/Future of Editing on the Mobile Apps|việc sửa đổi trên ứng dụng Wikipedia dành cho thiết bị di động nên hoạt động như thế nào]]. Thảo luận tập trung vào việc cải thiện cách người dùng truy cập công cụ sửa đổi khi họ nhấn vào nút "Sửa đổi". Đây là một phần trong nỗ lực rộng lớn hơn nhằm chuyển đổi những người đọc mà có hứng thú với việc sửa đổi sang một con đường thân thiện hơn với người dùng để có thể bắt đầu đóng góp. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:45}} {{PLURAL:45|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố khiến việc lấy chú thích từ kho lưu trữ báo chí lớn [https://www.newspapers.com Newspapers.com] không còn hoạt động, do bị chặn trong các yêu cầu của [[mw:Special:MyLanguage/Citoid|Citoid]], nay đã được khắc phục. [https://phabricator.wikimedia.org/T419903] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.22|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/14|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W14"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:25, ngày 30 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30329462 --> == 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 [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 17:11, ngày 3 tháng 4 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:ZI Jony@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252 --> == Bản tin Kỹ thuật: Tuần 15-2026 == <section begin="technews-2026-W15"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/15|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|Phần mở rộng CampaignEvents]] nay có thêm tính năng mới nhằm thiết lập mục tiêu nhóm, nhằm cho phép những người tổ chức thiết lập và theo dõi mục tiêu sự kiện chẳng hạn như số lượng bài viết được tạo và số lượng người tham gia đóng góp theo thời gian thực. Tương tự, những người tham gia có thể cùng nhau hướng tới các mục tiêu chung và chứng kiến ​​tác động tập thể của họ khi sự kiện diễn ra. Tính năng này hiện đã có trên tất cả các wiki của Wikimedia. Tìm hiểu thêm trong [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Collaborative contributions#Goal setting|trang tài liệu này]]. * [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Mục Mong muốn cộng đồng]] Tính năng [[mw:Special:MyLanguage/Help:Watchlist labels|gán nhãn danh sách theo dõi]] mới (được công bố trong [[m:Special:MyLanguage/Tech/News/2026/07|Bản tin Kỹ thuật 2026-07]]) nay có sẵn thông qua Trình Soạn thảo Trực quan, trình soạn thảo mã nguồn, và biểu tượng 'sao theo dõi' (hoặc liên kết theo dõi, đối với các giao diện không có biểu tượng hình sao). Trước đây việc gán nhãn như vậy chỉ có thể thực hiện được thông qua [[Special:EditWatchlist|EditWatchlist]]. Ở cả ba nơi đó, đây đều sẽ là trường mới ngay sau sau trường thời điểm hết hạn theo dõi. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà trang thảo luận trên thiết bị di động dùng Parsoid không thể sử dụng được sau đề mục không có tiêu đề, nay đã được giải quyết. [https://phabricator.wikimedia.org/T419171] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Tính năng chú thích phụ]], một tính năng cho phép biên tập viên thêm thông tin chi tiết vào nguồn tham khảo hiện có mà không cần nhân bản nó, sẽ được triển khai dần dần tới [[phab:T414094|nhiều trang wiki hơn]] vào cuối năm nay. Các wiki sử dụng tiện ích [[mw:Special:MyLanguage/Reference Tooltips|Chú thích nổi]] được khuyến khích cập nhật phiên bản của mình (thường là tại [[m:MediaWiki:Gadget-ReferenceTooltips.js|MediaWiki:Gadget-ReferenceTooltips.js]] như được hiển thị tại [https://en.wikipedia.org/w/index.php?diff=1344408362 đây]) để đảm bảo khả năng tương thích. Các tiện ích khác liên quan đến nguồn tham khảo khác cũng có thể bị ảnh hưởng. [https://phabricator.wikimedia.org/T416304] * Tất cả các phiên bản của Wikinews sẽ bị đóng và chuyển sang chế độ chỉ đọc vào ngày 4 tháng 5 năm 2026. Mọi nội dung vẫn sẽ có thể truy cập được, nhưng sẽ không thể thêm bất kỳ sửa đổi hoặc bài viết mới nào. Việc đóng này đã được Hội đồng Quản trị của Quỹ Wikimedia phê duyệt sau những cuộc thảo luận kéo dài. [[m:Wikimedia Foundation Board noticeboard#Board of Trustees Approves Closure of Wikinews|Đọc thêm]]. * [[:mw:Special:MyLanguage/API:Action API|API Tác vụ]] có một số kiểu định dạng đầu ra được yêu cầu. Một trong số chúng, <bdi lang="zxx" dir="ltr"><code><nowiki>format=php</nowiki></code></bdi>, sẽ sớm bị loại bỏ. Vui lòng đảm bảo rằng các tập lệnh hoặc bot của bạn sử dụng [[mw:Special:MyLanguage/API:Data formats#Output|kiểu định dạng JSON]]. Việc loại bỏ này sẽ chỉ ảnh hưởng đến một số lượng rất nhỏ các tập lệnh người dùng và bot. [https://phabricator.wikimedia.org/T118538] * Trang [[Special:NamespaceInfo|Đặc biệt:NamespaceInfo]] nay có chứa phần viết tắt không gian tên. Ví dụ "WP" cho không gian tên "Project" ("Wikipedia") trên Wikipedia tiếng Đức. [https://phabricator.wikimedia.org/T381455] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.23|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/15|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W15"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:19, ngày 6 tháng 4 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30362761 --> == Bản tin Kỹ thuật: Tuần 16-2026 == <section begin="technews-2026-W16"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/16|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Các biên tập viên có kinh nghiệm được mời tham gia [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Main_Page thử nghiệm] tính năng [[mw:Special:MyLanguage/Article guidance|Hướng dẫn bài viết]], được thiết kế để giúp các biên tập viên ít kinh nghiệm hơn tạo ra các bài viết Wikipedia có cấu trúc tốt và phù hợp với quy định. Hướng dẫn thử nghiệm [[mw:Special:MyLanguage/Article guidance/Test feature guide|có sẵn tại đây]]. Ngoài ra, sau khi xem xét [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance bản tóm tắt này], vui lòng cung cấp phản hồi trên [[mw:Talk:Article guidance|trang thảo luận của dự án]]. Dựa trên ý kiến đóng góp của bạn, tính năng này sẽ được tinh chỉnh và chuyển giao cho các trang Wikipedia thí điểm để biên dịch và điều chỉnh cho thích hợp. Hãy xem qua [[c:File:Article Guidance workflow demo - April 2026.webm|video]] giải thích về tính năng này. '''Cập nhật cho biên tập viên''' * Trên hầu hết các trang wiki, tất cả thành viên tự xác nhận nay có thể sử dụng trang [[Special:ChangeContentModel|Đặc biệt:ChangeContentModel]] để [[mw:Special:MyLanguage/Help:ChangeContentModel|tạo trang mới với kiểu nội dung tùy chỉnh]], chẳng hạn như danh sách gửi thông báo rộng rãi, giúp cho định dạng trang tùy chỉnh trở nên dễ tiếp cận hơn. Kiểm tra [[Special:ListGroupRights|Đặc biệt:Quyền nhóm người dùng]] để biết trạng thái trên wiki của bạn. [https://phabricator.wikimedia.org/T248294] * Nhóm Phát triển đã khởi động một [[mw:Special:MyLanguage/Contributors/Account_Creation_Experiments|thử nghiệm tạo tài khoản]] để đánh giá xem việc thêm nút tạo tài khoản vào phần đầu trang web trên thiết bị di động có làm tăng số lượng người đăng ký tài khoản mới và khuyến khích nhiều người dùng thiết bị di động đóng góp vào wiki hay không. Thử nghiệm hiện đang được thực hiện trên Wikipedia tiếng Hindi, tiếng Indonesia, tiếng Bengali, tiếng Thái và tiếng Do Thái, và nhắm mục tiêu vào 10% người dùng web trên di động chưa đăng nhập. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:30}} {{PLURAL:30|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố có thể khiến Trình Soạn thảo Trực quan bị kẹt khi tải trên các thiết bị Windows đã tắt hiệu ứng hoạt ảnh, nay đã được giải quyết. [https://phabricator.wikimedia.org/T382856] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Kể từ cuối tuần này, {{int:group-abusefilter}} đã bật tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] sẽ sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] làm trình soạn thảo tại [[Special:AbuseFilter|Đặc biệt:Bộ lọc sai phạm]]. Đây là một phần trong nỗ lực rộng lớn hơn nhằm mang lại trải nghiệm người dùng nhất quán hơn trên tất cả các trình soạn thảo. [https://phabricator.wikimedia.org/T399673][https://phabricator.wikimedia.org/T419332] * Các công cụ và bot truy cập vào [[mw:Special:MyLanguage/Notifications/API|API Thông báo]] (<bdi lang="zxx" dir="ltr"><code><nowiki>action=query&meta=notifications</nowiki></code></bdi>) sẽ cần phải cập nhật quyền OAuth hoặc BotPassword của mình để bao gồm cả quyền truy cập vào các thông báo riêng tư. [https://phabricator.wikimedia.org/T421991] * Do việc nâng cấp thư viện, việc liệt kê danh sách trên các trang thể loại có thể hiển thị không đúng theo thứ tự bắt đầu từ thứ Hai, ngày 20 tháng 4. Một kịch bản chuyển đổi sẽ được chạy để khắc phục điều này, và sẽ mất từ ​​vài giờ đến vài ngày tùy thuộc vào kích thước của wiki (tối đa một tuần đối với Wikipedia tiếng Anh). [https://phabricator.wikimedia.org/T422544] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.24|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/16|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W16"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:19, ngày 13 tháng 4 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30380527 --> pgpgcv56uvbrw0hbrpfdoz0qmwmaui0 jul 0 172160 2345130 2075883 2026-04-14T03:20:05Z Hiyuune 50834 2345130 wikitext text/x-wiki {{also|Jul|JUL|júl|Jul.|júl.}} {{also|Jul|JUL|júl|jul.|Jul.|júl.|jūl.}} =={{langname|mul}}== ==={{section|symbol}}=== {{mul-symbol}} # {{ISO 639|3}} =={{langname|vo}}== ==={{section|etym}}=== Được vay mượn {{bor|vo|de|Schule}}. ==={{section|pron}}=== * {{IPA4|vo|/ʃul/}} ==={{section|n}}=== {{vo-noun}} # [[trường học|Trường học]]. ===={{section|decl}}==== {{vo-decl-noun}} ===={{section|hypo}}==== * {{l|vo|pöpajul}} ===={{section|drv}}==== * {{l|vo|julan}} ==={{section|further}}=== * {{R:vo:Vödabuk}} {{C|vo|Trường học}} eddhsbhplou1hioy55r27uca9momxg9 gia cầm 0 191097 2345083 2197710 2026-04-14T01:21:39Z Hiyuune 50834 2345083 wikitext text/x-wiki =={{langname|vi}}== {{wp}} ==={{section|pron}}=== {{vi-pron}} ==={{section|noun}}=== {{vi-noun}} # [[loài|Loài]] [[chim]] [[nuôi]] trong [[nhà]] như [[gà]], [[vịt]], [[ngan]], [[ngỗng]], [[chim]] [[câu]], v.v. #:{{ux|vi|Cần chống dịch cho '''gia cầm'''.}} ==={{section|ref}}=== * {{R:FVDP}} {{C|vi|Gia cầm}} nyu4nk84hysstbqball81111l7mcyz4 khóc mướn 0 193224 2344987 2062760 2026-04-13T14:01:37Z Hiyuune 50834 2344987 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # [[khóc|Khóc]] [[người dưng]] để [[lấy]] [[tiền]] trong [[những]] đám [[ma]] [[nhà giàu]] [[ngày trước]]. #: {{ux|vi|'''Khóc mướn''' đám ma.}} ==={{section|ref}}=== * {{R:FVDP}} cg1sxaetz48rx2xr7gfqhi1ejnlvm56 khi dễ 0 198772 2344990 2083588 2026-04-13T14:03:09Z Hiyuune 50834 2344990 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # Cách dùng sai phổ biến của'' '''[[khinh dể]]''' ''hay'' '''[[khi dể]]'''. 7as0tjidyqp05oux3yfd3ennpvnqqev tác nhiệm 0 200389 2344991 1329462 2026-04-13T14:03:45Z Hiyuune 50834 2344991 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # {{lb|vi|nội động từ}} [[thi hành|Thi hành]] [[chức năng]] của một [[người]]; [[thực hiện]] một [[công việc]], [[bổn phận]] bằng cách sử dụng khả năng hay chức năng của mình. ===={{section|usage}}==== Đối với [[đối tượng]] không phải là [[tự thân]] thì dùng [[ngoại động từ]] [[vận hành]] thay thế. ic54008i0kj5pnyfbhccida792ybpcl lao tác 0 200463 2344989 1329535 2026-04-13T14:02:47Z Hiyuune 50834 2344989 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # [[lao động|Lao động]] trong một [[quá trình]] lâu dài, [[nhẫn nại]] để đạt đến một kết quả mong đợi. #: {{ux|vi|Người nông dân '''lao tác''' trên thửa ruộng của mình.}} s875o0kxz6m1fxnjj8b3mhgqv1vjbau đóng phim 0 214036 2344992 1329632 2026-04-13T14:04:03Z Hiyuune 50834 2344992 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # Có [[vai trò]] trong [[phim]]. fg9g26yglc7p110glpc9s5xu8yair9u hấp thu 0 214691 2344993 1855266 2026-04-13T14:04:20Z Hiyuune 50834 2344993 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # {{see-entry|hấp thụ}} ehy0dp3rr3pcm87toc9qu4042ig0qeh 0 214719 2345005 2320440 2026-04-13T14:19:52Z WhoAlone 40420 2345005 wikitext text/x-wiki {{zho-prefix}} {{-Hant-}} {{character info}} {{character info|⽝}} {{zho-so|[[Hình:犬-bw.png|280px|犬]]}} {{CJKV-forms|犬|犬|犬|犬}} * {{zh-sn|4}} * {{zh-rad|犬|0}} * {{unihan|72AC}} {{-translit-}} *{{Latn}} **{{hanviet|[[khuyển]]}} **{{romaji|[[inu]]}} *{{Hira}}: [[い]][[ぬ]] {{-syn-}} * [[犭]] {{zho-etym}} =={{langname|jpx-hcj}}== {{attention|jpx-hcj}} ==={{ĐM|kanji}}=== {{jpx-hcj-kanji}} ==={{ĐM|reading}}=== {{jpx-hcj-readings |kun=いぬ- }} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|いぬ}} # [[chó]]. {{c|jpx-hcj|Chó}} =={{langname|mvi}}== {{attention|mvi}} ==={{ĐM|kanji}}=== {{mvi-kanji}} ==={{ĐM|etym}}=== Cùng gốc với {{cognate|ja|犬|tr=inu}}. ==={{ĐM|noun}}=== {{mvi-head|noun|いん}} # [[chó]]. {{C|mvi|Chó}} {{-jpn-}} [[Hình:Dingo3.jpg|nhỏ|phải|犬]] {{-noun-}} '''犬''' # [[loài|Loài]] [[chó]], một loài [[động vật]] có [[vú]] [[ăn]] [[thịt]], được [[thuần dưỡng]] để đi [[săn]] hay [[canh giữ]] [[nhà]]. {{ja-kanjitab}} {{-cmn}} {{-pron-}} * [[Wiktionary:Bính âm|Bính âm]]: quǎn (quan<sup>3</sup>) * [[Wiktionary:Wade-Giles|Wade–Giles]]: ch’üan<sup>3</sup> {{-noun-}} '''犬''' # [[loài|Loài]] [[chó]], một loài [[động vật]] có [[vú]] [[ăn]] [[thịt]], được [[thuần dưỡng]] để đi [[săn]] hay [[canh giữ]] [[nhà]]. # [[người|Người]] có [[cấp bậc]] [[nhỏ]], [[kẻ]] [[hèn hạ]]. {{-syn-}} * [[狗]] {{-trans-}} ; loài chó {{đầu}} * {{eng}}: [[dog]], [[canine]] {{giữa}} * {{spa}}: [[perro]] {{m}} {{cuối}} {{-vie-n-}} {{quốc ngữ|[[khuyển]], [[chó]]}} {{-pron-}} {{vie-pron|khuyển|chó}} [[Thể loại:Danh từ tiếng Nhật]] [[Thể loại:Danh từ tiếng Quan Thoại]] ghws98uup3xroi75gr4xif6x6wh8o1f trúng gió 0 232756 2344994 1330212 2026-04-13T14:04:28Z Hiyuune 50834 2344994 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # [[nhiễm|Nhiễm]] gió [[độc]], bị [[bệnh]] do gặp [[gió]] lạnh hoặc [[điều kiện]] [[thời tiết]] không [[thuận lợi]]. gup8yednpwny9zhmkkibg7qhe2mpykh vi vu 0 232900 2344995 1330242 2026-04-13T14:05:08Z Hiyuune 50834 2344995 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|n}}=== {{vi-noun}} # [[tiếng|Tiếng]] [[gió]] [[thổi]] [[nhẹ]]. ==={{section|v}}=== {{vi-verb}} # {{lb|vi|thông tục}} Đi [[chơi]], đi [[hóng]] [[gió]]. #: {{ux|vi|Hôm qua anh thấy chú '''vi vu''' cùng cô bé nào, trông có vẻ tí tởn lắm!}} 9u5p1s16hy41nf6g34mghtx0nzjwhh1 0 237624 2344996 2320370 2026-04-13T14:07:55Z WhoAlone 40420 /* {{langname|mvi}} */ 2344996 wikitext text/x-wiki {{zho-prefix}} {{-Hani-}} {{CJKV-forms|雨|雨|雨|雨}} {{character info}} {{character info|⾬}} {{character info|⻗}} {{commonscat}} {{zho-so}} {{-dictionary-}} * {{zh-sn|8}} * {{zh-rad|雨|0}} * {{unihan|96E8}} {{-translit-}} * {{Latn}} ** {{hanviet|[[vụ]], [[vũ]], [[vú]]}} {{-cmn-}} {{-pron-}} * [[Wiktionary:Bính âm|Bính âm]]: yǔ (yu<sup>3</sup>) * [[Wiktionary:Wade-Giles|Wade–Giles]]: yü<sup>3</sup> {{zh-forms|ss=⿻丅⿵冂⿰丶丶|alt=㲾,𠕒,𠕘,𠕲}} '''Glyph origin''' {{Han etym}} {{liushu|p}} – a cloud with drops of rain falling from it. (Compare {{noncog|egy|ḥwt|𓇲}}.) {{zh-wp|zh|yue|gan|hak:yí|cdo:ṳ̄|nan:hō͘|wuu}} {{-noun-}} '''雨''' # [[mưa|Mưa]]. {{-vie-n-}} {{quốc ngữ|[[vụ]], [[vũ]]}} {{-pron-}} {{vie-pron|vụ|vũ}} [[Thể loại:Danh từ tiếng Quan Thoại]] =={{langname|jpx-hcj}}== {{attention|jpx-hcj}} ==={{ĐM|kanji}}=== {{jpx-hcj-kanji}} ==={{ĐM|reading}}=== {{jpx-hcj-readings |kun=あみ- }} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|あみ}} # [[mưa]]. {{C|jpx-hcj|Hiện tượng khí quyển|sort=あみ}} =={{langname|mvi}}== {{attention|mvi}} ==={{ĐM|kanji}}=== {{mvi-kanji}} ==={{ĐM|reading}}=== {{mvi-readings |kun=あみ- }} ==={{ĐM|noun}}=== {{mvi-head|noun|あみ}} # [[mưa]]. {{C|mvi|Hiện tượng khí quyển|sort=あみ}} dbscat4gwkwj8penofobu01217nobxz 2344998 2344996 2026-04-13T14:09:47Z WhoAlone 40420 /* {{langname|jpx-hcj}} */ 2344998 wikitext text/x-wiki {{zho-prefix}} {{-Hani-}} {{CJKV-forms|雨|雨|雨|雨}} {{character info}} {{character info|⾬}} {{character info|⻗}} {{commonscat}} {{zho-so}} {{-dictionary-}} * {{zh-sn|8}} * {{zh-rad|雨|0}} * {{unihan|96E8}} {{-translit-}} * {{Latn}} ** {{hanviet|[[vụ]], [[vũ]], [[vú]]}} {{-cmn-}} {{-pron-}} * [[Wiktionary:Bính âm|Bính âm]]: yǔ (yu<sup>3</sup>) * [[Wiktionary:Wade-Giles|Wade–Giles]]: yü<sup>3</sup> {{zh-forms|ss=⿻丅⿵冂⿰丶丶|alt=㲾,𠕒,𠕘,𠕲}} '''Glyph origin''' {{Han etym}} {{liushu|p}} – a cloud with drops of rain falling from it. (Compare {{noncog|egy|ḥwt|𓇲}}.) {{zh-wp|zh|yue|gan|hak:yí|cdo:ṳ̄|nan:hō͘|wuu}} {{-noun-}} '''雨''' # [[mưa|Mưa]]. {{-vie-n-}} {{quốc ngữ|[[vụ]], [[vũ]]}} {{-pron-}} {{vie-pron|vụ|vũ}} [[Thể loại:Danh từ tiếng Quan Thoại]] =={{langname|jpx-hcj}}== {{attention|jpx-hcj}} ==={{ĐM|kanji}}=== {{jpx-hcj-kanji}} ==={{ĐM|reading}}=== {{jpx-hcj-readings |kun=あめ- }} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|あめ}} # [[mưa]]. {{C|jpx-hcj|Hiện tượng khí quyển|sort=あめ}} =={{langname|mvi}}== {{attention|mvi}} ==={{ĐM|kanji}}=== {{mvi-kanji}} ==={{ĐM|reading}}=== {{mvi-readings |kun=あみ- }} ==={{ĐM|noun}}=== {{mvi-head|noun|あみ}} # [[mưa]]. {{C|mvi|Hiện tượng khí quyển|sort=あみ}} h77glcy4b5f534miyagzczl0yyjx4dt Thảo luận Wiktionary:Thảo luận/Lưu 9 5 257496 2345203 2011040 2026-04-14T11:51:02Z CommonsDelinker 362 [[c:COM:CDC|Bot]]: thay Logo_for_the_beta_feature_FileExporter.svg bằng Logo_for_FileExporter.svg. 2345203 wikitext text/x-wiki == [https://meta.wikimedia.org/wiki/Special:SecurePoll/vote/341?setlang={{CONTENTLANG}} Voting has begun in 2017 Wikimedia Foundation Board of Trustees elections] == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr">[[File:Wikimedia-logo black.svg|{{#switch:{{CONTENTLANG}}|ar=left|he=left|right}}|125px|link=m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Board voting has begun]]''Đây là một thông điệp từ [[m:Special:MyLanguage/Wikimedia Foundation elections committee|Ủy ban bầu cử Wikimedia Foundation]]. [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Board voting has begun|Các bản dịch có tại đây]].'' [https://meta.wikimedia.org/wiki/Special:SecurePoll/vote/341?setlang={{CONTENTLANG}}&uselang={{CONTENTLANG}} Bầu cử đã bắt đầu]. [[m:Wikimedia Foundation elections/2017#Requirements|Các cử tri hợp lệ]] có thể đi bầu cho ''[[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Board of Trustees|Hội đồng quản trị Wikimedia Foundantion]]'' năm 2017. [[m:Wikimedia Foundation Board of Trustees|Hội đồng Quản trị]] là cơ quan quản lý cấp cao nhất của Wikimedia Foundation, một tổ chức phi lợi nhuận đã đăng ký tại Hoa Kỳ theo điều khoản 501(c)(3). Wikimedia Foundation quản lý nhiều dự án đa dạng như Wikipedia và Commons. Giai đoạn bỏ phiếu kéo dài từ 00:00 UTC ngày 1 đến 23:59 UTC 14 tháng 5. '''[https://meta.wikimedia.org/wiki/Special:SecurePoll/vote/341?setlang={{CONTENTLANG}}&uselang={{CONTENTLANG}} Nhấn vào đây để bỏ phiếu].''' Thông tin thêm về ứng cử viên và cuộc bầu cử có thể được tìm thấy trên trang [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Board of Trustees|2017 trang bầu cử Hội đồng Quản trị]] trên Meta-Wiki. Thay mặt Ủy ban Bầu cử,<br/> [[m:User:KTC|Katie Chan]], Chủ tịch, [[m:Special:MyLanguage/Wikimedia Foundation elections committee|Ủy ban bầu cử Wikimedia Foundation]]<br/> [[m:User:JSutherland (WMF)|Joe Sutherland]], Phát triển Cộng đồng, Wikimedia Foundation ''Đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|MediaWiki message delivery]] • [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Board voting has begun|Biên dịch]] • [[m:Talk:Wikimedia Foundation elections/2017|Giúp đỡ]]</div> 19:16, ngày 3 tháng 5 năm 2017 (UTC)'' <!-- Tin nhắn của Thành viên:GVarnum-WMF@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=16683836 --> == Beta Feature Two Column Edit Conflict View == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> From May 9, the [[mw:Special:MyLanguage/Help:Two_Column_Edit_Conflict_View|Two Column Edit Conflict View]] will be available as a [[mw:Special:MyLanguage/Beta Features|beta feature]] on all wikis. The Two Column Edit Conflict View is a new interface for the edit conflict resolution page. It highlights differences between the editor's and the conflicting changes to make it easy to copy and paste pieces of the text and resolve the conflict. The feature fulfils a request for a more user-friendly edit conflict resolution from the [[m:WMDE Technical Wishes|German Community’s Technical Wishlist]]. Everyone is invited to test the feature and we hope that it will serve you well! </div> [[m:user:Birgit Müller (WMDE)|Birgit Müller (WMDE)]] 14:41, ngày 8 tháng 5 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:Birgit Müller (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_2&oldid=16712264 --> == RevisionSlider == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> [[mw:Special:MyLanguage/Extension:RevisionSlider|RevisionSlider]] will be available as a default feature for all users on all wikis from May 17. The RevisionSlider adds a slider view to the diff page so that you can easily move between revisions. The slider view is collapsed by default, and will load by clicking on it. It can also be turned off entirely in the user preferences. RevisionSlider has been a default feature on German, Arabic and Hebrew Wikipedia for 6 months and a beta feature on all wikis for 8 months. The feature fulfills a wish from the [[m:WMDE Technical Wishes|German Community’s Technical Wishlist]]. Thanks to everyone who tested RevisionSlider and gave valuable feedback to improve the feature! We hope that RevisionSlider will continue to serve you well in your work. </div> [[m:user:Birgit Müller (WMDE)|Birgit Müller (WMDE)]] 14:44, ngày 16 tháng 5 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:Birgit Müller (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_2&oldid=16715712 --> == [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2|Join the next cycle of Wikimedia movement strategy discussions (underway until June 12)]] == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"> :''[[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Updates/Cycle 2 discussions launch|Thông báo có sẵn để dịch trên Meta-Wiki]]'' [[File:Wikimedia-logo.svg||{{#switch:{{CONTENTLANG}}|ar=left|he=left|right}}|150px]] Nhóm cốt lõi chiến lược phong trào Wikimedia và các nhóm làm việc đã hoàn thành đánh giá hơn 1800 câu phát biểu theo chủ đề mà chúng tôi nhận được từ cuộc thảo luận đầu tiên. Họ đã xác định [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2|5 chủ đề phù hợp trên tất cả các cuộc trò chuyện]] - mỗi bộ đều có tập hợp các chủ đề phụ. Đây không phải là chủ đề cuối cùng, chỉ là một bản thảo làm việc ban đầu của các khái niệm cốt lõi. Bạn được mời [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Participate|tham gia các cuộc thảo luận trực tuyến và ngoại tuyến đang diễn ra]] về 5 chủ đề này. Cuộc thảo luận này sẽ diễn ra từ ngày hôm nay đến ngày 12 tháng 6. Bạn có thể thảo luận bao nhiêu chủ đề cũng được; Chúng tôi yêu cầu bạn tham gia vào những điều mà bạn quan tâm nhất (hoặc ít nhất). Dưới đây là năm chủ đề, mỗi trang có một trang trên Meta-Wiki với nhiều thông tin hơn về chủ đề và cách tham gia vào cuộc thảo luận của chủ đề đó: * [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2/Healthy, Inclusive Communities|Cộng đồng khỏe mạnh và bao gồm mọi người]] * [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2/The Augmented Age|Thời đại Gia tăng]] * [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2/A Truly Global Movement|Một phong trào toàn cầu thực sự]] * [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2/The Most Respected Source of Knowledge|Nguồn tri thức được tôn trọng nhất]] * [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Cycle 2/Engaging in the Knowledge Ecosystem|Tham gia vào hệ sinh thái tri thức]] Trên cổng [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Participate|chiến lược phong trào trên Meta-Wiki]], bạn có thể tìm thêm thông tin về từng chủ đề, thảo luận và cách tham gia. ''Đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|MediaWiki message delivery]] đại diện cho [[m:Special:MyLanguage/Wikimedia Foundation|Wikimedia Foundation]] • [[m:Special:MyLanguage/Strategy/Wikimedia movement/2017/Updates/Cycle 2 discussions launch|{{int:please-translate}}]] • [[m:Talk:Strategy/Wikimedia movement/2017/Updates|Trợ giúp]]''</div> 21:09, ngày 16 tháng 5 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:GVarnum-WMF@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Strategy/Wikimedia_movement/2017/Updates/Global_message_delivery&oldid=16773425 --> == [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Start of the 2017 Wikimedia Foundation Funds Dissemination Committee elections|Start of the 2017 Wikimedia Foundation Funds Dissemination Committee elections]] == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr">[[File:Wikimedia-logo black.svg|{{#switch:{{CONTENTLANG}}|ar=left|he=left|right}}|125px|link=m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Start of the 2017 Wikimedia Foundation Funds Dissemination Committee elections]] :''[[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Start of the 2017 Wikimedia Foundation Funds Dissemination Committee elections|Bản dịch của thông báo này có sẵn trên Meta-Wiki]].'' Thay mặt cho Ủy ban Bầu cử Wikimedia, chúng tôi vui mừng thông báo rằng việc tự đề cử đang được chấp nhận cho các vị trí [[m:Wikimedia Foundation elections/2017/Funds Dissemination Committee/Call for candidates|Ủy ban phân bổ Quỹ của Wikimedia Foundation 2017]] ''Ủy ban Phân bổ Nguồn quỹ (FDC)''<br /> Ủy ban Phân bổ Quỹ (FDC) đưa ra các khuyến nghị về cách phân bổ các quỹ của phong trào Wikimedia cho các tổ chức đủ điều kiện. Có năm vị trí đang được bầu cử. Bạn có thể tìm thêm thông tin về vai trò này tại [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Funds Dissemination Committee|trang bầu cử FDC]]. ''Thanh tra Ủy ban Phân bổ Nguồn quỹ''<br /> Thanh tra Ủy ban Phân bổ Nguồn quỹ nhận khiếu nại và phản hồi về quá trình FDC, điều tra các khiếu nại theo yêu cầu của Hội đồng Quản trị và tóm tắt các cuộc điều tra và phản hồi cho Hội đồng Quản trị hàng năm. Một vị trí đang được bầu cử. Bạn có thể tìm hiểu thêm thông tin về vai trò này tại [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Funds Dissemination Committee Ombudsperson|bầu cử Thanh tra Ủy ban Phân bổ Nguồn quỹ]]. '''[[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Funds Dissemination Committee/Candidates|Giai đoạn nhận hồ sơ ứng viên]] sẽ kết thúc vào ngày 28 tháng 5 (23:59 UTC).''' '''Chúng tôi cũng sẽ chấp nhận các câu hỏi để yêu cầu các ứng cử viên trả lời cho đến ngày 28 tháng 5. [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Funds Dissemination Committee/Questions|Bạn có thể gửi câu hỏi của bạn về Meta-Wiki]].''' Sau khi giai đoạn đệ trình câu hỏi kết thúc vào ngày 28 tháng 5, Ủy ban Bầu cử sẽ tổng hợp các câu hỏi để ứng viên trả lời. Mục đích của quá trình này là để bầu '''năm ghế do cộng đồng bầu ra''' của Ủy ban Phân bổ Nguồn quỹ và một '''Thanh tra do cộng đồng bầu ra'''. Kết quả bầu cử sẽ được Hội đồng Quản trị tuân theo. Lịch trình đầy đủ cho cuộc bầu cử của FDC như sau. Tất cả các ngày là '''bao gồm cả biên''', nghĩa là, thời gian tính từ đầu ngày đầu tiên (UTC) đến cuối ngày cuối cùng. * 15 tháng 5 (00:00 giờ UTC) - ngày 28 tháng 5 (23:59 UTC) - '''Đề cử ''' * 15 tháng năm - 28 tháng 5 - '''Giai đoạn gửi câu hỏi cho ứng viên''' * 29 tháng 5 - 2 tháng 6 - '''Ứng cử viên trả lời câu hỏi''' * 3 tháng 6 - 11 tháng 6 - '''Thời gian bỏ phiếu''' * Ngày 12-14 tháng 12 - ''' Kiểm tra bỏ phiếu''' ' * 15 tháng 6 - '''Ngày công bố kết quả bầu cử''' Thông tin thêm về các cuộc bầu cử năm nay có thể được tìm thấy tại [[m:Special:MyLanguage/Wikimedia Foundation elections/2017|cổng thông tin chính thức Bầu cử Wikimedia Foundation năm 2017]]. Xin vui lòng gửi một thông báo về cuộc bầu cử trên trang Thảo luận chung của dự án của bạn. Bất kỳ câu hỏi nào liên quan đến cuộc bầu cử đều có thể được đăng trên trang thảo luận ở Meta, hoặc được gửi đến danh sách gửi thư của ủy ban bầu cử, <tt dir="ltr" style="white-space:nowrap;font-size:12px;line-height:1.5">board-elections[[File:At sign.svg|15x15px|middle|link=|alt=(at)]]wikimedia.org</tt>. Thay mặt Ủy ban Bầu cử,<br /> [[m:User:KTC|Katie Chan]], Chủ tịch, [[m:Special:MyLanguage/Wikimedia Foundation elections committee|Ủy ban bầu cử Wikimedia Foundation]]<br /> [[m:User:JSutherland (WMF)|Joe Sutherland]], Nhà vận động Cộng đồng, Wikimedia Foundation ''Đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|MediaWiki message delivery]]• [[m:Special:MyLanguage/Wikimedia Foundation elections/2017/Updates/Start of the 2017 Wikimedia Foundation Funds Dissemination Committee elections|Biên dịch]] • [[m:Talk:Wikimedia Foundation elections/2017|Giúp đỡ]]''</div> 21:05, ngày 23 tháng 5 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:GVarnum-WMF@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=16804695 --> == Báo lỗi trang == Tôi có thể báo lỗi một trang (một mục từ) ở đâu? Vì tôi vừa phát hiện một [https://vi.wiktionary.org/wiki/Tr%C6%B0%E1%BB%9Dng_cao_%C4%91%E1%BA%B3ng_N%C3%B4ng_nghi%E1%BB%87p_v%C3%A0_Ph%C3%A1t_tri%E1%BB%83n_n%C3%B4ng_th%C3%B4n_B%E1%BA%AFc_B%E1%BB%99 trang] mang hình thức quảng cáo mà không thấy tính năng báo lỗi ở thanh bên (giống kiểu của Wikipedia). — [[User:Minh Tấn|<b style="font-family:Segoe UI;font-size:130%;color:#9acc59">MTn</b>]][[Wikipedia:vi:Thảo luận Thành viên:Minh Tấn|<sup style="margin-left:3px;color:#0aa;">thảo luận</sup>]] 14:45, ngày 30 tháng 5 năm 2017 (UTC) :[[User:Minh Tấn|<b style="font-family:Segoe UI;font-size:130%;color:#9acc59">MTn</b>]] Nếu nó là thông tin không phù hợp thì bạn có thể yêu cầu xoá nhanh bằng biển <code><nowiki>{{delele|Lý do}}</nowiki></code>. [[Thành viên:Huỳnh Nhân-thập|'''<tt><span style="color:#4169e1;">jan Win</span></tt>''']] ([[Thảo luận Thành viên:Huỳnh Nhân-thập|thảo luận]]) 08:31, ngày 1 tháng 6 năm 2017 (UTC) == Enable sitelinks on Wikidata for Wiktionary pages == <div lang="en" dir="ltr" class="mw-content-ltr">Hello, I’m sorry to write this message in English. Please help us [[d:Special:MyLanguage/Wikidata:Wiktionary/Sitelinks|translating the full message here]]! Short version: From June 20th, we are going to store the interwiki links of all the namespaces (except main, user and talk) in Wikidata. This will not break your Wiktionary, but if you want to use all the features, you will have to remove your sitelinks from wikitext and connect your pages to Wikidata. [[d:Special:MyLanguage/Wikidata:Wiktionary/Sitelinks|Long version available and translatable here.]] If you have any question or concern, feel free to ping me. Thanks, [[m:User:Lea Lacroix (WMDE)|Lea Lacroix (WMDE)]] ([[m:User talk:Lea Lacroix (WMDE)|talk]]) 08:38, ngày 1 tháng 6 năm 2017 (UTC)</div> <!-- Tin nhắn của Thành viên:Lea Lacroix (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Lea_Lacroix_(WMDE)/List_Cognate_english&oldid=16834421 --> == Sitelinks are enabled on Wikidata for Wiktionary pages (outside main namespace) == Hello, I’m sorry to write this message in English. Please help us translating the full message [[d:Wikidata:Wiktionary/Sitelinks|here]]! Short version: Since yesterday, we are able to store the interwiki links of all the Wiktionaries namespaces (except main, citations, user and talk) in Wikidata. This will not break your Wiktionary, but if you want to use all the features, you will have to remove your sitelinks from wikitext and connect your pages to Wikidata. Important: even if it is technically possible, you '''should not link Wiktionary main namespace pages''' from Wikidata. The interwiki links for them are already provided by [[mw:Extension:Cognate|Cognate]]. [[d:Wikidata:Wiktionary/Sitelinks|Long version available and translatable here.]] If you encounter any problem or find a bug, feel free to ping me. Thanks, [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 08:28, ngày 21 tháng 6 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:Lea Lacroix (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Lea_Lacroix_(WMDE)/List_Cognate_english&oldid=16834421 --> == Enabling Page Previews == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> ''' Enabling Page Previews ''' Hello, Based on the positive results of [[:mw:Beta Features/Hovercards#Success_Metrics_and_Feature_Evaluation|a series of quantitative and qualitative tests]], the [[mw:Reading|Reading web team]] at the Wikimedia Foundation would like to enable the [[mw:Page Previews|Page Previews]] feature for this project. Page Previews provide a preview of any linked article, giving readers a quick understanding of a related article without leaving the current page. However, we realize the needs of the Wiktionary community will not be satisfied by the current implementation of the feature. We are interested in developing separate previews for Wiktionary that will display the wiktionary definition of an item, as well as an image, if available. We'd like to invite some discussion around interest in this feature, as well as the requirements and elements that would make it useful for the Wiktionary community. </div></div> [[User:CKoerner (WMF)|CKoerner (WMF)]] 15:02, ngày 6 tháng 7 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:CKoerner (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:CKoerner_(WMF)/Enable_Hovercards_Wiktionary/Distribution_list&oldid=16968644 --> == Accessible editing buttons == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr">The MediaWiki developers have been slowly improving the accessibility of the user interface. The next step in this transition will change the appearance of some buttons and may break some outdated (non-updated or unmaintained) user scripts and gadgets. You can see and use the [https://www.mediawiki.org/wiki/Project:Sandbox?action=submit&ooui=0 old] and [https://www.mediawiki.org/wiki/Project:Sandbox?action=submit&ooui=1 new] versions now. Most editors will only notice that some buttons are slightly larger and have different colors. <gallery mode="nolines" caption="Comparison of old and new styles" heights="240" widths="572"> File:MediaWiki edit page buttons accessibility change 2017, before.png|Buttons before the change File:MediaWiki edit page buttons accessibility change 2017, after.png|Buttons after the change </gallery> However, this change also affects some user scripts and gadgets. Unfortunately, some of them may not work well in the new system. <mark>If you maintain any user scripts or gadgets that are used for editing, please see '''[[:mw:Contributors/Projects/Accessible editing buttons]]''' for information on how to test and fix your scripts. Outdated scripts can be tested and fixed now.</mark> This change will probably reach this wiki on '''Tuesday, 1 August 2017'''. Please leave a note at [[:mw:Talk:Contributors/Projects/Accessible editing buttons]] if you need help.</div> --[[m:User:Whatamidoing (WMF)|Whatamidoing (WMF)]] ([[m:User talk:Whatamidoing (WMF)|talk]]) 16:56, ngày 27 tháng 7 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Whatamidoing_(WMF)/Sandbox&oldid=17043399 --> == Columns for references == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr">''{{Int:Please-translate}}'' • ''[[:m:Special:MyLanguage/Editing/Columns for references|Read this in another language]]'' Hello, At the request of Wikipedia editors, a new feature has been added to MediaWiki. Long lists of references (also called citations or footnotes) will automatically be displayed in columns. This will make it easier for most people to read the references, especially on narrow screens. Short lists of references will not be affected. I plan to enable this new feature at this wiki on Monday, 11 September 2017. After that date, use the normal <code><nowiki><references /></nowiki></code> tag on any page with many references to see this feature. If you do not want columns used on that page, then use this wikitext code instead: <code><nowiki><references responsive="0" /></nowiki></code> If you believe that this new feature is not appropriate for this wiki, or if you need help adjusting templates, then please contact me at [[mw:Contributors/Projects/Columns for references]]. --[[User:Whatamidoing (WMF)]] ([[User talk:Whatamidoing (WMF)|talk]])</div> 18:23, ngày 1 tháng 9 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery/Wiktionary&oldid=17181867 --> == Liệu có nên chứa mục từ Danh từ riêng? == Có thể có hàng triệu danh từ riêng (ở các ngôn ngữ khác nhau), ví dụ như tên người nổi tiếng ([[Lâm Vỹ Thần]] vừa bị xóa), tên tổ chức, .... Liệu chúng ta có nên chứa các mục từ danh từ riêng? Lợi ích: tăng cơ hội tra cứu cho người đọc, tăng khả năng sử dụng của cơ sở dữ liệu từ điển cho những mục đích mở rộng. Nguy cơ/bất lợi: cái này tôi chưa nghĩ ra, có ai có ý kiến gì không? [[Đặc biệt:Contributions/42.114.193.98|42.114.193.98]] ([[Thảo luận Thành viên:42.114.193.98|thảo luận]]) 07:55, ngày 17 tháng 10 năm 2017 (UTC) == New print to pdf feature for mobile web readers == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> '''New print to pdf feature for mobile web readers''' The Readers web team will be deploying a new feature this week to make it [[mw:Reading/Web/Projects/Mobile_PDFs|easier to download PDF versions of articles on the mobile website]]. Providing better offline functionality was one of the highlighted areas from [[m:New_Readers/Offline|the research done by the New Readers team in Mexico, Nigeria, and India]]. The teams created a prototype for mobile PDFs which was evaluated by user research and community feedback. The [[m:New_Readers/Offline#Concept_testing_for_mobile_web|prototype evaluation]] received positive feedback and results, so development continued. For the initial deployment, the feature will be available to Google Chrome browsers on Android. Support for other mobile browsers to come in the future. For Chrome, the feature will use the native Android print functionality. Users can choose to download a webpage as a PDF. [[mw:Reading/Web/Projects/Print_Styles#Mobile_Printing|Mobile print styles]] will be used for these PDFs to ensure optimal readability for smaller screens. The feature is available starting Wednesday, Nov 15. For more information, see [[mw:Reading/Web/Projects/Mobile_PDFs|the project page on MediaWiki.org]]. {{Int:Feedback-thanks-title}} </div> [[m:User:CKoerner (WMF)|CKoerner (WMF)]] ([[m:User talk:CKoerner (WMF)|talk]]) 22:07, ngày 20 tháng 11 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:CKoerner (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:CKoerner_(WMF)/Mobile_PDF_distribution_list&oldid=17448927 --> == Improved search in deleted pages archive == {{int:please-translate}} During Wikimedia Hackathon 2016, the [[mw:Wikimedia_Discovery|Discovery]] team [https://phabricator.wikimedia.org/T109561 worked] on one of the items on the 2015 community wishlist, namely [[m:2015_Community_Wishlist_Survey/Search#Provide_a_means_of_searching_for_deleted_pages|enabling searching the archive of deleted pages]]. This feature is now ready for production deployment, and will be enabled on all wikis, except Wikidata. Right now, the feature is behind a feature flag - to use it on your wiki, please go to the <code>Special:Undelete</code> page, and add <code>&fuzzy=1</code> to the URL, like this: https://test.wikipedia.org/w/index.php?title=Special%3AUndelete&fuzzy=1. Then search for the pages you're interested in. There should be more results than before, due to using ElasticSearch indexing (via the CirrusSearch extension). We plan to enable this improved search by default on all wikis soon (around August 1, 2017). If you have any objections to this - please raise them with the Discovery team via [http://mailto:discovery@lists.wikimedia.org email] or on this announcement's discussion page. Like most Mediawiki configuration parameters, the functionality can be configured per wiki. Once the improved search becomes the default, you can still access the old mode using <code>&fuzzy=0</code> in the URL, like this: https://test.wikipedia.org/w/index.php?title=Special%3AUndelete&fuzzy=0 Please note that since Special:Undelete is an admin-only feature, this search capability is also only accessible to wiki admins. {{Int:Feedback-thanks-title}} [[m:User:CKoerner (WMF)|CKoerner (WMF)]] ([[m:User talk:CKoerner (WMF)|talk]]) 18:39, ngày 25 tháng 7 năm 2017 (UTC) <!-- Tin nhắn của Thành viên:CKoerner (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:CKoerner_(WMF)/Archive_search_announce/Distribution_list&oldid=17036927 --> == Quy tắc chính tả cho mục từ tiếng Việt trên Wiktionary == Tôi mới đổi tên một loại mục từ danh từ riêng tên ngày trong tuần và tên tháng trong năm theo quy tắc chính tả tiếng Việt đang được sử dụng tại Việt Nam. Như đổi tên mục từ "thứ hai" do PiedBot nhập từ FVDP thành [[thứ Hai]], đồng thời không giữ chuyển hướng từ mục từ "thứ hai" sang mục từ "thứ Hai" nữa mà bổ sung nội dung cho mục từ "thứ hai" như một mục từ độc lập, vừa là danh từ vừa là tính từ. Tức là "thứ hai" có thể là danh từ riêng trong tiếng Việt, là từ thường bị viết sai chính tả của từ "thứ Hai". Hoặc "thứ hai" là một tính từ trong thứ tự số đếm, số thứ tự tương ứng với cái (vật, chiếc,...) đứng ở vị trí ngay sau cái (vật, chiếc,...) đầu tiên khi được đếm theo quy tắc nào đó (đếm tiến, đếm tăng, đếm cách quãng,...). Ở Wiktionary tiếng Anh, bảo quản viên sẽ xoá thẳng tay các mục từ sai chính tả như "monday", mỗi khi có người dùng nào tạo mới, họ đã xoá nhiều lần chứ không phải một lần, vì đó là từ sai chính tả tiếng Anh, có lẽ nó chưa được coi là từ sai chính tả thường gặp trong tiếng Anh. Còn ở tiếng Việt, nên coi từ "thứ Hai" bị viết sai chính tả thành "thứ hai" rất hay gặp ở nhiều văn bản nên có thể coi nó là danh từ riêng thường bị viết sai chính tả, bên cạnh cái nghĩa tính từ đã nói ở trên. Tương tự, tôi cũng đã đổi tên một loạt mục từ danh riêng tiếng Việt về tên tháng trong năm. Ví dụ, tôi viết lại hoàn toàn định nghĩa mục từ [[tháng Sáu]] dựa trên nội dung của Wiktionary tiếng Anh, đưa thêm phần chú thích sử dụng để lưu ý chính tả khi viết từ này, thêm từ đồng nghĩa ở dạng số, thêm bản mẫu danh sách các tháng trong năm vào cuối bài cho thuận tiện tra cứu. Tại mục từ cũ [[tháng sáu]], tôi thay mã điều hướng <nowiki>"#đổi [[tháng Sáu]]"</nowiki> bằng nội dung coi nó như một mục từ sai chính tả thường gặp của [[tháng Sáu]]. Cộng đồng thành viên Wiktionary tiếng Việt rất nhỏ nên tôi đã đổi mục từ trước khi đưa ra thảo luận. Người dùng hoặc thành viên khác có thể tham khảo cách này để viết viết bổ sung các mục từ về tên ngày và tên tháng, do các mục từ này được PiedBot nhập từ FVDP, cách định nghĩa một từ không theo chuẩn mực từ điển, nên vẫn cần phải viết lại hoàn toàn định nghĩa cho những mục từ này và rất nhiều mục từ khác được nhập từ FVDP. Wiktionary tiếng Việt dành cho mọi người nói và sử dụng tiếng Việt trên khắp thế giới chứ không riêng phải dành riêng cho người Việt Nam. Mỗi cộng đồng và mỗi thời có thể khác biệt về quy tắc chính tả tiếng Việt, như khác biệt chính tả tiếng Việt giữa người Việt ở Việt Nam và người Việt ở Hoa Kỳ được học trước năm 1975 ở miền Nam Việt Nam chẳng hạn. Nhưng tôi vẫn đề xuất lấy quy tắc chính tả tiếng Việt hiện hành ở Việt Nam để áp dụng cho Wiktionary tiếng Việt, do cộng đồng nói và sử dụng tiếng Việt ở Việt Nam là lớn nhất, nên cần có ưu tiên. Theo quy tắc chính tả tiếng Việt hiện nay ở Việt Nam, sẽ ''viết hoa chữ cái đầu của âm tiết chỉ ngày và tháng trong trường hợp không dùng chữ số'', tức là viết "tháng Năm" thay cho "tháng năm", viết "thứ Hai" thay cho "thứ hai". Dĩ nhiên vẫn viết "Thứ Hai" khi từ này đứng đầu câu hoặc đầu đoạn văn rồi. Không những một vài mục từ này, tôi đề nghị nên áp dụng thống nhất quy tắc chính tả tiếng Việt được ban hành áp dụng trong các văn bản hành chính ở Việt Nam, làm chuẩn mực quy tắc chính tả tiếng Việt cho Wiktionary tiếng Việt này. Tôi cũng đề nghị bảo quản viên xoá thẳng tay các mục từ bằng tiếng Việt mà viết sai chính tả tiếng Việt, khi nó là một từ sai chính tả không thường gặp (không được nhiều người sử dụng sai thường xuyên), hoặc xoá luôn các mục từ đổi hướng từ với từ viết sai chính tả do thành viên không có kinh nghiệp nhập vào đến từ viết đúng chính tả. Như mục từ [[Khoảng lùi]] hay [[Dân cư]] nên xoá luôn, không cần giữ lại. Nếu thành viên nào có bất kỳ phản đối hay ý kiến về vấn đề này, vui lòng viết thảo luận ở đây. [[Thành viên:NHHP|NHHP]] ([[Thảo luận Thành viên:NHHP|thảo luận]]) == Mục từ tục == Wiktionary hay gặp tình trạng các IP phá hoại và tạo bài phá hoại về các mục từ tục (thêm nghĩa tự chế, lợi dụng để thêm nội dung chửi rủa ai đó ngoài đời...) kiểu [[địt mẹ mày|đ** m* mày]], v.v. Khi một bài bị phá hoại kiểu này quá nhiều lần (hai ba lần trở lên), tôi sẽ dùng biện pháp tạm thời là hạn chế sửa đổi, tạo mới đối với tài khoản chưa xác nhận. Tôi thấy không còn cách nào khác hiểu quả hơn. Mọi người thấy thế nào? [[Thành viên:Huỳnh Nhân-thập|'''<tt><span style="color:#4169e1;">jan Win</span></tt>''']] ([[Thảo luận Thành viên:Huỳnh Nhân-thập|thảo luận]]) 05:10, ngày 21 tháng 2 năm 2018 (UTC) :Wikipedia tiếng Việt đang đề xuất việc áp dụng khóa mềm (xét duyệt sửa đổi) với một số trang cụ thể khi có phá hoại, nhưng với Wiktionary tiếng Việt vốn có lưu lượng sửa đổi rất ít, bạn có thể xem xét việc áp dụng khóa mềm mặc định lên mọi trang, như cách mà Wikipedia tiếng Đức, tiếng Ba Lan hay tiếng Indonesia đang áp dụng. --[[User:Trần Nguyễn Minh Huy|<font color="green">'''minhhuy'''</font>]] <sup>([[User talk:Trần Nguyễn Minh Huy|talk]])</sup> 15:06, ngày 23 tháng 2 năm 2018 (UTC) == Bát tiên == Các mục từ về các ông các bà trong Bát tiên như [[Lam Thái Hoà]], [[Tào Quốc Cửu]], [[Hà Tiên Cô]], [[Hàn Tương Tử]] có thích hợp tại Wiktionary không? [[Thành viên:Huỳnh Nhân-thập|'''<tt><span style="color:#4169e1;">jan Win</span></tt>''']] ([[Thảo luận Thành viên:Huỳnh Nhân-thập|thảo luận]]) 05:16, ngày 26 tháng 2 năm 2018 (UTC) :Nếu nội dung không vi phạm bản quyền thì chúng thuộc Wikipedia chứ không phải Wiktionary. --[[User:Trần Nguyễn Minh Huy|<font color="green">'''minhhuy'''</font>]] <sup>([[User talk:Trần Nguyễn Minh Huy|talk]])</sup> 06:15, ngày 26 tháng 2 năm 2018 (UTC) == Tell us what you think about the automatic links for Wiktionary == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> Hello all, (Sorry for writing in English. Feel free to translate this message below.) One year ago, the Wikidata team started deploying new automatic interwiki links for Wiktionaries. Today, the links for the main namespace are automatically displayed by a Mediawiki extension, and the links for other namespaces are stored in Wikidata. You can find [[d:Special:MyLanguage/Wikidata:Wiktionary/Sitelinks|the documentation here]] (feel free to help translating it in your language). We would like to know if you encountered problems with the system, if you would have suggestions for further improvements. This could be for example: * Some automatic links don’t work as expected * Some problems you encountered with entering links (for non-main namespace) in Wikidata * Some new features you’d like to have, related to links To give feedback, you have two options: * Let a message on [[d:Wikidata talk:Lexicographical data/Sitelinks|this talk page]] * Let a message here. If you do so, please mention me with the <nowiki>{{ping}}</nowiki> template, so I can get a notification. Our preferred languages are English, French and German, but you can also let a message in your own language if you feel more comfortable with it. I’m looking forward for your feedback! [[:d:User:Lea Lacroix (WMDE)|Lea Lacroix (WMDE)]] 10:23, ngày 24 tháng 4 năm 2018 (UTC) </div> <!-- Tin nhắn của Thành viên:Lea Lacroix (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/All_Wiktionaries&oldid=17968098 --> == AdvancedSearch == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> From May 8, [[mw:Special:MyLanguage/Help:Extension:AdvancedSearch|AdvancedSearch]] will be available as a [[mw:Special:MyLanguage/Beta Features|beta feature]] in your wiki. The feature enhances the [[Special:Search|search page]] through an advanced parameters form and aims to make [[m:WMDE_Technical_Wishes/AdvancedSearch/Functional_scope|existing search options]] more visible and accessible for everyone. AdvancedSearch is a project by [[m:WMDE Technical Wishes/AdvancedSearch|WMDE Technical Wishes]]. Everyone is invited to test the feature and we hope that it will serve you well in your work! </div> [[m:User:Birgit Müller (WMDE)|Birgit Müller (WMDE)]] 14:53, ngày 7 tháng 5 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:Birgit Müller (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_2&oldid=17995461 --> == Lỗi ở trang [[Đặc biệt:Thống kê]] == {| border="1" | <nowiki>Số [[Wiktionary:Sơ đồ mục từ|mục từ]]<br /> <small>(240.752 kể các từ cùng chữ tập hợp trong một mục từ đa ngữ)</small></nowiki> ((240.752 kể các từ cùng chữ tập hợp trong một mục từ đa ngữ)) | 232.595 |- | Số trang (Tất cả các trang tại wiki, bao gồm trang thảo luận, trang đổi hướng, v.v.) | 245.697 |- | <nowiki>Tập tin hình ảnh và phương tiện đã tải lên<br /> <small>Không kể hàng triệu tập tin có sẵn ở [[Commons:Trang Chính|Wikimedia Commons]]</small></nowiki> | 5 |} Những đoạn mã <nowiki><small>, <br /></nowiki> vẫn còn "dính" lại. Có ai biết cách sửa không ? [[Thành viên:Huỳnh Nhân-thập|'''<tt><span style="color:#4169e1;">jan Win</span></tt>''']] ([[Thảo luận Thành viên:Huỳnh Nhân-thập|thảo luận]]) 13:33, ngày 21 tháng 5 năm 2018 (UTC) Đã sửa [[MediaWiki:Statistics-articles]], [[MediaWiki:Statistics-files]], và [[MediaWiki:Statistics-articles-desc]]. &ndash;&nbsp;[[Thành viên:Mxn|Nguyễn Xuân Minh]]&nbsp;<sup>[[Thảo luận Thành viên:Mxn|<span style="display: inline-block;">&#x1f4ac;</span>]]</sup> 18:35, ngày 27 tháng 6 năm 2018 (UTC) == Lexicographical data is now available on Wikidata == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> Hello, ''Sorry for writing in English. Feel free to translate the content of this message below.'' After several years discussing about it, and one year of development and discussion with the communities, the development team of Wikimedia Germany has now released the first version of [[d:Wikidata:Lexicographical data|lexicographical data support on Wikidata]]. Since the start of Wikidata in 2012, the multilingual knowledge base was mainly focused on concepts: Q-items are related to a thing or an idea, not to the word describing it. Starting now, Wikidata stores a new type of data: words, phrases and sentences, in many languages, described in many languages. This information will be stored in new types of entities, called Lexemes, Forms and Senses. The goal of lexicographical data on Wikidata is to provide a structured and machine-readable way to describe words and phrases in multiple languages, stored in a same place, reusable under CC-0. In the near future, this data will be available for Wiktionaries and other projects to reuse, as much as you want to. For now, we’re at the first steps of this project: the new data structure has been released on Wikidata, and we’re looking for people to try it, and give us feedback on what is working or not. Participating to this project is the opportunity for you to have a voice in it, to make sure that your needs and requests are taken in account very early in the process, and to start populating Wikidata with words in your language! Here’s how you can try lexicographical data on Wikidata: * First of all, if you’re not familiar with the data model, I encourage you to have a look at [[d:Wikidata:Lexicographical data/Documentation|the documentation page]]. If you’re not familiar with Wikidata at all, I suggest [[d:Help:Contents|this page]] as a start point. * You can also [https://www.wikidata.org/wiki/Special:AllPages?from=&to=&namespace=146 look at the Lexemes that already exists] (search features will be improved in the future). * When you feel ready to create a word, go on [[d:Special:NewLexeme]]. * If some properties that you need are missing, you can [[d:Wikidata:Property proposal/Lexemes|suggest them on this page]] (if you’re not sure how to do it, just let a message on the talk page and someone will help you). * The main discussion page is [[d:Wikidata:Lexicographical data]]. Here, you can ask for help, suggest ways to organize the data, but also leave feedback: if you encounter any bug or issue, let us know. We’re looking especially to know what are the most important features for you to be worked on next. In any case, feel free to contact me if you have a question or problem, I’ll be very happy to help. Cheers, [[:d:User:Lea Lacroix (WMDE)|Lea Lacroix (WMDE)]] 12:20, ngày 23 tháng 5 năm 2018 (UTC) </div> <!-- Tin nhắn của Thành viên:Lea Lacroix (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/All_Wiktionaries&oldid=18070068 --> == [[Wiktionary:Thuật ngữ toán học Anh-Việt]] == Trang [[Wiktionary:Thuật ngữ toán học Anh-Việt]] có thật sự thuộc về không gian tên Wiktionary, và quan trọng hơn, nó có thuộc về Wiktionary không ? Tôi nghĩ chỉ cần có bài riêng cho mỗi từ và hai thể loại "Thuật ngữ toán học tiếng Anh" và "Thuật ngữ toán học tiếng Việt" là đủ. [[Thành viên:Huỳnh Nhân-thập|'''<tt><span style="color:#4169e1;">jan Win</span></tt>''']] ([[Thảo luận Thành viên:Huỳnh Nhân-thập|thảo luận]]) 05:11, ngày 24 tháng 5 năm 2018 (UTC) == Update on page issues on mobile web == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> '''Update on page issues on mobile web''' {{int:please-translate}} Hi everyone. The [[mw:Reading/Web/Team|Readers web team]] has recently begun working on exposing issue templates on the mobile website. Currently, details about issues with page content are generally hidden on the mobile website. This leaves readers unaware of the reliability of the pages they are reading. The goal of this project is to improve awareness of particular issues within an article on the mobile web. We will do this by changing the visual styling of page issues. So far, we have [[mw:Reading/Web/Projects/Mobile Page Issues|drafted a proposal on the design and implementation]] of the project. We were also able to run [[mw:Reading/Web/Projects/Mobile Page Issues/Research Results|user testing on the proposed designs]]. The tests so far have positive results. Here is a quick summary of what we learned: * The new treatment increases awareness of page issues among participants. This is true particularly when they are in a more evaluative/critical mode. * Page issues make sense to readers and they understand how they work * Readers care about page issues and consider them important * Readers had overwhelmingly positive sentiments towards Wikipedia associated with learning about page issues Our next step would be to start implementing these changes. We wanted to reach out to you for any concerns, thoughts, and suggestions you might have before beginning development. Please [[mw:Reading/Web/Projects/Mobile Page Issues|visit the project page]] where we have more information and mockups of how this may look. Please [[mw:Talk:Reading/Web/Projects/Mobile Page Issues|leave feedback on the talk page]]. </div> [[m:User:CKoerner (WMF)|CKoerner (WMF)]] ([[m:User talk:CKoerner (WMF)|talk]]) 20:58, ngày 12 tháng 6 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:CKoerner (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:CKoerner_(WMF)/Sandbox&oldid=18120916 --> == LƯU Ý: Đánh giá hoạt động của bảo quản viên == Xin chào. Một quy định liên quan đến việc tước "quyền cao cấp" (bảo quản viên, hành chính viên, v.v.) đã được [[:m:Requests for comment/Activity levels of advanced administrative rights holders|cộng đồng toàn cầu thống nhất]] thông qua vào năm 2013. Theo quy định này, [[:m:stewards|các tiếp viên]] đang xem xét hoạt động của các bảo quản viên trên toàn bộ các wiki của Wikimedia Foundation hiện chưa có quy định riêng cho việc này. Điều này có nghĩa là các tiếp viên sẽ xử lý theo quy trình [[:m:Admin activity review|xem xét hoạt động của bảo quản viên]]. Chúng tôi đã xác định các thành viên sau đây có đủ điều kiện để xem là không hoạt động (không có sửa đổi và không có tác vụ nhật trình trong hơn 2 năm): #Magicknight94 (bảo quản viên) Những thành viên trên sẽ sớm nhận được thông báo, yêu cầu họ mở một thảo luận cộng đồng xem họ có muốn giữ lại một số hoặc toàn bộ các quyền của mình hay không. Nếu thành viên không hồi đáp, các quyền cao cấp của họ sẽ bị các tiếp viên tước đi. Nhưng mà cộng đồng wiki của bạn cũng có thể đã có quy định về người cầm quyền không hoạt động này mà chúng tôi không tìm tháy, hoặc đã tạo ra quá trình đánh giá hoạt động, hoặc làm quyết định khác về người này. Nếu vậy thì xin báo [[:meta:Stewards' noticeboard|người tiếp viên trên Meta-Wiki]] để cho chúng tôi biết mình không cần làm đánh giá trên wiki của bạn. Cám ơn, [[Thành viên:علاء|علاء]] ([[Thảo luận Thành viên:علاء|thảo luận]]) 07:17, ngày 1 tháng 7 năm 2018 (UTC) == Global preferences are available == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> Global preferences are now available, you can set them by visiting your new [[Special:GlobalPreferences|global preferences page]]. Visit [[mw:Help:Extension:GlobalPreferences|mediawiki.org for information on how to use them]] and [[mw:Help talk:Extension:GlobalPreferences|leave feedback]]. -- [[User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) </div> 19:20, ngày 10 tháng 7 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:Keegan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=17968247 --> == New user group for editing sitewide CSS / JS == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> ''({{int:please-translate}})'' Hi all! To improve the security of our readers and editors, permission handling for CSS/JS pages has changed. (These are pages like <code dir="ltr">MediaWiki:Common.css</code> and <code dir="ltr">MediaWiki:Vector.js</code> which contain code that is executed in the browsers of users of the site.) A new user group, <code dir="ltr">[[m:Special:MyLanguage/Interface administrators|interface-admin]]</code>, has been created. Starting four weeks from now, only members of this group will be able edit CSS/JS pages that they do not own (that is, any page ending with <code dir="ltr">.css</code> or <code dir="ltr">.js</code> that is either in the <code dir="ltr">MediaWiki:</code> namespace or is another user's user subpage). You can learn more about the motivation behind the change [[m:Special:MyLanguage/Creation of separate user group for editing sitewide CSS/JS|here]]. Please add users who need to edit CSS/JS to the new group (this can be done the same way new administrators are added, by stewards or local bureaucrats). This is a dangerous permission; a malicious user or a hacker taking over the account of a careless interface-admin can abuse it in far worse ways than admin permissions could be abused. Please only assign it to users who need it, who are trusted by the community, and who follow common basic password and computer security practices (use strong passwords, do not reuse passwords, use two-factor authentication if possible, do not install software of questionable origin on your machine, use antivirus software if that's a standard thing in your environment). Thanks! <br/><span dir="ltr">[[m:User:Tgr|Tgr]] ([[m:User talk:Tgr|talk]]) 17:45, ngày 30 tháng 7 năm 2018 (UTC) <small>(via [[m:Special:MyLanguage/Global_message_delivery|global message delivery]])</small></span> </div> <!-- Tin nhắn của Thành viên:Tgr@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Tgr/massmessage-T139380-ifadmin&oldid=18255968 --> == Wiktionary Cognate Dashboard == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> [[File:Screenshot of Hubs on Wiktionary Cognate Dashboard.png|thumb|Screenshot of the Hub view]] ''Sorry for writing this message in English. Feel free to help translate it below.'' Hello all, A few months ago, we asked you for feedback about [[d:Wikidata:Wiktionary/Sitelinks|Cognate]], the system allowing interwikilinks between Wiktionaries (on main namespace). Several community members gave some suggestions, one of them was to provide statistics about these interwikilinks. The Wikidata team is pleased to present you the '''[https://wdcm.wmflabs.org/Wiktionary_CognateDashboard/ Wiktionary Cognate Dashboard]''', a website presenting a lot of interesting information about how Wiktionaries are connected to each others. You can find there, for example: * the most interlinked Wiktionary entries not having a page on your Wiktionary * the number of interlinks between each possible pair of Wiktionaries * visualizations of the relationships between different Wiktionaries To learn more about the tool, you can have a look at [[m:Wiktionary Cognate Dashboard|the documentation]] (please help us translating it in your language!). The interface of the tool itself can also be translated in other languages by [[m:Wiktionary Cognate Dashboard/Interface|using this page]]. If you find a bug, please let a comment on [[phab:T166487|this Phabricator task]] or ping me onwiki. Thanks a lot, [[:d:User:Lea Lacroix (WMDE)|Lea Lacroix (WMDE)]] 13:08, ngày 14 tháng 8 năm 2018 (UTC) </div> <!-- Tin nhắn của Thành viên:Lea Lacroix (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery/Wiktionary&oldid=18299586 --> == Editing of sitewide CSS/JS is only possible for interface administrators from now == ''({{int:please-translate}})'' <div lang="en" dir="ltr" class="mw-content-ltr"> Hi all, as [[m:Special:MyLanguage/Creation of separate user group for editing sitewide CSS/JS/announcement 2|announced previously]], permission handling for CSS/JS pages has changed: only members of the <code>[[m:Special:MyLanguage/Interface administrators|interface-admin]]</code> ({{int:group-interface-admin}}) group, and a few highly privileged global groups such as stewards, can edit CSS/JS pages that they do not own (that is, any page ending with .css or .js that is either in the MediaWiki: namespace or is another user's user subpage). This is done to improve the security of readers and editors of Wikimedia projects. More information is available at [[m:Special:MyLanguage/Creation of separate user group for editing sitewide CSS/JS|Creation of separate user group for editing sitewide CSS/JS]]. If you encounter any unexpected problems, please contact me or file a bug. Thanks!<br /> [[m:User:Tgr|Tgr]] ([[m:User talk:Tgr|talk]]) 12:40, ngày 27 tháng 8 năm 2018 (UTC) <small>(via [[m:Special:MyLanguage/Global_message_delivery|global message delivery]])</small> </div> <!-- Tin nhắn của Thành viên:Tgr@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18258712 --> == Read-only mode for up to an hour on 12 September and 10 October == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> [[:m:Special:MyLanguage/Tech/Server switch 2018|Read this message in another language]] • {{int:please-translate}} The [[foundation:|Wikimedia Foundation]] will be testing its secondary data centre. This will make sure that Wikipedia and the other Wikimedia wikis can stay online even after a disaster. To make sure everything is working, the Wikimedia Technology department needs to do a planned test. This test will show if they can reliably switch from one data centre to the other. It requires many teams to prepare for the test and to be available to fix any unexpected problems. They will switch all traffic to the secondary data center on '''Wednesday, 12 September 2018'''. On '''Wednesday, 10 October 2018''', they will switch back to the primary data center. Unfortunately, because of some limitations in [[mw:Manual:What is MediaWiki?|MediaWiki]], all editing must stop when we switch. We apologize for this disruption, and we are working to minimize it in the future. '''You will be able to read, but not edit, all wikis for a short period of time.''' *You will not be able to edit for up to an hour on Wednesday, 12 September and Wednesday, 10 October. The test will start at [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20170503T14 14:00 UTC] (15:00 BST, 16:00 CEST, 10:00 EDT, 07:00 PDT, 23:00 JST, and in New Zealand at 02:00 NZST on Thursday 13 September and Thursday 11 October). *If you try to edit or save during these times, you will see an error message. We hope that no edits will be lost during these minutes, but we can't guarantee it. If you see the error message, then please wait until everything is back to normal. Then you should be able to save your edit. But, we recommend that you make a copy of your changes first, just in case. ''Other effects'': *Background jobs will be slower and some may be dropped. Red links might not be updated as quickly as normal. If you create an article that is already linked somewhere else, the link will stay red longer than usual. Some long-running scripts will have to be stopped. *There will be code freezes for the weeks of 10 September 2018 and 8 October 2018. Non-essential code deployments will not happen. This project may be postponed if necessary. You can [[wikitech:Switch Datacenter#Schedule for 2018 switch|read the schedule at wikitech.wikimedia.org]]. Any changes will be announced in the schedule. There will be more notifications about this. '''Please share this information with your community.''' /<span dir=ltr>[[m:User:Johan (WMF)|User:Johan(WMF)]] ([[m:User talk:Johan (WMF)|talk]])</span> </div></div> 13:33, ngày 6 tháng 9 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18333489 --> == Change coming to how certain templates will appear on the mobile web == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> '''Change coming to how certain templates will appear on the mobile web''' {{int:please-translate}} [[File:Page_issues_-_mobile_banner_example.jpg|thumb|Example of improvements]] Hello, In a few weeks the Readers web team will be changing how some templates look on the mobile web site. We will make these templates more noticeable when viewing the article. We ask for your help in updating any templates that don't look correct. What kind of templates? Specifically templates that notify readers and contributors about issues with the content of an article – the text and information in the article. Examples like [[wikidata:Q5962027|Template:Unreferenced]] or [[Wikidata:Q5619503|Template:More citations needed]]. Right now these notifications are hidden behind a link under the title of an article. We will format templates like these (mostly those that use Template:Ambox or message box templates in general) to show a short summary under the page title. You can tap on the "Learn more" link to get more information. For template editors we have [[mw:Recommendations_for_mobile_friendly_articles_on_Wikimedia_wikis#Making_page_issues_(ambox_templates)_mobile_friendly|some recommendations on how to make templates that are mobile-friendly]] and also further [[mw:Reading/Web/Projects/Mobile_Page_Issues|documentation on our work so far]]. If you have questions about formatting templates for mobile, [[mw:Talk:Reading/Web/Projects/Mobile_Page_Issues|please leave a note on the project talk page]] or [https://phabricator.wikimedia.org/maniphest/task/edit/form/1/?projects=Readers-Web-Backlog file a task in Phabricator] and we will help you. {{Int:Feedback-thanks-title}} </div> [[m:User:CKoerner (WMF)|CKoerner (WMF)]] ([[m:User talk:CKoerner (WMF)|talk]]) 19:35, ngày 13 tháng 11 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:CKoerner (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18543269 --> == Advanced Search == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> [[m:WMDE_Technical_Wishes/AdvancedSearch|Advanced Search]] will become a default feature on your wiki on November 28. This new interface allows you to perform specialized searches on the [[Special:Search|search page]], even if you don’t know any [[mw:Special:MyLanguage/Help:CirrusSearch|search syntax]]. Advanced Search originates from the [[m:WMDE_Technical_Wishes|German Community’s Technical Wishes project]]. It's already a default feature on German, Arabic, Farsi and Hungarian Wikipedia. Besides, more than 40.000 users across all wikis have tested the beta version. Feedback is welcome on the [[mw:Help talk:Extension:AdvancedSearch|central feedback page]].</div> [[m:User:Johanna Strodt (WMDE)|Johanna Strodt (WMDE)]] ([[m:User talk:Johanna Strodt (WMDE)|talk]]) 11:03, ngày 26 tháng 11 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:Johanna Strodt (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_2&oldid=18363910 --> == Quan tâm đến một biên tập viên dịch thuật cho dự án của bạn? == Xin chào, xin lỗi vì người Việt xấu của tôi. Như bạn có thể biết, có một tiện ích cho phép thêm bản dịch vào các dự án Wiktionary rất dễ dàng. Tiện ích này đã tồn tại trên một vài dự án ([https://en.wiktionary.org/wiki/life#Translations en.wikt], [https://fr.wiktionary.org/wiki/vie#Traductions fr.wikt] , v.v.) [[:sv:User:Skalman|Skalman]] và tôi đang xem xét việc tạo một tiện ích phù hợp với nhiều dự án wiki khác nhau, kể cả các dự án của bạn. Tôi có một vài câu hỏi cho bạn: # Bạn có quan tâm đến một công cụ như vậy không? # Có ai (tốt nhất là một sysop) sẽ hợp tác để thực hiện một tiện ích như vậy không? Mong muốn được nghe từ bạn, - [[Thành viên:Automatik|Automatik]] ([[Thảo luận Thành viên:Automatik|thảo luận]]) 21:44, ngày 2 tháng 12 năm 2018 (UTC) {| class="wikitable mw-collapsible mw-collapsed" style="width: 100%;" ! Original message in English |- | Interested by a translation editor for your project? Hello, Sorry for my bad Vietnamese. As you may know, there exists a gadget that allows to add translation to Wiktionary projects very easily. This gadget already exists on a few projects ([https://en.wiktionary.org/wiki/life#Translations en.wikt], [https://fr.wiktionary.org/wiki/vie#Traductions fr.wikt], etc.). [[:sv:User:Skalman|Skalman]] and I are considering creating a gadget that would be suitable to various wiktionary projects, including yours. I have a few questions for you: # Would you be interested in such a tool? # Is there anyone (preferably a sysop) that would be up to cooperate for the implementation of such a gadget? Looking forward to hearing from you, --[[Thành viên:Automatik|Automatik]] ([[Thảo luận Thành viên:Automatik|thảo luận]]) 21:44, ngày 2 tháng 12 năm 2018 (UTC) |} == New Wikimedia password policy and requirements == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"> Quy định và những yêu cầu mới về mật khẩu tại Wikimedia Nhóm bảo mật của Quỹ Wikimedia đang hiện thực [[m:Password policy|quy định và những yêu cầu mới về mật khẩu]]. [[mw:Wikimedia_Security_Team/Password_strengthening_2019|Bạn có thể tìm hiểu thêm về dự án tại MediaWiki.org]]. Những yêu cầu bắt buộc này sẽ áp dụng cho những tài khoản mới và những tài khoản được cấp quyền đặc biệt. Những tài khoản mới sẽ được yêu cầu phải tạo mật khẩu có chiều dài tối thiểu là 8 ký tự. Những tài khoản được cấp quyền đặc biệt sẽ được yêu cầu tạo một mật khẩu mới có chiều dài tối thiểu 10 ký tự. Những thay đổi này dự kiến sẽ áp dụng vào ngày 13 tháng 12. Nếu bạn cho rằng công việc hoặc công cụ của bạn sẽ bị ảnh hưởng bởi thay đổi này, vui lòng báo cho chúng tôi tại [[mw:Talk:Wikimedia_Security_Team/Password_strengthening_2019|trang thảo luận]]. {{Int:Feedback-thanks-title}} </div> [[m:User:CKoerner (WMF)|CKoerner (WMF)]] ([[m:User talk:CKoerner (WMF)|talk]]) 20:03, ngày 6 tháng 12 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:CKoerner (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18639017 --> == Selection of the Tremendous Wiktionary User Group representative to the Wikimedia Summit 2019 == Dear all, Sorry for posting this message in English and last minute notification. The [[:m:Tremendous Wiktionary User Group|Tremendous Wiktionary User Group]] could send one representative to the [[:m:Wikimedia Summit 2019|Wikimedia Summit 2019]] (formerly "Wikimedia Conference"). The Wikimedia Summit is an yearly conference of all organizations affiliated to the Wikimedia Movement (including our Tremendous Wiktionary User Group). It is a great place to talk about Wiktionary needs to the chapters and other user groups that compose the Wikimedia movement. For context, there is a [[:m:Wikimedia Conference 2018/Further reports/Tremendous Wiktionary User Group|short report on what happened last year]]. The deadline is very close to 24 hrs. The last date for registration is 17 December 2018. As a last minute effort, there is a '''[[:m:Tremendous Wiktionary User Group/Wikimedia Summit 2019|page on meta to decide who will be the representative of the user group to the Wikimedia Summit]]''' created. Please feel free to ask any question on the [https://lists.wikimedia.org/mailman/listinfo/wiktionary-l wiktionary-l] mailing list or on the [[:m:Talk:Wiktionary/Tremendous Wiktionary User Group|talk page]]. For the [[:m:Tremendous Wiktionary User Group|Tremendous Wiktionary User Group]], -- [[User:Balajijagadesh|Balajijagadesh]] 05:56, ngày 16 tháng 12 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:KCVelaga@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery/Wiktionary&oldid=18299588 --> == Invitation from Wiki Loves Love 2019 == <div lang="en" dir="ltr" class="mw-content-ltr"> {{int:please-translate}} [[File:WLL Subtitled Logo (transparent).svg|right|frameless]] Love is an important subject for humanity and it is expressed in different cultures and regions in different ways across the world through different gestures, ceremonies, festivals and to document expression of this rich and beautiful emotion, we need your help so we can share and spread the depth of cultures that each region has, the best of how people of that region, celebrate love. [[:c:Commons:Wiki Loves Love|Wiki Loves Love (WLL)]] is an international photography competition of Wikimedia Commons with the subject love testimonials happening in the month of February. The primary goal of the competition is to document love testimonials through human cultural diversity such as monuments, ceremonies, snapshot of tender gesture, and miscellaneous objects used as symbol of love; to illustrate articles in the worldwide free encyclopedia Wikipedia, and other Wikimedia Foundation (WMF) projects. The theme of 2019 iteration is '''''Celebrations, Festivals, Ceremonies and rituals of love.''''' Sign up your affiliate or individually at [[:c:Commons:Wiki Loves Love 2019/Participants|Participants]] page. To know more about the contest, check out our [[:c:Commons:Wiki Loves Love 2019|Commons Page]] and [[:c:Commons:Wiki Loves Love 2018/FAQ|FAQs]] There are several prizes to grab. Hope to see you spreading love this February with Wiki Loves Love! Kind regards, [[:c:Commons:Wiki Loves Love 2018/International Team|Wiki Loves Love Team]] Imagine... the sum of all love! </div> --[[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 10:13, ngày 27 tháng 12 năm 2018 (UTC) <!-- Tin nhắn của Thành viên:Tiven2240@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18639017 --> == FileExporter beta feature == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> [[File:Logo for FileExporter.svg|thumb|Coming soon: the beta feature [[m:WMDE_Technical_Wishes/Move_files_to_Commons|FileExporter]]]] A new beta feature will soon be released on all wikis: The [[m:WMDE_Technical_Wishes/Move_files_to_Commons|FileExporter]]. It allows exports of files from a local wiki to Wikimedia Commons, including their file history and page history. Which files can be exported is defined by each wiki's community: '''Please check your wiki's [[m:WMDE_Technical_Wishes/Move_files_to_Commons/Configuration file documentation|configuration file]]''' if you want to use this feature. The FileExporter has already been a beta feature on [https://www.mediawiki.org mediawiki.org], [https://meta.wikimedia.org meta.wikimedia], deWP, faWP, arWP, koWP and on [https://wikisource.org wikisource.org]. After some functionality was added, it's now becoming a beta feature on all wikis. Deployment is planned for January 16. More information can be found [[m:WMDE_Technical_Wishes/Move_files_to_Commons|on the project page]]. As always, feedback is highly appreciated. If you want to test the FileExporter, please activate it in your [[Special:Preferences#mw-prefsection-betafeatures|user preferences]]. The best place for feedback is the [[mw:Help_talk:Extension:FileImporter|central talk page]]. Thank you from Wikimedia Deutschland's [[m:WMDE Technical Wishes|Technical Wishes project]]. </div> [[User:Johanna Strodt (WMDE)|Johanna Strodt (WMDE)]] 09:41, ngày 14 tháng 1 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johanna Strodt (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=18782700 --> == No editing for 30 minutes on 17 January == <div lang="en" dir="ltr" class="mw-content-ltr">You will '''not be able to edit''' the wikis for up to 30 minutes on '''[https://www.timeanddate.com/worldclock/fixedtime.html?iso=20190117T07 17 January 07:00 UTC]'''. This is because of a database problem that has to be fixed immediately. You can still read the wikis. Some wikis are not affected. They don't get this message. You can see which wikis are '''not''' affected [[:m:User:Johan (WMF)/201901ReadOnlyPage|on this page]]. Most wikis are affected. The time you can not edit might be shorter than 30 minutes. /[[User:Johan (WMF)|Johan (WMF)]]</div> 18:55, ngày 16 tháng 1 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/201901ReadOnly/Targets8&oldid=18789240 --> == Talk to us about talking == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> [[File:OOjs_UI_icon_speechBubbles-rtl.svg|alt="icon depicting two speech Bubbles"|frameless|right|120px]] The Wikimedia Foundation is planning a [[mw:Talk pages consultation 2019|global consultation about communication]]. The goal is to bring Wikimedians and wiki-minded people together to improve tools for communication. We want all contributors to be able to talk to each other on the wikis, whatever their experience, their skills or their devices. We are looking for input from as many different parts of the Wikimedia community as possible. It will come from multiple projects, in multiple languages, and with multiple perspectives. We are currently planning the consultation. We need your help. '''We need volunteers to help talk to their communities or user groups.''' You can help by hosting a discussion at your wiki. Here's what to do: # First, [[mw:Talk pages consultation 2019/Participant group sign-up|sign up your group here.]] # Next, create a page (or a section on a Village pump, or an e-mail thread – whatever is natural for your group) to collect information from other people in your group. This is not a vote or decision-making discussion: we are just collecting feedback. # Then ask people what they think about communication processes. We want to hear stories and other information about how people communicate with each other on and off wiki. Please consider asking these five questions: ## When you want to discuss a topic with your community, what tools work for you, and what problems block you? ## What about talk pages works for newcomers, and what blocks them? ## What do others struggle with in your community about talk pages? ## What do you wish you could do on talk pages, but can't due to the technical limitations? ## What are the important aspects of a "wiki discussion"? # Finally, please go to [[mw:Talk:Talk pages consultation 2019|Talk pages consultation 2019 on Mediawiki.org]] and report what you learned from your group. Please include links if the discussion is available to the public. '''You can also help build the list of the many different ways people talk to each other.''' Not all groups active on wikis or around wikis use the same way to discuss things: it can happen on wiki, on social networks, through external tools... Tell us [[mw:Talk pages consultation 2019/Tools in use|how your group communicates]]. You can read more about [[mw:Talk pages consultation 2019|the overall process]] on mediawiki.org. If you have questions or ideas, you can [[mw:Talk:Talk pages consultation 2019|leave feedback about the consultation process]] in the language you prefer. Thank you! We're looking forward to talking with you. </div> [[user:Trizek (WMF)|Trizek (WMF)]] 15:01, ngày 21 tháng 2 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18639017 --> == Read-only mode for up to 30 minutes on 11 April == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"><div class="plainlinks"> <div lang="en" dir="ltr" class="mw-content-ltr">Bạn sẽ '''không thể sửa đổi''' phần lớn các wiki của Wikimedia trong khoảng tối đa là 30 phút vào '''[https://www.timeanddate.com/worldclock/fixedtime.html?iso=20190411T05 11 tháng 4 lúc 05:00 UTC]''' vì sự cố về máy móc. Bạn vẫn có thể đọc các wiki. Bạn [[phab:T220080|có thể xem những wiki bị ảnh hưởng]]. Thời gian không được sửa đổi có thể ngắn hơn 30 phút. /[[User:Johan (WMF)|Johan (WMF)]]</div></div></div> 10:56, ngày 8 tháng 4 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18979889 --> == Wikimedia Foundation Medium-Term Plan feedback request == {{int:please-translate}} <div lang="en" dir="ltr" class="mw-content-ltr">The Wikimedia Foundation has published a [[m:Special:MyLanguage/Wikimedia_Foundation_Medium-term_plan_2019|Medium-Term Plan proposal]] covering the next 3–5 years. We want your feedback! Please leave all comments and questions, in any language, on [[m:Talk:Wikimedia_Foundation_Medium-term_plan_2019|the talk page]], by April 20. {{Int:Feedback-thanks-title}} [[m:User:Quiddity (WMF)|Quiddity (WMF)]] ([[m:User talk:Quiddity (WMF)|talk]]) 17:35, ngày 12 tháng 4 năm 2019 (UTC)</div> <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=18998727 --> == Update on the consultation about office actions == Hello all, Last month, the Wikimedia Foundation's Trust & Safety team [[:en:Wikipedia:Village_pump_(policy)/Archive_152#Announcement_of_forthcoming_temporary_and_partial_ban_tool_consultation|announced]] a future consultation about partial and/or temporary [[m:Special:MyLanguage/office actions|office actions]]. We want to let you know that the '''draft version''' of this consultation has now been [[:m:Office_actions/Community_consultation_on_partial_and_temporary_office_actions/draft|posted on Meta]]. This is a '''draft'''. It is not intended to be the consultation itself, which will be posted on Meta likely in early September. Please do not treat this draft as a consultation. Instead, we ask your assistance in forming the final language for the consultation. For that end, we would like your input over the next couple of weeks about what questions the consultation should ask about partial and temporary Foundation office action bans and how it should be formatted. '''[[:m:Talk:Office_actions/Community_consultation_on_partial_and_temporary_office_actions/draft|Please post it on the draft talk page]]'''. Our goal is to provide space for the community to discuss all the aspects of these office actions that need to be discussed, and we want to ensure with your feedback that the consultation is presented in the best way to encourage frank and constructive conversation. Please visit [[:m:Office_actions/Community_consultation_on_partial_and_temporary_office_actions/draft|the consultation draft on Meta-wiki]] and leave your comments on the draft’s talk page about what the consultation should look like and what questions it should ask. Thank you for your input! -- The [[m:Special:MyLanguage/Trust and Safety|Trust & Safety team]] 08:03, ngày 16 tháng 8 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=19175143 --> == New tools and IP masking == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> <div lang="en" dir="ltr" class="mw-content-ltr"> Hey everyone, The Wikimedia Foundation wants to work on two things that affect how we patrol changes and handle vandalism and harassment. We want to make the tools that are used to handle bad edits better. We also want to get better privacy for unregistered users so their IP addresses are no longer shown to everyone in the world. We would not hide IP addresses until we have better tools for patrolling. We have an idea of what tools ''could'' be working better and how a more limited access to IP addresses would change things, but we need to hear from more wikis. You can read more about the project [[m:IP Editing: Privacy Enhancement and Abuse Mitigation|on Meta]] and [[m:Talk:IP Editing: Privacy Enhancement and Abuse Mitigation|post comments and feedback]]. Now is when we need to hear from you to be able to give you better tools to handle vandalism, spam and harassment. You can post in your language if you can't write in English. [[User:Johan (WMF)|Johan (WMF)]]</div></div></div> 14:19, ngày 21 tháng 8 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tools_and_IP_message/Distribution&oldid=19315232 --> == The consultation on partial and temporary Foundation bans just started == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> <div class="plainlinks"> Hello, In a [[:en:Wikipedia:Community_response_to_the_Wikimedia_Foundation%27s_ban_of_Fram/Official_statements#Board_statement|recent statement]], the Wikimedia Foundation Board of Trustees [[:en:Wikipedia:Community_response_to_the_Wikimedia_Foundation%27s_ban_of_Fram/Official_statements#Board_statement|requested that staff hold a consultation]] to "re-evaluat[e] or add community input to the two new office action policy tools (temporary and partial Foundation bans)". Accordingly, the Foundation's Trust & Safety team invites all Wikimedians [[:m:Office actions/Community consultation on partial and temporary office actions/09 2019|to join this consultation and give their feedback]] from 30 September to 30 October. How can you help? * Suggest how partial and temporary Foundation bans should be used, if they should (eg: On all projects, or only on a subset); * Give ideas about how partial and temporary Foundation bans should ideally implemented, if they should be; and/or * Propose changes to the existing Office Actions policy on partial and temporary bans. We offer our thanks in advance for your contributions, and we hope to get as much input as possible from community members during this consultation! </div> </div>-- [[user:Kbrown (WMF)|Kbrown (WMF)]] 17:14, ngày 30 tháng 9 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=19302497 --> == Feedback wanted on Desktop Improvements project == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"> {{int:Hello}}. Nhóm Readers Web tại Quỹ Wikimedia sẽ chú trọng vào việc [[mw:Special:MyLanguage/Reading/Web/Desktop Improvements|cải thiện giao diện máy tính để bàn]] trong thời gian vài năm, nhằm mục đích tăng khả năng sử dụng mà không xóa chức năng nào. Các nỗ lực của người tình nguyện gây cảm hứng cho chúng tôi nhưng cho đến nay chỉ có thể tạo ra các tiện ích và kịch bản địa phương, bản đề nghị, và giao diện (''skin'') tùy chỉnh. Chúng tôi muốn bắt đầu quá trình mang một số thay đổi nào vào trải nghiệm mặc định tại tất cả các dự án Wikimedia. Chúng tôi hiện tại đang nghiên cứu cho dự án này và kêu gọi các ý kiến cải thiện và phản hồi về các đề nghị và mô hình hiện tại. Cho đến này, chúng tôi đã phỏng vấn thành viên cộng đồng tại Wikimania. Chúng tôi đã biên soạn danh sách các nỗ lực của tình nguyện và Quỹ Wikimedia về điều này. Chúng tôi đang tìm cách thực hiện các thay đổi được gợi ý. Chúng tôi mời các bạn phản hồi ý kiến về các điều sau: * Nhận ra các điểm trọng tâm cho dự án mà chúng tôi chưa nghĩ đến. * Mở rộng danh sách tiện ích và kịch bản người dùng có liên quan đến cải thiện giao diện trên máy tính để bàn. Nếu bạn biết đến tiện ích hoặc kịch bản nào có ích, xin cho chúng tôi biết. * Phản hồi về các đề nghị và mô hình chúng tôi đã biên soạn cho đến nay. Chúng tôi cũng muốn biên soạn danh sách các wiki muốn thử nghiệm các thay đổi của dự án này. Lúc khi chúng tôi sẵn sàng bắt đầu xây dựng, các wiki này sẽ có quyền truy cập các thay đổi trước các wiki kia. Khi nào gửi phản hồi, xin hãy nhớ các mục đích của dự án: * Làm cho người đọc dễ tập trung sự chú ý vào nội dung * Cho phép truy cập các tác vụ hằng ngày một cách tiện hơn (ví dụ tìm kiếm, thay đổi ngôn ngữ, sửa đổi) * Sắp xếp mọi tính năng vào nơi hợp lý có ích * Thống nhất giao diện với các nền tảng khác – Web di động và ứng dụng di động * Loại trừ lộn xộn * Sửa soạn mai mốt phát triển Cũng như các ràng buộc sau: * Không nghịch ngợm với nội dung: chúng tôi sẽ không lo lắng về các bản mẫu định kiểu hoặc cấu trúc nội dung trang * Không loại trừ chức năng nào: các chức năng có thể di chuyển, nhưng tất cả các mục chuyển hướng và chức năng mặc định sẽ còn lại * Không thay đổi bố cục quá mức: chúng tôi có phương pháp tiến hóa đối với các thay đổi và muốn những người đọc và sửa đổi tiếp tục cảm thấy quen thuộc với trang Xin hãy gửi ý kiến nào đó (trong ngôn ngữ nào đó) tại [[mw:Talk:Reading/Web/Desktop Improvements|mw:Talk:Reading/Web/Desktop Improvements]] Sau khi vòng phản hồi này, chúng tôi định xây dựng mô hình các thay đổi gợi ý dựa trên các ý kiến phản hồi chúng tôi nhận được. Chúng tôi sẽ liên lạc với các bạn lần nữa sau đây để yêu cầu phản hồi về mô hình này. {{Int:Feedback-thanks-title}} [[mw:User:Quiddity (WMF)|Quiddity (WMF)]] ([[mw:User talk:Quiddity (WMF)|talk]]) </div> 07:15, ngày 16 tháng 10 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Quiddity_(WMF)/Global_message_delivery_split_2&oldid=19462801 --> == [[m:Special:MyLanguage/Tech/News/2019/44|Tech News: 2019-44]] == <section begin="technews-2019-W44"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/44|Translations]] are available. '''Recent changes''' * You can post proposals for the [[m:Special:MyLanguage/Community Wishlist Survey 2020|Community Wishlist Survey]]. The survey decides what the [[m:Community Tech|Community Tech team]] will work on. You can post proposals until 11 November. You can vote on proposals from 20 November to 2 December. This year the wishlist will focus on Wikibooks, Wiktionary, Wikiquote, Wikisource, Wikiversity, Wikispecies, Wikivoyage and Wikinews. You can [[m:Special:MyLanguage/Community Wishlist Survey 2020#newformat|read more]] about the format for this year. * Mobile users now have a specific design for their Watchlist. [https://phabricator.wikimedia.org/T225127][https://phabricator.wikimedia.org/T235414] * You can share feedback and ideas on the [[mw:Special:MyLanguage/Reading/Web/Desktop Improvements|Desktop Improvements]] project. The goal is to make the interface easier to use for readers and editors without removing any functionality. The Foundation's Readers Web team will work on this over the next two years. * [[File:Octicons-tools.svg|15px|link=|Advanced item]] [[mw:Special:MyLanguage/OOUI|OOUI]] now allows using <code>px</code> (pixels) instead of <code>em</code> ([[:w:en:Em (typography)|em]]) for some specific cases. [https://lists.wikimedia.org/pipermail/design/2019-October/002646.html][https://phabricator.wikimedia.org/T220671] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.4|new version]] of MediaWiki will be on test wikis and MediaWiki.org from {{#time:j xg|2019-10-29|{{PAGELANGUAGE}}}}. It will be on non-Wikipedia wikis and some Wikipedias from {{#time:j xg|2019-10-30|{{PAGELANGUAGE}}}}. It will be on all wikis from {{#time:j xg|2019-10-31|{{PAGELANGUAGE}}}} ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191030T15 {{#time:j xg|2019-10-30|{{PAGELANGUAGE}}}} at 15:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''Future changes''' * There will be no software changes from 19 December to 2 January. The first MediaWiki version next year will come the week of 6 January. [https://lists.wikimedia.org/pipermail/wikitech-l/2019-October/092682.html] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Gadgets and user scripts can access variables about the current page in JavaScript. In 2015, this information was moved from global variables named <code dir=ltr>wg*</code> to <code style="white-space:nowrap;">mw.config</code>. The old global variables will be removed later this year. You can [[Phab:T72470|know more about it and tell the developers]] if you want to try this out on your wiki first. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/44|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W44"/> 16:09, ngày 28 tháng 10 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19499434 --> == [[m:Special:MyLanguage/Tech/News/2019/45|Tech News: 2019-45]] == <section begin="technews-2019-W45"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/45|Translations]] are available. '''Recent changes''' * At [[Special:Contributions|Special:Contributions]] you could see up to 5000 edits at the same time if you edited the [[:w:en:URL|URL]]. This has been lowered to 500. This is to stop requests which break the sites. [https://phabricator.wikimedia.org/T234450] '''Changes later this week''' * <code>MediaWiki:ipb-default-expiry</code> can set the default length to block a user for your wiki. You will be able to use <code>MediaWiki:ipb-default-expiry-ip</code> to set a different default block length for IP editors. [https://phabricator.wikimedia.org/T219126] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.5|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 5 November. It will be on non-Wikipedia wikis and some Wikipedias from 6 November. It will be on all wikis from 7 November ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191106T15 6 November at 15:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/45|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W45"/> 16:47, ngày 4 tháng 11 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19523120 --> == [[m:Special:MyLanguage/Tech/News/2019/46|Tech News: 2019-46]] == <section begin="technews-2019-W46"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/46|Translations]] are available. '''Recent changes''' * [https://mediawiki2latex-large.wmflabs.org MediaWiki2LaTeX] can put different pages from a Wikimedia wiki into a [[:w:en:PDF|PDF]]. It can now make a PDF with around 5000 pages. Previously this was 800 pages. '''Changes later this week''' * There is no new MediaWiki version this week. '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191113T16 13 November at 16:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''Future changes''' * Wikimedia will take part in [[:w:en:Google Code-in|Google Code-in]]. This is for young students who want to help with open source software. You can [[:mw:Google Code-in/2019|read more]]. Experienced technical Wikimedians can mentor students. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/46|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W46"/> 22:02, ngày 11 tháng 11 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19547303 --> == [[m:Special:MyLanguage/Tech/News/2019/47|Tech News: 2019-47]] == <section begin="technews-2019-W47"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/47|Translations]] are available. '''Problems''' * You will be able to read but not to edit some wikis for up to 30 minutes [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191126T06 on 26 November at 06:00 (UTC)]. You can [[phab:T238046|see which wikis]]. It will probably last much shorter than 30 minutes. This will also affect the <code>[[mw:Special:MyLanguage/Extension:CentralAuth|centralauth]]</code> database. This could for example affect changing passwords, logging in to new wikis, changing emails or [[mw:Special:MyLanguage/Help:Extension:CentralAuth/Global rename|global renames]]. [https://phabricator.wikimedia.org/T238046] '''Changes later this week''' * You can soon vote on proposals for the [[m:Special:MyLanguage/Community Wishlist Survey 2020|Community Wishlist Survey]]. The survey decides what the [[m:Community Tech|Community Tech team]] will work on. You can vote on proposals from 20 November to 2 December. This year the wishlist will focus on Wikibooks, Wiktionary, Wikiquote, Wikisource, Wikiversity, Wikispecies, Wikivoyage and Wikinews. You can [[m:Special:MyLanguage/Community Wishlist Survey 2020#newformat|read more]] about the format for this year. * There is no new MediaWiki version this week. '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191120T16 20 November at 16:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/47|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W47"/> 20:16, ngày 18 tháng 11 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19547866 --> == [[m:Special:MyLanguage/Tech/News/2019/48|Tech News: 2019-48]] == <section begin="technews-2019-W48"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/48|Translations]] are available. '''Changes later this week''' * The mobile beta mode will be disabled to have less maintenance. The developers will focus on the [[mw:Reading/Web/Desktop Improvements|desktop improvements]] project. You can turn on [[mw:Reading/Web/Advanced mobile contributions|advanced mobile contributions mode]] if you want to see the categories. You could also jump back to the top. This can instead be done with a [[w:en:User:Jdlrobson/scripts/backtotop.js|gadget or user script]]. [https://phabricator.wikimedia.org/T237290] * [[:mw:Parsoid|Parsoid]] is software we use for the visual editor, content translation, Flow and the Android app. This has been rewritten. It will come to the wikis gradually over the next two weeks. It has been tested, but there could be some diffs or previews that don't look right. If you see any you can [[phab:T229015|report them]]. [https://phabricator.wikimedia.org/T229015] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.8|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 26 November. It will be on the other wikis next week ([[mw:MediaWiki 1.35/Roadmap|calendar]]). This is because of holidays. '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191127T16 27 November at 16:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''Future changes''' * You will switch between the article and the talk page in a new way in the mobile view in the future. It will use tabs. This is more like in the desktop view. [https://phabricator.wikimedia.org/T230695] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/48|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W48"/> 16:51, ngày 25 tháng 11 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19547866 --> == [[m:Special:MyLanguage/Tech/News/2019/49|Tech News: 2019-49]] == <section begin="technews-2019-W49"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/49|Translations]] are available. '''Recent changes''' * [[:m:Special:MyLanguage/Mix'n'match|Mix'n'match]] is a tool to connect Wikidata items to information in other databases. It can be used to find subjects that are missing in a Wikipedia. It now has more than 3000 datasets. Before it was closer to 2000. '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.8|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 3 December. It will be on non-Wikipedia wikis and some Wikipedias from 4 December. It will be on all wikis from 5 December ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191204T16 4 December at 16:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''Future changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] There will be a new schema for [https://dumps.wikimedia.org/ XML dumps]. Scripts and apps that use them will need to be updated. If they are not updated they will no longer work. [https://phabricator.wikimedia.org/T238972] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] The <code><nowiki>{{REVISIONID}}</nowiki></code> magic word will no longer work in the content namespaces. This is for performance reasons. When you preview a page it returns <code>""</code> (empty string). When you read a page it returns <code>"-"</code> (dash). In the future this will also affect other namespaces. The next ones are file and category namespaces. [https://phabricator.wikimedia.org/T235957] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/49|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W49"/> 16:58, ngày 2 tháng 12 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19547866 --> == [[m:Special:MyLanguage/Tech/News/2019/50|Tech News: 2019-50]] == <section begin="technews-2019-W50"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2019/50|Translations]] are available. '''Recent changes''' * Wikimedia projects use [https://translatewiki.net/ Translatewiki] to translate the wiki interface. You can now use [https://tools.wmflabs.org/watch-translations/ WatchTranslations] to watch projects there. You would get an email if there are missing translations to your language. [https://phabricator.wikimedia.org/T238216] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] There is a new dataset you can use. It shows the number of editors per country per month for a number of countries. You can [[:wikitech:Analytics/Data Lake/Edits/Geoeditors/Public|read the documentation]] and [https://dumps.wikimedia.org/other/geoeditors/readme.html download the dataset]. '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.10|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 10 December. It will be on non-Wikipedia wikis and some Wikipedias from 11 December. It will be on all wikis from 12 December ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Meetings''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can join the technical advice meeting on IRC. During the meeting, volunteer developers can ask for advice. The meeting will be on [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191211T16 11 December at 16:00 (UTC)]. See [[mw:Technical Advice IRC Meeting|how to join]]. '''Future changes''' * You can test a new [[m:WMDE Technical Wishes/Book referencing|reference tool]]. It makes it possible to reference different parts of a source without repeating all information. You can test it on the [[mw:Special:MyLanguage/Beta Cluster|beta cluster]]. You can see [https://en.wikipedia.beta.wmflabs.org/wiki/Draft:Cut_the_Crap#cite_ref-3 an example article]. [https://www.mediawiki.org/wiki/Topic:Vc9k7gf9kvqxkkva] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2019/50|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2019-W50"/> 16:35, ngày 9 tháng 12 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19625279 --> == [[m:Special:MyLanguage/Tech/News/2019/51|Tech News: 2019-51]] == <section begin="technews-2019-W51"/><div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"><div class="plainlinks"> Các '''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Xin hãy thông báo cho các thành viên khác về những thay đổi này. Không phải thay đổi nào cũng ảnh hưởng trực tiếp tới bạn. [[m:Special:MyLanguage/Tech/News/2019/51|Các bản dịch]] đã có sẵn để đọc. '''Vấn đề''' * [[mw:Special:MyLanguage/Extension:Linter|Phần mở rộng Linter]] giúp bạn phát hiện các lỗi kĩ thuật trong bài viết. Tuần qua công cụ này không cập nhật được các tính năng mới, do một lỗi [[:w:en:Application programming interface|giao diện lập trình ứng dụng (API)]]. Hiện công cụ này đã hoạt động trở lại. [https://phabricator.wikimedia.org/T240057] * [[Special:Watchlist|Trang Đặc biệt:Danh sách theo dõi]] lại hiển thị thông tin sai. Công cụ này không hiển thị chính xác thay đổi nào đã được xem hay chưa được xem. Đây là một lỗi cơ sở dữ liệu. Các nhà phát triển đang tìm cách sửa. [https://phabricator.wikimedia.org/T218511] '''Thay đổi trong nửa sau tuần này''' * Bạn sẽ có thể nhận thông báo qua email, với từng mức độ: nhận thông báo ngay, nhận tóm tắt các thông báo trong ngày hoặc tóm tắt các thông báo trong tuần. Nếu bạn chọn nhận tóm tắt các thông báo, bạn sẽ sớm được cung cấp tuỳ chọn có nhận các thông báo mà bạn đã đọc trên wiki rồi qua mail nữa hay không. [https://phabricator.wikimedia.org/T169386] * [[File:Octicons-sync.svg|12px|link=|Đề mục định kỳ]] [[mw:MediaWiki 1.35/wmf.11|Phiên bản mới]] của MediaWiki sẽ được triển khai trên các wiki thử nghiệm và MediaWiki.org từ ngày {{#time:j xg|2019-12-17|{{PAGELANGUAGE}}}}. Nó sẽ được cài đặt trên các wiki không phải là Wikipedia và trên một số Wikipedia từ ngày {{#time:j xg|2019-12-18|{{PAGELANGUAGE}}}}, và trên mọi wiki từ ngày {{#time:j xg|2019-12-19|{{PAGELANGUAGE}}}} ([[mw:MediaWiki 1.35/Roadmap|xem lịch trình]]). '''Họp mặt''' * [[File:Octicons-sync.svg|12px|link=|Đề mục định kỳ]] [[File:Octicons-tools.svg|15px|link=|Đề mục nâng cao]] Bạn có thể tham gia buổi họp đóng góp ý kiến Kỹ thuật trên kênh IRC. Trong buổi họp, các nhà phát triển tình nguyện sẽ có thể hỏi ý kiến đóng góp của các bạn. Buổi họp sẽ được tổ chức vào [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20191218T16 {{#time:j xg|2019-12-18|{{PAGELANGUAGE}}}} lúc 16:00 (UTC)]. Xem [[mw:Technical Advice IRC Meeting|làm thế nào để tham gia]]. '''Các thay đổi trong tương lai''' * Tính năng [[m:Special:MyLanguage/Community health initiative/Partial blocks|Cấm một phần]] hiện đã hoạt động ổn định và sẽ được triển khai trên đa số các wiki vào ngày 6 tháng 1 năm sau. Nếu muốn, wiki của bạn có thể xin hoãn việc triển khai tính năng này, bằng cách liên hệ với [[User talk:NKohli (WMF)|NKohli (WMF)]]. [https://phabricator.wikimedia.org/T218626] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' được chuẩn bị bởi [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên của Tin tức]] và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2019/51|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký/Huỷ đăng ký]].'' </div></div> <section end="technews-2019-W51"/> 00:15, ngày 17 tháng 12 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19625279 --> == [[m:Special:MyLanguage/Tech/News/2019/52|Tech News: 2019-52]] == <section begin="technews-2019-W52"/><div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"><div class="plainlinks"> Các '''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Xin hãy thông báo cho các thành viên khác về những thay đổi này. Không phải thay đổi nào cũng ảnh hưởng trực tiếp tới bạn. [[m:Special:MyLanguage/Tech/News/2019/52|Các bản dịch]] đã có sẵn để đọc. '''Tin tức Kỹ thuật''' * Do hiện nay đang là thời điểm kỳ nghỉ lễ Giáng sinh và năm mới, nên số tiếp theo của Bản tin Kỹ thuật sẽ được phát hành vào ngày 6 tháng 1 năm 2020. '''Thay đổi gần đây''' * Tất cả người dùng trang di động của Wikimedia sẽ được trang bị thêm một số tính năng mới, bao gồm: các tab riêng cho trang nội dung/trang thảo luận, menu người dùng mở rộng, liên kết truy cập trực tiếp vào trang lịch sử của bài. Những tính năng này trước đây chỉ có trong "[[mw:special:MyLanguage/Reading/Web/Advanced mobile contributions|chế độ hiển thị nâng cao]]". '''Thay đổi trong nửa sau tuần này''' * Không có phiên bản phần mềm MediaWiki nào mới được triển khai trong tuần này và tuần sau. '''Các thay đổi trong tương lai''' * Bạn vẫn có thể sử dụng mã <code>setlang</code> trong các [[:w:vi:URL|địa chỉ URL]] để thay đổi [[mw:Special:MyLanguage/Extension:UniversalLanguageSelector|ngôn ngữ giao diện của trang]]. Tuy nhiên, việc chuyển đổi ngôn ngữ này sẽ không xảy ra một cách tự động nữa. Thay vào đó, khi mở liên kết có dạng này, trang sẽ yêu cầu bạn xác nhận việc thay đổi ngôn ngữ. Tuy nhiên, tính năng này sẽ không hoạt động nếu trình duyệt của bạn không bật [[:w:vi:Javascript|Javascript]]. [https://phabricator.wikimedia.org/T63115] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' được chuẩn bị bởi [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên của Tin tức]] và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2019/52|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký/Huỷ đăng ký]].'' </div></div> <section end="technews-2019-W52"/> 20:03, ngày 23 tháng 12 năm 2019 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19625279 --> == [[m:Special:MyLanguage/Tech/News/2020/02|Tech News: 2020-02]] == <section begin="technews-2020-W02"/><div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/02|Translations]] are available. '''Changes later this week''' * When trying to move a page, if the target title already exists then a warning message is shown. The warning message will now include a link to the target title. [https://phabricator.wikimedia.org/T184357] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.14|new version]] of MediaWiki will be on test wikis and MediaWiki.org from {{#time:j xg|2020-01-07|{{PAGELANGUAGE}}}}. It will be on non-Wikipedia wikis and some Wikipedias from {{#time:j xg|2020-01-08|{{PAGELANGUAGE}}}}. It will be on all wikis from {{#time:j xg|2020-01-09|{{PAGELANGUAGE}}}} ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/02|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W02"/> 21:19, ngày 6 tháng 1 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19625279 --> == [[m:Special:MyLanguage/Tech/News/2020/03|Tech News: 2020-03]] == <section begin="technews-2020-W03"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/03|Translations]] are available. '''Recent changes''' * You can no longer read Wikimedia wikis if your browser use very old [[:w:en:Transport Layer Security|TLS]]. This is because it is a security problem for everyone. It can lead to [[:w:en:Downgrade attack|downgrade attacks]]. Since 9 December you just see a warning. Soon the browser will not connect to the wikis at all. Most are users on Android systems older than 4.4. You can read the [[:wikitech:HTTPS/Browser Recommendations|browser recommendations]]. [https://phabricator.wikimedia.org/T238038] * [[Special:LinkSearch|Special:LinkSearch]] has been moved from the "{{int:specialpages-group-redirects}}" section on [[Special:SpecialPages|Special:SpecialPages]] to the "{{int:specialpages-group-pages}}" section. [https://phabricator.wikimedia.org/T242146] '''Changes later this week''' *[[File:Octicons-tools.svg|15px|link=|Advanced item]] Wikis can protect pages so that only some users can edit them. The standard protection levels are {{int:protect-level-autoconfirmed}} and {{int:Protect-level-sysop}}. If your wiki use more protection levels the technical name might be renamed for standardisation. This doesn't affect what users see. [https://phabricator.wikimedia.org/T230103] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.15|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 14 January. It will be on non-Wikipedia wikis and some Wikipedias from 15 January. It will be on all wikis from 16 January ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * [[:wikitech:Nova Resource:Catgraph/Deepcat|Deepcat]] and [[:wikitech:Nova Resource:Catgraph|Catgraph]] will stop working. This will happen at the end of January. This is because you can now use the normal search function instead. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-January/092936.html] * You can use <code><nowiki><ref follow="…"></nowiki></code> to merge footnotes that follow each other. It is meant to be used for digitised books on Wikisource. If the order of the footnotes is wrong no error was shown but the bad <nowiki><ref></nowiki> was shown outside the <nowiki><references /></nowiki> list. This will change and you will see an error message instead. [https://phabricator.wikimedia.org/T240858] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/03|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W03"/> [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 18:39, ngày 13 tháng 1 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19702767 --> == [[m:Special:MyLanguage/Tech/News/2020/04|Tech News: 2020-04]] == <section begin="technews-2020-W04"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/04|Translations]] are available. '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.16|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 21 January. It will be on non-Wikipedia wikis and some Wikipedias from 22 January. It will be on all wikis from 23 January ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * There is a [[:m:Special:MyLanguage/IP Editing: Privacy Enhancement and Abuse Mitigation/Improving tools|new suggestion]] for what to show when someone edits without registering an account. This is to give unregistered editors better privacy and make some anti-vandalism work go faster. You can [[:m:Talk:IP Editing: Privacy Enhancement and Abuse Mitigation/Improving tools|give feedback]]. * [[File:Octicons-tools.svg|15px|link=|Advanced item]] [[:mw:Special:MyLanguage/Manual:Pywikibot|Pywikibot]] is a Python [[:w:en:Library (computing)|library]] to automate work on wikis. It will no longer support [[:w:en:Python (programming language)|Python 2]]. Use the <code>python2</code> tag if you need to continue running Python 2 scripts. The Pywikibot team strongly recommends to migrate to Python 3. You can [[:phab:T242120|get help]] to do so. [https://lists.wikimedia.org/pipermail/pywikibot/2020-January/009976.html] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] The weekly MediaWiki branch cut will soon become automated. The timing for this cut may change. You can discuss [[phab:T242446|in Phabricator]] if this affects you. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-January/092939.html] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can [[mw:Special:MyLanguage/Technical Community Newsletter/2020/January|read about]] coming technical events and mentoring interns. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/04|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W04"/> 19:41, ngày 20 tháng 1 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19732089 --> == Movement Learning and Leadership Development Project == Hello The Wikimedia Foundation’s Community Development team is seeking to learn more about the way volunteers learn and develop into the many different roles that exist in the movement. Our goal is to build a movement informed framework that provides shared clarity and outlines accessible pathways on how to grow and develop skills within the movement. To this end, we are looking to speak with you, our community to learn about your journey as a Wikimedia volunteer. Whether you joined yesterday or have been here from the very start, we want to hear about the many ways volunteers join and contribute to our movement. To learn more about the project, [[:m:special:MyLanguage/Movement Learning and Leadership Development Project|please visit the Meta page]]. If you are interested in participating in the project, please complete [https://docs.google.com/forms/d/e/1FAIpQLSegM07N1FK_s0VUECM61AlWOthwdn5zQOlVsa2vaKcx13BwZg/viewform?usp=sf_link this simple Google form]. Although we may not be able to speak to everyone who expresses interest, we encourage you to complete this short form if you are interested in participating! -- [[user:LMiranda (WMF)|LMiranda (WMF)]] ([[user talk:LMiranda (WMF)|talk]]) 19:01, ngày 22 tháng 1 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Trizek_(WMF)/sandbox/temp_MassMessage_list&oldid=19738989 --> == Thiếu ngôn ngữ == Hiện tại, so với Wiktionary tiếng Anh [[:en:Wiktionary:Statistics]], chúng ta có vẻ thiếu rất nhiều ngôn ngữ. [[Thành viên:Huỳnh Nhân-thập|'''<tt><span style="color:#4169e1;">Ios.</span></tt>''']] ([[Thảo luận Thành viên:Huỳnh Nhân-thập|thảo luận]]) 07:28, ngày 24 tháng 1 năm 2020 (UTC) == [[m:Special:MyLanguage/Tech/News/2020/05|Tech News: 2020-05]] == <section begin="technews-2020-W05"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/05|Translations]] are available. '''Problems''' * Some mobile diffs have problems. A couple of buttons are not shown. Structured data diffs on Commons are confusing. The developers are working on fixing it. [https://phabricator.wikimedia.org/T242310][https://phabricator.wikimedia.org/T243235] * Administrators on wikis that use [[mw:Special:MyLanguage/Structured Discussions|Structured Discussions]] can't move discussion pages. This is a bug. The developers are working on fixing it. [https://phabricator.wikimedia.org/T231783] '''Changes later this week''' * There is no new MediaWiki version this week. '''Future changes''' * There is JavaScript code on Special:Undelete for administrators that makes it possible to automatically select multiple checkboxes by holding the "Shift" key and clicking. This code is also loaded by accident on other special pages and on articles. This makes pages slower to load. This will be fixed. If you know of other special pages where this is useful please tell the developers at [[phab:T232688]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/05|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W05"/> 18:52, ngày 27 tháng 1 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19732089 --> == [[m:Special:MyLanguage/Tech/News/2020/06|Tech News: 2020-06]] == <section begin="technews-2020-W06"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/06|Translations]] are available. '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.18|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 4 February. It will be on non-Wikipedia wikis and some Wikipedias from 5 February. It will be on all wikis from 6 February ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/06|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W06"/> 20:04, ngày 3 tháng 2 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19732089 --> == [[m:Special:MyLanguage/Tech/News/2020/07|Tech News: 2020-07]] == <section begin="technews-2020-W07"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/07|Translations]] are available. '''Recent changes''' * There is a new version of the [[:c:Special:MyLanguage/Commons:Mobile app|Wikimedia Commons app]] for Android. It should fix the failed uploads problem. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-February/093042.html] '''Problems''' * There was a problem with the new MediaWiki version last week. It deleted some messages by accident. The new version was late because it was stopped to fix things. [https://phabricator.wikimedia.org/T233866] '''Changes later this week''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] The [[mw:Special:MyLanguage/API:Main page|MediaWiki action API]] is used by various tools like bots and gadgets. Some error codes will change. Some parameter values that do not follow the standard will no longer work. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-February/093048.html] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.19|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 11 February. It will be on non-Wikipedia wikis and some Wikipedias from 12 February. It will be on all wikis from 13 February ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/07|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W07"/> 19:09, ngày 10 tháng 2 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == [[m:Special:MyLanguage/Tech/News/2020/08|Tech News: 2020-08]] == <section begin="technews-2020-W08"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/08|Translations]] are available. '''Recent changes''' * Pages on Wikidata and Commons now load faster. You can read more about [[mw:Special:MyLanguage/Wikimedia Performance Team/Page load performance|page load performance]]. [https://lists.wikimedia.org/pipermail/wikidata/2020-February/013827.html][https://www.mediawiki.org/wiki/ResourceLoader/Developing_with_ResourceLoader] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.20|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 18 February. It will be on non-Wikipedia wikis and some Wikipedias from 19 February. It will be on all wikis from 20 February ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/08|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W08"/> 16:16, ngày 17 tháng 2 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == [[m:Special:MyLanguage/Tech/News/2020/09|Tech News: 2020-09]] == <section begin="technews-2020-W09"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/09|Translations]] are available. '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.21|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 25 February. It will be on non-Wikipedia wikis and some Wikipedias from 26 February. It will be on all wikis from 27 February ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * There will be a [[mw:Special:MyLanguage/Talk pages project/replying|reply button]] after each post on a talk page if you want one. This will soon be a beta feature on the Arabic, French, Dutch and Hungarian Wikipedias. You will have to turn it on if you want to use it. It will come to more wikis later. You can [https://en.wikipedia.beta.wmflabs.org/wiki/Talk:Cats test the reply button]. It was briefly shown earlier than planned by mistake on the four first wikis last week. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/09|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W09"/> 20:59, ngày 24 tháng 2 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == Additional interface for edit conflicts on talk pages == ''Sorry, for writing this text in English. If you could help to translate it, it would be appreciated.'' You might know the new interface for edit conflicts (currently a beta feature). Now, Wikimedia Germany is designing an additional interface to solve edit conflicts on talk pages. This interface is shown to you when you write on a discussion page and another person writes a discussion post in the same line and saves it before you do. With this additional editing conflict interface you can adjust the order of the comments and edit your comment. We are inviting everyone to have a look at [[m:WMDE Technical Wishes/Edit Conflicts#Edit conflicts on talk pages|the planned feature]]. Let us know what you think on our [[mw:Help talk:Two Column Edit Conflict View|central feedback page]]! -- For the Technical Wishes Team: [[m:User:Max Klemm (WMDE)|Max Klemm (WMDE)]] 14:15, ngày 26 tháng 2 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Max Klemm (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=19845780 --> == [[m:Special:MyLanguage/Tech/News/2020/10|Tech News: 2020-10]] == <section begin="technews-2020-W10"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/10|Translations]] are available. '''Problems''' * Readers who were not logged in briefly saw the interface in a language decided by their browser. It should normally be in the language of the wiki. This happened for a short period of time last week. This was because of a bug. [https://phabricator.wikimedia.org/T246071] '''Changes later this week''' * If you forget your password you can ask for a new one to be sent to your email address. You need to know your email address or your username. You will now be able to choose that you need to enter both your email address and your username. This will be a preference. This is to get fewer password reset emails someone else asked for. [https://meta.wikimedia.org/wiki/Community_Tech/Password_Reset_Update] * When you asked for a new password you could see if the username didn't exist on [[Special:PasswordReset|Special:PasswordReset]]. Now the page will show the username you entered and tell you an email has been sent if the username exists. This is for better security. [https://meta.wikimedia.org/wiki/Community_Tech/Password_Reset_Update] * On [[Special:WhatLinksHere|Special:WhatLinksHere]] you can see what other pages link to a page. You can see if the link is from a redirect. You can now see which section the redirect links to. [https://phabricator.wikimedia.org/T103281] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.22|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 3 March. It will be on non-Wikipedia wikis and some Wikipedias from 4 March. It will be on all wikis from 5 March ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * The developers are working on a [[:m:WMDE Technical Wishes/Edit Conflicts#Edit conflicts on talk pages|new interface]] to solve edit conflicts on talk pages. You can [[mw:Help talk:Two Column Edit Conflict View|give feedback]]. [https://phabricator.wikimedia.org/T230231] * There is a [[:m:Abuse filter manager/vote|vote]] on the creation of a new user group called [[:m:Abuse filter manager|abuse filter manager]]. The vote runs from March 1 to March 31 on Meta. * [[File:Octicons-tools.svg|15px|link=|Advanced item]] <code>wgMFSpecialCaseMainPage</code> was used for the mobile site. It was deprecated in 2017. It will stop working in April. Wikis should see if they use it. If they do they should fix it. You can [[phab:T246401|read more and ask for help]]. This affects 183 wikis. There is a [[phab:T246401|list]]. [https://www.mediawiki.org/wiki/Mobile_Gateway/Mobile_homepage_formatting#MFSpecialCaseMainPage] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/10|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W10"/> 00:35, ngày 3 tháng 3 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == [[m:Special:MyLanguage/Tech/News/2020/11|Tech News: 2020-11]] == <section begin="technews-2020-W11"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/11|Translations]] are available. '''Recent changes''' * There is a new search word called <code>articletopic</code>. You can use it to search for articles on a specific topic. It is available on the Arabic, Czech, English and Vietnamese Wikipedias. It will come to more Wikipedias soon. [https://phabricator.wikimedia.org/T240559][https://www.mediawiki.org/wiki/ORES/Articletopic][https://wikitech.wikimedia.org/wiki/Search/articletopic] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.23|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 10 March. It will be on non-Wikipedia wikis and some Wikipedias from 11 March. It will be on all wikis from 12 March ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * There is a plan for [[mw:Special:MyLanguage/New requirements for user signatures|new requirements for user signatures]]. You can [[mw:Talk:New requirements for user signatures|give feedback]]. * The [[mw:Special:MyLanguage/Wikimedia Apps|Wikipedia Android app]] will do [[:mw:Wikimedia Apps/Team/Android/AppEditorTasks#Push Notifications for editors|push notifications]] if users want them. This could help you see for example when someone wrote on your talk page or your edit was reverted. This will come later this year. [https://phabricator.wikimedia.org/T146032] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/11|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W11"/> 17:14, ngày 9 tháng 3 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == [[m:Special:MyLanguage/Tech/News/2020/12|Tech News: 2020-12]] == <section begin="technews-2020-W12"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/12|Translations]] are available. '''Recent changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] There is a new [[:mw:Special:MyLanguage/API:Main page|API]] module for changing the content model of existing pages. Use <code>action=changecontentmodel</code> to specify the new model. You can read the [[:mw:Special:MyLanguage/API:ChangeContentModel|documentation on mediawiki.org]]. [https://phabricator.wikimedia.org/T107174] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.24|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 17 March. It will be on non-Wikipedia wikis and some Wikipedias from 18 March. It will be on all wikis from 19 March ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * If you edit a page at the same time as someone else you can get an edit conflict. There is [[:m:WMDE Technical Wishes/Edit Conflicts#Solution: Two Column Edit Conflict View|a new two-column interface]] to make it easier to solve this. It will soon be active by default on the German, Arabic, and Farsi Wikipedias. It will be on by default on more wikis within the next months. You will be able to opt out of the new interface. [https://phabricator.wikimedia.org/T139601][https://phabricator.wikimedia.org/T244863] * You can see [[:mw:Talk pages project/Updates#12 March 2020|a proposed design]] for replying to comments in an easier way. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/12|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W12"/> 21:18, ngày 16 tháng 3 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == [[m:Special:MyLanguage/Tech/News/2020/13|Tech News: 2020-13]] == <section begin="technews-2020-W13"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/13|Translations]] are available. '''Problems''' * Some development will be slower than planned. This is because of the [[:w:2019–20 coronavirus pandemic|current pandemic]]. You can see [[:wikitech:Deployments/Covid-19|the new deployment guidelines]]. This is to avoid risks when some persons could be unavailable. * There was a problem when adding interwiki links. The tool you use to add interwiki links could suggest the wrong project to link to. This has now been fixed. [https://phabricator.wikimedia.org/T247712][https://phabricator.wikimedia.org/T247562] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.25|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 24 March. It will be on non-Wikipedia wikis and some Wikipedias from 25 March. It will be on all wikis from 26 March ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * There is [[mw:Growth|a project]] to make editing easier for newcomers. The developers are trying to understand what initiatives different Wikipedias have to welcome newcomers. They also want to know which templates are often used for maintenance activities. You can help this project by [[mw:Growth/March 2020 inventory|checking if your wiki's pages are listed on Wikidata]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/13|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W13"/> 17:05, ngày 23 tháng 3 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19795492 --> == [[m:Special:MyLanguage/Tech/News/2020/14|Tech News: 2020-14]] == <section begin="technews-2020-W14"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/14|Translations]] are available. '''Recent changes''' * The beta version of the [[:mw:Wikimedia Apps|Wikipedia app]] for Android can now help users [[:mw:Wikimedia Apps/Team/Android/AppEditorTasks#Suggested Edits 4.0 - Tag Commons images to improve search|add tags]] on Commons. These tags are called [[c:Commons:Depicts|depicts]]. [https://phabricator.wikimedia.org/T239690] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.26|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 31 March. It will be on non-Wikipedia wikis and some Wikipedias from 1 April. It will be on all wikis from 2 April ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * The video player will change to be simpler and more modern. The current beta feature will become the video player for everyone. The old player will be removed. [https://phabricator.wikimedia.org/T248418] * There is a project to make templates easier to use. The next few weeks the developers will present ideas on the [[:m:WMDE Technical Wishes/Templates|project page]]. You can watch that page if you are interested in giving feedback. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-March/093240.html] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/14|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W14"/> 17:24, ngày 30 tháng 3 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19939485 --> == [[m:Special:MyLanguage/Tech/News/2020/15|Tech News: 2020-15]] == <section begin="technews-2020-W15"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/15|Translations]] are available. '''Problems''' * There was a problem with user pages not being shown properly on desktop. This was because of a bug. It will soon be fixed. [https://phabricator.wikimedia.org/T248141] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.27|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 7 April. It will be on non-Wikipedia wikis and some Wikipedias from 8 April. It will be on all wikis from 9 April ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * MediaWiki will use a newer version of [[:w:en:Unicode|Unicode]]. Some characters that did not have an upper case equivalent before do now. Titles beginning with one of these characters will be moved. A list of these titles can be seen [[phab:P10817|on Phabricator]]. The titles will be renamed by the user <code>Maintenance script</code>. This will start on 13 April 2020. You can rename them before this if you wish and the new title can be different from the one the script would rename it to. [https://phabricator.wikimedia.org/T219279] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/15|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W15"/> 19:01, ngày 6 tháng 4 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19961131 --> == [[m:Special:MyLanguage/Tech/News/2020/16|Tech News: 2020-16]] == <section begin="technews-2020-W16"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/16|Translations]] are available. '''Recent changes''' * You can now use the <code>[[:mw:Help:CirrusSearch#Articletopic|articletopic]]</code> search word on all Wikipedias. It searches articles by topic. [https://phabricator.wikimedia.org/T240559] * You can see wiki tools in the new [https://tools.wmflabs.org/tools-gallery/ Tools Gallery]. [https://www.mediawiki.org/wiki/Technical_Community_Newsletter/2020/April] * You can see edits from the [[:wikitech:Help:Cloud Services Introduction|Wikimedia Cloud Services]] in a new [https://wmcs-edits.wmflabs.org/#wmcs-edits dashboard]. * When you use filters on a history page you sometimes don't see any edits. There is a text explaining this now. Before it was just empty. [https://phabricator.wikimedia.org/T227578] * There is a new [https://techblog.wikimedia.org/ Wikimedia Technical Blog]. [https://www.mediawiki.org/wiki/Wikimedia_technical_blog_editorial_guidelines] '''Problems''' * There was a problem with the Wikidata database last week. Some wikis went down for twenty minutes. Wikidata and other projects showed error messages. Interwiki links were not shown, some tools did not work and other problems. Some of this was fixed quickly. The developers are working on fixing the rest. [https://www.wikidata.org/w/index.php?title=Wikidata:Project_chat&oldid=1153486952#Update_about_the_database_breakage][https://wikitech.wikimedia.org/wiki/Incident_documentation/20200407-Wikidata%27s_wb_items_per_site_table_dropped][https://phabricator.wikimedia.org/T249565] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.28|new version]] of MediaWiki will be on test wikis and MediaWiki.org from April 14. It will be on non-Wikipedia wikis and some Wikipedias from April 15. It will be on all wikis from April 16 ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * Some graphs have not worked on mobile. This will soon be fixed. [https://phabricator.wikimedia.org/T133085] * The article tab on talk pages of redirects links to the target of the redirect. It could link to the redirect page itself instead. You can [[phab:T5324|leave feedback on this]]. * For pages using [[mw:Special:MyLanguage/Extension:SyntaxHighlight|syntax highlighting]], the use of the deprecated <code><nowiki><source></nowiki></code> tag, as well as the use of the deprecated <code>enclose</code> parameter, will add tracking categories. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/16|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W16"/> 15:30, ngày 13 tháng 4 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19961131 --> == [[m:Special:MyLanguage/Tech/News/2020/17|Tech News: 2020-17]] == <section begin="technews-2020-W17"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/17|Translations]] are available. '''Tech News''' * The next issue of Tech News will be sent out on 4 May 2020. '''Recent changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] The [[m:Small wiki toolkits|small wiki toolkits]] is to help smaller wikis that need technical skills. They can learn and share technical skills. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-April/093296.html] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Over-qualified CSS selectors in Wikimedia skins have been removed. <code>div#content</code> is now <code>.mw-body</code>. <code>div.portal</code> is now <code>.portal</code>. <code>div#footer</code> is now <code>#footer</code>. This is so the skins can use [[:w:en:HTML5|HTML5]] elements. If your gadgets or user styles used them you will have to update them. [https://phabricator.wikimedia.org/T248137] '''Changes later this week''' * There is no new MediaWiki version this week. '''Future changes''' * Some things on the wikis might look weird or not work in [[:w:en:Internet Explorer 8|Internet Explorer 8]] in the future. Internet Explorer 8 was replaced in 2011. [https://phabricator.wikimedia.org/T248061] * The font in the diffs will change. [https://phabricator.wikimedia.org/T250393] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.30|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 28 April next week. It will be on non-Wikipedia wikis and some Wikipedias from 29 April next week. It will be on all wikis from 30 April next week ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/17|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W17"/> 18:44, ngày 20 tháng 4 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=19961131 --> == Technical maintenance planned == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> (Sorry for using English. {{int:please-translate}}.) A maintenance operation will be performed on Thursday 30th April at 05:00 AM UTC. It impacts all wikis and is supposed to last a few minutes. During this time, new translations may fail, and Notifications may not be delivered. For more details about the operation and on all impacted services, please check [[phab:T250733|on Phabricator]]. A banner will be displayed 30 minutes before the operation. Please help making your community aware of this maintenance operation. </div> [[user:Trizek (WMF)|Trizek (WMF)]], 18:01, ngày 27 tháng 4 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Trizek_(WMF)/sandbox/temp_MassMessage_list&oldid=20019118 --> == Reminder: Technical maintenance planed == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> Sorry to use English. {{int:please-translate}}. This is a reminder of the message sent on Monday 27th April. A maintenance operation will be performed on Thursday 30th April at 05:00 AM UTC. It impacts all wikis and is supposed to last a few minutes. During this time, new translations may fail, and Notifications may not be delivered. For more details about the operation and on all impacted services, please check [[phab:T250733|on Phabricator]]. A banner will be displayed 30 minutes before the operation. Please help making your community aware of this maintenance operation. </div> [[user:Trizek (WMF)|Trizek (WMF)]] 15:13, ngày 29 tháng 4 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Trizek_(WMF)/sandbox/temp_MassMessage_list&oldid=20024829 --> == [[m:Special:MyLanguage/Tech/News/2020/19|Tech News: 2020-19]] == <section begin="technews-2020-W19"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/19|Translations]] are available. '''Problems''' * [[phab:T251153|Some wikis]] will be on read-only for a few minutes on 5 May. This will happen around [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200505T05 05:00 UTC]. This is for database maintenance. [https://phabricator.wikimedia.org/T251153] * [[phab:T251157|Some wikis]] will be on read-only for a few minutes on 7 May. This will also affect [[mw:Special:MyLanguage/Extension:CentralAuth|CentralAuth]]. This can for example affect global renames, password changes, changing or confirming your email address and logging in to new wikis. This will happen around [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200507T05 05:00 UTC]. This is for database maintenance. [https://phabricator.wikimedia.org/T251157] '''Changes later this week''' * You can get a notification when someone links to a page you created. You can soon turn these notifications off for individual pages. [https://phabricator.wikimedia.org/T46787] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.31|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 5 May. It will be on non-Wikipedia wikis and some Wikipedias from 6 May. It will be on all wikis from 7 May ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/19|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W19"/> 16:59, ngày 4 tháng 5 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20041690 --> == [[m:Special:MyLanguage/Tech/News/2020/20|Tech News: 2020-20]] == <section begin="technews-2020-W20"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/20|Translations]] are available. '''Recent changes''' * Everyone can now import photos from [[w:en:Flickr|Flickr]] to Commons with the [[c:Special:UploadWizard|UploadWizard]]. Before this only autopatrollers on Commons could import photos from Flickr. [https://phabricator.wikimedia.org/T90004] '''Problems''' * [[phab:T251502|Commons]] will be on read-only for a few minutes on 12 May. This will happen around [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200512T05 05:00 UTC]. This is for database maintenance. [https://phabricator.wikimedia.org/T251502] * [[phab:T251984|Several wikis including Wikidata]] will be on read-only for a few minutes on 19 May. This will happen around [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200519T05 05:00 UTC]. English Wikipedia will be on read-only for a few minutes on 21 May [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200521T05 05:00 UTC]. This is for database maintenance. [https://phabricator.wikimedia.org/T251984][https://phabricator.wikimedia.org/T251985] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.32|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 12 May. It will be on non-Wikipedia wikis and some Wikipedias from 13 May. It will be on all wikis from 14 May ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] JavaScript scripts and gadgets can no longer check multiple keys at once via <code>mw.config.exists()</code> or <code>mw.user.tokens.exists()</code>. You can use <code>exists()</code> or <code>get()</code> to check one at a time instead. [https://phabricator.wikimedia.org/T251855] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/20|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W20"/> 20:40, ngày 11 tháng 5 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20078386 --> == [[m:Special:MyLanguage/Tech/News/2020/21|Tech News: 2020-21]] == <section begin="technews-2020-W21"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/21|Translations]] are available. '''Recent changes''' * If you forget your password you can ask for a new one to be sent to your email address. You need to know your email address or your username. You can choose that you need to enter both your email address and your username. This is a preference. This is to get fewer password reset emails someone else asked for. This is now available on all Wikimedia wikis. [https://meta.wikimedia.org/wiki/Community_Tech/Password_Reset_Update#May_11,_2020][https://lists.wikimedia.org/pipermail/wikimedia-l/2020-May/094804.html] '''Problems''' * There is a bug that creates problems for iPhone users with [[:w:en:IOS 13|iOS 13]] and [[w:en:Safari (web browser)|Safari]]. If you use an iPhone to read or edit Wikipedia and see bugs on the mobile site you can [[mw:Skin talk:Minerva Neue|report them]]. [https://phabricator.wikimedia.org/T252223] * [[phab:T251984|Several wikis including Wikidata]] will be on read-only for a few minutes on 19 May. This will happen around [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200519T05 05:00 UTC]. English Wikipedia will be on read-only for a few minutes on 21 May [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200521T05 05:00 UTC]. This is for database maintenance. [https://phabricator.wikimedia.org/T251984][https://phabricator.wikimedia.org/T251985] '''Changes later this week''' * The [[:mw:Special:MyLanguage/Wikimedia Apps|Wikipedia app]] for Android can let users [[:mw:Special:MyLanguage/Wikimedia Apps/Team/Android/AppEditorTasks#Suggested Edits 4.0 - Tag Commons images to improve search (to be released May 2020)|add]] [[c:Special:MyLanguage/Commons:Depicts|depicts]] on Commons. The beta version used [[:c:Special:MyLanguage/Commons:Structured data/Computer-aided tagging|computer-aided tagging]]. This was removed to get more specific depicts. [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/AppEditorTasks#Suggested_Edits_4.0_-_Tag_Commons_images_to_improve_search_(to_be_released_May_2020)] * There is no new MediaWiki version this week. '''Future changes''' * [[mw:Special:MyLanguage/Extension:Graph|Graphs]] will be [[:w:en:Rendering (computer graphics)|rendered]] in the reader's browser. This will use [[w:en:JavaScript|Javascript]]. Graphs will hopefully work better for everyone who uses Javascript. It will not work for users who don't use Javascript. This will not affect diagrams in image files. [https://phabricator.wikimedia.org/T236892] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Some CSS for the skins has been simplified. This affects <code>div#p-personal</code>, <code>div#p-navigation</code>, <code>div#p-interaction</code>, <code>div#p-tb</code>, <code>div#p-lang</code>, <code>div#p-namespaces</code>, <code>div#p-variants</code> and <code>div#footer</code>. They will have to remove <code>div</code>. You will have to update your gadgets, scripts or user styles. This is so we can use [[:w:en:HTML5|HTML5]]. [https://phabricator.wikimedia.org/T252467] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Some CSS for [[mw:Skin:Vector|the Vector skin]] has been changed. This affects <code>#p-variants</code>, <code>#p-namespaces</code>, <code>#p-personal</code>, <code>#p-views</code> and <code>#p-cactions</code>. They can no longer use <code>> ul</code>. You might need to update your gadgets, scripts or user styles. [[phab:T252447|See how]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/21|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W21"/> 17:18, ngày 18 tháng 5 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20097719 --> == [[m:Special:MyLanguage/Tech/News/2020/22|Tech News: 2020-22]] == <section begin="technews-2020-W22"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/22|Translations]] are available. '''Changes later this week''' * The visual editor will now work in the [[mw:Special:MyLanguage/Skin:Modern|Modern skin]]. The changes that needed to happen for this to work could cause problems for some scripts or gadgets. [https://phabricator.wikimedia.org/T177243] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.34|new version]] of MediaWiki will be on test wikis and MediaWiki.org from May 26. It will be on non-Wikipedia wikis and some Wikipedias from May 27. It will be on all wikis from May 28 ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/22|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W22"/> 14:17, ngày 25 tháng 5 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20097719 --> == [[m:Special:MyLanguage/Tech/News/2020/23|Tech News: 2020-23]] == <section begin="technews-2020-W23"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/23|Translations]] are available. '''Recent changes''' * There is a new beta version of the [[:c:Commons:Mobile app|Wikimedia Commons app]] for Android. It has a new zoom function when you look at images. It can also suggest places when you upload geotagged photos. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-May/093431.html] '''Problems''' * There was a problem with the Commons database on 27 May. Commons could not be edited for eight minutes. Because of this problem the database was moved. This caused another short read-only time on 29 May. [https://wikitech.wikimedia.org/wiki/Incident_documentation/20200528-s4_(commonswiki)_on_read-only_for_8_minutes][https://phabricator.wikimedia.org/T253808][https://phabricator.wikimedia.org/T253825] * The [[mw:Special:MyLanguage/Skin:Vector|Vector skin]] had a problem where you couldn't add links to the article in other languages. You couldn't see the section if there were no links to other languages already. It also removed [[mw:Special:MyLanguage/Content translation|content translation]] links and links to language settings. This has now been fixed. [https://phabricator.wikimedia.org/T252800] '''Changes later this week''' * You can get a notification when someone links to a page you created. You can turn these notifications off for individual pages. You can soon turn them off also in the notifications you get. [https://phabricator.wikimedia.org/T46787] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.35|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 2 June. It will be on non-Wikipedia wikis and some Wikipedias from 3 June. It will be on all wikis from 4 June ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/23|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W23"/> 22:30, ngày 1 tháng 6 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20097719 --> == [[m:Special:MyLanguage/Tech/News/2020/24|Tech News: 2020-24]] == <section begin="technews-2020-W24"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/24|Translations]] are available. '''Recent changes''' * Some articles have tables that can be sorted in different ways. For example a list of countries can be sorted alphabetically but you can click on the size column to sort them by size. If you clicked on the column a second time it would sort the countries from the bottom to the top instead. A third click will now take you back to the original sorting. [https://phabricator.wikimedia.org/T226697] * [[mw:Special:MyLanguage/Help:Lint_errors/self-closed-tag|Self-closed tags]] now work as in the [[:w:en:HTML5|HTML5]] specifications. This means you should stop using some of them. <code><nowiki><b/></nowiki></code> is an example of a self-closed tag that won't work. <code>area, base, br, col, embed, hr, img, input, keygen, link, meta, param, source, track, wbr</code> can be self-closed. Pages with tags that should not be self-closed have been listed in [[:wikidata:Q25885956|a tracking category]] since 2016. They will be listed in [[Special:LintErrors/self-closed-tag]]. This doesn't affect <code><nowiki><references /></nowiki></code> or <code><nowiki><ref /></nowiki></code>. [https://phabricator.wikimedia.org/T134423] * There is a banner called <code>WikidataPageBanner</code>. It is for example used by the Wikivoyages, Wikimedia Russia and the Catalan, Basque, Galician and Turkish Wikipedias. It will now been seen by mobile visitors too. Before this it was only seen on desktop. The wikis should update instructions on <code>MediaWiki:Sitenotice</code> so that editors know to test and style for mobile too. [https://phabricator.wikimedia.org/T254534][https://phabricator.wikimedia.org/T254295] '''Changes later this week''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] You can now edit [[m:Special:MyLanguage/MassMessage|MassMessage]] descriptions through the [[:w:en:Application programming interface|API]]. This is useful for tools and gadgets. [https://phabricator.wikimedia.org/T226929] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.36|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 9 June. It will be on non-Wikipedia wikis and some Wikipedias from 10 June. It will be on all wikis from 11 June ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * A temporary fix helped wikis make their main pages more mobile friendly. This was in 2012. It has not been recommended since 2017. It will not work after 13 July. Wikis should use [[mw:Special:MyLanguage/Help:TemplateStyles|TemplateStyles]] instead. 118 wikis need to fix this. You can [[phab:T254287|read more and see if your wiki is affected]]. [https://phabricator.wikimedia.org/T254287] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/24|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W24"/> 21:11, ngày 8 tháng 6 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20156263 --> == [[m:Special:MyLanguage/Tech/News/2020/25|Tech News: 2020-25]] == <section begin="technews-2020-W25"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/25|Translations]] are available. '''Recent changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] [[m:Toolforge|Toolforge]] hosts several tools created by the Wikimedia community like edit counters or enhanced editors. It is changing the domain from '''tools.wmflabs.org''' to '''toolforge.org'''. The routing scheme is moving from '''tools.wmflabs.org/toolname''' to '''toolname.toolforge.org'''. You can [[:wikitech:News/Toolforge.org|read the details]]. Tools that use OAuth will have to be updated to keep working. You can [[:wikitech:Help:Cloud_ Services Introduction|ask for help]]. '''Problems''' * There is a Wikidata item link in the sidebar on many pages. This disappeared for a couple of days for users who have the [[mw:Special:MyLanguage/Skin:MonoBook|Monobook]] skin. This was because of a bug. It has now been fixed. [https://phabricator.wikimedia.org/T254485] * Editing, logging in and logging out didn't work properly for a short period of time last week. It was soon fixed. [https://phabricator.wikimedia.org/T255179] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.37|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 16 June. It will be on non-Wikipedia wikis and some Wikipedias from 17 June. It will be on all wikis from 18 June ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] [[:mw:Special:MyLanguage/Manual:Pywikibot|Pywikibot]] is a Python [[:w:en:Library (computing)|library]] to automate work on wikis. It will not support [[:w:en:Python (programming language)|Python 2]] after the new version in July. Support for Python 3.4 and MediaWiki below 1.19 will also be dropped. You should migrate to Python 3. You can [[:phab:T242120|ask for help]]. [https://lists.wikimedia.org/pipermail/pywikibot-announce/2020-June/000015.html] * The selectors <code>.menu</code> and <code>.vectorMenu</code> will no longer work in the [[mw:Special:MyLanguage/Skin:Vector|Vector]] skin. This can affect gadgets and user scripts. <code>.menu</code> should be replaced by <code>ul</code>. <code>.vectorMenu</code> should be replaced by <code>.vector-menu</code>. [https://phabricator.wikimedia.org/T254797] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/25|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W25"/> 21:37, ngày 15 tháng 6 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20175854 --> == [[m:Special:MyLanguage/Tech/News/2020/26|Tech News: 2020-26]] == <section begin="technews-2020-W26"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/26|Translations]] are available. '''Problems''' * There are some [[mw:Special:MyLanguage/Growth|new tools]] to make it easier for newcomers to start editing. They are available on [https://noc.wikimedia.org/conf/highlight.php?file=dblists/growthexperiments.dblist some wikis]. These wikis had a problem with the visual editor for a short period of time last week. This was because of a bug in the new tools. It was soon fixed. [https://phabricator.wikimedia.org/T255607] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Some user scripts and gadgets stopped working because of a change to [[:w:en:CSS|CSS]] selectors. <code>.vectorTabs</code> should be replaced with <code>.vector-menu-tabs</code> to fix this. [https://phabricator.wikimedia.org/T255718] '''Changes later this week''' * The developers are working on a [[:m:WMDE Technical Wishes/Edit Conflicts#Edit conflicts on talk pages|new interface]] to solve edit conflicts on talk pages. This will be released on 24 June. You can [[mw:mw:Help talk:Paragraph-based Edit Conflict Interface|give feedback]]. [https://phabricator.wikimedia.org/T230231] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.38|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 23 June. It will be on non-Wikipedia wikis and some Wikipedias from 24 June. It will be on all wikis from 25 June ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * A temporary fix helped wikis make their main pages more mobile friendly. This was in 2012. It has not been recommended since 2017. It will not work after 13 July. Wikis should use [[mw:Special:MyLanguage/Help:TemplateStyles|TemplateStyles]] instead. 91 wikis still need to fix this. You can [[phab:T254287|read more and see if your wiki is affected]]. [https://phabricator.wikimedia.org/T254287] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/26|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W26"/> 18:48, ngày 22 tháng 6 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20204321 --> == [[m:Special:MyLanguage/Tech/News/2020/27|Tech News: 2020-27]] == <section begin="technews-2020-W27"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/27|Translations]] are available. '''Problems''' * Everyone was logged out. This was because a few users saw the wikis as if they were logged in to someone else's account. The problem should be fixed now. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-June/093543.html] * Some readers didn't see new edits to pages. If the page had been recently changed they saw an older version of the page instead. This only affected readers who were logged out. It lasted for ten days. It has been fixed. [https://phabricator.wikimedia.org/T256444] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.39|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 30 June. It will be on non-Wikipedia wikis and some Wikipedias from 1 July. It will be on all wikis from 1 July ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * [[File:Octicons-tools.svg|15px|link=|]] The [[mw:Special:MyLanguage/Skin:Modern|Modern]] and [[mw:Special:MyLanguage/Skin:Monobook|Monobook]] skins use the ID <code>searchGoButton</code> for the go button. This is <code>searchButton</code> for [[mw:Special:MyLanguage/Skin:Vector|Vector]]. To have the same ID for all skins it will change to <code>searchButton</code> in Monobook and Modern too. This will affect gadgets and user scripts. It will happen on 23 July. They should be updated to use <code>searchButton</code>. You can [[phab:T255953|read more and see a list of affected scripts]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/27|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W27"/> 16:30, ngày 29 tháng 6 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20228118 --> == Feedback on movement names == {{int:Hello}}. Apologies if you are not reading this message in your native language. {{int:please-translate}} if necessary. {{Int:Feedback-thanks-title}} There are a lot of conversations happening about the future of our movement names. We hope that you are part of these discussions and that your community is represented. Since 16 June, the Foundation Brand Team has been running a [https://wikimedia.qualtrics.com/jfe/form/SV_9G2dN7P0T7gPqpD survey] in 7 languages about [[m:Special:MyLanguage/Communications/Wikimedia brands/2030 movement brand project/Naming convention proposals|3 naming options]]. There are also community members sharing concerns about renaming in a [[m:Special:MyLanguage/Community open letter on renaming|Community Open Letter]]. Our goal in this call for feedback is to hear from across the community, so we encourage you to participate in the survey, the open letter, or both. The survey will go through 7 July in all timezones. Input from the survey and discussions will be analyzed and published on Meta-Wiki. Thanks for thinking about the future of the movement, --[[:m:Talk:Communications/Wikimedia brands/2030 movement brand project|The Brand Project team]], 19:39, ngày 2 tháng 7 năm 2020 (UTC) ''Note: The survey is conducted via a third-party service, which may subject it to additional terms. For more information on privacy and data-handling, see the [[foundation:Special:MyLanguage/Naming Convention Proposals Movement Feedback Survey Privacy Statement|survey privacy statement]].'' <!-- Tin nhắn của Thành viên:Elitre (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Elitre_(WMF)/All_wikis_June_2020&oldid=20238769 --> == [[m:Special:MyLanguage/Tech/News/2020/28|Tech News: 2020-28]] == <section begin="technews-2020-W28"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/28|Translations]] are available. '''Problems''' * The [[mw:Special:MyLanguageExtension:Score|Score]] extension has been disabled for now. This is because of a security issue. It will work again as soon as the security issue has been fixed. [https://phabricator.wikimedia.org/T257066] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.40|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 7 July. It will be on non-Wikipedia wikis and some Wikipedias from 8 July. It will be on all wikis from 9 July ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * Abstract Wikipedia is a new Wikimedia project. It will collect language-independent information that can be easily read in different languages. It builds on Wikidata. The name is preliminary. You can [[m:Special:MyLanguage/Abstract Wikipedia|read more]]. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-July/093571.html] * The [[mw:Wikimedia Apps/Team/iOS|iOS Wikipedia app]] developers are thinking about new experimental tools. If you use an iPhone you can help them by [[mw:Wikimedia Apps/Team/iOS/2020 survey|answering the survey]]. * Some [[mw:New requirements for user signatures#Outcome|rules for user signatures]] will soon be enforced. [[Special:LintErrors|Lint errors]] and invalid HTML will no longer be allowed in user signatures. Nested substitution will not be allowed. A link to your user page, user talk page or user contributions will be required. You can [https://signatures.toolforge.org/check check if your signature works with the new rules]. This is because the signatures can cause problems for tools or other text on the page. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/28|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W28"/> 20:18, ngày 6 tháng 7 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20251754 --> == Announcing a new wiki project! Welcome, Abstract Wikipedia == <div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"> === Thông báo một dự án wiki mới! Chào mừng tới Wikipedia trừu tượng === Xin chào tất cả các bạn, Tôi vinh dự được giới thiệu Wikipedia Trừu tượng, một dự án mới đã được Hội đồng quản trị Wikimedia Foundation nhất trí phê duyệt. Tóm tắt Wikipedia đề xuất một cách mới để tạo nội dung bách khoa toàn thư theo kiểu đa ngôn ngữ, cho phép nhiều người đóng góp và nhiều độc giả chia sẻ nhiều kiến thức hơn bằng nhiều ngôn ngữ hơn. Đó là một cách tiếp cận nhằm mục đích giúp hợp tác xuyên ngôn ngữ dễ dàng hơn trong các dự án của chúng ta, tăng tính bền vững của phong trào thông qua việc mở rộng quyền truy cập, cải thiện trải nghiệm người dùng cho tất cả các ngôn ngữ và đổi mới kiến thức miễn phí bằng cách kết nối một số điểm mạnh của phong trào của chúng ta để tạo ra một cái gì đó mới. Đây là dự án mới đầu tiên của chúng tôi trong hơn bảy năm. Tóm tắt Wikipedia đã được đệ trình như một đề xuất dự án của Denny Vrandečić vào tháng 5 năm 2020<ref>[[m:Special:MyLanguage/Abstract Wikipedia|Abstract Wikipedia]]</ref> sau nhiều năm chuẩn bị và nghiên cứu, dẫn đến một kế hoạch chi tiết và thảo luận sôi nổi trong cộng đồng Wikimedia . Chúng tôi biết rằng năng lượng và sự sáng tạo của cộng đồng thường chạy theo các rào cản ngôn ngữ và thông tin có sẵn trong một ngôn ngữ có thể không chuyển sang ngôn ngữ khác Wikipedias. Wikipedia Trừu tượng dự định sẽ có ngoại hình và cảm nhận như một Wikipedia, nhưng xây dựng trên các mô hình khái niệm mạnh mẽ, độc lập với ngôn ngữ của Wikidata, với mục tiêu cho phép các tình nguyện viên tạo và duy trì các bài viết Wikipedia trên thế giới Wikimedia đa ngôn ngữ của chúng ta. Dự án sẽ cho phép các tình nguyện viên tập hợp các nguyên tắc cơ bản của một bài viết bằng cách sử dụng các từ và thực thể từ Wikidata. Do Wikidata sử dụng các mô hình khái niệm có nghĩa là phổ quát trên các ngôn ngữ, nên có thể sử dụng và mở rộng các khối kiến thức này để tạo mô hình cho các bài viết cũng có giá trị phổ quát. Sử dụng mã, các tình nguyện viên sẽ có thể dịch các bài viết trừu tượng này thành ngôn ngữ của họ. Nếu thành công, điều này cuối cùng có thể cho phép mọi người đọc về bất kỳ chủ đề nào trong Wikidata bằng ngôn ngữ của họ. Như bạn có thể tưởng tượng, công việc này sẽ đòi hỏi rất nhiều sự phát triển phần mềm và rất nhiều sự hợp tác giữa các Wikimedian. Để thực hiện nỗ lực này, Denny sẽ tham gia Quỹ với tư cách là nhân viên vào tháng 7 và lãnh đạo sáng kiến này. Bạn có thể biết Denny là người tạo ra Wikidata, một thành viên cộng đồng lâu năm, cựu nhân viên tại Wikimedia Deutschland và là cựu Ủy viên tại Wikimedia Foundation<ref>[[m:User:Denny|User:Denny]]</ref>. Chúng tôi rất vui mừng khi Denny sẽ mang các kỹ năng và chuyên môn của mình để làm việc trong dự án này cùng với các nhóm sản phẩm, công nghệ và các nhóm liên lạc cộng đồng. Điều quan trọng là phải thừa nhận rằng đây là một dự án thử nghiệm và mỗi cộng đồng Wikipedia có nhu cầu khác nhau. Dự án này có thể tạo ra cho một số cộng đồng lợi thế lớn. Các cộng đồng khác có thể tham gia ít hơn. Mọi cộng đồng Wikipedia ngôn ngữ sẽ được tự do lựa chọn và kiểm duyệt xem họ sẽ sử dụng nội dung từ dự án này như thế nào. Chúng tôi rất vui vì dự án wiki mới này có khả năng nâng cao công bằng kiến thức thông qua việc tăng khả năng tiếp cận kiến thức. Nó cũng mời chúng ta xem xét và tham gia với các câu hỏi quan trọng về cách thức và kiến thức được xây dựng bởi ai và bởi ai. Chúng tôi mong muốn được hợp tác với cộng đồng để suy nghĩ thông qua những câu hỏi quan trọng này. Có nhiều việc phải làm khi chúng tôi bắt đầu thiết kế một kế hoạch cho Wikipedia trừu tượng với sự cộng tác chặt chẽ với các cộng đồng của chúng tôi. Tôi khuyến khích bạn tham gia bằng cách truy cập trang dự án và tham gia danh sách gửi thư mới<ref>[[mail:abstract-wikipedia|Abstract Wikipedia mailing list]]</ref>. Chúng tôi nhận ra rằng Wikipedia trừu tượng là tham vọng, nhưng chúng tôi cũng nhận ra tiềm năng của nó. Chúng tôi mời tất cả các bạn tham gia cùng chúng tôi trên một con đường mới, chưa được khám phá. Thân mến, Katherine Maher (Executive Director, Wikimedia Foundation) <references/> </div> <small>Sent by [[:m:User:Elitre (WMF)]] 20:13, ngày 9 tháng 7 năm 2020 (UTC) - '''[[:m:Special:MyLanguage/Abstract Wikipedia/July 2020 announcement]]''' </small> <!-- Tin nhắn của Thành viên:Elitre (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Elitre_(WMF)/All_wikis_June_2020&oldid=20265926 --> == [[m:Special:MyLanguage/Tech/News/2020/29|Tech News: 2020-29]] == <section begin="technews-2020-W29"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/29|Translations]] are available. '''Recent changes''' * Users can [[mw:Extension:Thanks|thank]] others for their edits. [[mw:Extension:CheckUser|Checkusers]] can now see user data related to that action. This can help identify [[m:Special:MyLanguage/Sock puppetry|sock puppets]] who harass others using thanks. [https://phabricator.wikimedia.org/T252226] '''Problems''' * Everyone was logged out a couple of weeks ago to fix a security problem. The problem was not entirely fixed. Because of this everyone was logged out once again last week. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-June/093543.html][https://lists.wikimedia.org/pipermail/wikitech-ambassadors/2020-July/002327.html] '''Changes later this week''' * Wikis that are not for one specific language can [[mw:Special:MyLanguage/Help:Extension:Translate|translate]] pages. Sometimes parts of translations are outdated or missing. Outdated translations are marked with a <span style="background-color:#fdd">pink background</span>. Missing translations will also be marked in the future. This markup can sometimes break things. It can soon be disabled by using <code><translate nowrap></translate></code> on the source page. [https://phabricator.wikimedia.org/T256625] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.35/wmf.41|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 14 July. It will be on non-Wikipedia wikis and some Wikipedias from 15 July. It will be on all wikis from 16 July ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''Future changes''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Wikimedia code review plans to use [[:w:en:GitLab|GitLab]]. It would be hosted on Wikimedia servers. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-July/093577.html][https://www.mediawiki.org/wiki/Technical_Community_Newsletter/2020/July][https://www.mediawiki.org/wiki/Topic:Vpbt50rwxgb2r6qn][https://lists.wikimedia.org/pipermail/wikitech-l/2020-July/093607.html] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/29|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W29"/> 16:29, ngày 13 tháng 7 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20278125 --> == [[m:Special:MyLanguage/Tech/News/2020/30|Tech News: 2020-30]] == <section begin="technews-2020-W30"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/30|Translations]] are available. '''Recent changes''' * A temporary fix helped wikis make their main pages more mobile friendly. This was in 2012. It has not been recommended since 2017. The mobile main page special casing stopped working 14 July. 60 wikis now have main pages that don't work well on mobile. You can see which ones, how to fix it and how to get help [[phab:T254287|in Phabricator]]. This is the same problem that was reported in Tech News [[m:Special:MyLanguage/Tech/News/2020/24|2020/24]] and [[m:Special:MyLanguage/Tech/News/2020/26|2020/26]]. '''Problems''' * There is a problem with the interlanguage links. The interlanguage links are the links that help you find a specific page in a different language. The sorting is broken. The developers are working on a solution. [https://phabricator.wikimedia.org/T257625] * Some users keep getting the notifications for the same event. Some of these are old events. [https://phabricator.wikimedia.org/T257714] * Some users have trouble logging in. This is probably a [[:w:en:HTTP cookie|browser cookie]] problem. The developers are working on understanding the problem. If you have trouble logging in you can see the details [[phab:T258121|on Phabricator]]. [https://phabricator.wikimedia.org/T258121] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.1|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 21 July. It will be on non-Wikipedia wikis and some Wikipedias from 22 July. It will be on all wikis from 23 July ([[mw:MediaWiki 1.36/Roadmap|calendar]]). '''Future changes''' * There is a <code>{{int:printableversion}}</code> link. This will disappear. That is because web browsers today can create a printable version or show how it will look in print anyway. [https://phabricator.wikimedia.org/T167956] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/30|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W30"/> 19:13, ngày 20 tháng 7 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20298484 --> == [[m:Special:MyLanguage/Tech/News/2020/30|Tech News: 2020-30]] == <section begin="technews-2020-W30"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/30|Translations]] are available. '''Recent changes''' * A temporary fix helped wikis make their main pages more mobile friendly. This was in 2012. It has not been recommended since 2017. The mobile main page special casing stopped working 14 July. 60 wikis now have main pages that don't work well on mobile. You can see which ones, how to fix it and how to get help [[phab:T254287|in Phabricator]]. This is the same problem that was reported in Tech News [[m:Special:MyLanguage/Tech/News/2020/24|2020/24]] and [[m:Special:MyLanguage/Tech/News/2020/26|2020/26]]. '''Problems''' * There is a problem with the interlanguage links. The interlanguage links are the links that help you find a specific page in a different language. The sorting is broken. The developers are working on a solution. [https://phabricator.wikimedia.org/T257625] * Some users keep getting the notifications for the same event. Some of these are old events. [https://phabricator.wikimedia.org/T257714] * Some users have trouble logging in. This is probably a [[:w:en:HTTP cookie|browser cookie]] problem. The developers are working on understanding the problem. If you have trouble logging in you can see the details [[phab:T258121|on Phabricator]]. [https://phabricator.wikimedia.org/T258121] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.1|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 21 July. It will be on non-Wikipedia wikis and some Wikipedias from 22 July. It will be on all wikis from 23 July ([[mw:MediaWiki 1.36/Roadmap|calendar]]). '''Future changes''' * There is a <code>{{int:printableversion}}</code> link. This will disappear. That is because web browsers today can create a printable version or show how it will look in print anyway. [https://phabricator.wikimedia.org/T167956] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/30|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W30"/> 00:58, ngày 22 tháng 7 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20298484 --> == [[m:Special:MyLanguage/Tech/News/2020/31|Tech News: 2020-31]] == <section begin="technews-2020-W31"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/31|Translations]] are available. '''Recent changes''' * The [[m:Small wiki toolkits/Starter kit|Starter kit]] is now available for wiki communities. This page lists technical resources, tools, and recommendations. These are essential to operate a wiki project. This is mostly useful for smaller wikis where the community has limited experience with this. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-July/093633.html] * The first features of the [[mw:Reading/Web/Desktop Improvements|Desktop Improvements]] project are available for logged-in users on all wikis. In order to use them, uncheck ''{{int:prefs-vector-enable-vector-1-label}}'' in your [[Special:Preferences#mw-prefsection-rendering|local]] or [[Special:GlobalPreferences#mw-prefsection-rendering|global]] preferences in section ''{{int:prefs-skin-prefs}}''. More improvements are planned. [[mw:Talk:Reading/Web/Desktop Improvements|Feedback is welcome]]. * [[File:Octicons-tools.svg|15px|link=|Advanced item]] On multiple wikis, a UTCLiveClock gadget is available. For wikis that import the gadget [[:mw:MediaWiki:Gadget-UTCLiveClock.js|directly from mediawiki.org]], end users can now [[mw:MediaWiki_talk:Gadget-UTCLiveClock.js#Time_zones|choose a different timezone to show instead of UTC]]. '''Problems''' * [[File:Octicons-tools.svg|15px|link=|Advanced item]] The deployment train for MediaWiki has been blocked this week. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-July/093640.html][https://phabricator.wikimedia.org/T257969] * Translation Notification Bot was sending the same message multiple times to every translator. This has been fixed. [https://phabricator.wikimedia.org/T144780] * Some users were receiving the same notification multiple times. This has been fixed. [https://phabricator.wikimedia.org/T257766] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.2|new version]] of MediaWiki will be on test wikis and MediaWiki.org from July 28. It will be on non-Wikipedia wikis and some Wikipedias from July 29. It will be on all wikis from JUly 30 ([[mw:MediaWiki 1.35/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/31|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W31"/> 13:51, ngày 27 tháng 7 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20298484 --> == [[m:Special:MyLanguage/Tech/News/2020/32|Tech News: 2020-32]] == <section begin="technews-2020-W32"/><div class="plainlinks mw-content-ltr" lang="vi" dir="ltr"><div class="plainlinks"> Các '''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Xin hãy thông báo cho các thành viên khác về những thay đổi này. Không phải thay đổi nào cũng ảnh hưởng trực tiếp tới bạn. [[m:Special:MyLanguage/Tech/News/2020/32|Các bản dịch]] đã có sẵn để đọc. '''Vấn đề''' * Tất cả các truy vấn đến [[mw:Wikidata Query Service|Dịch vụ Truy vấn Wikidata]] đã gặp lỗi từ 17:50 đến 17:59 (giờ UTC) vào ngày thứ năm, 23 tháng 7. Một số truy vấn tiếp tục gặp lỗi trong thời gian dài hơn sau đó. [https://wikitech.wikimedia.org/wiki/Incident_documentation/20200723-wdqs-outage] * Các liên kết liên wiki đã bị xếp thứ tự sai trong những tuần vừa qua. Vấn đề này đã từng được nhắc đến trong [[m:Special:MyLanguage/Tech/News/2020/30|Bản tin Kỹ thuật hai tuần trước]]. Vấn đề hiện đã được khắc phục. [https://phabricator.wikimedia.org/T257625] * Các vấn đề với tuỳ chọn "{{int:prefs-vector-enable-vector-1-label}}" trong [[Special:GlobalPreferences#mw-prefsection-rendering|các thiết lập toàn cục]]. Các nhà phát triển đang tìm cách khắc phục lỗi này. [https://phabricator.wikimedia.org/T258493] * Một lỗi trong phần mở rộng Wikibase đã vô hiệu hoá mức "khoá di chuyển" và "khoá tạo trang" trong không gian tên chính (Gallery) của Wikimedia Commons. Người dùng không thể khoá trang, và các thiết lập khoá đang có bị vô hiệu hoá, khiến những người dùng vẫn có thể di chuyển và tạo các trang mà đáng ra họ không được phép. Lỗi này hiện đã được sửa. [https://phabricator.wikimedia.org/T258323] '''Thay đổi sắp tới trong tuần này''' * [[mw:Special:MyLanguage/Extension:TimedMediaHandler/VideoJS Player|Trình phát video]] sẽ thay đổi sang một giao diện mới đơn giản và hiện đại hơn. Trong tuần này, phiên bản trình phát video thử nghiệm sẽ được kích hoạt thành trình phát video mặc định cho người dùng trên đa số các wiki không phải là Wikipedia. Trình phát video cũ sẽ bị loại bỏ. [https://phabricator.wikimedia.org/T248418] * Các trang <code>global.js</code> và <code>global.css</code> của người dùng cũng sẽ được tải trên phiên bản di động. Bạn có thể đọc [[mw:Help:Extension:GlobalCssJs#Per-skin_customization|bản hướng dẫn]] để biết làm thế nào để ngăn không cho các style này được tải trên giao diện di động. [https://phabricator.wikimedia.org/T138727] * [[File:Octicons-tools.svg|15px|link=|Đề mục nâng cao]] In the [[mw:Special:MyLanguage/Skin:MonoBook|MonoBook]] skin, the <code>searchGoButton</code> identifier is now <code>searchButton</code>. This may affect CSS and JS gadgets. Migration instructions can be found in [[phab:T255953|T255953]]. This was previously mentioned in [[m:Special:MyLanguage/Tech/News/2020/27|issue 27]]. * [[File:Octicons-tools.svg|15px|link=|Đề mục nâng cao]] Bot operators can use Pywikibot to regularly archive discussions. The behavior when the bot uses <code>counter</code> to prevent large archives was changed. [https://phabricator.wikimedia.org/T215247] * [[File:Octicons-sync.svg|12px|link=|Đề mục định kỳ]] [[mw:MediaWiki 1.36/wmf.3|Phiên bản mới]] của MediaWiki sẽ được triển khai trên các wiki thử nghiệm và MediaWiki.org từ ngày {{#time:j xg|2020-08-04|{{PAGELANGUAGE}}}}. Nó sẽ được cài đặt trên các wiki không phải là Wikipedia và trên một số Wikipedia từ ngày {{#time:j xg|2020-08-05|{{PAGELANGUAGE}}}}, và trên mọi wiki từ ngày {{#time:j xg|2020-08-06|{{PAGELANGUAGE}}}} ([[mw:MediaWiki 1.36/Roadmap|xem lịch trình]]). '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2020/32|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div></div> <section end="technews-2020-W32"/> 15:43, ngày 3 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20298484 --> == Technical Wishes: FileExporter and FileImporter become default features on all Wikis == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"> The [[m:WMDE_Technical_Wishes/Move_files_to_Commons|FileExporter and FileImporter]] will become a default features on all wikis until August 7, 2020. They are planned to help you to move files from your local wiki to Wikimedia Commons easier while keeping all original file information (Description, Source, Date, Author, View History) intact. Additionally, the move is documented in the files view history. How does it work? Step 1: If you are an auto-confirmed user, you will see a link "Move file to Wikimedia Commons" on the local file page. Step 2: When you click on this link, the FileImporter checks if the file can in fact be moved to Wikimedia Commons. These checks are performed based on the wiki's [[m:WMDE_Technical_Wishes/Move_files_to_Commons/Configuration_file_documentation|configuration file]] which is created and maintained by each local wiki community. Step 3: If the file is compatible with Wikimedia Commons, you will be taken to an import page, at which you can update or add information regarding the file, such as the description. You can also add the 'Now Commons' template to the file on the local wiki by clicking the corresponding check box in the import form. Admins can delete the file from the local wiki by enabling the corresponding checkbox. By clicking on the 'Import' button at the end of the page, the file is imported to Wikimedia Commons. If you want to know more about the [[m:WMDE_Technical_Wishes/Move_files_to_Commons|FileImporter extension]] or the [[m:WMDE_Technical_Wishes|Technical Wishes Project]], follow the links. --For the Technical Wishes Team: </div>[[User:Max Klemm (WMDE)|Max Klemm (WMDE)]] 09:14, ngày 6 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Max Klemm (WMDE)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=WMDE_Technical_Wishes/Technical_Wishes_News_list_all_village_pumps&oldid=20343133 --> == [[m:Special:MyLanguage/Tech/News/2020/33|Tech News: 2020-33]] == <section begin="technews-2020-W33"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/33|Translations]] are available. '''Recent changes''' * [[m:WMDE_Technical_Wishes/Move_files_to_Commons|FileImporter and FileExporter]] became standard features on all Wikis during the first week of August. They help you transfer files from local wikis to Wikimedia Commons with the original file information and history intact. [https://phabricator.wikimedia.org/T140462] '''Problems''' * The mobile skin displays a message at the bottom of the page about who edited last. This message showed raw wikitext. This has now been fixed. Some messages in [[mw:Structured Discussions|Structured Discussions]] and [[mw:Content translation|content translation]] may still appear as raw wikitext. Developers are working on it. [https://phabricator.wikimedia.org/T259565] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.4|new version]] of MediaWiki will be on test wikis and MediaWiki.org from August 11. It will be on non-Wikipedia wikis and some Wikipedias from August 12. It will be on all wikis from August 13 ([[mw:MediaWiki 1.36/Roadmap|calendar]]). '''Future changes''' * All wikis will be read-only for a few minutes on September 1. This is planned between 13:30 and 15:30 UTC. More information will be published in Tech News and will also be posted on individual wikis in the coming weeks. [https://phabricator.wikimedia.org/T243314][https://phabricator.wikimedia.org/T244808] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/33|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W33"/> 16:06, ngày 10 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:Johan_(WMF)/Tech_News_target_list_1&oldid=20353586 --> == [[m:Special:MyLanguage/Tech/News/2020/34|Tech News: 2020-34]] == <section begin="technews-2020-W34"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/34|Translations]] are available. '''Recent changes''' * If you revert an edit using the undo link your edit is marked with an <code>undo</code> tag. This will now only happen if you don't change anything in the edit window before publishing the undo. This is to keep users from marking edits as undos when they actually do something else. [https://phabricator.wikimedia.org/T259014] * The new [[mw:Special:MyLanguage/OOUI|OOUI version]] will not work with [[:w:en:Internet Explorer 8|Internet Explorer 8]]. This means the wikis will look strange and not work well in Internet Explorer 8. This was reported in [[m:Special:MyLanguage/Tech/News/2020/17|Tech/News/2020/17]]. This is because keeping the wikis working with very old browsers creates other problems. [https://lists.wikimedia.org/pipermail/wikitech-l/2020-August/093718.html] '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.5|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 18 August. It will be on non-Wikipedia wikis and some Wikipedias from 19 August. It will be on all wikis from 20 August ([[mw:MediaWiki 1.36/Roadmap|calendar]]). '''Future changes''' * All wikis will be read-only for a few minutes on September 1. This is planned between 13:30 and 15:30 UTC. More information will be published in Tech News and will also be posted on individual wikis next week. This is a reminder. You can help by [[m:Tech/Server switch 2020|translating the announcement message]]. [https://phabricator.wikimedia.org/T243314][https://phabricator.wikimedia.org/T244808] '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/34|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W34"/> 20:41, ngày 17 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=20366028 --> == [[m:Special:MyLanguage/Tech/News/2020/35|Tech News: 2020-35]] == <section begin="technews-2020-W35"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/35|Translations]] are available. '''Changes later this week''' * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.6|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 25 August. It will be on non-Wikipedia wikis and some Wikipedias from 26 August. It will be on all wikis from 27 August ([[mw:MediaWiki 1.36/Roadmap|calendar]]). '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/35|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W35"/> 17:59, ngày 24 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=20389773 --> == Important: maintenance operation on September 1st == <div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> [[:m:Special:MyLanguage/Tech/Server switch 2020|Read this message in another language]] • [[:m:Special:MyLanguage/Tech/Server switch 2020|{{int:please-translate}}]] The [[foundation:|Wikimedia Foundation]] will be testing its secondary data centre. This will make sure that Wikipedia and the other Wikimedia wikis can stay online even after a disaster. To make sure everything is working, the Wikimedia Technology department needs to do a planned test. This test will show if they can reliably switch from one data centre to the other. It requires many teams to prepare for the test and to be available to fix any unexpected problems. They will switch all traffic to the secondary data centre on '''Tuesday, September 1st 2020'''. Unfortunately, because of some limitations in [[mw:Manual:What is MediaWiki?|MediaWiki]], all editing must stop while the switch is made. We apologize for this disruption, and we are working to minimize it in the future. '''You will be able to read, but not edit, all wikis for a short period of time.''' *You will not be able to edit for up to an hour on Tuesday, September 1st. The test will start at [https://www.timeanddate.com/worldclock/fixedtime.html?iso=20200901T14 14:00 UTC] (15:00 BST, 16:00 CEST, 10:00 EDT, 19:30 IST, 07:00 PDT, 23:00 JST, and in New Zealand at 02:00 NZST on Wednesday September 2). *If you try to edit or save during these times, you will see an error message. We hope that no edits will be lost during these minutes, but we can't guarantee it. If you see the error message, then please wait until everything is back to normal. Then you should be able to save your edit. But, we recommend that you make a copy of your changes first, just in case. ''Other effects'': *Background jobs will be slower and some may be dropped. Red links might not be updated as quickly as normal. If you create an article that is already linked somewhere else, the link will stay red longer than usual. Some long-running scripts will have to be stopped. *There will be code freezes for the week of September 1st, 2020. Non-essential code deployments will not happen. This project may be postponed if necessary. You can [[wikitech:Switch Datacenter#Schedule for 2018 switch|read the schedule at wikitech.wikimedia.org]]. Any changes will be announced in the schedule. There will be more notifications about this. '''Please share this information with your community.''' </div></div> <span dir=ltr>[[m:User:Trizek (WMF)|Trizek (WMF)]] ([[m:User talk:Trizek (WMF)|talk]])</span> 13:49, ngày 26 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=20384955 --> == [[m:Special:MyLanguage/Tech/News/2020/36|Tech News: 2020-36]] == <section begin="technews-2020-W36"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/36|Translations]] are available. '''Problems''' * This is a reminder. All wikis will be read-only for a few minutes on September 1. This is planned between 14:00 and 15:00 UTC. Please check on the details on [[m:Tech/Server switch 2020|the announcement message]]. [https://phabricator.wikimedia.org/T243314][https://phabricator.wikimedia.org/T244808] '''Changes later this week''' * There is no new MediaWiki version this week. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/36|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W36"/> 20:12, ngày 31 tháng 8 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=20411995 --> == [[m:Special:MyLanguage/Tech/News/2020/37|Tech News: 2020-37]] == <section begin="technews-2020-W37"/><div class="plainlinks mw-content-ltr" lang="en" dir="ltr"><div class="plainlinks"> Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2020/37|Translations]] are available. '''Changes later this week''' * Normally pages can be moved to a title that has no existing page yet or to a page that has only one revision, which is a redirect to the page to be moved. A new user right allows editors to move pages over one-revision pages that redirect to anywhere. [https://phabricator.wikimedia.org/T239277] * [[File:Octicons-sync.svg|12px|link=|Recurrent item]] The [[mw:MediaWiki 1.36/wmf.8|new version]] of MediaWiki will be on test wikis and MediaWiki.org from 8 September. It will be on non-Wikipedia wikis and some Wikipedias from 9 September. It will be on all wikis from 10 September ([[mw:MediaWiki 1.36/Roadmap|calendar]]). * [[File:Octicons-tools.svg|15px|link=|Advanced item]] All MediaWiki [[:w:en:API|API]] modules will now use <code>watchlist</code> instead of <code>watch</code>. This was inconsistent before. [https://phabricator.wikimedia.org/T247915] '''Future changes''' * The [[mw:Wikimedia Apps/Team/Android|Wikipedia Android app]] team might work on patrolling tools in the future. You can let them know what tools would be useful for you or for less experienced patrollers. See the [[mw:Special:MyLanguage/Wikimedia Apps/Team/Android/Patrolling conversation|page on mediawiki.org]]. * [[m:Special:MyLanguage/OTRS|OTRS]] will be updated to a new version. This will probably take around two days. OTRS agents will not have access to the system during these days. Emails that come in during the update will be delivered when the update is done. The plan is to start around 08:00 UTC on 14 September. This could change. [https://phabricator.wikimedia.org/T187984] * The Wikipedia Android app will send [[:mw:Wikimedia Apps/Team/Android/AppEditorTasks#Push Notifications for editors|push notifications]] if users want them. This could help you see for example when someone wrote on your talk page or your edit was reverted. This will need [[:w:en:Google Play Services|Google Play Services]] to work. It will also be possible to get the app without Google Play Services but push notifications will not work. Google Play Services is also used to make the app work for [[:w:en:Android KitKat|Android 4.4]] users. [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android#Updates][https://phabricator.wikimedia.org/T146032] * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Wikimedia code review could move to [[:w:en:GitLab|GitLab]]. It would be hosted on Wikimedia servers. You can take part in the [[mw:GitLab consultation|consultation]]. * [[File:Octicons-tools.svg|15px|link=|Advanced item]] Dropdown menus in [[mw:Special:MyLanguage/Skin:Vector|the Vector skin]] use a <code>.menu</code> class. This will not work in the future. Scripts can use <code>nav ul</code> instead. <code>.vectorTabs</code> and <code>.vectorMenu</code> will also not work. Some scripts need to be updated. You can [[phab:T262092|read more in Phabricator]]. '''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2020/37|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].'' </div></div> <section end="technews-2020-W37"/> 15:59, ngày 7 tháng 9 năm 2020 (UTC) <!-- Tin nhắn của Thành viên:Johan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=20427670 --> f2o3s8cgxnowkykfpcqw7yu3bycxgfh ông nói gà, bà nói vịt 0 258671 2345081 2232408 2026-04-14T01:20:01Z Hiyuune 50834 2345081 wikitext text/x-wiki =={{langname|vi}}== ==={{ĐM|pron}}=== {{vi-pron}} ==={{ĐM|idiom}}=== {{vi-idiom}} # {{label|vi|nghĩa bóng}} Nói trường hợp hai người [[đối thoại]] mỗi người nói một đằng, không [[ăn nhập]] với nhau, do không [[hiểu]] nhau. #* '''2016''', Sơn Nguyễn, ''[https://nld.com.vn/cong-doan/warning-la-cai-gi-20160120221327999.htm “Warning” là cái... gì!]'', Người Lao động: #*: {{quote|vi|Từ trước tới giờ, tại công ty xảy ra không ít chuyện cười ra nước mắt về việc “'''ông nói gà, bà nói vịt'''”, quản lý nói thì quản lý nghe, công nhân nói mặc công nhân nghe.}} ==={{ĐM|ref}}=== * {{R:Tratu}} {{C|vi|Gà|Vịt}} kl6rc20lqz2kxqtjjmytacangck9wvx Mô đun:quote 828 259961 2344949 2342111 2026-04-13T12:51:48Z TheHighFighter2 42988 2344949 Scribunto text/plain --[=[ This module contains functions to implement quote-* templates. Author: Benwing2; conversion into Lua of {{quote-meta/source}} template, written by Sgconlaw with some help from Erutuon and Benwing2. The main interface is quote_t(). Note that the source display is handled by source(), which reads both the arguments passed to it *and* the arguments passed to the parent template, with the former overriding the latter. ]=] local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local check_isxn_module = "Module:check isxn" local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local italics_module = "Module:italics" local labels_module = "Module:labels" local languages_module = "Module:languages" local languages_error_module = "Module:languages/error" local links_module = "Module:links" local number_utilities_module = "Module:number utilities" local parameters_module = "Module:parameters" local parse_utilities_module = "Module:parse utilities" local qualifier_module = "Module:qualifier" local roman_numerals_module = "Module:roman numerals" local scribunto_module = "Module:Scribunto" local script_utilities_module = "Module:script utilities" local scripts_module = "Module:scripts" local string_pattern_escape_module = "Module:string/patternEscape" local string_replacement_escape_module = "Module:string/replacementEscape" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local template_parser_module = "Module:template parser" local usex_module = "Module:usex" local usex_templates_module = "Module:usex/templates" local utilities_module = "Module:utilities" local yesno_module = "Module:yesno" local concat = table.concat local insert = table.insert local new_title = mw.title.new local remove = table.remove local require = require local sort = table.sort local u = mw.ustring.char local ugsub = mw.ustring.gsub local umatch = mw.ustring.match local unpack = unpack or table.unpack -- Lua 5.2 compatibility -- Use HTML entities here to avoid parsing issues (esp. with brackets) local SEMICOLON_SPACE = "&#59; " local SPACE_LBRAC = " &#91;" local RBRAC = "&#93;" local TEMP_LT = u(0xFFF1) local TEMP_GT = u(0xFFF2) local TEMP_LBRAC = u(0xFFF3) local TEMP_RBRAC = u(0xFFF4) local TEMP_SEMICOLON = u(0xFFF5) local function apply_subst(...) apply_subst = require(usex_module).apply_subst return apply_subst(...) end local function check_isbn(...) check_isbn = require(check_isxn_module).check_isbn return check_isbn(...) end local function check_issn(...) check_issn = require(check_isxn_module).check_issn return check_issn(...) end local function debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function decode_entities(...) decode_entities = require(string_utilities_module).decode_entities return decode_entities(...) end local function embedded_language_links(...) embedded_language_links = require(links_module).embedded_language_links return embedded_language_links(...) end local function escape_wikicode(...) escape_wikicode = require(parse_utilities_module).escape_wikicode return escape_wikicode(...) end local function find_best_script_without_lang(...) find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang return find_best_script_without_lang(...) end local function find_parameters(...) find_parameters = require(template_parser_module).find_parameters return find_parameters(...) end local function format_categories(...) format_categories = require(utilities_module).format_categories return format_categories(...) end local function format_processed_labels(...) format_processed_labels = require(labels_module).format_processed_labels return format_processed_labels(...) end local function format_qualifier(...) format_qualifier = require(qualifier_module).format_qualifier return format_qualifier(...) end local function format_usex(...) format_usex = require(usex_module).format_usex return format_usex(...) end local function get_lang(...) get_lang = require(languages_module).getByCode return get_lang(...) end local function get_number(...) get_number = require(number_utilities_module).get_number return get_number(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function gsplit(...) gsplit = require(string_utilities_module).gsplit return gsplit(...) end local function page_should_be_ignored(...) page_should_be_ignored = require(usex_templates_module).page_should_be_ignored return page_should_be_ignored(...) end local function parse_inline_modifiers(...) parse_inline_modifiers = require(parse_utilities_module).parse_inline_modifiers return parse_inline_modifiers(...) end local function parse_inline_modifiers_from_segments(...) parse_inline_modifiers_from_segments = require(parse_utilities_module).parse_inline_modifiers_from_segments return parse_inline_modifiers_from_segments(...) end local function parse_multi_delimiter_balanced_segment_run(...) parse_multi_delimiter_balanced_segment_run = require(parse_utilities_module).parse_multi_delimiter_balanced_segment_run return parse_multi_delimiter_balanced_segment_run(...) end local function parse_term_with_lang(...) parse_term_with_lang = require(parse_utilities_module).parse_term_with_lang return parse_term_with_lang(...) end local function pattern_escape(...) pattern_escape = require(string_pattern_escape_module) return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_params(...) process_params = require(parameters_module).process return process_params(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function roman_to_arabic(...) roman_to_arabic = require(roman_numerals_module).roman_to_arabic return roman_to_arabic(...) end local function replacement_escape(...) replacement_escape = require(string_replacement_escape_module) return replacement_escape(...) end local function scribunto_parameter_key(...) scribunto_parameter_key = require(scribunto_module).scribunto_parameter_key return scribunto_parameter_key(...) end local function serial_comma_join(...) serial_comma_join = require(table_module).serialCommaJoin return serial_comma_join(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function split(...) split = require(string_utilities_module).split return split(...) end local function split_alternating_runs(...) split_alternating_runs = require(parse_utilities_module).split_alternating_runs return split_alternating_runs(...) end local function split_and_process_raw_labels(...) split_and_process_raw_labels = require(labels_module).split_and_process_raw_labels return split_and_process_raw_labels(...) end local function split_on_comma(...) split_on_comma = require(parse_utilities_module).split_on_comma return split_on_comma(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) end local function tag_translit(...) tag_translit = require(script_utilities_module).tag_translit return tag_translit(...) end local function ulen(...) ulen = require(string_utilities_module).len return ulen(...) end local function unitalicize_brackets(...) unitalicize_brackets = require(italics_module).unitalicize_brackets return unitalicize_brackets(...) end local function upper(...) upper = require(string_utilities_module).upper return upper(...) end local function usub(...) usub = require(string_utilities_module).sub return usub(...) end local function yesno(...) yesno = require(yesno_module) return yesno(...) end local function track(page) debug_track("quote/" .. page) end local function maintenance_line(text) return '<span class="maintenance-line">(' .. text .. ")</span>" end local function isbn(text) return "[[Special:BookSources/" .. text .. "|→ISBN]]" .. check_isbn( text, '&nbsp;<span class="error" style="font-size:88%">Invalid&nbsp;ISBN</span>[[Category:Pages with ISBN errors]]' ) end local function issn(text) return "[https://www.worldcat.org/issn/" .. text .. " →ISSN]" .. check_issn( text, '&nbsp;<span class="error" style="font-size:88%">Invalid&nbsp;ISSN</span>[[Category:Pages with ISSN errors]]' ) end local function lccn(text) text = text:gsub(" ", "") if text:find("-") then -- old-style LCCN; reformat per request by [[User:The Editor's Apprentice]] local prefix, part1, part2 = text:match("^(.-)(%d+)%-(%d+)$") if prefix then if ulen(part2) < 6 then part2 = ("0"):rep(6 - ulen(part2)) .. part2 end text = prefix .. part1 .. part2 end end return "[https://lccn.loc.gov/" .. mw.uri.encode(text) .. " →LCCN]" end local function format_date(text) return mw.getCurrentFrame():callParserFunction("#formatdate", text, "dmy") end -- Parse a raw lb= param (or nil) to individual label info objects and then concatenate them appropriately into a -- qualifier input, respecting flags like `omit_preComma` and `omit_postSpace` in the label specs. local function parse_and_format_labels(raw_lb, lang) if not raw_lb then return nil end local labels = split_and_process_raw_labels{labels = raw_lb, lang = lang, nocat = true} labels = format_processed_labels{labels = labels, lang = lang, no_ib_content = true} if labels ~= "" then -- not sure labels can be an empty string but it seems possible in some circumstances return {labels} end end -- Convert a comma-separated list of language codes to a comma-separated list of language names. `fullname` is the -- name of the parameter from which the list of language codes was fetched. local function format_langs(langs) local names = {} for i, lang in ipairs(langs) do names[i] = lang:getCanonicalName() end if #names == 1 then return names[1] end return serial_comma_join(names) end local function get_first_lang(langs) return langs[1] or get_lang("und") end --[=[ Normally we parse off inline modifiers and language code prefixes in various places, e.g. he:מרים<tr:Miryem>. But we exclude HTML entries with <span ...>, <i ...>, <br/> or similar in it, caused by wrapping an argument in {{l|...}}, {{lang|...}} or similar. Basically, all tags of the sort we parse here should consist of a less-than sign, plus letters, plus a colon, e.g. <tr:...>, so if we see a tag on the outer level that isn't in this format, we don't try to parse it. The restriction to the outer level is to allow generated HTML inside of e.g. qualifier modifiers, such as foo<q:similar to {{m|fr|bar}}> (if we end up supporting such modifiers). Also exclude things that look like URL's from being parsed as having language code prefixes. ]=] local function val_should_not_be_parsed_for_annotations(val) return val:find("^[^<]*<%l*[^%l:]") or val:find("^%l+://") end local param_mods = { t = { -- <t:...> and <gloss:...> are aliases. item_dest = "gloss", }, gloss = {}, alt = {}, tr = {}, ts = {}, subst = {}, sc = {type = "script"}, f = { convert = function(arg, parse_err) local prefix, val = arg:match("^(.-):([^ ].*)$") if not prefix then prefix = "" val = arg end local tags, sc_code, sc = prefix:match("^(.*)/(.-)$") if sc_code then sc = get_script(sc_code) or require(languages_error_module)(sc_code, parse_err, "script code", nil, "not real lang") else tags = prefix end local quals if tags ~= "" then quals = split_on_comma(tags) for i, qual in ipairs(quals) do local obj = get_lang(qual, nil, "allow etym") or get_script(qual) quals[i] = obj or qual end end return { quals = quals, sc = sc, val = val, } end, store = "insert", }, q = {}, qq = {}, } local function generate_obj_annotated_text(text, parse_err, paramname) local obj = {} if text:find(":[^ ]") or text:find("%[%[") then local display, is_wikipedia_wikisource obj.text, obj.lang, obj.link, display, is_wikipedia_wikisource = parse_term_with_lang { term = text, parse_err = parse_err, paramname = paramname } -- HACK: If object is a Wikipedia or Wikisource link, we need to convert it to a two-part link -- to avoid the w: or s: prefix showing. We should probably avoid this by calling -- language_link() (in [[Module:links]]) in format_annotated_text() instead of the hacky stuff -- that we currently do; but we need to test that carefully to make sure it doesn't do things like -- munge % signs. if is_wikipedia_wikisource and not obj.text:find("%[%[") and not obj.text:find("%]%]") then -- Don't directly set .alt, because then if the user specifies <alt:...>, it will cause an error in -- parse_inline_modifiers(). obj.display = display end else obj.text = text obj.link = text end return obj end --[=[ Parse a textual property that may be in a foreign language or script and may be annotated with a language prefix and/or inline modifiers. `val` is the value of the parameter and `fullname` is the name of the parameter from which the value was retrieved. `explicit_gloss`, if specified and non-nil, overrides any gloss specified using the <t:...> or <gloss:...> inline modifier. If `val` is nil, the return value of this function is nil. Otherwise it is parsed for a language prefix (e.g. 'ar:مُؤَلِّف') and inline modifiers (e.g. 'ar:مُؤَلِّف<t:Author>'), and the return value is an object with the following fields: `lang`: The language object corresponding to the language prefix, if specified, or nil if no language prefix is given. `text`: The text after stripping off any language prefix and inline modifiers. `link`: The link part of the text if it consists of a two-part link; otherwise, same as `text`. `alt`: Display text specified using the <alt:...> modifier, if given; otherwise, nil. `subst`: Substitutions used to generate the transliteration, in the same format as the subst= parameter. `sc`: The script object corresponding to the <sc:...> modifier, if given; otherwise nil. `tr`: The transliteration corresponding to the <tr:...> modifier, if given; otherwise nil. `ts`: The transcription corresponding to the <ts:...> modifier, if given; otherwise nil. `gloss`: The gloss/translation corresponding to the `explicit_gloss` parameter (if given and non-nil), otherwise the <t:...> or <gloss:...> modifiers if given, otherwise nil. `f`: Foreign versions of the text. `q`: Left qualifiers. `qq`: Right qualifiers. Note that as a special case, if `val` contains HTML tags at the top level (e.g. '<span class="Arab">...</span>', as might be generated by specifying {{lang|ar|مُؤَلِّف}}), no language prefix or inline modifiers are parsed, and the return value has the `noscript` field set to true, which tells format_annotated_text() not to try to identify the script of the text and CSS-tag the text accordingly, but to leave the text untagged. This object can be passed to format_annotated_text() to format a string displaying the text (appropriately script-tagged, unless `noscript` is set, as described above) and modifiers. ]=] local function parse_annotated_text(val, fullname, explicit_gloss) if not val then return nil end -- When checking for inline modifiers, exclude HTML entry with <span ...>, <i ...>, <br/> or similar in it, caused -- by wrapping an argument in {{l|...}}, {{lang|...}} or similar. Also exclude URL's from being parsed as having -- language code prefixes. See val_should_not_be_parsed_for_annotations() for more information. If we find a -- parameter value with top-level HTML in it, add 'noscript = true' to indicate that we should not try to do script -- inference and tagging. (Otherwise, e.g. if you specify {{lang|ar|مُؤَلِّف}} as the author, you'll get an extra big -- font coming from the fact that {{lang|...}} wraps the Arabic text in CSS that increases the size from the -- default, and then we do script detection and again wrap the text in the same CSS, which increases the size even -- more.) if val_should_not_be_parsed_for_annotations(val) then return {text = val, link = val, noscript = true, gloss = explicit_gloss} end local obj if val:find("<") then -- Check for inline modifier. obj = parse_inline_modifiers(val, { paramname = fullname, param_mods = param_mods, generate_obj = generate_obj_annotated_text, }) else obj = generate_obj_annotated_text(val, nil, fullname) end if explicit_gloss then obj.gloss = explicit_gloss end return obj end local html_entity_char_to_replacement = { ["<"] = TEMP_LT, [">"] = TEMP_GT, ["["] = TEMP_LBRAC, ["]"] = TEMP_RBRAC, } local function html_entity_replacement(entity, code_without_semicolon, hash, xcode, x, code) -- Try to decode the entity. If successful, Replace certain special HTML entities (those that are bracket-like) -- with single Unicode characters; otherwise, replace the semicolon with a special character so it won't get -- interpreted as a delimiter. local ch = decode_entities(entity) if ch ~= entity then return html_entity_char_to_replacement[ch] or code_without_semicolon .. TEMP_SEMICOLON end -- If the entity doesn't decode, escape it anyway iff it follows a valid format. if hash == "" then -- Any nonstandard MediaWiki-only entities have now been filtered off, so treat any non-ASCII characters as -- invalid. return xcode:match("^[^\128-\255]+$") and code_without_semicolon .. TEMP_SEMICOLON or entity elseif x == "" then return xcode:match("^%d+$") and code_without_semicolon .. TEMP_SEMICOLON or entity end return code:match("^%x+$") and code_without_semicolon .. TEMP_SEMICOLON or entity end local html_entity_replacement_to_char = { [TEMP_LT] = "&lt;", [TEMP_GT] = "&gt;", [TEMP_LBRAC] = "&#91;", [TEMP_RBRAC] = "&#93;", [TEMP_SEMICOLON] = ";", } local function undo_html_entity_replacement(txt) -- Pattern covers everything in html_entity_replacement_to_char. return (txt:gsub("\239\191[\177-\181]", html_entity_replacement_to_char)) end -- NOTE: We try hard to optimize this function for the common cases and avoid loading [[Module:parse utilities]] -- in such cases. The cases we can handle without loading [[Module:parse utilities]] are single values (no -- semicolons present) without inline modifiers or language prefixes, and multi-entity values (semicolons present) -- without (a) brackets of any kind (including parens, braces and angle brackets; angle brackets typically indicate -- inline modifiers and other brackets may protect a semicolon from being interpreted as a delimiter); -- (b) ampersands (which may indicate HTML entities, which protect a semicolon from being interpreted as a -- delimiter); and (c) colons not followed by a space (which may indicate a language prefix). local function generate_obj_multivalued_annotated_text(text, parse_err, paramname, no_undo_html_entity_replacement) local obj = generate_obj_annotated_text(text, parse_err, paramname) if not no_undo_html_entity_replacement then obj.text = undo_html_entity_replacement(obj.text) obj.link = undo_html_entity_replacement(obj.link) end return obj end --[=[ Similar to parse_annotated_text() but the parameter value may contain multiple semicolon-separated entities, each with their own inline modifiers. Some examples: * mainauthor=Paula Pattengale; Terea Sonsthagen * author=Katie Brick; J. Cody Nielsen; Greg Jao; Eric Paul Rogers; John A. Monson * author=Suzanne Brockmann; Patrick G. Lawlor (Patrick Girard); Melanie Ewbank * author=G Ristori; et al. * author=Jason Scott; zh:王晰宁<t:Wang Xining> * editors=zh:包文俊; zh:金心雯 * quotee=zh:張福運<t:Chang Fu-yun>; zh:張景文<t:Chang Ching-wen> There may be embedded semicolons within brackets, braces or parens that should not be treated as delimiters, e.g.: * author=Oliver Optic [pseudonym; {{w|William Taylor Adams}}] * author=author=Shannon Drake (pen name; {{w|Heather Graham Pozzessere}}) * author=James (the Elder;) Humphrys There may also be HTML entities with semicolons in them: * author=&#91;{{w|Gilbert Clerke}}&#93; * 2ndauthor=Martin Biddle &amp; Sally Badham * author=Peter Christen Asbj&oslash;rnsen There may be both embedded semicolons and HTML entities with semicolons in them: * author=&#91;{{w|Voltaire}} [pseudonym; François-Marie Arouet]&#93; In general we want to treat &#91; like an opening bracket and &#93; like a closing bracket. Beware that they may be mismatched: * author=Anonymous &#91;{{w|Karl Maria Kertbeny}}] Here, `val` is the value of the parameter and `fullname` is the name of the parameter from which the value was retrieved. `explicit_gloss`, if specified and non-nil, overrides any gloss specified using the <t:...> or <gloss:...> inline modifier, and `explicit_gloss_fullname` is the name of the parameter from which this value was retrieved. (If `explicit_gloss` is specified and multiple values were seen, an error results.) Return value is a list of objects of the same sort as returned by parse_annotated_text(). ]=] local function parse_multivalued_annotated_text(val, fullname, explicit_gloss, explicit_gloss_fullname) if not val then return nil end -- NOTE: In the code that follows, we use `entity` most of the time to refer to one of the semicolon-separated -- values in the multivalued param. Entities are most commonly people (typically authors, editors, translators or -- the like), but may be the names of publishers, locations, or other entities. "Entity" can also refer to HTML -- entities; in the places where this occurs, the variable name contains 'html' in it. local splitchar, english_delim if val:find("^,") then splitchar = "," english_delim = "comma" val = val:gsub("^,", "") else splitchar = ";" english_delim = "semicolon" end -- Optimization #1: No semicolons/commas or angle brackets (indicating inline modifiers). if not val:find("[<" .. splitchar .. "]") then if val_should_not_be_parsed_for_annotations(val) then return {{text = val, link = val, noscript = true}} else return {generate_obj_multivalued_annotated_text(val, nil, fullname, "no undo html entity replacement")} end end -- Optimization #2: Semicolons/commas but no angle brackets (indicating inline modifiers), braces, brackets, or -- parens (any of which would protect the semicolon/comma from interpretation as a delimiter), and no ampersand -- (which might indicate an HTML entity with a terminating semicolon, which should not be interpreted as a -- delimiter). if not val:find("[<>%[%](){}&]") then local entity_objs = {} for entity in gsplit(val, "%s*" .. splitchar .. "%s*") do if val_should_not_be_parsed_for_annotations(entity) then insert(entity_objs, { text = entity, link = entity, noscript = true }) else insert(entity_objs, generate_obj_multivalued_annotated_text(entity, nil, fullname, "no undo html entity replacement")) end end return entity_objs end -- Escape HTML entities, and get rid of directionality markers. local amp = val:find("&", nil, true) if amp then -- The pattern is more permissive than the usual entity pattern, as MediaWiki has some nonstandard entities -- that have non-ASCII characters in their codes. val = val:gsub("((&(#?)(([xX]?)([%w\128-\255]+)));)", html_entity_replacement) end -- Pattern covers left-to-right (U+200E) and right-to-left (U+200F). val = val:gsub("\226\128[\142\143]", "") -- Parse balanced segment runs, treating HTML entities for left and right bracket and left and right angle bracket -- as matching literal versions of the same characters. local entity_runs = parse_multi_delimiter_balanced_segment_run( val, {{"[" .. TEMP_LBRAC, "]" .. TEMP_RBRAC}, {"(", ")"}, {"{", "}"}, {"<" .. TEMP_LT, ">" .. TEMP_GT}}, true ) if type(entity_runs) == "string" then local undo_val = undo_html_entity_replacement(val) -- Parse error due to unbalanced delimiters. Don't throw an error here; instead, don't attempt to parse off -- any annotations, but return the value directly, maybe allowing script tagging (not allowing it if it appears -- the text is already script-tagged). return {{text = undo_val, link = undo_val, noscript = not not val_should_not_be_parsed_for_annotations(val)}} end -- Split on semicolon (or comma), possibly surrounded by whitespace. local separated_groups = split_alternating_runs(entity_runs, "%s*" .. splitchar .. "%s*") -- Process each value. local entity_objs = {} for _, entity_group in ipairs(separated_groups) do -- Rejoin runs that don't involve <...>. local j = 2 while j <= #entity_group do if not entity_group[j]:find("^<.*>$") then entity_group[j - 1] = entity_group[j - 1] .. entity_group[j] .. entity_group[j + 1] remove(entity_group, j) remove(entity_group, j) else j = j + 2 end end local oneval = undo_html_entity_replacement(concat(entity_group)) -- When checking for inline modifiers, exclude HTML entry with <span ...>, <i ...>, <br/> or similar in it, -- caused by wrapping an argument in {{l|...}}, {{lang|...}} or similar. Also exclude URL's from being parsed -- as having language code prefixes. This works analogously to parse_annotated_text(); see there for more. if val_should_not_be_parsed_for_annotations(oneval) then insert(entity_objs, { text = oneval, link = oneval, noscript = true }) else local obj if #entity_group > 1 then -- Check for inline modifier. obj = parse_inline_modifiers_from_segments({ group = entity_group, arg = oneval, props = { paramname = fullname, param_mods = param_mods, generate_obj = generate_obj_multivalued_annotated_text, }, }) else obj = generate_obj_multivalued_annotated_text(entity_group[1], nil, fullname) end insert(entity_objs, obj) end end if explicit_gloss then if #entity_objs > 1 then error( ( "Can't specify |%s= along with multiple %s-separated entities in |%s=; use the <t:...> " .. "inline modifier attached to the individual entities" ):format(explicit_gloss_fullname, english_delim, fullname) ) end entity_objs[1].gloss = explicit_gloss end return entity_objs end --[=[ Format a text property that may be in a foreign language or script, along with annotations. This is conceptually similar to the full_link() function in [[Module:links]], but displays the annotations in a different format that is more appropriate for bibliographic entries. The output looks like this: TEXT [TRANSLIT /TRANSCRIPTION/, GLOSS] `textobj` is as returned by parse_annotated_text(). `tag_text_func`, if supplied, is a function of one argument to further wrap the text after it has been processed and CSS-tagged appropriately, directly before insertion. `tag_gloss_func` is a similar function for the gloss. ]=] local function format_annotated_text(textobj, tag_text_func, tag_gloss_func) if not textobj then return nil end local text, link = textobj.text, textobj.link local subst, tr, ts, f, gloss = textobj.subst, textobj.tr, textobj.ts, textobj.f, textobj.gloss -- Retrieve the display text, either specified by the user (.alt) or by parse_annotated_text() (.display) when a -- Wikipedia link is given. local alt = textobj.alt or textobj.display if alt then if link:find("%[%[") or link:find("%]%]") then local errmsg = ("Can't currently handle embedded links in '%s', with <alt:...> text '%s'"):format(link, alt) error(escape_wikicode(errmsg)) end text = ("[[%s|%s]]"):format(link, alt) end -- See above for `noscript`, meaning HTML was found in the text value, probably generated using {{lang|...}}. -- {{lang}} already script-tags the text and processes embedded language links, so we don't want to do it again (in -- fact, the code below within the if-clause is similar to what {{lang}} does). In such a case, an explicit language -- won't be available and find_best_script_without_lang() may not be accurate, so we can't do automatic transliteration. if not textobj.noscript then local lang = textobj.lang -- As an optimization, don't do script detection on an argument that contains only ASCII. local sc = textobj.sc or lang and lang:findBestScript(text) or not text:find("^[ -~]$") and find_best_script_without_lang(text) or nil -- As an optimization, don't do any of the following if there's no language, script, translit or transcription, -- as will be the case with simple ASCII values. if lang or sc or tr or ts then if not lang then lang = get_lang("und") end if tr == "-" then tr = nil elseif not tr and sc and not sc:getCode():find("Lat") then -- Latn, Latf, Latg, pjt-Latn -- might return nil local text_for_tr = text if subst then text_for_tr = apply_subst(text_for_tr, subst) else text_for_tr = remove_links(text) end tr = (lang:transliterate(text_for_tr, sc)) end if text:find("%[%[") then -- FIXME: embedded_language_links() replaces % signs with their URL-encoded equivalents, -- which messes up URL's that may be present (e.g. if chapterurl= is given). IMO this -- should not happen, and embedded_language_links() should do nothing if no embedded links -- are present. To work around this, only call embedded_language_links() when there are -- embedded links present. text = embedded_language_links({ term = text, lang = lang, sc = sc, }) end if lang:getCode() ~= "und" or sc:getCode() ~= "Latn" then text = tag_text(text, lang, sc) end if tr then -- Should we link to the transliteration of languages with lang:link_tr()? Probably not because `text` is not -- likely to be a term that has an entry. tr = tag_translit(tr, lang, "usex") end if ts then ts = tag_transcription(ts, lang, "usex") end end end text = unitalicize_brackets(text) if tag_text_func then text = tag_text_func(text) end local parts = {} if textobj.q then insert(parts, format_qualifier(textobj.q) .. " ") end insert(parts, text) if tr or ts or f or gloss then insert(parts, SPACE_LBRAC) local subparts = {} if tr or ts then local tr_ts if ts then ts = "/" .. ts .. "/" end if tr and ts then tr_ts = tr .. " " .. ts else tr_ts = tr or ts end insert(subparts, tr_ts) end if f then for _, ff in ipairs(f) do local sc = ff.sc local lang if not sc and ff.quals then local qual = ff.quals[1] if type(qual) == "string" then -- do nothing; we'll do script detection farther down elseif qual:hasType("script") then sc = qual else -- language sc = qual:findBestScript(ff.val) lang = qual end end if not lang then lang = get_lang("und") end sc = sc or find_best_script_without_lang(ff.val) local val = embedded_language_links({ term = ff.val, lang = lang, sc = sc, }) if lang:getCode() ~= "und" or sc:getCode() ~= "Latn" then val = tag_text(val, lang, sc) end local qual_prefix if ff.quals then for i, qual in ipairs(ff.quals) do if type(qual) ~= "string" and (qual:hasType("script") or qual:hasType("language")) then ff.quals[i] = qual:getCanonicalName() end end qual_prefix = concat(ff.quals, "/") .. ": " else qual_prefix = "" end insert(subparts, qual_prefix .. val) end end if gloss then gloss = '<span class="e-translation">' .. gloss .. "</span>" gloss = unitalicize_brackets(gloss) if tag_gloss_func then gloss = tag_gloss_func(gloss) end insert(subparts, gloss) end insert(parts, concat(subparts, ", ")) insert(parts, RBRAC) end if textobj.qq then insert(parts, " " .. format_qualifier(textobj.qq)) end return concat(parts) end --[=[ Format a multivalued text property that may be in a foreign language or script, along with annotations. This is the multivalued analog to format_annotated_text(), and formats each individual entity using format_annotated_text(), joining the results with `delimiter`, which defaults to ", ". It `delimiter` is "and" or "or", join the results using serial_comma_join() with the specified conjunction. `textobjs` is as returned by parse_multivalued_annotated_text(). `tag_text_func` and `tag_gloss_func` are as in format_annotated_text(). ]=] local function format_multivalued_annotated_text(textobjs, delimiter, tag_text_func, tag_gloss_func) if not textobjs then return nil end if #textobjs == 1 then return format_annotated_text(textobjs[1], tag_text_func, tag_gloss_func) end local parts = {} for _, textobj in ipairs(textobjs) do insert(parts, format_annotated_text(textobj, tag_text_func, tag_gloss_func)) end -- Change delimiter to semicolon if the items themselves contain commas (e.g., in ", Jr.") local use_semicolon = false for _, obj in ipairs(textobjs) do -- Use remove_links to ignore commas in links if obj.text and remove_links(obj.text):find(", ") then use_semicolon = true break end end local n = #parts if n > 0 and parts[n]:match("^'*et al[.']*$") then -- Special handling for 'et al.' parts[n] = "''và đồng nghiệp''" if n == 2 then -- author et al. return concat(parts, " ") else -- author 1, author 2, et al. return concat(parts, (use_semicolon and "; ") or ", ") end if delimiter == "và" or delimiter == "hoặc" then delimiter = ", " end return concat(parts, delimiter) end if delimiter == "và" or delimiter == "hoặc" then return serial_comma_join(parts, {conj = delimiter}) end return concat(parts, delimiter or ((use_semicolon and "; ") or ", ")) end -- Fancy version of ine() (if-not-empty). Converts empty string to nil, but also strips leading/trailing space. local function ine(arg) if not arg then return nil elseif type(arg) ~= "string" then return arg end arg = mw.text.trim(arg) if arg == "" then return nil end return arg end local abbrs = { ["a."] = {anchor = "a.", full = "trước"}, ["c."] = {anchor = "kh.", full = "khoảng"}, ["kh."] = {anchor = "kh.", full = "khoảng"}, ["p."] = {anchor = "p.", full = "sau"}, } -- Process prefixes 'a.' (ante), 'c.' (circa) and 'p.' (post) at the beginning of an arbitrary date or year spec. -- Returns two values, the formatted version of the prefix and the date spec minus the prefix. If no prefix is found, -- returns an empty string and the full date. local function process_ante_circa_post(date) local prefix = usub(date, 1, 2) local abbr = abbrs[prefix] local abbr_prefix = "" if abbr then abbr_prefix = "''[[Phụ lục:Từ điển thuật ngữ#" .. abbr.anchor .. '|<abbr title="' .. abbr.full .. '">' .. abbr.anchor .. "</abbr>]]'' " -- Remove lowercase letter, period, and space from beginning of date parameter. date = ugsub(date, "^%l%.%s*", "") end return abbr_prefix, date end -- Format the arguments that specify the date of the quotation. These include the following: -- |date=: The date. If |start_date= is given, this is the end date. -- |year=, |month=: Year and month of quotation date or end of range, if |date= isn't given. -- |start_date=: The start date, to specify a range. -- |start_year=, |start_month=: Year and month of start of range, if |start_date= isn't given. -- |accessdate=: Date a website was accessed; processed if no other date was given. -- |nodate=: Indicate that no date is present; otherwise a maintenance line will be displayed if there is no date. -- -- If `parampref` and/or `paramsuf` are given, this modifies all the date arguments accordingly. For example, if -- `parampref` == "orig" and `paramsuf` is omitted, the date is specified using |origdate= or |origyear=/|origmonth=, -- and the start of the range is |origstart_date=, etc. Similarly, if `parampref` is omitted and `paramsuf` is -- "_published", the date is specified using |date_published= or |year_published=/|month_published=, and the start of -- the range is |start_date_published=, etc. -- -- `a` and `get_full_paramname` are functions with the same interpretation as the local functions of the same name in -- source(). These are used to fetch parameters and get their full names. Note that this may cause all arguments to -- have an index added to them (|date2=, |year2=, |month2=, etc.). -- -- `alias_map` is as in source() and is used to map canonical arguments to their aliases when aliases were used. -- -- If `bold_year` is given, displayed years are boldfaced unless boldface is present in the parameter value. -- -- If `maintenance_line_no_date` is specified, it should be a string that will be returned if no date is found (i.e. -- neither |date= nor |year=, or their appropriate equivalents per `parampref` and `paramsuf`, are specified, and -- neither |nodate= is given to indicate that there is no date, or |accessdate= is given). -- -- Returns two values: the formatted date and a boolean indicating whether to add a maintenance category -- [[:Category:Requests for date in LANG entries]]. The first return value will be nil if nothing is to be added -- (in which case the scond return value will always be nil). local function format_date_args( a, get_full_paramname, alias_map, parampref, paramsuf, bold_year, maintenance_line_no_date, year_last ) local output = {} parampref = parampref or "" paramsuf = paramsuf or "" local function getp(param) return a(parampref .. param .. paramsuf) end local function pname(param) local fullname = get_full_paramname(parampref .. param .. paramsuf) return alias_map[fullname] or fullname end -- Format `timestamp` (a timestamp referencing a date) according to the spec in `code`. `param` is the base name of -- the parameter from which the timestamp was fetched, for error messages. local function format_date_with_code(code, timestamp, param) local language = mw.getContentLanguage() local ok, date = pcall(language.formatDate, language, code, timestamp) if ok then return date else -- All the formats used in format_date_args() are fine, so the timestamp must be at fault. error( ( "Timestamp |%s=%s (possibly canonicalized from its original format) could not be parsed; see the " .. "[[mw:Help:Extension:ParserFunctions##time|documentation for the #time parser function]]" ):format(pname(param), tostring(timestamp)) ) end end -- Try to figure out if the given timestamp has the day of the month explicitly given. We use the following -- algorithm: -- 1. Format as year-month-day; if the day is not 1, the day was explicitly given, since if only the year/month are -- given, the day shows up as 1. -- 2. If the day shows up as 1 and there isn't a 1 or 01 in the timestamp, the day wasn't explicitly given. -- 3. Otherwise, if there are three separate numbers (e.g. 2022-07-01), or two separate numbers plus a capitalized -- letter (taken as an English month, e.g. 2022 July 1), the day was explicitly given, otherwise not. -- -- `param` is the base name of the parameter from which the timestamp was fetched. local function date_has_day_specified(timestamp, param) local day = format_date_with_code("j", timestamp, param) if day ~= "1" then return true end local english_month = timestamp:find("%u") local canon_timestamp = mw.text.trim((timestamp:gsub("%D+", " "))) local seen_nums = split(canon_timestamp, " ", true) local saw_one = false for _, num in ipairs(seen_nums) do if num == "1" or num == "01" then saw_one = true break end end if not saw_one then return false end return #seen_nums >= 3 or english_month and #seen_nums >= 2 end -- Format a date with boldfaced year, as e.g. '''2023''' August 3. `explicit_day_given` indicates whether to include -- the day; if false, the return value will be e.g. '''2023''' August. `date_param` is the base name of the param -- from which the date was fetched, for error messages. local function format_bold_date(date, explicit_day_given, date_param) local day_month_code = explicit_day_given and "j F" or "F" local month_day_code = explicit_day_given and "d/m/" or "F" if year_last then if bold_year then -- This formats like "3 August '''2023'''" (or "August '''2023'''" if day not explicitly given). return format_date_with_code(day_month_code .. " '''Y'''", date, date_param) else -- This formats like "3 August 2023" (or "August 2023" if day not explicitly given). return format_date_with_code(day_month_code .. " Y", date, date_param) end else if bold_year then -- This formats like "'''2023''' August 3" (or "'''2023''' August" if day not explicitly given). return format_date_with_code("'''" .. month_day_code .. "Y'''", date, date_param) else -- This formats like "2023 August 3" (or "2023 August" if day not explicitly given). return format_date_with_code(month_day_code .. "Y", date, date_param) end end end -- The formatDate method of the mw.language object behaves like the {{#time:}} parser function, which doesn't -- accept the formats "monthday monthname, year" or "year monthname monthday", but outputs garbage when it receives -- them, behavior inherited from PHP. {{#formatdate:}} magic word is more forgiving. Fix dates so that, for -- instance, the |date= parameter of {{quote-journal}} (which uses this code) and the |accessdate= parameter (which -- uses {{#formatdate:}}) accept similar date formats. See: -- * [[mw:Extension:Scribunto/Lua_reference_manual#mw.language:formatDate]] -- * [[mw:Help:Extension:ParserFunctions##time]] -- * [[mw:Help:Magic_words#Formatting]] -- `date` is the date spec from the user, which is assumed to come from a parameter whose base name ends in "date"; -- `parampref` is the prefix added to "date" to get the parameter name. local function fix_date(date, param_pref) if tonumber(date) ~= nil then error( ("|%s= should contain a full date (year, month, day of month); use |%s= for year"):format( pname(param_pref .. "date"), pname(param_pref .. "year") ) ) elseif date and date:find("%s*%a+,%s*%d+%s*$") then error( ("|%s= should contain a full date (year, month, day of month); use |%s=, |%s= for month and year"):format( pname(param_pref .. "date"), pname(param_pref .. "month"), pname(param_pref .. "year") ) ) end if date then -- Commas are replaced with spaces to prevent parsing issues local fixed_date = ugsub(date, ", *", " ") return (ugsub(ugsub(fixed_date or date, "(%d+ %a+),", "%1"), "^(%d%d%d%d) (%a+ %d%d?)$", "%2 %1")) end end local start_date, date = fix_date(getp("start_date"), "start_"), fix_date(getp("date"), "") local year = getp("year") local month = getp("month") local start_year = getp("start_year") local start_month = getp("start_month") if date and year then error(("Only one of |%s= or |%s= should be specified"):format(pname("date"), pname("year"))) end if date and month then error( ("|%s= should only be specified in conjunction with |%s=, not with |%s="):format( pname("month"), pname("year"), pname("date") ) ) end if start_date and start_year then error(("Only one of |%s= or |%s= should be specified"):format(pname("start_date"), pname("start_year"))) end if start_date and start_month then error( ("|%s= should only be specified in conjunction with |%s=, not with |%s="):format( pname("start_month"), pname("start_year"), pname("start_date") ) ) end if (start_date or start_year) and not (date or year) then error( ("|%s= or |%s=/|%s= cannot be specified without specifying |%s= or |%s=/|%s="):format( pname("start_date"), pname("start_year"), pname("start_month"), pname("date"), pname("year"), pname("month") ) ) end local dash = "&nbsp;– " local day_explicitly_given = date and date_has_day_specified(date, "date") local start_day_explicitly_given = start_date and date_has_day_specified(start_date, "start_date") -- Format a date with boldfaced year, as e.g. '''2023''' August 3 (if `explicit_day_given` specified) or -- '''2023''' August (if `explicit_day_given` not specified). If no date specified, fall back to formatting based -- on the year and (optionally) month params given in `yearobj` and `monthobj`, boldfacing the year if not already. -- `date_param` is the base name of the param from which the date was fetched, for error messages. local function format_date_or_year_month(date, yearobj, monthobj, explicit_day_given, date_param) if date then return format_bold_date(date, explicit_day_given, date_param) else -- Boldface a year spec if it's not already boldface. if bold_year and not yearobj.text:find("'''") then -- Clone the year object before modifying it because we may use it later to check against the current -- year (if we're dealing with start_year). yearobj = shallow_copy(yearobj) yearobj.text = "'''" .. yearobj.text .. "'''" if yearobj.alt then yearobj.alt = "'''" .. yearobj.alt .. "'''" end end if year_last then return (monthobj and format_annotated_text(monthobj) .. " " or "") .. format_annotated_text(yearobj) else return format_annotated_text(yearobj) .. (monthobj and " " .. format_annotated_text(monthobj) or "") end end end local yearobj = parse_annotated_text(year, pname("year")) local monthobj = parse_annotated_text(month, pname("month")) local start_yearobj = parse_annotated_text(start_year, pname("start_year")) local start_monthobj = parse_annotated_text(start_month, pname("start_month")) if start_yearobj then local abbr_prefix abbr_prefix, start_yearobj.text = process_ante_circa_post(start_yearobj.text) start_yearobj.link = select(2, process_ante_circa_post(start_yearobj.link)) insert(output, abbr_prefix) elseif yearobj then local abbr_prefix abbr_prefix, yearobj.text = process_ante_circa_post(yearobj.text) yearobj.link = select(2, process_ante_circa_post(yearobj.link)) insert(output, abbr_prefix) end if start_date or start_year then local cur_year = yearobj and yearobj.text or format_date_with_code("Y", date, "date") local cur_month = monthobj and monthobj.text or date and format_date_with_code("F", date, "date") or nil local cur_day = date and day_explicitly_given and format_date_with_code("j", date, "date") or nil local beg_year = start_yearobj and start_yearobj.text or format_date_with_code("Y", start_date, "start_date") local beg_month = start_monthobj and start_monthobj.text or start_date and format_date_with_code("F", start_date, "start_date") or nil local beg_day = start_date and start_day_explicitly_given and format_date_with_code("j", start_date, "start_date") or nil if year_last then if beg_day then insert(output, beg_day .. " " .. beg_month) else insert(output, beg_month) end if beg_year ~= cur_year then insert(output, " " .. beg_year) end else insert(output, format_date_or_year_month( start_date, start_yearobj, start_monthobj, start_day_explicitly_given, "start_date" )) end if cur_year ~= beg_year then -- Different years; insert current date in full. if beg_month or cur_month then insert(output, dash) else insert(output, "–") end insert(output, format_date_or_year_month(date, yearobj, monthobj, day_explicitly_given, "date")) elseif cur_month and cur_month ~= beg_month then local month_ins = monthobj and format_annotated_text(monthobj) or cur_month -- Same year but different months; insert current month and (if available) current day. if cur_day then insert(output, dash) if year_last then insert(output, cur_day .. " " .. month_ins) else insert(output, month_ins .. " " .. cur_day) end else if beg_day then insert(output, dash) else insert(output, "–") end insert(output, month_ins) end elseif cur_day and cur_day ~= beg_day then -- Same year and month but different days; insert current day. insert(output, "–") insert(output, cur_day) else -- Same year, month and day; or same year and month, and day not available; or same year, and month and -- day not available. Do nothing. FIXME: Should we throw an error? end if year_last and beg_year == cur_year then if cur_month then insert(output, " " .. cur_year) else insert(output, " " .. cur_year) end end elseif date or yearobj then insert(output, format_date_or_year_month(date, yearobj, monthobj, day_explicitly_given, "date")) elseif not maintenance_line_no_date then -- Not main quote date. Return nil, caller will handle. return nil, nil elseif not getp("nodate") then local accessdate = getp("accessdate") if accessdate then local explicit_day_given = date_has_day_specified(accessdate, "accessdate") insert(output, format_bold_date(accessdate, explicit_day_given, "accessdate") .. " (truy cập lần cuối)") else if mw.title.getCurrentTitle().namespace ~= 10 then return maintenance_line(maintenance_line_no_date), true end return nil, nil end end return ine(concat(output)), nil end local function tag_with_cite(txt) return "<cite>" .. txt .. "</cite>" end -- Display the source line of the quote, above the actual quote text. This contains the majority of the logic of this -- module (formerly contained in {{quote-meta/source}}). function export.source(args, alias_map, format_as_cite, other_controls) local tracking_categories = {} local argslang = args[1] or args.lang if not argslang then -- For the moment, only trigger an error on mainspace pages and -- other pages that are not user pages or pages containing discussions. -- These are the same pages that appear in the appropriate tracking -- categories. User and discussion pages have not generally been -- fixed up to include a language code and so it's more helpful -- to use a maintenance line than signal an error. local current_title = mw.title.getCurrentTitle() if not (current_title.namespace == 10 or page_should_be_ignored(current_title.fullText)) then require(languages_error_module)(nil, 1) end end -- Given a canonical param, convert it to the original parameter specified by the user (which may have been an -- alias). local function alias(param) return alias_map[param] or param end local output, sep = {} local overrides = other_controls and other_controls.overrides or {} -- Add text to the output. The text goes into a list, and we concatenate all the list components together at the -- end. To make it easier to handle comma-separated items, we keep track (in `sep`) of the separator (if any) that -- needs to be inserted before the next item added. For example, if we're in the "newversion" code (ind ~= ""), and -- there's no title and no URL, then the first time we add anything after the title, we don't want to add a -- separating comma because the preceding text will say "republished " or "republished as " or "translated as " or -- similar. In all- other cases, we do want to add a separating comma. The bare add() function reset the separator -- to be nothing, while the add_with_sep() function resets the separator to be the value of `next_sep` (defaulting -- to ", "), so the next time around we do add a comma to separate `text` from the preceding piece of text. local function add(text) if sep then insert(output, sep) end insert(output, text) sep = nil end local function add_with_sep(text, next_sep) add(text) sep = next_sep or ", " end -- FIXME: This is all very over-engineered, which makes it slow and memory-inefficient. -- Return a function that generates the actual parameter name associated with a base param (e.g. "author", "last"). -- The actual parameter name may have an index added (an empty string for the first set of params, e.g. author=, -- last=, or a numeric index for further sets of params, e.g. author2=, last2=, etc.). local function make_get_full_paramname(ind) return function(param) return param .. ind end end -- Function to fetch the actual parameter name associated with a base param (see make_get_full_paramname() above). -- Assigned at various times below by calling make_get_full_paramname(). We do it this way so that we can have -- wrapper functions that access params and define them only once. local get_full_paramname -- Return two values: the value of a parameter given the base param name (which may have a numeric index added), -- and the parameter name from which the value was fetched (which may be an alias, i.e. you can't necessarily fetch -- the parameter value from args[] given this name). The base parameter can be a list of such base params, which -- are checked in turn, or nil, in which case nil is returned. local function a_with_name(param) if not param then return nil elseif type(param) ~= "table" then local fullname = get_full_paramname(param) return args[fullname], alias(fullname) end for _, par in ipairs(param) do local val, fullname = a_with_name(par) if val then return val, alias(fullname) end end return nil end -- Fetch the value of a parameter given the base param name (which may have a numeric index added). The base -- parameter can be a list of such base params, which are checked in turn, or nil, in which case nil is returned. local function a(param) return (a_with_name(param)) end -- Identical to a_with_name(param) except that it verifies that no space is present. Should be used for URL's. local function aurl_with_name(param) local value, fullname = a_with_name(param) if value and value:find(" ") and not value:find("%[") then error(("URL not allowed to contain a space, but saw |%s=%s"):format(fullname, value)) end return value, fullname end -- Identical to a(param) except that it verifies that no space is present. Should be used for URL's. local function aurl(param) return (aurl_with_name(param)) end -- Convenience function to fetch a parameter that may be in a foreign language or text (and may consequently have -- a language prefix and/or inline modifiers), parse the annotations and convert the result into a formatted string. -- This is the same as parse_and_format_annotated_text() below but also returns the full param name as the second -- return value. local function parse_and_format_annotated_text_with_name(param, tag_text_func, tag_gloss_func) local val, fullname = a_with_name(param) local obj = parse_annotated_text(val, fullname) return format_annotated_text(obj, tag_text_func, tag_gloss_func), fullname end -- Convenience function to fetch a parameter that may be in a foreign language or text (and may consequently have -- a language prefix and/or inline modifiers), parse the modifiers and convert the result into a formatted string. -- This is a wrapper around parse_annotated_text() and format_annotated_text(). `param` is the base parameter name (see -- a_with_name()), `tag_text_func` is an optional function to tag the parameter text after all other processing (e.g. -- wrap in <cite>...</cite> tags), and `tag_gloss_func` is a similar function for the parameter translation/gloss. local function parse_and_format_annotated_text(param, tag_text_func, tag_gloss_func) return (parse_and_format_annotated_text_with_name(param, tag_text_func, tag_gloss_func)) end -- Convenience function to fetch a multivalued parameter that may be in a foreign language or text (and may -- consequently have a language prefix and/or inline modifiers), parse the modifiers and convert the result into a -- formatted string. This is the multivalued analog to parse_and_format_annotated_text_with_name() and returns two -- values, the formatted string and the full name of the parameter fetched. `delimiter` is as in -- format_multivalued_annotated_text(). local function parse_and_format_multivalued_annotated_text_with_name(param, delimiter, tag_text_func, tag_gloss_func) local val, fullname = a_with_name(param) local objs = parse_multivalued_annotated_text(val, fullname) local num_objs = objs and #objs or 0 return format_multivalued_annotated_text(objs, delimiter, tag_text_func, tag_gloss_func), fullname, num_objs end -- Convenience function to fetch a multivalued parameter that may be in a foreign language or text (and may -- consequently have a language prefix and/or inline modifiers), parse the modifiers and convert the result into a -- formatted string. This is the multivalued analog to parse_and_format_annotated_text(). `delimiter` is as in -- format_multivalued_annotated_text(). local function parse_and_format_multivalued_annotated_text(param, delimiter, tag_text_func, tag_gloss_func) return (parse_and_format_multivalued_annotated_text_with_name(param, delimiter, tag_text_func, tag_gloss_func)) end -- This determines whether to display "Mary Bloggs, transl." (if there's no author preceding) or "translated by -- Mary Bloggs" (if there's an author preceding). local author_outputted = false -- When formatting as a citation, the priority is to display a name and a date before the book/chapter title -- this tracks whether or not the author/date has been displayed local date_outputted, formatted_date, formatted_origdate = false local function add_date(no_paren) if not date_outputted then if no_paren then sep = ", " else sep = " " end if formatted_date then if no_paren then add(formatted_date) else add("(" .. formatted_date .. ")") end end if formatted_origdate then add(SPACE_LBRAC .. formatted_origdate .. RBRAC) end sep = ", " date_outputted = true end end local function is_anonymous(val) return val:match("^[Aa]nonymous$") or val:match("^[Aa]non%.?$") end -- Add a formatted author (whose values may be specified using `author` or, for compatibility purposes, split -- among various parameters): -- * `author` is the value of the author param (e.g. "author", "author2" or "2ndauthor"), and `author_fullname` is -- the full parameter name holding that value; -- * `trans_author` is the optional value of the param holding the gloss/translation of the author, and -- `trans_author_fullname` is the full parameter name holding that value (or nil for no such parameter); -- * `authorlink` is the value of the authorlink param, which holds the Wikipedia link of the author(s) in `author`, -- and `authorlink_fullname` is the full parameter name holding that value; -- * `trans_authorlink` is the optional value of the param holding the Wikipedia link of the gloss/translation of -- the author, and `trans_authorlink_fullname` is the full parameter name holding that value (or nil for no such -- parameter); -- * `first` is the value of the parameter holding the first name of the author, and `first_fullname` is the full -- parameter name holding that value; -- * `trans_first` is the value of the corresponding parameter holding the gloss/translation of the first name -- (e.g. "trans-first"), and `trans_first_fullname` is the full parameter name holding that value (or nil for -- no such parameter); -- * `last` is the value of the parameter holding the last name of the author, and `last_fullname` is the full -- parameter name holding that value; -- * `trans_last` is the value of the corresponding parameter holding the gloss/translation of the last name -- (e.g. "trans-last"), and `trans_last_fullname` is the full parameter name holding that value (or nil for -- no such parameter). -- * `last_first` if set, when parameters `first` and `last` are used, display the author name as "last, first" local function add_author( author, author_fullname, trans_author, trans_author_fullname, authorlink, authorlink_fullname, trans_authorlink, trans_authorlink_fullname, first, first_fullname, trans_first, trans_first_fullname, last, last_fullname, trans_last, trans_last_fullname, last_first ) local function make_author_with_url(txt, txtparam, authorlink, authorlink_param) if authorlink then if authorlink:find("%[%[") then error(("Can't specify links in |%s=%s"):format(authorlink_param, authorlink)) end if txt:find("%[%[") then error(("Can't specify links in %s=%s"):format(txtparam, txt)) end return "[[w:" .. authorlink .. "|" .. txt .. "]]" else return txt end end local num_authorobjs if author then local authorobjs = parse_multivalued_annotated_text(author, author_fullname, trans_author, trans_author_fullname) num_authorobjs = #authorobjs if num_authorobjs == 1 then if is_anonymous(authorobjs[1].text) then authorobjs[1].text = "Tác giả khuyết danh" authorobjs[1].link = "Tác giả khuyết danh" end if authorlink then authorobjs[1].text = make_author_with_url( authorobjs[1].text, "|" .. author_fullname, authorlink, "|" .. authorlink_fullname ) authorobjs[1].link = make_author_with_url( authorobjs[1].link, "|" .. author_fullname, authorlink, "|" .. authorlink_fullname ) end if authorobjs[1].gloss and trans_authorlink then authorobjs[1].gloss = make_author_with_url( authorobjs[1].gloss, ("<t:...> in |%s"):format(author_fullname), trans_authorlink, "|" .. trans_author_fullname ) end add(format_multivalued_annotated_text(authorobjs)) elseif trans_authorlink then error( ( "Can't specify |%s= along with multiple semicolon-separated entities in |%s=; use the " .. "<t:...> inline modifier attached to the individual entities and put the link directly " .. "in the value of the inline modifier" ):format(trans_authorlink_fullname, author_fullname) ) else -- Allow an authorlink with multiple authors, e.g. for use with |author=Max Mills; Harvey Mills -- with |authorlink=Max and Harvey. For this we have to generate the entire text and link it -- all. local formatted_text = format_multivalued_annotated_text(authorobjs) if authorlink then formatted_text = make_author_with_url( formatted_text, "|" .. author_fullname, authorlink, "|" .. authorlink_fullname ) end add(formatted_text) end else num_authorobjs = 1 -- Author separated into first name + last name. We don't currently support non-Latin-script -- authors separated this way and probably never will. if first then if last_first then author = last .. ", " .. first else author = first .. " " .. last end else author = last end if authorlink then local authorparam = first and ("|%s |%s"):format(first_fullname, last_fullname) or "|" .. last_fullname author = make_author_with_url(author, authorparam, authorlink, authorlink_fullname) end local trans_author if trans_last then if trans_first then trans_author = trans_first .. " " .. trans_last else trans_author = trans_last end if trans_authorlink then local trans_authorparam = trans_first and ("|%s |%s"):format(trans_first_fullname, trans_last_fullname) or "|" .. trans_last_fullname trans_author = make_author_with_url( trans_author, trans_authorparam, trans_authorlink, trans_authorlink_fullname ) end end add(author) if trans_author then add(SPACE_LBRAC) add(trans_author) add(RBRAC) end end author_outputted = true return num_authorobjs end local function add_authorlike( param, prefix_with_preceding_authors, suffix_without_preceding_authors, suffix_if_multiple, anonymous_suffix ) local delimiter = author_outputted and "và" or ", " local entities, _, num_entities = parse_and_format_multivalued_annotated_text_with_name(param, delimiter) if not entities then return end if is_anonymous(entities) then -- If tlr=anonymous or similar given, display as "anonymous translator" or similar. If a specific -- anonymous suffix not given, try to derive the anonymous suffix from the non-preceding-author suffix. if not anonymous_suffix then local cleaned_suffix = suffix_without_preceding_authors :gsub("&#32;", " ") :gsub("&nbsp;", " ") :gsub("&#160;", " ") :gsub("&#91;", "[") :gsub("&#93;", "]") cleaned_suffix = mw.text.trim(cleaned_suffix) if not anonymous_suffix then anonymous_suffix = " " .. cleaned_suffix:match("^, (.*)$") end if not anonymous_suffix then anonymous_suffix = " " .. cleaned_suffix:match("^%((.*)%)$") end if not anonymous_suffix then anonymous_suffix = " " .. cleaned_suffix:match("^%[(.*)%]$") end if not anonymous_suffix then anonymous_suffix = suffix_without_preceding_authors end end add_with_sep("anonymous" .. anonymous_suffix) elseif prefix_with_preceding_authors and (author_outputted or not suffix_without_preceding_authors) then add_with_sep(entities .. prefix_with_preceding_authors) elseif suffix_if_multiple and num_entities > 1 then add_with_sep(entities .. suffix_if_multiple) else add_with_sep(entities .. suffix_without_preceding_authors) end author_outputted = true end local function add_authorlabel() local default_authorlabel = a("default-authorlabel") if default_authorlabel and yesno(a("authorlabel"), true) then sep = nil add_with_sep(" " .. default_authorlabel) end end local function has_new_title_or_author() return args["2ndauthor"] or args["2ndlast"] or args.chapter2 or args.title2 or args.tlr2 or args.mainauthor2 or args.editor2 or args.editors2 or args.compiler2 or args.compilers2 or args.director2 or args.directors2 end local function has_newversion() return args.newversion or args.location2 or has_new_title_or_author() end -- Handle chapter=, section=, etc. `param` is the base name of the parameter in question, e.g. "chapter" or -- "section". If numeric (either Arabic or Roman), add `numeric_prefix`; otherwise, parse as textual (allowing for -- language prefixes, inline modifiers, etc.), prefix with `textual_prefix` (if given) and suffix with -- `textual_suffix` (if given). Also checks for and handles the following (assuming param == "chapter"): -- * chapterurl=: URL of the chapter. -- * trans-chapter=: Chapter translation (can be given using an inline modifier <t:...>). -- * chapter_number=: Chapter number, when chapter= is also given (otherwise put the chapter number in chapter=). -- * chapter_plain=: Plain version of the chapter number; the "chapter " prefix isn't added. -- * chapter_series=: Series that the chapter is within (used e.g. for journal articles part of a series). -- * chapter_seriesvolume=: Volume of the series (compare seriesvolume=). -- -- Returns nil if no value specified for the main parameter, otherwise the formatted value. local function format_chapterlike(param, numeric_prefix, textual_prefix, textual_suffix) local chap, chap_fullname = a_with_name(param) local chap_num, chap_num_fullname = a_with_name(param .. "_number") local chap_plain, chap_plain_fullname = parse_and_format_annotated_text_with_name(param .. "_plain") if chap_num and chap_plain then error(("Specify only one of |%s= or %s="):format(chap_num_fullname, chap_plain_fullname)) end local chap_series, chap_series_fullname = parse_and_format_annotated_text_with_name(param .. "_series", tag_with_cite, tag_with_cite) local chap_seriesvolume, chap_seriesvolume_fullname = parse_and_format_annotated_text_with_name(param .. "_seriesvolume") if chap_series then chap_series = ", " .. chap_series end if chap_seriesvolume then if not chap_series then error(("Cannot specify |%s= without %s="):format(chap_series_fullname, chap_seriesvolume_fullname)) end chap_series = chap_series .. " (" .. chap_seriesvolume .. ")" end local chapterurl local function make_chapter_with_url(chap) if chapterurl then return "[" .. chapterurl .. " " .. chap .. "]" else return chap end end if not chap then if chap_num then error( ("Cannot specify |%s= without |%s=; put the numeric value in |%s= directly"):format( chap_num_fullname, chap_fullname, chap_fullname ) ) end if chap_plain then chapterurl = aurl(param .. "url") return make_chapter_with_url(chap_plain .. (chap_series or "")) end return nil end local cleaned_chap = chap:gsub("<sup>[^<>]*</sup>", ""):gsub("[*+#]", "") chapterurl = aurl(param .. "url") local formatted if numeric_prefix and get_number(cleaned_chap) then -- Arabic chapter number formatted = numeric_prefix .. make_chapter_with_url(chap) elseif numeric_prefix and cleaned_chap:match("^[mdclxviMDCLXVI]+$") and roman_to_arabic(cleaned_chap, true) and (not overrides[param] or not overrides[param].noroman) then -- Roman chapter number formatted = numeric_prefix .. make_chapter_with_url(upper(chap)) else -- strip leading ! (used to force text-mode for titles that look like Roman numerals like "mil" and "dill") if chap:find("^!") then chap = chap:gsub("^!", "") end -- Must be a chapter name local chapterobj = parse_annotated_text(chap, chap_fullname, a("trans-" .. param)) chapterobj.text = make_chapter_with_url(chapterobj.text) chapterobj.link = make_chapter_with_url(chapterobj.link) formatted = (textual_prefix or "") .. format_annotated_text(chapterobj) .. (textual_suffix or "") end if chap_num or chap_plain then -- NOTE: Up above we throw an error if both chap_num and chap_plain are specified. formatted = formatted .. " (" .. (chap_plain or numeric_prefix .. chap_num) .. ")" end if chap_series then formatted = formatted .. chap_series end return formatted end -- This handles everything after displaying the author, starting with the chapter and ending with page, column, -- line and then other=. It is currently called twice: Once to handle the main portion of the citation, and once to -- handle a "newversion" citation. `ind` is either "" for the main portion or a number (currently only 2) for a -- "newversion" citation. In a few places we conditionalize on `ind` to take actions depending on its value. local function postauthor(ind, num_authors, format_as_cite) get_full_paramname = make_get_full_paramname(ind) if author_outputted then add_authorlabel() end local coauthors = parse_and_format_multivalued_annotated_text("coauthors", "và") if coauthors then local with_prefix = "" if author_outputted then with_prefix = "; " if num_authors == 1 then sep = "" end end add_with_sep(with_prefix .. coauthors) author_outputted = true end add_authorlike("quotee", " (trích dẫn gốc) ", ", quotee", ", quotees") if format_as_cite and author_outputted and not date_outputted then add_date() sep = ", " end add_authorlike("chapter_tlr", " (dịch)", " (dịch)", nil, " translator") local function add_sg_and_pl_authorlike(noun, verbed) local sgparam = noun local plparam = noun .. "s" local sgval, sgval_fullname = a_with_name(sgparam) local plval, plval_fullname = a_with_name(plparam) if sgval and plval then error(("Can't specify both |%s= and |%s="):format(sgval_fullname, plval_fullname)) end if sgval or plval then local verbed_by = " (" .. verbed .. ")" local comma_sgnoun = " (" .. noun .. ")" local comma_plnoun = " (" .. noun .. ")" add_authorlike(sgparam, verbed_by, comma_sgnoun, comma_plnoun) add_authorlike(plparam, verbed_by, comma_plnoun) end end local formatted_entry = format_chapterlike("entry", nil, "“", "”") local formatted_chapter = format_chapterlike("chapter", "chương ", "“", "”") local function add_entry() if formatted_entry then add_with_sep(formatted_entry) if not a("notitle") then add("trong ") author_outputted = false else author_outputted = true end formatted_entry = nil end end local function add_chapter() add_entry() if formatted_chapter then add_with_sep(formatted_chapter) if not a("notitle") then add("trong ") author_outputted = false end formatted_chapter = nil end end local function add_actor_role(format_as_cite) local role = parse_and_format_multivalued_annotated_text("role", "và") local actor_val, actor_fullname = a_with_name("actor") local actor_objs = parse_multivalued_annotated_text(actor_val, actor_fullname) local actor = format_multivalued_annotated_text(actor_objs, "và") if format_as_cite then if role then if actor then add_with_sep(actor) end sep = nil add_with_sep(" as " .. role) elseif actor then add_with_sep(actor .. " (" .. (#actor_objs > 1 and "actors" or "actor") .. ")") end else if role then add_with_sep("spoken by " .. role) if actor then sep = nil add_with_sep(" (" .. actor .. ")") end elseif actor then add_with_sep(actor .. " (" .. (#actor_objs > 1 and "actors" or "actor") .. ")") end end end if format_as_cite then if date_outputted then add_chapter() end local output_len = #output local mainauthor = parse_and_format_multivalued_annotated_text("mainauthor") if mainauthor then add_with_sep(mainauthor) end -- quote-* templates display "jobbed by name" after the author, controlled by the author_outputted flag author_outputted = false add_authorlike("tlr", " (dịch)", " (dịch)", nil, " translator") author_outputted = false add_authorlike("editor", " (biên tập)") add_authorlike("editors", " (biên tập)") add_authorlike("compiler", " (biên soạn)") add_authorlike("compilers", " (biên soạn)") add_sg_and_pl_authorlike("director", "directed") add_authorlike("lyricist", nil, " (lời)", nil, " lyricist") add_authorlike("lyrics-translator", nil, " (translation)", nil, " lyrics translator") add_authorlike("composer", nil, " (music)", nil, " composer") add_actor_role("format_as_cite") -- if the output length has changed, a credit name has been printed -- and we can print the date if output_len ~= #output then author_outputted = true add_date() end add_chapter() else add_chapter() local mainauthor = parse_and_format_multivalued_annotated_text("mainauthor") if mainauthor then add_with_sep(mainauthor) author_outputted = true end add_authorlike("tlr", " (dịch)", " (dịch)", nil, " translator") add_authorlike("editor", " (biên tập)") add_authorlike("editors", " (biên tập)") add_sg_and_pl_authorlike("compiler", "compiled") add_sg_and_pl_authorlike("director", "directed") add_authorlike("lyricist", nil, " (lời)", nil, " lyricist") add_authorlike("lyrics-translator", nil, " (translation)", nil, " lyrics translator") add_authorlike("composer", nil, " (music)", nil, " composer") end local title, title_fullname = a_with_name("title") local need_comma = false if title then local titleobj = parse_annotated_text(title, title_fullname, a("trans-title")) add(format_annotated_text(titleobj, tag_with_cite, tag_with_cite)) local series = parse_and_format_annotated_text("series") if series then add(" (" .. series) local seriesvolume = parse_and_format_annotated_text("seriesvolume") if seriesvolume then add(SEMICOLON_SPACE .. seriesvolume) end add(")") end need_comma = true elseif ind == "" then if not a("notitle") then add(maintenance_line("Vui lòng cung cấp tên cuốn sách hoặc tên tạp chí")) need_comma = true end end local archiveurl, archiveurl_fullname = aurl_with_name("archiveurl") local url, url_fullname = aurl_with_name("url") local urls, urls_fullname = aurl_with_name("urls") if url and urls then error(("Supply only one of |%s= and |%s="):format(url_fullname, urls_fullname)) end local function verify_title_supplied(url_name) -- There are too many cases of this to throw an error at this time. -- if not title then -- error(("If |%s= is given, |%s= must also be supplied"):format(url_name, title_fullname)) -- end end if archiveurl or url then verify_title_supplied(archiveurl and archiveurl_fullname or url_fullname) sep = nil add("&lrm;<sup>[" .. (archiveurl or url) .. "]</sup>") elseif urls then verify_title_supplied(urls_fullname) sep = nil add("&lrm;<sup>" .. urls .. "</sup>") end -- display (in Language) if language is provided and is not English and not overriden by termlang or worklang if format_as_cite and ind == "" and not (args.termlang or args.worklang) and (args[1] or args.lang) then local lang = get_first_lang(args[1] or args.lang) if lang then local langcode = lang:getCode() if not (langcode == "und" or langcode == "vi") then local langs = format_langs(args[1] or args.lang) if langs then add(" (bằng " .. langs .. ")") end end end end if need_comma then sep = ", " end local edition, edition_fullname = parse_and_format_annotated_text_with_name("edition") local edition_plain, edition_plain_fullname = parse_and_format_annotated_text_with_name("edition_plain") if edition and edition_plain then error(("Supply only one of |%s= and |%s="):format(edition_fullname, edition_plain_fullname)) end if edition then add_with_sep("ấn bản " .. edition) end if edition_plain then add_with_sep(edition_plain) end -- Display a numeric param such as page=, volume=, column=. For each `paramname`, four params are actually -- recognized, e.g. for paramname == "page", the params page=, pages=, page_plain= and pageurl= are recognized -- and checked (or the same with an index, e.g. page2=, pages2=, page_plain2= and pageurl2= respectively if -- ind == "2"). Only one of the first three can be specified; an error results if more than one are given. -- If none are given, the return value is nil; otherwise it is a string. The numeric spec is taken directly -- from e.g. page_plain= if given; otherwise if e.g. pages= is given, or if page= is given and looks like a -- combination of numbers (i.e. it has a hyphen or dash in it, a comma, or the word " and "), it is prefixed -- by `singular_desc` + "s" (e.g. "pages "), otherwise it is prefixed by just `singular_desc` (e.g. "page "). -- (As a special case, if either e.g. page=unnumbered or pages=unnumbered is given, the numeric spec is -- "unnumbered page".) The resulting spec is returned directly unless e.g. pageurl= is given, in which case -- it is linked to the specified URL. Note that any of the specs can be foreign text, e.g. foreign numbers -- (including with optional inline modifiers), and such text is handled appropriately. local function format_numeric_param(paramname, singular_desc) local sgval = a_with_name(paramname) local sgobj = parse_annotated_text(sgval, paramname) local plparamname = paramname .. "s" local plval = a_with_name(plparamname) local plobj = parse_annotated_text(plval, plparamname) local plainval, plain_fullname = parse_and_format_annotated_text_with_name(paramname .. "_plain") local numspec if not sgval and not plval and not plainval then return elseif plainval and (sgval or plval) then error(("Can't specify " .. plain_fullname .. " with " .. paramname .. " or " .. plparamname)) elseif sgval and plval then -- if both singular and plural, display "page 1 of 1-10" numspec = singular_desc .. " " .. sgval .. " of " .. plval else -- Merge page= and pages= and treat alike because people often mix them up in both directions. if plainval then numspec = plainval else local val = sgobj and sgobj.text or plobj.text if val == "unnumbered" then numspec = "unnumbered " .. singular_desc else local desc if val:find("^!") then val = val:gsub("^!", "") desc = sgval and singular_desc or pluralize(singular_desc) else local check_val = val if check_val:find("%[") then check_val = remove_links(check_val) -- convert URL's of the form [URL DISPLAY] to the displayed value check_val = check_val:gsub("%[[^ %[%]]* ([^%[%]]*)%]", "%1") end -- in case of negative page numbers (do they exist?), don't treat as multiple pages check_val = check_val:gsub("^%-", "") -- replace HTML entity en-dashes and em-dashes with their literal codes check_val = check_val:gsub("&ndash;", "–") check_val = check_val:gsub("&#8211;", "–") check_val = check_val:gsub("&mdash;", "—") check_val = check_val:gsub("&#8212;", "—") -- Check for en-dash or em-dash, or two numbers (possibly with stuff after like 12a-15b) -- separated by a hyphen or by comma a followed by a space (to avoid firing on thousands separators). if umatch(check_val, "[–—]") or check_val:find(" and ") or check_val:match("%d+[^ ]* *%- *%d+") or check_val:match("%d+[^ ]* *, +%d+") then desc = singular_desc else desc = singular_desc end end local obj = sgobj or plobj obj.text = val if obj.link:find("^!") then obj.link = obj.link:gsub("^!", "") end val = format_annotated_text(obj) numspec = desc .. " " .. val end end end local url = a(paramname .. "url") if url then return "[" .. url .. " " .. numspec .. "]" else return numspec end end local volume = format_numeric_param("volume", a("volume_prefix") or "tập") if volume then add_with_sep(volume) end local issue = format_numeric_param("issue", a("issue_prefix") or "số") if issue then add_with_sep(issue) end -- number= is an alias for issue= (except in {{quote-av}}, where it is the episode number) local number = format_numeric_param("number", a("number_prefix") or "số") if number then add_with_sep(number) end local annotations = {} local genre = a("genre") if genre then insert(annotations, genre) end local format = a("format") if format then insert(annotations, format) end local medium = a("medium") if medium then insert(annotations, medium) end -- Now handle the display of language annotations like "(in French)" or -- "(quotation in Nauruan; overall work in German)". local quotelang = args[1] or args.lang if not quotelang then if ind == "" then -- This can only happen for certain non-mainspace pages, e.g. Talk pages; otherwise an error is thrown -- above. insert(annotations, maintenance_line("Please specify the language of the quote using |1=")) else -- do nothing in newversion= portion end elseif ind == "" then local worklang = a("worklang") local termlang = a("termlang") worklang = worklang or quotelang termlang = termlang or quotelang if worklang == quotelang then if worklang == termlang then -- do nothing else insert(annotations, "bằng " .. format_langs(quotelang)) end else if quotelang ~= termlang then insert(annotations, "quotation in " .. format_langs(quotelang)) end insert(annotations, "toàn bộ nội dung viết bằng " .. format_langs(worklang)) end else local lang2 = a("lang2") if lang2 then insert(annotations, "bằng " .. format_langs(lang2)) end end if #annotations > 0 then sep = nil add_with_sep(" (" .. concat(annotations, SEMICOLON_SPACE) .. ")") end local artist = parse_and_format_multivalued_annotated_text("artist", "và") if artist then add_with_sep(artist .. " biểu diễn") end local feat = parse_and_format_multivalued_annotated_text("feat", "và") if feat then sep = " " add_with_sep("ft. " .. feat) end if not format_as_cite then add_actor_role() end local others = parse_and_format_annotated_text("others") if others then add_with_sep(others) end local quoted_in = parse_and_format_annotated_text("quoted_in", tag_with_cite, tag_with_cite) if quoted_in then add_with_sep("dẫn trong " .. quoted_in) insert(tracking_categories, "Quotations using quoted-in parameter") end local location = parse_and_format_multivalued_annotated_text("location", "; ") local publisher = parse_and_format_multivalued_annotated_text("publisher", "; ") if publisher then if location then add_with_sep(location) -- colon sep = "&#58; " -- colon end add_with_sep(publisher) elseif location then add_with_sep(location) end if not date_outputted then add_date("no_paren") end local source = parse_and_format_multivalued_annotated_text("source", "và") if source then add_with_sep("sourced from " .. source) end local original = parse_and_format_annotated_text("original", tag_with_cite, tag_with_cite) local by = parse_and_format_multivalued_annotated_text("by", "và") local origtype = a("deriv") or "bản dịch" if original or by then add_with_sep(origtype .. " từ " .. (original or "bản gốc") .. (by and " của " .. by or "")) end -- Handle origlang=, origworklang=. How we handle them depends on whether the original title or author are explicitly -- given. local origlang = a("origlang") local origworklang = a("origworklang") local origlangtext, origworklangtext if origlang then origlangtext = "từ " .. format_langs(origlang) end if origworklang then origworklangtext = "toàn bộ nội dung viết bằng " .. format_langs(origworklang) end if origlang or origworklang then if original or by then local orig_annotations = {} if origlangtext then insert(orig_annotations, origlangtext) end if origworklangtext then insert(orig_annotations, origworklangtext) end sep = nil add_with_sep(" (" .. concat(orig_annotations, SEMICOLON_SPACE) .. ")") else add_with_sep(origtype .. " có nguồn gốc" .. (origlangtext and " " .. origlangtext or "")) if origworklangtext then sep = nil add_with_sep(" (" .. origworklangtext .. ")") end end end if ind ~= "" and has_newversion() then local formatted_new_date = format_date_args(a, get_full_paramname, alias_map, "", "", nil, "Please provide a date or year", true) if formatted_new_date then add_with_sep(formatted_new_date) end end -- Fetch date_published=/year_published=/month_published= and format appropriately. local formatted_date_published = format_date_args(a, get_full_paramname, alias_map, "", "_published", nil, nil, true) local platform = parse_and_format_multivalued_annotated_text("platform", "và") if formatted_date_published then add_with_sep("xuất bản " .. formatted_date_published .. (platform and " via " .. platform or "")) elseif platform then add_with_sep("via " .. platform) end -- From here on out, there should always be a preceding item, so we -- can dispense with add_with_sep() and always insert the comma. sep = nil local function small(txt) add(", <small>") add(txt) add("</small>") end -- Add an identifier to a book or article database such as DOI, ISBN, JSTOR, etc. `param_or_params` -- is a string identifying the base param, or a list of such strings to check in turn. If found, the value -- of the parameter is processed using `process` (a function of one argument, defaulting to mw.uri.encode()), -- and then the actual URL to insert is generated by preceding with `pretext`, following with `posttext`, -- and running the resulting string through small(), which first adds a comma and then the URL in small font. local function add_identifier(param_or_params, pretext, posttext, process) local val = a(param_or_params) if val then val = (process or mw.uri.encode)(val) small(pretext .. val .. posttext) end end add_identifier("bibcode", "[https://adsabs.harvard.edu/abs/", " →Bibcode]") add_identifier("doi", '<span class="neverexpand">[https://doi.org/', " →DOI]</span>") add_identifier("isbn", "", "", isbn) add_identifier("issn", "", "", issn) add_identifier("jstor", "[https://www.jstor.org/stable/", " →JSTOR]") add_identifier("lccn", "", "", lccn) add_identifier("oclc", "[https://search.worldcat.org/title/", " →OCLC]") add_identifier("ol", "[https://openlibrary.org/works/OL", "/ →OL]") add_identifier("pmid", "[https://www.ncbi.nlm.nih.gov/pubmed/", " →PMID]") add_identifier("pmcid", "[https://www.ncbi.nlm.nih.gov/pmc/articles/", "/ →PMCID]") add_identifier("ssrn", "[https://ssrn.com/abstract=", " →SSRN]") -- add_identifier("urn", "", "", urn) local id = a("id") if id then small(id) end archiveurl, archiveurl_fullname = aurl_with_name("archiveurl") if archiveurl then add(", [" .. url .. " bản gốc]") local url, url_fullname = aurl_with_name("url") if not url then -- attempt to infer original URL from archive URL; this works at -- least for Wayback Machine (web.archive.org) URL's url = archiveurl:match("/(https?:.*)$") if not url then error( ("When |%s= is specified, |%s= must also be included"):format(archiveurl_fullname, url_fullname) ) end end add(" lưu trữ ") local archivedate, archivedate_fullname = a_with_name("archivedate") if archivedate then add(format_date(archivedate)) elseif string.sub(archiveurl, 1, 28) == "https://web.archive.org/web/" then -- If the archive is from the Wayback Machine, then it already contains the date -- Get the date and format it local wayback_date = string.sub(archiveurl, 29, 29 + 7) wayback_date = string.sub(wayback_date, 1, 4) .. "-" .. string.sub(wayback_date, 5, 6) .. "-" .. string.sub(wayback_date, 7, 8) add(format_date(wayback_date)) else error( ("When |%s= is specified, |%s= must also be included"):format( archiveurl_fullname, archivedate_fullname ) ) end end if a("accessdate") then --Otherwise do not display here, as already used as a fallback for missing date= or year= earlier. if (a("date") or a("nodate") or a("year")) and not a("archivedate") then add(", truy cập " .. format_date(a("accessdate"))) end end local formatted_section = format_chapterlike("section", "mục ") if formatted_section then add(", ") add(formatted_section) end -- video game stuff local system = parse_and_format_annotated_text("system") if system then add(", " .. system) end local scene = parse_and_format_annotated_text("scene") if scene then add(", scene: " .. scene) end local level = parse_and_format_annotated_text("level") if level then add(", level/area: " .. level) end local note = parse_and_format_annotated_text("note") if note then add(", " .. note) end local note_plain = parse_and_format_annotated_text("note_plain") if note_plain then add(" " .. note_plain) end -- Wrapper around format_numeric_param that inserts the formatted text with optional preceding text. local function handle_numeric_param(paramname, singular_desc, pretext) local numspec = format_numeric_param(paramname, singular_desc) if numspec then add((pretext or "") .. numspec) end end handle_numeric_param("page", a("page_prefix") or "tr.", ", ") handle_numeric_param("column", a("column_prefix") or "cột", ", ") handle_numeric_param("line", a("line_prefix") or "dòng", ", ") -- FIXME: Does this make sense? What is other=? local other = parse_and_format_annotated_text("other") if other then add(", " .. other) end end local function add_authors(args, last_first) -- Find maximum indexed author or last name. local maxind = math.max(args.author.maxindex, args.last.maxindex) -- Include max index of ancillary params so we get an error message about their use without the primary params. local ancillary_params = {"trans-author", "authorlink", "trans-authorlink", "first", "trans-first", "trans-last"} for _, ancillary in ipairs(ancillary_params) do maxind = math.max(maxind, args[ancillary].maxindex) end local num_authors = 0 for i = 1, maxind do local ind = i == 1 and "" or i local author, last = args.author[i], args.last[i] if author or last then local this_num_authors = add_author( author, "author" .. ind, args["trans-author"][i], "trans-author" .. ind, args.authorlink[i], "authorlink" .. ind, args["trans-authorlink"][i], "trans-authorlink" .. ind, args.first[i], "first" .. ind, args["trans-first"][i], "trans-first" .. ind, last, "last" .. ind, args["trans-last"][i], "trans-last" .. ind, last_first ) num_authors = num_authors + this_num_authors sep = last_first and "; " or ", " else for _, cant_have in ipairs(ancillary_params) do if args[cant_have][i] then error(("Can't have |%s%s= without |author%s= or |last%s="):format(cant_have, ind, ind, ind)) end end end end return num_authors end local function add_newversion() -- If there's a "newversion" section, add the new-version text. if has_newversion() then sep = nil --Test for new version of work. add(SEMICOLON_SPACE) if args.newversion then -- newversion= is intended for English text, e.g. "quoted in" or "republished as". add(args.newversion) elseif not args.edition2 then if has_new_title_or_author() then add("tái bản: ") else add("republished") end end add(" ") return "" else return ", " end end ------------------- Now we start outputting text ---------------------- local need_comma = false -- Set this now so a() works just below. get_full_paramname = make_get_full_paramname("") if args.brackets then add("[") end bold_year = not format_as_cite year_last = format_as_cite formatted_date, need_date = format_date_args( a, get_full_paramname, alias_map, nil, nil, bold_year, "Can we [[:Category:Requests for date|date]] this quote?", year_last ) -- Fetch origdate=/origyear=/origmonth= and format appropriately. formatted_origdate = format_date_args(a, get_full_paramname, alias_map, "orig", nil, nil, nil, year_last) local num_authors, need_date if format_as_cite then num_authors = add_authors(args, "last_first") if author_outputted then sep = " " end -- Display all the text that comes after the author, for the main portion. postauthor("", num_authors, "format_as_cite") author_outputted = false sep = add_newversion() -- Add the newversion author(s). if args["2ndauthor"] or args["2ndlast"] then num_authors = add_author( args["2ndauthor"], "2ndauthor", nil, nil, args["2ndauthorlink"], "2ndauthorlink", nil, nil, args["2ndfirst"], "2ndfirst", nil, nil, args["2ndlast"], "2ndlast", nil, nil, "last_first" ) sep = ", " else for _, cant_have in ipairs{"2ndauthorlink", "2ndfirst"} do if args[cant_have] then error(("Can't have |%s= without |2ndauthor= or |2ndlast="):format(cant_have)) end end end -- Display all the text that comes after the author, for the "newversion" section. postauthor(2, num_authors, "format_as_cite") else if formatted_date then need_comma = true add(formatted_date) end if formatted_origdate then need_comma = true add(SPACE_LBRAC .. formatted_origdate .. RBRAC) end if need_comma then sep = ", " end date_outputted = true num_authors = add_authors(args) -- Display all the text that comes after the author, for the main portion. postauthor("", num_authors) author_outputted = false sep = add_newversion() -- Add the newversion author(s). if args["2ndauthor"] or args["2ndlast"] then num_authors = add_author( args["2ndauthor"], "2ndauthor", nil, nil, args["2ndauthorlink"], "2ndauthorlink", nil, nil, args["2ndfirst"], "2ndfirst", nil, nil, args["2ndlast"], "2ndlast", nil, nil ) sep = ", " else for _, cant_have in ipairs{"2ndauthorlink", "2ndfirst"} do if args[cant_have] then error(("Can't have |%s= without |2ndauthor= or |2ndlast="):format(cant_have)) end end end -- Display all the text that comes after the author, for the "newversion" section. postauthor(2, num_authors) end if not args.nocolon then sep = nil add(":") elseif args.usenodot and not args.nodot then add(".") end -- Concatenate output portions to form output text. local output_text = concat(output) -- Remainder of code handles adding categories. We add one or more of the following categories: -- -- 1. [[Category:LANG terms with quotations]], based on the first language code in termlang= or 1=. Added to -- mainspace, Reconstruction: and Appendix: pages as well as Citations: pages if the corresponding mainspace -- page exists. Not added if nocat= is given. Note that [[Module:usex]] adds the same category using the same -- logic, but we do it here too because we may not have a quotation to format. (We add in those circumstances -- because typically when there's no quotation to format, it's because it's formatted manually underneath the -- citation, or using {{ja-x}}, {{th-x}} or similar.) -- 2. [[Category:Requests for date in LANG entries]], based on the first language code in 1=. Added to mainspace, -- Reconstruction:, Appendix: and Citations: pages unless nocat= is given. -- 3. [[Category:Quotations using nocat parameter]], if nocat= is given. Added to mainspace, Reconstruction:, -- Appendix: and Citations: pages. local categories = {} local termlang = get_first_lang(args.termlang or argslang) if args.nocat then if format_as_cite then insert(tracking_categories, "Citations using nocat parameter") else insert(tracking_categories, "Quotations using nocat parameter") end else -- don't create language tracking categories for citations if not format_as_cite then local title if args.pagename then -- for testing, doc pages, etc. title = mw.title.new(args.pagename) if not title then error(("Bad value for `args.pagename`: '%s'"):format(args.pagename)) end else title = mw.title.getCurrentTitle() end -- Only add [[Citations:foo]] to [[:Category:LANG terms with quotations]] if [[foo]] exists. local ok_to_add_cat if title.nsText ~= "Citations" then ok_to_add_cat = true else local mainspace_title = mw.title.new(title.text) if mainspace_title and mainspace_title.exists then ok_to_add_cat = true end end if ok_to_add_cat then insert(categories, termlang:getFullName() .. " terms with quotations") end end if need_date then local argslangobj = get_first_lang(argslang) insert(categories, "Requests for date in " .. argslangobj:getCanonicalName() .. " entries") end end return output_text .. ( not lang and "" or (#categories > 0 and format_categories(categories, lang, args.sort) or "") .. ( #tracking_categories > 0 and format_categories( tracking_categories, lang, args.sort, nil, not page_should_be_ignored(mw.title.getCurrentTitle().fullText) ) or "" ) ) end -- Alias specs for type= and type2=. Each spec is `{canon, aliases, with_newversion}` where `canon` is the canonical -- parameter (with "2" added if type2= is being handled), `aliases` is a comma-separated string of aliases (with "2" -- added if type2= is being handled, except for numeric params), and `with_newversion` indicates whether we should -- process this spec if type2= is being handled. local type_alias_specs = { av = { {"author", "writer,writers", true}, {"chapter", "episode", true}, {"chapterurl", "episodeurl", true}, {"trans-chapter", "trans-episode", true}, {"chapter_tlr", "episode_tlr,episode_tlrs,episode_translator,episode_translators", true}, {"chapter_series", "episode_series", true}, {"chapter_seriesvolume", "episode_seriesvolume", true}, {"chapter_number", "episode_number", true}, {"chapter_plain", "episode_plain", true}, {"volume", "season", true}, {"volumes", "seasons", true}, {"volume_plain", "season_plain", true}, {"volumeurl", "seasonurl", true}, {"platform", "network", true}, }, book = { {"author", "3"}, {"title", "4"}, {"url", "5"}, {"year", "2"}, {"page", "6"}, {"text", "7"}, {"t", "8"}, }, journal = { {"year", "2"}, {"author", "3"}, {"chapter", "title,article,4", true}, {"chapterurl", "titleurl,articleurl", true}, {"trans-chapter", "trans-title,trans-article", true}, {"chapter_tlr", "title_tlr,title_tlrs,title_translator,title_translators,article_tlr,article_tlrs,article_translator,article_translators", true}, {"chapter_series", "title_series,article_series", true}, {"chapter_seriesvolume", "title_seriesvolume,article_seriesvolume", true}, {"chapter_number", "title_number,article_number", true}, {"chapter_plain", "title_plain,article_plain", true}, {"title", "journal,magazine,newspaper,work,5", true}, {"trans-title", "trans-journal,trans-magazine,trans-newspaper,trans-work", true}, {"tlr", "journal_tlr,journal_tlrs,journal_translator,journal_translators,magazine_tlr,magazine_tlrs,magazine_translator,magazine_translators,newspaper_tlr,newspaper_tlrs,newspaper_translator,newspaper_translators,work_tlr,work_tlrs,work_translator,work_translators", true}, {"url", "6,journalurl,magazineurl,newspaperurl,workurl", true}, {"page", "7"}, {"source", "newsagency,news_agency", true}, {"text", "8"}, {"t", "9"}, }, } -- Process interally-handled aliases related to type= or type2=. `args` is a table of arguments; `typ` is the value of -- type= or type2=; newversion=true if we're dealing with type2=; alias_map is used to keep track of alias mappings -- seen. local function process_type_aliases(args, typ, newversion, alias_map) local ind = newversion and "2" or "" local deprecated = ine(args.lang) if not type_alias_specs[typ] then local possible_values = {} for possible, _ in pairs(type_alias_specs) do insert(possible_values, possible) end sort(possible_values) error( ("Unrecognized value '%s' for type%s=; possible values are %s"):format( typ, ind, concat(possible_values, ",") ) ) end for _, alias_spec in ipairs(type_alias_specs[typ]) do local canon, aliases, with_newversion = unpack(alias_spec) if with_newversion or not newversion then canon = canon .. ind aliases = split(aliases, ",", true) local saw_alias = nil for _, alias in ipairs(aliases) do if alias:match("^%d+$") then alias = tonumber(alias) if deprecated then alias = alias - 1 end else alias = alias .. ind end if args[alias] then if saw_alias == nil then saw_alias = alias else error(("|%s= and |%s= are aliases; cannot specify a value for both"):format(saw_alias, alias)) end end end if saw_alias and (not newversion or type(saw_alias) == "string") then if args[canon] then error(("|%s= is an alias of |%s=; cannot specify a value for both"):format(saw_alias, canon)) end args[canon] = args[saw_alias] -- Wipe out the original after copying. This is important in case of a param that has general significance -- but has been redefined (e.g. {{quote-av}} redefines number= for the episode number, and -- {{quote-journal}} redefines title= for the chapter= (article). It's also important due to unhandled -- parameter checking. args[saw_alias] = nil alias_map[canon] = saw_alias end end end end -- Clone and combine frame's and parent's args while also assigning nil to empty strings. Handle aliases and ignores. local function clone_args(direct_args, parent_args) local args = {} -- Processing parent args must come first so that direct args override parent args. Note that if a direct arg is -- specified but is blank, it will still override the parent arg (with nil). for pname, param in pairs(parent_args) do -- [[Special:WhatLinksHere/Wiktionary:Tracking/quote/param/PARAM]] track("param/" .. pname) args[pname] = ine(param) end -- Process ignores. The value of `ignore` is a comma-separated list of parameter names to ignore (erase). We need to -- do this before aliases due to {{quote-song}}, which sets chapter= to the value of title= in the direct params and -- sets title= to the value of album= using an alias. If we do the ignores after aliases, we get an error during alias -- processing, saying that title= and its alias album= are both present. local ignores = ine(direct_args.ignore) if ignores then for ignore in gsplit(ignores, "%s*,%s*") do args[ignore] = nil end end local alias_map = {} local other_controls = {} -- noroman local noroman = ine(direct_args.noroman) if noroman then other_controls.overrides = other_controls.overrides or {} for param in gsplit(noroman, "%s*,%s*") do other_controls.overrides[param] = (other_controls.overrides[param] or {}) other_controls.overrides[param].noroman = true end end -- Process internally-specified aliases using type= or type2=. local typ = args.type or direct_args.type if typ then process_type_aliases(args, typ, false, alias_map) end local typ2 = args.type2 or direct_args.type2 if typ2 then process_type_aliases(args, typ2, true, alias_map) end -- Process externally-specified aliases. The value of `alias` is a list of semicolon-separated specs, each of which -- is of the form DEST:SOURCE,SOURCE,... where DEST is the canonical name of a parameter and SOURCE refers to an -- alias. Whitespace is allowed between all delimiters. The order of aliases may be important. For example, for -- {{quote-journal}}, title= contains the article name and is an alias of underlying chapter=, while journal= or -- work= contains the journal name and is an alias of underlying title=. As a result, the title -> chapter alias -- must be specified before the journal/work -> title alias. -- -- Whenever we copy a value from argument SOURCE to argument DEST, we record an entry for the pair in alias_map, so -- that when we would display an error message about DEST, we display SOURCE instead. -- -- Do alias processing (and ignore and error_if processing) before processing direct_args so that e.g. we can set up -- an alias of title -> chapter and then set title= to something else in the direct args ({{quote-hansard}} does -- this). -- -- FIXME: Delete this once we've converted all alias processing to internal. local aliases = ine(direct_args.alias) if aliases then -- Allow and discard a trailing semicolon, to make managing multiple aliases easier. aliases = ugsub(aliases, "%s*;$", "") for alias_spec in gsplit(aliases, "%s*;%s*") do local alias_spec_parts = split(alias_spec, "%s*:%s*") if #alias_spec_parts ~= 2 then error(("Alias spec '%s' should have one colon in it"):format(alias_spec)) end local dest, sources = unpack(alias_spec_parts) sources = split(sources, "%s*,%s*") local saw_source = nil for _, source in ipairs(sources) do if source:match("^%d+$") then source = tonumber(source) end if args[source] then if saw_source == nil then saw_source = source else error(("|%s= and |%s= are aliases; cannot specify a value for both"):format(saw_source, source)) end end end if saw_source then if args[dest] then error(("|%s= is an alias of |%s=; cannot specify a value for both"):format(saw_source, dest)) end args[dest] = args[saw_source] -- Wipe out the original after copying. This important in case of a param that has general significance -- but has been redefined (e.g. {{quote-av}} redefines number= for the episode number, and -- {{quote-journal}} redefines title= for the chapter= (article). It's also important due to unhandled -- parameter checking. args[saw_source] = nil alias_map[dest] = saw_source end end end -- Process error_if. The value of `error_if` is a comma-separated list of parameter names to throw an error if seen -- in parent_args (they are params we overwrite in the direct args). local error_ifs = ine(direct_args.error_if) if error_ifs then for error_if in gsplit(error_ifs, "%s*,%s*") do if ine(parent_args[error_if]) then error( ("Cannot specify a value |%s=%s as it would be overwritten or ignored"):format( error_if, ine(parent_args[error_if]) ) ) end end end for pname, param in pairs(direct_args) do -- ignore control params if pname ~= "ignore" and pname ~= "alias" and pname ~= "error_if" and pname ~= "noroman" then args[pname] = ine(param) end end return args, alias_map, other_controls end local function get_args(frame_args, parent_args, require_lang) -- FIXME: We are processing arguments twice, once in clone_args() and then again in [[Module:parameters]]. This is -- wasteful of memory. local cloned_args, alias_map, other_controls = clone_args(frame_args, parent_args) local deprecated = ine(parent_args.lang) local alias_of_t = {alias_of = "t"} local boolean = {type = "boolean"} local language_sublist = {type = "language", sublist = true} local list_allow_holes = {list = true, allow_holes = true} local script = {type = "script"} -- First, the "single" params that don't have FOO2 or FOOn versions. local params = { [deprecated and "lang" or 1] = {required = require_lang, type = "language", sublist = true, default = "und"}, ["lang2"] = language_sublist, ["newversion"] = true, ["author"] = list_allow_holes, ["2ndauthor"] = true, ["trans-author"] = list_allow_holes, ["authorlink"] = list_allow_holes, ["2ndauthorlink"] = true, ["trans-authorlink"] = list_allow_holes, ["first"] = list_allow_holes, ["2ndfirst"] = true, ["trans-first"] = list_allow_holes, ["last"] = list_allow_holes, ["2ndlast"] = true, ["trans-last"] = list_allow_holes, ["nocat"] = boolean, ["nocolon"] = boolean, -- quote params text = true, passage = {alias_of = "text"}, tr = true, transliteration = {alias_of = "tr"}, ts = true, transcription = {alias_of = "ts"}, norm = true, normalization = {alias_of = "norm"}, sc = script, normsc = script, sort = true, subst = true, footer = true, lit = true, t = true, translation = alias_of_t, gloss = alias_of_t, lb = true, brackets = boolean, -- original quote params origtext = true, origtr = true, origts = true, orignorm = true, origsc = script, orignormsc = script, origsubst = true, origlb = true, usenodot = boolean, nodot = boolean, inline = boolean, asquote = boolean, ascite = boolean, } -- Most params have PARAM2 variants for use with `newversion`. FIXME: We should generalize this to -- allow PARAMN variants for any N. local function add_with_2(param, value) params[param] = value params[param .. "2"] = value end local function alias_with_2(alias, canon) params[alias] = {alias_of = canon} params[alias .. "2"] = {alias_of = canon .. "2"} end for _, param12 in ipairs{ "worklang", "termlang", "origlang", "origworklang" } do add_with_2(param12, language_sublist) end -- Then the newversion params (which have FOO2 versions). for _, param12 in ipairs{ -- author-like params; author params themselves are either list params (author=, last=, etc.) or single params -- (2ndauthor=, 2ndlast=, etc.) "coauthors", "quotee", "tlr", "editor", "editors", "mainauthor", "compiler", "compilers", "director", "directors", "lyricist", "lyrics-translator", "composer", "role", "actor", "artist", "feat", -- author control params "default-authorlabel", "authorlabel", -- title "title", "trans-title", "series", "seriesvolume", "notitle", -- entry "entry", "entryurl", "trans-entry", -- chapter "chapter", "chapterurl", "chapter_number", "chapter_plain", "chapter_series", "chapter_seriesvolume", "trans-chapter", "chapter_tlr", -- section "section", "sectionurl", "section_number", "section_plain", "section_series", "section_seriesvolume", "trans-section", -- other video-game params "system", "scene", "level", -- URL "url", "urls", "archiveurl", -- edition "edition", "edition_plain", -- ID params "bibcode", "doi", "isbn", "issn", "jstor", "lccn", "oclc", "ol", "pmid", "pmcid", "ssrn", "urn", "id", -- misc date params; most date params handled below "archivedate", "accessdate", "nodate", -- numeric params handled below -- other params "type", "genre", "format", "medium", "others", "quoted_in", "location", "publisher", "original", "by", "deriv", "note", "note_plain", "other", "source", "platform", } do add_with_2(param12, true) end -- Then the aliases of newversion params (which have FOO2 versions). for _, param12_aliased in ipairs{ {"role", "roles"}, {"role", "speaker"}, {"tlr", "tlrs"}, {"tlr", "translator"}, {"tlr", "translators"}, {"chapter_tlr", "chapter_tlrs"}, {"chapter_tlr", "chapter_translator"}, {"chapter_tlr", "chapter_translators"}, {"doi", "DOI"}, {"isbn", "ISBN"}, {"issn", "ISSN"}, {"jstor", "JSTOR"}, {"lccn", "LCCN"}, {"oclc", "OCLC"}, {"ol", "OL"}, {"pmid", "PMID"}, {"pmcid", "PMCID"}, {"ssrn", "SSRN"}, {"urn", "URN"}, } do local canon, alias = unpack(param12_aliased) alias_with_2(alias, canon) end -- Then the date params. for _, datelike in ipairs{{"", ""}, {"orig", ""}, {"", "_published"}} do local pref, suf = unpack(datelike) for _, arg in ipairs{"date", "year", "month", "start_date", "start_year", "start_month"} do add_with_2(pref .. arg .. suf, true) end end local numeric_param_suffixes = {"", "s", "_plain", "url", "_prefix"} -- Then the numeric params. for _, numeric in ipairs{"volume", "issue", "number", "line", "page", "column"} do for _, suf in ipairs(numeric_param_suffixes) do add_with_2(numeric .. suf, true) end end -- And the aliases of numeric params. for _, numeric_aliased in ipairs{{"volume", "vol"}} do local canon, alias = unpack(numeric_aliased) for _, suf in ipairs(numeric_param_suffixes) do alias_with_2(alias .. suf, canon .. suf) end end return process_params(cloned_args, params), alias_map, other_controls end local function get_origtext_params(args) local origtext, origtextlang, origsc, orignormsc if args.origtext then -- Wiktionary language codes have at least two lowercase letters followed possibly by lowercase letters and/or -- hyphens (there are more restrictions but this is close enough). Also check for nonstandard Latin etymology -- language codes (e.g. VL. or LL.). (There used to be more nonstandard codes but they have all been -- eliminated.) origtextlang, origtext = args.origtext:match("^(%l%l[%l-]*):([^ ].*)$") if not origtextlang then -- Special hack for Latin variants, which can have nonstandard etym codes, e.g. VL., LL. origtextlang, origtext = args.origtext:match("^(%uL%.):([^ ].*)$") end if not origtextlang then error("origtext= should begin with a language code prefix") end origtextlang = get_lang(origtextlang, nil, "allow etym") or error("origtext= should begin with a language code prefix") origsc = args.origsc orignormsc = args.orignormsc else for _, noparam in ipairs{"origtr", "origts", "origsc", "orignorm", "orignormsc", "origsubst", "origlb"} do if args[noparam] then error(("Cannot specify %s= without origtext="):format(noparam)) end end end return origtext, origtextlang, origsc, orignormsc end local function get_quote(args, is_cite) local text = args.text local gloss = args.t local tr = args.tr local ts = args.ts local norm = args.norm local sc = args.sc local normsc = args.normsc -- Fetch original-text parameters. local origtext, origtextlang, origsc, orignormsc = get_origtext_params(args) -- If any quote-related args are present, display the actual quote; otherwise, display nothing. if text or gloss or tr or ts or norm or args.origtext then -- Pass "und" here rather than cause an error; there will be an error on mainspace, Citations, etc. pages -- in any case in source() if the language is omitted. local lang = get_first_lang(args[1] or args.lang) local termlang = args.termlang and get_first_lang(args.termlang) or lang local usex_data = { lang = lang, termlang = termlang, usex = text, sc = sc, translation = gloss, normalization = norm, normsc = normsc, transliteration = tr, transcription = ts, brackets = args.brackets, subst = args.subst, lit = args.lit, footer = args.footer, qq = parse_and_format_labels(args.lb, lang), quote = "quote-meta", orig = origtext, origlang = origtextlang, origsc = origsc, orignorm = args.orignorm, orignormsc = orignormsc, origtr = args.origtr, origts = args.origts, origsubst = args.origsubst, origqq = parse_and_format_labels(args.origlb, lang), noreq = args.noreq, nocat = is_cite or args.nocat, } if args.inline then -- don't let usex format the footer, otherwise it gets inlined with the rest of the quoted text usex_data.footer = nil usex_data.inline = 1 text = format_usex(usex_data) if text then text = " “" .. text .. "”" else text = "" end if args.footer then text = text .. "<dl><dd>" .. args.footer .. "</dd></dl>" end else text = "<dl><dd>" .. format_usex(usex_data) .. "</dd></dl>" end elseif args.footer then text = "<dl><dd>" .. args.footer .. "</dd></dl>" end return text end -- External interface, meant to be called from a template. Replaces {{quote-meta}} and meant to be the primary -- interface for {{quote-*}} templates. function export.quote_t(frame) local args, alias_map, other_controls = get_args(frame.args, frame:getParent().args, "require_lang") if args.ascite then return export.cite_t(frame) end return show_quote(args, alias_map, other_controls) end function show_quote(args, alias_map, other_controls) local parts = {} insert(parts, '<div class="citation-whole"><span class="cited-source">') insert(parts, export.source(args, alias_map, nil, other_controls)) insert(parts, "</span>") insert(parts, get_quote(args)) insert(parts, "</div>") local retval = concat(parts) return deprecated and frame:expandTemplate({ title = "check deprecated lang param usage", args = {retval, lang = args.lang}, }) or retval end -- External interface, meant to be called from a template. Replaces {{cite-meta}} and meant to be the primary -- interface for {{cite-*}} templates. function export.cite_t(frame) local parent_args = {} for k, v in pairs(frame:getParent().args) do parent_args[k] = v end -- use "und" as lang if none provided if parent_args[1] == nil then parent_args[1] = "und" end local args, alias_map, other_controls = get_args(frame.args, parent_args) if args.asquote then return show_quote(args, alias_map, other_controls) end return show_cite(args, alias_map, other_controls) end function show_cite(args, alias_map, other_controls) local parts = {} -- don't nag for translations if args.text and not args.t then args.noreq = 1 end local len_visible = args.text and ulen((args.text:gsub("<[^<>]+>", ""))) or 0 if len_visible == 0 then if not args.t or args.t == "-" then args.nocolon = true end elseif args.inline == nil then args.inline = not ( args.block_text or len_visible > 300 or (args.t and not args.t == "-" and len_visible < 80) or string.match(args.text, "<br>") ) end insert(parts, '<span class="citation-whole"><span class="cited-source">') insert(parts, export.source(args, alias_map, "format_as_cite", other_controls)) insert(parts, "</span>") insert(parts, get_quote(args, "is_cite")) insert(parts, "</span>") local retval = concat(parts) return deprecated and frame:expandTemplate({ title = "check deprecated lang param usage", args = {retval, lang = args.lang}, }) or retval end -- External interface, meant to be called from a template. function export.call_quote_template(frame) return export.call_template(frame) end -- External interface, for calling a template with overloaded parameters. function export.overload(frame) local iargs, overloaded_args = process_params(frame.args, { [1] = {required = true} }, true) local parent_args = frame:getParent().args for k, v in pairs(parent_args) do overloaded_args[k] = v end return frame:expandTemplate{title = iargs[1], args = overloaded_args} end -- External interface, meant to be called from a template. function export.call_template(frame) local parameter_sublist = {type = "parameter", sublist = true} local iargs, other_direct_args = process_params(frame.args, { ["template"] = true, ["textparam"] = parameter_sublist, ["pageparam"] = parameter_sublist, ["propagateparams"] = parameter_sublist, ["allowparams"] = {sublist = true}, -- Doesn't use type = "parameter", because any that end in :list get processed differently. }, true) local function fetch_param(source, params) for _, param in ipairs(params) do if source[param] then return source[param] end end return nil end local params = { ["text"] = true, ["passage"] = true, ["footer"] = true, -- always propagates, but gets special formatting } -- paramaters that can be used during template declaration or included in template calls -- if the template is called with param=- it will set any declared value to nil local always_propagate = { ["brackets"] = true, ["usenodot"] = true, ["nodot"] = true, ["ascite"] = true, ["asquote"] = true, } for k,v in pairs(always_propagate) do params[k] = v end local textparam = iargs.textparam or {} for _, param in ipairs(textparam) do params[param] = true end local pageparam = iargs.pageparam or {} local pageparam1 = pageparam[1] if pageparam1 ~= nil then params["page"], params["pages"] = true, true for _, param in ipairs(pageparam) do params[param] = true end end local allowparams, allow_all, list = iargs.allowparams, false if allowparams ~= nil then for _, allow in ipairs(allowparams) do local param = allow:match("^(.*):list$") if param then if list == nil then list = {list = true} end params[scribunto_parameter_key(param)] = list elseif allow == "*" then track("no parameter checking") allow_all = true else params[scribunto_parameter_key(allow)] = true end end else local parent = frame:getParent() local template_name = parent:getTitle() local template_title = new_title(template_name) local content = template_title:getContent() local allowed_params, seen = {}, {} -- Detect all params used by the parent template. param:get_name() takes the -- parent frame arg table as an argument so that preprocessing will take -- them into account, since it will matter if the name contains another -- parameter (e.g. the outer param in "{{{foo{{{bar}}}baz}}}" will change -- depending on the value for bar=). `seen` memoizes results based on the -- raw parameter text (which is stored as a string in the parameter object), -- which avoids unnecessary param:get_name() calls, which are non-trivial. for param in find_parameters(content) do local raw = param.raw if not seen[raw] then allow = param:get_name(template_args) params[scribunto_parameter_key(allow)] = true seen[raw] = true end end end local propagateparams = iargs.propagateparams or {} for _, param in ipairs(propagateparams) do params[param] = true end local parent_args = frame:getParent().args local args = process_params(parent_args, params, allow_all) parent_args = shallow_copy(parent_args) if textparam[1] ~= "-" then other_direct_args.passage = args.text or args.passage or fetch_param(args, textparam) end if not (pageparam1 == nil or pageparam1 == "-") then other_direct_args.page = fetch_param(args, pageparam) or args.page or other_direct_args.page or nil other_direct_args.pages = args.pages or other_direct_args.pages or nil if other_direct_args.page == "-" then other_direct_args.page = nil end if other_direct_args.pages == "-" then other_direct_args.pages = nil end end if args.footer then other_direct_args.footer = frame:expandTemplate{title = "small", args = {args.footer}} end for param, _ in pairs(always_propagate) do if args[param] == "-" then other_direct_args[param] = nil else other_direct_args[param] = args[param] or other_direct_args[param] or nil end end -- authorlink=- can be used to prevent copying of author= to authorlink= but we don't want to propagate this to -- the actual {{quote-*}} code. if other_direct_args.authorlink == "-" then other_direct_args.authorlink = nil end for _, param in ipairs(propagateparams) do if args[param] then other_direct_args[param] = args[param] end end return frame:expandTemplate{title = iargs.template or "quote-book", args = other_direct_args} end local paramdoc_param_replacements = { passage = { param_with_synonym = "<<synonym>>, {{para|text}}, or {{para|passage}}", param_no_synonym = "{{para|text}} or {{para|passage}}", text = [=[ * <<params>> – the passage to be quoted.]=], }, page = { param_with_synonym = "<<synonym>> or {{para|page}}, or {{para|pages}}", param_no_synonym = "{{para|page}} or {{para|pages}}", text = [=[ * <<params>> – '''mandatory in some cases''': the page number(s) quoted from. When quoting a range of pages, note the following: ** Separate the first and last pages of the range with an [[en dash]], like this: {{para|pages|10–11}}. ** You must also use {{para|pageref}} to indicate the page to be linked to (usually the page on which the Wiktionary entry appears). : This parameter must be specified to have the template link to the online version of the work.]=], }, page_with_roman_preface = { param_with_synonym = {"inherit", "page"}, param_no_synonym = {"inherit", "page"}, text = [=[ * <<params>> – '''mandatory in some cases''': the page number(s) quoted from. If quoting from the preface, specify the page number(s) in lowercase Roman numerals. When quoting a range of pages, note the following: ** Separate the first and last page number of the range with an [[en dash]], like this: {{para|pages|10–11}} or {{para|pages|iii–iv}}. ** You must also use {{para|pageref}} to indicate the page to be linked to (usually the page on which the Wiktionary entry appears). : This parameter must be specified to have the template link to the online version of the work.]=], }, chapter = { param_with_synonym = "<<synonym>> or {{para|chapter}}", param_no_synonym = "{{para|chapter}}", text = [=[ * <<params>> – the name of the chapter quoted from.]=], }, roman_chapter = { param_with_synonym = {"inherit", "chapter"}, param_no_synonym = {"inherit", "chapter"}, text = [=[ * <<params>> – the chapter number quoted from in uppercase Roman numerals.]=], }, arabic_chapter = { param_with_synonym = {"inherit", "chapter"}, param_no_synonym = {"inherit", "chapter"}, text = [=[ * <<params>> – the chapter number quoted from in Arabic numerals.]=], }, trailing_params = { text = [=[ * {{para|footer}} – a comment on the passage quoted. * {{para|brackets}} – use {{para|brackets|on}} to surround a quotation with [[bracket#Noun|brackets]]. This indicates that the quotation either contains a mere mention of a term (for example, “some people find the word '''''manoeuvre''''' hard to spell”) rather than an actual use of it (for example, “we need to '''manoeuvre''' carefully to avoid causing upset”), or does not provide an actual instance of a term but provides information about related terms.]=], }, } function export.paramdoc(frame) local parargs = frame:getParent().args local args = process_params(parargs, { [1] = true, }) local text = args[1] local function do_param_with_optional_synonym(param, text_to_sub, paramtext_synonym, paramtext_no_synonym) local function sub_param(synonym) local subbed_paramtext if synonym then subbed_paramtext = paramtext_synonym:gsub("<<synonym>>", "{{para|" .. replacement_escape(synonym) .. "}}") else subbed_paramtext = paramtext_no_synonym end return frame:preprocess((text_to_sub:gsub("<<params>>", replacement_escape(subbed_paramtext)))) end text = text:gsub("<<" .. pattern_escape(param) .. ">>", function() return sub_param() end) text = text:gsub("<<" .. pattern_escape(param) .. ":(.-)>>", sub_param) end local function fetch_text(param_to_replace, key) local spec = paramdoc_param_replacements[param_to_replace] local val = spec[key] if type(val) == "string" then return val end if type(val) == "table" and val[1] == "inherit" then return fetch_text(val[2], key) end error( "Internal error: Unrecognized value for param '" .. param_to_replace .. "', key '" .. key .. "': " .. mw.dumpObject(val) ) end for param_to_replace, spec in pairs(paramdoc_param_replacements) do if not spec.param_no_synonym then -- Text to substitute directly. text = text:gsub("<<" .. pattern_escape(param_to_replace) .. ">>", function() return frame:preprocess(fetch_text(param_to_replace, "text")) end) else do_param_with_optional_synonym( param_to_replace, fetch_text(param_to_replace, "text"), fetch_text(param_to_replace, "param_with_synonym"), fetch_text(param_to_replace, "param_no_synonym") ) end end -- Remove final newline so template code can add a newline after invocation text = text:gsub("\n$", "") return text end return export ruzftwz9fmv201ue73quarpi6ne4f8t 2345001 2344949 2026-04-13T14:12:41Z TheHighFighter2 42988 2345001 Scribunto text/plain --[=[ This module contains functions to implement quote-* templates. Author: Benwing2; conversion into Lua of {{quote-meta/source}} template, written by Sgconlaw with some help from Erutuon and Benwing2. The main interface is quote_t(). Note that the source display is handled by source(), which reads both the arguments passed to it *and* the arguments passed to the parent template, with the former overriding the latter. ]=] local export = {} -- Named constants for all modules used, to make it easier to swap out sandbox versions. local check_isxn_module = "Module:check isxn" local debug_track_module = "Module:debug/track" local en_utilities_module = "Module:en-utilities" local italics_module = "Module:italics" local labels_module = "Module:labels" local languages_module = "Module:languages" local languages_error_module = "Module:languages/error" local links_module = "Module:links" local number_utilities_module = "Module:number utilities" local parameters_module = "Module:parameters" local parse_utilities_module = "Module:parse utilities" local qualifier_module = "Module:qualifier" local roman_numerals_module = "Module:roman numerals" local scribunto_module = "Module:Scribunto" local script_utilities_module = "Module:script utilities" local scripts_module = "Module:scripts" local string_pattern_escape_module = "Module:string/patternEscape" local string_replacement_escape_module = "Module:string/replacementEscape" local string_utilities_module = "Module:string utilities" local table_module = "Module:table" local template_parser_module = "Module:template parser" local usex_module = "Module:usex" local usex_templates_module = "Module:usex/templates" local utilities_module = "Module:utilities" local yesno_module = "Module:yesno" local concat = table.concat local insert = table.insert local new_title = mw.title.new local remove = table.remove local require = require local sort = table.sort local u = mw.ustring.char local ugsub = mw.ustring.gsub local umatch = mw.ustring.match local unpack = unpack or table.unpack -- Lua 5.2 compatibility -- Use HTML entities here to avoid parsing issues (esp. with brackets) local SEMICOLON_SPACE = "&#59; " local SPACE_LBRAC = " &#91;" local RBRAC = "&#93;" local TEMP_LT = u(0xFFF1) local TEMP_GT = u(0xFFF2) local TEMP_LBRAC = u(0xFFF3) local TEMP_RBRAC = u(0xFFF4) local TEMP_SEMICOLON = u(0xFFF5) local function apply_subst(...) apply_subst = require(usex_module).apply_subst return apply_subst(...) end local function check_isbn(...) check_isbn = require(check_isxn_module).check_isbn return check_isbn(...) end local function check_issn(...) check_issn = require(check_isxn_module).check_issn return check_issn(...) end local function debug_track(...) debug_track = require(debug_track_module) return debug_track(...) end local function decode_entities(...) decode_entities = require(string_utilities_module).decode_entities return decode_entities(...) end local function embedded_language_links(...) embedded_language_links = require(links_module).embedded_language_links return embedded_language_links(...) end local function escape_wikicode(...) escape_wikicode = require(parse_utilities_module).escape_wikicode return escape_wikicode(...) end local function find_best_script_without_lang(...) find_best_script_without_lang = require(scripts_module).findBestScriptWithoutLang return find_best_script_without_lang(...) end local function find_parameters(...) find_parameters = require(template_parser_module).find_parameters return find_parameters(...) end local function format_categories(...) format_categories = require(utilities_module).format_categories return format_categories(...) end local function format_processed_labels(...) format_processed_labels = require(labels_module).format_processed_labels return format_processed_labels(...) end local function format_qualifier(...) format_qualifier = require(qualifier_module).format_qualifier return format_qualifier(...) end local function format_usex(...) format_usex = require(usex_module).format_usex return format_usex(...) end local function get_lang(...) get_lang = require(languages_module).getByCode return get_lang(...) end local function get_number(...) get_number = require(number_utilities_module).get_number return get_number(...) end local function get_script(...) get_script = require(scripts_module).getByCode return get_script(...) end local function gsplit(...) gsplit = require(string_utilities_module).gsplit return gsplit(...) end local function page_should_be_ignored(...) page_should_be_ignored = require(usex_templates_module).page_should_be_ignored return page_should_be_ignored(...) end local function parse_inline_modifiers(...) parse_inline_modifiers = require(parse_utilities_module).parse_inline_modifiers return parse_inline_modifiers(...) end local function parse_inline_modifiers_from_segments(...) parse_inline_modifiers_from_segments = require(parse_utilities_module).parse_inline_modifiers_from_segments return parse_inline_modifiers_from_segments(...) end local function parse_multi_delimiter_balanced_segment_run(...) parse_multi_delimiter_balanced_segment_run = require(parse_utilities_module).parse_multi_delimiter_balanced_segment_run return parse_multi_delimiter_balanced_segment_run(...) end local function parse_term_with_lang(...) parse_term_with_lang = require(parse_utilities_module).parse_term_with_lang return parse_term_with_lang(...) end local function pattern_escape(...) pattern_escape = require(string_pattern_escape_module) return pattern_escape(...) end local function pluralize(...) pluralize = require(en_utilities_module).pluralize return pluralize(...) end local function process_params(...) process_params = require(parameters_module).process return process_params(...) end local function remove_links(...) remove_links = require(links_module).remove_links return remove_links(...) end local function roman_to_arabic(...) roman_to_arabic = require(roman_numerals_module).roman_to_arabic return roman_to_arabic(...) end local function replacement_escape(...) replacement_escape = require(string_replacement_escape_module) return replacement_escape(...) end local function scribunto_parameter_key(...) scribunto_parameter_key = require(scribunto_module).scribunto_parameter_key return scribunto_parameter_key(...) end local function serial_comma_join(...) serial_comma_join = require(table_module).serialCommaJoin return serial_comma_join(...) end local function shallow_copy(...) shallow_copy = require(table_module).shallowCopy return shallow_copy(...) end local function split(...) split = require(string_utilities_module).split return split(...) end local function split_alternating_runs(...) split_alternating_runs = require(parse_utilities_module).split_alternating_runs return split_alternating_runs(...) end local function split_and_process_raw_labels(...) split_and_process_raw_labels = require(labels_module).split_and_process_raw_labels return split_and_process_raw_labels(...) end local function split_on_comma(...) split_on_comma = require(parse_utilities_module).split_on_comma return split_on_comma(...) end local function tag_text(...) tag_text = require(script_utilities_module).tag_text return tag_text(...) end local function tag_transcription(...) tag_transcription = require(script_utilities_module).tag_transcription return tag_transcription(...) end local function tag_translit(...) tag_translit = require(script_utilities_module).tag_translit return tag_translit(...) end local function ulen(...) ulen = require(string_utilities_module).len return ulen(...) end local function unitalicize_brackets(...) unitalicize_brackets = require(italics_module).unitalicize_brackets return unitalicize_brackets(...) end local function upper(...) upper = require(string_utilities_module).upper return upper(...) end local function usub(...) usub = require(string_utilities_module).sub return usub(...) end local function yesno(...) yesno = require(yesno_module) return yesno(...) end local function track(page) debug_track("quote/" .. page) end local function maintenance_line(text) return '<span class="maintenance-line">(' .. text .. ")</span>" end local function isbn(text) return "[[Special:BookSources/" .. text .. "|→ISBN]]" .. check_isbn( text, '&nbsp;<span class="error" style="font-size:88%">Invalid&nbsp;ISBN</span>[[Category:Pages with ISBN errors]]' ) end local function issn(text) return "[https://www.worldcat.org/issn/" .. text .. " →ISSN]" .. check_issn( text, '&nbsp;<span class="error" style="font-size:88%">Invalid&nbsp;ISSN</span>[[Category:Pages with ISSN errors]]' ) end local function lccn(text) text = text:gsub(" ", "") if text:find("-") then -- old-style LCCN; reformat per request by [[User:The Editor's Apprentice]] local prefix, part1, part2 = text:match("^(.-)(%d+)%-(%d+)$") if prefix then if ulen(part2) < 6 then part2 = ("0"):rep(6 - ulen(part2)) .. part2 end text = prefix .. part1 .. part2 end end return "[https://lccn.loc.gov/" .. mw.uri.encode(text) .. " →LCCN]" end local function format_date(text) return mw.getCurrentFrame():callParserFunction("#formatdate", text, "dmy") end -- Parse a raw lb= param (or nil) to individual label info objects and then concatenate them appropriately into a -- qualifier input, respecting flags like `omit_preComma` and `omit_postSpace` in the label specs. local function parse_and_format_labels(raw_lb, lang) if not raw_lb then return nil end local labels = split_and_process_raw_labels{labels = raw_lb, lang = lang, nocat = true} labels = format_processed_labels{labels = labels, lang = lang, no_ib_content = true} if labels ~= "" then -- not sure labels can be an empty string but it seems possible in some circumstances return {labels} end end -- Convert a comma-separated list of language codes to a comma-separated list of language names. `fullname` is the -- name of the parameter from which the list of language codes was fetched. local function format_langs(langs) local names = {} for i, lang in ipairs(langs) do names[i] = lang:getCanonicalName() end if #names == 1 then return names[1] end return serial_comma_join(names) end local function get_first_lang(langs) return langs[1] or get_lang("und") end --[=[ Normally we parse off inline modifiers and language code prefixes in various places, e.g. he:מרים<tr:Miryem>. But we exclude HTML entries with <span ...>, <i ...>, <br/> or similar in it, caused by wrapping an argument in {{l|...}}, {{lang|...}} or similar. Basically, all tags of the sort we parse here should consist of a less-than sign, plus letters, plus a colon, e.g. <tr:...>, so if we see a tag on the outer level that isn't in this format, we don't try to parse it. The restriction to the outer level is to allow generated HTML inside of e.g. qualifier modifiers, such as foo<q:similar to {{m|fr|bar}}> (if we end up supporting such modifiers). Also exclude things that look like URL's from being parsed as having language code prefixes. ]=] local function val_should_not_be_parsed_for_annotations(val) return val:find("^[^<]*<%l*[^%l:]") or val:find("^%l+://") end local param_mods = { t = { -- <t:...> and <gloss:...> are aliases. item_dest = "gloss", }, gloss = {}, alt = {}, tr = {}, ts = {}, subst = {}, sc = {type = "script"}, f = { convert = function(arg, parse_err) local prefix, val = arg:match("^(.-):([^ ].*)$") if not prefix then prefix = "" val = arg end local tags, sc_code, sc = prefix:match("^(.*)/(.-)$") if sc_code then sc = get_script(sc_code) or require(languages_error_module)(sc_code, parse_err, "script code", nil, "not real lang") else tags = prefix end local quals if tags ~= "" then quals = split_on_comma(tags) for i, qual in ipairs(quals) do local obj = get_lang(qual, nil, "allow etym") or get_script(qual) quals[i] = obj or qual end end return { quals = quals, sc = sc, val = val, } end, store = "insert", }, q = {}, qq = {}, } local function generate_obj_annotated_text(text, parse_err, paramname) local obj = {} if text:find(":[^ ]") or text:find("%[%[") then local display, is_wikipedia_wikisource obj.text, obj.lang, obj.link, display, is_wikipedia_wikisource = parse_term_with_lang { term = text, parse_err = parse_err, paramname = paramname } -- HACK: If object is a Wikipedia or Wikisource link, we need to convert it to a two-part link -- to avoid the w: or s: prefix showing. We should probably avoid this by calling -- language_link() (in [[Module:links]]) in format_annotated_text() instead of the hacky stuff -- that we currently do; but we need to test that carefully to make sure it doesn't do things like -- munge % signs. if is_wikipedia_wikisource and not obj.text:find("%[%[") and not obj.text:find("%]%]") then -- Don't directly set .alt, because then if the user specifies <alt:...>, it will cause an error in -- parse_inline_modifiers(). obj.display = display end else obj.text = text obj.link = text end return obj end --[=[ Parse a textual property that may be in a foreign language or script and may be annotated with a language prefix and/or inline modifiers. `val` is the value of the parameter and `fullname` is the name of the parameter from which the value was retrieved. `explicit_gloss`, if specified and non-nil, overrides any gloss specified using the <t:...> or <gloss:...> inline modifier. If `val` is nil, the return value of this function is nil. Otherwise it is parsed for a language prefix (e.g. 'ar:مُؤَلِّف') and inline modifiers (e.g. 'ar:مُؤَلِّف<t:Author>'), and the return value is an object with the following fields: `lang`: The language object corresponding to the language prefix, if specified, or nil if no language prefix is given. `text`: The text after stripping off any language prefix and inline modifiers. `link`: The link part of the text if it consists of a two-part link; otherwise, same as `text`. `alt`: Display text specified using the <alt:...> modifier, if given; otherwise, nil. `subst`: Substitutions used to generate the transliteration, in the same format as the subst= parameter. `sc`: The script object corresponding to the <sc:...> modifier, if given; otherwise nil. `tr`: The transliteration corresponding to the <tr:...> modifier, if given; otherwise nil. `ts`: The transcription corresponding to the <ts:...> modifier, if given; otherwise nil. `gloss`: The gloss/translation corresponding to the `explicit_gloss` parameter (if given and non-nil), otherwise the <t:...> or <gloss:...> modifiers if given, otherwise nil. `f`: Foreign versions of the text. `q`: Left qualifiers. `qq`: Right qualifiers. Note that as a special case, if `val` contains HTML tags at the top level (e.g. '<span class="Arab">...</span>', as might be generated by specifying {{lang|ar|مُؤَلِّف}}), no language prefix or inline modifiers are parsed, and the return value has the `noscript` field set to true, which tells format_annotated_text() not to try to identify the script of the text and CSS-tag the text accordingly, but to leave the text untagged. This object can be passed to format_annotated_text() to format a string displaying the text (appropriately script-tagged, unless `noscript` is set, as described above) and modifiers. ]=] local function parse_annotated_text(val, fullname, explicit_gloss) if not val then return nil end -- When checking for inline modifiers, exclude HTML entry with <span ...>, <i ...>, <br/> or similar in it, caused -- by wrapping an argument in {{l|...}}, {{lang|...}} or similar. Also exclude URL's from being parsed as having -- language code prefixes. See val_should_not_be_parsed_for_annotations() for more information. If we find a -- parameter value with top-level HTML in it, add 'noscript = true' to indicate that we should not try to do script -- inference and tagging. (Otherwise, e.g. if you specify {{lang|ar|مُؤَلِّف}} as the author, you'll get an extra big -- font coming from the fact that {{lang|...}} wraps the Arabic text in CSS that increases the size from the -- default, and then we do script detection and again wrap the text in the same CSS, which increases the size even -- more.) if val_should_not_be_parsed_for_annotations(val) then return {text = val, link = val, noscript = true, gloss = explicit_gloss} end local obj if val:find("<") then -- Check for inline modifier. obj = parse_inline_modifiers(val, { paramname = fullname, param_mods = param_mods, generate_obj = generate_obj_annotated_text, }) else obj = generate_obj_annotated_text(val, nil, fullname) end if explicit_gloss then obj.gloss = explicit_gloss end return obj end local html_entity_char_to_replacement = { ["<"] = TEMP_LT, [">"] = TEMP_GT, ["["] = TEMP_LBRAC, ["]"] = TEMP_RBRAC, } local function html_entity_replacement(entity, code_without_semicolon, hash, xcode, x, code) -- Try to decode the entity. If successful, Replace certain special HTML entities (those that are bracket-like) -- with single Unicode characters; otherwise, replace the semicolon with a special character so it won't get -- interpreted as a delimiter. local ch = decode_entities(entity) if ch ~= entity then return html_entity_char_to_replacement[ch] or code_without_semicolon .. TEMP_SEMICOLON end -- If the entity doesn't decode, escape it anyway iff it follows a valid format. if hash == "" then -- Any nonstandard MediaWiki-only entities have now been filtered off, so treat any non-ASCII characters as -- invalid. return xcode:match("^[^\128-\255]+$") and code_without_semicolon .. TEMP_SEMICOLON or entity elseif x == "" then return xcode:match("^%d+$") and code_without_semicolon .. TEMP_SEMICOLON or entity end return code:match("^%x+$") and code_without_semicolon .. TEMP_SEMICOLON or entity end local html_entity_replacement_to_char = { [TEMP_LT] = "&lt;", [TEMP_GT] = "&gt;", [TEMP_LBRAC] = "&#91;", [TEMP_RBRAC] = "&#93;", [TEMP_SEMICOLON] = ";", } local function undo_html_entity_replacement(txt) -- Pattern covers everything in html_entity_replacement_to_char. return (txt:gsub("\239\191[\177-\181]", html_entity_replacement_to_char)) end -- NOTE: We try hard to optimize this function for the common cases and avoid loading [[Module:parse utilities]] -- in such cases. The cases we can handle without loading [[Module:parse utilities]] are single values (no -- semicolons present) without inline modifiers or language prefixes, and multi-entity values (semicolons present) -- without (a) brackets of any kind (including parens, braces and angle brackets; angle brackets typically indicate -- inline modifiers and other brackets may protect a semicolon from being interpreted as a delimiter); -- (b) ampersands (which may indicate HTML entities, which protect a semicolon from being interpreted as a -- delimiter); and (c) colons not followed by a space (which may indicate a language prefix). local function generate_obj_multivalued_annotated_text(text, parse_err, paramname, no_undo_html_entity_replacement) local obj = generate_obj_annotated_text(text, parse_err, paramname) if not no_undo_html_entity_replacement then obj.text = undo_html_entity_replacement(obj.text) obj.link = undo_html_entity_replacement(obj.link) end return obj end --[=[ Similar to parse_annotated_text() but the parameter value may contain multiple semicolon-separated entities, each with their own inline modifiers. Some examples: * mainauthor=Paula Pattengale; Terea Sonsthagen * author=Katie Brick; J. Cody Nielsen; Greg Jao; Eric Paul Rogers; John A. Monson * author=Suzanne Brockmann; Patrick G. Lawlor (Patrick Girard); Melanie Ewbank * author=G Ristori; et al. * author=Jason Scott; zh:王晰宁<t:Wang Xining> * editors=zh:包文俊; zh:金心雯 * quotee=zh:張福運<t:Chang Fu-yun>; zh:張景文<t:Chang Ching-wen> There may be embedded semicolons within brackets, braces or parens that should not be treated as delimiters, e.g.: * author=Oliver Optic [pseudonym; {{w|William Taylor Adams}}] * author=author=Shannon Drake (pen name; {{w|Heather Graham Pozzessere}}) * author=James (the Elder;) Humphrys There may also be HTML entities with semicolons in them: * author=&#91;{{w|Gilbert Clerke}}&#93; * 2ndauthor=Martin Biddle &amp; Sally Badham * author=Peter Christen Asbj&oslash;rnsen There may be both embedded semicolons and HTML entities with semicolons in them: * author=&#91;{{w|Voltaire}} [pseudonym; François-Marie Arouet]&#93; In general we want to treat &#91; like an opening bracket and &#93; like a closing bracket. Beware that they may be mismatched: * author=Anonymous &#91;{{w|Karl Maria Kertbeny}}] Here, `val` is the value of the parameter and `fullname` is the name of the parameter from which the value was retrieved. `explicit_gloss`, if specified and non-nil, overrides any gloss specified using the <t:...> or <gloss:...> inline modifier, and `explicit_gloss_fullname` is the name of the parameter from which this value was retrieved. (If `explicit_gloss` is specified and multiple values were seen, an error results.) Return value is a list of objects of the same sort as returned by parse_annotated_text(). ]=] local function parse_multivalued_annotated_text(val, fullname, explicit_gloss, explicit_gloss_fullname) if not val then return nil end -- NOTE: In the code that follows, we use `entity` most of the time to refer to one of the semicolon-separated -- values in the multivalued param. Entities are most commonly people (typically authors, editors, translators or -- the like), but may be the names of publishers, locations, or other entities. "Entity" can also refer to HTML -- entities; in the places where this occurs, the variable name contains 'html' in it. local splitchar, english_delim if val:find("^,") then splitchar = "," english_delim = "comma" val = val:gsub("^,", "") else splitchar = ";" english_delim = "semicolon" end -- Optimization #1: No semicolons/commas or angle brackets (indicating inline modifiers). if not val:find("[<" .. splitchar .. "]") then if val_should_not_be_parsed_for_annotations(val) then return {{text = val, link = val, noscript = true}} else return {generate_obj_multivalued_annotated_text(val, nil, fullname, "no undo html entity replacement")} end end -- Optimization #2: Semicolons/commas but no angle brackets (indicating inline modifiers), braces, brackets, or -- parens (any of which would protect the semicolon/comma from interpretation as a delimiter), and no ampersand -- (which might indicate an HTML entity with a terminating semicolon, which should not be interpreted as a -- delimiter). if not val:find("[<>%[%](){}&]") then local entity_objs = {} for entity in gsplit(val, "%s*" .. splitchar .. "%s*") do if val_should_not_be_parsed_for_annotations(entity) then insert(entity_objs, { text = entity, link = entity, noscript = true }) else insert(entity_objs, generate_obj_multivalued_annotated_text(entity, nil, fullname, "no undo html entity replacement")) end end return entity_objs end -- Escape HTML entities, and get rid of directionality markers. local amp = val:find("&", nil, true) if amp then -- The pattern is more permissive than the usual entity pattern, as MediaWiki has some nonstandard entities -- that have non-ASCII characters in their codes. val = val:gsub("((&(#?)(([xX]?)([%w\128-\255]+)));)", html_entity_replacement) end -- Pattern covers left-to-right (U+200E) and right-to-left (U+200F). val = val:gsub("\226\128[\142\143]", "") -- Parse balanced segment runs, treating HTML entities for left and right bracket and left and right angle bracket -- as matching literal versions of the same characters. local entity_runs = parse_multi_delimiter_balanced_segment_run( val, {{"[" .. TEMP_LBRAC, "]" .. TEMP_RBRAC}, {"(", ")"}, {"{", "}"}, {"<" .. TEMP_LT, ">" .. TEMP_GT}}, true ) if type(entity_runs) == "string" then local undo_val = undo_html_entity_replacement(val) -- Parse error due to unbalanced delimiters. Don't throw an error here; instead, don't attempt to parse off -- any annotations, but return the value directly, maybe allowing script tagging (not allowing it if it appears -- the text is already script-tagged). return {{text = undo_val, link = undo_val, noscript = not not val_should_not_be_parsed_for_annotations(val)}} end -- Split on semicolon (or comma), possibly surrounded by whitespace. local separated_groups = split_alternating_runs(entity_runs, "%s*" .. splitchar .. "%s*") -- Process each value. local entity_objs = {} for _, entity_group in ipairs(separated_groups) do -- Rejoin runs that don't involve <...>. local j = 2 while j <= #entity_group do if not entity_group[j]:find("^<.*>$") then entity_group[j - 1] = entity_group[j - 1] .. entity_group[j] .. entity_group[j + 1] remove(entity_group, j) remove(entity_group, j) else j = j + 2 end end local oneval = undo_html_entity_replacement(concat(entity_group)) -- When checking for inline modifiers, exclude HTML entry with <span ...>, <i ...>, <br/> or similar in it, -- caused by wrapping an argument in {{l|...}}, {{lang|...}} or similar. Also exclude URL's from being parsed -- as having language code prefixes. This works analogously to parse_annotated_text(); see there for more. if val_should_not_be_parsed_for_annotations(oneval) then insert(entity_objs, { text = oneval, link = oneval, noscript = true }) else local obj if #entity_group > 1 then -- Check for inline modifier. obj = parse_inline_modifiers_from_segments({ group = entity_group, arg = oneval, props = { paramname = fullname, param_mods = param_mods, generate_obj = generate_obj_multivalued_annotated_text, }, }) else obj = generate_obj_multivalued_annotated_text(entity_group[1], nil, fullname) end insert(entity_objs, obj) end end if explicit_gloss then if #entity_objs > 1 then error( ( "Can't specify |%s= along with multiple %s-separated entities in |%s=; use the <t:...> " .. "inline modifier attached to the individual entities" ):format(explicit_gloss_fullname, english_delim, fullname) ) end entity_objs[1].gloss = explicit_gloss end return entity_objs end --[=[ Format a text property that may be in a foreign language or script, along with annotations. This is conceptually similar to the full_link() function in [[Module:links]], but displays the annotations in a different format that is more appropriate for bibliographic entries. The output looks like this: TEXT [TRANSLIT /TRANSCRIPTION/, GLOSS] `textobj` is as returned by parse_annotated_text(). `tag_text_func`, if supplied, is a function of one argument to further wrap the text after it has been processed and CSS-tagged appropriately, directly before insertion. `tag_gloss_func` is a similar function for the gloss. ]=] local function format_annotated_text(textobj, tag_text_func, tag_gloss_func) if not textobj then return nil end local text, link = textobj.text, textobj.link local subst, tr, ts, f, gloss = textobj.subst, textobj.tr, textobj.ts, textobj.f, textobj.gloss -- Retrieve the display text, either specified by the user (.alt) or by parse_annotated_text() (.display) when a -- Wikipedia link is given. local alt = textobj.alt or textobj.display if alt then if link:find("%[%[") or link:find("%]%]") then local errmsg = ("Can't currently handle embedded links in '%s', with <alt:...> text '%s'"):format(link, alt) error(escape_wikicode(errmsg)) end text = ("[[%s|%s]]"):format(link, alt) end -- See above for `noscript`, meaning HTML was found in the text value, probably generated using {{lang|...}}. -- {{lang}} already script-tags the text and processes embedded language links, so we don't want to do it again (in -- fact, the code below within the if-clause is similar to what {{lang}} does). In such a case, an explicit language -- won't be available and find_best_script_without_lang() may not be accurate, so we can't do automatic transliteration. if not textobj.noscript then local lang = textobj.lang -- As an optimization, don't do script detection on an argument that contains only ASCII. local sc = textobj.sc or lang and lang:findBestScript(text) or not text:find("^[ -~]$") and find_best_script_without_lang(text) or nil -- As an optimization, don't do any of the following if there's no language, script, translit or transcription, -- as will be the case with simple ASCII values. if lang or sc or tr or ts then if not lang then lang = get_lang("und") end if tr == "-" then tr = nil elseif not tr and sc and not sc:getCode():find("Lat") then -- Latn, Latf, Latg, pjt-Latn -- might return nil local text_for_tr = text if subst then text_for_tr = apply_subst(text_for_tr, subst) else text_for_tr = remove_links(text) end tr = (lang:transliterate(text_for_tr, sc)) end if text:find("%[%[") then -- FIXME: embedded_language_links() replaces % signs with their URL-encoded equivalents, -- which messes up URL's that may be present (e.g. if chapterurl= is given). IMO this -- should not happen, and embedded_language_links() should do nothing if no embedded links -- are present. To work around this, only call embedded_language_links() when there are -- embedded links present. text = embedded_language_links({ term = text, lang = lang, sc = sc, }) end if lang:getCode() ~= "und" or sc:getCode() ~= "Latn" then text = tag_text(text, lang, sc) end if tr then -- Should we link to the transliteration of languages with lang:link_tr()? Probably not because `text` is not -- likely to be a term that has an entry. tr = tag_translit(tr, lang, "usex") end if ts then ts = tag_transcription(ts, lang, "usex") end end end text = unitalicize_brackets(text) if tag_text_func then text = tag_text_func(text) end local parts = {} if textobj.q then insert(parts, format_qualifier(textobj.q) .. " ") end insert(parts, text) if tr or ts or f or gloss then insert(parts, SPACE_LBRAC) local subparts = {} if tr or ts then local tr_ts if ts then ts = "/" .. ts .. "/" end if tr and ts then tr_ts = tr .. " " .. ts else tr_ts = tr or ts end insert(subparts, tr_ts) end if f then for _, ff in ipairs(f) do local sc = ff.sc local lang if not sc and ff.quals then local qual = ff.quals[1] if type(qual) == "string" then -- do nothing; we'll do script detection farther down elseif qual:hasType("script") then sc = qual else -- language sc = qual:findBestScript(ff.val) lang = qual end end if not lang then lang = get_lang("und") end sc = sc or find_best_script_without_lang(ff.val) local val = embedded_language_links({ term = ff.val, lang = lang, sc = sc, }) if lang:getCode() ~= "und" or sc:getCode() ~= "Latn" then val = tag_text(val, lang, sc) end local qual_prefix if ff.quals then for i, qual in ipairs(ff.quals) do if type(qual) ~= "string" and (qual:hasType("script") or qual:hasType("language")) then ff.quals[i] = qual:getCanonicalName() end end qual_prefix = concat(ff.quals, "/") .. ": " else qual_prefix = "" end insert(subparts, qual_prefix .. val) end end if gloss then gloss = '<span class="e-translation">' .. gloss .. "</span>" gloss = unitalicize_brackets(gloss) if tag_gloss_func then gloss = tag_gloss_func(gloss) end insert(subparts, gloss) end insert(parts, concat(subparts, ", ")) insert(parts, RBRAC) end if textobj.qq then insert(parts, " " .. format_qualifier(textobj.qq)) end return concat(parts) end --[=[ Format a multivalued text property that may be in a foreign language or script, along with annotations. This is the multivalued analog to format_annotated_text(), and formats each individual entity using format_annotated_text(), joining the results with `delimiter`, which defaults to ", ". It `delimiter` is "and" or "or", join the results using serial_comma_join() with the specified conjunction. `textobjs` is as returned by parse_multivalued_annotated_text(). `tag_text_func` and `tag_gloss_func` are as in format_annotated_text(). ]=] local function format_multivalued_annotated_text(textobjs, delimiter, tag_text_func, tag_gloss_func) if not textobjs then return nil end if #textobjs == 1 then return format_annotated_text(textobjs[1], tag_text_func, tag_gloss_func) end local parts = {} for _, textobj in ipairs(textobjs) do insert(parts, format_annotated_text(textobj, tag_text_func, tag_gloss_func)) end -- Change delimiter to semicolon if the items themselves contain commas (e.g., in ", Jr.") local use_semicolon = false for _, obj in ipairs(textobjs) do -- Use remove_links to ignore commas in links if obj.text and remove_links(obj.text):find(", ") then use_semicolon = true break end end local n = #parts if n > 0 and parts[n]:match("^'*et al[.']*$") then -- Special handling for 'et al.' parts[n] = "''và đồng nghiệp''" if n == 2 then -- author et al. return concat(parts, " ") else -- author 1, author 2, et al. return concat(parts, (use_semicolon and "; ") or ", ") end if delimiter == "và" or delimiter == "hoặc" then delimiter = ", " end return concat(parts, delimiter) end if delimiter == "và" or delimiter == "hoặc" then return serial_comma_join(parts, {conj = delimiter}) end return concat(parts, delimiter or ((use_semicolon and "; ") or ", ")) end -- Fancy version of ine() (if-not-empty). Converts empty string to nil, but also strips leading/trailing space. local function ine(arg) if not arg then return nil elseif type(arg) ~= "string" then return arg end arg = mw.text.trim(arg) if arg == "" then return nil end return arg end local abbrs = { ["a."] = {anchor = "a.", full = "trước"}, ["c."] = {anchor = "kh.", full = "khoảng"}, ["kh."] = {anchor = "kh.", full = "khoảng"}, ["p."] = {anchor = "p.", full = "sau"}, } -- Process prefixes 'a.' (ante), 'c.' (circa) and 'p.' (post) at the beginning of an arbitrary date or year spec. -- Returns two values, the formatted version of the prefix and the date spec minus the prefix. If no prefix is found, -- returns an empty string and the full date. local function process_ante_circa_post(date) local prefix = usub(date, 1, 2) local abbr = abbrs[prefix] local abbr_prefix = "" if abbr then abbr_prefix = "''[[Phụ lục:Từ điển thuật ngữ#" .. abbr.anchor .. '|<abbr title="' .. abbr.full .. '">' .. abbr.anchor .. "</abbr>]]'' " -- Remove lowercase letter, period, and space from beginning of date parameter. date = ugsub(date, "^%l%.%s*", "") end return abbr_prefix, date end -- Format the arguments that specify the date of the quotation. These include the following: -- |date=: The date. If |start_date= is given, this is the end date. -- |year=, |month=: Year and month of quotation date or end of range, if |date= isn't given. -- |start_date=: The start date, to specify a range. -- |start_year=, |start_month=: Year and month of start of range, if |start_date= isn't given. -- |accessdate=: Date a website was accessed; processed if no other date was given. -- |nodate=: Indicate that no date is present; otherwise a maintenance line will be displayed if there is no date. -- -- If `parampref` and/or `paramsuf` are given, this modifies all the date arguments accordingly. For example, if -- `parampref` == "orig" and `paramsuf` is omitted, the date is specified using |origdate= or |origyear=/|origmonth=, -- and the start of the range is |origstart_date=, etc. Similarly, if `parampref` is omitted and `paramsuf` is -- "_published", the date is specified using |date_published= or |year_published=/|month_published=, and the start of -- the range is |start_date_published=, etc. -- -- `a` and `get_full_paramname` are functions with the same interpretation as the local functions of the same name in -- source(). These are used to fetch parameters and get their full names. Note that this may cause all arguments to -- have an index added to them (|date2=, |year2=, |month2=, etc.). -- -- `alias_map` is as in source() and is used to map canonical arguments to their aliases when aliases were used. -- -- If `bold_year` is given, displayed years are boldfaced unless boldface is present in the parameter value. -- -- If `maintenance_line_no_date` is specified, it should be a string that will be returned if no date is found (i.e. -- neither |date= nor |year=, or their appropriate equivalents per `parampref` and `paramsuf`, are specified, and -- neither |nodate= is given to indicate that there is no date, or |accessdate= is given). -- -- Returns two values: the formatted date and a boolean indicating whether to add a maintenance category -- [[:Category:Requests for date in LANG entries]]. The first return value will be nil if nothing is to be added -- (in which case the scond return value will always be nil). local function format_date_args( a, get_full_paramname, alias_map, parampref, paramsuf, bold_year, maintenance_line_no_date, year_last ) local output = {} parampref = parampref or "" paramsuf = paramsuf or "" local function getp(param) return a(parampref .. param .. paramsuf) end local function pname(param) local fullname = get_full_paramname(parampref .. param .. paramsuf) return alias_map[fullname] or fullname end -- Format `timestamp` (a timestamp referencing a date) according to the spec in `code`. `param` is the base name of -- the parameter from which the timestamp was fetched, for error messages. local function format_date_with_code(code, timestamp, param) local language = mw.getContentLanguage() local ok, date = pcall(language.formatDate, language, code, timestamp) if ok then return date else -- All the formats used in format_date_args() are fine, so the timestamp must be at fault. error( ( "Timestamp |%s=%s (possibly canonicalized from its original format) could not be parsed; see the " .. "[[mw:Help:Extension:ParserFunctions##time|documentation for the #time parser function]]" ):format(pname(param), tostring(timestamp)) ) end end -- Try to figure out if the given timestamp has the day of the month explicitly given. We use the following -- algorithm: -- 1. Format as year-month-day; if the day is not 1, the day was explicitly given, since if only the year/month are -- given, the day shows up as 1. -- 2. If the day shows up as 1 and there isn't a 1 or 01 in the timestamp, the day wasn't explicitly given. -- 3. Otherwise, if there are three separate numbers (e.g. 2022-07-01), or two separate numbers plus a capitalized -- letter (taken as an English month, e.g. 2022 July 1), the day was explicitly given, otherwise not. -- -- `param` is the base name of the parameter from which the timestamp was fetched. local function date_has_day_specified(timestamp, param) local day = format_date_with_code("j", timestamp, param) if day ~= "1" then return true end local english_month = timestamp:find("%u") local canon_timestamp = mw.text.trim((timestamp:gsub("%D+", " "))) local seen_nums = split(canon_timestamp, " ", true) local saw_one = false for _, num in ipairs(seen_nums) do if num == "1" or num == "01" then saw_one = true break end end if not saw_one then return false end return #seen_nums >= 3 or english_month and #seen_nums >= 2 end -- Format a date with boldfaced year, as e.g. '''2023''' August 3. `explicit_day_given` indicates whether to include -- the day; if false, the return value will be e.g. '''2023''' August. `date_param` is the base name of the param -- from which the date was fetched, for error messages. local function format_bold_date(date, explicit_day_given, date_param) local day_month_code = explicit_day_given and "j F" or "F" local month_day_code = explicit_day_given and "d/m/" or "F" if year_last then if bold_year then -- This formats like "3 August '''2023'''" (or "August '''2023'''" if day not explicitly given). return format_date_with_code(day_month_code .. " '''Y'''", date, date_param) else -- This formats like "3 August 2023" (or "August 2023" if day not explicitly given). return format_date_with_code(day_month_code .. " Y", date, date_param) end else if bold_year then -- This formats like "'''2023''' August 3" (or "'''2023''' August" if day not explicitly given). return format_date_with_code("'''" .. month_day_code .. "Y'''", date, date_param) else -- This formats like "2023 August 3" (or "2023 August" if day not explicitly given). return format_date_with_code(month_day_code .. "Y", date, date_param) end end end -- The formatDate method of the mw.language object behaves like the {{#time:}} parser function, which doesn't -- accept the formats "monthday monthname, year" or "year monthname monthday", but outputs garbage when it receives -- them, behavior inherited from PHP. {{#formatdate:}} magic word is more forgiving. Fix dates so that, for -- instance, the |date= parameter of {{quote-journal}} (which uses this code) and the |accessdate= parameter (which -- uses {{#formatdate:}}) accept similar date formats. See: -- * [[mw:Extension:Scribunto/Lua_reference_manual#mw.language:formatDate]] -- * [[mw:Help:Extension:ParserFunctions##time]] -- * [[mw:Help:Magic_words#Formatting]] -- `date` is the date spec from the user, which is assumed to come from a parameter whose base name ends in "date"; -- `parampref` is the prefix added to "date" to get the parameter name. local function fix_date(date, param_pref) if tonumber(date) ~= nil then error( ("|%s= should contain a full date (year, month, day of month); use |%s= for year"):format( pname(param_pref .. "date"), pname(param_pref .. "year") ) ) elseif date and date:find("%s*%a+,%s*%d+%s*$") then error( ("|%s= should contain a full date (year, month, day of month); use |%s=, |%s= for month and year"):format( pname(param_pref .. "date"), pname(param_pref .. "month"), pname(param_pref .. "year") ) ) end if date then -- Commas are replaced with spaces to prevent parsing issues local fixed_date = ugsub(date, ", *", " ") return (ugsub(ugsub(fixed_date or date, "(%d+ %a+),", "%1"), "^(%d%d%d%d) (%a+ %d%d?)$", "%2 %1")) end end local start_date, date = fix_date(getp("start_date"), "start_"), fix_date(getp("date"), "") local year = getp("year") local month = getp("month") local start_year = getp("start_year") local start_month = getp("start_month") if date and year then error(("Only one of |%s= or |%s= should be specified"):format(pname("date"), pname("year"))) end if date and month then error( ("|%s= should only be specified in conjunction with |%s=, not with |%s="):format( pname("month"), pname("year"), pname("date") ) ) end if start_date and start_year then error(("Only one of |%s= or |%s= should be specified"):format(pname("start_date"), pname("start_year"))) end if start_date and start_month then error( ("|%s= should only be specified in conjunction with |%s=, not with |%s="):format( pname("start_month"), pname("start_year"), pname("start_date") ) ) end if (start_date or start_year) and not (date or year) then error( ("|%s= or |%s=/|%s= cannot be specified without specifying |%s= or |%s=/|%s="):format( pname("start_date"), pname("start_year"), pname("start_month"), pname("date"), pname("year"), pname("month") ) ) end local dash = "&nbsp;– " local day_explicitly_given = date and date_has_day_specified(date, "date") local start_day_explicitly_given = start_date and date_has_day_specified(start_date, "start_date") -- Format a date with boldfaced year, as e.g. '''2023''' August 3 (if `explicit_day_given` specified) or -- '''2023''' August (if `explicit_day_given` not specified). If no date specified, fall back to formatting based -- on the year and (optionally) month params given in `yearobj` and `monthobj`, boldfacing the year if not already. -- `date_param` is the base name of the param from which the date was fetched, for error messages. local function format_date_or_year_month(date, yearobj, monthobj, explicit_day_given, date_param) if date then return format_bold_date(date, explicit_day_given, date_param) else -- Boldface a year spec if it's not already boldface. if bold_year and not yearobj.text:find("'''") then -- Clone the year object before modifying it because we may use it later to check against the current -- year (if we're dealing with start_year). yearobj = shallow_copy(yearobj) yearobj.text = "'''" .. yearobj.text .. "'''" if yearobj.alt then yearobj.alt = "'''" .. yearobj.alt .. "'''" end end if year_last then return (monthobj and format_annotated_text(monthobj) .. " " or "") .. format_annotated_text(yearobj) else return format_annotated_text(yearobj) .. (monthobj and " " .. format_annotated_text(monthobj) or "") end end end local yearobj = parse_annotated_text(year, pname("year")) local monthobj = parse_annotated_text(month, pname("month")) local start_yearobj = parse_annotated_text(start_year, pname("start_year")) local start_monthobj = parse_annotated_text(start_month, pname("start_month")) if start_yearobj then local abbr_prefix abbr_prefix, start_yearobj.text = process_ante_circa_post(start_yearobj.text) start_yearobj.link = select(2, process_ante_circa_post(start_yearobj.link)) insert(output, abbr_prefix) elseif yearobj then local abbr_prefix abbr_prefix, yearobj.text = process_ante_circa_post(yearobj.text) yearobj.link = select(2, process_ante_circa_post(yearobj.link)) insert(output, abbr_prefix) end if start_date or start_year then local cur_year = yearobj and yearobj.text or format_date_with_code("Y", date, "date") local cur_month = monthobj and monthobj.text or date and format_date_with_code("F", date, "date") or nil local cur_day = date and day_explicitly_given and format_date_with_code("j", date, "date") or nil local beg_year = start_yearobj and start_yearobj.text or format_date_with_code("Y", start_date, "start_date") local beg_month = start_monthobj and start_monthobj.text or start_date and format_date_with_code("F", start_date, "start_date") or nil local beg_day = start_date and start_day_explicitly_given and format_date_with_code("j", start_date, "start_date") or nil if year_last then if beg_day then insert(output, beg_day .. " " .. beg_month) else insert(output, beg_month) end if beg_year ~= cur_year then insert(output, " " .. beg_year) end else insert(output, format_date_or_year_month( start_date, start_yearobj, start_monthobj, start_day_explicitly_given, "start_date" )) end if cur_year ~= beg_year then -- Different years; insert current date in full. if beg_month or cur_month then insert(output, dash) else insert(output, "–") end insert(output, format_date_or_year_month(date, yearobj, monthobj, day_explicitly_given, "date")) elseif cur_month and cur_month ~= beg_month then local month_ins = monthobj and format_annotated_text(monthobj) or cur_month -- Same year but different months; insert current month and (if available) current day. if cur_day then insert(output, dash) if year_last then insert(output, cur_day .. " " .. month_ins) else insert(output, month_ins .. " " .. cur_day) end else if beg_day then insert(output, dash) else insert(output, "–") end insert(output, month_ins) end elseif cur_day and cur_day ~= beg_day then -- Same year and month but different days; insert current day. insert(output, "–") insert(output, cur_day) else -- Same year, month and day; or same year and month, and day not available; or same year, and month and -- day not available. Do nothing. FIXME: Should we throw an error? end if year_last and beg_year == cur_year then if cur_month then insert(output, " " .. cur_year) else insert(output, " " .. cur_year) end end elseif date or yearobj then insert(output, format_date_or_year_month(date, yearobj, monthobj, day_explicitly_given, "date")) elseif not maintenance_line_no_date then -- Not main quote date. Return nil, caller will handle. return nil, nil elseif not getp("nodate") then local accessdate = getp("accessdate") if accessdate then local explicit_day_given = date_has_day_specified(accessdate, "accessdate") insert(output, format_bold_date(accessdate, explicit_day_given, "accessdate") .. " (truy cập lần cuối)") else if mw.title.getCurrentTitle().namespace ~= 10 then return maintenance_line(maintenance_line_no_date), true end return nil, nil end end return ine(concat(output)), nil end local function tag_with_cite(txt) return "<cite>" .. txt .. "</cite>" end -- Display the source line of the quote, above the actual quote text. This contains the majority of the logic of this -- module (formerly contained in {{quote-meta/source}}). function export.source(args, alias_map, format_as_cite, other_controls) local tracking_categories = {} local argslang = args[1] or args.lang if not argslang then -- For the moment, only trigger an error on mainspace pages and -- other pages that are not user pages or pages containing discussions. -- These are the same pages that appear in the appropriate tracking -- categories. User and discussion pages have not generally been -- fixed up to include a language code and so it's more helpful -- to use a maintenance line than signal an error. local current_title = mw.title.getCurrentTitle() if not (current_title.namespace == 10 or page_should_be_ignored(current_title.fullText)) then require(languages_error_module)(nil, 1) end end -- Given a canonical param, convert it to the original parameter specified by the user (which may have been an -- alias). local function alias(param) return alias_map[param] or param end local output, sep = {} local overrides = other_controls and other_controls.overrides or {} -- Add text to the output. The text goes into a list, and we concatenate all the list components together at the -- end. To make it easier to handle comma-separated items, we keep track (in `sep`) of the separator (if any) that -- needs to be inserted before the next item added. For example, if we're in the "newversion" code (ind ~= ""), and -- there's no title and no URL, then the first time we add anything after the title, we don't want to add a -- separating comma because the preceding text will say "republished " or "republished as " or "translated as " or -- similar. In all- other cases, we do want to add a separating comma. The bare add() function reset the separator -- to be nothing, while the add_with_sep() function resets the separator to be the value of `next_sep` (defaulting -- to ", "), so the next time around we do add a comma to separate `text` from the preceding piece of text. local function add(text) if sep then insert(output, sep) end insert(output, text) sep = nil end local function add_with_sep(text, next_sep) add(text) sep = next_sep or ", " end -- FIXME: This is all very over-engineered, which makes it slow and memory-inefficient. -- Return a function that generates the actual parameter name associated with a base param (e.g. "author", "last"). -- The actual parameter name may have an index added (an empty string for the first set of params, e.g. author=, -- last=, or a numeric index for further sets of params, e.g. author2=, last2=, etc.). local function make_get_full_paramname(ind) return function(param) return param .. ind end end -- Function to fetch the actual parameter name associated with a base param (see make_get_full_paramname() above). -- Assigned at various times below by calling make_get_full_paramname(). We do it this way so that we can have -- wrapper functions that access params and define them only once. local get_full_paramname -- Return two values: the value of a parameter given the base param name (which may have a numeric index added), -- and the parameter name from which the value was fetched (which may be an alias, i.e. you can't necessarily fetch -- the parameter value from args[] given this name). The base parameter can be a list of such base params, which -- are checked in turn, or nil, in which case nil is returned. local function a_with_name(param) if not param then return nil elseif type(param) ~= "table" then local fullname = get_full_paramname(param) return args[fullname], alias(fullname) end for _, par in ipairs(param) do local val, fullname = a_with_name(par) if val then return val, alias(fullname) end end return nil end -- Fetch the value of a parameter given the base param name (which may have a numeric index added). The base -- parameter can be a list of such base params, which are checked in turn, or nil, in which case nil is returned. local function a(param) return (a_with_name(param)) end -- Identical to a_with_name(param) except that it verifies that no space is present. Should be used for URL's. local function aurl_with_name(param) local value, fullname = a_with_name(param) if value and value:find(" ") and not value:find("%[") then error(("URL not allowed to contain a space, but saw |%s=%s"):format(fullname, value)) end return value, fullname end -- Identical to a(param) except that it verifies that no space is present. Should be used for URL's. local function aurl(param) return (aurl_with_name(param)) end -- Convenience function to fetch a parameter that may be in a foreign language or text (and may consequently have -- a language prefix and/or inline modifiers), parse the annotations and convert the result into a formatted string. -- This is the same as parse_and_format_annotated_text() below but also returns the full param name as the second -- return value. local function parse_and_format_annotated_text_with_name(param, tag_text_func, tag_gloss_func) local val, fullname = a_with_name(param) local obj = parse_annotated_text(val, fullname) return format_annotated_text(obj, tag_text_func, tag_gloss_func), fullname end -- Convenience function to fetch a parameter that may be in a foreign language or text (and may consequently have -- a language prefix and/or inline modifiers), parse the modifiers and convert the result into a formatted string. -- This is a wrapper around parse_annotated_text() and format_annotated_text(). `param` is the base parameter name (see -- a_with_name()), `tag_text_func` is an optional function to tag the parameter text after all other processing (e.g. -- wrap in <cite>...</cite> tags), and `tag_gloss_func` is a similar function for the parameter translation/gloss. local function parse_and_format_annotated_text(param, tag_text_func, tag_gloss_func) return (parse_and_format_annotated_text_with_name(param, tag_text_func, tag_gloss_func)) end -- Convenience function to fetch a multivalued parameter that may be in a foreign language or text (and may -- consequently have a language prefix and/or inline modifiers), parse the modifiers and convert the result into a -- formatted string. This is the multivalued analog to parse_and_format_annotated_text_with_name() and returns two -- values, the formatted string and the full name of the parameter fetched. `delimiter` is as in -- format_multivalued_annotated_text(). local function parse_and_format_multivalued_annotated_text_with_name(param, delimiter, tag_text_func, tag_gloss_func) local val, fullname = a_with_name(param) local objs = parse_multivalued_annotated_text(val, fullname) local num_objs = objs and #objs or 0 return format_multivalued_annotated_text(objs, delimiter, tag_text_func, tag_gloss_func), fullname, num_objs end -- Convenience function to fetch a multivalued parameter that may be in a foreign language or text (and may -- consequently have a language prefix and/or inline modifiers), parse the modifiers and convert the result into a -- formatted string. This is the multivalued analog to parse_and_format_annotated_text(). `delimiter` is as in -- format_multivalued_annotated_text(). local function parse_and_format_multivalued_annotated_text(param, delimiter, tag_text_func, tag_gloss_func) return (parse_and_format_multivalued_annotated_text_with_name(param, delimiter, tag_text_func, tag_gloss_func)) end -- This determines whether to display "Mary Bloggs, transl." (if there's no author preceding) or "translated by -- Mary Bloggs" (if there's an author preceding). local author_outputted = false -- When formatting as a citation, the priority is to display a name and a date before the book/chapter title -- this tracks whether or not the author/date has been displayed local date_outputted, formatted_date, formatted_origdate = false local function add_date(no_paren) if not date_outputted then if no_paren then sep = ", " else sep = " " end if formatted_date then if no_paren then add(formatted_date) else add("(" .. formatted_date .. ")") end end if formatted_origdate then add(SPACE_LBRAC .. formatted_origdate .. RBRAC) end sep = ", " date_outputted = true end end local function is_anonymous(val) return val:match("^[Aa]nonymous$") or val:match("^[Aa]non%.?$") end -- Add a formatted author (whose values may be specified using `author` or, for compatibility purposes, split -- among various parameters): -- * `author` is the value of the author param (e.g. "author", "author2" or "2ndauthor"), and `author_fullname` is -- the full parameter name holding that value; -- * `trans_author` is the optional value of the param holding the gloss/translation of the author, and -- `trans_author_fullname` is the full parameter name holding that value (or nil for no such parameter); -- * `authorlink` is the value of the authorlink param, which holds the Wikipedia link of the author(s) in `author`, -- and `authorlink_fullname` is the full parameter name holding that value; -- * `trans_authorlink` is the optional value of the param holding the Wikipedia link of the gloss/translation of -- the author, and `trans_authorlink_fullname` is the full parameter name holding that value (or nil for no such -- parameter); -- * `first` is the value of the parameter holding the first name of the author, and `first_fullname` is the full -- parameter name holding that value; -- * `trans_first` is the value of the corresponding parameter holding the gloss/translation of the first name -- (e.g. "trans-first"), and `trans_first_fullname` is the full parameter name holding that value (or nil for -- no such parameter); -- * `last` is the value of the parameter holding the last name of the author, and `last_fullname` is the full -- parameter name holding that value; -- * `trans_last` is the value of the corresponding parameter holding the gloss/translation of the last name -- (e.g. "trans-last"), and `trans_last_fullname` is the full parameter name holding that value (or nil for -- no such parameter). -- * `last_first` if set, when parameters `first` and `last` are used, display the author name as "last, first" local function add_author( author, author_fullname, trans_author, trans_author_fullname, authorlink, authorlink_fullname, trans_authorlink, trans_authorlink_fullname, first, first_fullname, trans_first, trans_first_fullname, last, last_fullname, trans_last, trans_last_fullname, last_first ) local function make_author_with_url(txt, txtparam, authorlink, authorlink_param) if authorlink then if authorlink:find("%[%[") then error(("Can't specify links in |%s=%s"):format(authorlink_param, authorlink)) end if txt:find("%[%[") then error(("Can't specify links in %s=%s"):format(txtparam, txt)) end return "[[w:" .. authorlink .. "|" .. txt .. "]]" else return txt end end local num_authorobjs if author then local authorobjs = parse_multivalued_annotated_text(author, author_fullname, trans_author, trans_author_fullname) num_authorobjs = #authorobjs if num_authorobjs == 1 then if is_anonymous(authorobjs[1].text) then authorobjs[1].text = "Tác giả khuyết danh" authorobjs[1].link = "Tác giả khuyết danh" end if authorlink then authorobjs[1].text = make_author_with_url( authorobjs[1].text, "|" .. author_fullname, authorlink, "|" .. authorlink_fullname ) authorobjs[1].link = make_author_with_url( authorobjs[1].link, "|" .. author_fullname, authorlink, "|" .. authorlink_fullname ) end if authorobjs[1].gloss and trans_authorlink then authorobjs[1].gloss = make_author_with_url( authorobjs[1].gloss, ("<t:...> in |%s"):format(author_fullname), trans_authorlink, "|" .. trans_author_fullname ) end add(format_multivalued_annotated_text(authorobjs)) elseif trans_authorlink then error( ( "Can't specify |%s= along with multiple semicolon-separated entities in |%s=; use the " .. "<t:...> inline modifier attached to the individual entities and put the link directly " .. "in the value of the inline modifier" ):format(trans_authorlink_fullname, author_fullname) ) else -- Allow an authorlink with multiple authors, e.g. for use with |author=Max Mills; Harvey Mills -- with |authorlink=Max and Harvey. For this we have to generate the entire text and link it -- all. local formatted_text = format_multivalued_annotated_text(authorobjs) if authorlink then formatted_text = make_author_with_url( formatted_text, "|" .. author_fullname, authorlink, "|" .. authorlink_fullname ) end add(formatted_text) end else num_authorobjs = 1 -- Author separated into first name + last name. We don't currently support non-Latin-script -- authors separated this way and probably never will. if first then if last_first then author = last .. ", " .. first else author = first .. " " .. last end else author = last end if authorlink then local authorparam = first and ("|%s |%s"):format(first_fullname, last_fullname) or "|" .. last_fullname author = make_author_with_url(author, authorparam, authorlink, authorlink_fullname) end local trans_author if trans_last then if trans_first then trans_author = trans_first .. " " .. trans_last else trans_author = trans_last end if trans_authorlink then local trans_authorparam = trans_first and ("|%s |%s"):format(trans_first_fullname, trans_last_fullname) or "|" .. trans_last_fullname trans_author = make_author_with_url( trans_author, trans_authorparam, trans_authorlink, trans_authorlink_fullname ) end end add(author) if trans_author then add(SPACE_LBRAC) add(trans_author) add(RBRAC) end end author_outputted = true return num_authorobjs end local function add_authorlike( param, prefix_with_preceding_authors, suffix_without_preceding_authors, suffix_if_multiple, anonymous_suffix ) local delimiter = author_outputted and "và" or ", " local entities, _, num_entities = parse_and_format_multivalued_annotated_text_with_name(param, delimiter) if not entities then return end if is_anonymous(entities) then -- If tlr=anonymous or similar given, display as "anonymous translator" or similar. If a specific -- anonymous suffix not given, try to derive the anonymous suffix from the non-preceding-author suffix. if not anonymous_suffix then local cleaned_suffix = suffix_without_preceding_authors :gsub("&#32;", " ") :gsub("&nbsp;", " ") :gsub("&#160;", " ") :gsub("&#91;", "[") :gsub("&#93;", "]") cleaned_suffix = mw.text.trim(cleaned_suffix) if not anonymous_suffix then anonymous_suffix = " " .. cleaned_suffix:match("^, (.*)$") end if not anonymous_suffix then anonymous_suffix = " " .. cleaned_suffix:match("^%((.*)%)$") end if not anonymous_suffix then anonymous_suffix = " " .. cleaned_suffix:match("^%[(.*)%]$") end if not anonymous_suffix then anonymous_suffix = suffix_without_preceding_authors end end add_with_sep("anonymous" .. anonymous_suffix) elseif prefix_with_preceding_authors and (author_outputted or not suffix_without_preceding_authors) then add_with_sep(entities .. prefix_with_preceding_authors) elseif suffix_if_multiple and num_entities > 1 then add_with_sep(entities .. suffix_if_multiple) else add_with_sep(entities .. suffix_without_preceding_authors) end author_outputted = true end local function add_authorlabel() local default_authorlabel = a("default-authorlabel") if default_authorlabel and yesno(a("authorlabel"), true) then sep = nil add_with_sep(" " .. default_authorlabel) end end local function has_new_title_or_author() return args["2ndauthor"] or args["2ndlast"] or args.chapter2 or args.title2 or args.tlr2 or args.mainauthor2 or args.editor2 or args.editors2 or args.compiler2 or args.compilers2 or args.director2 or args.directors2 end local function has_newversion() return args.newversion or args.location2 or has_new_title_or_author() end -- Handle chapter=, section=, etc. `param` is the base name of the parameter in question, e.g. "chapter" or -- "section". If numeric (either Arabic or Roman), add `numeric_prefix`; otherwise, parse as textual (allowing for -- language prefixes, inline modifiers, etc.), prefix with `textual_prefix` (if given) and suffix with -- `textual_suffix` (if given). Also checks for and handles the following (assuming param == "chapter"): -- * chapterurl=: URL of the chapter. -- * trans-chapter=: Chapter translation (can be given using an inline modifier <t:...>). -- * chapter_number=: Chapter number, when chapter= is also given (otherwise put the chapter number in chapter=). -- * chapter_plain=: Plain version of the chapter number; the "chapter " prefix isn't added. -- * chapter_series=: Series that the chapter is within (used e.g. for journal articles part of a series). -- * chapter_seriesvolume=: Volume of the series (compare seriesvolume=). -- -- Returns nil if no value specified for the main parameter, otherwise the formatted value. local function format_chapterlike(param, numeric_prefix, textual_prefix, textual_suffix) local chap, chap_fullname = a_with_name(param) local chap_num, chap_num_fullname = a_with_name(param .. "_number") local chap_plain, chap_plain_fullname = parse_and_format_annotated_text_with_name(param .. "_plain") if chap_num and chap_plain then error(("Specify only one of |%s= or %s="):format(chap_num_fullname, chap_plain_fullname)) end local chap_series, chap_series_fullname = parse_and_format_annotated_text_with_name(param .. "_series", tag_with_cite, tag_with_cite) local chap_seriesvolume, chap_seriesvolume_fullname = parse_and_format_annotated_text_with_name(param .. "_seriesvolume") if chap_series then chap_series = ", " .. chap_series end if chap_seriesvolume then if not chap_series then error(("Cannot specify |%s= without %s="):format(chap_series_fullname, chap_seriesvolume_fullname)) end chap_series = chap_series .. " (" .. chap_seriesvolume .. ")" end local chapterurl local function make_chapter_with_url(chap) if chapterurl then return "[" .. chapterurl .. " " .. chap .. "]" else return chap end end if not chap then if chap_num then error( ("Cannot specify |%s= without |%s=; put the numeric value in |%s= directly"):format( chap_num_fullname, chap_fullname, chap_fullname ) ) end if chap_plain then chapterurl = aurl(param .. "url") return make_chapter_with_url(chap_plain .. (chap_series or "")) end return nil end local cleaned_chap = chap:gsub("<sup>[^<>]*</sup>", ""):gsub("[*+#]", "") chapterurl = aurl(param .. "url") local formatted if numeric_prefix and get_number(cleaned_chap) then -- Arabic chapter number formatted = numeric_prefix .. make_chapter_with_url(chap) elseif numeric_prefix and cleaned_chap:match("^[mdclxviMDCLXVI]+$") and roman_to_arabic(cleaned_chap, true) and (not overrides[param] or not overrides[param].noroman) then -- Roman chapter number formatted = numeric_prefix .. make_chapter_with_url(upper(chap)) else -- strip leading ! (used to force text-mode for titles that look like Roman numerals like "mil" and "dill") if chap:find("^!") then chap = chap:gsub("^!", "") end -- Must be a chapter name local chapterobj = parse_annotated_text(chap, chap_fullname, a("trans-" .. param)) chapterobj.text = make_chapter_with_url(chapterobj.text) chapterobj.link = make_chapter_with_url(chapterobj.link) formatted = (textual_prefix or "") .. format_annotated_text(chapterobj) .. (textual_suffix or "") end if chap_num or chap_plain then -- NOTE: Up above we throw an error if both chap_num and chap_plain are specified. formatted = formatted .. " (" .. (chap_plain or numeric_prefix .. chap_num) .. ")" end if chap_series then formatted = formatted .. chap_series end return formatted end -- This handles everything after displaying the author, starting with the chapter and ending with page, column, -- line and then other=. It is currently called twice: Once to handle the main portion of the citation, and once to -- handle a "newversion" citation. `ind` is either "" for the main portion or a number (currently only 2) for a -- "newversion" citation. In a few places we conditionalize on `ind` to take actions depending on its value. local function postauthor(ind, num_authors, format_as_cite) get_full_paramname = make_get_full_paramname(ind) if author_outputted then add_authorlabel() end local coauthors = parse_and_format_multivalued_annotated_text("coauthors", "và") if coauthors then local with_prefix = "" if author_outputted then with_prefix = "; " if num_authors == 1 then sep = "" end end add_with_sep(with_prefix .. coauthors) author_outputted = true end add_authorlike("quotee", " (trích dẫn gốc) ", ", quotee", ", quotees") if format_as_cite and author_outputted and not date_outputted then add_date() sep = ", " end add_authorlike("chapter_tlr", " (dịch)", " (dịch)", nil, " translator") local function add_sg_and_pl_authorlike(noun, verbed) local sgparam = noun local plparam = noun .. "s" local sgval, sgval_fullname = a_with_name(sgparam) local plval, plval_fullname = a_with_name(plparam) if sgval and plval then error(("Can't specify both |%s= and |%s="):format(sgval_fullname, plval_fullname)) end if sgval or plval then local verbed_by = " (" .. verbed .. ")" local comma_sgnoun = " (" .. noun .. ")" local comma_plnoun = " (" .. noun .. ")" add_authorlike(sgparam, verbed_by, comma_sgnoun, comma_plnoun) add_authorlike(plparam, verbed_by, comma_plnoun) end end local formatted_entry = format_chapterlike("entry", nil, "“", "”") local formatted_chapter = format_chapterlike("chapter", "chương ", "“", "”") local function add_entry() if formatted_entry then add_with_sep(formatted_entry) if not a("notitle") then add("trong ") author_outputted = false else author_outputted = true end formatted_entry = nil end end local function add_chapter() add_entry() if formatted_chapter then add_with_sep(formatted_chapter) if not a("notitle") then add("trong ") author_outputted = false end formatted_chapter = nil end end local function add_actor_role(format_as_cite) local role = parse_and_format_multivalued_annotated_text("role", "và") local actor_val, actor_fullname = a_with_name("actor") local actor_objs = parse_multivalued_annotated_text(actor_val, actor_fullname) local actor = format_multivalued_annotated_text(actor_objs, "và") if format_as_cite then if role then if actor then add_with_sep(actor) end sep = nil add_with_sep(" as " .. role) elseif actor then add_with_sep(actor .. " (" .. (#actor_objs > 1 and "actors" or "actor") .. ")") end else if role then add_with_sep("spoken by " .. role) if actor then sep = nil add_with_sep(" (" .. actor .. ")") end elseif actor then add_with_sep(actor .. " (" .. (#actor_objs > 1 and "actors" or "actor") .. ")") end end end if format_as_cite then if date_outputted then add_chapter() end local output_len = #output local mainauthor = parse_and_format_multivalued_annotated_text("mainauthor") if mainauthor then add_with_sep(mainauthor) end -- quote-* templates display "jobbed by name" after the author, controlled by the author_outputted flag author_outputted = false add_authorlike("tlr", " (dịch)", " (dịch)", nil, " translator") author_outputted = false add_authorlike("editor", " (biên tập)") add_authorlike("editors", " (biên tập)") add_authorlike("compiler", " (biên soạn)") add_authorlike("compilers", " (biên soạn)") add_sg_and_pl_authorlike("director", "directed") add_authorlike("lyricist", nil, " (lời)", nil, " lyricist") add_authorlike("lyrics-translator", nil, " (translation)", nil, " lyrics translator") add_authorlike("composer", nil, " (music)", nil, " composer") add_actor_role("format_as_cite") -- if the output length has changed, a credit name has been printed -- and we can print the date if output_len ~= #output then author_outputted = true add_date() end add_chapter() else add_chapter() local mainauthor = parse_and_format_multivalued_annotated_text("mainauthor") if mainauthor then add_with_sep(mainauthor) author_outputted = true end add_authorlike("tlr", " (dịch)", " (dịch)", nil, " translator") add_authorlike("editor", " (biên tập)") add_authorlike("editors", " (biên tập)") add_sg_and_pl_authorlike("compiler", "compiled") add_sg_and_pl_authorlike("director", "directed") add_authorlike("lyricist", nil, " (lời)", nil, " lyricist") add_authorlike("lyrics-translator", nil, " (translation)", nil, " lyrics translator") add_authorlike("composer", nil, " (music)", nil, " composer") end local title, title_fullname = a_with_name("title") local need_comma = false if title then local titleobj = parse_annotated_text(title, title_fullname, a("trans-title")) add(format_annotated_text(titleobj, tag_with_cite, tag_with_cite)) local series = parse_and_format_annotated_text("series") if series then add(" (" .. series) local seriesvolume = parse_and_format_annotated_text("seriesvolume") if seriesvolume then add(SEMICOLON_SPACE .. seriesvolume) end add(")") end need_comma = true elseif ind == "" then if not a("notitle") then add(maintenance_line("Vui lòng cung cấp tên cuốn sách hoặc tên tạp chí")) need_comma = true end end local archiveurl, archiveurl_fullname = aurl_with_name("archiveurl") local url, url_fullname = aurl_with_name("url") local urls, urls_fullname = aurl_with_name("urls") if url and urls then error(("Supply only one of |%s= and |%s="):format(url_fullname, urls_fullname)) end local function verify_title_supplied(url_name) -- There are too many cases of this to throw an error at this time. -- if not title then -- error(("If |%s= is given, |%s= must also be supplied"):format(url_name, title_fullname)) -- end end if archiveurl or url then verify_title_supplied(archiveurl and archiveurl_fullname or url_fullname) sep = nil add("&lrm;<sup>[" .. (archiveurl or url) .. "]</sup>") elseif urls then verify_title_supplied(urls_fullname) sep = nil add("&lrm;<sup>" .. urls .. "</sup>") end -- display (in Language) if language is provided and is not English and not overriden by termlang or worklang if format_as_cite and ind == "" and not (args.termlang or args.worklang) and (args[1] or args.lang) then local lang = get_first_lang(args[1] or args.lang) if lang then local langcode = lang:getCode() if not (langcode == "und" or langcode == "vi") then local langs = format_langs(args[1] or args.lang) if langs then add(" (bằng " .. langs .. ")") end end end end if need_comma then sep = ", " end local edition, edition_fullname = parse_and_format_annotated_text_with_name("edition") local edition_plain, edition_plain_fullname = parse_and_format_annotated_text_with_name("edition_plain") if edition and edition_plain then error(("Supply only one of |%s= and |%s="):format(edition_fullname, edition_plain_fullname)) end if edition then add_with_sep("ấn bản " .. edition) end if edition_plain then add_with_sep(edition_plain) end -- Display a numeric param such as page=, volume=, column=. For each `paramname`, four params are actually -- recognized, e.g. for paramname == "page", the params page=, pages=, page_plain= and pageurl= are recognized -- and checked (or the same with an index, e.g. page2=, pages2=, page_plain2= and pageurl2= respectively if -- ind == "2"). Only one of the first three can be specified; an error results if more than one are given. -- If none are given, the return value is nil; otherwise it is a string. The numeric spec is taken directly -- from e.g. page_plain= if given; otherwise if e.g. pages= is given, or if page= is given and looks like a -- combination of numbers (i.e. it has a hyphen or dash in it, a comma, or the word " and "), it is prefixed -- by `singular_desc` + "s" (e.g. "pages "), otherwise it is prefixed by just `singular_desc` (e.g. "page "). -- (As a special case, if either e.g. page=unnumbered or pages=unnumbered is given, the numeric spec is -- "unnumbered page".) The resulting spec is returned directly unless e.g. pageurl= is given, in which case -- it is linked to the specified URL. Note that any of the specs can be foreign text, e.g. foreign numbers -- (including with optional inline modifiers), and such text is handled appropriately. local function format_numeric_param(paramname, singular_desc) local sgval = a_with_name(paramname) local sgobj = parse_annotated_text(sgval, paramname) local plparamname = paramname .. "s" local plval = a_with_name(plparamname) local plobj = parse_annotated_text(plval, plparamname) local plainval, plain_fullname = parse_and_format_annotated_text_with_name(paramname .. "_plain") local numspec if not sgval and not plval and not plainval then return elseif plainval and (sgval or plval) then error(("Can't specify " .. plain_fullname .. " with " .. paramname .. " or " .. plparamname)) elseif sgval and plval then -- if both singular and plural, display "page 1 of 1-10" numspec = singular_desc .. " " .. sgval .. " of " .. plval else -- Merge page= and pages= and treat alike because people often mix them up in both directions. if plainval then numspec = plainval else local val = sgobj and sgobj.text or plobj.text if val == "unnumbered" then numspec = "unnumbered " .. singular_desc else local desc if val:find("^!") then val = val:gsub("^!", "") desc = sgval and singular_desc or pluralize(singular_desc) else local check_val = val if check_val:find("%[") then check_val = remove_links(check_val) -- convert URL's of the form [URL DISPLAY] to the displayed value check_val = check_val:gsub("%[[^ %[%]]* ([^%[%]]*)%]", "%1") end -- in case of negative page numbers (do they exist?), don't treat as multiple pages check_val = check_val:gsub("^%-", "") -- replace HTML entity en-dashes and em-dashes with their literal codes check_val = check_val:gsub("&ndash;", "–") check_val = check_val:gsub("&#8211;", "–") check_val = check_val:gsub("&mdash;", "—") check_val = check_val:gsub("&#8212;", "—") -- Check for en-dash or em-dash, or two numbers (possibly with stuff after like 12a-15b) -- separated by a hyphen or by comma a followed by a space (to avoid firing on thousands separators). if umatch(check_val, "[–—]") or check_val:find(" and ") or check_val:match("%d+[^ ]* *%- *%d+") or check_val:match("%d+[^ ]* *, +%d+") then desc = singular_desc else desc = singular_desc end end local obj = sgobj or plobj obj.text = val if obj.link:find("^!") then obj.link = obj.link:gsub("^!", "") end val = format_annotated_text(obj) numspec = desc .. " " .. val end end end local url = a(paramname .. "url") if url then return "[" .. url .. " " .. numspec .. "]" else return numspec end end local volume = format_numeric_param("volume", a("volume_prefix") or "tập") if volume then add_with_sep(volume) end local issue = format_numeric_param("issue", a("issue_prefix") or "số") if issue then add_with_sep(issue) end -- number= is an alias for issue= (except in {{quote-av}}, where it is the episode number) local number = format_numeric_param("number", a("number_prefix") or "số") if number then add_with_sep(number) end local annotations = {} local genre = a("genre") if genre then insert(annotations, genre) end local format = a("format") if format then insert(annotations, format) end local medium = a("medium") if medium then insert(annotations, medium) end -- Now handle the display of language annotations like "(in French)" or -- "(quotation in Nauruan; overall work in German)". local quotelang = args[1] or args.lang if not quotelang then if ind == "" then -- This can only happen for certain non-mainspace pages, e.g. Talk pages; otherwise an error is thrown -- above. insert(annotations, maintenance_line("Please specify the language of the quote using |1=")) else -- do nothing in newversion= portion end elseif ind == "" then local worklang = a("worklang") local termlang = a("termlang") worklang = worklang or quotelang termlang = termlang or quotelang if worklang == quotelang then if worklang == termlang then -- do nothing else insert(annotations, "bằng " .. format_langs(quotelang)) end else if quotelang ~= termlang then insert(annotations, "quotation in " .. format_langs(quotelang)) end insert(annotations, "toàn bộ nội dung viết bằng " .. format_langs(worklang)) end else local lang2 = a("lang2") if lang2 then insert(annotations, "bằng " .. format_langs(lang2)) end end if #annotations > 0 then sep = nil add_with_sep(" (" .. concat(annotations, SEMICOLON_SPACE) .. ")") end local artist = parse_and_format_multivalued_annotated_text("artist", "và") if artist then add_with_sep(artist .. " biểu diễn") end local feat = parse_and_format_multivalued_annotated_text("feat", "và") if feat then sep = " " add_with_sep("ft. " .. feat) end if not format_as_cite then add_actor_role() end local others = parse_and_format_annotated_text("others") if others then add_with_sep(others) end local quoted_in = parse_and_format_annotated_text("quoted_in", tag_with_cite, tag_with_cite) if quoted_in then add_with_sep("dẫn trong " .. quoted_in) insert(tracking_categories, "Quotations using quoted-in parameter") end local location = parse_and_format_multivalued_annotated_text("location", "; ") local publisher = parse_and_format_multivalued_annotated_text("publisher", "; ") if publisher then if location then add_with_sep(location) -- colon sep = "&#58; " -- colon end add_with_sep(publisher) elseif location then add_with_sep(location) end if not date_outputted then add_date("no_paren") end local source = parse_and_format_multivalued_annotated_text("source", "và") if source then add_with_sep("sourced from " .. source) end local original = parse_and_format_annotated_text("original", tag_with_cite, tag_with_cite) local by = parse_and_format_multivalued_annotated_text("by", "và") local origtype = a("deriv") or "bản dịch" if original or by then add_with_sep(origtype .. " cho " .. (original or "bản gốc") .. (by and " của " .. by or "")) end -- Handle origlang=, origworklang=. How we handle them depends on whether the original title or author are explicitly -- given. local origlang = a("origlang") local origworklang = a("origworklang") local origlangtext, origworklangtext if origlang then origlangtext = "từ " .. format_langs(origlang) end if origworklang then origworklangtext = "toàn bộ nội dung viết bằng " .. format_langs(origworklang) end if origlang or origworklang then if original or by then local orig_annotations = {} if origlangtext then insert(orig_annotations, origlangtext) end if origworklangtext then insert(orig_annotations, origworklangtext) end sep = nil add_with_sep(" (" .. concat(orig_annotations, SEMICOLON_SPACE) .. ")") else add_with_sep(origtype .. " có nguồn gốc" .. (origlangtext and " " .. origlangtext or "")) if origworklangtext then sep = nil add_with_sep(" (" .. origworklangtext .. ")") end end end if ind ~= "" and has_newversion() then local formatted_new_date = format_date_args(a, get_full_paramname, alias_map, "", "", nil, "Please provide a date or year", true) if formatted_new_date then add_with_sep(formatted_new_date) end end -- Fetch date_published=/year_published=/month_published= and format appropriately. local formatted_date_published = format_date_args(a, get_full_paramname, alias_map, "", "_published", nil, nil, true) local platform = parse_and_format_multivalued_annotated_text("platform", "và") if formatted_date_published then add_with_sep("xuất bản " .. formatted_date_published .. (platform and " via " .. platform or "")) elseif platform then add_with_sep("via " .. platform) end -- From here on out, there should always be a preceding item, so we -- can dispense with add_with_sep() and always insert the comma. sep = nil local function small(txt) add(", <small>") add(txt) add("</small>") end -- Add an identifier to a book or article database such as DOI, ISBN, JSTOR, etc. `param_or_params` -- is a string identifying the base param, or a list of such strings to check in turn. If found, the value -- of the parameter is processed using `process` (a function of one argument, defaulting to mw.uri.encode()), -- and then the actual URL to insert is generated by preceding with `pretext`, following with `posttext`, -- and running the resulting string through small(), which first adds a comma and then the URL in small font. local function add_identifier(param_or_params, pretext, posttext, process) local val = a(param_or_params) if val then val = (process or mw.uri.encode)(val) small(pretext .. val .. posttext) end end add_identifier("bibcode", "[https://adsabs.harvard.edu/abs/", " →Bibcode]") add_identifier("doi", '<span class="neverexpand">[https://doi.org/', " →DOI]</span>") add_identifier("isbn", "", "", isbn) add_identifier("issn", "", "", issn) add_identifier("jstor", "[https://www.jstor.org/stable/", " →JSTOR]") add_identifier("lccn", "", "", lccn) add_identifier("oclc", "[https://search.worldcat.org/title/", " →OCLC]") add_identifier("ol", "[https://openlibrary.org/works/OL", "/ →OL]") add_identifier("pmid", "[https://www.ncbi.nlm.nih.gov/pubmed/", " →PMID]") add_identifier("pmcid", "[https://www.ncbi.nlm.nih.gov/pmc/articles/", "/ →PMCID]") add_identifier("ssrn", "[https://ssrn.com/abstract=", " →SSRN]") -- add_identifier("urn", "", "", urn) local id = a("id") if id then small(id) end archiveurl, archiveurl_fullname = aurl_with_name("archiveurl") if archiveurl then add(", [" .. url .. " bản gốc]") local url, url_fullname = aurl_with_name("url") if not url then -- attempt to infer original URL from archive URL; this works at -- least for Wayback Machine (web.archive.org) URL's url = archiveurl:match("/(https?:.*)$") if not url then error( ("When |%s= is specified, |%s= must also be included"):format(archiveurl_fullname, url_fullname) ) end end add(" lưu trữ ") local archivedate, archivedate_fullname = a_with_name("archivedate") if archivedate then add(format_date(archivedate)) elseif string.sub(archiveurl, 1, 28) == "https://web.archive.org/web/" then -- If the archive is from the Wayback Machine, then it already contains the date -- Get the date and format it local wayback_date = string.sub(archiveurl, 29, 29 + 7) wayback_date = string.sub(wayback_date, 1, 4) .. "-" .. string.sub(wayback_date, 5, 6) .. "-" .. string.sub(wayback_date, 7, 8) add(format_date(wayback_date)) else error( ("When |%s= is specified, |%s= must also be included"):format( archiveurl_fullname, archivedate_fullname ) ) end end if a("accessdate") then --Otherwise do not display here, as already used as a fallback for missing date= or year= earlier. if (a("date") or a("nodate") or a("year")) and not a("archivedate") then add(", truy cập " .. format_date(a("accessdate"))) end end local formatted_section = format_chapterlike("section", "mục ") if formatted_section then add(", ") add(formatted_section) end -- video game stuff local system = parse_and_format_annotated_text("system") if system then add(", " .. system) end local scene = parse_and_format_annotated_text("scene") if scene then add(", scene: " .. scene) end local level = parse_and_format_annotated_text("level") if level then add(", level/area: " .. level) end local note = parse_and_format_annotated_text("note") if note then add(", " .. note) end local note_plain = parse_and_format_annotated_text("note_plain") if note_plain then add(" " .. note_plain) end -- Wrapper around format_numeric_param that inserts the formatted text with optional preceding text. local function handle_numeric_param(paramname, singular_desc, pretext) local numspec = format_numeric_param(paramname, singular_desc) if numspec then add((pretext or "") .. numspec) end end handle_numeric_param("page", a("page_prefix") or "tr.", ", ") handle_numeric_param("column", a("column_prefix") or "cột", ", ") handle_numeric_param("line", a("line_prefix") or "dòng", ", ") -- FIXME: Does this make sense? What is other=? local other = parse_and_format_annotated_text("other") if other then add(", " .. other) end end local function add_authors(args, last_first) -- Find maximum indexed author or last name. local maxind = math.max(args.author.maxindex, args.last.maxindex) -- Include max index of ancillary params so we get an error message about their use without the primary params. local ancillary_params = {"trans-author", "authorlink", "trans-authorlink", "first", "trans-first", "trans-last"} for _, ancillary in ipairs(ancillary_params) do maxind = math.max(maxind, args[ancillary].maxindex) end local num_authors = 0 for i = 1, maxind do local ind = i == 1 and "" or i local author, last = args.author[i], args.last[i] if author or last then local this_num_authors = add_author( author, "author" .. ind, args["trans-author"][i], "trans-author" .. ind, args.authorlink[i], "authorlink" .. ind, args["trans-authorlink"][i], "trans-authorlink" .. ind, args.first[i], "first" .. ind, args["trans-first"][i], "trans-first" .. ind, last, "last" .. ind, args["trans-last"][i], "trans-last" .. ind, last_first ) num_authors = num_authors + this_num_authors sep = last_first and "; " or ", " else for _, cant_have in ipairs(ancillary_params) do if args[cant_have][i] then error(("Can't have |%s%s= without |author%s= or |last%s="):format(cant_have, ind, ind, ind)) end end end end return num_authors end local function add_newversion() -- If there's a "newversion" section, add the new-version text. if has_newversion() then sep = nil --Test for new version of work. add(SEMICOLON_SPACE) if args.newversion then -- newversion= is intended for English text, e.g. "quoted in" or "republished as". add(args.newversion) elseif not args.edition2 then if has_new_title_or_author() then add("tái bản: ") else add("republished") end end add(" ") return "" else return ", " end end ------------------- Now we start outputting text ---------------------- local need_comma = false -- Set this now so a() works just below. get_full_paramname = make_get_full_paramname("") if args.brackets then add("[") end bold_year = not format_as_cite year_last = format_as_cite formatted_date, need_date = format_date_args( a, get_full_paramname, alias_map, nil, nil, bold_year, "Can we [[:Category:Requests for date|date]] this quote?", year_last ) -- Fetch origdate=/origyear=/origmonth= and format appropriately. formatted_origdate = format_date_args(a, get_full_paramname, alias_map, "orig", nil, nil, nil, year_last) local num_authors, need_date if format_as_cite then num_authors = add_authors(args, "last_first") if author_outputted then sep = " " end -- Display all the text that comes after the author, for the main portion. postauthor("", num_authors, "format_as_cite") author_outputted = false sep = add_newversion() -- Add the newversion author(s). if args["2ndauthor"] or args["2ndlast"] then num_authors = add_author( args["2ndauthor"], "2ndauthor", nil, nil, args["2ndauthorlink"], "2ndauthorlink", nil, nil, args["2ndfirst"], "2ndfirst", nil, nil, args["2ndlast"], "2ndlast", nil, nil, "last_first" ) sep = ", " else for _, cant_have in ipairs{"2ndauthorlink", "2ndfirst"} do if args[cant_have] then error(("Can't have |%s= without |2ndauthor= or |2ndlast="):format(cant_have)) end end end -- Display all the text that comes after the author, for the "newversion" section. postauthor(2, num_authors, "format_as_cite") else if formatted_date then need_comma = true add(formatted_date) end if formatted_origdate then need_comma = true add(SPACE_LBRAC .. formatted_origdate .. RBRAC) end if need_comma then sep = ", " end date_outputted = true num_authors = add_authors(args) -- Display all the text that comes after the author, for the main portion. postauthor("", num_authors) author_outputted = false sep = add_newversion() -- Add the newversion author(s). if args["2ndauthor"] or args["2ndlast"] then num_authors = add_author( args["2ndauthor"], "2ndauthor", nil, nil, args["2ndauthorlink"], "2ndauthorlink", nil, nil, args["2ndfirst"], "2ndfirst", nil, nil, args["2ndlast"], "2ndlast", nil, nil ) sep = ", " else for _, cant_have in ipairs{"2ndauthorlink", "2ndfirst"} do if args[cant_have] then error(("Can't have |%s= without |2ndauthor= or |2ndlast="):format(cant_have)) end end end -- Display all the text that comes after the author, for the "newversion" section. postauthor(2, num_authors) end if not args.nocolon then sep = nil add(":") elseif args.usenodot and not args.nodot then add(".") end -- Concatenate output portions to form output text. local output_text = concat(output) -- Remainder of code handles adding categories. We add one or more of the following categories: -- -- 1. [[Category:LANG terms with quotations]], based on the first language code in termlang= or 1=. Added to -- mainspace, Reconstruction: and Appendix: pages as well as Citations: pages if the corresponding mainspace -- page exists. Not added if nocat= is given. Note that [[Module:usex]] adds the same category using the same -- logic, but we do it here too because we may not have a quotation to format. (We add in those circumstances -- because typically when there's no quotation to format, it's because it's formatted manually underneath the -- citation, or using {{ja-x}}, {{th-x}} or similar.) -- 2. [[Category:Requests for date in LANG entries]], based on the first language code in 1=. Added to mainspace, -- Reconstruction:, Appendix: and Citations: pages unless nocat= is given. -- 3. [[Category:Quotations using nocat parameter]], if nocat= is given. Added to mainspace, Reconstruction:, -- Appendix: and Citations: pages. local categories = {} local termlang = get_first_lang(args.termlang or argslang) if args.nocat then if format_as_cite then insert(tracking_categories, "Citations using nocat parameter") else insert(tracking_categories, "Quotations using nocat parameter") end else -- don't create language tracking categories for citations if not format_as_cite then local title if args.pagename then -- for testing, doc pages, etc. title = mw.title.new(args.pagename) if not title then error(("Bad value for `args.pagename`: '%s'"):format(args.pagename)) end else title = mw.title.getCurrentTitle() end -- Only add [[Citations:foo]] to [[:Category:LANG terms with quotations]] if [[foo]] exists. local ok_to_add_cat if title.nsText ~= "Citations" then ok_to_add_cat = true else local mainspace_title = mw.title.new(title.text) if mainspace_title and mainspace_title.exists then ok_to_add_cat = true end end if ok_to_add_cat then insert(categories, termlang:getFullName() .. " terms with quotations") end end if need_date then local argslangobj = get_first_lang(argslang) insert(categories, "Requests for date in " .. argslangobj:getCanonicalName() .. " entries") end end return output_text .. ( not lang and "" or (#categories > 0 and format_categories(categories, lang, args.sort) or "") .. ( #tracking_categories > 0 and format_categories( tracking_categories, lang, args.sort, nil, not page_should_be_ignored(mw.title.getCurrentTitle().fullText) ) or "" ) ) end -- Alias specs for type= and type2=. Each spec is `{canon, aliases, with_newversion}` where `canon` is the canonical -- parameter (with "2" added if type2= is being handled), `aliases` is a comma-separated string of aliases (with "2" -- added if type2= is being handled, except for numeric params), and `with_newversion` indicates whether we should -- process this spec if type2= is being handled. local type_alias_specs = { av = { {"author", "writer,writers", true}, {"chapter", "episode", true}, {"chapterurl", "episodeurl", true}, {"trans-chapter", "trans-episode", true}, {"chapter_tlr", "episode_tlr,episode_tlrs,episode_translator,episode_translators", true}, {"chapter_series", "episode_series", true}, {"chapter_seriesvolume", "episode_seriesvolume", true}, {"chapter_number", "episode_number", true}, {"chapter_plain", "episode_plain", true}, {"volume", "season", true}, {"volumes", "seasons", true}, {"volume_plain", "season_plain", true}, {"volumeurl", "seasonurl", true}, {"platform", "network", true}, }, book = { {"author", "3"}, {"title", "4"}, {"url", "5"}, {"year", "2"}, {"page", "6"}, {"text", "7"}, {"t", "8"}, }, journal = { {"year", "2"}, {"author", "3"}, {"chapter", "title,article,4", true}, {"chapterurl", "titleurl,articleurl", true}, {"trans-chapter", "trans-title,trans-article", true}, {"chapter_tlr", "title_tlr,title_tlrs,title_translator,title_translators,article_tlr,article_tlrs,article_translator,article_translators", true}, {"chapter_series", "title_series,article_series", true}, {"chapter_seriesvolume", "title_seriesvolume,article_seriesvolume", true}, {"chapter_number", "title_number,article_number", true}, {"chapter_plain", "title_plain,article_plain", true}, {"title", "journal,magazine,newspaper,work,5", true}, {"trans-title", "trans-journal,trans-magazine,trans-newspaper,trans-work", true}, {"tlr", "journal_tlr,journal_tlrs,journal_translator,journal_translators,magazine_tlr,magazine_tlrs,magazine_translator,magazine_translators,newspaper_tlr,newspaper_tlrs,newspaper_translator,newspaper_translators,work_tlr,work_tlrs,work_translator,work_translators", true}, {"url", "6,journalurl,magazineurl,newspaperurl,workurl", true}, {"page", "7"}, {"source", "newsagency,news_agency", true}, {"text", "8"}, {"t", "9"}, }, } -- Process interally-handled aliases related to type= or type2=. `args` is a table of arguments; `typ` is the value of -- type= or type2=; newversion=true if we're dealing with type2=; alias_map is used to keep track of alias mappings -- seen. local function process_type_aliases(args, typ, newversion, alias_map) local ind = newversion and "2" or "" local deprecated = ine(args.lang) if not type_alias_specs[typ] then local possible_values = {} for possible, _ in pairs(type_alias_specs) do insert(possible_values, possible) end sort(possible_values) error( ("Unrecognized value '%s' for type%s=; possible values are %s"):format( typ, ind, concat(possible_values, ",") ) ) end for _, alias_spec in ipairs(type_alias_specs[typ]) do local canon, aliases, with_newversion = unpack(alias_spec) if with_newversion or not newversion then canon = canon .. ind aliases = split(aliases, ",", true) local saw_alias = nil for _, alias in ipairs(aliases) do if alias:match("^%d+$") then alias = tonumber(alias) if deprecated then alias = alias - 1 end else alias = alias .. ind end if args[alias] then if saw_alias == nil then saw_alias = alias else error(("|%s= and |%s= are aliases; cannot specify a value for both"):format(saw_alias, alias)) end end end if saw_alias and (not newversion or type(saw_alias) == "string") then if args[canon] then error(("|%s= is an alias of |%s=; cannot specify a value for both"):format(saw_alias, canon)) end args[canon] = args[saw_alias] -- Wipe out the original after copying. This is important in case of a param that has general significance -- but has been redefined (e.g. {{quote-av}} redefines number= for the episode number, and -- {{quote-journal}} redefines title= for the chapter= (article). It's also important due to unhandled -- parameter checking. args[saw_alias] = nil alias_map[canon] = saw_alias end end end end -- Clone and combine frame's and parent's args while also assigning nil to empty strings. Handle aliases and ignores. local function clone_args(direct_args, parent_args) local args = {} -- Processing parent args must come first so that direct args override parent args. Note that if a direct arg is -- specified but is blank, it will still override the parent arg (with nil). for pname, param in pairs(parent_args) do -- [[Special:WhatLinksHere/Wiktionary:Tracking/quote/param/PARAM]] track("param/" .. pname) args[pname] = ine(param) end -- Process ignores. The value of `ignore` is a comma-separated list of parameter names to ignore (erase). We need to -- do this before aliases due to {{quote-song}}, which sets chapter= to the value of title= in the direct params and -- sets title= to the value of album= using an alias. If we do the ignores after aliases, we get an error during alias -- processing, saying that title= and its alias album= are both present. local ignores = ine(direct_args.ignore) if ignores then for ignore in gsplit(ignores, "%s*,%s*") do args[ignore] = nil end end local alias_map = {} local other_controls = {} -- noroman local noroman = ine(direct_args.noroman) if noroman then other_controls.overrides = other_controls.overrides or {} for param in gsplit(noroman, "%s*,%s*") do other_controls.overrides[param] = (other_controls.overrides[param] or {}) other_controls.overrides[param].noroman = true end end -- Process internally-specified aliases using type= or type2=. local typ = args.type or direct_args.type if typ then process_type_aliases(args, typ, false, alias_map) end local typ2 = args.type2 or direct_args.type2 if typ2 then process_type_aliases(args, typ2, true, alias_map) end -- Process externally-specified aliases. The value of `alias` is a list of semicolon-separated specs, each of which -- is of the form DEST:SOURCE,SOURCE,... where DEST is the canonical name of a parameter and SOURCE refers to an -- alias. Whitespace is allowed between all delimiters. The order of aliases may be important. For example, for -- {{quote-journal}}, title= contains the article name and is an alias of underlying chapter=, while journal= or -- work= contains the journal name and is an alias of underlying title=. As a result, the title -> chapter alias -- must be specified before the journal/work -> title alias. -- -- Whenever we copy a value from argument SOURCE to argument DEST, we record an entry for the pair in alias_map, so -- that when we would display an error message about DEST, we display SOURCE instead. -- -- Do alias processing (and ignore and error_if processing) before processing direct_args so that e.g. we can set up -- an alias of title -> chapter and then set title= to something else in the direct args ({{quote-hansard}} does -- this). -- -- FIXME: Delete this once we've converted all alias processing to internal. local aliases = ine(direct_args.alias) if aliases then -- Allow and discard a trailing semicolon, to make managing multiple aliases easier. aliases = ugsub(aliases, "%s*;$", "") for alias_spec in gsplit(aliases, "%s*;%s*") do local alias_spec_parts = split(alias_spec, "%s*:%s*") if #alias_spec_parts ~= 2 then error(("Alias spec '%s' should have one colon in it"):format(alias_spec)) end local dest, sources = unpack(alias_spec_parts) sources = split(sources, "%s*,%s*") local saw_source = nil for _, source in ipairs(sources) do if source:match("^%d+$") then source = tonumber(source) end if args[source] then if saw_source == nil then saw_source = source else error(("|%s= and |%s= are aliases; cannot specify a value for both"):format(saw_source, source)) end end end if saw_source then if args[dest] then error(("|%s= is an alias of |%s=; cannot specify a value for both"):format(saw_source, dest)) end args[dest] = args[saw_source] -- Wipe out the original after copying. This important in case of a param that has general significance -- but has been redefined (e.g. {{quote-av}} redefines number= for the episode number, and -- {{quote-journal}} redefines title= for the chapter= (article). It's also important due to unhandled -- parameter checking. args[saw_source] = nil alias_map[dest] = saw_source end end end -- Process error_if. The value of `error_if` is a comma-separated list of parameter names to throw an error if seen -- in parent_args (they are params we overwrite in the direct args). local error_ifs = ine(direct_args.error_if) if error_ifs then for error_if in gsplit(error_ifs, "%s*,%s*") do if ine(parent_args[error_if]) then error( ("Cannot specify a value |%s=%s as it would be overwritten or ignored"):format( error_if, ine(parent_args[error_if]) ) ) end end end for pname, param in pairs(direct_args) do -- ignore control params if pname ~= "ignore" and pname ~= "alias" and pname ~= "error_if" and pname ~= "noroman" then args[pname] = ine(param) end end return args, alias_map, other_controls end local function get_args(frame_args, parent_args, require_lang) -- FIXME: We are processing arguments twice, once in clone_args() and then again in [[Module:parameters]]. This is -- wasteful of memory. local cloned_args, alias_map, other_controls = clone_args(frame_args, parent_args) local deprecated = ine(parent_args.lang) local alias_of_t = {alias_of = "t"} local boolean = {type = "boolean"} local language_sublist = {type = "language", sublist = true} local list_allow_holes = {list = true, allow_holes = true} local script = {type = "script"} -- First, the "single" params that don't have FOO2 or FOOn versions. local params = { [deprecated and "lang" or 1] = {required = require_lang, type = "language", sublist = true, default = "und"}, ["lang2"] = language_sublist, ["newversion"] = true, ["author"] = list_allow_holes, ["2ndauthor"] = true, ["trans-author"] = list_allow_holes, ["authorlink"] = list_allow_holes, ["2ndauthorlink"] = true, ["trans-authorlink"] = list_allow_holes, ["first"] = list_allow_holes, ["2ndfirst"] = true, ["trans-first"] = list_allow_holes, ["last"] = list_allow_holes, ["2ndlast"] = true, ["trans-last"] = list_allow_holes, ["nocat"] = boolean, ["nocolon"] = boolean, -- quote params text = true, passage = {alias_of = "text"}, tr = true, transliteration = {alias_of = "tr"}, ts = true, transcription = {alias_of = "ts"}, norm = true, normalization = {alias_of = "norm"}, sc = script, normsc = script, sort = true, subst = true, footer = true, lit = true, t = true, translation = alias_of_t, gloss = alias_of_t, lb = true, brackets = boolean, -- original quote params origtext = true, origtr = true, origts = true, orignorm = true, origsc = script, orignormsc = script, origsubst = true, origlb = true, usenodot = boolean, nodot = boolean, inline = boolean, asquote = boolean, ascite = boolean, } -- Most params have PARAM2 variants for use with `newversion`. FIXME: We should generalize this to -- allow PARAMN variants for any N. local function add_with_2(param, value) params[param] = value params[param .. "2"] = value end local function alias_with_2(alias, canon) params[alias] = {alias_of = canon} params[alias .. "2"] = {alias_of = canon .. "2"} end for _, param12 in ipairs{ "worklang", "termlang", "origlang", "origworklang" } do add_with_2(param12, language_sublist) end -- Then the newversion params (which have FOO2 versions). for _, param12 in ipairs{ -- author-like params; author params themselves are either list params (author=, last=, etc.) or single params -- (2ndauthor=, 2ndlast=, etc.) "coauthors", "quotee", "tlr", "editor", "editors", "mainauthor", "compiler", "compilers", "director", "directors", "lyricist", "lyrics-translator", "composer", "role", "actor", "artist", "feat", -- author control params "default-authorlabel", "authorlabel", -- title "title", "trans-title", "series", "seriesvolume", "notitle", -- entry "entry", "entryurl", "trans-entry", -- chapter "chapter", "chapterurl", "chapter_number", "chapter_plain", "chapter_series", "chapter_seriesvolume", "trans-chapter", "chapter_tlr", -- section "section", "sectionurl", "section_number", "section_plain", "section_series", "section_seriesvolume", "trans-section", -- other video-game params "system", "scene", "level", -- URL "url", "urls", "archiveurl", -- edition "edition", "edition_plain", -- ID params "bibcode", "doi", "isbn", "issn", "jstor", "lccn", "oclc", "ol", "pmid", "pmcid", "ssrn", "urn", "id", -- misc date params; most date params handled below "archivedate", "accessdate", "nodate", -- numeric params handled below -- other params "type", "genre", "format", "medium", "others", "quoted_in", "location", "publisher", "original", "by", "deriv", "note", "note_plain", "other", "source", "platform", } do add_with_2(param12, true) end -- Then the aliases of newversion params (which have FOO2 versions). for _, param12_aliased in ipairs{ {"role", "roles"}, {"role", "speaker"}, {"tlr", "tlrs"}, {"tlr", "translator"}, {"tlr", "translators"}, {"chapter_tlr", "chapter_tlrs"}, {"chapter_tlr", "chapter_translator"}, {"chapter_tlr", "chapter_translators"}, {"doi", "DOI"}, {"isbn", "ISBN"}, {"issn", "ISSN"}, {"jstor", "JSTOR"}, {"lccn", "LCCN"}, {"oclc", "OCLC"}, {"ol", "OL"}, {"pmid", "PMID"}, {"pmcid", "PMCID"}, {"ssrn", "SSRN"}, {"urn", "URN"}, } do local canon, alias = unpack(param12_aliased) alias_with_2(alias, canon) end -- Then the date params. for _, datelike in ipairs{{"", ""}, {"orig", ""}, {"", "_published"}} do local pref, suf = unpack(datelike) for _, arg in ipairs{"date", "year", "month", "start_date", "start_year", "start_month"} do add_with_2(pref .. arg .. suf, true) end end local numeric_param_suffixes = {"", "s", "_plain", "url", "_prefix"} -- Then the numeric params. for _, numeric in ipairs{"volume", "issue", "number", "line", "page", "column"} do for _, suf in ipairs(numeric_param_suffixes) do add_with_2(numeric .. suf, true) end end -- And the aliases of numeric params. for _, numeric_aliased in ipairs{{"volume", "vol"}} do local canon, alias = unpack(numeric_aliased) for _, suf in ipairs(numeric_param_suffixes) do alias_with_2(alias .. suf, canon .. suf) end end return process_params(cloned_args, params), alias_map, other_controls end local function get_origtext_params(args) local origtext, origtextlang, origsc, orignormsc if args.origtext then -- Wiktionary language codes have at least two lowercase letters followed possibly by lowercase letters and/or -- hyphens (there are more restrictions but this is close enough). Also check for nonstandard Latin etymology -- language codes (e.g. VL. or LL.). (There used to be more nonstandard codes but they have all been -- eliminated.) origtextlang, origtext = args.origtext:match("^(%l%l[%l-]*):([^ ].*)$") if not origtextlang then -- Special hack for Latin variants, which can have nonstandard etym codes, e.g. VL., LL. origtextlang, origtext = args.origtext:match("^(%uL%.):([^ ].*)$") end if not origtextlang then error("origtext= should begin with a language code prefix") end origtextlang = get_lang(origtextlang, nil, "allow etym") or error("origtext= should begin with a language code prefix") origsc = args.origsc orignormsc = args.orignormsc else for _, noparam in ipairs{"origtr", "origts", "origsc", "orignorm", "orignormsc", "origsubst", "origlb"} do if args[noparam] then error(("Cannot specify %s= without origtext="):format(noparam)) end end end return origtext, origtextlang, origsc, orignormsc end local function get_quote(args, is_cite) local text = args.text local gloss = args.t local tr = args.tr local ts = args.ts local norm = args.norm local sc = args.sc local normsc = args.normsc -- Fetch original-text parameters. local origtext, origtextlang, origsc, orignormsc = get_origtext_params(args) -- If any quote-related args are present, display the actual quote; otherwise, display nothing. if text or gloss or tr or ts or norm or args.origtext then -- Pass "und" here rather than cause an error; there will be an error on mainspace, Citations, etc. pages -- in any case in source() if the language is omitted. local lang = get_first_lang(args[1] or args.lang) local termlang = args.termlang and get_first_lang(args.termlang) or lang local usex_data = { lang = lang, termlang = termlang, usex = text, sc = sc, translation = gloss, normalization = norm, normsc = normsc, transliteration = tr, transcription = ts, brackets = args.brackets, subst = args.subst, lit = args.lit, footer = args.footer, qq = parse_and_format_labels(args.lb, lang), quote = "quote-meta", orig = origtext, origlang = origtextlang, origsc = origsc, orignorm = args.orignorm, orignormsc = orignormsc, origtr = args.origtr, origts = args.origts, origsubst = args.origsubst, origqq = parse_and_format_labels(args.origlb, lang), noreq = args.noreq, nocat = is_cite or args.nocat, } if args.inline then -- don't let usex format the footer, otherwise it gets inlined with the rest of the quoted text usex_data.footer = nil usex_data.inline = 1 text = format_usex(usex_data) if text then text = " “" .. text .. "”" else text = "" end if args.footer then text = text .. "<dl><dd>" .. args.footer .. "</dd></dl>" end else text = "<dl><dd>" .. format_usex(usex_data) .. "</dd></dl>" end elseif args.footer then text = "<dl><dd>" .. args.footer .. "</dd></dl>" end return text end -- External interface, meant to be called from a template. Replaces {{quote-meta}} and meant to be the primary -- interface for {{quote-*}} templates. function export.quote_t(frame) local args, alias_map, other_controls = get_args(frame.args, frame:getParent().args, "require_lang") if args.ascite then return export.cite_t(frame) end return show_quote(args, alias_map, other_controls) end function show_quote(args, alias_map, other_controls) local parts = {} insert(parts, '<div class="citation-whole"><span class="cited-source">') insert(parts, export.source(args, alias_map, nil, other_controls)) insert(parts, "</span>") insert(parts, get_quote(args)) insert(parts, "</div>") local retval = concat(parts) return deprecated and frame:expandTemplate({ title = "check deprecated lang param usage", args = {retval, lang = args.lang}, }) or retval end -- External interface, meant to be called from a template. Replaces {{cite-meta}} and meant to be the primary -- interface for {{cite-*}} templates. function export.cite_t(frame) local parent_args = {} for k, v in pairs(frame:getParent().args) do parent_args[k] = v end -- use "und" as lang if none provided if parent_args[1] == nil then parent_args[1] = "und" end local args, alias_map, other_controls = get_args(frame.args, parent_args) if args.asquote then return show_quote(args, alias_map, other_controls) end return show_cite(args, alias_map, other_controls) end function show_cite(args, alias_map, other_controls) local parts = {} -- don't nag for translations if args.text and not args.t then args.noreq = 1 end local len_visible = args.text and ulen((args.text:gsub("<[^<>]+>", ""))) or 0 if len_visible == 0 then if not args.t or args.t == "-" then args.nocolon = true end elseif args.inline == nil then args.inline = not ( args.block_text or len_visible > 300 or (args.t and not args.t == "-" and len_visible < 80) or string.match(args.text, "<br>") ) end insert(parts, '<span class="citation-whole"><span class="cited-source">') insert(parts, export.source(args, alias_map, "format_as_cite", other_controls)) insert(parts, "</span>") insert(parts, get_quote(args, "is_cite")) insert(parts, "</span>") local retval = concat(parts) return deprecated and frame:expandTemplate({ title = "check deprecated lang param usage", args = {retval, lang = args.lang}, }) or retval end -- External interface, meant to be called from a template. function export.call_quote_template(frame) return export.call_template(frame) end -- External interface, for calling a template with overloaded parameters. function export.overload(frame) local iargs, overloaded_args = process_params(frame.args, { [1] = {required = true} }, true) local parent_args = frame:getParent().args for k, v in pairs(parent_args) do overloaded_args[k] = v end return frame:expandTemplate{title = iargs[1], args = overloaded_args} end -- External interface, meant to be called from a template. function export.call_template(frame) local parameter_sublist = {type = "parameter", sublist = true} local iargs, other_direct_args = process_params(frame.args, { ["template"] = true, ["textparam"] = parameter_sublist, ["pageparam"] = parameter_sublist, ["propagateparams"] = parameter_sublist, ["allowparams"] = {sublist = true}, -- Doesn't use type = "parameter", because any that end in :list get processed differently. }, true) local function fetch_param(source, params) for _, param in ipairs(params) do if source[param] then return source[param] end end return nil end local params = { ["text"] = true, ["passage"] = true, ["footer"] = true, -- always propagates, but gets special formatting } -- paramaters that can be used during template declaration or included in template calls -- if the template is called with param=- it will set any declared value to nil local always_propagate = { ["brackets"] = true, ["usenodot"] = true, ["nodot"] = true, ["ascite"] = true, ["asquote"] = true, } for k,v in pairs(always_propagate) do params[k] = v end local textparam = iargs.textparam or {} for _, param in ipairs(textparam) do params[param] = true end local pageparam = iargs.pageparam or {} local pageparam1 = pageparam[1] if pageparam1 ~= nil then params["page"], params["pages"] = true, true for _, param in ipairs(pageparam) do params[param] = true end end local allowparams, allow_all, list = iargs.allowparams, false if allowparams ~= nil then for _, allow in ipairs(allowparams) do local param = allow:match("^(.*):list$") if param then if list == nil then list = {list = true} end params[scribunto_parameter_key(param)] = list elseif allow == "*" then track("no parameter checking") allow_all = true else params[scribunto_parameter_key(allow)] = true end end else local parent = frame:getParent() local template_name = parent:getTitle() local template_title = new_title(template_name) local content = template_title:getContent() local allowed_params, seen = {}, {} -- Detect all params used by the parent template. param:get_name() takes the -- parent frame arg table as an argument so that preprocessing will take -- them into account, since it will matter if the name contains another -- parameter (e.g. the outer param in "{{{foo{{{bar}}}baz}}}" will change -- depending on the value for bar=). `seen` memoizes results based on the -- raw parameter text (which is stored as a string in the parameter object), -- which avoids unnecessary param:get_name() calls, which are non-trivial. for param in find_parameters(content) do local raw = param.raw if not seen[raw] then allow = param:get_name(template_args) params[scribunto_parameter_key(allow)] = true seen[raw] = true end end end local propagateparams = iargs.propagateparams or {} for _, param in ipairs(propagateparams) do params[param] = true end local parent_args = frame:getParent().args local args = process_params(parent_args, params, allow_all) parent_args = shallow_copy(parent_args) if textparam[1] ~= "-" then other_direct_args.passage = args.text or args.passage or fetch_param(args, textparam) end if not (pageparam1 == nil or pageparam1 == "-") then other_direct_args.page = fetch_param(args, pageparam) or args.page or other_direct_args.page or nil other_direct_args.pages = args.pages or other_direct_args.pages or nil if other_direct_args.page == "-" then other_direct_args.page = nil end if other_direct_args.pages == "-" then other_direct_args.pages = nil end end if args.footer then other_direct_args.footer = frame:expandTemplate{title = "small", args = {args.footer}} end for param, _ in pairs(always_propagate) do if args[param] == "-" then other_direct_args[param] = nil else other_direct_args[param] = args[param] or other_direct_args[param] or nil end end -- authorlink=- can be used to prevent copying of author= to authorlink= but we don't want to propagate this to -- the actual {{quote-*}} code. if other_direct_args.authorlink == "-" then other_direct_args.authorlink = nil end for _, param in ipairs(propagateparams) do if args[param] then other_direct_args[param] = args[param] end end return frame:expandTemplate{title = iargs.template or "quote-book", args = other_direct_args} end local paramdoc_param_replacements = { passage = { param_with_synonym = "<<synonym>>, {{para|text}}, or {{para|passage}}", param_no_synonym = "{{para|text}} or {{para|passage}}", text = [=[ * <<params>> – the passage to be quoted.]=], }, page = { param_with_synonym = "<<synonym>> or {{para|page}}, or {{para|pages}}", param_no_synonym = "{{para|page}} or {{para|pages}}", text = [=[ * <<params>> – '''mandatory in some cases''': the page number(s) quoted from. When quoting a range of pages, note the following: ** Separate the first and last pages of the range with an [[en dash]], like this: {{para|pages|10–11}}. ** You must also use {{para|pageref}} to indicate the page to be linked to (usually the page on which the Wiktionary entry appears). : This parameter must be specified to have the template link to the online version of the work.]=], }, page_with_roman_preface = { param_with_synonym = {"inherit", "page"}, param_no_synonym = {"inherit", "page"}, text = [=[ * <<params>> – '''mandatory in some cases''': the page number(s) quoted from. If quoting from the preface, specify the page number(s) in lowercase Roman numerals. When quoting a range of pages, note the following: ** Separate the first and last page number of the range with an [[en dash]], like this: {{para|pages|10–11}} or {{para|pages|iii–iv}}. ** You must also use {{para|pageref}} to indicate the page to be linked to (usually the page on which the Wiktionary entry appears). : This parameter must be specified to have the template link to the online version of the work.]=], }, chapter = { param_with_synonym = "<<synonym>> or {{para|chapter}}", param_no_synonym = "{{para|chapter}}", text = [=[ * <<params>> – the name of the chapter quoted from.]=], }, roman_chapter = { param_with_synonym = {"inherit", "chapter"}, param_no_synonym = {"inherit", "chapter"}, text = [=[ * <<params>> – the chapter number quoted from in uppercase Roman numerals.]=], }, arabic_chapter = { param_with_synonym = {"inherit", "chapter"}, param_no_synonym = {"inherit", "chapter"}, text = [=[ * <<params>> – the chapter number quoted from in Arabic numerals.]=], }, trailing_params = { text = [=[ * {{para|footer}} – a comment on the passage quoted. * {{para|brackets}} – use {{para|brackets|on}} to surround a quotation with [[bracket#Noun|brackets]]. This indicates that the quotation either contains a mere mention of a term (for example, “some people find the word '''''manoeuvre''''' hard to spell”) rather than an actual use of it (for example, “we need to '''manoeuvre''' carefully to avoid causing upset”), or does not provide an actual instance of a term but provides information about related terms.]=], }, } function export.paramdoc(frame) local parargs = frame:getParent().args local args = process_params(parargs, { [1] = true, }) local text = args[1] local function do_param_with_optional_synonym(param, text_to_sub, paramtext_synonym, paramtext_no_synonym) local function sub_param(synonym) local subbed_paramtext if synonym then subbed_paramtext = paramtext_synonym:gsub("<<synonym>>", "{{para|" .. replacement_escape(synonym) .. "}}") else subbed_paramtext = paramtext_no_synonym end return frame:preprocess((text_to_sub:gsub("<<params>>", replacement_escape(subbed_paramtext)))) end text = text:gsub("<<" .. pattern_escape(param) .. ">>", function() return sub_param() end) text = text:gsub("<<" .. pattern_escape(param) .. ":(.-)>>", sub_param) end local function fetch_text(param_to_replace, key) local spec = paramdoc_param_replacements[param_to_replace] local val = spec[key] if type(val) == "string" then return val end if type(val) == "table" and val[1] == "inherit" then return fetch_text(val[2], key) end error( "Internal error: Unrecognized value for param '" .. param_to_replace .. "', key '" .. key .. "': " .. mw.dumpObject(val) ) end for param_to_replace, spec in pairs(paramdoc_param_replacements) do if not spec.param_no_synonym then -- Text to substitute directly. text = text:gsub("<<" .. pattern_escape(param_to_replace) .. ">>", function() return frame:preprocess(fetch_text(param_to_replace, "text")) end) else do_param_with_optional_synonym( param_to_replace, fetch_text(param_to_replace, "text"), fetch_text(param_to_replace, "param_with_synonym"), fetch_text(param_to_replace, "param_no_synonym") ) end end -- Remove final newline so template code can add a newline after invocation text = text:gsub("\n$", "") return text end return export ctzpgsemqyldfl34yy43bc0e8s0a8g4 ភេនឃ្វីន 0 260167 2345058 2204139 2026-04-14T00:49:38Z Hiyuune 50834 /* Tiếng Khmer */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2345058 wikitext text/x-wiki =={{langname|km}}== ==={{ĐM|etym}}=== {{dercat|km|cy|la}} Từ {{borrowed|km|en|penguin}}. ==={{ĐM|pron}}=== {{km-IPA|ភេន-ឃ្វីន}} ==={{ĐM|noun}}=== {{km-noun}} # [[chim cánh cụt|Chim cánh cụt]]. {{C|km|Chim cánh cụt}} roir9e7cda4svx6r0fuh5nwwbe7moa8 ກະເລັກ 0 265392 2344922 2054775 2026-04-13T12:02:49Z Hiyuune 50834 2344922 wikitext text/x-wiki =={{langname|lo}}== ==={{section|pron}}=== {{lo-pron|ກະ-ເລັກ}} ==={{section|pr-noun}}=== {{lo-proper noun}} # {{place|lo|quốc gia|r/Đông Nam Âu|t1=Hy Lạp}} n6g9jim5ntts4vl9wm9ugwfxiqez2ys chim cánh cụt hoàng đế 0 266354 2345063 2058598 2026-04-14T00:54:12Z Hiyuune 50834 2345063 wikitext text/x-wiki =={{langname|vi}}== {{wp|cánh cụt hoàng đế}} [[Tập tin:Emperor penguins.jpg|nhỏ|Những con '''chim cánh cụt hoàng đế'''.]] ==={{section|pron}}=== {{vi-pron}} ==={{section|n}}=== {{vi-noun|head=[[chim cánh cụt]] [[hoàng đế]]}} # {{taxfmt|Aptenodytes forsteri|loài}}, loài [[chim cánh cụt]] lớn nhất, sống ở [[châu Nam Cực]]. #* '''2019''', Hà My, ''[https://tuoitre.vn/chim-canh-cut-hoang-de-cung-sap-bi-tuyet-chung-20190526181932577.htm Chim cánh cụt hoàng đế cũng sắp bị tuyệt chủng]'', Tuổi Trẻ Online: #*: Quần thể lớn thứ hai của '''chim cánh cụt hoàng đế''' đang dần biến mất khi đã ba năm liên tiếp không nuôi lớn được con chim cánh cụt con nào. ===={{section|trans}}==== {{trans-top|Loài chim cánh cụt lớn nhất}} * {{langname|en}}: {{t+|en|emperor penguin}} * {{langname|de}}: {{t+|de|Kaiserpinguin|m}} * {{langname|hu}}: {{t+|hu|császárpingvin}} * {{langname|fr}}: {{t+|fr|manchot empereur|m}} * {{langname|cs}}: {{t+|cs|tučňák císařský|m}} {{trans-bottom}} {{C|vi|Chim cánh cụt}} rc0qz5vazuzhqy9wy20crc7okkflqtr 2345064 2345063 2026-04-14T00:54:42Z Hiyuune 50834 /* {{section|trans}} */ 2345064 wikitext text/x-wiki =={{langname|vi}}== {{wp|cánh cụt hoàng đế}} [[Tập tin:Emperor penguins.jpg|nhỏ|Những con '''chim cánh cụt hoàng đế'''.]] ==={{section|pron}}=== {{vi-pron}} ==={{section|n}}=== {{vi-noun|head=[[chim cánh cụt]] [[hoàng đế]]}} # {{taxfmt|Aptenodytes forsteri|loài}}, loài [[chim cánh cụt]] lớn nhất, sống ở [[châu Nam Cực]]. #* '''2019''', Hà My, ''[https://tuoitre.vn/chim-canh-cut-hoang-de-cung-sap-bi-tuyet-chung-20190526181932577.htm Chim cánh cụt hoàng đế cũng sắp bị tuyệt chủng]'', Tuổi Trẻ Online: #*: Quần thể lớn thứ hai của '''chim cánh cụt hoàng đế''' đang dần biến mất khi đã ba năm liên tiếp không nuôi lớn được con chim cánh cụt con nào. ===={{section|trans}}==== {{trans-top|Loài chim cánh cụt lớn nhất}} * {{langname|en}}: {{t+|en|emperor penguin}} * {{langname|de}}: {{t+|de|Kaiserpinguin|m}} * {{langname|hu}}: {{t+|hu|császárpingvin}} * {{langname|fr}}: {{t+|fr|manchot empereur|m}} * {{langname|cs}}: {{t+|cs|tučňák císařský|m}} * {{langname|zh}}: *: {{langname|cmn}}: {{t+|cmn|皇帝企鵝}}, {{t+|cmn|帝企鵝}} {{trans-bottom}} {{C|vi|Chim cánh cụt}} dyzieptvzslr4tga7dqmvfbcfo94sur ca có 0 267100 2345046 2062429 2026-04-14T00:40:24Z Hiyuune 50834 2345046 wikitext text/x-wiki =={{langname|mtq}}== ==={{section|n}}=== {{mtq-noun}} # {{lb|mtq|Mường Bi}} [[gà rừng|Gà rừng]]. ==={{section|ref}}=== {{R:Nguyễn Văn Khang, Bùi Chỉ, Hoàng Văn Hành 2002}} {{C|mtq|Gà}} qqmidbg5k9p2wu3fw7mod0b1pd3aa1m ca chõi 0 267114 2345042 2062427 2026-04-14T00:37:46Z Hiyuune 50834 2345042 wikitext text/x-wiki =={{langname|mtq}}== ==={{section|n}}=== {{mtq-noun}} # {{lb|mtq|Mường Bi}} [[gà chọi|Gà chọi]]. ==={{section|ref}}=== * {{R:Nguyễn Văn Khang, Bùi Chỉ, Hoàng Văn Hành 2002}} {{C|mtq|Gà}} qdwb9e3me242jvd2dtgtfnz1qm6yq1k Thể loại:vi:Gia cầm 14 267287 2345084 2263728 2026-04-14T01:21:52Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Gia cầm/Tiếng Việt]] thành [[Thể loại:vi:Gia cầm]] 2263728 wikitext text/x-wiki Trang này liệt kê các mục từ tiếng Việt thuộc chủ đề [[gia cầm]]. [[Thể loại:Chim/Tiếng Việt]] [[Thể loại:Danh sách chủ đề thuộc nhóm liên quan/Tiếng Việt]] [[Thể loại:Gia cầm|V]] 1o7l9qv1pcgxap6cx0eogy0y08n6ne4 2345086 2345084 2026-04-14T01:22:18Z Hiyuune 50834 Thay cả nội dung bằng “{{auto cat}}” 2345086 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:vi:Vịt 14 267289 2345079 2238784 2026-04-14T01:19:14Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Vịt/Tiếng Việt]] thành [[Thể loại:vi:Vịt]] 2238784 wikitext text/x-wiki [[Thể loại:Họ Vịt/Tiếng Việt]] [[Thể loại:Gia cầm/Tiếng Việt]] [[Thể loại:Danh sách chủ đề thuộc nhóm tập hợp/Tiếng Việt]] [[Thể loại:Vịt|V]] 5aoxbfi5nhy0udrisv8j1nz0377cbi5 2345082 2345079 2026-04-14T01:20:39Z Hiyuune 50834 Thay cả nội dung bằng “{{auto cat}}” 2345082 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:vi:Ngỗng 14 267292 2345074 2238789 2026-04-14T01:15:25Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Ngỗng/Tiếng Việt]] thành [[Thể loại:vi:Ngỗng]] 2238789 wikitext text/x-wiki Trang này liệt kê các mục từ tiếng Việt thuộc chủ đề [[ngỗng]]. [[Thể loại:Gia cầm/Tiếng Việt]] [[Thể loại:Danh sách chủ đề thuộc nhóm tập hợp/Tiếng Việt]] [[Thể loại:Ngỗng|V]] jysxjvl9irh2ssxyao2297qoiryl1v5 2345077 2345074 2026-04-14T01:16:52Z Hiyuune 50834 Thay cả nội dung bằng “{{auto cat}}” 2345077 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:nl:Chó 14 267633 2345103 2063552 2026-04-14T03:02:30Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Chó/Tiếng Hà Lan]] thành [[Thể loại:nl:Chó]] 2063552 wikitext text/x-wiki Trang này liệt kê các mục từ tiếng Hà Lan thuộc chủ đề [[chó]]. [[Thể loại:Mục từ tiếng Hà Lan theo chủ đề]] [[Thể loại:Chó|H]] dkw2mksrmcorsr725qgp6ckjfz5hx30 2345105 2345103 2026-04-14T03:02:43Z Hiyuune 50834 Thay cả nội dung bằng “{{auto cat}}” 2345105 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:vo:Trường học 14 268897 2345131 2067806 2026-04-14T03:20:26Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Trường học/Tiếng Volapük]] thành [[Thể loại:vo:Trường học]] 2067806 wikitext text/x-wiki Trang này liệt kê các mục từ tiếng Volapük thuộc chủ đề [[trường học]]. [[Thể loại:Giáo dục/Tiếng Volapük]] [[Thể loại:Mục từ tiếng Volapük theo chủ đề]] [[Thể loại:Trường học|V]] n6xucnc3xgvjlrxn46yay6ugkj1jmef 2345133 2345131 2026-04-14T03:20:41Z Hiyuune 50834 Thay cả nội dung bằng “{{auto cat}}” 2345133 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx уруғ 0 269556 2345183 2069947 2026-04-14T08:59:45Z Hiyuune 50834 2345183 wikitext text/x-wiki =={{langname|kim}}== ==={{section|noun}}=== {{head|kim|Danh từ}} # [[gà|Gà]]. #: {{syn|kim|үрен}} {{C|kim|Gà}} obvfzh3fk8xj7ylcj5rjmdmuebd8hsc méʔščm' 0 270578 2345094 2072481 2026-04-14T01:26:35Z Hiyuune 50834 2345094 wikitext text/x-wiki =={{langname|cow}}== ==={{section|noun}}=== {{head|cow|Danh từ}} # [[chồn|Chồn]] [[nâu]]. {{C|cow|Họ Chồn}} t562n986ytd419donxxruuijst64oug cimi 0 271272 2345124 2167135 2026-04-14T03:12:52Z Hiyuune 50834 2345124 wikitext text/x-wiki {{-ses-}} {{-noun-}} {{head|ses|Danh từ}} # [[sự thật|Sự thật]]. {{-pli-}} {{-alternative form-}} {{pli-alt}} {{-noun-}} {{pn}} # Con [[vẹt]]. {{-dru-}} {{-noun-}} {{pn}} # (''Giải phẫu học'') [[má|Má]]. {{C|dru|Giải phẫu học}} {{-dje-}} {{-noun-}} {{head|dje|Danh từ}} # [[sự thật|Sự thật]]. #: {{ux|dje|Ali ga '''cimi''' ci.|Ali nói '''sự thật'''.}} {{-reference-}} * {{R:PC Niger 2001}} m6w6mlyg7xoy90jhkeaz5ifyhqjsrej 2345127 2345124 2026-04-14T03:16:38Z Hiyuune 50834 2345127 wikitext text/x-wiki =={{langname|pi}}== ==={{section|alt}}=== {{pi-alt}} ==={{section|n}}=== {{pi-noun|m}} # Con [[vẹt]]. ===={{section|ref}}==== * {{R:pi:MT}} =={{langname|dru}}== ==={{section|n}}=== {{head|dru|Danh từ}} # {{lb|dru|anatomy}} [[má|Má]]. =={{langname|ses}}== ==={{section|n}}=== {{head|ses|Danh từ}} # [[sự thật|Sự thật]]. =={{langname|dje}}== ==={{section|n}}=== {{head|dje|Danh từ}} # [[sự thật|Sự thật]]. #: {{ux|dje|Ali ga '''cimi''' ci.|Ali nói '''sự thật'''.}} ==={{section|ref}}=== * {{R:PC Niger 2001}} ilor1gh8txkuisy5qgfqjlr63jeba9r Mô đun:de-verb 828 271287 2344957 2334379 2026-04-13T12:56:55Z Hiyuune 50834 2344957 Scribunto text/plain local export = {} --[=[ Authorship: Ben Wing <benwing2> ]=] --[=[ TERMINOLOGY: -- "slot" = A particular combination of tense/mood/person/number/etc. Example slot names for verbs are "pres_1s" (present first singular) and "subc_subii_3p" (subordinate-clause subjunctive II third plural). Each slot is filled with zero or more forms. -- "form" = The conjugated German form representing the value of a given slot. -- "lemma" = The dictionary form of a given German term. For German, always the infinitive. ]=] --[=[ FIXME: 1. Handle fensterln. (DONE) 2. Handle spie- past tense of speien. (DONE) 3. Make sure rathen, verheirathen work. (DONE) 4. Modify einfix to better handle managen, framen. (DONE) 5. Use variant codes so variant imperatives with and without -e match up in conjoined verbs e.g. [[ausschneiden und einfügen]]. 6. In conjoined verbs e.g. [[ausschneiden und einfügen]], don't repeat auxiliaries. 7. Support 'nosplitprefix' meaning that no forms exist where the prefix is split form the main verb, e.g. [[voreinstellen]]. (DONE) --]=] local lang = require("Module:languages").getByCode("de") local m_string_utilities = require("Module:string utilities") local m_links = require("Module:links") local m_table = require("Module:table") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local rfind = m_string_utilities.find local rmatch = m_string_utilities.match local rsplit = m_string_utilities.split local lcfirst = m_string_utilities.lcfirst local function link_term(term, face) return m_links.full_link({ lang = lang, term = term }, face) end local vowel = "aeiouyäëïöüÿáéíóúýàèìòùỳâêîôûŷãẽĩõũỹ" local vowel_c = "[" .. vowel .. "]" local not_vowel_c = "[^" .. vowel .. "]" local function ends_in_dt(stem) return stem:find("[dt]h?$") end local inseparable_prefixes = { "be", "emp", "ent", "er", "ge", "miss", "miß", "ver", "zer", -- can also be separable "durch", "hinter", "über", "um", "unter", "voll", "wider", "wieder", } local wuerde = link_term("würde", "term") local past_subjunctive_single_word_preferred = m_table.listToSet { "haben", "sein", "können", "müssen", "dürfen", "mögen", "sollen", "wollen", "werden" } local past_subjunctive_single_word_preferred_footnote = "[được ưu tiên; tránh dạng thay thế với " .. wuerde .. "]" local past_subjunctive_single_word_often_used = m_table.listToSet { "bleiben", "brauchen", "bringen", "fallen", "finden", "geben", "gehen", "halten", "heißen", "heissen", "kommen", "laufen", "lassen", "liegen", "nehmen", "sehen", "stehen", "tun", "thun", "wissen" } local past_subjunctive_single_word_often_used_footnote = "[dạng này và thay thế bằng " .. wuerde .. " đều được dùng]" local past_subjunctive_single_word_rare_footnote = "[ít dùng, ngoại trừ trong những bối cảnh rất trang trọng; thường được ưu tiên thay thế bằng " .. wuerde .. "]" local schst_footnote = "[chính thức ở Áo; sử dụng thông tục trong khu vực nói tiếng Đức]" local all_persons_numbers = { ["1s"] = "1|s", ["2s"] = "2|s", ["3s"] = "3|s", ["1p"] = "1|p", ["2p"] = "2|p", ["3p"] = "3|p", } local person_number_list = { "1s", "2s", "3s", "1p", "2p", "3p", } local persnum_to_index = {} for k, v in pairs(person_number_list) do persnum_to_index[v] = k end local imp_person_number_list = { "2s", "2p", } local verb_slots_basic = { {"infinitive", "inf"}, {"infinitive_linked", "inf"}, {"pres_part", "pres|part"}, {"perf_part", "past|part"}, {"zu_infinitive", "zu"}, -- will be handled specially by [[Module:accel/de]] {"aux", "-"}, } local verb_slots_subordinate_clause = { } local verb_slots_composed = { } -- Add entries for a slot with person/number variants. -- `verb_slots` is the table to add to. -- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect. -- `tag_suffix` is the set of inflection tags to add after the person/number tags, -- or "-" to use "-" as the inflection tags (which indicates that no accelerator entry -- should be generated). local function add_slot_personal(verb_slots, slot_prefix, tag_suffix) for persnum, persnum_tag in pairs(all_persons_numbers) do local slot = slot_prefix .. "_" .. persnum if tag_suffix == "-" then table.insert(verb_slots, {slot, "-"}) else table.insert(verb_slots, {slot, persnum_tag .. "|" .. tag_suffix}) end end end add_slot_personal(verb_slots_basic, "pres", "pres") add_slot_personal(verb_slots_basic, "subi", "sub:I") add_slot_personal(verb_slots_basic, "pret", "pret") add_slot_personal(verb_slots_basic, "subii", "sub:II") table.insert(verb_slots_basic, {"imp_2s", "s|imp"}) table.insert(verb_slots_basic, {"imp_2p", "p|imp"}) add_slot_personal(verb_slots_subordinate_clause, "subc_pres", "dep|pres") add_slot_personal(verb_slots_subordinate_clause, "subc_subi", "dep|sub:I") add_slot_personal(verb_slots_subordinate_clause, "subc_pret", "dep|pret") add_slot_personal(verb_slots_subordinate_clause, "subc_subii", "dep|sub:II") add_slot_personal(verb_slots_composed, "perf_ind", "-") add_slot_personal(verb_slots_composed, "perf_sub", "-") add_slot_personal(verb_slots_composed, "plup_ind", "-") add_slot_personal(verb_slots_composed, "plup_sub", "-") table.insert(verb_slots_composed, {"futi_inf", "-"}) add_slot_personal(verb_slots_composed, "futi_subi", "-") add_slot_personal(verb_slots_composed, "futi_ind", "-") add_slot_personal(verb_slots_composed, "futi_subii", "-") table.insert(verb_slots_composed, {"futii_inf", "-"}) add_slot_personal(verb_slots_composed, "futii_subi", "-") add_slot_personal(verb_slots_composed, "futii_ind", "-") add_slot_personal(verb_slots_composed, "futii_subii", "-") local all_verb_slots = {} for _, slot_and_accel in ipairs(verb_slots_basic) do table.insert(all_verb_slots, slot_and_accel) end for _, slot_and_accel in ipairs(verb_slots_subordinate_clause) do table.insert(all_verb_slots, slot_and_accel) end for _, slot_and_accel in ipairs(verb_slots_composed) do table.insert(all_verb_slots, slot_and_accel) end local pronouns = { "ich", "du", "er", "wir", "ihr", "sie", } irreg_verbs = { ["haben"] = { ["pres"] = { "habe", "hast", "hat", "haben", "habt", "haben", }, ["pret"] = { "hatte", "hattest", "hatte", "hatten", "hattet", "hatten", }, ["subi"] = { "habe", "habest", "habe", "haben", "habet", "haben", }, ["subii"] = { "hätte", "hättest", "hätte", "hätten", "hättet", "hätten", }, ["imp"] = { {"hab", "habe"}, "habt", }, ["presp"] = "habend", ["pp"] = "habt", }, ["sein"] = { ["pres"] = { "bin", "bist", "ist", "sind", "seid", "sind", }, ["pret"] = { "war", "warst", "war", "waren", "wart", "waren", }, ["subi"] = { "sei", {"seist", "seiest"}, "sei", "seien", "seiet", "seien", }, ["subii"] = { "wäre", {"wärst", "wärest"}, "wäre", "wären", {"wärt", "wäret"}, "wären", }, ["imp"] = { "sei", "seid", }, ["presp"] = "seiend", ["pp"] = "wesen", }, ["tun"] = { ["pres"] = { "tue", "tust", "tut", "tun", "tut", "tun", }, ["pret"] = { "tat", {"tatest", "tatst"}, "tat", "taten", "tatet", "taten", }, ["subi"] = { "tue", "tuest", "tue", "tuen", "tuet", "tuen", }, ["subii"] = { "täte", "tätest", "täte", "täten", "tätet", "täten", }, ["imp"] = { {"tu", "tue"}, "tut", }, ["presp"] = "tuend", ["pp"] = "tan", }, -- FIXME, maybe we should construct this automatically from "tun". ["thun"] = { ["pres"] = { "thue", "thust", "thut", "thun", "thut", "thun", }, ["pret"] = { "that", {"thatest", "thatst"}, "that", "thaten", "thatet", "thaten", }, ["subi"] = { "thue", "thuest", "thue", "thuen", "thuet", "thuen", }, ["subii"] = { "thäte", "thätest", "thäte", "thäten", "thätet", "thäten", }, ["imp"] = { {"thu", "thue"}, "thut", }, ["presp"] = "thuend", ["pp"] = "than", }, ["werden"] = { ["pres"] = { "werde", "wirst", "wird", "werden", "werdet", "werden", }, ["pret"] = { {"wurde", {form = "ward", footnotes = {"[cổ xưa]"}}}, {"wurdest", {form = "wardst", footnotes = {"[cổ xưa]"}}}, {"wurde", {form = "ward", footnotes = {"[cổ xưa]"}}}, "wurden", "wurdet", "wurden", }, ["subi"] = { "werde", "werdest", "werde", "werden", "werdet", "werden", }, ["subii"] = { "würde", "würdest", "würde", "würden", "würdet", "würden", }, ["imp"] = { {"werd", "werde"}, "werdet", }, ["presp"] = "werdend", ["pp"] = "worden", }, } local sein_forms = { ["sein"] = {"mein", "dein", "sein", "unser", "euer", "ihr"}, ["seine"] = {"meine", "deine", "seine", "unsere", "eure", "ihre"}, ["seinen"] = {"meinen", "deinen", "seinen", "unseren", "euren", "ihren"}, ["seinem"] = {"meinem", "deinem", "seinem", "unserem", "eurem", "ihrem"}, ["seiner"] = {"meiner", "deiner", "seiner", "unserer", "eurer", "ihrer"}, ["seines"] = {"meines", "deines", "seines", "unseses", "eures", "ihres"}, } local sich_forms = { ["accpron"] = {"mich", "dich", "sich", "uns", "euch", "sich"}, ["datpron"] = {"mir", "dir", "sich", "uns", "euch", "sich"}, } local function skip_slot(base, slot) if not slot:find("[123]") then -- Don't skip non-personal slots. return false end if base.nofinite then return true end if base.nosplitprefix then -- Verbs that don't allow split prefixes, e.g. [[voreinstellen]], don't have forms where the prefix is -- split from the main verb, including the present, preterite, subjunctive I and II and imperative (but -- not the subordinate clause equivalents). return slot:find("^pre[st]") or slot:find("^subi") or slot:find("^imp_") end if base.only3s and not slot:find("3s") or base.only3sp and not slot:find("3[sp]") then return true end return false end local function strip_spaces(text) return text:gsub("^%s*(.-)%s*", "%1") end local function escape_sein_sich_indicators(arg1) if not arg1:find("pron>") then return arg1 end local segments = put.parse_balanced_segment_run(arg1, "<", ">") -- Loop over every other segment. The even-numbered segments are angle-bracket specs while -- the odd-numbered segments are the text between them. for i = 2, #segments - 1, 2 do if segments[i] == "<accpron>" then segments[i] = "⦃⦃accpron⦄⦄" elseif segments[i] == "<datpron>" then segments[i] = "⦃⦃datpron⦄⦄" elseif segments[i] == "<pron>" then segments[i] = "⦃⦃pron⦄⦄" end end return table.concat(segments) end local function undo_escape_form(form) -- assign to var to throw away second value local newform = form:gsub("⦃⦃", "<"):gsub("⦄⦄", ">") return newform end local function remove_sein_sich_indicators(form) -- assign to var to throw away second value local newform = form:gsub("⦃⦃.-⦄⦄", "") return newform end local function replace_sein_sich_indicators(slot, form) if not form:find("⦃") then return form end local persnum = slot:match("^.*_([123][sp])$") local index if persnum then index = persnum_to_index[persnum] else index = 3 end form = form:gsub("sich(%]*)⦃⦃accpron⦄⦄", function(brackets) return sich_forms.accpron[index] .. brackets end) form = form:gsub("sich(%]*)⦃⦃datpron⦄⦄", function(brackets) return sich_forms.datpron[index] .. brackets end) form = form:gsub("(seine?[mnrs]?)(%]*)⦃⦃pron⦄⦄", function(sein_form, brackets) if sein_forms[sein_form] then return sein_forms[sein_form][index] .. brackets else error("Unrecognized sein-form '" .. sein_form .. "' in slot " .. slot .. ": " .. undo_escape_form(form)) end end) form = form:gsub("sein%]%](e?[mnrs]?)⦃⦃pron⦄⦄", function(sein_ending, brackets) local sein_form = "sein" .. sein_ending if sein_forms[sein_form] then return sein_forms["sein"][index] .. "|" .. sein_forms[sein_form][index] .. "]]" else error("Unrecognized sein-form '" .. sein_form .. "' in slot " .. slot .. ": " .. undo_escape_form(form)) end end) if form:find("⦃⦃") or form:find("⦄⦄") then error("Unrecognized pronoun substitution in slot " .. slot .. ": " .. undo_escape_form(form)) end return form end local function combine_stem_ending(slot, stem, ending) local ending_with_pound = ending .. "#" if ending_with_pound:find("^st[ #]") then if rfind(stem, "[sxzß]$") then ending = ending:gsub("^s", "") elseif stem:find("st$") then -- bersten ending = ending:gsub("^st", "") end elseif ending_with_pound:find("^t[ #]") and stem:find("th?$") then ending = ending:gsub("^t", "") end return replace_sein_sich_indicators(slot, stem .. ending) end local function add(base, slot, stems, endings, footnotes) if skip_slot(base, slot) then return end local function do_combine_stem_ending(stem, ending) return combine_stem_ending(slot, stem, ending) end iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, nil, nil, iut.combine_footnotes(footnotes, base.all_footnotes)) end local function add_multi(base, slot, stems_and_endings, footnotes) if skip_slot(base, slot) then return end local function do_combine_stem_ending(stem, ending) return combine_stem_ending(slot, stem, ending) end iut.add_multiple_forms(base.forms, slot, stems_and_endings, do_combine_stem_ending, nil, nil, iut.combine_footnotes(footnotes, base.all_footnotes)) end local function add3(base, slot, stems1, stems2, endings, footnotes) return add_multi(base, slot, {stems1, stems2, endings}) end local function add4(base, slot, stems1, stems2, stems3, endings, footnotes) return add_multi(base, slot, {stems1, stems2, stems3, endings}) end local function add5(base, slot, stems1, stems2, stems3, stems4, endings, footnotes) return add_multi(base, slot, {stems1, stems2, stems3, stems4, endings}) end local function get_subii_note(base) if base.from_headword then -- don't include autogenerated note if from_headword, so it doesn't end up in the headword qualifiers return nil end if past_subjunctive_single_word_preferred[base.base_verb] then return {past_subjunctive_single_word_preferred_footnote} elseif past_subjunctive_single_word_often_used[base.base_verb] then return {past_subjunctive_single_word_often_used_footnote} end return {past_subjunctive_single_word_rare_footnote} end local function add_zu_infinitive(base) if base.any_pre_pref then local zu if base.pre_pref == "" or base.pre_pref:find(" $") then zu = "zu " else zu = "zu" end add(base, "zu_infinitive", base.pre_pref .. zu, base.bare_infinitive) end end local function add_present(base, pretpres) local stems = base.infstem local stems23 = base.pres_23 or stems local function doadd(slot_pref, form_pref) -- Do forms based off the infinitive stem. for _, stemform in ipairs(stems) do local prefixed_stem = form_pref .. stemform.form local syncopated_stem = base.unstressed_el_er and prefixed_stem:gsub("e([lr])$", "%1") local function addit(slot, stem, ending, footnotes) add(base, slot_pref .. slot, stem, ending .. (slot_pref == "" and base.post_pref or ""), iut.combine_footnotes(footnotes, stemform.footnotes)) end -- first singular present indicative if not pretpres then -- pres_1s for preterite-present verbs used pres23 stem if base.unstressed_el_er then addit("pres_1s", syncopated_stem, "e") addit("pres_1s", prefixed_stem, "e") addit("pres_1s", prefixed_stem, "") else addit("pres_1s", prefixed_stem, "e") end end -- plural present indicative local e_in_2p = ends_in_dt(prefixed_stem) or base.unstressed_e_infix if e_in_2p then addit("pres_2p", prefixed_stem, "et") else addit("pres_2p", prefixed_stem, "t") end if base.unstressed_el_er or base.unstressed_erl then addit("pres_1p", prefixed_stem, "n") addit("pres_3p", prefixed_stem, "n") else addit("pres_1p", prefixed_stem, "en") addit("pres_3p", prefixed_stem, "en") end -- subjunctive I addit("subi_1s", prefixed_stem, "e") addit("subi_2s", prefixed_stem, "est") addit("subi_3s", prefixed_stem, "e") addit("subi_2p", prefixed_stem, "et") if base.unstressed_el_er then addit("subi_1s", syncopated_stem, "e") addit("subi_2s", syncopated_stem, "est") addit("subi_3s", syncopated_stem, "e") addit("subi_2p", syncopated_stem, "et") end if base.unstressed_el_er then addit("subi_1p", prefixed_stem, "n") addit("subi_3p", prefixed_stem, "n") else addit("subi_1p", prefixed_stem, "en") addit("subi_3p", prefixed_stem, "en") end -- imperative plural; most preterite-present verbs don't have it, and [[wissen]] is handled below if slot_pref == "" and not pretpres then if e_in_2p then addit("imp_2p", prefixed_stem, "et") else addit("imp_2p", prefixed_stem, "t") end end end -- Do forms based off of pres23 stem (also includes pres_1sg in preterite-present verbs). for _, stem23form in ipairs(stems23) do local prefixed_stem23 = form_pref .. stem23form.form local function addit(slot, stem, ending, footnotes) add(base, slot_pref .. slot, stem, ending .. (slot_pref == "" and base.post_pref or ""), iut.combine_footnotes(footnotes, stem23form.footnotes)) end if pretpres then -- Totally different code for preterite-present singular and imperative. addit("pres_1s", prefixed_stem23, "") addit("pres_2s", prefixed_stem23, "st") addit("pres_3s", prefixed_stem23, "") if slot_pref == "" and base.base_verb == "wissen" then -- Only [[wissen]] among the preterite-present verbs has an imperative. addit("imp_2s", "wiss", "e") -- dewikt mentions 'wisset' as an alternative, but not in Duden addit("imp_2p", "wiss", "t") end else -- Normal code path. local stem23_is_same_as_stem for _, stemform in ipairs(stems) do if stemform.form == stem23form.form then stem23_is_same_as_stem = true break end end -- present 2/3 singular local e_in_23s = base.unstressed_e_infix or stem23_is_same_as_stem and ends_in_dt(prefixed_stem23) if e_in_23s then addit("pres_2s", prefixed_stem23, "est") addit("pres_3s", prefixed_stem23, "et") else addit("pres_2s", prefixed_stem23, "st") if prefixed_stem23:find("sch$") then addit("pres_2s", prefixed_stem23, "t", not base.from_headword and {schst_footnote} or nil) end addit("pres_3s", prefixed_stem23, "t") end -- imperative singular; this may or may not be based off the pres23 stem -- Specifically, if the pres23 stem is different from the infinitive stem and does not have an ä or ö -- in it ([[fahren]], er [[fährt]] but imperative [[fahr]]/[[fahre]]; [[stoßen]], er [[stößt]] but -- imperative [[stoß]]/[[stoße]]), use it. Don't add -e unless '.longimp' is given (for [[sehen]], with -- imperatives [[sieh]] and [[siehe]]; but normally [[geben]] with imperative only [[gib]], similarly -- for [[treten]], [[gelten]], [[bergen]], [[etc.]]). In all other cases, use the infinitive stem, and -- under normal circumstances include two variants, without -e and with -e. We include only the variant -- with -e if '.e' is given ([[atmen]], [[zeichnen]], etc.), and we include only the variant without -e -- if '.shortimp' is given (unclear if this is needed for any verb). if slot_pref == "" then if not rfind(prefixed_stem23, "[äö]") and not stem23_is_same_as_stem then addit("imp_2s", prefixed_stem23, "") if base.longimp then addit("imp_2s", prefixed_stem23, "e") end else assert(form_pref == "") for _, stemform in ipairs(stems) do local function addimp(stem, ending) add(base, "imp_2s", stem, ending .. base.post_pref, stemform.footnotes) end local stem = stemform.form if base.unstressed_el_er then local syncopated_stem = stem:gsub("e([lr])$", "%1") addimp(syncopated_stem, "e") end if base.unstressed_e_infix then addimp(stem, "e") elseif base.shortimp then addimp(stem, "") else addimp(stem, "") addimp(stem, "e") end end end end end end end -- Do the basic forms doadd("", "") -- Also do the subordinate clause forms if any alternants have a prefix. if base.any_pre_pref then doadd("subc_", base.pre_pref) end -- Do the miscellaneous non-finite forms add3(base, "pres_part", base.pre_pref, base.bare_infinitive, "d") add_zu_infinitive(base) end -- Add the past forms and/or subjunctive II forms. `is_past` should be true if we're conjugating the past tense -- (not the past subjunctive), in which case the stems in `stem` should be the actual 1s/3s forms, ending in -te -- or -de if weak. If `is_past` is false, we're conjugating the past subjunctive. In that case, the stems passed -- in should include -e if that needs to be preserved in all forms (specifically, for [[spie]] past of [[speien]]; -- syncopated #'spist' is not allowed). (In practice, we chop off the final -e of explicitly user-specified past -- subjunctive forms and otherwise pass in the actual past tense. This means that user-specified past subjunctives -- in -te (e.g. [[brächte]]) will be passed in as 'brächt' but past subjunctives defaulted from the past tense -- will be passed in e.g. as 'lachte'. This works because for stems in -t and -d, the result is the same.) local function add_past_or_subii(base, slot_pref, stems, is_past) local function doadd(full_slot_pref, form_pref) for _, stemform in ipairs(stems) do local prefixed_stem = form_pref .. stemform.form local ends_in_e = prefixed_stem:find("e$") -- Normally, the weak past tense ends in -te and the strong past does not end in -e. An exception is -- [[spie]] (past tense of [[speien]]), which will be treated as weak (superseded spellings like -- 'spieen' will not be generated). local is_strong = is_past and not ends_in_e prefixed_stem = prefixed_stem:gsub("e$", "") local stem_ends_in_dt = ends_in_dt(prefixed_stem) local function addit(slot, ending, footnotes) local subii_footnotes if full_slot_pref:find("subii") then subii_footnotes = get_subii_note(base) end add(base, full_slot_pref .. slot, prefixed_stem, ending .. (full_slot_pref == slot_pref and base.post_pref or ""), iut.combine_footnotes(subii_footnotes, iut.combine_footnotes(footnotes, stemform.footnotes))) end if is_strong then addit("1s", "") addit("3s", "") if not stem_ends_in_dt then if rfind(prefixed_stem, "[sxzß]$") then addit("2s", "est") end addit("2s", "st") addit("2p", "t") else -- bitten -> batest or batst, similarly for laden, raten, etc. addit("2s", "est") if not prefixed_stem:find("st$") then -- bersten addit("2s", "st") end addit("2p", "et") end else -- Weak past and past subjunctive have same endings when ending in -d or -t (always the case for weak past). addit("1s", "e") addit("3s", "e") if not stem_ends_in_dt and not ends_in_e then addit("2s", "est") -- more formal; FIXME: should we footnote this? addit("2p", "et") -- more formal; FIXME: should we footnote this? addit("2s", "st") addit("2p", "t") else addit("2s", "est") addit("2p", "et") end end -- Both pasts, as well as past subjunctive, have same endings in 1p and 3p. addit("1p", "en") addit("3p", "en") end end -- Do the basic forms doadd(slot_pref, "") -- Also do the subordinate clause forms if any alternants have a prefix. if base.any_pre_pref then doadd("subc_" .. slot_pref, base.pre_pref) end end local conjs = {} local conjprops = {} conjs["normal"] = function(base) add_present(base) add_past_or_subii(base, "pret_", base.past, "past") add_past_or_subii(base, "subii_", base.past_sub or base.past) end conjs["pretpres"] = function(base) add_present(base, "pretpres") add_past_or_subii(base, "pret_", base.past, "past") add_past_or_subii(base, "subii_", base.past_sub or base.past) end conjs["irreg"] = function(base) local function doadd(slot_pref) local function addit(slot, forms, footnotes) if slot_pref == "" then add3(base, slot, base.insep_prefix, forms, base.post_pref, footnotes) else add(base, slot_pref .. slot, base.pre_pref .. base.insep_prefix, forms, footnotes) end end -- Do present, preterite, subjunctive I and II. for _, slot_tense in ipairs({"pres", "pret", "subi", "subii"}) do for index, forms in ipairs(base.irregverbobj[slot_tense]) do local persnum = person_number_list[index] local footnotes if slot_tense == "subii" then footnotes = get_subii_note(base) end addit(slot_tense .. "_" .. persnum, forms, footnotes) end end -- Do imperative. if slot_pref == "" then for index, forms in ipairs(base.irregverbobj["imp"]) do local persnum = imp_person_number_list[index] addit("imp_" .. persnum, forms) end end end -- Do the basic forms doadd("") -- Also do the subordinate clause forms if any alternants have a prefix. if base.any_pre_pref then doadd("subc_") end -- Do the miscellaneous non-finite forms iut.add_multiple_forms(base, "pp", {base.ge_prefix, base.insep_prefix, base.irregverbobj["pp"]}, -- We don't want to use combine_stem_ending because we want sein-sich indicators to be left alone, -- so they get replaced later when constructing composed forms. function(stem, ending) return stem .. ending end) add(base, "perf_part", base.pre_pref, base.pp) -- only [[werden]] by itself; not [[loswerden]], [[fertigwerden]], etc. if base.lemma == "werden" then iut.insert_form(base.forms, "perf_part", {form = "worden", footnotes = {"[as an auxiliary]"}}) end add(base, "pres_part", base.pre_pref .. base.insep_prefix, base.irregverbobj["presp"]) add_zu_infinitive(base) end local function add_composed_forms(base) local forms = base.forms local function add_composed(tense_mood, index, persnum, auxforms, participle, suffix, footnotes) local pers_auxforms = iut.convert_to_general_list_form(auxforms[index]) local linked_pers_auxforms = iut.map_forms(pers_auxforms, function(form) return "[[" .. form .. "]] " end) add4(base, tense_mood .. "_" .. persnum, linked_pers_auxforms, "[[" .. base.pre_pref, participle, "]]" .. suffix, footnotes) end local function add_composed_perf(tense_mood, index, persnum, haben_auxforms, sein_auxforms, haben_suffix, sein_suffix) for _, auxform in ipairs(base.aux) do if auxform.form == "haben" then add_composed(tense_mood, index, persnum, haben_auxforms, base.pp, haben_suffix, auxform.footnotes) end if auxform.form == "sein" then add_composed(tense_mood, index, persnum, sein_auxforms, base.pp, sein_suffix, auxform.footnotes) end end end local haben_forms = irreg_verbs["haben"] local sein_forms = irreg_verbs["sein"] local werden_forms = irreg_verbs["werden"] for index, persnum in ipairs(person_number_list) do add_composed_perf("perf_ind", index, persnum, haben_forms["pres"], sein_forms["pres"], "", "") add_composed_perf("perf_sub", index, persnum, haben_forms["subi"], sein_forms["subi"], "", "") add_composed_perf("plup_ind", index, persnum, haben_forms["pret"], sein_forms["pret"], "", "") add_composed_perf("plup_sub", index, persnum, haben_forms["subii"], sein_forms["subii"], "", "") for _, mood in ipairs({"ind", "subi", "subii"}) do local tense = mood == "ind" and "pres" or mood add_composed("futi_" .. mood, index, persnum, werden_forms[tense], base.bare_infinitive, "") add_composed_perf("futii_" .. mood, index, persnum, werden_forms[tense], werden_forms[tense], " [[haben]]", " [[sein]]") end end add3(base, "futi_inf", "[[" .. base.pre_pref, base.bare_infinitive, "]] [[werden]]") add5(base, "futii_inf", "[[" .. base.pre_pref, base.pp, "]] [[", base.aux, "]] [[werden]]") end local function handle_derived_slots(base) -- Compute linked versions of potential lemma slots, for use in {{de-verb}}. -- We substitute the original lemma (before removing links) for forms that -- are the same as the lemma, if the original lemma has links. for _, slot in ipairs({"infinitive"}) do iut.insert_forms(base.forms, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.lemma and rfind(base.linked_lemma, "%[%[") then return base.linked_lemma else return form end end)) end end local function conjugate_verb(base) if not conjs[base.conj] then error("Internal error: Unrecognized conjugation type '" .. base.conj .. "'") end conjs[base.conj](base) add_composed_forms(base) -- No overrides implemented currently. -- process_slot_overrides(base) handle_derived_slots(base) end local function parse_indicator_spec(angle_bracket_spec) local base = {} local function parse_err(msg) error(msg .. ": " .. angle_bracket_spec) end local function fetch_footnotes(separated_group) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end local function fetch_specs(comma_separated_group, transform_form) if not comma_separated_group then return {{}} end local specs = {} local colon_separated_groups = put.split_alternating_runs(comma_separated_group, ":") for _, colon_separated_group in ipairs(colon_separated_groups) do local form = colon_separated_group[1] if transform_form then form = transform_form(form) end table.insert(specs, {form = form, footnotes = fetch_footnotes(colon_separated_group)}) end return specs end local inside = angle_bracket_spec:match("^<(.*)>$") assert(inside) if inside == "" then return base end local segments = put.parse_balanced_segment_run(inside, "[", "]") local dot_separated_groups = put.split_alternating_runs(segments, "%.") for i, dot_separated_group in ipairs(dot_separated_groups) do local comma_separated_groups = put.split_alternating_runs(dot_separated_group, "%s*[,#]%s*", "preserve splitchar") local first_element = comma_separated_groups[1][1] if first_element == "haben" or first_element == "sein" then for j = 1, #comma_separated_groups, 2 do if j > 1 and strip_spaces(comma_separated_groups[j - 1][1]) ~= "," then parse_err("Separator of # not allowed with haben or sein") end local aux = comma_separated_groups[j][1] if aux ~= "haben" and aux ~= "sein" then parse_err("Unrecognized auxiliary '" .. aux .. "'") end if base.aux then for _, existing_aux in ipairs(base.aux) do if existing_aux.form == aux then parse_err("Auxiliary '" .. aux .. "' specified twice") end end else base.aux = {} end table.insert(base.aux, {form = aux, footnotes = fetch_footnotes(comma_separated_groups[j])}) end elseif first_element == "-ge" or first_element == "+ge" then for j = 1, #comma_separated_groups, 2 do if j > 1 and strip_spaces(comma_separated_groups[j - 1][1]) ~= "," then parse_err("Separator of # not allowed with +ge or -ge") end local prefix = comma_separated_groups[j][1] if prefix ~= "+ge" and prefix ~= "-ge" then parse_err("Unrecognized ge- prefix '" .. prefix .. "'") end local ge_prefix if prefix == "+ge" then ge_prefix = "ge" else ge_prefix = "" end if base.ge_prefix then for _, existing_prefix in ipairs(base.ge_prefix) do if existing_prefix.form == ge_prefix then parse_err("Ge- prefix '" .. prefix .. "' specified twice") end end else base.ge_prefix = {} end table.insert(base.ge_prefix, {form = ge_prefix, footnotes = fetch_footnotes(comma_separated_groups[j])}) end elseif #comma_separated_groups > 1 then -- principal parts specified if base.past then parse_err("Can't specify principal parts twice") end local parts = {} assert(#comma_separated_groups[2] == 1) local past_index local first_separator = strip_spaces(comma_separated_groups[2][1]) if first_separator == "#" then -- present 3rd singular specified base.pres_23 = fetch_specs(comma_separated_groups[1], function(form) local stem if base.conj == "pretpres" then stem = form else stem = form:match("^(.-)%-$") if not stem then stem = form:match("^(.-)e?t$") end end if stem then return stem else parse_err("Present 3sg form '" .. form .. "' should end in - (for the stem) or -t") end end) past_index = 3 else past_index = 1 end base.past = fetch_specs(comma_separated_groups[past_index], function(form) return form end) if #comma_separated_groups < past_index + 2 then parse_err("Missing past participle spec") end assert(#comma_separated_groups[past_index + 1] == 1) if strip_spaces(comma_separated_groups[past_index + 1][1]) ~= "," then parse_err("Only first separator can be a #") end base.pp = fetch_specs(comma_separated_groups[past_index + 2], function(form) if form:find("e[nd]$") or form:find("t$") then return form else parse_err("Past participle '" .. form .. "' should end in -en, -t, or -ed") end end) if #comma_separated_groups > past_index + 2 then assert(#comma_separated_groups[past_index + 3] == 1) if strip_spaces(comma_separated_groups[past_index + 3][1]) ~= "," then parse_err("Only first separator can be a #") end base.past_sub = fetch_specs(comma_separated_groups[past_index + 4], function(form) local stem = form:match("^(.-)e$") if not stem then parse_err("Past subjunctive '" .. form .. "' should end in -e") end return stem end) if #comma_separated_groups > past_index + 4 then parse_err("Too many specs given") end end elseif first_element == "pretpres" or first_element == "irreg" then if #comma_separated_groups[1] > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end if base.conj then parse_err("Conjugation specified as '" .. first_element .. "' but already specified or autodetermined as '" .. base.conj .. "'") end base.conj = first_element elseif first_element == "einfix" or first_element == "-einfix" then if #comma_separated_groups[1] > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end base.unstressed_e_infix = first_element == "einfix" elseif first_element == "shortimp" or first_element == "longimp" or first_element == "only3s" or first_element == "only3sp" or first_element == "nofinite" or first_element == "nosplitprefix" then if #comma_separated_groups[1] > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end base[first_element] = true elseif first_element == "" or first_element == "inf" then local footnotes = fetch_footnotes(comma_separated_groups[1]) if not footnotes then parse_err("Empty spec and 'inf' spec without footnotes not allowed") end if first_element == "inf" then base.infstem_footnotes = footnotes else base.all_footnotes = footnotes end else parse_err("Unrecognized spec '" .. comma_separated_groups[1][1] .. "'") end end return base end -- Normalize all lemmas, splitting off separable prefixes and substituting the pagename for blank lemmas. local function normalize_all_lemmas(alternant_multiword_spec, from_headword, pagename) local any_pre_pref iut.map_word_specs(alternant_multiword_spec, function(base) if base.lemma == "" then base.lemma = pagename end if base.lemma:find("_") and not base.lemma:find("%[%[") then -- If lemma is multiword and has no links, add links automatically. base.lemma= "[[" .. base.lemma:gsub("_", "]]_[[") .. "]]" end base.orig_lemma = base.lemma base.orig_lemma_no_links = m_links.remove_links(base.lemma) -- Normalize the linked lemma by removing dot, underscore, and <pron> and such indicators. base.linked_lemma = remove_sein_sich_indicators(base.lemma:gsub("%.", ""):gsub("_", " ")) base.lemma = m_links.remove_links(base.linked_lemma) local lemma = base.orig_lemma_no_links base.pre_pref, base.post_pref = "", "" local prefix, verb = lemma:match("^(.*)_(.-)$") if prefix then prefix = prefix:gsub("_", " ") -- in case of multiple preceding words base.pre_pref = base.pre_pref .. prefix .. " " base.post_pref = base.post_pref .. " " .. prefix else verb = lemma end prefix, base.base_verb = verb:match("^(.*)%.(.-)$") if prefix then -- Lowercase the separable prefixes (but not postfixes) to allow for specified infinitive `Rad.fahren`, -- which becomes actual infinitive [[radfahren]] but 'ich fahre Rad' etc. local prefix_parts = rsplit(prefix, "%.") for i, prefix_part in ipairs(prefix_parts) do prefix_parts[i] = lcfirst(prefix_part) end -- There may be multiple separable prefixes (e.g. [[wiedergutmachen]], ich mache wieder gut) base.pre_pref = base.pre_pref .. table.concat(prefix_parts) base.post_pref = base.post_pref .. " " .. prefix:gsub("%.", " ") else base.base_verb = verb end if base.pre_pref ~= "" then any_pre_pref = true end if base.only3s then alternant_multiword_spec.only3s = true end if base.only3sp then alternant_multiword_spec.only3sp = true end -- Remove <pron> indicators and such. local reconstructed_lemma = remove_sein_sich_indicators(base.pre_pref .. base.base_verb) base.lemma = reconstructed_lemma base.from_headword = from_headword end) if any_pre_pref then iut.map_word_specs(alternant_multiword_spec, function(base) base.any_pre_pref = true end) end if alternant_multiword_spec.only3s then iut.map_word_specs(alternant_multiword_spec, function(base) if not base.only3s then error("If some alternants specify 'only3s', all must") end end) end if alternant_multiword_spec.only3sp then iut.map_word_specs(alternant_multiword_spec, function(base) if not base.only3sp then error("If some alternants specify 'only3sp', all must") end end) end end local function detect_verb_type(base, verb_types) local this_verb_types = {} local function set_verb_type() base.verb_types = this_verb_types if verb_types then for _, verb_type in ipairs(this_verb_types) do m_table.insertIfNot(verb_types, verb_type) end end end if base.conj == "pretpres" then m_table.insertIfNot(this_verb_types, "pretpres") set_verb_type() return elseif base.conj == "irreg" then m_table.insertIfNot(this_verb_types, "irreg") set_verb_type() return end local infstem = m_table.deepCopy(base.infstem) local past = m_table.deepCopy(base.past) local pp = m_table.deepCopy(base.pp) local function matches_forms(forms, expected, ending_to_chop) expected = expected:gsub("C", not_vowel_c) .. "$" local seen = false for _, form in ipairs(forms) do local stem if ending_to_chop then stem = rmatch(form.form, "^(.*)" .. ending_to_chop .. "$") else stem = form.form end if stem and rfind("#" .. stem, expected) then seen = true form.seen = form.seen or "maybe" end end return seen end local function reset_maybes(forms, value) for _, form in ipairs(forms) do if form.seen == "maybe" then form.seen = value end end end local function reset_all_maybes(value) reset_maybes(infstem, value) reset_maybes(past, value) reset_maybes(pp, value) end local function has_unseen_weak_pp() for _, form in ipairs(pp) do if not form.seen and form.form:find("[dt]$") then return true end end return false end local function has_unseen_strong_pp() for _, form in ipairs(pp) do if not form.seen and form.form:find("n$") then return true end end return false end local function check(verbtype, infre, pastre, ppre, exclude) if exclude then for _, form in ipairs(infstem) do if exclude(form.form) then return end end end if matches_forms(infstem, infre) and matches_forms(past, pastre) and matches_forms(pp, ppre, "en") then m_table.insertIfNot(this_verb_types, verbtype) reset_all_maybes(true) else reset_all_maybes(false) end end local function check_strong() check("1", "Ce[iy]C*", "CieC*", "Cie?C*") -- beigen, bleiben, gedeihen, leihen, meiden, preisen, reiben, reihen, -- scheiden, scheinen, schreiben, schreien, schweigen, speiben, speien, speisen, steigen, treiben, weisen, -- zeihen; use 'Cie?C*' for past participle to handle 'schrien', 'spien' check("1", "Ce[iy]C*", "CiC*", "CiC*") -- beißen/beissen/beyßen/beyssen, bleichen, fleißen/fleissen, gleichen, -- gleiten, greifen, kneifen, kreischen, leiden, pfeifen, reißen/reissen, reiten, scheißen/scheissen, -- schleichen, schleifen, schleißen/schleissen, schmeißen/schmeissen, schneiden/schneyden, schreiten, -- spleißen/spleissen, streichen, streiten, weichen check("2", "CieC*", "CoC*", "CoC*") -- biegen, bieten, fliegen, fliehen, fließen/fliessen, frieren, -- genießen/geniessen, gießen/giessen, kiesen, kriechen, riechen, schieben, schießen/schiessen, schliefen, -- schließen/schliessen, sieden, sprießen/spriessen, stieben, triefen, verdrießen/verdriessen, verlieren, -- wiegen, ziehen check("2", "CauC*", "CoC*", "CoC*") -- krauchen, saufen, saugen check("2", "CüC", "CoC", "CoC") -- lügen, trügen local function exclude_nehmen_sprechen(form) -- need to exclude nehmen, stehlen, befehlen/empfehlen, sprechen, brechen, stechen return rfind(form, vowel_c .. "ch$") or rfind(form, vowel_c .. "h" .. not_vowel_c .. "$") end check("3", "C[ei]CC+", "CaCC+", "C[ou]CC+", exclude_nehmen_sprechen) -- [with e, + o in pp]: bergen, bersten, -- gelten, helfen, schelten, sterben, verderben, werben, werfen; [with i, + u in pp]: binden, brinnen, dringen, -- finden, gelingen, klingen, misslingen, ringen, schlingen, schwinden, schwingen, singen, sinken, springen, -- stinken, trinken, winden, wringen, zwingen; [with i, + o in pp]: rinnen, gewinnen, schwimmen, sinnen, -- spinnen check("3", "C[eiaö]CC+", "CoCC+", "CoCC+", exclude_nehmen_sprechen) -- [with e]: dreschen, fechten, flechten, melken, quellen, schmelzen, schwellen; [with i]: glimmen, klimmen; -- [with a]: schallen (geschallt), erschallen; [with ö]: erlöschen check("3", "quell", "quoll", "quoll") -- need to special-case quellen due to u preceding e check("3", "schind", "schund", "schund") -- need to special-case due to 'u' in past check("4", "C[eäo]C*", "Cah?Ch?", "CoC*") -- [with e]: befehlen, brechen, schrecken, nehmen, sprechen, stechen, -- stecken (gesteckt), stehlen, treffen; [with ä]: gebären; [with o]: kommen check("4", "C[äe]C", "Coh?C", "Coh?C", function(form) return form:find("heb$") end) -- [with ä]: gären, wägen, schwären; [with e]: bewegen, weben, scheren (but not heben) check("5", "C[ei]C*", "CaC", "CeC*") -- [with e, one C]: geben, genesen, geschehen, lesen, meßen, sehen, treten; -- [with e, two C]: essen, fressen, messen, vergessen; [with i, two C]: bitten, sitzen check("5", "C[ei]C*", "Cass", "Cess") -- essen, fressen, messen, sitzen in Swiss spelling check("5", "CieC", "CaC", "CeC") -- liegen check("6", "CaC*", "CuC*", "CaC*") -- backen, fragen (gefragt), graben, laden, mahlen, schaffen, schlagen, -- tragen, wachsen, waschen check("6", "heb", "h[ou]b", "hob") -- we need to special-case this because heben (class 6 per Wikipedia) has the -- exact same vowels as weben (class 4 per Wikipedia) check("6", "schwör", "schw[ou]r", "schwor") -- only strong verb with these vowels check("7", "CaC*", "CieC*", "CaC*") -- blasen, braten, fallen, halten, lassen, raten/rathen, schlafen check("7", "C[aäe]C*", "CiC*", "CaC*") -- [with a]: fangen; [with ä]: hängen; [with e]: gehen check("7", "Ce[iy]C*", "CieC*", "Ce[iy]C*") -- heißen/heissen/heyßen/heyssen check("7", "CauC*", "CieC*", "CauC*") -- hauen, laufen check("7", "CoC*", "CieC*", "CoC*") -- stoßen/stossen check("7", "CuC*", "CieC*", "CuC*") -- rufen end for _, form in ipairs(past) do local past_stem = form.form:match("^(.*)te$") if past_stem then if matches_forms(infstem, "#" .. past_stem) then -- Need to run matches_forms() on all possibilities even if earlier ones match, -- to mark the seen forms correctly. local matches_pp = matches_forms(pp, "#" .. past_stem .. "t") matches_pp = matches_forms(pp, "#ge" .. past_stem .. "t") or matches_pp if matches_pp then m_table.insertIfNot(this_verb_types, "weak") form.seen = true reset_all_maybes(true) else reset_all_maybes(false) end end end if not form.seen and form.form:find("ete$") then if matches_forms(infstem, "#" .. past_stem:gsub("e$", "")) then -- Need to run matches_forms() on all possibilities even if earlier ones match, -- to mark the seen forms correctly. local matches_pp = matches_forms(pp, "#" .. past_stem .. "t") matches_pp = matches_forms(pp, "#ge" .. past_stem .. "t") or matches_pp matches_pp = matches_forms(pp, "#" .. past_stem .. "d") or matches_pp matches_pp = matches_forms(pp, "#ge" .. past_stem .. "d") or matches_pp if matches_pp then m_table.insertIfNot(this_verb_types, "weak") form.seen = true reset_all_maybes(true) else reset_all_maybes(false) end end end if past_stem and not form.seen then if not has_unseen_weak_pp() and has_unseen_strong_pp() then m_table.insertIfNot(this_verb_types, "mixed") else m_table.insertIfNot(this_verb_types, "irregweak") end matches_forms(pp, "#" .. past_stem .. "t") matches_forms(pp, "#ge" .. past_stem .. "t") form.seen = true reset_all_maybes(true) end if not form.seen then check_strong() end if not form.seen then if not has_unseen_strong_pp() and has_unseen_weak_pp() then m_table.insertIfNot(this_verb_types, "mixed") else m_table.insertIfNot(this_verb_types, "irregstrong") end end end for _, form in ipairs(pp) do if not form.seen then if form.form:find("n$") then if m_table.contains(this_verb_types, "strong") then m_table.insertIfNot(this_verb_types, "irregstrong") elseif m_table.contains(this_verb_types, "weak") then m_table.insertIfNot(this_verb_types, "mixed") end elseif form.form:find("[dt]$") then if m_table.contains(this_verb_types, "weak") then m_table.insertIfNot(this_verb_types, "irregweak") elseif m_table.contains(this_verb_types, "strong") then m_table.insertIfNot(this_verb_types, "mixed") end end end end base.verb_types = this_verb_types if verb_types then for _, verb_type in ipairs(this_verb_types) do m_table.insertIfNot(verb_types, verb_type) end end set_verb_type() end local function detect_indicator_spec(base) base.forms = {} base.aux = base.aux or {{form = "haben"}} base.bare_infinitive = {{form = base.base_verb, footnotes = base.infstem_footnotes}} add(base, "infinitive", base.pre_pref, base.bare_infinitive) if base.only3s and base.only3sp then error("'only3s' and 'only3sp' cannot both be specified") end if base.conj == "irreg" then for irregverb, verbobj in pairs(irreg_verbs) do base.insep_prefix = base.base_verb:match("^(.-)" .. irregverb .. "$") if base.insep_prefix then base.irregverb = irregverb base.irregverbobj = verbobj if not base.ge_prefix then if base.insep_prefix ~= "" then base.ge_prefix = {{form = ""}} else base.ge_prefix = {{form = "ge"}} end end return end end error("Unrecognized irregular base verb '" .. base.base_verb .. "'") end -- The following applies to everything but 'irreg' verbs. local infstem, infroot = base.base_verb:match("^((.*)e[lr])n$") if infstem then base.unstressed_el_er = true else infstem, infroot = base.base_verb:match("^((.*)erl)n$") -- [[fensterln]] if infstem then base.unstressed_erl = true else infstem = base.base_verb:match("^(.*)en$") infroot = infstem if not infstem then error("Unrecognized infinitive, should end in -en, -eln, -ern or -erln: '" .. base.base_verb .. "'") end end end base.infstem = {{form = infstem, footnotes = base.infstem_footnotes}} if base.unstressed_e_infix == nil then -- Autodetect whether we need an -e- infix in the pres_2s and pres_3s ([[atmen]], [[eignen]], etc.). -- Almost all such cases have -Cmen or -Cnen where C is a consonant other than r or l and other than the -- following m or n (hence [[meinen]], [[lernen]], [[filmen]], [[schwimmen]] should be excluded); we also -- need to exclue -Vhmen and -Vhnen ([[wohnen]], [[rühmen]]), but not -Chmen and -Chnen ([[zeichnen]]). if base.base_verb:find("[mn]en$") and not base.base_verb:find("([mn])%1en$") and not rfind(base.base_verb, vowel_c .. "[hrl]?[mn]en$") then base.unstressed_e_infix = true end end if not base.conj then base.conj = "normal" end if base.conj == "normal" then local weak_past if not base.past then if base.unstressed_e_infix or ends_in_dt(infstem) then weak_past = infstem .. "et" else weak_past = infstem .. "t" end base.past = {{form = weak_past .. "e"}} end if not base.pp then if not weak_past then error("Internal error: past was explicitly given but not past participle") end if not base.ge_prefix then local no_ge for _, insep_prefix in ipairs(inseparable_prefixes) do -- There must be a vowel following the inseparable prefix; excludes beben, bechern, belfern, bellen, bessern, -- beten, betteln, betten, erben, erden, ernten, erzen, entern, gecken, gehren, gellen, gerben, geten, missen, -- zergen, zerren, etc. if rfind(infroot, "^" .. insep_prefix .. ".*" .. vowel_c .. ".*") and -- Exclude cases like beigen, beichten, beugen, beulen, geifern; this also wrongly excludes -- beirren, which needs -ge. not rfind(infroot, "^[bg]e[iu]" .. not_vowel_c .. "*$") then no_ge = true break end -- Check for -ier preceded by a vowel (excludes bieren, frieren, gieren, schmieren, stieren, zieren, etc.) if not base.unstressed_el_er and not base.unstressed_erl and rfind(infroot, "^.*" .. vowel_c .. ".*ier$") then no_ge = true break end end if no_ge then base.ge_prefix = {{form = ""}} else base.ge_prefix = {{form = "ge"}} end end base.pp = iut.map_forms(base.ge_prefix, function(form) if base.unstressed_el_er or base.unstressed_erl then return form .. base.base_verb:gsub("n$", "") .. "t" else return form .. weak_past end end) end else if not base.pp then error("For '" .. base.conj .. "' type verbs, past participle must be explicitly given") end end add(base, "perf_part", base.pre_pref, base.pp) end local function detect_all_indicator_specs(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) detect_indicator_spec(base) detect_verb_type(base) end) end -- Set the overall auxiliary or auxiliaries. We can't do this using the normal inflection -- code as it will produce e.g. '[[haben]] und [[haben]]' for conjoined verbs. local function compute_auxiliary(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) iut.insert_forms(alternant_multiword_spec.forms, "aux", base.aux) end) end function export.process_verb_classes(classes) local class_descs = {} local cats = {} local function insert_desc(desc) m_table.insertIfNot(class_descs, desc) end local function insert_cat(cat) m_table.insertIfNot(cats, cat .. " tiếng Đức") end for _, class in ipairs(classes) do if class == "weak" then insert_desc("[[Phụ lục:Từ điển thuật ngữ#động từ yếu|yếu]]") insert_cat("Động từ yếu") elseif class == "irregweak" then insert_desc("[[Phụ lục:Từ điển thuật ngữ#bất quy tắc|bất quy tắc]] [[Phụ lục:Từ điển thuật ngữ#động từ yếu|yếu]]") insert_cat("Động từ yếu") insert_cat("Động từ bất quy tắc") elseif class == "pretpres" then insert_desc("[[Phụ lục:Từ điển thuật ngữ#động từ quá khứ đơn-hiện đại|quá khứ đơn-hiện đại]]") insert_cat("Động từ quá khứ đơn-hiện đại") elseif class == "irreg" then insert_desc("[[Phụ lục:Từ điển thuật ngữ#bất quy tắc|bất quy tắc]]") insert_cat("Động từ bất quy tắc") elseif class == "mixed" then insert_desc("hỗn hợp") insert_cat("Động từ hỗn hợp") elseif class == "irregstrong" then insert_desc("[[Phụ lục:Từ điển thuật ngữ#bất quy tắc|bất quy tắc]] [[Phụ lục:Từ điển thuật ngữ#động từ mạnh|mạnh]]") insert_cat("Động từ mạnh") insert_cat("Động từ mạnh bất quy tắc") elseif class:find("^[1-7]$") then insert_desc("lớp " .. class .. " [[Phụ lục:Từ điển thuật ngữ#động từ mạnh|mạnh]]") insert_cat("Động từ mạnh") insert_cat("Động từ mạnh lớp " .. class) else error("Không rõ lớp động từ '" .. class .. "'") end end return class_descs, cats end local function add_categories_and_annotation(alternant_multiword_spec, base, from_headword, manual) local function insert_cat(full_cat) m_table.insertIfNot(alternant_multiword_spec.categories, full_cat) end if not from_headword then for _, slot_and_accel in ipairs(all_verb_slots) do local slot = slot_and_accel[1] local forms = base.forms[slot] local must_break = false if forms then for _, form in ipairs(forms) do if not form.form:find("%[%[") then local title = mw.title.new(form.form) if title and not title.exists then insert_cat("Động từ có liên kết đỏ trong bảng biến tố tiếng Đức") must_break = true break end end end end if must_break then break end end end if manual then return end local class_descs, cats = export.process_verb_classes(base.verb_types) for _, desc in ipairs(class_descs) do m_table.insertIfNot(alternant_multiword_spec.verb_types, desc) end -- Don't place multiword terms in categories like 'German class 4 strong verbs' to avoid spamming the -- categories with such terms. if from_headword and not base.lemma:find(" ") then for _, cat in ipairs(cats) do insert_cat(cat) end end for _, aux in ipairs(base.aux) do m_table.insertIfNot(alternant_multiword_spec.auxiliaries, link_term(aux.form, "term")) if from_headword and not base.lemma:find(" ") then -- see above insert_cat("Động từ dùng trợ động từ " .. aux.form) -- Set flags for use below in adding 'German verbs using haben and sein as auxiliary' alternant_multiword_spec["saw_" .. aux.form] = true end end end -- Compute the categories to add the verb to, as well as the annotation to display in the -- conjugation title bar. We combine the code to do these functions as both categories and -- title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec, from_headword, manual) alternant_multiword_spec.categories = {} alternant_multiword_spec.verb_types = {} alternant_multiword_spec.auxiliaries = {} iut.map_word_specs(alternant_multiword_spec, function(base) add_categories_and_annotation(alternant_multiword_spec, base, from_headword) end) if manual then alternant_multiword_spec.annotation = "" return end local ann_parts = {} table.insert(ann_parts, table.concat(alternant_multiword_spec.verb_types, " hoặc ")) if #alternant_multiword_spec.auxiliaries > 0 then table.insert(ann_parts, ", trợ động từ " .. table.concat(alternant_multiword_spec.auxiliaries, " hoặc ")) end if from_headword and alternant_multiword_spec.saw_haben and alternant_multiword_spec.saw_sein then m_table.insertIfNot(alternant_multiword_spec.categories, "Động từ dùng trợ động từ haben và sein") end alternant_multiword_spec.annotation = table.concat(ann_parts) end local function show_forms(alternant_multiword_spec) local lemmas = iut.map_forms(alternant_multiword_spec.forms.infinitive, remove_sein_sich_indicators) alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table() local linked_pronouns = {} for index, pronoun in ipairs(pronouns) do -- use 'es' instead of 'er' for 3s-only verbs if index == 3 and alternant_multiword_spec.only3s then linked_pronouns[index] = link_term("es") else linked_pronouns[index] = link_term(pronoun) end end dass = link_term("dass") .. " " local function generate_link(data) local link = m_links.full_link { lang = lang, term = data.form.formval_for_link, tr = "-", accel = data.form.accel_obj } local footnote_text = iut.get_footnote_text(data.form.footnotes, data.footnote_obj) local persnum = data.slot:match("^imp_(2[sp])$") if persnum then link = link .. " (" .. linked_pronouns[persnum_to_index[persnum]] .. ")" else persnum = data.slot:match("^.*_([123][sp])$") if persnum then link = linked_pronouns[persnum_to_index[persnum]] .. " " .. link end if data.slot:find("^subc_") then link = dass .. link end end return link .. footnote_text end local function join_spans(data) if data.slot == "aux" then return table.concat(data.formval_spans, " or ") else return table.concat(data.formval_spans, "<br />") end end local props = { lang = lang, lemmas = lemmas, generate_link = generate_link, join_spans = join_spans, } props.slot_list = verb_slots_basic iut.show_forms(alternant_multiword_spec.forms, props) alternant_multiword_spec.footnote_basic = alternant_multiword_spec.forms.footnote props.slot_list = verb_slots_subordinate_clause iut.show_forms(alternant_multiword_spec.forms, props) alternant_multiword_spec.footnote_subordinate_clause = alternant_multiword_spec.forms.footnote props.slot_list = verb_slots_composed iut.show_forms(alternant_multiword_spec.forms, props) alternant_multiword_spec.footnote_composed = alternant_multiword_spec.forms.footnote end local notes_template = [=[ <div style="width:100%;text-align:left;background:var(--wikt-palette-grey-blue-1,#d9ebff);color:inherit"> <div style="display:inline-block;text-align:left;padding-left:1em;padding-right:1em"> {footnote} </div></div> ]=] local zu_infinitive_table = [=[ |- ! colspan=2 style="background:var(--wikt-palette-grey-2,#d0d0d0);color:inherit" | nguyên mẫu-zu | colspan=4 data-accel-col=1 | {zu_infinitive} ]=] local basic_table = [=[ <div class="NavFrame" style=""> <div class="NavHead" style="">Bảng chia động từ của {title}</div> <div class="NavContent"> {\op}| style="border: 1px solid var(--wikt-palette-black,#000000); border-collapse:collapse; background:var(--wikt-palette-white,#fafafa);color:inherit; text-align:center; width:100%" class="inflection-table" |- ! colspan=2 style="background:var(--wikt-palette-grey-2,#d0d0d0);color:inherit" | <span title="Infinitiv">nguyên mẫu</span> | colspan=4 data-accel-col=1 | {infinitive} |- ! colspan=2 style="background:var(--wikt-palette-grey-2,#d0d0d0);color:inherit" | <span title="Partizip I (Partizip Präsens)">phân từ hiện tại</span> | colspan=4 data-accel-col=20 | {pres_part} |- ! colspan=2 style="background:var(--wikt-palette-grey-2,#d0d0d0);color:inherit" | <span title="Partizip II (Partizip Perfekt)">phân từ quá khứ</span> | colspan=4 data-accel-col=20 | {perf_part} {zu_infinitive_table}|- ! colspan=2 style="background:var(--wikt-palette-grey-2,#d0d0d0);color:inherit" | <span title="Hilfsverb">trợ động từ</span> | colspan=4 | {aux} |- | rowspan=2 style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | ! colspan=2 style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | <span title="Indikativ">trần thuật</span> | rowspan=2 style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | ! colspan=2 style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | <span title="Konjunktiv">giả định</span> |- ! style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | số ít ! style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | số nhiều ! style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | số ít ! style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | số nhiều |- ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit; width:7em" | <span title="Präsens">hiện tại</span> | data-accel-col=2 | {pres_1s} | data-accel-col=3 | {pres_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit; width:7em" | <span title="Konjunktiv I (Konjunktiv Präsens)">i</span> | data-accel-col=10 | {subi_1s} | data-accel-col=11 | {subi_1p} |- | data-accel-col=2 | {pres_2s} | data-accel-col=3 | {pres_2p} | data-accel-col=10 | {subi_2s} | data-accel-col=11 | {subi_2p} |- | data-accel-col=2 | {pres_3s} | data-accel-col=3 | {pres_3p} | data-accel-col=10 | {subi_3s} | data-accel-col=11 | {subi_3p} |- | colspan=6 style="background:var(--wikt-palette-grey-2,#d5d5d5);color:inherit; height: .25em" | |- ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit" | <span title="Präteritum">quá khứ đơn</span> | data-accel-col=6 | {pret_1s} | data-accel-col=7 | {pret_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit" | <span title="Konjunktiv II (Konjunktiv Präteritum)">ii</span> | data-accel-col=14 | {subii_1s} | data-accel-col=15 | {subii_1p} |- | data-accel-col=6 | {pret_2s} | data-accel-col=7 | {pret_2p} | data-accel-col=14 | {subii_2s} | data-accel-col=15 | {subii_2p} |- | data-accel-col=6 | {pret_3s} | data-accel-col=7 | {pret_3p} | data-accel-col=14 | {subii_3s} | data-accel-col=15 | {subii_3p} |- | colspan=6 style="background:var(--wikt-palette-grey-2,#d5d5d5);color:inherit; height: .25em" | |- ! style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit" | <span title="Imperativ">mệnh lệnh</span> | data-accel-col=18 | {imp_2s} | data-accel-col=19 | {imp_2p} | colspan=3 style="background:var(--wikt-palette-grey-1,#e0e0e0);color:inherit" | |{\cl}{notes_clause}</div></div> ]=] local subordinate_clause_table = [=[ <div class="NavFrame" style=""> <div class="NavHead" style="">Các dạng mệnh đề phụ thuộc của {title}</div> <div class="NavContent"> {\op}| style="border: 1px solid var(--wikt-palette-black,#000000); border-collapse:collapse; background:var(--wikt-palette-white,#fafafa);color:inherit; text-align:center; width:100%" class="inflection-table" |- | style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | ! colspan=2 style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | <span title="Indikativ">trần thuật</span> | style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | ! colspan=2 style="background:var(--wikt-palette-grey-indigo-3,#a0ade3);color:inherit" | <span title="Konjunktiv">giả định</span> |- ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit; width:7em" | <span title="Präsens">hiện tại</span> | data-accel-col=4 | {subc_pres_1s} | data-accel-col=5 | {subc_pres_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit; width:7em" | <span title="Konjunktiv I (Konjunktiv Präsens)">i</span> | data-accel-col=12 | {subc_subi_1s} | data-accel-col=13 | {subc_subi_1p} |- | data-accel-col=4 | {subc_pres_2s} | data-accel-col=5 | {subc_pres_2p} | data-accel-col=12 | {subc_subi_2s} | data-accel-col=13 | {subc_subi_2p} |- | data-accel-col=4 | {subc_pres_3s} | data-accel-col=5 | {subc_pres_3p} | data-accel-col=12 | {subc_subi_3s} | data-accel-col=13 | {subc_subi_3p} |- | colspan=6 style="background:var(--wikt-palette-grey-2,#d5d5d5);color:inherit; height: .25em" | |- ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit" | <span title="Präteritum">quá khứ đơn</span> | data-accel-col=8 | {subc_pret_1s} | data-accel-col=9 | {subc_pret_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-blue-3,#c0cfe4);color:inherit" | <span title="Konjunktiv II (Konjunktiv Präteritum)">ii</span> | data-accel-col=16 | {subc_subii_1s} | data-accel-col=17 | {subc_subii_1p} |- | data-accel-col=8 | {subc_pret_2s} | data-accel-col=9 | {subc_pret_2p} | data-accel-col=16 | {subc_subii_2s} | data-accel-col=17 | {subc_subii_2p} |- | data-accel-col=8 | {subc_pret_3s} | data-accel-col=9 | {subc_pret_3p} | data-accel-col=16 | {subc_subii_3s} | data-accel-col=17 | {subc_subii_3p} |{\cl}{notes_clause}</div></div> ]=] local composed_table = [=[ <div class="NavFrame" style=""> <div class="NavHead" style="">Các dạng mệnh đề phụ thuộc của {title}</div> <div class="NavContent"> {\op}| style="border: 1px solid var(--wikt-palette-black,#000000); border-collapse:collapse; background:var(--wikt-palette-white,#fafafa);color:inherit; text-align:center; width:100%" class="inflection-table" |- ! colspan=6 style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | <span title="Perfekt">hoàn thành</span> |- ! style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | ! style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | số ít ! style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | số nhiều ! style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | ! style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | số ít ! style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | số nhiều |- ! rowspan=3 style="background:var(--wikt-palette-grey-green-2,#cfedcc);color:inherit; width:7em" | <span title="Indikativ">trần thuật</span> | {perf_ind_1s} | {perf_ind_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-green-2,#cfedcc);color:inherit; width:7em" | <span title="Konjunktiv">giả định</span> | {perf_sub_1s} | {perf_sub_1p} |- | {perf_ind_2s} | {perf_ind_2p} | {perf_sub_2s} | {perf_sub_2p} |- | {perf_ind_3s} | {perf_ind_3p} | {perf_sub_3s} | {perf_sub_3p} |- ! colspan=6 style="background:var(--wikt-palette-grey-green-4,#99cc99);color:inherit" | <span title="Plusquamperfekt">hoàn thành số nhiều</span> |- ! rowspan=3 style="background:var(--wikt-palette-grey-green-2,#cfedcc);color:inherit" | <span title="Indikativ">trần thuật</span> | {plup_ind_1s} | {plup_ind_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-green-2,#cfedcc);color:inherit" | <span title="Konjunktiv">giả định</span> | {plup_sub_1s} | {plup_sub_1p} |- | {plup_ind_2s} | {plup_ind_2p} | {plup_sub_2s} | {plup_sub_2p} |- | {plup_ind_3s} | {plup_ind_3p} | {plup_sub_3s} | {plup_sub_3p} |- ! colspan=6 style="background:var(--wikt-palette-grey-indigo-4,#9999DF);color:inherit" | <span title="Futur I">tương lai i</span> |- ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Infinitiv">nguyên mẫu</span> | rowspan=3 colspan=2 | {futi_inf} ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Konjunktiv I (Konjunktiv Präsens)">giả định i</span> | {futi_subi_1s} | {futi_subi_1p} |- | {futi_subi_2s} | {futi_subi_2p} |- | {futi_subi_3s} | {futi_subi_3p} |- ! colspan=6 style="background:var(--wikt-palette-grey-2,#d5d5d5);color:inherit; height: .25em" | |- ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Indikativ">trần thuật</span> | {futi_ind_1s} | {futi_ind_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Konjunktiv II (Konjunktiv Präteritum)">giả định ii</span> | {futi_subii_1s} | {futi_subii_1p} |- | {futi_ind_2s} | {futi_ind_2p} | {futi_subii_2s} | {futi_subii_2p} |- | {futi_ind_3s} | {futi_ind_3p} | {futi_subii_3s} | {futi_subii_3p} |- ! colspan=6 style="background:var(--wikt-palette-grey-indigo-4,#9999DF);color:inherit" | <span title="Futur II">tương lai ii</span> |- ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Infinitiv">nguyên mẫu</span> | rowspan=3 colspan=2 | {futii_inf} ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Konjunktiv I (Konjunktiv Präsens)">giả định i</span> | {futii_subi_1s} | {futii_subi_1p} |- | {futii_subi_2s} | {futii_subi_2p} |- | {futii_subi_3s} | {futii_subi_3p} |- ! colspan=6 style="background:var(--wikt-palette-grey-2,#d5d5d5);color:inherit; height: .25em" | |- ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Indikativ">giả định</span> | {futii_ind_1s} | {futii_ind_1p} ! rowspan=3 style="background:var(--wikt-palette-grey-indigo-2,#ccccff);color:inherit" | <span title="Konjunktiv II (Konjunktiv Präteritum)">giả định ii</span> | {futii_subii_1s} | {futii_subii_1p} |- | {futii_ind_2s} | {futii_ind_2p} | {futii_subii_2s} | {futii_subii_2p} |- | {futii_ind_3s} | {futii_ind_3p} | {futii_subii_3s} | {futii_subii_3p} |{\cl}{notes_clause}</div></div>]=] local function make_table(alternant_multiword_spec) local forms = alternant_multiword_spec.forms forms.title = link_term(alternant_multiword_spec.lemmas[1].form, "term") if alternant_multiword_spec.annotation ~= "" then forms.title = forms.title .. " (" .. alternant_multiword_spec.annotation .. ")" end -- Maybe format the subordinate clause table. local formatted_subordinate_clause_table if forms.subc_pres_3s ~= "—" then -- use 3s in case of only3s verb forms.zu_infinitive_table = m_string_utilities.format(zu_infinitive_table, forms) forms.footnote = alternant_multiword_spec.footnote_subordinate_clause forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or "" formatted_subordinate_clause_table = m_string_utilities.format(subordinate_clause_table, forms) else forms.zu_infinitive_table = "" formatted_subordinate_clause_table = "" end -- Format the basic table. forms.footnote = alternant_multiword_spec.footnote_basic forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or "" local formatted_basic_table = m_string_utilities.format(basic_table, forms) -- Format the composed table. forms.footnote = alternant_multiword_spec.footnote_composed forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or "" local formatted_composed_table = m_string_utilities.format(composed_table, forms) -- Paste them together. return formatted_basic_table .. formatted_subordinate_clause_table .. formatted_composed_table end -- Externally callable function to parse and conjugate a verb given user-specified arguments. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(parent_args, from_headword, def) local params = { [1] = true, pagename = true, json = {type = "boolean"}, -- for bot use } if from_headword then params["lemma"] = {list = true} params["id"] = true end local args = require("Module:parameters").process(parent_args, params) local pagename = args.pagename or mw.loadData("Module:headword/data").pagename if not args[1] then if pagename == "de-conj" or pagename == "de-verb" then args[1] = def or "aus.fahren<fährt#fuhr,gefahren,führe.haben,sein>" else args[1] = pagename -- If pagename has spaces in it, add links around each word if args[1]:find(" ") then args[1] = "[[" .. args[1]:gsub(" ", "]] [[") .. "]]" end end end local parse_props = { parse_indicator_spec = parse_indicator_spec, lang = lang, allow_default_indicator = true, allow_blank_lemma = true, } local escaped_arg1 = escape_sein_sich_indicators(args[1]) local alternant_multiword_spec = iut.parse_inflected_text(escaped_arg1, parse_props) alternant_multiword_spec.pos = pos or "verbs" alternant_multiword_spec.args = args normalize_all_lemmas(alternant_multiword_spec, from_headword, pagename) detect_all_indicator_specs(alternant_multiword_spec) local inflect_props = { slot_list = all_verb_slots, lang = lang, inflect_word_spec = conjugate_verb, -- We add links around the generated verbal forms rather than allow the entire multiword -- expression to be a link, so ensure that user-specified links get included as well. include_user_specified_links = true, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) compute_auxiliary(alternant_multiword_spec) compute_categories_and_annotation(alternant_multiword_spec, from_headword) if args.json then return require("Module:JSON").toJSON(alternant_multiword_spec) end return alternant_multiword_spec end -- Entry point for {{de-conj}}. Template-callable function to parse and conjugate a verb given -- user-specified arguments and generate a displayable table of the conjugated forms. function export.show(frame) local parent_args = frame:getParent().args local alternant_multiword_spec = export.do_generate_forms(parent_args) if type(alternant_multiword_spec) == "string" then -- json=1 specified return alternant_multiword_spec end show_forms(alternant_multiword_spec) return make_table(alternant_multiword_spec) .. require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang) end local numbered_params = { -- required params [1] = "infinitive", [2] = "pres_part", [3] = "perf_part", [4] = "aux", [5] = "pres_1s", [6] = "pres_2s", [7] = "pres_3s", [8] = "pres_1p", [9] = "pres_2p", [10] = "pres_3p", [11] = "pret_1s", [12] = "pret_2s", [13] = "pret_3s", [14] = "pret_1p", [15] = "pret_2p", [16] = "pret_3p", [17] = "subi_1s", [18] = "subi_2s", [19] = "subi_3s", [20] = "subi_1p", [21] = "subi_2p", [22] = "subi_3p", [23] = "subii_1s", [24] = "subii_2s", [25] = "subii_3s", [26] = "subii_1p", [27] = "subii_2p", [28] = "subii_3p", [29] = "imp_2s", [30] = "imp_2p", -- [31] formerly the 2nd variant of imp_2s; now no longer allowed (use comma-separated 29=) -- [32] formerly indicated whether the 2nd variant of imp_2s was present -- optional params [33] = "subc_pres_1s", [34] = "subc_pres_2s", [35] = "subc_pres_3s", [36] = "subc_pres_1p", [37] = "subc_pres_2p", [38] = "subc_pres_3p", [39] = "subc_pret_1s", [40] = "subc_pret_2s", [41] = "subc_pret_3s", [42] = "subc_pret_1p", [43] = "subc_pret_2p", [44] = "subc_pret_3p", [45] = "subc_subi_1s", [46] = "subc_subi_2s", [47] = "subc_subi_3s", [48] = "subc_subi_1p", [49] = "subc_subi_2p", [50] = "subc_subi_3p", [51] = "subc_subii_1s", [52] = "subc_subii_2s", [53] = "subc_subii_3s", [54] = "subc_subii_1p", [55] = "subc_subii_2p", [56] = "subc_subii_3p", [57] = "zu_infinitive", } local max_required_param = 30 -- Externally callable function to parse and conjugate a verb where all forms are given manually. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms_manual(parent_args) local params = { json = {type = "boolean"}, } for paramnum, _ in pairs(numbered_params) do params[paramnum] = {required = paramnum <= max_required_param} end local args = require("Module:parameters").process(parent_args, params) local base = { forms = {}, manual = true, } local function process_numbered_param(paramnum) local argval = args[paramnum] if paramnum == 4 then if argval == "h" then base.aux = {{form = "haben"}} elseif argval == "s" then base.aux = {{form = "sein"}} elseif argval == "hs" then base.aux = {{form = "haben"}, {form = "sein"}} elseif argval == "sh" then base.aux = {{form = "sein"}, {form = "haben"}} elseif not argval then error("Missing auxiliary in 4=") else error("Unrecognized auxiliary 4=" .. argval) end elseif argval and argval ~= "-" then local split_vals = rsplit(argval, "%s*,%s*") for _, val in ipairs(split_vals) do -- FIXME! This won't work with commas or brackets in footnotes. -- To fix this, use functions from [[Module:inflection utilities]]. local form, footnote = val:match("^(.-)%s*(%[[^%]%[]-%])$") local footnotes if form then footnotes = {footnote} else form = val end local slot = numbered_params[paramnum] --if slot:find("subii") then -- local subii_footnotes = get_subii_note(base) -- footnotes = iut.combine_footnotes(subii_footnotes, footnotes) --end iut.insert_form(base.forms, slot, {form = form, footnotes = footnotes}) end end end -- Do the infinitive first as we need to reference it in subjunctive II footnotes. process_numbered_param(1) for paramnum, _ in pairs(numbered_params) do if paramnum ~= 1 then process_numbered_param(paramnum) end end add_composed_forms(base) compute_categories_and_annotation(base, nil, "manual") return base, args.json end -- Entry point for {{de-conj-table}}. Template-callable function to parse and conjugate a verb given -- manually-specified inflections and generate a displayable table of the conjugated forms. function export.show_manual(frame) local parent_args = frame:getParent().args local base, json = export.do_generate_forms_manual(parent_args) if json then return require("Module:JSON").toJSON(base) end show_forms(base) return make_table(base) .. require("Module:utilities").format_categories(base.categories, lang) end return export 8e801zqlat08oagkawzqj9icjjn10jx 별자리 0 271787 2345101 2076551 2026-04-14T03:00:40Z Hiyuune 50834 2345101 wikitext text/x-wiki =={{langname|ko}}== ==={{section|etym}}=== Từ {{com|ko|별|자리}}. ==={{section|pron}}=== {{ko-IPA|l=y}} ==={{section|n}}=== {{ko-noun}} # {{lb|ko|astronomy}} [[chòm sao|Chòm sao]]. #: {{syn|ko|성좌(星座)}} # {{lb|ko|astrology}} {{w|Cung Hoàng Đạo}}. 8hqoffkrj803f47a34uyeqkgzb0k0tn binh vận 0 271815 2344988 2076650 2026-04-13T14:02:17Z Hiyuune 50834 2344988 wikitext text/x-wiki =={{langname|vi}}== ==={{section|pron}}=== {{vi-pron}} ==={{section|v}}=== {{vi-verb}} # [[tuyên truyền|Tuyên truyền]], vận động [[chính trị]] trong [[môi trường]] [[quân đội]]. eqbz6vqi9cfyr6pth6kh8ebjdisulgh Mô đun:languages/data/3/e 828 272285 2344980 2338397 2026-04-13T13:48:48Z Lcsnes 40261 2344980 Scribunto text/plain local m_langdata = require("Module:languages/data") -- Loaded on demand, as it may not be needed (depending on the data). local function u(...) u = require("Module:string utilities").char return u(...) end local c = m_langdata.chars local p = m_langdata.puaChars local s = m_langdata.shared local m = {} m["ebg"] = { "tiếng Ebughu", 35294, "nic-lcr", "Latn", "Tiếng Ebughu", "Ebughu", } m["ebk"] = { "tiếng Đông Bontoc", nil, "phi", "Latn", "Tiếng Đông Bontoc", "Đông Bontoc", } m["ebr"] = { "tiếng Ebrié", 36644, "alv-ptn", "Latn", "Tiếng Ebrié", "Ebrié", } m["ebu"] = { "tiếng Embu", 35318, "bnt-kka", "Latn", "Tiếng Embu", "Embu", } m["ecr"] = { "tiếng Eteocrete", 35461, nil, "Grek", "Tiếng Eteocrete", "Eteocrete", sort_key = s["Grek-sortkey"], } m["ecs"] = { "Ecuadorian Sign Language", 3436769, "sgn", "Latn", -- when documented } m["ecy"] = { "Eteocypriot", 35309, nil, "Cprt", } m["eee"] = { "tiếng Ai", 35386, "qfa-mix", "Hani, Latn", sort_key = {Hani = "Hani-sortkey"}, "Tiếng Ai", "Ai", } m["efa"] = { "tiếng Efai", 3813297, "nic-ief", "Latn", "Tiếng Efai", "Efai", } m["efe"] = { "tiếng Efe", 56354, "csu-mle", "Latn", "Tiếng Efe", "Efe", } m["efi"] = { "tiếng Efik", 35377, "nic-ief", "Latn", "Tiếng Efik", "Efik", } m["ega"] = { "tiếng Ega", 3914927, "alv", "Latn", "Tiếng Ega", "Ega", } m["egl"] = { "tiếng Emilia", 1057898, "roa-git", "Latn", "Tiếng Emilia", "Emilia", wikimedia_codes = "eml", } m["ego"] = { "tiếng Eggon", 35300, "nic-pls", "Latn", "Tiếng Eggon", "Eggon", } m["egy"] = { "tiếng Ai Cập", 50868, "egx", "Latn, Egyp, Egyh", "Tiếng Ai Cập", "Ai Cập", sort_key = { remove_diacritics = "'%-%s", from = {"ꜣ", "j", "y", "ꜥ", "w", "b", "p", "f", "m", "n", "r", "ḥ", "ḫ", "ẖ", "h", "z", "š", "s", "q", "k", "g", "ṯ", "t", "ḏ", "d", "%."}, to = {p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[13], p[14], p[15], p[12], p[16], p[18], p[17], p[19], p[20], p[21], p[23], p[22], p[25], p[24], p[26]} }, } m["ehu"] = { "tiếng Ehueun", 3441392, "alv-nwd", "Latn", "Tiếng Ehueun", "Ehueun", } m["eip"] = { "tiếng Eipomek", 5349839, "ngf", "Latn", "Tiếng Eipomek", "Eipomek", } m["eit"] = { "tiếng Eitiep", 5350030, "qfa-tor", "Latn", "Tiếng Eitiep", "Eitiep", } m["eiv"] = { "tiếng Askopan", 56324, "paa-nbo", "Latn", "Tiếng Askopan", "Askopan", } m["eja"] = { "Ejamat", 6269820, "alv-jfe", "Latn", "Tiếng Ejamat", "Ejamat", } m["eka"] = { "Ekajuk", 35250, "nic-eko", "Latn", } m["eke"] = { "Ekit", 3509628, "nic-ief", "Latn", } m["ekg"] = { "Ekari", 5350305, "ngf", "Latn", } m["eki"] = { "Eki", 5350418, "nic-ief", "Latn", } m["ekl"] = { "tiếng Kolhe", 6426945, "mun", "Beng, Latn", "Tiếng Kolhe", "Kolhe", } m["ekm"] = { "Elip", 12952414, "nic-ymb", "Latn", } m["eko"] = { "Koti", 29930, "bnt-mak", "Latn", } m["ekp"] = { "Ekpeye", 35254, "alv-igb", "Latn", } m["ekr"] = { "Yace", 36901, "alv-ido", "Latn", } m["eky"] = { "tiếng Đông Kayah", 25559417, "kar", "Kali, Thai", "Tiếng Đông Kayah", "Đông Kayah", } m["ele"] = { "Elepi", 5359444, "qfa-tor", "Latn", } m["elh"] = { "El Hugeirat", 5351410, "nub-hil", "Latn", } m["eli"] = { "Nding", 36176, "alv-tal", "Latn", } m["elk"] = { "Elkei", 5364210, "qfa-tor", "Latn", } m["elm"] = { "Eleme", 3914427, "nic-ogo", "Latn", } m["elo"] = { "tiếng El Molo", 56719, "cus-eas", "Latn", "Tiếng El Molo", "El Molo", } m["elu"] = { "Elu", 3364594, "poz-aay", "Latn", } m["elx"] = { "tiếng Elam", 35470, "qfa-iso", "Xsux", "Tiếng Elam", "Elam", } m["ema"] = { "Emai", 35428, "alv-eeo", "Latn", } m["emb"] = { "Embaloh", 5369424, "poz", "Latn", } m["eme"] = { "Emerillon", 3588942, "tup-gua", "Latn", } m["emg"] = { "Eastern Meohang", 12952840, "sit-kie", "Deva", } m["emi"] = { "Mussau-Emira", 6943093, "poz-ocw", "Latn", } m["emk"] = { "Eastern Maninkakan", 11002130, "dmn-mnk", "Latn, Arab, Nkoo", } m["emm"] = { "Mamulique", 3285082, "nai-pak", "Latn", } m["emn"] = { "Eman", 5368975, "nic-tvc", "Latn", } m["emp"] = { "tiếng Bắc Emberá", 2391297, "sai-chc", "Latn", "Tiếng Bắc Emberá", "Bắc Emberá", } m["ems"] = { "Alutiiq", 27992, "ypk", "Latn", } m["emu"] = { "Eastern Muria", 12952883, "dra-mur", } m["emw"] = { "Emplawas", 5374265, "poz-tim", "Latn", } m["emx"] = { "Erromintxela", 1122188, "qfa-mix", "Latn", ancestors = "eu, rom", } m["emy"] = { "Epigraphic Mayan", 301355, "myn", "Latn, Maya", } m["ena"] = { "Apali", 3504201, "ngf-mad", "Latn", } m["enb"] = { "Markweeta", 56874, "sdv-nma", "Latn", } m["enc"] = { "tiếng Nùng Vẻn", 3504110, "qfa-buy", "Latn", "Tiếng Nùng Vẻn", "Nùng Vẻn" } m["end"] = { "Ende", 2067656, "poz-cet", "Latn", } m["enf"] = { "tiếng Enets rừng", 30249597, "syd", "Cyrl", "Tiếng Enets rừng", "Enets rừng", } m["enh"] = { "tiếng Enets lãnh nguyên", 25559411, "syd", "Cyrl", "Tiếng Enets lãnh nguyên", "Enets lãnh nguyên", } m["enl"] = { "Enlhet", 15462671, "sai-mas", "Latn", } m["enm"] = { "tiếng Anh trung đại", 36395, "gmw-ang", "Latn", "Tiếng Anh trung đại", "Anh trung đại", entry_name = {remove_diacritics = c.acute .. c.macron .. c.dotabove}, } m["enn"] = { "tiếng Engenni", 3915365, "alv-dlt", "Latn", "Tiếng Engenni", "Engenni", } m["eno"] = { "Enggano", 2669164, "poz", "Latn", } m["enq"] = { "Enga", 1143040, "paa-eng", "Latn", } m["enr"] = { "Emem", 5370369, "paa-pau", } m["enu"] = { "Enu", 5380858, "tbq-bka", } m["env"] = { "Enwan", 3438334, "alv-yek", "Latn", } m["enw"] = { "Enwang", 11134434, "nic-lcr", "Latn", } m["enx"] = { "Enxet", 15462609, "sai-mas", "Latn", } m["eot"] = { "tiếng Eotile", 3915347, "alv-ptn", "Latn", "Tiếng Eotile", "Eotile", } m["epi"] = { "tiếng Epie", 35291, "alv-dlt", "Latn", "Tiếng Epie", "Epie", } m["era"] = { "tiếng Eravalla", 5385061, "dra-tam", "Taml", "Tiếng Eravalla", "Eravalla", translit = "ta-translit", } m["erg"] = { "Sie", 426254, "poz-occ", "Latn", } m["erh"] = { "Eruwa", 3441244, "alv-swd", "Latn", } m["eri"] = { "Ogea", 7079984, "ngf-mad", "Latn", } m["erk"] = { "tiếng Efate Nam", 3449070, "poz-vnc", "Latn", "Tiếng Efate Nam", "Efate Nam", } m["ero"] = { "tiếng Horpa", 56854, "sit-rgy", nil, "Tiếng Horpa", "Horpa", } m["err"] = { "Erre", 10488401, "qfa-iso", "Latn", } m["ers"] = { "tiếng Nhĩ Tô", 12952417, "sit-qia", "Latn", -- also Ersu Shaba "Tiếng Nhĩ Tô", "Nhĩ Tô", } m["ert"] = { "Eritai", 56376, "paa-lkp", "Latn", } m["erw"] = { "Erokwanas", 5395296, "poz-hce", "Latn", } m["ese"] = { "Ese Ejja", 2980381, "sai-tac", "Latn", } m["esh"] = { "Eshtehardi", 12952418, "xme-ttc", "fa-Arab, Latn", ancestors = "xme-ttc-sou", } -- "esi" and "esk" moved to etymology-only per [[WT:LT]] and [[Wiktionary:Beer_parlour/2023/August#Issues_regarding_the_Inuit_languages]] m["esl"] = { "Egyptian Sign Language", 5348443, "sgn", } m["esm"] = { "Esuma", 16927555, "alv-kwa", "Latn", } m["esn"] = { "Salvadoran Sign Language", 7406492, "sgn", "Latn", -- when documented } m["eso"] = { "Estonian Sign Language", 3196221, "sgn", "Latn", -- when documented } m["esq"] = { "Esselen", 1294243, "qfa-iso", "Latn", } m["ess"] = { "tiếng Yupik Trung Siberia", 27993, "ypk", "Cyrl", "Tiếng Yupik Trung Siberia", "Yupik Trung Siberia", } m["esu"] = { "tiếng Yup'ik", 21117, "ypk", "Latn", "Tiếng Yup'ik", "Yup'ik", } m["esy"] = { "Eskayan", 867086, "art", "Latn", -- also its own native script } m["etb"] = { "Etebi", 11002851, "nic-ief", "Latn", } m["etc"] = { "Etchemin", 5402493, "alg-eas", "Latn", } m["eth"] = { "Ethiopian Sign Language", 3501903, "sgn", } m["etn"] = { "Eton (Vanuatu)", 3059362, "poz-oce", "Latn", } m["eto"] = { "Eton (Cameroon)", 35317, "bnt-btb", "Latn", } m["etr"] = { "Edolo", 5340184, "ngf", "Latn", } m["ets"] = { "Yekhee", 3915848, "alv-yek", "Latn", } m["ett"] = { "tiếng Etrusca", 35726, "qfa-tyn", "Ital", "Tiếng Etrusca", "Etrusca", translit = "Ital-translit", } m["etu"] = { "tiếng Ejagham", 35296, "nic-eko", "Latn", "Tiếng Ejagham", "Ejagham", } m["etx"] = { "Eten", 3915392, "nic-beo", "Latn", } m["etz"] = { "Semimi", 10950308, "paa-mai", "Latn", } m["eve"] = { "tiếng Even", 29960, "tuw-ewe", "Cyrl, Latn", "Tiếng Even", "Even", translit = {Cyrl = "eve-translit"}, entry_name = {remove_diacritics = c.macron .. c.dotabove .. c.dotbelow}, sort_key = { Cyrl = { from = { "ӫ", -- 2 chars "ё", "ӈ", "ө" -- 1 char }, to = { "о" .. p[2], "е" .. p[1], "н" .. p[1], "о" .. p[1] }, }, }, } m["evh"] = { "tiếng Uvbie", 3441344, "alv-swd", "Latn", "Tiếng Uvbie", "Uvbie", } m["evn"] = { "tiếng Evenk", 30004, "tuw-ewe", "Cyrl", "Tiếng Evenk", "Evenk", translit = "evn-translit", entry_name = {remove_diacritics = c.macron .. c.dotabove .. c.dotbelow}, sort_key = { from = {"ё", "ӈ"}, to = {"е" .. p[1], "н" .. p[1]} }, } m["ewo"] = { "Ewondo", 35459, "bnt-btb", "Latn", } m["ext"] = { "Extremaduran", 30007, "roa-ibe", "Latn", } m["eya"] = { "Eyak", 27480, "xnd", "Latn", } m["eyo"] = { "Keiyo", 56856, "sdv-nma", "Latn", } m["eza"] = { "Ezaa", 11921436, "alv-igb", "Latn", ancestors = "izi", } m["eze"] = { "Uzekwe", 3502244, "nic-ucn", "Latn", } return require("Module:languages").finalizeData(m, "language") tmeo1i84ntteg9luup5om2c46qcpw4v ꩬွင် 0 273082 2344931 2312240 2026-04-13T12:16:45Z Hiyuune 50834 /* Tiếng Aiton */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344931 wikitext text/x-wiki =={{langname|aio}}== ==={{section|etym}}=== {{inh+|aio|tai-swe-pro|*sɔːŋᴬ¹}} (Jonsson, 1991), từ {{inh|aio|tai-pro|*soːŋᴬ}}, từ {{der|aio|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|twh|ꪎꪮꪉ}}, {{cog|tyr|ꪎꪮꪉ}}, {{cog|shn|သွင်}}, {{cog|tdd|ᥔᥩᥒᥴ}}, {{cog|tjl|ꩬွꩼင်}}, {{cog|kht|ꩬွင်}}, {{cog|phk|ꩬွင်}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}, {{cog|tyz|sloong}}. ==={{section|num}}=== {{head|aio|Số từ}} # [[hai|Hai]]. =={{langname|phk}}== ==={{ĐM|num}}=== {{head|phk|Số từ}} # [[hai]]. 33qa7rubec3vjv657ezm5y2s80uf27h 2344932 2344931 2026-04-13T12:18:42Z Hiyuune 50834 /* Tiếng Phake */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344932 wikitext text/x-wiki =={{langname|aio}}== ==={{section|etym}}=== {{inh+|aio|tai-swe-pro|*sɔːŋᴬ¹}} (Jonsson, 1991), từ {{inh|aio|tai-pro|*soːŋᴬ}}, từ {{der|aio|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|twh|ꪎꪮꪉ}}, {{cog|tyr|ꪎꪮꪉ}}, {{cog|shn|သွင်}}, {{cog|tdd|ᥔᥩᥒᥴ}}, {{cog|tjl|ꩬွꩼင်}}, {{cog|kht|ꩬွင်}}, {{cog|phk|ꩬွင်}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}, {{cog|tyz|sloong}}. ==={{section|num}}=== {{head|aio|Số từ}} # [[hai|Hai]]. =={{langname|kht}}== ==={{section|etym}}=== {{inh+|kht|tai-swe-pro|*sɔːŋᴬ¹}} (Jonsson, 1991), từ {{inh|kht|tai-pro|*soːŋᴬ}}, từ {{der|kht|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|twh|ꪎꪮꪉ}}, {{cog|tyr|ꪎꪮꪉ}}, {{cog|shn|သွင်}}, {{cog|tdd|ᥔᥩᥒᥴ}}, {{cog|tjl|ꩬွꩼင်}}, {{cog|aio|ꩬွင်}}, {{cog|phk|ꩬွင်}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}, {{cog|tyz|sloong}}. ==={{section|num}}=== {{head|kht|Số từ}} # [[hai|Hai]]. =={{langname|phk}}== ==={{section|etym}}=== {{inh+|phk|tai-swe-pro|*sɔːŋᴬ¹}} (Jonsson, 1991), từ {{inh|phk|tai-pro|*soːŋᴬ}}, từ {{der|phk|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|twh|ꪎꪮꪉ}}, {{cog|tyr|ꪎꪮꪉ}}, {{cog|shn|သွင်}}, {{cog|tdd|ᥔᥩᥒᥴ}}, {{cog|tjl|ꩬွꩼင်}}, {{cog|kht|ꩬွင်}}, {{cog|aio|ꩬွင်}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}, {{cog|tyz|sloong}}. ==={{section|num}}=== {{head|phk|Số từ}} # [[hai|Hai]]. mqewejd052b54hrmi4wor5s98xcci7h ca cảl 0 273310 2345041 2080572 2026-04-14T00:37:13Z Hiyuune 50834 2345041 wikitext text/x-wiki =={{langname|mtq}}== ==={{section|n}}=== {{mtq-noun}} # {{lb|mtq|Mường Bi}} [[gà|Gà]] [[gáy]]. ==={{section|ref}}=== * {{R:Nguyễn Văn Khang, Bùi Chỉ, Hoàng Văn Hành 2002}} {{C|mtq|Gà}} 6b7apj8rwlge4yahw2rgq04nhip2dk2 ca chỏl 0 273311 2345044 2080575 2026-04-14T00:38:37Z Hiyuune 50834 2345044 wikitext text/x-wiki =={{langname|mtq}}== ==={{section|n}}=== {{mtq-noun}} # {{lb|mtq|Mường Bi}} [[gà trống|Gà trống]]. #: {{syn|mtq|ca khổng}} ==={{section|ref}}=== * {{R:Nguyễn Văn Khang, Bùi Chỉ, Hoàng Văn Hành 2002}} {{C|mtq|Gà}} ilzgfwbrpnkt4p2296kesga73ayeqwv ca dò 0 273312 2345047 2080574 2026-04-14T00:40:52Z Hiyuune 50834 2345047 wikitext text/x-wiki =={{langname|mtq}}== ==={{section|n}}=== {{mtq-noun}} # {{lb|mtq|Mường Bi}} [[gà|Gà]] [[giò]]. ==={{section|ref}}=== * {{R:Nguyễn Văn Khang, Bùi Chỉ, Hoàng Văn Hành 2002}} {{C|mtq|Gà}} 29u21f6f3649b8pvs2cdfhty04xyu2y ᦃᦲᧄ 0 275145 2344933 2086089 2026-04-13T12:23:45Z Hiyuune 50834 2344933 wikitext text/x-wiki =={{langname|khb}}== ==={{section|etym}}=== Từ {{inh|khb|tai-pro|*qemᴬ||kim}}, từ {{der|khb|och|-}} {{och-l|針|tr=*t.[k]əm}}. Cùng gốc với {{cog|th|เข็ม}}, {{cog|lo|ເຂັມ}}, {{cog|blt|ꪹꪄꪸꪣ}}, {{cog|shn|ၶဵမ်}}, {{cog|tdd|ᥑᥥᥛᥴ}} hoặc {{mention|tdd|ᥔᥥᥛᥴ}}, {{cog|aho|𑜁𑜢𑜉𑜫}}, {{cog|za|cim}} hoặc {{mention|za|caemz}}, {{cog|zhn|chaem}}. So sánh với {{cog|vi|kim}}. ==={{section|pron}}=== {{khb-pron}} * {{rhymes|khb|im|s=1}} ==={{section|n}}=== {{khb-noun|ᦜᦲᧄᧉ}} # [[kim|Kim]] (đồ dùng để khâu hay thêu). ===={{section|drv}}==== {{col2|khb |ᦂᦸᧂᧉᦃᦲᧄ |ᦃᦲᧄᦃᦸ |ᦃᦲᧄᦋᦲᧉᦠᦳᧃ |ᦔᦱᦃᦲᧄ |ᦚᧂᦃᦲᧄ }} ==={{section|ref}}=== * {{R:khb:Hanna}} 48y46d3mwg776onk9721xb3o70i3r7o Mô đun:ca-headword 828 281212 2344959 2340323 2026-04-13T12:58:29Z Hiyuune 50834 2344959 Scribunto text/plain local export = {} local pos_functions = {} local force_cat = false -- for testing; if true, categories appear in non-mainspace pages local require_when_needed = require("Module:utilities/require when needed") local m_table = require("Module:table") local com = require("Module:ca-common") local ca_IPA_module = "Module:ca-IPA" local ca_verb_module = "Module:ca-verb" local en_utilities_module = "Module:en-utilities" local headword_utilities_module = "Module:headword utilities" local inflection_utilities_module = "Module:inflection utilities" local parse_utilities_module = "Module:parse utilities" local romut_module = "Module:romance utilities" local m_en_utilities = require_when_needed(en_utilities_module) local m_headword_utilities = require_when_needed(headword_utilities_module) local m_string_utilities = require_when_needed("Module:string utilities") local glossary_link = require_when_needed(headword_utilities_module, "glossary_link") local lang = require("Module:languages").getByCode("ca") local langname = lang:getCanonicalName() local list_to_text = mw.text.listToText local insert = table.insert local concat = table.concat local rfind = m_string_utilities.find local rmatch = m_string_utilities.match local rsplit = m_string_utilities.split local usub = m_string_utilities.sub local rsub = com.rsub local function track(page) require("Module:debug/track")("ca-headword/" .. page) return true end local list_param = {list = true, disallow_holes = true} local boolean_param = {type = "boolean"} ----------------------------------------------------------------------------------------- -- Main entry point -- ----------------------------------------------------------------------------------------- -- The main entry point. -- This is the only function that can be invoked from a template. function export.show(frame) local poscat = frame.args[1] or error("Từ loại không được chỉ định. Vui lòng thêm tham số đầu tiên để gọi mô đun.") local params = { ["head"] = list_param, ["id"] = true, ["splithyph"] = boolean_param, ["nolinkhead"] = boolean_param, ["json"] = boolean_param, ["pagename"] = true, -- for testing } if pos_functions[poscat] then for key, val in pairs(pos_functions[poscat].params) do params[key] = val end end local args = require("Module:parameters").process(frame:getParent().args, params) local pagename = args.pagename or mw.loadData("Module:headword/data").pagename local user_specified_heads = args.head local heads = user_specified_heads if args.nolinkhead then if #heads == 0 then heads = {pagename} end else local romut = require(romut_module) local auto_linked_head = romut.add_links_to_multiword_term(pagename, args.splithyph) if #heads == 0 then heads = {auto_linked_head} else for i, head in ipairs(heads) do if head:find("^~") then head = romut.apply_link_modifiers(auto_linked_head, usub(head, 2)) heads[i] = head end if head == auto_linked_head then track("redundant-head") end end end end local data = { lang = lang, pos_category = pos_functions[poscat] and pos_functions[poscat].pos_category or poscat, categories = {}, heads = heads, user_specified_heads = user_specified_heads, no_redundant_head_cat = #user_specified_heads == 0, genders = {}, inflections = {}, pagename = pagename, id = args.id, force_cat_output = force_cat, checkredlinks = pos_functions[poscat] and pos_functions[poscat].redlink_pos or true, } if pagename:find("^%-") and poscat ~= "Biến thể hình thái hậu tố" then data.is_suffix = true data.pos_category = "Hậu tố" data.checkredlinks = true local singular_poscat = require(en_utilities_module).singularize(poscat) insert(data.categories, "Dạng hậu tố " .. singular_poscat .. " " .. langname) insert(data.inflections, {label = "dạng hậu tố " .. singular_poscat}) end if pos_functions[poscat] then pos_functions[poscat].func(args, data) end if args.json then return require("Module:JSON").toJSON(data) end local post_note = data.post_note and "; " .. data.post_note or "" return require("Module:headword").full_headword(data) .. post_note end ----------------------------------------------------------------------------------------- -- Utility functions -- ----------------------------------------------------------------------------------------- local function replace_hash_with_lemma(term, lemma) -- If there is a % sign in the lemma, we have to replace it with %% so it doesn't get interpreted as a capture replace -- expression. lemma = lemma:gsub("%%", "%%%%") -- Assign to a variable to discard second return value. term = term:gsub("#", lemma) return term end -- Parse and insert an inflection not requiring additional processing into `data.inflections`. The raw arguments come -- from `args[field]`, which is parsed for inline modifiers. `label` is the label that the inflections are given; -- `accel` is the accelerator form, or nil. local function parse_and_insert_inflection(data, args, field, label, accel) m_headword_utilities.parse_and_insert_inflection { headdata = data, forms = args[field], paramname = field, splitchar = ",", label = label, accel = accel and {form = accel} or nil, } end -- Insert default plurals generated when a given plural had the value of + and default plurals were fetched as a result. -- `plobj` is the parsed object whose `term` field is "+". `defpls` is the list of default plurals. `dest` is the list -- into which the plurals are inserted (which inherit their qualifiers and labels from `plobj`). local function insert_defpls(defpls, plobj, dest) if not defpls then -- Happens e.g. with [[S.A.]] where the default plural algorithm returns nothing. return end if #defpls == 1 then plobj.term = defpls[1] insert(dest, plobj) else for _, defpl in ipairs(defpls) do local newplobj = m_table.shallowCopy(plobj) newplobj.term = defpl insert(dest, newplobj) end end end ----------------------------------------------------------------------------------------- -- Adjectives -- ----------------------------------------------------------------------------------------- local function do_adjective(args, data, is_superlative) local feminines = {} local masculine_plurals = {} local feminine_plurals = {} -- Use "participle" not "past participle" for categories such as 'invariable paticiples' local category_plpos = data.checkredlinks if category_plpos == true then category_plpos = data.pos_category end local category_pos = m_en_utilities.singularize(category_plpos) if args.sp then local romut = require(romut_module) if not romut.allowed_special_indicators[args.sp] then local indicators = {} for indic, _ in pairs(romut.allowed_special_indicators) do insert(indicators, "'" .. indic .. "'") end table.sort(indicators) error("Special inflection indicator beginning can only be " .. list_to_text(indicators) .. ": " .. args.sp) end end local lemma = data.pagename local function fetch_inflections(field) local retval = m_headword_utilities.parse_term_list_with_modifiers { paramname = field, forms = args[field], splitchar = ",", } if not retval[1] then return {{term = "+"}} end return retval end local function insert_inflection(terms, label, accel) m_headword_utilities.insert_inflection { headdata = data, terms = terms, label = label, accel = accel and {form = accel} or nil, } end if args.f[1] == "ind" or args.f[1] == "inv" then -- invariable adjective insert(data.inflections, {label = glossary_link("không biến cách")}) insert(data.categories, category_plpos .. " không biến cách " .. langname) if args.sp or args.f[2] or args.pl[1] or args.mpl[1] or args.fpl[1] then error("Can't specify inflections with an invariable " .. category_pos) end elseif args.fonly then -- feminine-only if args.f[1] then error("Can't specify explicit feminines with feminine-only " .. category_pos) end if args.pl[1] then error("Can't specify explicit plurals with feminine-only " .. category_pos .. ", use fpl=") end if args.mpl[1] then error("Can't specify explicit masculine plurals with feminine-only " .. category_pos) end local argsfpl = fetch_inflections("fpl") for _, fpl in ipairs(argsfpl) do if fpl.term == "+" then -- Generate default feminine plural. local defpls = com.make_plural(lemma, "f", args.sp) if not defpls then error("Unable to generate default plural of '" .. lemma .. "'") end insert_defpls(defpls, fpl, feminine_plurals) else fpl.term = replace_hash_with_lemma(fpl.term, lemma) insert(feminine_plurals, fpl) end end insert(data.inflections, {label = "chỉ có giống cái"}) insert_inflection(feminine_plurals, "giống cái số nhiều", "f|p") else -- Gather feminines. for _, f in ipairs(fetch_inflections("f")) do if f.term == "mf" then f.term = lemma elseif f.term == "+" then -- Generate default feminine. f.term = com.make_feminine(lemma, args.sp) else f.term = replace_hash_with_lemma(f.term, lemma) end insert(feminines, f) end local fem_like_lemma = #feminines == 1 and feminines[1].term == lemma and not m_headword_utilities.termobj_has_qualifiers_or_labels(feminines[1]) if fem_like_lemma then insert(data.categories, category_plpos .. " giống đôi " .. langname) end local mpl_field = "mpl" local fpl_field = "fpl" if args.pl[1] then if args.mpl[1] or args.fpl[1] then error("Can't specify both pl= and mpl=/fpl=") end mpl_field = "pl" fpl_field = "pl" end local argsmpl = fetch_inflections(mpl_field) local argsfpl = fetch_inflections(fpl_field) for _, mpl in ipairs(argsmpl) do if mpl.term == "+" then -- Generate default masculine plural. local defpls -- First, some special hacks based on the feminine singular. if not fem_like_lemma and not args.sp and not lemma:find(" ") then for _, f in ipairs(feminines) do if f.term:find("ssa$") then -- If the feminine ends in -ssa, assume that the -ss- is also in the -- masculine plural form defpls = {rsub(f.term, "a$", "os")} break elseif f.term == lemma .. "na" then defpls = {lemma .. "ns"} break elseif lemma:find("ig$") and f.term:find("ja$") then -- Adjectives in -ig have two masculine plural forms, one derived from -- the m.sg. and the other derived from the f.sg. defpls = {lemma .. "s", rsub(f.term, "ja$", "jos")} break end end end defpls = defpls or com.make_plural(lemma, "m", args.sp) if not defpls then error("Unable to generate default plural of '" .. lemma .. "'") end insert_defpls(defpls, mpl, masculine_plurals) else mpl.term = replace_hash_with_lemma(mpl.term, lemma) insert(masculine_plurals, mpl) end end for _, fpl in ipairs(argsfpl) do if fpl.term == "+" then -- First, some special hacks based on the feminine singular. if fem_like_lemma and not args.sp and not lemma:find(" ") and lemma:find("[çx]$") then -- Adjectives ending in -ç or -x behave as mf-type in the singular, but -- regular type in the plural. local defpls = com.make_plural(lemma .. "a", "f") if not defpls then error("Unable to generate default plural of '" .. lemma .. "a'") end insert_defpls(defpls, fpl, feminine_plurals) else for _, f in ipairs(feminines) do -- Generate default feminine plural; f is a table. local defpls = com.make_plural(f.term, "f", args.sp) if not defpls then error("Unable to generate default plural of '" .. f.term .. "'") end for _, defpl in ipairs(defpls) do local fplobj = m_table.shallowCopy(fpl) fplobj.term = defpl m_headword_utilities.combine_termobj_qualifiers_labels(fplobj, f) insert(feminine_plurals, fplobj) end end end else fpl.term = replace_hash_with_lemma(fpl.term, lemma) insert(feminine_plurals, fpl) end end local fem_pl_like_masc_pl = masculine_plurals[1] and feminine_plurals[1] and m_table.deepEquals(masculine_plurals, feminine_plurals) local masc_pl_like_lemma = #masculine_plurals == 1 and masculine_plurals[1].term == lemma and not m_headword_utilities.termobj_has_qualifiers_or_labels(masculine_plurals[1]) if fem_like_lemma and fem_pl_like_masc_pl and masc_pl_like_lemma then -- actually invariable insert(data.inflections, {label = glossary_link("không biến cách")}) insert(data.categories, category_plpos .. " không biến cách " .. langname) else -- Make sure there are feminines given and not same as lemma. if not fem_like_lemma then insert_inflection(feminines, "giống cái", "f|s") elseif args.gneut then data.genders = {"gneut"} else data.genders = {"mf"} end if fem_pl_like_masc_pl then if args.gneut then insert_inflection(masculine_plurals, "số nhiều", "p") else insert_inflection(masculine_plurals, "giống đực và giống cái số nhiều", "p") end else insert_inflection(masculine_plurals, "giống đực số nhiều", "m|p") insert_inflection(feminine_plurals, "giống cái số nhiều", "f|p") end end end parse_and_insert_inflection(data, args, "comp", "so sánh hơn") parse_and_insert_inflection(data, args, "sup", "so sánh nhất") parse_and_insert_inflection(data, args, "dim", "giảm nhẹ nghĩa") parse_and_insert_inflection(data, args, "aug", "tăng kich") if args.irreg and is_superlative then insert(data.categories, category_plpos .. " so sánh nhất bất quy tắc " .. langname) end end local function get_adjective_params(adjtype) local params = { ["sp"] = true, -- special indicator: "first", "first-last", etc. ["f"] = list_param, --feminine form(s) [1] = {alias_of = "f", list = false}, ["pl"] = list_param, --plural override(s) ["mpl"] = list_param, --masculine plural override(s) ["fpl"] = list_param, --feminine plural override(s) } if adjtype == "base" then params["comp"] = list_param --comparative(s) params["sup"] = list_param --superlative(s) params["dim"] = list_param --diminutive(s) params["aug"] = list_param --augmentative(s) params["fonly"] = boolean_param -- feminine only params["hascomp"] = {} -- has comparative end if adjtype == "sup" then params["irreg"] = boolean_param end return params end -- Display additional inflection information for an adjective pos_functions["Tính từ"] = { params = get_adjective_params("base"), func = do_adjective, } pos_functions["Phân từ quá khứ"] = { params = get_adjective_params("part"), func = do_adjective, redlink_pos = "Phân từ", } pos_functions["Từ hạn định"] = { params = get_adjective_params("det"), func = do_adjective, } pos_functions["Đại từ"] = { params = get_adjective_params("pron"), func = do_adjective, } ----------------------------------------------------------------------------------------- -- Nouns -- ----------------------------------------------------------------------------------------- local allowed_genders = m_table.listToSet( {"m", "f", "mf", "mfbysense", "mfequiv", "gneut", "n", "m-p", "f-p", "mf-p", "mfbysense-p", "mfequiv-p", "gneut-p", "n-p", "?", "?-p"} ) local function validate_genders(genders) for _, g in ipairs(genders) do if type(g) == "table" then g = g.spec end if not allowed_genders[g] then error("Không rõ giống: " .. g) end end end local function do_noun(args, data, is_proper) local is_plurale_tantum = false local has_singular = false local category_plpos = data.checkredlinks if category_plpos == true then category_plpos = data.pos_category end local category_pos = m_en_utilities.singularize(category_plpos) validate_genders(args[1]) data.genders = args[1] local saw_m = false local saw_f = false local saw_gneut = false local gender_for_irreg_ending, gender_for_default_plural -- Check for specific genders and pluralia tantum. for _, g in ipairs(args[1]) do if type(g) == "table" then g = g.spec end if g:find("-p$") then is_plurale_tantum = true else has_singular = true if g == "m" or g == "mf" or g == "mfbysense" then saw_m = true end if g == "f" or g == "mf" or g == "mfbysense" then saw_f = true end if g == "gneut" then saw_gneut = true end end end if saw_m and saw_f then gender_for_irreg_ending = "mf" elseif saw_f then gender_for_irreg_ending = "f" else gender_for_irreg_ending = "m" end gender_for_default_plural = saw_gneut and "gneut" or gender_for_irreg_ending == "mf" and "m" or gender_for_irreg_ending local lemma = data.pagename -- Plural local plurals = {} local function insert_noun_inflection(terms, label, accel) m_headword_utilities.insert_inflection { headdata = data, terms = terms, label = label, accel = accel and {form = accel} or nil, } end if is_plurale_tantum and not has_singular then if args[2][1] then error("Can't specify plurals of plurale tantum " .. category_pos) end insert(data.inflections, {label = glossary_link("chỉ có số nhiều")}) else plurals = m_headword_utilities.parse_term_list_with_modifiers { paramname = {2, "pl"}, forms = args[2], splitchar = ",", } -- Check for special plural signals local mode = nil local pl1 = plurals[1] if pl1 and #pl1.term == 1 then mode = pl1.term if mode == "?" or mode == "!" or mode == "-" or mode == "~" then pl1.term = nil if next(pl1) then error(("Can't specify inline modifiers with plural code '%s'"):format(mode)) end table.remove(plurals, 1) -- Remove the mode parameter elseif mode ~= "+" and mode ~= "#" then error(("Unexpected plural code '%s'"):format(mode)) end end if is_plurale_tantum then -- both singular and plural insert(data.inflections, {label = "đôi khi " .. glossary_link("chỉ có số nhiều") .. ", trong biến thể"}) end if mode == "?" then -- Plural is unknown insert(data.categories, category_plpos .. " số nhiều chưa được chứng thực hoặc không rõ " .. langname) elseif mode == "!" then -- Plural is not attested insert(data.inflections, {label = "số nhiều chưa được chứng thực"}) insert(data.categories, category_plpos .. " số nhiều chưa được chứng thực " .. langname) if plurals[1] then error("Can't specify any plurals along with unattested plural code '!'") end elseif mode == "-" then -- Uncountable noun; may occasionally have a plural insert(data.categories, category_plpos .. " không đếm được " .. langname) -- If plural forms were given explicitly, then show "usually" if plurals[1] then insert(data.inflections, {label = "thường " .. glossary_link("không đếm được")}) insert(data.categories, category_plpos .. " đếm được " .. langname) else insert(data.inflections, {label = glossary_link("không đếm được")}) end else -- Countable or mixed countable/uncountable if not plurals[1] and not is_proper then plurals[1] = {term = "+"} end if mode == "~" then -- Mixed countable/uncountable noun, always has a plural insert(data.inflections, {label = glossary_link("đếm được") .. " và " .. glossary_link("không đếm được")}) insert(data.categories, category_plpos .. " không đếm được " .. langname) insert(data.categories, category_plpos .. " đếm được " .. langname) elseif plurals[1] then -- Countable nouns insert(data.categories, category_plpos .. " đếm được " .. langname) else -- Uncountable nouns insert(data.categories, category_plpos .. " không đếm được " .. langname) end end -- Gather plurals, handling requests for default plurals. local has_default_or_hash = false for _, pl in ipairs(plurals) do if pl.term:find("^%+") or pl.term:find("#") then has_default_or_hash = true break end end if has_default_or_hash then local newpls = {} for _, pl in ipairs(plurals) do if pl.term == "+" then local default_pls = com.make_plural(lemma, gender_for_default_plural) insert_defpls(default_pls, pl, newpls) elseif pl.term:find("^%+") then pl.term = require(romut_module).get_special_indicator(pl.term) local default_pls = com.make_plural(lemma, gender_for_default_plural, pl.term) insert_defpls(default_pls, pl, newpls) else pl.term = replace_hash_with_lemma(pl.term, lemma) insert(newpls, pl) end end plurals = newpls end local pl1 = plurals[1] if pl1 and not plurals[2] and pl1.term == lemma then insert(data.inflections, {label = glossary_link("không biến cách"), q = pl1.q, qq = pl1.qq, l = pl1.l, ll = pl1.ll, refs = pl1.refs }) insert(data.categories, category_plpos .. " không biến cách " .. langname) else insert_noun_inflection(plurals, "số nhiều", "p") end if plurals[2] then insert(data.categories, category_plpos .. " với nhiều dạng số nhiều" .. langname) end end -- Gather masculines/feminines. For each one, generate the corresponding plural. `field` is the name of the field -- containing the masculine or feminine forms (normally "m" or "f"); `inflect` is a function of one or two arguments -- to generate the default masculine or feminine from the lemma (the arguments are the lemma and optionally a -- "special" flag to indicate how to handle multiword lemmas, and the function is normally make_feminine or -- make_masculine from [[Module:ca-common]]); and `default_plurals` is a list into which the corresponding default -- plurals of the gathered or generated masculine or feminine forms are stored. local function handle_mf(field, inflect, default_plurals) local function call_inflect(special) if inflect then -- Generate default feminine. return inflect(lemma, special) else -- FIXME error("Can't generate default masculine currently") end end local mfs = m_headword_utilities.parse_term_list_with_modifiers { paramname = field, forms = args[field], splitchar = ",", frob = function(term) if term == "+" then -- Generate default masculine/feminine. term = call_inflect() else term = replace_hash_with_lemma(term, lemma) end local special = require(romut_module).get_special_indicator(term) if special then term = call_inflect(special) end return term end } for _, mf in ipairs(mfs) do local mfpls = com.make_plural(mf.term, gender, special) if mfpls then for _, mfpl in ipairs(mfpls) do local plobj = m_table.shallowCopy(mf) plobj.term = mfpl -- Add an accelerator for each masculine/feminine plural whose lemma -- is the corresponding singular, so that the accelerated entry -- that is generated has a definition that looks like -- # {{plural of|ca|MFSING}} plobj.accel = {form = "p", lemma = mf.term} table.insert(default_plurals, plobj) end end end return mfs end local feminine_plurals = {} local feminines = handle_mf("f", com.make_feminine, feminine_plurals) local masculine_plurals = {} local masculines = handle_mf("m", com.make_masculine, masculine_plurals) local function handle_mf_plural(mfplfield, default_plurals, singulars) local mfpl = m_headword_utilities.parse_term_list_with_modifiers { paramname = mfplfield, forms = args[mfplfield], splitchar = ",", } local new_mfpls = {} local saw_plus for i, mfpl in ipairs(mfpl) do local accel if #mfpl == #singulars then -- If same number of overriding masculine/feminine plurals as singulars, assume each plural goes with -- the corresponding singular and use each corresponding singular as the lemma in the accelerator. The -- generated entry will have -- # {{plural of|ca|SINGULAR}} -- as the definition. accel = {form = "p", lemma = singulars[i].term} else accel = nil end if mfpl.term == "+" then -- We should never see + twice. If we do, it will lead to problems since we overwrite the values of -- default_plurals the first time around. if saw_plus then error(("Saw + twice when handling %s="):format(mfplfield)) end saw_plus = true if not default_plurals[1] then -- FIXME: Can this happen? Not in corresponding Spanish code and the old Portuguese code tried to -- handle this condition by generating the default plural from the lemma. error("Internal error: Something wrong, no generated default m/f plurals at this stage") end for _, defpl in ipairs(default_plurals) do -- defpl is already a table and has an accel field m_headword_utilities.combine_termobj_qualifiers_labels(defpl, mfpl) insert(new_mfpls, defpl) end elseif mfpl.term:find("^%+") then mfpl.term = require(romut_module).get_special_indicator(mfpl.term) for _, mf in ipairs(singulars) do local default_mfpls = com.make_plural(mf.term, gender, mfpl.term) for _, defp in ipairs(default_mfpls) do local mfplobj = m_table.shallowCopy(mfpl) mfplobj.term = defp mfplobj.accel = accel m_headword_utilities.combine_termobj_qualifiers_labels(mfplobj, mf) insert(new_mfpls, mfplobj) end end else mfpl.accel = accel mfpl.term = replace_hash_with_lemma(mfpl.term, lemma) insert(new_mfpls, mfpl) end end return new_mfpls end if args.fpl[1] then -- Override any existing feminine plurals. feminine_plurals = handle_mf_plural("fpl", feminine_plurals, feminines) end if args.mpl[1] then -- Override any existing masculine plurals. masculine_plurals = handle_mf_plural("mpl", masculine_plurals, masculines) end local function parse_and_insert_noun_inflection(field, label, accel) parse_and_insert_inflection(data, args, field, label, accel) end insert_noun_inflection(feminines, "giống cái", "f") insert_noun_inflection(feminine_plurals, "giống cái số nhiều") insert_noun_inflection(masculines, "giống đực") insert_noun_inflection(masculine_plurals, "giống đực số nhiều") parse_and_insert_noun_inflection("dim", "giảm nhẹ nghĩa") parse_and_insert_noun_inflection("aug", "tăng kích") parse_and_insert_noun_inflection("pej", "nghĩa xấu") parse_and_insert_noun_inflection("dem", "demonym") parse_and_insert_noun_inflection("fdem", "female demonym") -- Is this a noun with an unexpected ending (for its gender)? -- Only check if the term is one word (there are no spaces in the term). local irreg_gender_lemma = rsub(lemma, " .*", "") -- only look at first word if (gender_for_irreg_ending == "m" or gender_for_irreg_ending == "mf") and irreg_gender_lemma:find("a$") then insert(data.categories, category_plpos .. " giống đực kết thúc bằng -a " .. langname) elseif (gender_for_irreg_ending == "f" or gender_for_irreg_ending == "mf") and not ( irreg_gender_lemma:find("a$") or irreg_gender_lemma:find("ió$") or irreg_gender_lemma:find("tat$") or irreg_gender_lemma:find("tud$") or irreg_gender_lemma:find("[dt]riu$")) then insert(data.categories, category_plpos .. " giống cái nhưng không kết thúc bằng giống cái " .. langname) end end local function get_noun_params(is_proper) return { [1] = {list = "g", disallow_holes = true, required = not is_proper, default = "?", type = "genders", flatten = true}, -- gender(s) [2] = {list = "pl", disallow_holes = true}, --plural override(s) ["f"] = list_param, --feminine form(s) ["m"] = list_param, --masculine form(s) ["fpl"] = list_param, --feminine plural override(s) ["mpl"] = list_param, --masculine plural override(s) ["dim"] = list_param, --diminutive(s) ["aug"] = list_param, --diminutive(s) ["pej"] = list_param, --pejorative(s) ["dem"] = list_param, --demonym(s) ["fdem"] = list_param, --female demonym(s) } end pos_functions["Danh từ"] = { params = get_noun_params(), func = do_noun, } pos_functions["Danh từ riêng"] = { params = get_noun_params("is proper"), func = function(args, data) do_noun(args, data, "is proper") end, } ----------------------------------------------------------------------------------------- -- Verbs -- ----------------------------------------------------------------------------------------- pos_functions["Động từ"] = { params = { [1] = true, ["pres"] = list_param, --present ["pres_qual"] = {list = "pres\1_qual", allow_holes = true}, ["pres3s"] = list_param, --third-singular present ["pres3s_qual"] = {list = "pres3s\1_qual", allow_holes = true}, ["pret"] = list_param, --preterite ["pret_qual"] = {list = "pret\1_qual", allow_holes = true}, ["part"] = list_param, --participle ["part_qual"] = {list = "part\1_qual", allow_holes = true}, ["short_part"] = list_param, --short participle ["short_part_qual"] = {list = "short_part\1_qual", allow_holes = true}, ["noautolinktext"] = boolean_param, ["noautolinkverb"] = boolean_param, ["attn"] = boolean_param, ["pres_1_sg"] = true, -- accept any ignore old-style param ["past_part"] = true, -- accept any ignore old-style param ["root"] = true, -- FIXME: Implement root-stressed vowel quality }, func = function(args, data, tracking_categories, frame) local preses, preses_3s, prets, parts, short_parts if args.attn then insert(tracking_categories, "Yêu cầu chú ý liên quan đến " .. langname) return end local ca_verb = require(ca_verb_module) local alternant_multiword_spec = ca_verb.do_generate_forms(args, "ca-verb", data.heads[1]) local specforms = alternant_multiword_spec.forms local function slot_exists(slot) return specforms[slot] and #specforms[slot] > 0 end local function do_finite(slot_tense, label_tense) -- Use pres_3s if it exists and pres_1s doesn't exist (e.g. impersonal verbs); similarly for pres_3p (only3p verbs); -- but fall back to pres_1s if neither pres_1s nor pres_3s nor pres_3p exist (e.g. [[empedernir]]). local has_1s = slot_exists(slot_tense .. "_1s") local has_3s = slot_exists(slot_tense .. "_3s") local has_3p = slot_exists(slot_tense .. "_3p") if has_1s or (not has_3s and not has_3p) then return { slot = slot_tense .. "_1s", label = ("ngôi thứ nhất số ít %s"):format(label_tense), }, true elseif has_3s then return { slot = slot_tense .. "_3s", label = ("ngôi thứ ba số ít %s"):format(label_tense), }, false else return { slot = slot_tense .. "_3p", label = ("ngôi thứ ba số nhiều %s"):format(label_tense), }, false end end local did_pres_1s preses, did_pres_1s = do_finite("pres", "hiện tại") preses_3s = { slot = "pres_3s", label = "hiện tại ở ngôi thứ ba số ít", } prets = do_finite("pret", "quá khứ đơn") parts = { slot = "pp_ms", label = "phân từ quá khứ", } short_parts = { slot = "short_pp_ms", label = "phân từ quá khứ ngắn", } if args.pres[1] or args.pres3s[1] or args.pret[1] or args.part[1] or args.short_part[1] then track("verb-old-multiarg") end local function strip_brackets(qualifiers) if not qualifiers then return nil end local stripped_qualifiers = {} for _, qualifier in ipairs(qualifiers) do local stripped_qualifier = qualifier:match("^%[(.*)%]$") if not stripped_qualifier then error("Lỗi nội bộ: Qualifier should be surrounded by brackets at this stage: " .. qualifier) end insert(stripped_qualifiers, stripped_qualifier) end return stripped_qualifiers end local function do_verb_form(args, qualifiers, slot_desc, skip_if_empty) local forms local to_insert if #args == 0 then forms = specforms[slot_desc.slot] if not forms or #forms == 0 then if skip_if_empty then return end forms = {{form = "-"}} end elseif #args == 1 and args[1] == "-" then forms = {{form = "-"}} else forms = {} for i, arg in ipairs(args) do local qual = qualifiers[i] if qual then -- FIXME: It's annoying we have to add brackets and strip them out later. The inflection -- code adds all footnotes with brackets around them; we should change this. qual = {"[" .. qual .. "]"} end local form = arg if not args.noautolinkverb then -- [[Module:inflection utilities]] already loaded by [[Module:ca-verb]] form = require(inflection_utilities_module).add_links(form) end insert(forms, {form = form, footnotes = qual}) end end if forms[1].form == "-" then to_insert = {label = "no " .. slot_desc.label} else local into_table = {label = slot_desc.label} for _, form in ipairs(forms) do local qualifiers = strip_brackets(form.footnotes) -- Strip redundant brackets surrounding entire form. These may get generated e.g. -- if we use the angle bracket notation with a single word. local stripped_form = rmatch(form.form, "^%[%[([^%[%]]*)%]%]$") or form.form -- Don't include accelerators if brackets remain in form, as the result will be wrong. -- FIXME: For now, don't include accelerators. We should use the new {{ca-verb form of}}. -- local this_accel = not stripped_form:find("%[%[") and accel or nil local this_accel = nil insert(into_table, {term = stripped_form, q = qualifiers, accel = this_accel}) end to_insert = into_table end insert(data.inflections, to_insert) end local skip_pres_if_empty if alternant_multiword_spec.no_pres1_and_sub then insert(data.inflections, {label = "không có hiện tại ở ngôi thứ nhất số ít"}) insert(data.inflections, {label = "không có giả định hiện tại"}) end if alternant_multiword_spec.no_pres_stressed then insert(data.inflections, {label = "không có trần thuật nhấn mạnh hay giả định"}) skip_pres_if_empty = true end if alternant_multiword_spec.only3s then insert(data.inflections, {label = glossary_link("không ngôi")}) elseif alternant_multiword_spec.only3sp then insert(data.inflections, {label = "chỉ có ở ngôi thứ ba"}) elseif alternant_multiword_spec.only3p then insert(data.inflections, {label = "chỉ có ở ngôi thứ ba số ít"}) end local has_vowel_alt if alternant_multiword_spec.vowel_alt then for _, vowel_alt in ipairs(alternant_multiword_spec.vowel_alt) do if vowel_alt ~= "+" and vowel_alt ~= "í" and vowel_alt ~= "ú" then has_vowel_alt = true break end end end do_verb_form(args.pres, args.pres_qual, preses, skip_pres_if_empty) -- We want to include both the pres_1s and pres_3s if there is a vowel alternation in the present singular. But we -- don't want to redundantly include the pres_3s if we already included it. if did_pres_1s and has_vowel_alt then do_verb_form(args.pres3s, args.pres3s_qual, preses_3s, skip_pres_if_empty) end do_verb_form(args.pret, args.pret_qual, prets) do_verb_form(args.part, args.part_qual, parts) do_verb_form(args.short_part, args.short_part_qual, short_parts, "bỏ qua nếu để trống") -- Add categories. for _, cat in ipairs(alternant_multiword_spec.categories) do insert(data.categories, cat) end -- If the user didn't explicitly specify head=, or specified exactly one head (not 2+) and we were able to -- incorporate any links in that head into the 1= specification, use the infinitive generated by -- [[Module:ca-verb]] in place of the user-specified or auto-generated head. This was copied from -- [[Module:it-headword]], where doing this gets accents marked on the verb(s). We don't have accents marked on -- the verb but by doing this we do get any footnotes on the infinitive propagated here. Don't do this if the -- user gave multiple heads or gave a head with a multiword-linked verbal expression such as Italian -- '[[dare esca]] [[al]] [[fuoco]]' (FIXME: give Catalan equivalent). if #data.user_specified_heads == 0 or ( #data.user_specified_heads == 1 and alternant_multiword_spec.incorporated_headword_head_into_lemma ) then data.heads = {} for _, lemma_obj in ipairs(alternant_multiword_spec.forms.infinitive_linked) do local quals, refs = require(inflection_utilities_module). convert_footnotes_to_qualifiers_and_references(lemma_obj.footnotes) insert(data.heads, {term = lemma_obj.form, q = quals, refs = refs}) end end if args.root then local m_ca_IPA = require(ca_IPA_module) local parsed_respellings = {} local function set_parsed_respelling(dialect, parsed) -- Validate the individual root vowel specs. for _, termobj in ipairs(parsed.terms) do if not rfind(termobj.words[1].term, "^" .. m_ca_IPA.mid_vowel_hint_c .. "$") then error(("Root vowel spec '%s' should be one of the vowels %s"):format( termobj.words[1].term, m_ca_IPA.mid_vowel_hints)) end end if not dialect then for _, dial in ipairs(m_ca_IPA.dialects) do -- Need to clone as we destructively modify each one later with the pronun. parsed_respellings[dial] = m_table.deepCopy(parsed) end elseif m_ca_IPA.dialect_groups[dialect] then for _, dial in ipairs(m_ca_IPA.dialect_groups[dialect]) do -- Need to clone as we destructively modify each one later with the pronun. parsed_respellings[dial] = m_table.deepCopy(parsed) end else parsed_respellings[dialect] = parsed end end local function check_dialect_or_dialect_group(dialect) if not m_table.contains(m_ca_IPA.dialects, dialect) and not m_ca_IPA.dialect_groups[dialect] then local dialect_list = {} for _, dial in ipairs(m_ca_IPA.dialects) do insert(dialect_list, "'" .. dial .. "'") end dialect_list = list_to_text(dialect_list, nil, " hoặc ") local dialect_group_list = {} for dialect_group, _ in pairs(m_ca_IPA.dialect_groups) do insert(dialect_group_list, "'" .. dialect_group .. "'") end dialect_group_list = list_to_text(dialect_group_list, nil, " hoặc ") error(("Không rõ phương ngữ '%s': Phương ngữ phải là %s hoặc nhóm phương ngữ %s"):format( dialect, dialect_list, dialect_group_list)) end end -- Parse the root vowel specs. if args.root:find("[<%[]") then local put = require(parse_utilities_module) -- Parse balanced segment runs involving either [...] (substitution notation) or <...> (inline -- modifiers). We do this because we don't want commas or semicolons inside of square or angle brackets -- to count as respelling delimiters. However, we need to rejoin square-bracketed segments with nearby -- ones after splitting alternating runs on comma and semicolon. local segments = put.parse_multi_delimiter_balanced_segment_run(args.root, {{"<", ">"}, {"[", "]"}}) local semicolon_separated_groups = put.split_alternating_runs(segments, "%s*;%s*") for _, group in ipairs(semicolon_separated_groups) do local first_element = group[1] local dialect if first_element:find("^[a-z]+:") then -- a dialect-specific spec local rest dialect, rest = first_element:match("^([a-z]+):(.*)$") check_dialect_or_dialect_group(dialect) group[1] = rest end local comma_separated_groups = put.split_alternating_runs_on_comma(group) -- Process each value. local outer_container = m_ca_IPA.parse_comma_separated_groups(comma_separated_groups, true, args.root, "root") set_parsed_respelling(dialect, outer_container) end else for _, dialect_spec in ipairs(rsplit(args.root, "%s*;%s*")) do local dialect if dialect_spec:find("^[a-z]+:") then -- a dialect-specific spec local rest dialect, rest = dialect_spec:match("^([a-z]+):(.*)$") check_dialect_or_dialect_group(dialect) dialect_spec = rest end local termobjs = {} for _, word in ipairs(rsplit(dialect_spec, ",")) do insert(termobjs, {words = {{term = word}}}) end set_parsed_respelling(dialect, { terms = termobjs, }) end end -- Convert each canonicalized respelling to phonemic/phonetic IPA. m_ca_IPA.generate_phonemic_phonetic(parsed_respellings) -- Group the results. local grouped_pronuns = m_ca_IPA.group_pronuns_by_dialect(parsed_respellings) -- Format for display. for _, grouped_pronun_spec in pairs(grouped_pronuns) do local pronunciations = {} local function ins(text) insert(pronunciations, text) end -- Loop through each pronunciation. For each one, format the phonetic version "raw". for j, pronun in ipairs(grouped_pronun_spec.pronuns) do -- Add dialect tags to left accent qualifiers if first one local as = pronun.a if j == 1 then if as then as = m_table.deepCopy(as) else as = {} end for _, dialect in ipairs(grouped_pronun_spec.dialects) do insert(as, m_ca_IPA.dialects_to_names[dialect]) end else ins(", ") end local slash_pron = "/" .. pronun.phonetic:gsub("ˈ", "") .. "/" if as or pronun.q or pronun.qq or pronun.aa then ins(require("Module:pron qualifier").format_qualifiers { lang = lang, text = slash_pron, q = pronun.q, a = as, qq = pronun.qq, aa = pronun.aa }) else ins(slash_pron) end if pronun.refs then -- FIXME: Copied from [[Module:IPA]]. Should be in a module. local refs = {} if #pronun.refs > 0 then for _, refspec in ipairs(pronun.refs) do if type(refspec) ~= "table" then refspec = {text = refspec} end local refargs if refspec.name or refspec.group then refargs = {name = refspec.name, group = refspec.group} end insert(refs, mw.getCurrentFrame():extensionTag("ref", refspec.text, refargs)) end ins(concat(refs)) end end end grouped_pronun_spec.formatted = concat(pronunciations) end -- Concatenate formatted results. local formatted = {} for _, grouped_pronun_spec in ipairs(grouped_pronuns) do insert(formatted, grouped_pronun_spec.formatted) end data.post_note = "''trọng âm gốc từ'': " .. concat(formatted, "; ") end end } ----------------------------------------------------------------------------------------- -- Numerals -- ----------------------------------------------------------------------------------------- -- Display additional inflection information for a numeral pos_functions["Số từ"] = { params = { [1] = true, [2] = true, }, func = function(args, data) if args[1] then insert(data.genders, "m") parse_and_insert_inflection(data, args, 1, "giống cái") parse_and_insert_inflection(data, args, 2, "Biến thể hình thái danh từ") else insert(data.genders, "m") insert(data.genders, "f") end end } ----------------------------------------------------------------------------------------- -- Phrases -- ----------------------------------------------------------------------------------------- pos_functions["Cụm từ"] = { params = { ["g"] = {list = true, disallow_holes = true, type = "genders", flatten = true}, ["m"] = list_param, ["f"] = list_param, }, func = function(args, data) validate_genders(args.g) data.genders = args.g parse_and_insert_inflection(data, args, "m", "giống đực") parse_and_insert_inflection(data, args, "f", "giống cái") end, } ----------------------------------------------------------------------------------------- -- Suffix forms -- ----------------------------------------------------------------------------------------- pos_functions["Biến thể hình thái hậu tố"] = { params = { [1] = {required = true, list = true, disallow_holes = true}, ["g"] = {list = true, disallow_holes = true, type = "genders", flatten = true}, }, func = function(args, data) validate_genders(args.g) data.genders = args.g local suffix_type = {} for _, typ in ipairs(args[1]) do insert(suffix_type, "Biến thể hình thái hậu tố của " .. typ) end insert(data.inflections, {label = "mục từ biến thể hình thái của " .. m_table.serialCommaJoin(suffix_type, {conj = "hoặc"})}) end, } return export 8kcuhacl2vt0tuieaim3sdbexfi0ek7 sara 0 283381 2345151 2144471 2026-04-14T04:23:01Z WhoAlone 40420 2345151 wikitext text/x-wiki {{-peh-}} {{-etym-}} {{inh+|peh|xgn-pro|*sara}}. {{-noun-}} {{head|peh|Danh từ}} # {{label|peh|Gnyan thog|Thanh Hải}} [[mặt trăng]]. {{-cjm-}} {{-pron-}} * {{IPA4|cjm|/sa-raː/}} {{-noun-}} {{head|cjm|Danh từ}} # [[muối]]. #:{{uxi|cjm|'''sara '''mbak|'''muối '''mặn}} #:{{uxi|cjm|'''sara '''brai dalam aia.|'''muối '''tan trong nước}} {{-syn-}} * [https://nguoicham.com/cdict/ Cham Dictionary] =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|皿|tr=sara}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[đĩa]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Dụng cụ nhà bếp}} {{-sce-}} {{-etym-}} {{inh+|sce|xgn-pro|*sara}}. {{-noun-}} {{pn}} # [[mặt trăng]]. {{-ref-}} * Juha Janhunen, ''The Mongolic Languages'' (2006) {{ISBN|1135796904}} [[Thể loại:Danh từ tiếng Đông Hương]] {{-yuy-}} {{-etym-}} {{inh+|yuy|xgn-pro|*sara}}. {{-pron-}} * {{IPA4|yuy|/sɑrɑ/}} {{-noun-}} {{head|yuy|Danh từ}} # [[mặt trăng]]. {{-xgn-mgr-}} {{-etym-}} {{inh+|xgn-mgr|xgn-pro|*sara}}. So sánh với {{cognate|xgn-mgl|sara}}. {{-noun-}} {{head|xgn-mgr|Danh từ}} # [[mặt trăng]]. # [[tháng]]. {{-xgn-mgl-}} {{-etym-}} {{inh+|xgn-mgl|xgn-pro|*sara}}. So sánh với {{cognate|xgn-mgr|sara}}. {{-noun-}} {{head|xgn-mgl|Danh từ}} # [[mặt trăng]]. # [[tháng]]. hk5npmafgbilj5n4iubeb73zdj9rt1e alcă pitică asiatică 0 285015 2345071 2326802 2026-04-14T01:02:02Z Hiyuune 50834 2345071 wikitext text/x-wiki =={{langname|ro}}== ==={{section|etym}}=== Từ {{mention|ro|alcă}} + {{mention|ro|pitică}} + {{mention|ro|asiatică}}. ==={{section|n}}=== {{ro-noun|f|alce pitice asiatice}} # Chim {{mention|mul|Brachyramphus perdix}}. gtidegjkw1dl0zutujvgfulrtexcke4 acapar 0 286322 2345121 2298899 2026-04-14T03:12:03Z Hiyuune 50834 2345121 wikitext text/x-wiki =={{langname|frp}}== ==={{section|alt}}=== {{frp-alt |vld=<acapé>[ˌakapˈe](Aymavilles,Introd)PVA |svy=<acapâ>(4T,4A,4A'g,8B')DSV;<acapâr>(8Bf)DSV;<acapâ̱>(Tignes)LPT |sources=DSV:acapâ;LPT:acapa̱;PVA:acapé/4544_3 |note=Added circumflex that was omitted in the LPT. }} ==={{section|etym}}=== {{uncertain|frp}}. ==={{section|v}}=== {{head|frp|Động từ}} # [[bắt|Bắt]]. ===={{section|conjug}}==== {{frp-conj-ar3|acap|acap|acap|achèt|avêr}} ==={{section|ref}}=== * {{R:frp:GPSR|akapā̩|100239084}} * [https://www.arpitania.eu/aca/documents/Stich/ORB%204.9.18.docx ORB 4.9.18] h9wzbqth63c48vef47dchqyjg6kgxl1 Bản mẫu:frp-conj-table 10 286323 2345161 2338129 2026-04-14T05:08:48Z Higashizakura 36666 2345161 wikitext text/x-wiki <templatestyles src="Module:roa-verb/style.css" /><div class="NavFrame"> <div class="NavHead">&nbsp; &nbsp; [[File:Pan-Arpitan coat of arms.svg|14px]] Bảng chia động từ của {{{1}}} {{#if:{{{note|}}}|— {{{note}}}|<!-- -->}}</div> <div class="NavContent" align=center> {| class="roa-inflection-table" data-toggle-category="inflection" |- ! colspan="2" class="roa-nonfinite-header" | ! colspan="3" class="roa-nonfinite-header" |đơn ! colspan="3" class="roa-nonfinite-header" |ghép |- ! colspan="2" class="roa-nonfinite-header" | nguyên mẫu | colspan="3" | {{l-self|frp|{{{1}}}}} | colspan="3" | {{{aux}}} {{{3}}} |- ! colspan="2" class="roa-nonfinite-header" | danh động từ | colspan="3" | {{l-self|frp|{{{2}}}}} | colspan="3" | {{{aux.ger}}} {{{3}}} |- ! colspan="2" class="roa-nonfinite-header" | trợ động từ | colspan="6" | {{l-self|frp|{{{aux}}}}} |- ! rowspan="3" class="roa-nonfinite-header" | phân từ quá khứ ! class="roa-nonfinite-header" | ! colspan="3" class="roa-nonfinite-header" | giống đực ! colspan="3" class="roa-nonfinite-header" | giống cái |- ! class="roa-nonfinite-header" | số ít | colspan="3" | {{l-self|frp|{{{3}}}}} | colspan="3" | {{l-self|frp|{{{4}}}}} |- ! class="roa-nonfinite-header" | số nhiều | colspan="3" | {{l-self|frp|{{{5}}}}} | colspan="3" | {{l-self|frp|{{{6}}}}} |- ! colspan="2" rowspan="2" class="roa-person-number-header" | ! colspan="3" class="roa-person-number-header" | số ít ! colspan="3" class="roa-person-number-header" | số nhiều |- ! class="roa-person-number-header" | ngôi thứ nhất ! class="roa-person-number-header" | ngôi thứ hai ! class="roa-person-number-header" | ngôi thứ ba ! class="roa-person-number-header" | ngôi thứ nhất ! class="roa-person-number-header" | ngôi thứ hai ! class="roa-person-number-header" | ngôi thứ ba |- ! rowspan="6" class="roa-indicative-left-rail" | trần thuật ! class="roa-indicative-left-rail" style="width:12.5%;" | ! class="roa-indicative-left-rail" style="width:12.5%;" | jo ! class="roa-indicative-left-rail" style="width:12.5%;" | te ! class="roa-indicative-left-rail" style="width:12.5%;" | il ! class="roa-indicative-left-rail" style="width:12.5%;" | nos ! class="roa-indicative-left-rail" style="width:12.5%;" | vos ! class="roa-indicative-left-rail" style="width:12.5%;" | ils |- ! class="roa-indicative-left-rail" style="height:3em;" | hiện tại | {{l-self|frp|{{{7}}}}} | {{l-self|frp|{{{8}}}}} | {{l-self|frp|{{{9}}}}} | {{l-self|frp|{{{10}}}}} | {{l-self|frp|{{{11}}}}} | {{l-self|frp|{{{12}}}}} |- ! class="roa-indicative-left-rail" style="height:3em;" | chưa hoàn thành | {{l-self|frp|{{{13}}}}} | {{l-self|frp|{{{14}}}}} | {{l-self|frp|{{{15}}}}} | {{l-self|frp|{{{16}}}}} | {{l-self|frp|{{{17}}}}} | {{l-self|frp|{{{18}}}}} |- ! class="roa-indicative-left-rail" style="height:3em;" | quá khứ đơn | {{l-self|frp|{{{19}}}}} | {{l-self|frp|{{{20}}}}} | {{l-self|frp|{{{21}}}}} | {{l-self|frp|{{{22}}}}} | {{l-self|frp|{{{23}}}}} | {{l-self|frp|{{{24}}}}} |- ! class="roa-indicative-left-rail" style="height:3em;" | tương lai | {{l-self|frp|{{{25}}}}} | {{l-self|frp|{{{26}}}}} | {{l-self|frp|{{{27}}}}} | {{l-self|frp|{{{28}}}}} | {{l-self|frp|{{{29}}}}} | {{l-self|frp|{{{30}}}}} |- ! class="roa-indicative-left-rail" style="height:3em;" | điều kiện | {{l-self|frp|{{{31}}}}} | {{l-self|frp|{{{32}}}}} | {{l-self|frp|{{{33}}}}} | {{l-self|frp|{{{34}}}}} | {{l-self|frp|{{{35}}}}} | {{l-self|frp|{{{36}}}}} |- ! class="roa-indicative-left-rail" rowspan=5|dạng thì ghép !class="roa-indicative-left-rail"|hiện tại hoàn thành !colspan=6 class="roa-compound-row"|trần thuật hiện tại của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- !class="roa-indicative-left-rail"|hoàn thành số nhiều !colspan=6 class="roa-compound-row"|trần thuật chưa hoàn thành của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- !class="roa-indicative-left-rail"|tiền quá khứ !colspan=6 class="roa-compound-row"|trần thuật quá khứ đơn của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- !class="roa-indicative-left-rail"|tương lai hoàn thành !colspan=6 class="roa-compound-row"|trần thuật tương lai của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- !class="roa-indicative-left-rail"|điều kiện hoàn thành !colspan=6 class="roa-compound-row"|điều kiện của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- ! rowspan="3" class="roa-subjunctive-left-rail" | giả định ! class="roa-subjunctive-left-rail" style="width:12.5%;" | ! class="roa-subjunctive-left-rail" style="width:12.5%;" | que jo ! class="roa-subjunctive-left-rail" style="width:12.5%;" | que te ! class="roa-subjunctive-left-rail" style="width:12.5%;" | qu'il ! class="roa-subjunctive-left-rail" style="width:12.5%;" | que nos ! class="roa-subjunctive-left-rail" style="width:12.5%;" | que vos ! class="roa-subjunctive-left-rail" style="width:12.5%;" | qu'ils |- ! class="roa-subjunctive-left-rail" style="height:3em;" | hiện tại | {{l-self|frp|{{{37}}}}} | {{l-self|frp|{{{38}}}}} | {{l-self|frp|{{{39}}}}} | {{l-self|frp|{{{40}}}}} | {{l-self|frp|{{{41}}}}} | {{l-self|frp|{{{42}}}}} |- ! class="roa-subjunctive-left-rail" style="height:3em;" | chưa hoàn thành | {{l-self|frp|{{{43}}}}} | {{l-self|frp|{{{44}}}}} | {{l-self|frp|{{{45}}}}} | {{l-self|frp|{{{46}}}}} | {{l-self|frp|{{{47}}}}} | {{l-self|frp|{{{48}}}}} |- ! class="roa-subjunctive-left-rail" rowspan=2|dạng thì ghép !class="roa-subjunctive-left-rail"|quá khứ !colspan=6 class="roa-compound-row"|giả định hiện tại của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- !class="roa-subjunctive-left-rail"|hoàn thành số nhiều !colspan=6 class="roa-compound-row"|giả định chưa hoàn thành của {{l-self|frp|{{{aux}}}}} + phân từ quá khứ |- ! rowspan="6" colspan="2" class="roa-imperative-left-rail" | mệnh lệnh ! class="roa-imperative-left-rail" | — ! class="roa-imperative-left-rail" | te ! class="roa-imperative-left-rail" | — ! class="roa-imperative-left-rail" | nos ! class="roa-imperative-left-rail" | vos ! class="roa-imperative-left-rail" | — |- | | {{l-self|frp|{{{49}}}}} | | {{l-self|frp|{{{50}}}}} | {{l-self|frp|{{{51}}}}} | {{{tablenote|}}} |} </div></div><noinclude>{{documentation}}</noinclude> gdxhkshiyc43w4wbw5freqay8ptwqgm Bản mẫu:frp-conj-ar3 10 286324 2345119 2111318 2026-04-14T03:10:59Z Hiyuune 50834 2345119 wikitext text/x-wiki <noinclude>Xem tài liệu bản mẫu ở [[Thảo luận Bản mẫu:frp-conj-ar]].</noinclude> {{frp-conj-table |aux=avêr |aux.ger=avêr | {{{1}}}ar | {{{1}}}ent | {{{1}}}â | {{{1}}}âye | {{{1}}}âs | {{{1}}}âyes | {{{3}}}o | {{{4}}}es | {{{4}}}e | {{{1}}}ens | {{{1}}}âds | {{{3}}}ont | {{{1}}}âvo | {{{1}}}âves | {{{1}}}âve | {{{1}}}âvans | {{{1}}}âvâds | {{{1}}}âvant | {{{1}}}é | {{{1}}}és | {{{1}}}at | {{{1}}}ens, {{{1}}}érens | {{{1}}}étes | {{{1}}}éront | {{{1}}}eré | {{{1}}}erés | {{{1}}}erat | {{{1}}}erens | {{{1}}}eréds | {{{1}}}eront | {{{1}}}erê | {{{1}}}erês | {{{1}}}erêt | {{{1}}}erans | {{{1}}}erâds | {{{1}}}erant | {{{3}}}o | {{{4}}}es | {{{4}}}e | {{{1}}}ens | {{{1}}}âds | {{{3}}}ont | {{{1}}}ésso | {{{1}}}ésses | {{{1}}}ésse | {{{1}}}éssens | {{{1}}}ésséds | {{{1}}}éssont | {{{4}}}a | {{{1}}}ens | {{{1}}}âds }} <includeonly>[[Thể loại:Động từ tiếng Franco-Provençal]]</includeonly><noinclude>{{tcat|conj}}</noinclude> pc6ownbkuv0gtq7smcgtqnbc0oze873 Mô đun:labels/data/lang/en 828 287147 2344983 2327861 2026-04-13T13:54:50Z Hiyuune 50834 2344983 Scribunto text/plain local labels = {} labels["African-American Vernacular English"] = { aliases = {"AAVE", "African American Vernacular English", "ebonics", "BVE", "bản ngữ người Mỹ gốc Phi", "tiếng Anh bản ngữ người Mỹ gốc Phi"}, display = "tiếng Anh bản ngữ người Mỹ gốc Phi", Wikipedia = "Tiếng Anh bản ngữ người Mỹ gốc Phi", plain_categories = "Tiếng Anh bản ngữ người Mỹ gốc Phi", } labels["African-American English"] = { aliases = {"AA", "African-American", "African American", "African American English"}, display = "African-American English", plain_categories = true, } labels["Australian English"] = { aliases = {"AU", "Australia", "tiếng Anh Úc", "Úc"}, display = "[[w:Tiếng Anh Úc|Úc]]", plain_categories = "Tiếng Anh Úc", } labels["Australian Aboriginal English"] = { aliases = {"Australian Aboriginal", "Australian aboriginal", "Aboriginal Australian", "aboriginal Australian"}, display = "Australian Aboriginal", Wikipedia = true, plain_categories = true, } labels["Bangladeshi English"] = { display = "Bangladesh", Wikipedia = true, plain_categories = {"Bangladeshi English"}, } labels["Birmingham"] = { aliases = {"Brummie", "Brummy"}, display = "[[wikipedia:Brummie|Birmingham]]", regional_categories = true, } labels["Anh"] = { region = "Vương quốc Anh", addl = "Not to be confused with [[:Category:British English forms|British spellings]], a spelling system used in some English-speaking countries of the world.", aliases = {"Britain", "Great Britain", "British"}, display = "[[w:Tiếng Anh Anh|Anh]]", regional_categories2 = "Anh", parent = "Europe,Commonwealth", country = "the United Kingdom", } labels["British Indian English"] = { aliases = {"British India"}, display = "British India", Wikipedia = "British India", plain_categories = true, } labels["Tiếng Anh Canada"] = { aliases = {"Canadian English", "Canada"}, display = "Canada", Wikipedia = true, plain_categories = {"Tiếng Anh Canada"}, } labels["Chinglish"] = { Wikipedia = true, plain_categories = {"Chinglish"}, } labels["Chinese-Filipino English"] = { aliases = {"Chinese Filipino", "Filipino-Chinese", "Chinese-Filipino", "Chinoy", "Filchi", "Fil-Chi", "Ph. Filchi English", "PH Fil-Chi English", "Chinoy English"}, -- Sociolect subset to Philippine English display = "Chinese Filipino", Wikipedia = "Chinese Filipino#Language", -- may also see "Hokaglish" in Wikipedia, although Hokaglish is the codeswitching form with a Hokkien or Tagalog base, just like Philippine English to "Conyo" (English-based) and "Taglish" (Tagalog-based), whereas this is the English variant itself subset to Philippine English. regional_categories = "Chinese Filipino", } labels["Cockney"] = { Wikipedia = "Cockney#Speech", plain_categories = {"Cockney English"}, } labels["Early Modern English"] = { aliases = {"Early Modern", "Early modern English", "Early modern", "EME"}, display = "Early Modern", Wikipedia = true, plain_categories = true, } labels["East Anglian English"] = { display = "East Anglia", Wikipedia = true, plain_categories = {"East Anglian English"}, } labels["East Midlands English"] = { display = "East Midlands", Wikipedia = true, plain_categories = {"East Midlands English"}, } labels["GenAm"] = { aliases = {"GA", "General American", "tiếng Anh Mỹ thông dụng", "Anh Mỹ thông dụng", "tiếng Anh Mĩ thông dụng", "Anh Mĩ thông dụng"}, Wikipedia = "Tiếng Anh Mỹ thông dụng", display = "Anh Mỹ thông dụng", } labels["Geordie"] = { Wikipedia = true, plain_categories = {"Geordie English"}, } labels["Hong Kong English"] = { aliases = {"Hong Kong", "HK English", "HKE", "HK"}, display = "Hong Kong", Wikipedia = true, plain_categories = true, } labels["Tiếng Anh Ấn Độ"] = { aliases = {"Indian English", "Ấn Độ"}, display = "Ấn Độ", Wikipedia = true, plain_categories = {"Tiếng Anh Ấn Độ"}, } labels["Ireland"] = { aliases = {"Irish", "tiếng Anh Ireland"}, Wikipedia = "Tiếng Anh Ireland", regional_categories2 = true, parent = "Europe", } labels["Jamaican English"] = { aliases = {"Jamaica", "Jamaican", "Jamaican Standard English"}, display = "Jamaica", Wikipedia = true, plain_categories = true, } labels["Late Modern English"] = { aliases = {"Late Modern", "Late modern English", "Late modern", "LME"}, display = "[[Late Modern English|Late Modern]]", plain_categories = true, } labels["Manglish"] = { aliases = {"Colloquial Malaysian English", "Colloquial Malaysia English"}, Wikipedia = true, plain_categories = true, } labels["Manglish"] = { aliases = {"Colloquial Malaysian English", "Colloquial Malaysia English"}, Wikipedia = true, plain_categories = true, } labels["Midlands English"] = { display = "Midlands", Wikipedia = true, plain_categories = true, } labels["Midland US"] = { aliases = {"Midland U.S.", "North Midland US", "Northern Midland US", "South Midland US", "Southern Midland US"}, Wikipedia = "Midland American English", regional_categories = true, } labels["Multicultural London English"] = { aliases = {"MLE"}, display = "MLE", Wikipedia = true, plain_categories = true, } labels["Multicultural Toronto English"] = { aliases = {"Greater Toronto English", "Greater Toronto Area", "MTE", "GTE", "GTA"}, display = "MTE", Wikipedia = true, plain_categories = true, } labels["New South Wales"] = { aliases = {"NSW"}, Wikipedia = true, regional_categories = "Australian", } labels["New Zealand English"] = { aliases = {"New Zealand", "tiếng Anh New Zealand"}, display = "New Zealand", Wikipedia = "Tiếng Anh New Zealand", plain_categories = "Tiếng Anh New Zealand", } labels["Non-Oxford British spelling"] = { aliases = {"non-Oxford British spelling", "Non-Oxford", "non-Oxford", "Not Oxford", "not Oxford"}, display = "Non-[[w:Oxford spelling|Oxford]] [[British English]]", plain_categories = "British English forms", } labels["North America"] = { aliases = {"North American", "Bắc Mĩ", "Bắc Mỹ"}, display = "[[Canada]], [[American English|Mỹ]]", regional_categories2 = {"Canada", "Mỹ"}, } labels["Northern England"] = { aliases = {"northern England", "North England", "north England", "Bắc Anh", "miền Bắc nước Anh"}, display = "[[w:Tiếng Anh tại Bắc Anh|miền Bắc nước Anh]]", regional_categories = "Bắc Anh", parent = "England", } labels["Northern Territory"] = { aliases = {"NT"}, Wikipedia = true, regional_categories = "Australian", } labels["Nunavut"] = { regional_categories = "Canadian", } labels["Oxford British spelling"] = { aliases = {"Oxford"}, display = "[[w:Oxford spelling|Oxford]] [[British English]]", plain_categories = "Oxford spellings", } labels["Pennsylvania Dutch English"] = { Wikipedia = true, plain_categories = true, } labels["Philippine English"] = { aliases = {"Philippines", "Ph. English", "PH English", "Filipino English", "PH"}, display = "Philippines", Wikipedia = true, plain_categories = true, } labels["Polari"] = { display = "[[Polari]]", plain_categories = true, } labels["Potteries"] = { aliases = {"Potteries dialect"}, Wikipedia = "Potteries dialect", regional_categories = true, } labels["Queensland"] = { Wikipedia = true, regional_categories = "Australian", } labels["Received Pronunciation"] = { aliases = {"RP"}, display = "phát âm giọng Anh chuẩn", Wikipedia = true, } labels["Scotland"] = { aliases = {"Scottish", "Scottish English", "tiếng Anh Scotland"}, Wikipedia = "Tiếng Anh Scotland", regional_categories2 = "Scotland", } labels["Singapore"] = { aliases = {"SG", "Singaporean"}, Wikipedia = "Tiếng Anh Singapore", regional_categories2 = "Singapore", parent = "Southeast Asia,Commonwealth", } labels["Singlish"] = { aliases = {"Colloquial Singaporean English", "Colloquial Singapore English"}, Wikipedia = true, plain_categories = true, } labels["Shropshire"] = { aliases = {"Shropshire dialect", "Shrops", "Salop", "Salopian"}, Wikipedia = true, regional_categories = true, } labels["South African English"] = { display = "South Africa", Wikipedia = true, plain_categories = true, } labels["Southern England"] = { aliases = {"southern England", "South England", "south England", "Southern English", "miền Nam nước Anh", "Nam Anh"}, display = "[[w:Tiếng Anh tại Nam Anh|miền Nam nước Anh]]", regional_categories = true, parent = "England", } labels["Southern US English"] = { aliases = {"Southern American English", "Southern US", "Southern U.S.", "southern US", "southern U.S.", "US South", "U.S. South", "US Southern", "U.S. Southern"}, display = "miền Nam Hoa Kì", Wikipedia = "Tiếng Anh Nam Hoa Kì", plain_categories = {"Tiếng Anh Nam Hoa Kì"}, } labels["Southwestern US English"] = { aliases = {"Southwestern American English", "Southwestern US", "Southwestern U.S.", "southwestern US", "southwestern U.S.", "US Southwest", "U.S. Southwest", "Southwest US", "Southwest U.S.", "southwest US", "southwest U.S."}, display = "Southwestern US", Wikipedia = "Southwestern United States", plain_categories = true, } labels["Sussex"] = { Wikipedia = "Sussex dialect", regional_categories = true, } labels["Tyneside"] = { aliases = {"Geordie"}, Wikipedia = true, regional_categories = "Geordie", } labels["Mỹ"] = { aliases = {"U.S. English", "American English", "US English", "Tiếng Anh Mỹ"}, display = "Mỹ", Wikipedia = "Tiếng Anh Mỹ", regional_categories = "Mỹ", } labels["Victoria"] = { Wikipedia = "Victoria (state)", regional_categories = "Australian", } labels["West Bengal English"] = { display = "West Bengal", Wikipedia = true, plain_categories = true, } labels["West Country English"] = { aliases = {"West Country dialect"}, display = "West Country", Wikipedia = true, plain_categories = true, } labels["West Midlands English"] = { aliases = {"West Midlands dialect"}, display = "West Midlands", Wikipedia = true, plain_categories = true, } labels["Western Pennsylvania English"] = { aliases = {"Western Pennsylvania dialect", "Pittsburgh English", "Pittsburghese"}, display = "Western Pennsylvania", Wikipedia = true, plain_categories = true, } -- kludges, needed here for [[Template:standard spelling of]] et al labels["American spelling"] = { aliases = {"US spelling", "đánh vần tiếng Anh Mĩ", "đánh vần tiếng Anh Mỹ"}, display = "đánh vần tiếng Anh Mỹ", Wikipedia = "Sự khác biệt về đánh vần giữa tiếng Anh Mỹ và Anh Anh", plain_categories = "Dạng tiếng Anh Mỹ", } labels["American form"] = { aliases = {"US form"}, display = "US", Wikipedia = "American and British English spelling differences", plain_categories = "American English forms", } labels["Canadian spelling"] = { display = "Canadian spelling", Wikipedia = true, plain_categories = "Canadian English forms", } labels["Canadian form"] = { display = "Canadian", Wikipedia = true, plain_categories = "Canadian English forms", } labels["British spelling"] = { aliases = {"Commonwealth spelling", "UK spelling", "đánh vần tiếng Anh Anh"}, display = "đánh vần tiếng Anh Anh", Wikipedia = "Sự khác biệt về đánh vần giữa tiếng Anh Mỹ và Anh Anh", plain_categories = "Dạng tiếng Anh Anh", } labels["British form"] = { aliases = {"Commonwealth form", "UK form"}, display = "British", Wikipedia = "American and British English spelling differences", plain_categories = "British English forms", } labels["Australian spelling"] = { display = "Australian spelling", Wikipedia = "Australian English#Spelling and style", plain_categories = "Australian English forms", } labels["Australian form"] = { display = "Australian", Wikipedia = "Australian English#Spelling and style", plain_categories = "Australian English forms", } labels["archaic third singular"] = { display = "archaic", Wikipedia = "English verbs#Archaic forms", pos_categories = "archaic third-person singular forms", } labels["archaic second singular present"] = { display = "archaic", Wikipedia = "English verbs#Archaic forms", pos_categories = "second-person singular forms", } labels["archaic second singular past"] = { display = "cổ xưa", Wikipedia = "Động từ tiếng Anh#Dạng cổ xưa", pos_categories = "Dạng thì quá khứ ở ngôi thứ hai số ít", } return require("Module:labels").finalize_data(labels) gtkie3v80g3tuft60vfwzo3zf7kyoe9 Mô đun:form of/lang-data/en 828 287547 2344981 2344005 2026-04-13T13:50:22Z Hiyuune 50834 2344981 Scribunto text/plain --[=[ This module contains lang-specific tags for English. ]=] local m_form_of_data = require("Module:form of/data") local APPENDIX = m_form_of_data.APPENDIX local WP = m_form_of_data.WP local WIKT = m_form_of_data.WIKT local tags = {} local shortcuts = {} shortcuts["ed-form"] = {"spast", "và", "part", "quá khứ"} shortcuts["ing-form"] = {"part", "pres", "và", "ger"} shortcuts["s-verb-form"] = {"ind", "spres", "ở", "3", "s"} shortcuts["st-form"] = {"2-st", "s", "spres", "ind"} shortcuts["st-past-form"] = {"ind", "spast", "ở", "2-st", "s"} shortcuts["th-form"] = {"3-th", "s", "spres", "ind"} ----------------------- ngôi ----------------------- -- These tags exist so we can add appropriate 'archaic FOO' labels in [[Module:form of/cats]]. tags["second-person (-st)"] = { "person", nil, "2-st", display = "[[Phụ lục:Từ điển thuật ngữ#ngôi thứ hai|ngôi thứ hai]]", } tags["third-person (-th)"] = { "person", nil, "3-th", display = "[[Phụ lục:Từ điển thuật ngữ#ngôi thứ ba|ngôi thứ ba]]", } ----------------------- Create the shortcuts list ----------------------- m_form_of_data.finalize(tags, shortcuts) return {tags = tags, shortcuts = shortcuts} bnenor98es5x5ck0vtyc2kfx7ih3ziw Mô đun:romance inflections 828 298564 2344962 2144548 2026-04-13T13:05:02Z Hiyuune 50834 2344962 Scribunto text/plain local export = {} --[=[ Authorship: Ben Wing <benwing2> This module implements {{pt-verb form of}}, {{ca-verb form of}}, {{gl-verb form of}} and {{gl-reinteg-verb form of}}, which automatically generate the appropriate inflections of a non-lemma verb form given the form and the conjugation spec for the verb (which is usually just the infinitive; see {{pt-conj}}/{{pt-verb}}, {{ca-conj}}/{{ca-verb}}, {{gl-conj}}/{{gl-verb}} and {{gl-reinteg-conj}}/{{gl-reinteg-verb}}). ]=] local m_links = require("Module:links") local m_table = require("Module:table") local m_form_of = require("Module:form of") local accel_module = "Module:accel" local pt_verb_module = "Module:pt-verb" local ca_verb_module = "Module:ca-verb" local gl_verb_module = "Module:gl-verb" local gl_reinteg_verb_module = "Module:gl-reinteg-verb" local rmatch = mw.ustring.match local rfind = mw.ustring.find local rsplit = mw.text.split local unpack = unpack or table.unpack -- Lua 5.2 compatibility local usub = mw.ustring.sub local function pt_extract_labels(formobj) local labels = {} local form = formobj.form local footnotes = formobj.footnotes local m_pt_verb = require(pt_verb_module) if not not form:find(m_pt_verb.VAR_BR) or footnotes and m_table.contains(footnotes, "[Brazil]") or footnotes and m_table.contains(footnotes, "[Brazil]") then table.insert(labels, "Biến thể hình thái động từ tiếng Bồ Đào Nha Brazil") end if not not form:find(m_pt_verb.VAR_PT) or footnotes and m_table.contains(footnotes, "[Portugal]") or footnotes and m_table.contains(footnotes, "[Portugal]") then table.insert(labels, "Biến thể hình thái đọng từ tiếng Bồ Đào Nha châu Âu") end if not not form:find(m_pt_verb.VAR_SUPERSEDED) or footnotes and m_table.contains(footnotes, "[superseded]") then table.insert(labels, "trước 1990") end return labels end local function gl_reinteg_extract_labels(formobj) local labels = {"[[Phụ lục:Phong trào tái hợp nhất với tiếng Bồ Đào Nha|Phong trào tái hợp nhất với tiếng Bồ Đào Nha]]"} local form = formobj.form local footnotes = formobj.footnotes local m_gl_reinteg_verb = require(gl_reinteg_verb_module) if not not form:find(m_gl_reinteg_verb.ALTVAR) or footnotes and m_table.contains(footnotes, "[less recommended]") then table.insert(labels, "less recommended") end return labels end local norm_properties = { pt = { verb_module = pt_verb_module, lang = require("Module:languages").getByCode("pt"), langcode = "pt", extract_labels = pt_extract_labels, remove_variant_codes = true, }, ca = { verb_module = ca_verb_module, lang = require("Module:languages").getByCode("ca"), langcode = "ca", remove_variant_codes = false, }, gl = { verb_module = gl_verb_module, lang = require("Module:languages").getByCode("gl"), langcode = "gl", remove_variant_codes = false, }, ["gl-reinteg"] = { verb_module = gl_reinteg_verb_module, lang = require("Module:languages").getByCode("gl"), langcode = "gl", extract_labels = gl_reinteg_extract_labels, remove_variant_codes = true, }, } local function track(page) require("Module:debug/track")("romance inflections/" .. page) return true end local function generate_inflection_of(tag_sets, lemma, pretext, args, norm) local lang = norm_properties[norm].lang for _, tag_set in ipairs(tag_sets) do tag_set.tags = rsplit(tag_set.tag, "|") tag_set.tag = nil end local has_multiple_tag_sets = #tag_sets > 1 -- If only one tag, extract out the "combined with ..." text and move into posttext=, which goes after the lemma. -- FIXME: No support for clitic combinations currently for Portuguese or Galician, although maybe we should add it. local posttext if #tag_sets == 1 then local tags = tag_sets[1].tags local last_tag = tags[#tags] if last_tag:match("^combined with .*$") then -- NOTE: table.remove() side-effects the list by removing and returning the last item. posttext = " " .. table.remove(tags) end end local function hack_clitics(text) return text:gsub("%[%[(.-)%]%]", function(pronoun) return m_links.full_link({term = pronoun, lang = lang}, "term") end) end -- Hack to convert raw-linked pronouns e.g. in 'combined with [[te]]' to Portuguese-linked pronouns. for _, tag_set in ipairs(tag_sets) do for i, tag in ipairs(tag_set.tags) do if tag:find("%[%[") then tag_set.tags[i] = hack_clitics(tag) end end end posttext = posttext and hack_clitics(posttext) or nil local lemma_obj = { lang = lang, term = lemma, gloss = args.t, pos = args.pos, lit = args.lit, id = args.id, } if has_multiple_tag_sets then tag_sets = require(accel_module).combine_tag_sets_into_multipart(tag_sets, lang, "verb") end return m_form_of.tagged_inflections { lang = lang, tag_sets = tag_sets, lemmas = {lemma_obj}, lemma_face = "term", pretext = pretext, posttext = posttext, POS = "verb", } end function export.verb_form_of(frame) local norm = frame.args.norm if not norm then error("Frame (invocation) argument norm= must be specified") end if not norm_properties[norm] then local valid_norms = {} for k, v in pairs(norm_properties) do table.insert(valid_norms, k) end table.sort(valid_norms) error("Unrecognized value for norm=; possible values are " .. table.concat(valid_norms, ", ")) end local langcode = norm_properties[norm].langcode local parargs = frame:getParent().args local params = { [1] = {required = true}, ["noautolinktext"] = {type = "boolean"}, ["noautolinkverb"] = {type = "boolean"}, ["pagename"] = {}, -- for testing/documentation pages ["json"] = {type = "boolean"}, -- for bot use ["slots"] = {}, -- restrict to only these slots ["noslots"] = {}, -- restrict to all but these slots ["t"] = {}, ["gloss"] = {alias_of = "t"}, ["lit"] = {}, ["pos"] = {}, ["id"] = {}, } local m_verb_module = require(norm_properties[norm].verb_module) local args = require("Module:parameters").process(parargs, params) local alternant_multiword_spec = m_verb_module.do_generate_forms(args, ("%s-verb form of"):format(norm)) local function remove_variant_codes(form) if norm_properties[norm].remove_variant_codes then return m_verb_module.remove_variant_codes(form) else return form end end local function extract_labels(formobj) if norm_properties[norm].extract_labels then return norm_properties[norm].extract_labels(formobj) else return {} end end local non_lemma_form = alternant_multiword_spec.verb_form_of_form local lemmas = {} if not alternant_multiword_spec.forms.infinitive then error("Internal error: No infinitive?") end for _, formobj in ipairs(alternant_multiword_spec.forms.infinitive) do m_table.insertIfNot(lemmas, m_links.remove_links(formobj.form)) end -- FIXME: Consider supporting multiple lemmas. local lemma = lemmas[1] local slot_restrictions = args.slots and m_table.listToSet(rsplit(args.slots, ",")) or nil local negated_slot_restrictions = args.noslots and m_table.listToSet(rsplit(args.noslots, ",")) or nil local tags = {} local slots_seen = {} local function loop_over_verb_slots(verb_slots) for _, slot_accel in ipairs(verb_slots) do local slot, accel = unpack(slot_accel) -- If used on the infinitive page, don't include the infinitive as a form. if slot ~= "infinitive" and slot ~= "infinitive_linked" then local forms = alternant_multiword_spec.forms[slot] if forms then for _, formobj in ipairs(forms) do local labels = extract_labels(formobj) local form = remove_variant_codes(m_links.remove_links(mw.ustring.toNFC(formobj.form))) if non_lemma_form == form then if (not slot_restrictions or slot_restrictions[slot]) and ( not negated_slot_restrictions or not negated_slot_restrictions[slot] ) then m_table.insertIfNot(tags, {tag = accel, labels = labels}) end if slot_restrictions or negated_slot_restrictions then slots_seen[slot] = true end end end end end end end local function check_slot_restrictions_against_slots_seen() local function get_slots_seen() local slots_seen_list = {} for slot, _ in pairs(slots_seen) do table.insert(slots_seen_list, slot) end table.sort(slots_seen_list) return slots_seen_list end local function check_against_slots_seen(restrictions, prefix) for slot, _ in pairs(restrictions) do if not slots_seen[slot] then error(("%sslot restriction for slot '%s' had no effect (typo?) because it is not any of the slots matching form '%s' for verb '%s': possible values %s"):format( prefix, slot, non_lemma_form, lemma, table.concat(get_slots_seen(), ","))) end end end if slot_restrictions then check_against_slots_seen(slot_restrictions, "") end if negated_slot_restrictions then check_against_slots_seen(negated_slot_restrictions, "negated ") end end loop_over_verb_slots(alternant_multiword_spec.verb_slots_basic) if next(slots_seen) then check_slot_restrictions_against_slots_seen() end if #tags > 0 then return generate_inflection_of(tags, lemma, nil, args, norm) end -- If we don't find any matches, we try again, looking for non-reflexive forms of reflexive-only verbs. slots_seen = {} if alternant_multiword_spec.refl and not lemma:find(" ") then local refl_forms_to_tags = {} for _, slot_accel in ipairs(alternant_multiword_spec.verb_slots_basic) do local slot, accel = unpack(slot_accel) local part_forms = alternant_multiword_spec.forms[slot .. "_non_reflexive"] local full_forms = alternant_multiword_spec.forms[slot] local variant_forms = alternant_multiword_spec.forms[slot .. "_variant"] -- Make sure same number of part and full forms, otherwise we can't match them up. if part_forms and full_forms and #part_forms == #full_forms and ( not variant_forms or #part_forms == #variant_forms) then -- Find part form the same as the non-lemma form we're generating the inflection(s) of, -- and accumulate properties into refl_forms_to_tags. for i, part_form in ipairs(part_forms) do local labels = extract_labels(part_form) local form = remove_variant_codes(m_links.remove_links(mw.ustring.toNFC(part_form.form))) if non_lemma_form == form then if (not slot_restrictions or slot_restrictions[slot]) and ( not negated_slot_restrictions or not negated_slot_restrictions[slot] ) then local saw_existing = false for _, refl_form_to_tags in ipairs(refl_forms_to_tags) do if refl_form_to_tags.form == remove_variant_codes(full_forms[i].form) then table.insert(refl_form_to_tags.tags, {tag = accel, labels = labels}) saw_existing = true break end end if not saw_existing then table.insert(refl_forms_to_tags, { form = remove_variant_codes(full_forms[i].form), tags = {{tag = accel, labels = labels}}, variant = variant_forms and remove_variant_codes(variant_forms[i].form), }) end end if slot_restrictions or negated_slot_restrictions then slots_seen[slot] = true end end end end end if next(slots_seen) then check_slot_restrictions_against_slots_seen() end if #refl_forms_to_tags > 0 then local parts = {} for _, refl_form_to_tags in ipairs(refl_forms_to_tags) do local only_used_in if refl_form_to_tags.variant then only_used_in = frame:preprocess(("{{only used in|%s|%s}}, <span class='use-with-mention'>syntactic variant of {{m|%s|%s}}</span>"):format( langcode, refl_form_to_tags.variant, langcode, refl_form_to_tags.form)) else only_used_in = frame:preprocess(("{{only used in|%s|%s}}"):format(langcode, refl_form_to_tags.form)) end if refl_form_to_tags.form == lemma then table.insert(parts, only_used_in) else local infl = generate_inflection_of(refl_form_to_tags.tags, lemma, only_used_in .. ", ", args, norm) table.insert(parts, infl) end end return table.concat(parts, "\n# ") end end error(("'%s' is not any of the forms of the verb '%s'"):format(non_lemma_form, table.concat(lemmas, "/"))) end return export c3nfpvvh3jtcq9s39ht0ong83wfj9va aɣyul 0 298579 2345193 2344574 2026-04-14T10:13:51Z TheHighFighter2 42988 2345193 wikitext text/x-wiki =={{langname|kab}}== ==={{section|etym}}=== {{etymon|kab|id=con lừa|:inh|ber-pro:*a-ɣăyul<t:con lừa><ety:bor<la:equuleus<unc><t:ngựa con>>>|tree=1|text=*}} ==={{section|pron}}=== * {{kab-IPA}} ==={{section|noun}}=== {{kab-noun|m|pl=iɣʷyal|f=taɣyult}} # Con [[lừa]]. ===={{section|infl}}==== {{kab-infl-noun|weɣyul|iɣʷyal|yeɣʷyal}} ===={{section|drv}}==== {{col|sjs |aɣyul n yiḍ<t:dơi><lit:lừa đêm> }} ==={{section|ref}}=== * {{R:kab:Amawal}} * {{R:kab:Dallet:1982}} {{C|kab|Họ Ngựa}} =={{langname|sjs}}== ==={{section|pron}}=== * {{sjs-IPA}} ==={{section|noun}}=== {{sjs-noun|m}} # {{alt form of|sjs|aɣyuy|from=Hmed|from2=Taghzut|from3=Zerqet}}. =={{langname|shi}}== ==={{section|alt}}=== * {{alt|shi|aɣyyul|aɣiyul}} ==={{section|etym}}=== {{etymon|shi|id=con lừa|:inh|shi-med:اَغْيُلْ<tr:aɣyul><t:con lừa><ety:inh<ber-pro:*a-ɣăyul<t:con lừa><ety:bor<la:equuleus<unc><t:ngựa con>>>>>|tree=1|text=*}} Không liên quan gì đến {{noncog|ar|خَيْل|t=con ngựa}}. ==={{section|pron}}=== * {{shi-IPA}} ==={{section|noun}}=== {{shi-noun|m|pl=iɣʷyal|f=taɣyult}} # Con [[lừa]]. # {{lb|shi|vulgar}} Kẻ [[ngu ngốc]], kẻ [[đần độn]]. ===={{section|infl}}==== {{shi-infl-noun|uɣyul|iɣʷyal|iɣʷyal}} ===={{section|drv}}==== {{col|shi |aɣyul abldiy<t:lừa nhà> |aɣyul n tagant <t:lừa hoang> |aɣyul n ḍama |sɣyul<t:ngu ngốc, đần độn> }} ==={{section|see}}=== {{col|shi |asnus<t:lừa con> |ayyis<t:ngựa> }} ==={{section|ref}}=== * {{R:shi:DBTF|I|page=175a}} {{C|shi|Lớp Thú}} 4e2uynufmar2gcipo6ykcv0kx565zrw arda 0 303580 2344971 2156188 2026-04-13T13:36:39Z Hiyuune 50834 2344971 wikitext text/x-wiki {{also|Arda|arða}} =={{langname|pga}}== ==={{section|pron}}=== {{pga-IPA}} ==={{section|n}}=== {{head|pga|Danh từ}} # [[kiến|Kiến]] [[trắng]]. # [[mối|Mối]]. ==={{section|ref}}=== * {{R:pga:Smith-Ama|page=121}} =={{langname|ast}}== ==={{section|v}}=== {{head|ast|Biến thể hình thái động từ}} # {{inflection of|ast|arder||sub|pres|ở|1//3|s}} ohxt8xvtsefgf47yrqib01u9d653o1m 2344972 2344971 2026-04-13T13:39:47Z Hiyuune 50834 2344972 wikitext text/x-wiki {{also|Arda|arða}} =={{langname|pga}}== ==={{section|pron}}=== {{pga-IPA}} ==={{section|n}}=== {{head|pga|Danh từ}} # [[kiến|Kiến]] [[trắng]]. # [[mối|Mối]]. ==={{section|ref}}=== * {{R:pga:Smith-Ama|page=121}} =={{langname|ast}}== ==={{section|v}}=== {{head|ast|Biến thể hình thái động từ}} # {{inflection of|ast|arder||sub|pres|ở|1//3|s}} =={{langname|gl}}== ==={{section|v}}=== {{head|gl|Biến thể hình thái động từ}} # {{gl-verb form of|arder}} =={{langname|ga}}== ==={{section|pron}}=== * {{IPA4|ga|/ˈɑːɾˠd̪ˠə/}} {{rfap|ga}} ==={{section|adj}}=== {{head|ga|Biến thể hình thái tính từ}} # {{inflection of|ga|ard||nom//voc//dat//str:gen|p}} ==={{section|n}}=== {{head|ga|Biến thể hình thái danh từ|g=m-p}} # {{inflection of|ga|ard||nom|p}} ==={{section|n}}=== {{head|ga|Biến thể hình thái danh từ|g=f-p}} # {{plural of|ga|aird}} ==={{section|mut}}=== {{ga-mut}} ==={{Section|ref}}=== * {{R:ga:ODonaill}} 31o4d7sqfpzyew0nar4d13racrej56h 2344973 2344972 2026-04-13T13:40:02Z Hiyuune 50834 /* {{Section|ref}} */ 2344973 wikitext text/x-wiki {{also|Arda|arða}} =={{langname|pga}}== ==={{section|pron}}=== {{pga-IPA}} ==={{section|n}}=== {{head|pga|Danh từ}} # [[kiến|Kiến]] [[trắng]]. # [[mối|Mối]]. ==={{section|ref}}=== * {{R:pga:Smith-Ama|page=121}} =={{langname|ast}}== ==={{section|v}}=== {{head|ast|Biến thể hình thái động từ}} # {{inflection of|ast|arder||sub|pres|ở|1//3|s}} =={{langname|gl}}== ==={{section|v}}=== {{head|gl|Biến thể hình thái động từ}} # {{gl-verb form of|arder}} =={{langname|ga}}== ==={{section|pron}}=== * {{IPA4|ga|/ˈɑːɾˠd̪ˠə/}} {{rfap|ga}} ==={{section|adj}}=== {{head|ga|Biến thể hình thái tính từ}} # {{inflection of|ga|ard||nom//voc//dat//str:gen|p}} ==={{section|n}}=== {{head|ga|Biến thể hình thái danh từ|g=m-p}} # {{inflection of|ga|ard||nom|p}} ==={{section|n}}=== {{head|ga|Biến thể hình thái danh từ|g=f-p}} # {{plural of|ga|aird}} ==={{section|mut}}=== {{ga-mut}} ==={{section|ref}}=== * {{R:ga:ODonaill}} 73gea7c34lzh3r0la7k7yrbsh43b9nb 2344974 2344973 2026-04-13T13:41:30Z Hiyuune 50834 /* {{section|ref}} */ 2344974 wikitext text/x-wiki {{also|Arda|arða}} =={{langname|pga}}== ==={{section|pron}}=== {{pga-IPA}} ==={{section|n}}=== {{head|pga|Danh từ}} # [[kiến|Kiến]] [[trắng]]. # [[mối|Mối]]. ==={{section|ref}}=== * {{R:pga:Smith-Ama|page=121}} =={{langname|ast}}== ==={{section|v}}=== {{head|ast|Biến thể hình thái động từ}} # {{inflection of|ast|arder||sub|pres|ở|1//3|s}} =={{langname|gl}}== ==={{section|v}}=== {{head|gl|Biến thể hình thái động từ}} # {{gl-verb form of|arder}} =={{langname|ga}}== ==={{section|pron}}=== * {{IPA4|ga|/ˈɑːɾˠd̪ˠə/}} {{rfap|ga}} ==={{section|adj}}=== {{head|ga|Biến thể hình thái tính từ}} # {{inflection of|ga|ard||nom//voc//dat//str:gen|p}} ==={{section|n}}=== {{head|ga|Biến thể hình thái danh từ|g=m-p}} # {{inflection of|ga|ard||nom|p}} ==={{section|n}}=== {{head|ga|Biến thể hình thái danh từ|g=f-p}} # {{plural of|ga|aird}} ==={{section|mut}}=== {{ga-mut}} ==={{section|ref}}=== * {{R:ga:ODonaill}} =={{langname|sga}}== ==={{section|pron}}=== * {{sga-IPA}} ==={{section|adj}}=== {{head|sga|Biến thể hình thái tính từ}} # {{infl of|sga|ard||nom|ở|f//n|p|;|voc//acc|tất cả giống|ở|p}} ==={{section|mut}}=== {{sga-mutation}} ryif9i92mm56ohf2llabs4bqpovirca Mô đun:se-nominals 828 304433 2345185 2269192 2026-04-14T09:20:01Z Higashizakura 36666 2345185 Scribunto text/plain local lang = require("Module:languages").getByCode("se") local export = {} local possessives = { ["1|s"] = {even = "n", odd = "an"}, ["2|s"] = {even = "t", odd = "at"}, ["3|s"] = {even = "s", odd = "is"}, ["1|d"] = {even = "me", odd = "eamẹ"}, ["2|d"] = {even = "de", odd = "eattẹ"}, ["3|d"] = {even = "ska", odd = "easkkạ"}, ["1|p"] = {even = "met", odd = "eamẹt"}, ["2|p"] = {even = "det", odd = "eattẹt"}, ["3|p"] = {even = "set", odd = "easẹt"}, } -- Inflection functions function export.even(frame) local fparams = { [1] = {required = true}, ["nograd"] = {type = "boolean"}, } local fargs = require("Module:parameters").process(frame.args, fparams) local params = { [1] = {required = true, default = "{{{1}}}"}, ["attr"] = fargs[1] == "Tính từ" and {list = true} or nil, ["e"] = fargs[1] == "Tính từ" and {type = "boolean"} or nil, ["n"] = fargs[1] == "Danh từ" and {} or nil, ["novowel"] = {type = "boolean"}, ["poss"] = fargs[1] == "Danh từ" and {} or nil, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1], not fargs["nograd"]) local data = { has_attr = fargs[1] == "Tính từ", has_poss = fargs[1] == "Danh từ" and not args["poss"], forms = {}, info = "Thân " .. require("Module:links").full_link({lang = lang, alt = stem.uvowel}, "term") .. " chẵn", categories = {}, } if stem.gradation then data.info = data.info .. ", luân phiên " .. require("Module:links").full_link({lang = lang, alt = stem.gradation.strong.scons}, "term") .. "-" .. require("Module:links").full_link({lang = lang, alt = stem.gradation.weak.scons}, "term") else data.info = data.info .. ", không luân phiên" end if args["e"] and not stem.uvowel == "i" then error("The parameter \"e=1\" must be used with stems ending in -i.") elseif not mw.ustring.find(stem.uvowel, "^[aáeiou]$") and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The final vowel(s) of the stem must be one of a, á, e, i, o, u.") end if fargs[1] == "Danh từ" and args["poss"] and args["poss"] ~= "-" then local poss = possessives[args["poss"]:gsub("_", "|")] data.forms["nom|s"] = {stem:make_form{grade = "strong", ending = poss.even, variant = mw.ustring.find(args["poss"], "3") and "normal" or "e"}} data.forms["acc|s"] = {stem:make_form{grade = mw.ustring.find(args["poss"], "1") and "strong" or "weak", ending = poss.even, variant = mw.ustring.find(args["poss"], "3") and "normal" or "e"}} data.forms["gen|s"] = {stem:make_form{grade = mw.ustring.find(args["poss"], "1") and "strong" or "weak", ending = poss.even, variant = mw.ustring.find(args["poss"], "3") and "normal" or "e"}} data.forms["ill|s"] = {stem:make_form{grade = "strong", ending = "s" .. poss.odd, variant = "e"}} data.forms["loc|s"] = {stem:make_form{grade = "weak", ending = "st" .. poss.odd}} data.forms["com|s"] = {stem:make_form{grade = "weak", ending = "in" .. poss.odd, variant = "j"}} data.forms["nom|p"] = nil data.forms["acc|p"] = {stem:make_form{grade = "weak", ending = "id" .. poss.odd, variant = "j"}} data.forms["gen|p"] = {stem:make_form{grade = "weak", ending = "id" .. poss.odd, variant = "j"}} data.forms["ill|p"] = {stem:make_form{grade = "weak", ending = "idasa" .. poss.even, variant = "j"}} data.forms["loc|p"] = {stem:make_form{grade = "weak", ending = "in" .. poss.odd, variant = "j"}} data.forms["com|p"] = {stem:make_form{grade = "weak", ending = "id" .. poss.odd .. "guin", variant = "j"}} data.forms["ess"] = {stem:make_form{grade = "strong", ending = "n" .. poss.odd}} else table.insert(data.categories, fargs[1] .. " chẵn " .. lang:getCanonicalName()) table.insert(data.categories, fargs[1] .. " chẵn " .. lang:getCanonicalName() .. " có thân kết thúc bằng " .. (stem.uvowel or "")) if not stem.gradation then table.insert(data.categories, fargs[1] .. " chẵn " .. lang:getCanonicalName() .. " không luân phiên") end data.forms["nom|s"] = {stem:make_form{grade = "strong", variant = args["novowel"] and "none" or args["e"] and "short" or nil}} data.forms["acc|s"] = {stem:make_form{grade = "weak"}} data.forms["gen|s"] = {stem:make_form{grade = "weak"}, fargs[1] == "Danh từ" and stem:make_form{grade = "weak", variant = "short"} or nil} data.forms["ill|s"] = {stem:make_form{grade = "strong", ending = "i", variant = "e_contr_j"}} data.forms["loc|s"] = {stem:make_form{grade = "weak", ending = "s"}} data.forms["com|s"] = {stem:make_form{grade = "weak", ending = "in", variant = "j"}} data.forms["nom|p"] = {stem:make_form{grade = "weak", ending = "t"}} data.forms["acc|p"] = {stem:make_form{grade = "weak", ending = "id", variant = "j"}} data.forms["gen|p"] = {stem:make_form{grade = "weak", ending = "id", variant = "j"}} data.forms["ill|p"] = {stem:make_form{grade = "weak", ending = "ide", variant = "j"}} data.forms["loc|p"] = {stem:make_form{grade = "weak", ending = "in", variant = "j"}} data.forms["com|p"] = {stem:make_form{grade = "weak", ending = "iguin", variant = "j"}} data.forms["ess"] = {stem:make_form{grade = "strong", ending = "n"}} if fargs[1] == "Danh từ" then data.forms["1|s|poss"] = {stem:make_form{grade = "strong", ending = "n", variant = "e"}} data.forms["2|s|poss"] = {stem:make_form{grade = "strong", ending = "t", variant = "e"}} data.forms["3|s|poss"] = {stem:make_form{grade = "strong", ending = "s"}} data.forms["1|d|poss"] = {stem:make_form{grade = "strong", ending = "me", variant = "e"}} data.forms["2|d|poss"] = {stem:make_form{grade = "strong", ending = "de", variant = "e"}} data.forms["3|d|poss"] = {stem:make_form{grade = "strong", ending = "ska"}} data.forms["1|p|poss"] = {stem:make_form{grade = "strong", ending = "met", variant = "e"}} data.forms["2|p|poss"] = {stem:make_form{grade = "strong", ending = "det", variant = "e"}} data.forms["3|p|poss"] = {stem:make_form{grade = "strong", ending = "set"}} end if data.forms["gen|s"][2] == data.forms["gen|s"][1] then data.forms["gen|s"][2] = nil end end postprocess(args, data) return make_table(data) end function export.odd(frame) local fparams = { [1] = {required = true}, ["nograd"] = {type = "boolean"}, } local fargs = require("Module:parameters").process(frame.args, fparams) local params = { [1] = {default = mw.title.getCurrentTitle().nsText == "Bản_mẫu" and "{{{1}}}" or ""}, ["attr"] = fargs[1] == "Tính từ" and {list = true} or nil, ["final"] = {}, ["n"] = fargs[1] == "Danh từ" and {} or nil, ["noapocope"] = not fargs["nograd"] and {type = "boolean"} or nil, ["noumlaut"] = not fargs["nograd"] and {type = "boolean"} or nil, ["poss"] = fargs[1] == "Danh từ" and {} or nil, ["Q31"] = not fargs["nograd"] and {type = "boolean"} or nil, } local args = require("Module:parameters").process(frame:getParent().args, params) local strong = require("Module:se-common").Stem(args[1], args["Q31"] and "Q31" or not fargs["nograd"], args["final"]) local weak = require("Module:se-common").Stem(args[1], args["Q31"] and "Q31" or not fargs["nograd"], args["final"]) local variant = nil if args["attr"] and args["attr"][1] ~= "-" then if args["attr"][1] then require("Module:debug").track("se-nominals/attr") else require("Module:debug").track("se-nominals/no attr") end end local data = { has_attr = fargs[1] == "Tính từ", has_poss = fargs[1] == "Danh từ" and not args["poss"], forms = {}, info = "lẻ", categories = {}, } if strong.gradation then if not args["noumlaut"] then variant = "e" end if not args["noapocope"] and mw.ustring.find(weak.ucons, "^[gmn]$") then weak.ucons = "" end data.info = data.info .. ", luân phiên " .. require("Module:links").full_link({lang = lang, alt = strong.gradation.strong.scons}, "term") .. "-" .. require("Module:links").full_link({lang = lang, alt = strong.gradation.weak.scons}, "term") else data.info = data.info .. ", không luân phiên" end if strong.ucons == "" and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The strong-grade stem must end in a consonant.") end if fargs[1] == "Danh từ" and args["poss"] and args["poss"] ~= "-" then local poss = possessives[args["poss"]:gsub("_", "|")] data.forms["nom|s"] = {strong:make_form{grade = "strong", ending = poss.odd, variant = variant}} data.forms["acc|s"] = {strong:make_form{grade = "strong", ending = poss.odd, variant = variant}} data.forms["gen|s"] = {strong:make_form{grade = "strong", ending = poss.odd, variant = variant}} data.forms["ill|s"] = {strong:make_form{grade = "strong", ending = "asa" .. poss.even, variant = variant}} data.forms["loc|s"] = {strong:make_form{grade = "strong", ending = "istt" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even, variant = variant}} data.forms["com|s"] = {strong:make_form{grade = "strong", ending = "iinn" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even, variant = variant}} data.forms["nom|p"] = nil data.forms["acc|p"] = {strong:make_form{grade = "strong", ending = "iidd" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even, variant = variant}} data.forms["gen|p"] = {strong:make_form{grade = "strong", ending = "iidd" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even, variant = variant}} data.forms["ill|p"] = {strong:make_form{grade = "strong", ending = "iiddás" .. poss.odd, variant = variant}} data.forms["loc|p"] = {strong:make_form{grade = "strong", ending = "iinn" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even, variant = variant}} data.forms["com|p"] = {strong:make_form{grade = "strong", ending = "iidd" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even .. "guin", variant = variant}} data.forms["ess"] = {weak:make_form{grade = "weak", ending = (weak.ucons == "" and "" or "i") .. "n" .. (weak.ucons == "" and poss.odd or "i" .. poss.even)}} else table.insert(data.categories, fargs[1] .. " lẻ " .. lang:getCanonicalName()) if strong.gradation then table.insert(data.categories, fargs[1] .. " lẻ " .. lang:getCanonicalName() .. " có luân phiên") else table.insert(data.categories, fargs[1] .. " lẻ " .. lang:getCanonicalName() .. " không luân phiên") end data.forms["nom|s"] = {weak:make_form{grade = "weak"}} data.forms["acc|s"] = {strong:make_form{grade = "strong", ending = "a", variant = variant}} data.forms["gen|s"] = {strong:make_form{grade = "strong", ending = "a", variant = variant}} data.forms["ill|s"] = {strong:make_form{grade = "strong", ending = "ii", variant = variant}} data.forms["loc|s"] = {strong:make_form{grade = "strong", ending = "is", variant = variant}} data.forms["com|s"] = {strong:make_form{grade = "strong", ending = "iin", variant = variant}} data.forms["nom|p"] = {strong:make_form{grade = "strong", ending = "at", variant = variant}} data.forms["acc|p"] = {strong:make_form{grade = "strong", ending = "iid", variant = variant}} data.forms["gen|p"] = {strong:make_form{grade = "strong", ending = "iid", variant = variant}} data.forms["ill|p"] = {strong:make_form{grade = "strong", ending = "iidda", variant = variant}} data.forms["loc|p"] = {strong:make_form{grade = "strong", ending = "iin", variant = variant}} data.forms["com|p"] = {strong:make_form{grade = "strong", ending = "iiguin", variant = variant}} data.forms["ess"] = {weak:make_form{grade = "weak", ending = (weak.ucons == "" and "" or "i") .. "n"}} if fargs[1] == "Danh từ" then data.forms["1|s|poss"] = {strong:make_form{grade = "strong", ending = "an", variant = variant}} data.forms["2|s|poss"] = {strong:make_form{grade = "strong", ending = "at", variant = variant}} data.forms["3|s|poss"] = {strong:make_form{grade = "strong", ending = "is", variant = variant}} data.forms["1|d|poss"] = {strong:make_form{grade = "strong", ending = "eamẹ", variant = variant}} data.forms["2|d|poss"] = {strong:make_form{grade = "strong", ending = "eattẹ", variant = variant}} data.forms["3|d|poss"] = {strong:make_form{grade = "strong", ending = "easkkạ", variant = variant}} data.forms["1|p|poss"] = {strong:make_form{grade = "strong", ending = "eamẹt", variant = variant}} data.forms["2|p|poss"] = {strong:make_form{grade = "strong", ending = "eattẹt", variant = variant}} data.forms["3|p|poss"] = {strong:make_form{grade = "strong", ending = "easẹt", variant = variant}} end end postprocess(args, data) return make_table(data) end function export.contr(frame) local fparams = { [1] = {required = true}, ["nograd"] = {type = "boolean"}, } local fargs = require("Module:parameters").process(frame.args, fparams) local params = { [1] = {default = mw.title.getCurrentTitle().nsText == "Bản_mẫu" and "{{{1}}}" or ""}, ["attr"] = fargs[1] == "Tính từ" and {list = true} or nil, ["n"] = fargs[1] == "Danh từ" and {} or nil, ["poss"] = fargs[1] == "Danh từ" and {} or nil, ["Q31"] = not fargs["nograd"] and {type = "boolean"} or nil, } local args = require("Module:parameters").process(frame:getParent().args, params) local strong = require("Module:se-common").Stem(args[1], args["Q31"] and "Q31" or not fargs["nograd"], args["final"]) local weak = require("Module:se-common").Stem(args[1], args["Q31"] and "Q31" or not fargs["nograd"], args["final"]) strong.ucons = "" -- final consonant is lost in the strong grade local data = { has_attr = fargs[1] == "Tính từ", has_poss = fargs[1] == "Danh từ" and not args["poss"], forms = {}, info = "Thân " .. require("Module:links").full_link({lang = lang, alt = strong.uvowel}, "term") .. " rút gọn", categories = {}, } if strong.gradation then data.info = data.info .. ", luân phiên " .. require("Module:links").full_link({lang = lang, alt = strong.gradation.strong.scons}, "term") .. "-" .. require("Module:links").full_link({lang = lang, alt = strong.gradation.weak.scons}, "term") else data.info = data.info .. ", không luân phiên" end if not mw.ustring.find(strong.uvowel, "^[aáiou]$") and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The final vowel(s) of the stem must be one of a, á, i, o, u.") end if fargs[1] == "Danh từ" and args["poss"] and args["poss"] ~= "-" then local poss = possessives[args["poss"]:gsub("_", "|")] data.forms["nom|s"] = {strong:make_form{grade = "strong", ending = poss.even, variant = "contr_noun"}} data.forms["acc|s"] = {strong:make_form{grade = "strong", ending = poss.even, variant = "contr_noun"}} data.forms["gen|s"] = {strong:make_form{grade = "strong", ending = poss.even, variant = "contr_noun"}} data.forms["ill|s"] = {strong:make_form{grade = "strong", ending = "s" .. poss.odd, variant = "contr_noun"}} data.forms["loc|s"] = {strong:make_form{grade = "strong", ending = "st" .. poss.odd, variant = "contr_noun"}} data.forms["com|s"] = {strong:make_form{grade = "strong", ending = "in" .. poss.odd, variant = "contr_noun_j"}} data.forms["nom|p"] = nil data.forms["acc|p"] = {strong:make_form{grade = "strong", ending = "id" .. poss.odd, variant = "contr_noun_j"}} data.forms["gen|p"] = {strong:make_form{grade = "strong", ending = "id" .. poss.odd, variant = "contr_noun_j"}} data.forms["ill|p"] = {strong:make_form{grade = "strong", ending = "idasa" .. poss.even, variant = "contr_noun_j"}} data.forms["loc|p"] = {strong:make_form{grade = "strong", ending = "in" .. poss.odd, variant = "contr_noun_j"}} data.forms["com|p"] = {strong:make_form{grade = "strong", ending = "id" .. poss.odd .. "guin", variant = "contr_noun_j"}} data.forms["ess"] = {weak:make_form{grade = "weak", ending = (weak.ucons == "" and "" or "i") .. "n" .. (weak.ucons == "" and poss.odd or "i" .. poss.even)}} else table.insert(data.categories, fargs[1] .. " rút gọn " .. lang:getCanonicalName()) table.insert(data.categories, fargs[1] .. " rút gọn " .. lang:getCanonicalName() .. " có thân kết thúc bằng " .. (strong.uvowel or "")) data.forms["nom|s"] = {weak:make_form{grade = "weak"}} data.forms["acc|s"] = {strong:make_form{grade = "strong", variant = "contr_noun"}} data.forms["gen|s"] = {strong:make_form{grade = "strong", variant = "contr_noun"}} data.forms["ill|s"] = {strong:make_form{grade = "strong", ending = "i", variant = "contr_noun_j"}} data.forms["loc|s"] = {strong:make_form{grade = "strong", ending = "s", variant = "contr_noun"}} data.forms["com|s"] = {strong:make_form{grade = "strong", ending = "in", variant = "contr_noun_j"}} data.forms["nom|p"] = {strong:make_form{grade = "strong", ending = "t", variant = "contr_noun"}} data.forms["acc|p"] = {strong:make_form{grade = "strong", ending = "id", variant = "contr_noun_j"}} data.forms["gen|p"] = {strong:make_form{grade = "strong", ending = "id", variant = "contr_noun_j"}} data.forms["ill|p"] = {strong:make_form{grade = "strong", ending = "ide", variant = "contr_noun_j"}} data.forms["loc|p"] = {strong:make_form{grade = "strong", ending = "in", variant = "contr_noun_j"}} data.forms["com|p"] = {strong:make_form{grade = "strong", ending = "iguin", variant = "contr_noun_j"}} data.forms["ess"] = {weak:make_form{grade = "weak", ending = (weak.ucons == "" and "" or "i") .. "n"}} if fargs[1] == "Danh từ" then data.forms["1|s|poss"] = {strong:make_form{grade = "strong", ending = "n", variant = "contr_noun"}} data.forms["2|s|poss"] = {strong:make_form{grade = "strong", ending = "t", variant = "contr_noun"}} data.forms["3|s|poss"] = {strong:make_form{grade = "strong", ending = "s", variant = "contr_noun"}} data.forms["1|d|poss"] = {strong:make_form{grade = "strong", ending = "me", variant = "contr_noun"}} data.forms["2|d|poss"] = {strong:make_form{grade = "strong", ending = "de", variant = "contr_noun"}} data.forms["3|d|poss"] = {strong:make_form{grade = "strong", ending = "ska", variant = "contr_noun"}} data.forms["1|p|poss"] = {strong:make_form{grade = "strong", ending = "met", variant = "contr_noun"}} data.forms["2|p|poss"] = {strong:make_form{grade = "strong", ending = "det", variant = "contr_noun"}} data.forms["3|p|poss"] = {strong:make_form{grade = "strong", ending = "set", variant = "contr_noun"}} end end postprocess(args, data) return make_table(data) end function export.even_comp(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["attr"] = {list = true}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = { has_attr = true, forms = {}, info = "", categories = {}, } data.info = "even " .. require("Module:links").full_link({lang = lang, alt = "o"}, "term") .. "-stem" data.info = data.info .. require("Module:links").full_link({lang = lang, alt = "bb"}, "term") .. "-" .. require("Module:links").full_link({lang = lang, alt = "pp"}, "term") .. " gradation" table.insert(data.categories, lang:getCanonicalName() .. " even adjectives") table.insert(data.categories, lang:getCanonicalName() .. " even o-stem adjectives") data.forms["nom|s"] = {args[1] .. "it", args[1] .. "et"} data.forms["acc|s"] = {args[1] .. "eappọ"} data.forms["gen|s"] = {args[1] .. "eappọ"} data.forms["ill|s"] = {args[1] .. "ēbbui"} data.forms["loc|s"] = {args[1] .. "eappọs"} data.forms["com|s"] = {args[1] .. "eappuin"} data.forms["nom|p"] = {args[1] .. "eappọt"} data.forms["acc|p"] = {args[1] .. "eappuid"} data.forms["gen|p"] = {args[1] .. "eappuid"} data.forms["ill|p"] = {args[1] .. "eappuide"} data.forms["loc|p"] = {args[1] .. "eappuin"} data.forms["com|p"] = {args[1] .. "eappuiguin"} data.forms["ess"] = {args[1] .. "eabbọn"} postprocess(args, data) return make_table(data) end function export.odd_comp(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["attr"] = {list = true}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = { has_attr = true, forms = {}, info = "", categories = {}, } data.info = "odd " .. require("Module:links").full_link({lang = lang, alt = "u"}, "term") .. "-stem, no gradation" table.insert(data.categories, lang:getCanonicalName() .. " odd adjectives") table.insert(data.categories, lang:getCanonicalName() .. " non-gradating odd adjectives") data.forms["nom|s"] = {args[1] .. "t"} data.forms["acc|s"] = {args[1] .. "bu"} data.forms["gen|s"] = {args[1] .. "bu"} data.forms["ill|s"] = {args[1] .. "bui"} data.forms["loc|s"] = {args[1] .. "bus"} data.forms["com|s"] = {args[1] .. "buin"} data.forms["nom|p"] = {args[1] .. "but"} data.forms["acc|p"] = {args[1] .. "buid"} data.forms["gen|p"] = {args[1] .. "buid"} data.forms["ill|p"] = {args[1] .. "buidda"} data.forms["loc|p"] = {args[1] .. "buin"} data.forms["com|p"] = {args[1] .. "buiguin"} data.forms["ess"] = {args[1] .. "bun"} postprocess(args, data) return make_table(data) end function export.dem(frame) local params = { [1] = {required = true, default = "dat"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = { forms = {}, info = "", categories = {}, } data.info = "pronominal inflection" local stem if args[1] == "gii" then stem = "gea" elseif args[1] == "mii" then stem = "ma" elseif mw.ustring.sub(args[1], -1) == "t" then stem = mw.ustring.sub(args[1], 1, -2) else error("Invalid pronoun.") end data.forms["nom|s"] = {args[1]} data.forms["acc|s"] = {stem .. "n"} data.forms["gen|s"] = {stem .. "n"} data.forms["ill|s"] = {stem .. "sa"} data.forms["loc|s"] = {stem .. "s"} data.forms["com|s"] = {stem .. "inna"} data.forms["nom|p"] = {stem .. "t"} data.forms["acc|p"] = {stem .. "id"} data.forms["gen|p"] = {stem .. "id"} data.forms["ill|p"] = {stem .. "idda"} data.forms["loc|p"] = {stem .. "in"} data.forms["com|p"] = {stem .. "iguin"} data.forms["ess"] = {stem .. "nin"} if args[1] == "mii" then table.insert(data.forms["acc|s"], "máid") end postprocess(args, data) return make_table(data) end export["ieš"] = function(frame) local params = { ["poss"] = {}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = { has_poss = true, forms = {}, info = "Tính từ, suppletive", categories = {}, } if args["poss"] then local poss = possessives[args["poss"]:gsub("_", "|")] data.forms["acc|s"] = {"ieža" .. poss.even, mw.ustring.find(args["poss"], "1") and "iehča" .. poss.even or nil} data.forms["gen|s"] = {"ieža" .. poss.even, mw.ustring.find(args["poss"], "1") and "iehča" .. poss.even or nil} data.forms["ill|s"] = {"alcces" .. poss.odd, "alcce" .. poss.even} data.forms["loc|s"] = {"aldd" .. (mw.ustring.find(args["poss"], "3") and "i" or "á") .. poss.even, not mw.ustring.find(args["poss"], "sg") and "alddiin" .. poss.odd or nil} data.forms["com|s"] = {"iežain" .. poss.odd} data.forms["ess"] = {"iehčan" .. poss.odd} else data.forms["nom|s"] = {"ieš"} data.forms["nom|p"] = {"ieža"} data.forms["1|s|poss"] = {"iežan"} data.forms["2|s|poss"] = {"iežat"} data.forms["3|s|poss"] = {"iežas"} data.forms["1|d|poss"] = {"iežame"} data.forms["2|d|poss"] = {"iežade"} data.forms["3|d|poss"] = {"iežaska"} data.forms["1|p|poss"] = {"iežamet"} data.forms["2|p|poss"] = {"iežadet"} data.forms["3|p|poss"] = {"iežaset"} end postprocess(args, data) return make_table(data) end function postprocess(args, data) if args["poss"] then data.has_poss = false end data.n = args["n"] if args["n"] == "p" then table.insert(data.categories, "Danh từ " .. lang:getCanonicalName() .. " chỉ có số nhiều") elseif args["n"] == "s" then table.insert(data.categories, "Danh từ " .. lang:getCanonicalName() .. " không đếm được") elseif args["n"] then error("args= must be \"s\" or \"p\".") end for key, form in pairs(data.forms) do -- Do not show singular or plural forms for nominals that don't have them if (args["n"] == "p" and key:find("|s$")) or (args["n"] == "s" and key:find("|p$")) then form = nil end data.forms[key] = form end if data.has_attr then if not args["attr"][1] then data.forms["attr"] = mw.clone(data.forms["nom|s"]) elseif args["attr"][1] ~= "-" then data.forms["attr"] = args["attr"] end end data.lemma = (data.forms["nom|" .. (data.n or "s")] or data.forms["acc|" .. (data.n or "s")])[1] -- Check if the lemma form matches the page name if (lang:makeEntryName(data.lemma)) ~= mw.title.getCurrentTitle().text then table.insert(data.categories, lang:getCanonicalName() .. " entries with inflection not matching pagename") end end -- Make the table function make_table(data) local function repl(param) local accel = true local no_store = false if param == "info" then return mw.getContentLanguage():ucfirst(data.info or "") elseif string.sub(param, 1, 1) == "!" then no_store = true param = string.sub(param, 2) elseif string.sub(param, 1, 1) == "#" then accel = false param = string.sub(param, 2) end local forms = data.forms[param] if not forms then return "&mdash;" end local ret = {} for key, subform in ipairs(forms) do table.insert(ret, require("Module:links").full_link({lang = lang, term = subform, accel = accel and {form = param, no_store = no_store} or nil})) end return table.concat(ret, "<br/>") end local wikicode = {} table.insert(wikicode, [=[ {| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border:solid 1px var(--wikt-palette-lightindigo); text-align: left;" cellspacing="1" cellpadding="2" |- style="background: var(--wikt-palette-palegreen);color:inherit; text-align: left;" ! class="vsToggleElement" colspan="3" | {{{info}}}]=]) if data.has_attr then table.insert(wikicode, [=[ |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[attributive|Định ngữ]] | colspan="2" | {{{!attr}}}]=]) end table.insert(wikicode, [=[ |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="width: 8em; background: var(--wikt-palette-palegreen);color:inherit;" | [[nominative|Danh cách]] | style="width: 15em;" colspan="2" | {{{!nom|]=] .. (data.n or "s") .. [=[}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[genitive|Sinh cách]] | colspan="2" | {{{!gen|]=] .. (data.n or "s") .. [=[}}}]=]) if data.has_attr then table.insert(wikicode, [=[ |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[attributive|Định ngữ]] | colspan="2" | {{{attr}}} ]=]) end table.insert(wikicode, [=[ |- class="vsHide" ! style="width: 8em; background: var(--wikt-palette-mint);color:inherit;" | ! style="width: 12em; background: var(--wikt-palette-mint);color:inherit;" | Số ít ! style="width: 12em; background: var(--wikt-palette-mint);color:inherit;" | Số nhiều |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[nominative|Danh cách]] | data-accel-col="1" | {{{nom|s}}} | data-accel-col="2" | {{{nom|p}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[accusative|Đối cách]] | data-accel-col="1" | {{{acc|s}}} | data-accel-col="2" | {{{acc|p}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[genitive|Sinh cách]] | data-accel-col="1" | {{{gen|s}}} | data-accel-col="2" | {{{gen|p}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[illative|Nhập cách]] | data-accel-col="1" | {{{ill|s}}} | data-accel-col="2" | {{{ill|p}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[locative|Định vị cách]] | data-accel-col="1" | {{{loc|s}}} | data-accel-col="2" | {{{loc|p}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[comitative|Cách kèm]] | data-accel-col="1" | {{{com|s}}} | data-accel-col="2" | {{{com|p}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[essive|Cách cương vị]] | colspan="2" | {{{ess}}}]=]) -- Possessive forms if data.has_poss then table.insert(wikicode, [=[ |- class="vsHide" | colspan="3" style="padding: 0;" | {| class="inflection-table vsSwitcher" style="text-align: left; width: 100%;" cellspacing="1" cellpadding="2" |- style="background: var(--wikt-palette-palegreen);color:inherit; text-align: left;" ! class="vsToggleElement" colspan="4" | Dạng sở hữu |- class="vsHide" ! style="width: 8em; background: var(--wikt-palette-mint);color:inherit;" | ! style="width: 12em; background: var(--wikt-palette-mint);color:inherit;" | Số ít ! style="width: 12em; background: var(--wikt-palette-mint);color:inherit;" | Số đôi ! style="width: 12em; background: var(--wikt-palette-mint);color:inherit;" | Số nhiều |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | Ngôi&nbsp;thứ&nbsp;nhất | {{{1|s|poss}}} | {{{1|d|poss}}} | {{{1|p|poss}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | Ngôi&nbsp;thứ&nbsp;hai | {{{2|s|poss}}} | {{{2|d|poss}}} | {{{2|p|poss}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit;" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | Ngôi&nbsp;thứ&nbsp;ba | {{{3|s|poss}}} | {{{3|d|poss}}} | {{{3|p|poss}}} |}]=]) end table.insert(wikicode, "\n|}") return mw.ustring.gsub(table.concat(wikicode), "{{{([#!]?[a-z0-9|]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang) end return export iuww6vihu31hzuith61fka1dwxefny4 cagan 0 304525 2345195 2284849 2026-04-14T10:56:03Z Hiyuune 50834 2345195 wikitext text/x-wiki {{also|cāgān|cả gan}} =={{langname|se}}== ==={{section|pron}}=== * {{se-IPA}} ==={{section|etym}}=== {{rfe|se}} Cùng gốc với {{etym-cog|sms|cââǥǥan}}. ==={{section|n}}=== {{se-noun}} # {{topics|se|Lớp Chim}} [[chim mò sò|Chim mò sò]]. ===={{section|infl}}==== {{se-infl-noun-odd-ng|cagan}} ==={{section|further}}=== * {{R:Álgu|12641}} ==={{section|etym}} 2=== {{nonlemma}} ===={{section|v}}==== {{head|se|Biến thể hình thái động từ}} # {{inflection of|se|cahkat||indc|pres|ở|1s}} =={{langname|gl}}== ==={{section|v}}=== {{head|gl|Biến thể hình thái động từ}} # {{gl-verb form of|cagar}} =={{langname|es}}== ==={{section|pron}}=== {{es-pr}} ==={{section|v}}=== {{head|es|Biến thể hình thái động từ}} # {{es-verb form of|cagar}} 2px75ho2wyctetyhu9255df8srlkeve arçımaq 0 304589 2344968 2158791 2026-04-13T13:12:47Z Hiyuune 50834 2344968 wikitext text/x-wiki =={{langname|crh}}== ==={{section|v}}=== {{head|crh|Động từ}} # [[bóc|Bóc]]. ===={{section|forms}}==== {{crh-latin-conj|ı|ı}} amqf7cjhgbz1tjft249oxajkyrfxrwg Mô đun:se-verbs 828 306975 2345184 2340517 2026-04-14T09:18:55Z Higashizakura 36666 2345184 Scribunto text/plain local export = {} local output = {} local concat = table.concat local insert = table.insert local lang = require("Module:languages").getByCode("se") local function postprocess(args, data) data.lemma = data.forms["inf"][1] data.forms["agnt|ptcp"] = nil -- Remove until there's a reliable way to determine which verbs have it -- Check if the lemma form matches the page name if lang:stripDiacritics(data.lemma) ~= mw.loadData("Module:headword/data").pagename then insert(data.categories, "Mục từ có biến tố không khớp với tên trang " .. lang:getCanonicalName()) end end -- Inflection functions function export.even(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1], true) local data = { forms = {}, info = "thân " .. require("Module:links").full_link({lang = lang, alt = stem.uvowel}, "term") .. " chẵn", categories = {}, } if stem.gradation then data.info = data.info .. ", chuyển bậc " .. require("Module:links").full_link({lang = lang, alt = stem.gradation.strong.scons}, "term") .. "-" .. require("Module:links").full_link({lang = lang, alt = stem.gradation.weak.scons}, "term") .. " " else data.info = data.info .. ", không chuyển bậc" end if not mw.ustring.find(stem.uvowel, "^[aiu]$") and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The final vowel(s) of the stem must be one of a, i, u.") end insert(data.categories, "Động từ chẵn " .. lang:getCanonicalName()) insert(data.categories, "Động từ chẵn có thân từ kết thúc bằng " .. (stem.uvowel or "") .. " " .. lang:getCanonicalName()) data.forms["inf"] = {stem:make_form{grade = "strong", ending = "t"}} data.forms["pres|ptcp"] = {stem:make_form{grade = "extra", variant = "j_contr_final"}} data.forms["past|ptcp"] = {stem:make_form{grade = "strong", ending = "n", variant = "e"}} data.forms["agnt|ptcp"] = {stem:make_form{grade = "strong", ending = "n"}} data.forms["anoun"] = {stem:make_form{grade = "strong", ending = "n"}} data.forms["action|ine"] = {stem:make_form{grade = "strong", ending = "min"}, stem:make_form{grade = "strong", ending = "me"}} data.forms["action|ela"] = {stem:make_form{grade = "strong", ending = "mis"}} data.forms["action|com"] = {stem:make_form{grade = "strong", ending = "miin"}} data.forms["abe"] = {stem:make_form{grade = "weak", ending = "keahttá", variant = "short"}} data.forms["1|s|pres|indc"] = {stem:make_form{grade = "weak", ending = "n", variant = "pres_12sg"}} data.forms["2|s|pres|indc"] = {stem:make_form{grade = "weak", ending = "t", variant = "pres_12sg"}} data.forms["3|s|pres|indc"] = {stem:make_form{grade = "strong", variant = "pres_3sg"}} data.forms["1|d|pres|indc"] = {stem:make_form{grade = "strong", variant = "j_contr"}} data.forms["2|d|pres|indc"] = {stem:make_form{grade = "strong", ending = "beahtti"}} data.forms["3|d|pres|indc"] = {stem:make_form{grade = "strong", ending = "ba"}} data.forms["1|p|pres|indc"] = {stem:make_form{grade = "strong", ending = "t"}} data.forms["2|p|pres|indc"] = {stem:make_form{grade = "strong", ending = "bēhtet"}} data.forms["3|p|pres|indc"] = {stem:make_form{grade = "strong", ending = "t", variant = "j_contr"}} data.forms["pres|indc|conn"] = {stem:make_form{grade = "weak", variant = "short"}} data.forms["1|s|past|indc"] = {stem:make_form{grade = "strong", ending = "n", variant = "j_contr"}} data.forms["2|s|past|indc"] = {stem:make_form{grade = "strong", ending = "t", variant = "j_contr"}} data.forms["3|s|past|indc"] = {stem:make_form{grade = "weak", ending = "i", variant = "j"}} data.forms["1|d|past|indc"] = {stem:make_form{grade = "weak", ending = "ime", variant = "j"}} data.forms["2|d|past|indc"] = {stem:make_form{grade = "weak", ending = "ide", variant = "j"}} data.forms["3|d|past|indc"] = {stem:make_form{grade = "weak", ending = "iga", variant = "j"}} data.forms["1|p|past|indc"] = {stem:make_form{grade = "weak", ending = "imet", variant = "j"}} data.forms["2|p|past|indc"] = {stem:make_form{grade = "weak", ending = "idet", variant = "j"}} data.forms["3|p|past|indc"] = {stem:make_form{grade = "strong", variant = "j_contr"}} data.forms["past|indc|conn"] = {stem:make_form{grade = "strong", ending = "n", variant = "e"}} data.forms["1|s|impr"] = {stem:make_form{grade = "strong", ending = "n", variant = "impr"}} data.forms["2|s|impr"] = {stem:make_form{grade = "weak", variant = "short"}} data.forms["3|s|impr"] = {stem:make_form{grade = "strong", ending = "s", variant = "impr"}} data.forms["1|d|impr"] = {stem:make_form{grade = "extra", variant = "impr_final"}} data.forms["2|d|impr"] = {stem:make_form{grade = "extra", variant = "j_contr_final"}} data.forms["3|d|impr"] = {stem:make_form{grade = "strong", ending = "ska", variant = "impr"}} data.forms["1|p|impr"] = {stem:make_form{grade = "strong", ending = "t", variant = "impr"}, stem:make_form{grade = "extra", ending = "t", variant = "impr_final"}} data.forms["2|p|impr"] = {stem:make_form{grade = "strong", ending = "t", variant = "j_contr"}, stem:make_form{grade = "extra", ending = "t", variant = "j_contr_final"}} data.forms["3|p|impr"] = {stem:make_form{grade = "strong", ending = "set", variant = "impr"}} data.forms["impr|conn"] = {stem:make_form{grade = "weak", variant = "short"}} data.forms["1|s|cond1"] = {stem:make_form{grade = "weak", ending = "šin", variant = "e"}, stem:make_form{grade = "weak", ending = "šedjen", variant = "e"}} data.forms["2|s|cond1"] = {stem:make_form{grade = "weak", ending = "šit", variant = "e"}, stem:make_form{grade = "weak", ending = "šedjet", variant = "e"}} data.forms["3|s|cond1"] = {stem:make_form{grade = "weak", ending = "šii", variant = "e"}} data.forms["1|d|cond1"] = {stem:make_form{grade = "weak", ending = "šeimme", variant = "e"}} data.forms["2|d|cond1"] = {stem:make_form{grade = "weak", ending = "šeidde", variant = "e"}} data.forms["3|d|cond1"] = {stem:make_form{grade = "weak", ending = "šeigga", variant = "e"}} data.forms["1|p|cond1"] = {stem:make_form{grade = "weak", ending = "šeimmet", variant = "e"}} data.forms["2|p|cond1"] = {stem:make_form{grade = "weak", ending = "šeiddet", variant = "e"}} data.forms["3|p|cond1"] = {stem:make_form{grade = "weak", ending = "še", variant = "e"}, stem:make_form{grade = "weak", ending = "šedje", variant = "e"}} data.forms["cond1|conn"] = {stem:make_form{grade = "weak", ending = "še", variant = "e"}} data.forms["1|s|cond2"] = {stem:make_form{grade = "weak", ending = "lin", variant = "e"}, stem:make_form{grade = "weak", ending = "ledjen", variant = "e"}} data.forms["2|s|cond2"] = {stem:make_form{grade = "weak", ending = "lit", variant = "e"}, stem:make_form{grade = "weak", ending = "ledjet", variant = "e"}} data.forms["3|s|cond2"] = {stem:make_form{grade = "weak", ending = "lii", variant = "e"}} data.forms["1|d|cond2"] = {stem:make_form{grade = "weak", ending = "leimme", variant = "e"}} data.forms["2|d|cond2"] = {stem:make_form{grade = "weak", ending = "leidde", variant = "e"}} data.forms["3|d|cond2"] = {stem:make_form{grade = "weak", ending = "leigga", variant = "e"}} data.forms["1|p|cond2"] = {stem:make_form{grade = "weak", ending = "leimmet", variant = "e"}} data.forms["2|p|cond2"] = {stem:make_form{grade = "weak", ending = "leiddet", variant = "e"}} data.forms["3|p|cond2"] = {stem:make_form{grade = "weak", ending = "le", variant = "e"}, stem:make_form{grade = "weak", ending = "ledje", variant = "e"}} data.forms["cond2|conn"] = {stem:make_form{grade = "weak", ending = "le", variant = "e"}} data.forms["1|s|potn"] = {stem:make_form{grade = "weak", ending = "žan", variant = "i"}} data.forms["2|s|potn"] = {stem:make_form{grade = "weak", ending = "žat", variant = "i"}} data.forms["3|s|potn"] = {stem:make_form{grade = "weak", ending = "ža", variant = "i"}, stem:make_form{grade = "weak", ending = "š", variant = "i"}} data.forms["1|d|potn"] = {stem:make_form{grade = "weak", ending = "žetne", variant = "i"}} data.forms["2|d|potn"] = {stem:make_form{grade = "weak", ending = "žeahppi", variant = "i"}} data.forms["3|d|potn"] = {stem:make_form{grade = "weak", ending = "žeaba", variant = "i"}} data.forms["1|p|potn"] = {stem:make_form{grade = "weak", ending = "žit", variant = "i"}, stem:make_form{grade = "weak", ending = "žat", variant = "i"}} data.forms["2|p|potn"] = {stem:make_form{grade = "weak", ending = "žēhpet", variant = "i"}} data.forms["3|p|potn"] = {stem:make_form{grade = "weak", ending = "žit", variant = "i"}} data.forms["potn|conn"] = {stem:make_form{grade = "weak", ending = "š", variant = "i"}} postprocess(args, data) return output[args["output"]](data) end function export.odd(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["final"] = {}, ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1]) local data = { forms = {}, info = "lẻ, không chuyển bậc", categories = {}, } if stem.ucons == "" and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("Thân từ phải kết thúc bằng phụ âm.") end insert(data.categories, "Động từ lẻ " .. lang:getCanonicalName()) data.forms["inf"] = {stem:make_form{ending = "it"}} data.forms["pres|ptcp"] = {stem:make_form{ending = "eaddji"}} data.forms["past|ptcp"] = {stem:make_form{ending = "an"}} data.forms["agnt|ptcp"] = {stem:make_form{ending = "an"}} data.forms["anoun"] = {stem:make_form{ending = "eapmi"}} data.forms["action|ine"] = {stem:make_form{ending = "eamen"}, stem:make_form{ending = "eame"}} data.forms["action|ela"] = {stem:make_form{ending = "eamis"}} data.forms["action|com"] = {stem:make_form{ending = "ēmiin"}} data.forms["abe"] = {stem:make_form{ending = "keahttá"}} data.forms["1|s|pres|indc"] = {stem:make_form{ending = "an"}} data.forms["2|s|pres|indc"] = {stem:make_form{ending = "at"}} data.forms["3|s|pres|indc"] = {stem:make_form{ending = "a"}} data.forms["1|d|pres|indc"] = {stem:make_form{ending = "etne"}} data.forms["2|d|pres|indc"] = {stem:make_form{ending = "eahppi"}} data.forms["3|d|pres|indc"] = {stem:make_form{ending = "eaba"}} data.forms["1|p|pres|indc"] = {stem:make_form{ending = "it"}, stem:make_form{ending = "at"}} data.forms["2|p|pres|indc"] = {stem:make_form{ending = "ēhpet"}} data.forms["3|p|pres|indc"] = {stem:make_form{ending = "it"}} data.forms["pres|indc|conn"] = {stem:make_form{}} data.forms["1|s|past|indc"] = {stem:make_form{ending = "in"}, stem:make_form{ending = "edjen"}} data.forms["2|s|past|indc"] = {stem:make_form{ending = "it"}, stem:make_form{ending = "edjet"}} data.forms["3|s|past|indc"] = {stem:make_form{ending = "ii"}} data.forms["1|d|past|indc"] = {stem:make_form{ending = "eimme"}} data.forms["2|d|past|indc"] = {stem:make_form{ending = "eidde"}} data.forms["3|d|past|indc"] = {stem:make_form{ending = "eigga"}} data.forms["1|p|past|indc"] = {stem:make_form{ending = "eimmet"}} data.forms["2|p|past|indc"] = {stem:make_form{ending = "eiddet"}} data.forms["3|p|past|indc"] = {stem:make_form{ending = "e"}, stem:make_form{ending = "edje"}} data.forms["past|indc|conn"] = {stem:make_form{ending = "an"}} data.forms["1|s|impr"] = {stem:make_form{ending = "ēhkon"}} data.forms["2|s|impr"] = {stem:make_form{}} data.forms["3|s|impr"] = {stem:make_form{ending = "ēhkos"}, stem:make_form{ending = "us"}} data.forms["1|d|impr"] = {stem:make_form{ending = "eadnu"}} data.forms["2|d|impr"] = {stem:make_form{ending = "eahkki"}} data.forms["3|d|impr"] = {stem:make_form{ending = "ēhkoska"}} data.forms["1|p|impr"] = {stem:make_form{ending = "ēhkot"}, stem:make_form{ending = "eatnot"}} data.forms["2|p|impr"] = {stem:make_form{ending = "ēhket"}} data.forms["3|p|impr"] = {stem:make_form{ending = "ēhkoset"}} data.forms["impr|conn"] = {stem:make_form{}} data.forms["1|s|cond1"] = {stem:make_form{ending = "ivččen"}} data.forms["2|s|cond1"] = {stem:make_form{ending = "ivččet"}} data.forms["3|s|cond1"] = {stem:make_form{ending = "ivččii"}} data.forms["1|d|cond1"] = {stem:make_form{ending = "ivččiime"}} data.forms["2|d|cond1"] = {stem:make_form{ending = "ivččiide"}} data.forms["3|d|cond1"] = {stem:make_form{ending = "ivččiiga"}} data.forms["1|p|cond1"] = {stem:make_form{ending = "ivččiimet"}} data.forms["2|p|cond1"] = {stem:make_form{ending = "ivččiidet"}} data.forms["3|p|cond1"] = {stem:make_form{ending = "ivčče"}} data.forms["cond1|conn"] = {stem:make_form{ending = "ivčče"}} data.forms["1|s|potn"] = {stem:make_form{ending = "eaččan"}} data.forms["2|s|potn"] = {stem:make_form{ending = "eaččat"}} data.forms["3|s|potn"] = {stem:make_form{ending = "eš"}, stem:make_form{ending = "eaš"}, stem:make_form{ending = "eažžá"}} data.forms["1|d|potn"] = {stem:make_form{ending = "ežže"}} data.forms["2|d|potn"] = {stem:make_form{ending = "eažžabeahtti"}} data.forms["3|d|potn"] = {stem:make_form{ending = "eažžaba"}} data.forms["1|p|potn"] = {stem:make_form{ending = "eažžat"}} data.forms["2|p|potn"] = {stem:make_form{ending = "eažžabehtet"}} data.forms["3|p|potn"] = {stem:make_form{ending = "ežžet"}} data.forms["potn|conn"] = {stem:make_form{ending = "eš"}, stem:make_form{ending = "eaš"}, stem:make_form{ending = "eačča"}} postprocess(args, data) return output[args["output"]](data) end function export.contr(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1]) local data = { forms = {}, info = "thân " .. require("Module:links").full_link({lang = lang, alt = stem.uvowel}, "term") .. " rút gọn, không chuyển bậc", categories = {}, } if not mw.ustring.find(stem.uvowel, "^[áeo]$") and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The final vowel(s) of the stem must be one of á, e, o.") end insert(data.categories, "Động từ rút gọn " .. lang:getCanonicalName()) insert(data.categories, "Động từ rút gọn có thân từ kết thúc bằng " .. (stem.uvowel or "") .. " " .. lang:getCanonicalName()) data.forms["inf"] = {stem:make_form{ending = "t"}} data.forms["pres|ptcp"] = {stem:make_form{ending = "jeaddji"}} data.forms["past|ptcp"] = {stem:make_form{ending = "n"}} data.forms["agnt|ptcp"] = {stem:make_form{ending = "n"}} data.forms["anoun"] = {stem:make_form{ending = "n"}} data.forms["action|ine"] = {stem:make_form{ending = "min"}, stem:make_form{ending = "me"}} data.forms["action|ela"] = {stem:make_form{ending = "mis"}} data.forms["action|com"] = {stem:make_form{ending = "miin"}} data.forms["abe"] = {stem:make_form{ending = "keahttá"}} data.forms["1|s|pres|indc"] = {stem:make_form{ending = "n"}} data.forms["2|s|pres|indc"] = {stem:make_form{ending = "t"}} data.forms["3|s|pres|indc"] = {stem:make_form{}} data.forms["1|d|pres|indc"] = {stem:make_form{ending = "jetne"}} data.forms["2|d|pres|indc"] = {stem:make_form{ending = "beahtti"}} data.forms["3|d|pres|indc"] = {stem:make_form{ending = "ba"}} data.forms["1|p|pres|indc"] = {stem:make_form{ending = "t"}} data.forms["2|p|pres|indc"] = {stem:make_form{ending = "bēhtet"}} data.forms["3|p|pres|indc"] = {stem:make_form{ending = "jit"}} data.forms["pres|indc|conn"] = {stem:make_form{}} data.forms["1|s|past|indc"] = {stem:make_form{ending = "jin"}} data.forms["2|s|past|indc"] = {stem:make_form{ending = "jit"}} data.forms["3|s|past|indc"] = {stem:make_form{ending = "i", variant = "j"}} data.forms["1|d|past|indc"] = {stem:make_form{ending = "ime", variant = "j"}} data.forms["2|d|past|indc"] = {stem:make_form{ending = "ide", variant = "j"}} data.forms["3|d|past|indc"] = {stem:make_form{ending = "iga", variant = "j"}} data.forms["1|p|past|indc"] = {stem:make_form{ending = "imet", variant = "j"}} data.forms["2|p|past|indc"] = {stem:make_form{ending = "idet", variant = "j"}} data.forms["3|p|past|indc"] = {stem:make_form{ending = "jedje"}} data.forms["past|indc|conn"] = {stem:make_form{ending = "n"}} data.forms["1|s|impr"] = {stem:make_form{ending = "jēhkon"}} data.forms["2|s|impr"] = {stem:make_form{}} data.forms["3|s|impr"] = {stem:make_form{ending = "jēhkos"}} data.forms["1|d|impr"] = {stem:make_form{ending = "jeadnu"}, stem:make_form{ending = "jeahkku"}} data.forms["2|d|impr"] = {stem:make_form{ending = "jeahkki"}} data.forms["3|d|impr"] = {stem:make_form{ending = "jēhkoska"}} data.forms["1|p|impr"] = {stem:make_form{ending = "jētnot"}, stem:make_form{ending = "jēhkot"}, stem:make_form{ending = "jeahkkot"}, stem:make_form{ending = "jeadnot"}} data.forms["2|p|impr"] = {stem:make_form{ending = "jēhket"}} data.forms["3|p|impr"] = {stem:make_form{ending = "jēhkoset"}} data.forms["impr|conn"] = {stem:make_form{}} data.forms["1|s|cond1"] = {stem:make_form{ending = "šin"}, stem:make_form{ending = "šedjen"}} data.forms["2|s|cond1"] = {stem:make_form{ending = "šit"}, stem:make_form{ending = "šedjet"}} data.forms["3|s|cond1"] = {stem:make_form{ending = "šii"}} data.forms["1|d|cond1"] = {stem:make_form{ending = "šeimme"}} data.forms["2|d|cond1"] = {stem:make_form{ending = "šeidde"}} data.forms["3|d|cond1"] = {stem:make_form{ending = "šeigga"}} data.forms["1|p|cond1"] = {stem:make_form{ending = "šeimmet"}} data.forms["2|p|cond1"] = {stem:make_form{ending = "šeiddet"}} data.forms["3|p|cond1"] = {stem:make_form{ending = "še"}, stem:make_form{ending = "šedje"}} data.forms["cond1|conn"] = {stem:make_form{ending = "še"}} data.forms["1|s|cond2"] = {stem:make_form{ending = "lin"}, stem:make_form{ending = "ledjen"}} data.forms["2|s|cond2"] = {stem:make_form{ending = "lit"}, stem:make_form{ending = "ledjet"}} data.forms["3|s|cond2"] = {stem:make_form{ending = "lii"}} data.forms["1|d|cond2"] = {stem:make_form{ending = "leimme"}} data.forms["2|d|cond2"] = {stem:make_form{ending = "leidde"}} data.forms["3|d|cond2"] = {stem:make_form{ending = "leigga"}} data.forms["1|p|cond2"] = {stem:make_form{ending = "leimmet"}} data.forms["2|p|cond2"] = {stem:make_form{ending = "leiddet"}} data.forms["3|p|cond2"] = {stem:make_form{ending = "le"}, stem:make_form{ending = "ledje"}} data.forms["cond2|conn"] = {stem:make_form{ending = "le"}} data.forms["1|s|potn"] = {stem:make_form{ending = "žan"}} data.forms["2|s|potn"] = {stem:make_form{ending = "žat"}} data.forms["3|s|potn"] = {stem:make_form{ending = "ža"}, stem:make_form{ending = "š"}} data.forms["1|d|potn"] = {stem:make_form{ending = "žetne"}} data.forms["2|d|potn"] = {stem:make_form{ending = "žeahppi"}} data.forms["3|d|potn"] = {stem:make_form{ending = "žeaba"}} data.forms["1|p|potn"] = {stem:make_form{ending = "žit"}, stem:make_form{ending = "žat"}} data.forms["2|p|potn"] = {stem:make_form{ending = "žēhpet"}} data.forms["3|p|potn"] = {stem:make_form{ending = "žit"}} data.forms["potn|conn"] = {stem:make_form{ending = "š"}} postprocess(args, data) return output[args["output"]](data) end function export.leat(frame) local params = { ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = { forms = {}, info = "lẻ, không chuyển bậc, bất quy tắc", categories = {"Động từ lẻ " .. lang:getCanonicalName(), "Động từ bất quy tắc " .. lang:getCanonicalName()}, } data.forms["inf"] = {"leat", "leahkit"} data.forms["pres|ptcp"] = {"leahkki"} data.forms["past|ptcp"] = {"leamaš"} data.forms["agnt|ptcp"] = nil data.forms["anoun"] = {"leapmi"} data.forms["action|ine"] = {"leamen", "leame", "leahkime"} data.forms["action|ela"] = {"leames"} data.forms["action|com"] = nil data.forms["abe"] = nil data.forms["1|s|pres|indc"] = {"lean"} data.forms["2|s|pres|indc"] = {"leat"} data.forms["3|s|pres|indc"] = {"lea"} data.forms["1|d|pres|indc"] = {"letne"} data.forms["2|d|pres|indc"] = {"leahppi"} data.forms["3|d|pres|indc"] = {"leaba"} data.forms["1|p|pres|indc"] = {"leat"} data.forms["2|p|pres|indc"] = {"lēhpet"} data.forms["3|p|pres|indc"] = {"leat"} data.forms["pres|indc|conn"] = {"leat"} data.forms["1|s|past|indc"] = {"ledjen"} data.forms["2|s|past|indc"] = {"ledjet"} data.forms["3|s|past|indc"] = {"lei", "leai"} data.forms["1|d|past|indc"] = {"leimme"} data.forms["2|d|past|indc"] = {"leidde"} data.forms["3|d|past|indc"] = {"leigga", "leaigga"} data.forms["1|p|past|indc"] = {"leimmet"} data.forms["2|p|past|indc"] = {"leiddet"} data.forms["3|p|past|indc"] = {"ledje"} data.forms["past|indc|conn"] = {"lean"} data.forms["1|s|impr"] = {"lēhkon"} data.forms["2|s|impr"] = {"leagẹ"} data.forms["3|s|impr"] = {"lēhkos"} data.forms["1|d|impr"] = {"leadnu", "leahkku"} data.forms["2|d|impr"] = {"leahkki"} data.forms["3|d|impr"] = {"lēhkoska"} data.forms["1|p|impr"] = {"lēhkot", "leatnot"} data.forms["2|p|impr"] = {"lēhket"} data.forms["3|p|impr"] = {"lēhkoset"} data.forms["impr|conn"] = {"leagẹ"} data.forms["1|s|cond1"] = {"livččen"} data.forms["2|s|cond1"] = {"livččet"} data.forms["3|s|cond1"] = {"livččii"} data.forms["1|d|cond1"] = {"livččiime"} data.forms["2|d|cond1"] = {"livččiide"} data.forms["3|d|cond1"] = {"livččiiga"} data.forms["1|p|cond1"] = {"livččiimet"} data.forms["2|p|cond1"] = {"livččiidet"} data.forms["3|p|cond1"] = {"livčče"} data.forms["cond1|conn"] = {"livčče"} data.forms["1|s|potn"] = {"leaččan"} data.forms["2|s|potn"] = {"leaččat"} data.forms["3|s|potn"] = {"leš", "leaš", "leažžá"} data.forms["1|d|potn"] = {"ležže"} data.forms["2|d|potn"] = {"leažžabeahtti"} data.forms["3|d|potn"] = {"leažžaba"} data.forms["1|p|potn"] = {"leažžat"} data.forms["2|p|potn"] = {"leažžabehtet"} data.forms["3|p|potn"] = {"ležžet"} data.forms["potn|conn"] = {"leš", "leaš", "leačča"} postprocess(args, data) return output[args["output"]](data) end -- Make the table output.table = function(data) local function repl(param) local accel = true local no_store = false if param == "info" then return mw.getContentLanguage():ucfirst(data.info or "") elseif string.sub(param, 1, 1) == "!" then no_store = true param = string.sub(param, 2) elseif string.sub(param, 1, 1) == "#" then accel = false param = string.sub(param, 2) end local forms = data.forms[param] if not forms then return "&mdash;" end local ret = {} for _, subform in ipairs(forms) do insert(ret, require("Module:links").full_link({lang = lang, term = subform, accel = accel and {form = param, lemma = data.lemma, no_store = no_store} or nil})) end return concat(ret, "<br/>") end local wikicode = [=[ {| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border: solid 1px var(--wikt-palette-lightindigo)" cellspacing="1" cellpadding="2" |- style="background: var(--wikt-palette-palegreen);color:inherit; text-align: left;" ! class="vsToggleElement" colspan="4" | {{{info}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit" ! style="width: 11em; background: var(--wikt-palette-palegreen);color:inherit;" | nguyên mẫu | style="width: 15em;" colspan="2" | {{{!inf}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | hiện tại ở ngôi thứ nhất số ít | colspan="2" | {{{!1|s|pres|indc}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | quá khứ ở ngôi thứ nhất số ít | colspan="2" | {{{!1|s|past|indc}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | nguyên mẫu | data-accel-col="1" | {{{inf}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động | data-accel-col="2" | {{{#anoun}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | phân từ hiện tại | data-accel-col="1" | {{{pres|ptcp}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động<br/>[[inessive|định vị cách]] | data-accel-col="2" | {{{action|ine}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | phân từ quá khứ | data-accel-col="1" | {{{past|ptcp}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động<br/>[[elative|xuất cách]] | data-accel-col="2" | {{{action|ela}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | phân từ tác nhân | data-accel-col="1" | {{{agnt|ptcp}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động<br/>[[comitative|cách kèm]] | data-accel-col="2" | {{{action|com}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" colspan="2" | ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[abessive|vô cách]] | {{{abe}}} |- class="vsHide" ! style="background: var(--wikt-palette-mint);color:inherit; width: 11em;" | ! style="background: var(--wikt-palette-mint);color:inherit; width: 15em;" | trần thuật hiện tại ! style="background: var(--wikt-palette-mint);color:inherit; width: 15em;" | trần thuật quá khứ ! style="background: var(--wikt-palette-mint);color:inherit; width: 15em;" | mệnh lệnh |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số ít | data-accel-col="1" | {{{1|s|pres|indc}}} | data-accel-col="2" | {{{1|s|past|indc}}} | data-accel-col="3" | {{{1|s|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số ít | data-accel-col="1" | {{{2|s|pres|indc}}} | data-accel-col="2" | {{{2|s|past|indc}}} | data-accel-col="3" | {{{2|s|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số ít | data-accel-col="1" | {{{3|s|pres|indc}}} | data-accel-col="2" | {{{3|s|past|indc}}} | data-accel-col="3" | {{{3|s|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số đôi | data-accel-col="1" | {{{1|d|pres|indc}}} | data-accel-col="2" | {{{1|d|past|indc}}} | data-accel-col="3" | {{{1|d|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số đôi | data-accel-col="1" | {{{2|d|pres|indc}}} | data-accel-col="2" | {{{2|d|past|indc}}} | data-accel-col="3" | {{{2|d|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số đôi | data-accel-col="1" | {{{3|d|pres|indc}}} | data-accel-col="2" | {{{3|d|past|indc}}} | data-accel-col="3" | {{{3|d|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số nhiều | data-accel-col="1" | {{{1|p|pres|indc}}} | data-accel-col="2" | {{{1|p|past|indc}}} | data-accel-col="3" | {{{1|p|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số nhiều | data-accel-col="1" | {{{2|p|pres|indc}}} | data-accel-col="2" | {{{2|p|past|indc}}} | data-accel-col="3" | {{{2|p|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{3|p|pres|indc}}} | data-accel-col="2" | {{{3|p|past|indc}}} | data-accel-col="3" | {{{3|p|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[connegative|yếu tố phủ định]] | data-accel-col="1" | {{{pres|indc|conn}}} | data-accel-col="2" | {{{past|indc|conn}}} | data-accel-col="3" | {{{impr|conn}}} |- class="vsHide" ! style="background: var(--wikt-palette-mint);color:inherit;" | ! style="background: var(--wikt-palette-mint);color:inherit;" | điều kiện&nbsp;loại 1 ! style="background: var(--wikt-palette-mint);color:inherit;" | điều kiện&nbsp;loại 2 ! style="background: var(--wikt-palette-mint);color:inherit;" | khả năng |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số ít | data-accel-col="4" | {{{1|s|cond1}}} | data-accel-col="5" | {{{1|s|cond2}}} | data-accel-col="6" | {{{1|s|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số ít | data-accel-col="4" | {{{2|s|cond1}}} | data-accel-col="5" | {{{2|s|cond2}}} | data-accel-col="6" | {{{2|s|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số ít | data-accel-col="4" | {{{3|s|cond1}}} | data-accel-col="5" | {{{3|s|cond2}}} | data-accel-col="6" | {{{3|s|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số đôi | data-accel-col="4" | {{{1|d|cond1}}} | data-accel-col="5" | {{{1|d|cond2}}} | data-accel-col="6" | {{{1|d|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số đôi | data-accel-col="4" | {{{2|d|cond1}}} | data-accel-col="5" | {{{2|d|cond2}}} | data-accel-col="6" | {{{2|d|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số đôi | data-accel-col="4" | {{{3|d|cond1}}} | data-accel-col="5" | {{{3|d|cond2}}} | data-accel-col="6" | {{{3|d|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số nhiều | data-accel-col="4" | {{{1|p|cond1}}} | data-accel-col="5" | {{{1|p|cond2}}} | data-accel-col="6" | {{{1|p|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số nhiều | data-accel-col="4" | {{{2|p|cond1}}} | data-accel-col="5" | {{{2|p|cond2}}} | data-accel-col="6" | {{{2|p|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số nhiều | data-accel-col="4" | {{{3|p|cond1}}} | data-accel-col="5" | {{{3|p|cond2}}} | data-accel-col="6" | {{{3|p|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[connegative|yếu tố phủ định]] | data-accel-col="4" | {{{cond1|conn}}} | data-accel-col="5" | {{{cond2|conn}}} | data-accel-col="6" | {{{potn|conn}}} |}]=] return mw.ustring.gsub(wikicode, "{{{([#!]?[a-z0-9|]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang) end -- Given a tag set, return a flattened list all Wikidata ID's of all tags in the tag set. local function to_Wikidata_IDs(tag_set, lang, skip_tags_without_ids) local ret, WIKIDATA = {}, require("Module:form of/data").WIKIDATA local function get_wikidata_id(tag) local data = export.lookup_tag(tag, lang) if data and data[WIKIDATA] then return ("Q%s"):format(data[WIKIDATA]) elseif not skip_tags_without_ids then error('The tag "' .. tag .. '" does not have a Wikidata ID defined in the form-of data modules') end end local normalized_tag_sets = export.normalize_tag_set(tag_set, lang) for _, tag_set in ipairs(normalized_tag_sets) do for _, tag in ipairs(tag_set) do if type(tag) == "table" then for _, subtag in ipairs(tag) do if type(subtag) == "table" then -- two-level multipart tag; FIXME: delete support for this for _, subsubtag in ipairs(subtag) do insert(ret, get_wikidata_id(subsubtag)) end else insert(ret, get_wikidata_id(subtag)) end end else insert(ret, get_wikidata_id(tag)) end end end return ret end output.Wikidata = function(data) local order = { "inf", "pres|ptcp", "past|ptcp", "agnt|ptcp", --"action|ine", --"action|ela", --"action|com", "abe", "1|s|pres|indc", "2|s|pres|indc", "3|s|pres|indc", "1|d|pres|indc", "2|d|pres|indc", "3|d|pres|indc", "1|p|pres|indc", "2|p|pres|indc", "3|p|pres|indc", "pres|indc|conn", "1|s|past|indc", "2|s|past|indc", "3|s|past|indc", "1|d|past|indc", "2|d|past|indc", "3|d|past|indc", "1|p|past|indc", "2|p|past|indc", "3|p|past|indc", "past|indc|conn", "1|s|impr", "2|s|impr", "3|s|impr", "1|d|impr", "2|d|impr", "3|d|impr", "1|p|impr", "2|p|impr", "3|p|impr", "impr|conn", "1|s|cond1", "2|s|cond1", "3|s|cond1", "1|d|cond1", "2|d|cond1", "3|d|cond1", "1|p|cond1", "2|p|cond1", "3|p|cond1", "cond1|conn", "1|s|cond2", "2|s|cond2", "3|s|cond2", "1|d|cond2", "2|d|cond2", "3|d|cond2", "1|p|cond2", "2|p|cond2", "3|p|cond2", "cond2|conn", "1|s|potn", "2|s|potn", "3|s|potn", "1|d|potn", "2|d|potn", "3|d|potn", "1|p|potn", "2|p|potn", "3|p|potn", "potn|conn", } local ret = {} for _, key in ipairs(order) do if data.forms[key] and data.forms[key][1] then for _, form in ipairs(data.forms[key]) do key = key:gsub("cond[12]", "cond") insert(ret, { representations = {[lang:getCode()] = {language = lang:getCode(), value = form}}, grammaticalFeatures = to_Wikidata_IDs(key, lang), }) end end end return require("Module:JSON").toJSON(ret) end return export dlcc1bc0ef5lg4la1g0oh11siqwiexf 2345188 2345184 2026-04-14T09:27:20Z Higashizakura 36666 2345188 Scribunto text/plain local export = {} local output = {} local concat = table.concat local insert = table.insert local lang = require("Module:languages").getByCode("se") local function postprocess(args, data) data.lemma = data.forms["inf"][1] data.forms["agnt|ptcp"] = nil -- Remove until there's a reliable way to determine which verbs have it -- Check if the lemma form matches the page name if lang:stripDiacritics(data.lemma) ~= mw.loadData("Module:headword/data").pagename then insert(data.categories, "Mục từ có biến tố không khớp với tên trang " .. lang:getCanonicalName()) end end -- Inflection functions function export.even(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1], true) local data = { forms = {}, info = "thân " .. require("Module:links").full_link({lang = lang, alt = stem.uvowel}, "term") .. " chẵn", categories = {}, } if stem.gradation then data.info = data.info .. ", luân phiên " .. require("Module:links").full_link({lang = lang, alt = stem.gradation.strong.scons}, "term") .. "-" .. require("Module:links").full_link({lang = lang, alt = stem.gradation.weak.scons}, "term") .. " " else data.info = data.info .. ", không luân phiên" end if not mw.ustring.find(stem.uvowel, "^[aiu]$") and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The final vowel(s) of the stem must be one of a, i, u.") end insert(data.categories, "Động từ chẵn " .. lang:getCanonicalName()) insert(data.categories, "Động từ chẵn có thân từ kết thúc bằng " .. (stem.uvowel or "") .. " " .. lang:getCanonicalName()) data.forms["inf"] = {stem:make_form{grade = "strong", ending = "t"}} data.forms["pres|ptcp"] = {stem:make_form{grade = "extra", variant = "j_contr_final"}} data.forms["past|ptcp"] = {stem:make_form{grade = "strong", ending = "n", variant = "e"}} data.forms["agnt|ptcp"] = {stem:make_form{grade = "strong", ending = "n"}} data.forms["anoun"] = {stem:make_form{grade = "strong", ending = "n"}} data.forms["action|ine"] = {stem:make_form{grade = "strong", ending = "min"}, stem:make_form{grade = "strong", ending = "me"}} data.forms["action|ela"] = {stem:make_form{grade = "strong", ending = "mis"}} data.forms["action|com"] = {stem:make_form{grade = "strong", ending = "miin"}} data.forms["abe"] = {stem:make_form{grade = "weak", ending = "keahttá", variant = "short"}} data.forms["1|s|pres|indc"] = {stem:make_form{grade = "weak", ending = "n", variant = "pres_12sg"}} data.forms["2|s|pres|indc"] = {stem:make_form{grade = "weak", ending = "t", variant = "pres_12sg"}} data.forms["3|s|pres|indc"] = {stem:make_form{grade = "strong", variant = "pres_3sg"}} data.forms["1|d|pres|indc"] = {stem:make_form{grade = "strong", variant = "j_contr"}} data.forms["2|d|pres|indc"] = {stem:make_form{grade = "strong", ending = "beahtti"}} data.forms["3|d|pres|indc"] = {stem:make_form{grade = "strong", ending = "ba"}} data.forms["1|p|pres|indc"] = {stem:make_form{grade = "strong", ending = "t"}} data.forms["2|p|pres|indc"] = {stem:make_form{grade = "strong", ending = "bēhtet"}} data.forms["3|p|pres|indc"] = {stem:make_form{grade = "strong", ending = "t", variant = "j_contr"}} data.forms["pres|indc|conn"] = {stem:make_form{grade = "weak", variant = "short"}} data.forms["1|s|past|indc"] = {stem:make_form{grade = "strong", ending = "n", variant = "j_contr"}} data.forms["2|s|past|indc"] = {stem:make_form{grade = "strong", ending = "t", variant = "j_contr"}} data.forms["3|s|past|indc"] = {stem:make_form{grade = "weak", ending = "i", variant = "j"}} data.forms["1|d|past|indc"] = {stem:make_form{grade = "weak", ending = "ime", variant = "j"}} data.forms["2|d|past|indc"] = {stem:make_form{grade = "weak", ending = "ide", variant = "j"}} data.forms["3|d|past|indc"] = {stem:make_form{grade = "weak", ending = "iga", variant = "j"}} data.forms["1|p|past|indc"] = {stem:make_form{grade = "weak", ending = "imet", variant = "j"}} data.forms["2|p|past|indc"] = {stem:make_form{grade = "weak", ending = "idet", variant = "j"}} data.forms["3|p|past|indc"] = {stem:make_form{grade = "strong", variant = "j_contr"}} data.forms["past|indc|conn"] = {stem:make_form{grade = "strong", ending = "n", variant = "e"}} data.forms["1|s|impr"] = {stem:make_form{grade = "strong", ending = "n", variant = "impr"}} data.forms["2|s|impr"] = {stem:make_form{grade = "weak", variant = "short"}} data.forms["3|s|impr"] = {stem:make_form{grade = "strong", ending = "s", variant = "impr"}} data.forms["1|d|impr"] = {stem:make_form{grade = "extra", variant = "impr_final"}} data.forms["2|d|impr"] = {stem:make_form{grade = "extra", variant = "j_contr_final"}} data.forms["3|d|impr"] = {stem:make_form{grade = "strong", ending = "ska", variant = "impr"}} data.forms["1|p|impr"] = {stem:make_form{grade = "strong", ending = "t", variant = "impr"}, stem:make_form{grade = "extra", ending = "t", variant = "impr_final"}} data.forms["2|p|impr"] = {stem:make_form{grade = "strong", ending = "t", variant = "j_contr"}, stem:make_form{grade = "extra", ending = "t", variant = "j_contr_final"}} data.forms["3|p|impr"] = {stem:make_form{grade = "strong", ending = "set", variant = "impr"}} data.forms["impr|conn"] = {stem:make_form{grade = "weak", variant = "short"}} data.forms["1|s|cond1"] = {stem:make_form{grade = "weak", ending = "šin", variant = "e"}, stem:make_form{grade = "weak", ending = "šedjen", variant = "e"}} data.forms["2|s|cond1"] = {stem:make_form{grade = "weak", ending = "šit", variant = "e"}, stem:make_form{grade = "weak", ending = "šedjet", variant = "e"}} data.forms["3|s|cond1"] = {stem:make_form{grade = "weak", ending = "šii", variant = "e"}} data.forms["1|d|cond1"] = {stem:make_form{grade = "weak", ending = "šeimme", variant = "e"}} data.forms["2|d|cond1"] = {stem:make_form{grade = "weak", ending = "šeidde", variant = "e"}} data.forms["3|d|cond1"] = {stem:make_form{grade = "weak", ending = "šeigga", variant = "e"}} data.forms["1|p|cond1"] = {stem:make_form{grade = "weak", ending = "šeimmet", variant = "e"}} data.forms["2|p|cond1"] = {stem:make_form{grade = "weak", ending = "šeiddet", variant = "e"}} data.forms["3|p|cond1"] = {stem:make_form{grade = "weak", ending = "še", variant = "e"}, stem:make_form{grade = "weak", ending = "šedje", variant = "e"}} data.forms["cond1|conn"] = {stem:make_form{grade = "weak", ending = "še", variant = "e"}} data.forms["1|s|cond2"] = {stem:make_form{grade = "weak", ending = "lin", variant = "e"}, stem:make_form{grade = "weak", ending = "ledjen", variant = "e"}} data.forms["2|s|cond2"] = {stem:make_form{grade = "weak", ending = "lit", variant = "e"}, stem:make_form{grade = "weak", ending = "ledjet", variant = "e"}} data.forms["3|s|cond2"] = {stem:make_form{grade = "weak", ending = "lii", variant = "e"}} data.forms["1|d|cond2"] = {stem:make_form{grade = "weak", ending = "leimme", variant = "e"}} data.forms["2|d|cond2"] = {stem:make_form{grade = "weak", ending = "leidde", variant = "e"}} data.forms["3|d|cond2"] = {stem:make_form{grade = "weak", ending = "leigga", variant = "e"}} data.forms["1|p|cond2"] = {stem:make_form{grade = "weak", ending = "leimmet", variant = "e"}} data.forms["2|p|cond2"] = {stem:make_form{grade = "weak", ending = "leiddet", variant = "e"}} data.forms["3|p|cond2"] = {stem:make_form{grade = "weak", ending = "le", variant = "e"}, stem:make_form{grade = "weak", ending = "ledje", variant = "e"}} data.forms["cond2|conn"] = {stem:make_form{grade = "weak", ending = "le", variant = "e"}} data.forms["1|s|potn"] = {stem:make_form{grade = "weak", ending = "žan", variant = "i"}} data.forms["2|s|potn"] = {stem:make_form{grade = "weak", ending = "žat", variant = "i"}} data.forms["3|s|potn"] = {stem:make_form{grade = "weak", ending = "ža", variant = "i"}, stem:make_form{grade = "weak", ending = "š", variant = "i"}} data.forms["1|d|potn"] = {stem:make_form{grade = "weak", ending = "žetne", variant = "i"}} data.forms["2|d|potn"] = {stem:make_form{grade = "weak", ending = "žeahppi", variant = "i"}} data.forms["3|d|potn"] = {stem:make_form{grade = "weak", ending = "žeaba", variant = "i"}} data.forms["1|p|potn"] = {stem:make_form{grade = "weak", ending = "žit", variant = "i"}, stem:make_form{grade = "weak", ending = "žat", variant = "i"}} data.forms["2|p|potn"] = {stem:make_form{grade = "weak", ending = "žēhpet", variant = "i"}} data.forms["3|p|potn"] = {stem:make_form{grade = "weak", ending = "žit", variant = "i"}} data.forms["potn|conn"] = {stem:make_form{grade = "weak", ending = "š", variant = "i"}} postprocess(args, data) return output[args["output"]](data) end function export.odd(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["final"] = {}, ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1]) local data = { forms = {}, info = "lẻ, không luân phiên", categories = {}, } if stem.ucons == "" and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("Thân từ phải kết thúc bằng phụ âm.") end insert(data.categories, "Động từ lẻ " .. lang:getCanonicalName()) data.forms["inf"] = {stem:make_form{ending = "it"}} data.forms["pres|ptcp"] = {stem:make_form{ending = "eaddji"}} data.forms["past|ptcp"] = {stem:make_form{ending = "an"}} data.forms["agnt|ptcp"] = {stem:make_form{ending = "an"}} data.forms["anoun"] = {stem:make_form{ending = "eapmi"}} data.forms["action|ine"] = {stem:make_form{ending = "eamen"}, stem:make_form{ending = "eame"}} data.forms["action|ela"] = {stem:make_form{ending = "eamis"}} data.forms["action|com"] = {stem:make_form{ending = "ēmiin"}} data.forms["abe"] = {stem:make_form{ending = "keahttá"}} data.forms["1|s|pres|indc"] = {stem:make_form{ending = "an"}} data.forms["2|s|pres|indc"] = {stem:make_form{ending = "at"}} data.forms["3|s|pres|indc"] = {stem:make_form{ending = "a"}} data.forms["1|d|pres|indc"] = {stem:make_form{ending = "etne"}} data.forms["2|d|pres|indc"] = {stem:make_form{ending = "eahppi"}} data.forms["3|d|pres|indc"] = {stem:make_form{ending = "eaba"}} data.forms["1|p|pres|indc"] = {stem:make_form{ending = "it"}, stem:make_form{ending = "at"}} data.forms["2|p|pres|indc"] = {stem:make_form{ending = "ēhpet"}} data.forms["3|p|pres|indc"] = {stem:make_form{ending = "it"}} data.forms["pres|indc|conn"] = {stem:make_form{}} data.forms["1|s|past|indc"] = {stem:make_form{ending = "in"}, stem:make_form{ending = "edjen"}} data.forms["2|s|past|indc"] = {stem:make_form{ending = "it"}, stem:make_form{ending = "edjet"}} data.forms["3|s|past|indc"] = {stem:make_form{ending = "ii"}} data.forms["1|d|past|indc"] = {stem:make_form{ending = "eimme"}} data.forms["2|d|past|indc"] = {stem:make_form{ending = "eidde"}} data.forms["3|d|past|indc"] = {stem:make_form{ending = "eigga"}} data.forms["1|p|past|indc"] = {stem:make_form{ending = "eimmet"}} data.forms["2|p|past|indc"] = {stem:make_form{ending = "eiddet"}} data.forms["3|p|past|indc"] = {stem:make_form{ending = "e"}, stem:make_form{ending = "edje"}} data.forms["past|indc|conn"] = {stem:make_form{ending = "an"}} data.forms["1|s|impr"] = {stem:make_form{ending = "ēhkon"}} data.forms["2|s|impr"] = {stem:make_form{}} data.forms["3|s|impr"] = {stem:make_form{ending = "ēhkos"}, stem:make_form{ending = "us"}} data.forms["1|d|impr"] = {stem:make_form{ending = "eadnu"}} data.forms["2|d|impr"] = {stem:make_form{ending = "eahkki"}} data.forms["3|d|impr"] = {stem:make_form{ending = "ēhkoska"}} data.forms["1|p|impr"] = {stem:make_form{ending = "ēhkot"}, stem:make_form{ending = "eatnot"}} data.forms["2|p|impr"] = {stem:make_form{ending = "ēhket"}} data.forms["3|p|impr"] = {stem:make_form{ending = "ēhkoset"}} data.forms["impr|conn"] = {stem:make_form{}} data.forms["1|s|cond1"] = {stem:make_form{ending = "ivččen"}} data.forms["2|s|cond1"] = {stem:make_form{ending = "ivččet"}} data.forms["3|s|cond1"] = {stem:make_form{ending = "ivččii"}} data.forms["1|d|cond1"] = {stem:make_form{ending = "ivččiime"}} data.forms["2|d|cond1"] = {stem:make_form{ending = "ivččiide"}} data.forms["3|d|cond1"] = {stem:make_form{ending = "ivččiiga"}} data.forms["1|p|cond1"] = {stem:make_form{ending = "ivččiimet"}} data.forms["2|p|cond1"] = {stem:make_form{ending = "ivččiidet"}} data.forms["3|p|cond1"] = {stem:make_form{ending = "ivčče"}} data.forms["cond1|conn"] = {stem:make_form{ending = "ivčče"}} data.forms["1|s|potn"] = {stem:make_form{ending = "eaččan"}} data.forms["2|s|potn"] = {stem:make_form{ending = "eaččat"}} data.forms["3|s|potn"] = {stem:make_form{ending = "eš"}, stem:make_form{ending = "eaš"}, stem:make_form{ending = "eažžá"}} data.forms["1|d|potn"] = {stem:make_form{ending = "ežže"}} data.forms["2|d|potn"] = {stem:make_form{ending = "eažžabeahtti"}} data.forms["3|d|potn"] = {stem:make_form{ending = "eažžaba"}} data.forms["1|p|potn"] = {stem:make_form{ending = "eažžat"}} data.forms["2|p|potn"] = {stem:make_form{ending = "eažžabehtet"}} data.forms["3|p|potn"] = {stem:make_form{ending = "ežžet"}} data.forms["potn|conn"] = {stem:make_form{ending = "eš"}, stem:make_form{ending = "eaš"}, stem:make_form{ending = "eačča"}} postprocess(args, data) return output[args["output"]](data) end function export.contr(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local stem = require("Module:se-common").Stem(args[1]) local data = { forms = {}, info = "thân " .. require("Module:links").full_link({lang = lang, alt = stem.uvowel}, "term") .. " rút gọn, không luân phiên", categories = {}, } if not mw.ustring.find(stem.uvowel, "^[áeo]$") and mw.title.getCurrentTitle().nsText ~= "Bản_mẫu" then error("The final vowel(s) of the stem must be one of á, e, o.") end insert(data.categories, "Động từ rút gọn " .. lang:getCanonicalName()) insert(data.categories, "Động từ rút gọn có thân từ kết thúc bằng " .. (stem.uvowel or "") .. " " .. lang:getCanonicalName()) data.forms["inf"] = {stem:make_form{ending = "t"}} data.forms["pres|ptcp"] = {stem:make_form{ending = "jeaddji"}} data.forms["past|ptcp"] = {stem:make_form{ending = "n"}} data.forms["agnt|ptcp"] = {stem:make_form{ending = "n"}} data.forms["anoun"] = {stem:make_form{ending = "n"}} data.forms["action|ine"] = {stem:make_form{ending = "min"}, stem:make_form{ending = "me"}} data.forms["action|ela"] = {stem:make_form{ending = "mis"}} data.forms["action|com"] = {stem:make_form{ending = "miin"}} data.forms["abe"] = {stem:make_form{ending = "keahttá"}} data.forms["1|s|pres|indc"] = {stem:make_form{ending = "n"}} data.forms["2|s|pres|indc"] = {stem:make_form{ending = "t"}} data.forms["3|s|pres|indc"] = {stem:make_form{}} data.forms["1|d|pres|indc"] = {stem:make_form{ending = "jetne"}} data.forms["2|d|pres|indc"] = {stem:make_form{ending = "beahtti"}} data.forms["3|d|pres|indc"] = {stem:make_form{ending = "ba"}} data.forms["1|p|pres|indc"] = {stem:make_form{ending = "t"}} data.forms["2|p|pres|indc"] = {stem:make_form{ending = "bēhtet"}} data.forms["3|p|pres|indc"] = {stem:make_form{ending = "jit"}} data.forms["pres|indc|conn"] = {stem:make_form{}} data.forms["1|s|past|indc"] = {stem:make_form{ending = "jin"}} data.forms["2|s|past|indc"] = {stem:make_form{ending = "jit"}} data.forms["3|s|past|indc"] = {stem:make_form{ending = "i", variant = "j"}} data.forms["1|d|past|indc"] = {stem:make_form{ending = "ime", variant = "j"}} data.forms["2|d|past|indc"] = {stem:make_form{ending = "ide", variant = "j"}} data.forms["3|d|past|indc"] = {stem:make_form{ending = "iga", variant = "j"}} data.forms["1|p|past|indc"] = {stem:make_form{ending = "imet", variant = "j"}} data.forms["2|p|past|indc"] = {stem:make_form{ending = "idet", variant = "j"}} data.forms["3|p|past|indc"] = {stem:make_form{ending = "jedje"}} data.forms["past|indc|conn"] = {stem:make_form{ending = "n"}} data.forms["1|s|impr"] = {stem:make_form{ending = "jēhkon"}} data.forms["2|s|impr"] = {stem:make_form{}} data.forms["3|s|impr"] = {stem:make_form{ending = "jēhkos"}} data.forms["1|d|impr"] = {stem:make_form{ending = "jeadnu"}, stem:make_form{ending = "jeahkku"}} data.forms["2|d|impr"] = {stem:make_form{ending = "jeahkki"}} data.forms["3|d|impr"] = {stem:make_form{ending = "jēhkoska"}} data.forms["1|p|impr"] = {stem:make_form{ending = "jētnot"}, stem:make_form{ending = "jēhkot"}, stem:make_form{ending = "jeahkkot"}, stem:make_form{ending = "jeadnot"}} data.forms["2|p|impr"] = {stem:make_form{ending = "jēhket"}} data.forms["3|p|impr"] = {stem:make_form{ending = "jēhkoset"}} data.forms["impr|conn"] = {stem:make_form{}} data.forms["1|s|cond1"] = {stem:make_form{ending = "šin"}, stem:make_form{ending = "šedjen"}} data.forms["2|s|cond1"] = {stem:make_form{ending = "šit"}, stem:make_form{ending = "šedjet"}} data.forms["3|s|cond1"] = {stem:make_form{ending = "šii"}} data.forms["1|d|cond1"] = {stem:make_form{ending = "šeimme"}} data.forms["2|d|cond1"] = {stem:make_form{ending = "šeidde"}} data.forms["3|d|cond1"] = {stem:make_form{ending = "šeigga"}} data.forms["1|p|cond1"] = {stem:make_form{ending = "šeimmet"}} data.forms["2|p|cond1"] = {stem:make_form{ending = "šeiddet"}} data.forms["3|p|cond1"] = {stem:make_form{ending = "še"}, stem:make_form{ending = "šedje"}} data.forms["cond1|conn"] = {stem:make_form{ending = "še"}} data.forms["1|s|cond2"] = {stem:make_form{ending = "lin"}, stem:make_form{ending = "ledjen"}} data.forms["2|s|cond2"] = {stem:make_form{ending = "lit"}, stem:make_form{ending = "ledjet"}} data.forms["3|s|cond2"] = {stem:make_form{ending = "lii"}} data.forms["1|d|cond2"] = {stem:make_form{ending = "leimme"}} data.forms["2|d|cond2"] = {stem:make_form{ending = "leidde"}} data.forms["3|d|cond2"] = {stem:make_form{ending = "leigga"}} data.forms["1|p|cond2"] = {stem:make_form{ending = "leimmet"}} data.forms["2|p|cond2"] = {stem:make_form{ending = "leiddet"}} data.forms["3|p|cond2"] = {stem:make_form{ending = "le"}, stem:make_form{ending = "ledje"}} data.forms["cond2|conn"] = {stem:make_form{ending = "le"}} data.forms["1|s|potn"] = {stem:make_form{ending = "žan"}} data.forms["2|s|potn"] = {stem:make_form{ending = "žat"}} data.forms["3|s|potn"] = {stem:make_form{ending = "ža"}, stem:make_form{ending = "š"}} data.forms["1|d|potn"] = {stem:make_form{ending = "žetne"}} data.forms["2|d|potn"] = {stem:make_form{ending = "žeahppi"}} data.forms["3|d|potn"] = {stem:make_form{ending = "žeaba"}} data.forms["1|p|potn"] = {stem:make_form{ending = "žit"}, stem:make_form{ending = "žat"}} data.forms["2|p|potn"] = {stem:make_form{ending = "žēhpet"}} data.forms["3|p|potn"] = {stem:make_form{ending = "žit"}} data.forms["potn|conn"] = {stem:make_form{ending = "š"}} postprocess(args, data) return output[args["output"]](data) end function export.leat(frame) local params = { ["output"] = {default = "table"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = { forms = {}, info = "lẻ, không luân phiên, bất quy tắc", categories = {"Động từ lẻ " .. lang:getCanonicalName(), "Động từ bất quy tắc " .. lang:getCanonicalName()}, } data.forms["inf"] = {"leat", "leahkit"} data.forms["pres|ptcp"] = {"leahkki"} data.forms["past|ptcp"] = {"leamaš"} data.forms["agnt|ptcp"] = nil data.forms["anoun"] = {"leapmi"} data.forms["action|ine"] = {"leamen", "leame", "leahkime"} data.forms["action|ela"] = {"leames"} data.forms["action|com"] = nil data.forms["abe"] = nil data.forms["1|s|pres|indc"] = {"lean"} data.forms["2|s|pres|indc"] = {"leat"} data.forms["3|s|pres|indc"] = {"lea"} data.forms["1|d|pres|indc"] = {"letne"} data.forms["2|d|pres|indc"] = {"leahppi"} data.forms["3|d|pres|indc"] = {"leaba"} data.forms["1|p|pres|indc"] = {"leat"} data.forms["2|p|pres|indc"] = {"lēhpet"} data.forms["3|p|pres|indc"] = {"leat"} data.forms["pres|indc|conn"] = {"leat"} data.forms["1|s|past|indc"] = {"ledjen"} data.forms["2|s|past|indc"] = {"ledjet"} data.forms["3|s|past|indc"] = {"lei", "leai"} data.forms["1|d|past|indc"] = {"leimme"} data.forms["2|d|past|indc"] = {"leidde"} data.forms["3|d|past|indc"] = {"leigga", "leaigga"} data.forms["1|p|past|indc"] = {"leimmet"} data.forms["2|p|past|indc"] = {"leiddet"} data.forms["3|p|past|indc"] = {"ledje"} data.forms["past|indc|conn"] = {"lean"} data.forms["1|s|impr"] = {"lēhkon"} data.forms["2|s|impr"] = {"leagẹ"} data.forms["3|s|impr"] = {"lēhkos"} data.forms["1|d|impr"] = {"leadnu", "leahkku"} data.forms["2|d|impr"] = {"leahkki"} data.forms["3|d|impr"] = {"lēhkoska"} data.forms["1|p|impr"] = {"lēhkot", "leatnot"} data.forms["2|p|impr"] = {"lēhket"} data.forms["3|p|impr"] = {"lēhkoset"} data.forms["impr|conn"] = {"leagẹ"} data.forms["1|s|cond1"] = {"livččen"} data.forms["2|s|cond1"] = {"livččet"} data.forms["3|s|cond1"] = {"livččii"} data.forms["1|d|cond1"] = {"livččiime"} data.forms["2|d|cond1"] = {"livččiide"} data.forms["3|d|cond1"] = {"livččiiga"} data.forms["1|p|cond1"] = {"livččiimet"} data.forms["2|p|cond1"] = {"livččiidet"} data.forms["3|p|cond1"] = {"livčče"} data.forms["cond1|conn"] = {"livčče"} data.forms["1|s|potn"] = {"leaččan"} data.forms["2|s|potn"] = {"leaččat"} data.forms["3|s|potn"] = {"leš", "leaš", "leažžá"} data.forms["1|d|potn"] = {"ležže"} data.forms["2|d|potn"] = {"leažžabeahtti"} data.forms["3|d|potn"] = {"leažžaba"} data.forms["1|p|potn"] = {"leažžat"} data.forms["2|p|potn"] = {"leažžabehtet"} data.forms["3|p|potn"] = {"ležžet"} data.forms["potn|conn"] = {"leš", "leaš", "leačča"} postprocess(args, data) return output[args["output"]](data) end -- Make the table output.table = function(data) local function repl(param) local accel = true local no_store = false if param == "info" then return mw.getContentLanguage():ucfirst(data.info or "") elseif string.sub(param, 1, 1) == "!" then no_store = true param = string.sub(param, 2) elseif string.sub(param, 1, 1) == "#" then accel = false param = string.sub(param, 2) end local forms = data.forms[param] if not forms then return "&mdash;" end local ret = {} for _, subform in ipairs(forms) do insert(ret, require("Module:links").full_link({lang = lang, term = subform, accel = accel and {form = param, lemma = data.lemma, no_store = no_store} or nil})) end return concat(ret, "<br/>") end local wikicode = [=[ {| class="inflection-table vsSwitcher" data-toggle-category="inflection" style="border: solid 1px var(--wikt-palette-lightindigo)" cellspacing="1" cellpadding="2" |- style="background: var(--wikt-palette-palegreen);color:inherit; text-align: left;" ! class="vsToggleElement" colspan="4" | {{{info}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit" ! style="width: 11em; background: var(--wikt-palette-palegreen);color:inherit;" | nguyên mẫu | style="width: 15em;" colspan="2" | {{{!inf}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | hiện tại ở ngôi thứ nhất số ít | colspan="2" | {{{!1|s|pres|indc}}} |- class="vsShow" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | quá khứ ở ngôi thứ nhất số ít | colspan="2" | {{{!1|s|past|indc}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | nguyên mẫu | data-accel-col="1" | {{{inf}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động | data-accel-col="2" | {{{#anoun}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | phân từ hiện tại | data-accel-col="1" | {{{pres|ptcp}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động<br/>[[inessive|định vị cách]] | data-accel-col="2" | {{{action|ine}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | phân từ quá khứ | data-accel-col="1" | {{{past|ptcp}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động<br/>[[elative|xuất cách]] | data-accel-col="2" | {{{action|ela}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | phân từ tác nhân | data-accel-col="1" | {{{agnt|ptcp}}} ! style="background: var(--wikt-palette-palegreen);color:inherit;" | danh từ hành động<br/>[[comitative|cách kèm]] | data-accel-col="2" | {{{action|com}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" colspan="2" | ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[abessive|vô cách]] | {{{abe}}} |- class="vsHide" ! style="background: var(--wikt-palette-mint);color:inherit; width: 11em;" | ! style="background: var(--wikt-palette-mint);color:inherit; width: 15em;" | trần thuật hiện tại ! style="background: var(--wikt-palette-mint);color:inherit; width: 15em;" | trần thuật quá khứ ! style="background: var(--wikt-palette-mint);color:inherit; width: 15em;" | mệnh lệnh |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số ít | data-accel-col="1" | {{{1|s|pres|indc}}} | data-accel-col="2" | {{{1|s|past|indc}}} | data-accel-col="3" | {{{1|s|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số ít | data-accel-col="1" | {{{2|s|pres|indc}}} | data-accel-col="2" | {{{2|s|past|indc}}} | data-accel-col="3" | {{{2|s|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số ít | data-accel-col="1" | {{{3|s|pres|indc}}} | data-accel-col="2" | {{{3|s|past|indc}}} | data-accel-col="3" | {{{3|s|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số đôi | data-accel-col="1" | {{{1|d|pres|indc}}} | data-accel-col="2" | {{{1|d|past|indc}}} | data-accel-col="3" | {{{1|d|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số đôi | data-accel-col="1" | {{{2|d|pres|indc}}} | data-accel-col="2" | {{{2|d|past|indc}}} | data-accel-col="3" | {{{2|d|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số đôi | data-accel-col="1" | {{{3|d|pres|indc}}} | data-accel-col="2" | {{{3|d|past|indc}}} | data-accel-col="3" | {{{3|d|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số nhiều | data-accel-col="1" | {{{1|p|pres|indc}}} | data-accel-col="2" | {{{1|p|past|indc}}} | data-accel-col="3" | {{{1|p|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số nhiều | data-accel-col="1" | {{{2|p|pres|indc}}} | data-accel-col="2" | {{{2|p|past|indc}}} | data-accel-col="3" | {{{2|p|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{3|p|pres|indc}}} | data-accel-col="2" | {{{3|p|past|indc}}} | data-accel-col="3" | {{{3|p|impr}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[connegative|yếu tố phủ định]] | data-accel-col="1" | {{{pres|indc|conn}}} | data-accel-col="2" | {{{past|indc|conn}}} | data-accel-col="3" | {{{impr|conn}}} |- class="vsHide" ! style="background: var(--wikt-palette-mint);color:inherit;" | ! style="background: var(--wikt-palette-mint);color:inherit;" | điều kiện&nbsp;loại 1 ! style="background: var(--wikt-palette-mint);color:inherit;" | điều kiện&nbsp;loại 2 ! style="background: var(--wikt-palette-mint);color:inherit;" | khả năng |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số ít | data-accel-col="4" | {{{1|s|cond1}}} | data-accel-col="5" | {{{1|s|cond2}}} | data-accel-col="6" | {{{1|s|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số ít | data-accel-col="4" | {{{2|s|cond1}}} | data-accel-col="5" | {{{2|s|cond2}}} | data-accel-col="6" | {{{2|s|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số ít | data-accel-col="4" | {{{3|s|cond1}}} | data-accel-col="5" | {{{3|s|cond2}}} | data-accel-col="6" | {{{3|s|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số đôi | data-accel-col="4" | {{{1|d|cond1}}} | data-accel-col="5" | {{{1|d|cond2}}} | data-accel-col="6" | {{{1|d|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số đôi | data-accel-col="4" | {{{2|d|cond1}}} | data-accel-col="5" | {{{2|d|cond2}}} | data-accel-col="6" | {{{2|d|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số đôi | data-accel-col="4" | {{{3|d|cond1}}} | data-accel-col="5" | {{{3|d|cond2}}} | data-accel-col="6" | {{{3|d|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ nhất số nhiều | data-accel-col="4" | {{{1|p|cond1}}} | data-accel-col="5" | {{{1|p|cond2}}} | data-accel-col="6" | {{{1|p|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ hai số nhiều | data-accel-col="4" | {{{2|p|cond1}}} | data-accel-col="5" | {{{2|p|cond2}}} | data-accel-col="6" | {{{2|p|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | ngôi thứ ba số nhiều | data-accel-col="4" | {{{3|p|cond1}}} | data-accel-col="5" | {{{3|p|cond2}}} | data-accel-col="6" | {{{3|p|potn}}} |- class="vsHide" style="background: var(--wikt-palette-lavender);color:inherit" ! style="background: var(--wikt-palette-palegreen);color:inherit;" | [[connegative|yếu tố phủ định]] | data-accel-col="4" | {{{cond1|conn}}} | data-accel-col="5" | {{{cond2|conn}}} | data-accel-col="6" | {{{potn|conn}}} |}]=] return mw.ustring.gsub(wikicode, "{{{([#!]?[a-z0-9|]+)}}}", repl) .. require("Module:utilities").format_categories(data.categories, lang) end -- Given a tag set, return a flattened list all Wikidata ID's of all tags in the tag set. local function to_Wikidata_IDs(tag_set, lang, skip_tags_without_ids) local ret, WIKIDATA = {}, require("Module:form of/data").WIKIDATA local function get_wikidata_id(tag) local data = export.lookup_tag(tag, lang) if data and data[WIKIDATA] then return ("Q%s"):format(data[WIKIDATA]) elseif not skip_tags_without_ids then error('The tag "' .. tag .. '" does not have a Wikidata ID defined in the form-of data modules') end end local normalized_tag_sets = export.normalize_tag_set(tag_set, lang) for _, tag_set in ipairs(normalized_tag_sets) do for _, tag in ipairs(tag_set) do if type(tag) == "table" then for _, subtag in ipairs(tag) do if type(subtag) == "table" then -- two-level multipart tag; FIXME: delete support for this for _, subsubtag in ipairs(subtag) do insert(ret, get_wikidata_id(subsubtag)) end else insert(ret, get_wikidata_id(subtag)) end end else insert(ret, get_wikidata_id(tag)) end end end return ret end output.Wikidata = function(data) local order = { "inf", "pres|ptcp", "past|ptcp", "agnt|ptcp", --"action|ine", --"action|ela", --"action|com", "abe", "1|s|pres|indc", "2|s|pres|indc", "3|s|pres|indc", "1|d|pres|indc", "2|d|pres|indc", "3|d|pres|indc", "1|p|pres|indc", "2|p|pres|indc", "3|p|pres|indc", "pres|indc|conn", "1|s|past|indc", "2|s|past|indc", "3|s|past|indc", "1|d|past|indc", "2|d|past|indc", "3|d|past|indc", "1|p|past|indc", "2|p|past|indc", "3|p|past|indc", "past|indc|conn", "1|s|impr", "2|s|impr", "3|s|impr", "1|d|impr", "2|d|impr", "3|d|impr", "1|p|impr", "2|p|impr", "3|p|impr", "impr|conn", "1|s|cond1", "2|s|cond1", "3|s|cond1", "1|d|cond1", "2|d|cond1", "3|d|cond1", "1|p|cond1", "2|p|cond1", "3|p|cond1", "cond1|conn", "1|s|cond2", "2|s|cond2", "3|s|cond2", "1|d|cond2", "2|d|cond2", "3|d|cond2", "1|p|cond2", "2|p|cond2", "3|p|cond2", "cond2|conn", "1|s|potn", "2|s|potn", "3|s|potn", "1|d|potn", "2|d|potn", "3|d|potn", "1|p|potn", "2|p|potn", "3|p|potn", "potn|conn", } local ret = {} for _, key in ipairs(order) do if data.forms[key] and data.forms[key][1] then for _, form in ipairs(data.forms[key]) do key = key:gsub("cond[12]", "cond") insert(ret, { representations = {[lang:getCode()] = {language = lang:getCode(), value = form}}, grammaticalFeatures = to_Wikidata_IDs(key, lang), }) end end end return require("Module:JSON").toJSON(ret) end return export jskuodsmo3duy6o5d6g61viue21a3yh Tajikistan 0 308120 2345113 2284693 2026-04-14T03:08:20Z Hiyuune 50834 2345113 wikitext text/x-wiki =={{langname|en}}== [[File:Tajikistan in its region.svg|thumb|250px]] ==={{section|alt}}=== * {{alter|en|Tadjikistan|Tadzhikistan}} ==={{section|etym}}=== {{bor+|en|tg|Тоҷикистон}}, từ {{der|en|fa-cls|تاجیکستان|tr=tājīkistān}}. ==={{section|pron}}=== * {{IPA4|en|/təˈdʒiːkɪˌstɑːn/|/təˈdʒɪkɪˌstɑːn/}} * {{audio|en|En-us-Tajikistan.ogg|a=US}} ==={{section|pr-noun}}=== {{en-proper noun}} # {{senseid|vi|Q863}}{{place|en|quốc gia|r/Trung Á|official=Cộng hoà Tajikistan|capital=Dushanbe}}. ==={{section|see}}=== * [[Phụ lục:Các quốc gia và vùng lãnh thổ trên thế giới|Các quốc gia và vùng lãnh thổ trên thế giới]] * {{list:countries of Asia/en}} {{cln|en|Từ có hậu tố -stan}} st42zkbqenibm5xiyyk9v5c7uuji4ch ウパㇱ 0 312919 2345027 2309302 2026-04-13T23:59:58Z Hiyuune 50834 /* Tiếng Ainu */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2345027 wikitext text/x-wiki =={{langname|ain}}== ==={{section|n}}=== {{head|ain|Danh từ|tr=upas}} # {{lb|ain|Hokkaido|Kuril|South Kuril}} [[tuyết|Tuyết]]. ===={{section|alt}}==== * {{alter|ain|オパㇱ||Sakhalin}} * {{alter|ain|ヲバス||Kuril}} ===={{section|etym}}==== Từ tiếng Ainu nguyên thủy ''*opas'' LH (“tuyết”).<ref>{{R:ain:Vovin:1993|page=119}}</ref> ===={{section|pron}}==== {{ain-IPA|upas}} [[File:MapOfAinuLanguage-Snow.svg|thumb|400px|Bản đồ phương ngữ tiếng Ainu: tuyết]] {|class="wikitable" |+ bảng phương ngữ: [[tuyết]] (1960)<ref>{{R:ain:HattoriAndChiri:1960}}</ref> ! địa danh !! cách phát âm |- ! Yakumo (八雲) | 'upas |- ! Oshamambe (長万部) | 'upas |- ! Horobetsu (幌別) | 'upas |- ! Hiratori (平取) | 'upas |- ! Nukkibetsu (貫気別) | 'upas |- ! Niikappu (新冠) | 'upas |- ! Samani (様似) | 'upas |- ! Obihiro (帯広) | 'upas |- ! Kushiro (釧路) | 'upas |- ! Bihoro (美幌) | 'upas |- ! Asahikawa (旭川) | 'upas |- ! Nayoro (名寄) | 'upas |- ! Soya (宗谷) | 'opás |- ! Ochiho (落帆) | 'opás |- ! Tarantomari (多蘭泊) | 'opás |- ! Maoka (真岡) | 'opás |- ! Shiraura (白浦) | 'opás |- ! Raichishka (ライチシカ) | 'opás |- ! Nairo (内路) | 'opás |} ===={{section|syn}}==== {{dial syn|ain|ウパㇱ}} ==={{section|ref}}=== <references/> :* {{R:ain:IshikariWordlist}} :* {{R:ain:Murayama1970}} :* {{R:ain:BugaevaAndSato2021}} {{C|ain|Tuyết}} rx74wbqh6t5khn2s4q3xgfzyc1mcgel ペンギン 0 315731 2345068 2184316 2026-04-14T00:58:21Z Hiyuune 50834 2345068 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{section|etym}}=== {{dercat|ja|cy|la}} Từ {{bor|ja|en|penguin}}. ==={{section|pron}}=== {{ja-pron|acc=0|acc_ref=DJR,NHK,SMK5}} ==={{section|n}}=== {{ja-noun}} # [[chim cánh cụt|Chim cánh cụt]]. ===={{section|syn}}==== * {{q|hiếm}} {{ja-r|人%鳥|じん%ちょう}}, {{ja-r|企%鵝|き%が}} ==={{section|ref}}=== <references/> {{C|ja|Chim cánh cụt}} qsiqyrp6mb2obb00mtayhfjo9tdi99r Thể loại:lv:Họ Xương rồng 14 319280 2345039 2293777 2026-04-14T00:34:37Z Hiyuune 50834 2345039 wikitext text/x-wiki [[Thể loại:lv:Bộ Cẩm chướng]] [[Thể loại:lv:Cây mọng nước]] [[Thể loại:lv:Danh sách bộ chủ đề]] [[Thể loại:Họ Xương rồng]] 354tc6s3ix8hchjvlrp189nkspyzsia Bản mẫu:ca-verb form of 10 319583 2344961 2278895 2026-04-13T13:01:47Z Hiyuune 50834 2344961 wikitext text/x-wiki ''Dạng'' {{#invoke:romance inflections|verb_form_of|norm=ca}}<!-- --><noinclude>{{tài liệu}}</noinclude> 3fcn4rb0qbx447fjx4anm6dnonb4l3l Mô đun:ca-verb 828 319584 2344960 2229641 2026-04-13T13:00:35Z Hiyuune 50834 2344960 Scribunto text/plain --[=[ This module implements {{ca-conj}} and provides the underlying conjugation functions for {{ca-verb}} (whose actual formatting is done in [[Module:ca-headword]]). Authorship: Ben Wing <benwing2> ]=] local export = {} --[=[ TERMINOLOGY: -- "slot" = A particular combination of tense/mood/person/number/etc. Example slot names for verbs are "pres_1s" (present indicative first-person singular), "pres_sub_2s" (present subjunctive second-person singular) "impf_sub_3p" (imperfect subjunctive third-person plural). Each slot is filled with zero or more forms. -- "form" = The conjugated Catalan form representing the value of a given slot. -- "lemma" = The dictionary form of a given Catalan term. For Catalan, always the infinitive. ]=] --[=[ FIXME: --]=] local lang = require("Module:languages").getByCode("ca") local m_string_utilities = require("Module:string utilities") local m_links = require("Module:links") local m_table = require("Module:table") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local com = require("Module:ca-common") local force_cat = false -- set to true for debugging local check_for_red_links = false -- set to false for debugging local rfind = mw.ustring.find local rmatch = mw.ustring.match local rsplit = mw.text.split local rsubn = mw.ustring.gsub local rsub = com.rsub local u = mw.ustring.char local unpack = unpack or table.unpack -- Lua 5.2 compatibility -- version of rsubn() that returns a 2nd argument boolean indicating whether a substitution was made. local function rsubb(term, foo, bar) local retval, nsubs = rsubn(term, foo, bar) return retval, nsubs > 0 end local function link_term(term, display, face) return m_links.full_link({ lang = lang, term = term, alt = display }, face) end local front_vowel = "eèéiíï" local front_vowel_c = "[" .. front_vowel .. "]" local V = com.V -- vowel regex class local C = com.C -- consonant regex class -- IS_USER_STEM_OVERRIDE is prepended to user-supplied stem overrides to prevent `base.prefix` from being prepended. -- IS_USER_FORM_OVERRIDE is similar but also prevents final devoicing (cf. Balearic pres_1s 'trob' of [[trobar]]). -- Don't use 0xFFF0 in case we call a [[Module:parse-utilities]] function that uses it temporarily. local IS_USER_STEM_OVERRIDE = u(0xFFF1) local IS_USER_FORM_OVERRIDE = u(0xFFF2) --[=[ Irregular verbs: -ldre/-ndre verbs: infinitive pres1s pres3s pres1p impf1s fut1s pret1s sub1s sub1p pp caldre - cal [calent] calia caldrà calgué calgui - calgut,- coldre colc col colem colia coldré colguí colgui colguem colt,colta doldre dolc dol dolem dolia doldré dolguí dolgui dolguem dolgut,dolguda moldre molc mol molem molia moldré molguí molgui molguem molt,molta oldre olc ol olem olia oldré olguí olgui olguem olgut,olguda -soldre -solc -sol -solem -solia -soldré -solguí -solgui -solguem -solt,-solta (absoldre, dissoldre, resoldre) toldre tolc tol tolem tolia toldré tolguí tolgui tolguem tolt,tolta romandre romanc roman romanem romania romandré romanguí romangui romanguem romàs,romasa,romasos encendre encenc encén encenem encenia encendré encenguí encengui encenguem encès,encesa,encesos fendre fenc fen/-fèn fenem fenia fendré fenguí fengui fenguem fes/-fès,fesa,fesos (defendre, ofendre) -pendre -depenc -pèn -penem -penia -pendré -penguí -pengui -penguem -pès,-pesa,-pesos (dependre,despendre,expendre,suspendre) prendre prenc pren/-prèn prenem prenia prendré prenguí prengui prenguem pres/-près,presa,presos (aprendre, comprendre, desprendre, emprendre, reprendre, sorprendre) -tendre -tenc -tén -tenem -tenia -tendré -tenguí -tengui -tenguem -tès,-tesa,-tesos (pres2s: atens, pres3p: atenen) (atendre, contendre, distendre, entendre, estendre, pretendre) vendre venc ven venem venia vendré venguí vengui venguem venut,venuda (malvendre, revendre) fondre fonc fon fonem fonia fondré fonguí fongui fonguem fos/-fós,fosa,fosos (confondre, difondre, infondre, refondre) enfondre enfonc enfon enfonem enfonia enfondré enfonguí enfongui enfonguem enfús,enfusa,enfusos pondre ponc pon ponem ponia pondré ponguí pongui ponguem post,posta,postos (compondre, correspondre, descompondre, respondre) tondre tonc ton tonem tonia tondré tonguí tongui tonguem tos,tosa,tosos cerndre cerno cern cernem cernia cerndré cerní cerni cernem cernut,cernuda -ler verbs (mostly like -ldre verbs): infinitive pres1s pres3s pres1p impf1s fut1s pret1s sub1s sub1p pp caler (var. of caldre) doler (var. of doldre) soler solc sol solem solia soldré solguí solgui solguem solgut,solguda valer/valdre valc val valem valia valdré valguí valgui valguem valgut,valguda (prevaler, equivaler) other -dre/-tre verbs (regular except sometimes pp): infinitive pres1s pres3s pres1p impf1s fut1s pret1s sub1s sub1p pp batre bato bat batem batia batré batí bati batem batut,batuda -metre -meto -met -metem -metia -metré -metí -meti -metem -mès,-mesa,-mesos (ad-, co-, compro-, e-, entremetre's, mal-, o-, per-, pro-, read-, re-, retrans-, sot-, tra-, trans-) perdre perdo perd perdem perdia perdré perdí perdi perdem perdut,perduda -ure verbs infinitive pres1s pres3s pres1p impf1s impf1p fut1s pret1s sub1s sub1p pp caure caic cau caiem queia quèiem cauré caiguí caigui caiguem caigut,caiguda (decaure, recaure) plaure plac plau plaem plaïa plaíem plauré plaguí plagui plaguem plagut,plaguda (complaure) raure rac rau raem raïa raíem rauré raguí ragui raguem ragut,raguda beure bec beu bevem bevia bevíem beuré beguí begui beguem begut,beguda (embeure) creure crec creu creiem creia crèiem creuré creguí cregui creguem cregut,creguda deure dec deu devem devia devíem deuré deguí degui deguem degut,deguda jeure jec jeu jaiem jeia jèiem jauré jaguí jegui jaguem jagut,jaguda (ajeure) lleure - lleu [-] llevia - lleurà llegué llegui - llegut,- seure sec seu seiem seia sèiem seuré seguí segui seguem segut,seguda (asseure) treure trec treu traiem treia trèiem trauré traguí tregui traguem tret,treta (abstreure, atreure, contreure, distreure, extreure, retreure, sostreure) veure veig veu veiem veia vèiem veuré viu,veieres/veres, vegi vegem vist,vista,vists/vistos (entreveure, preveure, reveure) veié/veu,veiérem/vérem riure ric riu riem reia rèiem riuré riguí rigui riguem rigut,riguda (somriure) (e)scriure escric escriu escrivim escrivia escrivíem escriuré escriví/escriguí escrigui escriguem escrit,escrita (circumscriure, descriure, inscriure, prescriure, proscriure, subscriure, transcriure) viure visc viu vivim vivia vivíem viuré visquí visqui visquem viscut,viscuda (conviure, sobreviure) cloure cloc clou cloem cloïa cloíem clouré cloguí clogui cloguem clos,closa,closos (concloure, descloure, encloure, excloure, incloure, recloure) encloure encloc enclou encloem encloïa encloíem enclouré encloguí enclogui encloguem enclòs,enclosa,enclosos coure coc cou coem coïa coíem couré coguí cogui coguem cuit/cogut,cuita/coguda moure moc mou movem movia movíem mouré moguí mogui moguem mogut,moguda (promoure) noure noc nou noem noïa noíem nouré noguí nogui noguem nogut,noguda ploure - plou [plovent] plovia - plourà plogué plogui - plogut,ploguda -nyer verbs (regular except pp) infinitive pres1s pres3s pres1p impf1s fut1s pret1s sub1s sub1p pp atènyer atenyo ateny atenyem atenyia atenyeré atenyí atenyi atenyem atès,atesa,atesos empènyer empenyo empeny empenyem empenyia empenyeré empenyí empenyi empenyem empès,empesa,empesos estrènyer estrenyo estreny estrenyem estrenyia estrenyeré estrenyí estrenyi estrenyem estret,estreta estrènyer (constrènyer,restrènyer) fènyer fenyo feny fenyem fenyia fenyeré fenyí/fenguí fenyi fenyem fenyut/fengut,fenyuda/fenguda pertànyer pertanyo pertany pertanyem pertanyia pertanyeré pertanyí/pertanguí pertanyi pertanyem pertanyut/pertangut,pertanyuda/pertanguda plànyer planyo plany planyem planyia planyeré planyí/planguí planyi planyem plangut/planyut,planguda/planyuda -xer verbs (NOTE: pres2s in -xes) infinitive pres1s pres3s pres1p impf1s fut1s pret1s sub1s sub1p pp créixer creixo creix creixem creixia creixeré creixí/cresquí creixi creixem crescut,crescuda (acréixer,decréixer) conèixer conec coneix coneixem coneixia coneixeré coneguí conegui coneguem conegut,coneguda (desconèixer,reconèixer) merèixer mereixo mereix mereixem mereixia mereixeré mereixí/meresquí mereixi mereixem merescut,merescuda néixer/ neixo/ neix/ naixem naixia naixeré naixí/nasquí neixi/ naixem/nasquem nascut,nascuda nàixer naixo naix naixi (renéixer) parèixer parec pareix pareixem pareixia pareixeré pareguí paregui pareguem paregut,pareguda (aparèixer,comparèixer,desaparèixer,reaparèixer) péixer peixo peix paixem paixia paixeré paixí peixi paixem pascut,pascuda misc. -er verbs infinitive pres1s pres3s pres1p impf1s impf1p fut1s pret1s sub1s sub1p pp córrer corro corre correm corria corríem correré correguí corri correm corregut,correguda fúmer fumo fum fumem fumia fumíem fumeré fumí fumi fumem fumut,fumuda prémer premo prem premem premia premíem premeré premí premi premem premut,premuda (es-, re-) témer temo tem temem temia temíem temeré temí temi temem temut,temuda trémer [regular] tòrcer torço torç torcem torcia torcíem torceré torcí torci torcem torçut,torçuda (des-) [pres2s torces] vèncer venço venç vencem vencia vencíem venceré vencí venci vencem vençut,vençuda (con-, re-) [pres2s vences] cabre/caber cabo cap cabem cabia cabíem cabré cabí càpiga capiguem cabut,cabuda [sub2s càpigues] haver he/haig ha havem/hem havia havíem hauré haguí hagi hàgim/haguem hagut,haguda [noimp] [cond1s hauria/haguera; impsub2s haguessis/haguesses] poder puc pot podem podia podíem podré poguí pugui puguem pogut,poguda saber sé sap sabem sabia sabíem sabré sabí sàpiga sapiguem sabut,sabuda [imp2s sàpigues, imp2p sapigueu] voler vull vol volem volia volíem voldré volguí vulgui vulguem volgut,volguda ser/ésser soc és som era érem seré fui sigui siguem estat/sigut,estada/siguda [ger sent/essent] [cond1s seria/fora] [pres: soc,ets,éts,som,sou,són; pret: fui,fores,fou,fórem,fóreu,foren; impsub: fos,fossis,fos,fóssim,fóssiu,fossin] [imp: sigues,sigueu] fer faig fa fem feia fèiem faré fiu faci fem fet,feta [pres3p fan] [pret: fiu,feres,feu,férem,féreu,feren] ]=] local all_persons_numbers = { ["1s"] = "1|s", ["2s"] = "2|s", ["3s"] = "3|s", ["1p"] = "1|p", ["2p"] = "2|p", ["3p"] = "3|p", } local person_number_list = {"1s", "2s", "3s", "1p", "2p", "3p"} local imp_person_number_list = {"2s", "3s", "1p", "2p", "3p"} local neg_imp_person_number_list = {"2s", "3s", "1p", "2p", "3p"} proclitic_non_elided_person_number_to_reflexive_pronoun = { ["1s"] = "em ", ["2s"] = "et ", ["3s"] = "es ", ["1p"] = "ens ", ["2p"] = "us ", ["3p"] = "es ", } proclitic_elided_person_number_to_reflexive_pronoun = { ["1s"] = "m'", ["2s"] = "t'", ["3s"] = "s'", ["1p"] = "ens ", ["2p"] = "us ", ["3p"] = "s'", } enclitic_non_elided_person_number_to_reflexive_pronoun = { ["1s"] = "-me", ["2s"] = "-te", ["3s"] = "-se", ["1p"] = "-nos", ["2p"] = "-vos", ["3p"] = "-se", } enclitic_elided_person_number_to_reflexive_pronoun = { ["1s"] = "'m", ["2s"] = "'t", ["3s"] = "'s", ["1p"] = "'ns", ["2p"] = "-us", ["3p"] = "'s", } local indicator_flags = m_table.listToSet { "no_pres_stressed", "only3s", "only3sp", "only3p", "noimp", "pp_inv", "irreg", "no_built_in", } -- Initialize all the slots for which we generate forms. local function add_slots(alternant_multiword_spec) -- "Basic" slots: All slots that go into the regular table (not the reflexive form-of table). alternant_multiword_spec.verb_slots_basic = { {"infinitive", "inf"}, {"infinitive_linked", "inf"}, {"gerund", "ger"}, {"pp_ms", "m|s|past|part"}, {"pp_fs", "f|s|past|part"}, {"pp_mp", "m|p|past|part"}, {"pp_fp", "f|p|past|part"}, } -- Special slots used to handle non-reflexive parts of reflexive verbs in {{ca-verb form of}}. For example, for a -- reflexive-only verb like [[arrepentirse]], we want to be able to use {{ca-verb form of}} on [[arrepinta]] (which -- should mention that it is a part of 'me arrepinta', first-person singular present subjunctive, and -- 'se arrepinta', third-person singular present subjunctive) or on [[arrepentimos]] (which should mention that it -- is a part of 'arrepentímonos', first-person plural present indicative or preterite). Similarly, we want to use -- {{ca-verb form of}} on [[arrepentindo]] (which should mention that it is a part of 'se ... arrepentindo', -- syntactic variant of [[arrepentíndose]], which is the gerund of [[arrepentirse]]). To do this, we need to be -- able to map non-reflexive parts like [[arrepinta]], [[arrepentimos]], [[arrepentindo]], etc. to their reflexive -- equivalent(s), to the tag(s) of the equivalent(s), and, in the case of forms like [[arrepentindo]], -- [[arrepentir]] and imperatives, to the separated syntactic variant of the verb+clitic combination. We do this by -- creating slots for the non-reflexive part equivalent of each basic reflexive slot, and for the separated -- syntactic-variant equivalent of each basic reflexive slot that is formed of verb+clitic. We use slots in this -- way to deal with multiword lemmas. Note that we run into difficulties mapping between reflexive verbs, -- non-reflexive part equivalents, and separated syntactic variants if a slot contains more than one form. To -- handle this, if there are the same number of forms in two slots we're trying to match up, we assume the forms -- match one-to-one; otherwise we don't match up the two slots (which means {{ca-verb form of}} won't work in this -- case, but such a case is extremely rare and not worth worrying about). Alternatives that handle this "properly" -- are significantly more complicated and require non-trivial modifications to [[Module:inflection utilities]]. local need_special_verb_form_of_slots = alternant_multiword_spec.source_template == "ca-verb form of" and alternant_multiword_spec.refl if need_special_verb_form_of_slots then alternant_multiword_spec.verb_slots_reflexive_verb_form_of = { {"infinitive_non_reflexive", "-"}, {"infinitive_variant", "-"}, {"gerund_non_reflexive", "-"}, {"gerund_variant", "-"}, } else alternant_multiword_spec.verb_slots_reflexive_verb_form_of = {} end -- Add entries for a slot with person/number variants. -- `verb_slots` is the table to add to. -- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect. -- `tag_suffix` is a string listing the set of inflection tags to add after the person/number tags. -- `person_number_list` is a list of the person/number slot suffixes to add to `slot_prefix`. local function add_personal_slot(verb_slots, slot_prefix, tag_suffix, person_number_list) for _, persnum in ipairs(person_number_list) do local persnum_tag = all_persons_numbers[persnum] local slot = slot_prefix .. "_" .. persnum local accel = persnum_tag .. "|" .. tag_suffix table.insert(verb_slots, {slot, accel}) end end -- Add a personal slot (i.e. a slot with person/number variants) to `verb_slots_basic`. local function add_basic_personal_slot(slot_prefix, tag_suffix, person_number_list, no_special_verb_form_of_slot) add_personal_slot(alternant_multiword_spec.verb_slots_basic, slot_prefix, tag_suffix, person_number_list) -- Add special slots for handling non-reflexive parts of reflexive verbs in {{ca-verb form of}}. -- See comment above in `need_special_verb_form_of_slots`. if need_special_verb_form_of_slots and not no_special_verb_form_of_slot then for _, persnum in ipairs(person_number_list) do local persnum_tag = all_persons_numbers[persnum] local basic_slot = slot_prefix .. "_" .. persnum local accel = persnum_tag .. "|" .. tag_suffix table.insert(alternant_multiword_spec.verb_slots_reflexive_verb_form_of, {basic_slot .. "_non_reflexive", "-"}) end end end add_basic_personal_slot("pres", "pres|ind", person_number_list) add_basic_personal_slot("impf", "impf|ind", person_number_list) add_basic_personal_slot("pret", "pret|ind", person_number_list) add_basic_personal_slot("fut", "fut|ind", person_number_list) add_basic_personal_slot("cond", "cond", person_number_list) add_basic_personal_slot("pres_sub", "pres|sub", person_number_list) add_basic_personal_slot("impf_sub", "impf|sub", person_number_list) add_basic_personal_slot("imp", "imp", imp_person_number_list) -- Don't need special non-reflexive-part slots because the negative imperative is multiword, of which the -- individual words are 'no' + subjunctive. add_basic_personal_slot("neg_imp", "neg|imp", neg_imp_person_number_list, "no special verb form of") -- Don't need special non-reflexive-part slots because we don't want [[arrependendo]] mapping to [[arrependendo-me]] -- (only [[arrependendo-se]]) or [[arrepender]] mapping to [[arrepender-me]] (only [[arrepender-se]]). add_basic_personal_slot("infinitive", "inf", person_number_list, "no special verb form of") add_basic_personal_slot("gerund", "ger", person_number_list, "no special verb form of") -- Generate the list of all slots. alternant_multiword_spec.all_verb_slots = {} for _, slot_and_accel in ipairs(alternant_multiword_spec.verb_slots_basic) do table.insert(alternant_multiword_spec.all_verb_slots, slot_and_accel) end for _, slot_and_accel in ipairs(alternant_multiword_spec.verb_slots_reflexive_verb_form_of) do table.insert(alternant_multiword_spec.all_verb_slots, slot_and_accel) end alternant_multiword_spec.verb_slots_basic_map = {} for _, slotaccel in ipairs(alternant_multiword_spec.verb_slots_basic) do local slot, accel = unpack(slotaccel) alternant_multiword_spec.verb_slots_basic_map[slot] = accel end end local overridable_stems = {} local function allow_multiple_values_for_override(separated_groups, data, is_form_override) local retvals = {} for _, separated_group in ipairs(separated_groups) do local footnotes = data.fetch_footnotes(separated_group) local form = separated_group[1] -- Prepend marker to prevent prefixing with `base.prefix`, and (in the case of form overrides) prevent -- final devoicing. if is_form_override then form = IS_USER_FORM_OVERRIDE .. form else form = IS_USER_STEM_OVERRIDE .. form end local retval = {form = form, footnotes = footnotes} table.insert(retvals, retval) end return retvals end for _, overridable_stem in ipairs { "stem", "stressed_stem", "unstressed_stem", "pres_unstressed", "pres_stressed", "pres3s", -- overrides just pres_2s and pres_3s -- Don't include pres1s, pres3p; use pres_1s etc. if you need to override just those forms "impf1", "impf2", "pret", "fut", "cond", "pres_sub_stressed", "pres_sub_unstressed", "impf_sub", "pp", "g_infix", "eix_infix", } do -- Written so we can substitute a different validator; parallel code in [[Module:es-verb]] and [[Module:pt-verb]] -- has simple_choice validators. overridable_stems[overridable_stem] = allow_multiple_values_for_override end -- Useful as the value of the `match` property of a built-in verb. `main_verb_spec` is a Lua pattern that should match -- the non-prefixed part of a verb, and `prefix_specs` is a list of Lua patterns that should match the prefixed part of -- a verb. If a prefix spec is preceded by ^, it must match exactly at the beginning of the verb; otherwise, additional -- prefixes (e.g. re-, des-) may precede. Return the prefix and main verb. local function match_against_verbs(main_verb_spec, prefix_specs) return function(verb) for _, prefix_spec in ipairs(prefix_specs) do if prefix_spec:find("^%^") then -- must match exactly prefix_spec = prefix_spec:gsub("^%^", "") if prefix_spec == "" then -- We can't use the second branch of the if-else statement because an empty () returns the current position -- in rmatch(). local main_verb = rmatch(verb, "^(" .. main_verb_spec .. ")$") if main_verb then return "", main_verb end else local prefix, main_verb = rmatch(verb, "^(" .. prefix_spec .. ")(" .. main_verb_spec .. ")$") if prefix then return prefix, main_verb end end else local prefix, main_verb = rmatch(verb, "^(.*" .. prefix_spec .. ")(" .. main_verb_spec .. ")$") if prefix then return prefix, main_verb end end end return nil end end --[=[ Built-in (usually irregular) conjugations. Each entry is processed in turn and consists of an object with two fields: 1. match=: Specifies the built-in verbs that match this object. 2. forms=: Specifies the built-in stems and forms for these verbs. The value of match= is either a string beginning with "^" (match only the specified verb), a string not beginning with "^" (match any verb ending in that string), or a function that is passed in the verb and should return the prefix of the verb if it matches, otherwise nil. The function match_against_verbs() is provided to facilitate matching a set of verbs with a common ending and specific prefixes (e.g. [[ter]] and [[ater]] but not [[abater]], etc.). The value of forms= is a table specifying stems and individual override forms. Each key of the table names either a stem (e.g. `pres_stressed`), a stem property (e.g. `g_infix`) or an individual override form (e.g. `pres_1s`). Each value of a stem can either be a string (a single stem), a list of strings, or a list of objects of the form {form = STEM, footnotes = {FOONOTES}}. Each value of an individual override should be of exactly the same form except that the strings specify full forms rather than stems. The values of a stem property depend on the specific property but are generally strings or booleans. In order to understand how the stem specifications work, it's important to understand the phonetic modifications done by combine_stem_ending(). In general, the complexities of predictable prefix, stem and ending modifications are all handled in this function. In particular: 1. Spelling-based modifications (c/qu, ç/c, g/gu, j/g, gu/gü, qu/qü) occur automatically as appropriate for the ending. 2. If the ending begins with an asterisk, this is a signal to delete the accent on the last syllable of the stem, e.g. veié -> veierem. 3. If ending begins with i, it may turn into í or ï after an unstressed vowel (in some but not all cases) to prevent the two merging into a diphthong. See combine_stem_ending() for specifics. The following stems are recognized [FIXME: This is not correct for Catalan, needs rewriting]: -- pres_unstressed: The present indicative unstressed stem (1p, 2p). Also controls the imperative 2p and gerund. Defaults to the infinitive stem (minus the ending -ar/-er/-ir/-or). -- pres_stressed: The present indicative stressed stem (1s, 2s, 3s, 3p). Also controls the imperative 2s. Default is empty if indicator `no_pres_stressed`, else a vowel alternation if such an indicator is given (e.g. `ue`, `ì`), else the infinitive stem. -- pres1: Special stem for 1s present indicative. Normally, do not set this explicitly. If you need to specify an irregular 1s present indicative, use the form override pres_1s= to specify the entire form. Defaults to pres_stressed. -- pres_sub_unstressed: The present subjunctive unstressed stem (1p, 2p). Defaults to the infinitive stem. -- pres_sub_stressed: The present subjunctive stressed stem (1s, 2s, 3s, 1p). Defaults to pres1. -- impf: The imperfect stem (not including the -av-/-i- stem suffix, which is determined by the conjugation). Defaults to the infinitive stem. -- pret: The full preterite stem missing only the endings (-ste, -mos, etc.), e.g. 'fige', 'fo'. Only used for verbs with irregular preterites (pret_conj == "irreg") such as [[facer]], [[poder]], [[traer]], etc. Defaults to `pret_base` + the conjugation vowel. -- fut: The future stem. Defaults to the infinitive stem + the conjugation vowel. -- cond: The conditional stem. Defaults to `fut`. -- impf_sub: The imperfect subjunctive stem. Defaults to `pret`. -- pp: The masculine singular past participle. Default is based on the verb conjugation: infinitive stem + '-ado' for -ar verbs, otherwise infinitive stem + '-ido'. -- pp_inv: `true` if the past participle exists only in the masculine singular. ]=] local built_in_conjugations = { -------------------------------------------------------------------------------------------- -- -ar -- -------------------------------------------------------------------------------------------- -- Orthographic consonant alternations in endings are handled automatically in combine_stem_ending(). { -- [[aguar]]: -- pres agúo, agúes, agúa, agüem, agüeu, agúen -- pres_sub aguï, aguïs, aguï, agüem, agüeu, aguïn -- contrast a more typical verb in -guar, [[enaiguar]]: -- pres enaiguo, enaigües, enaigua, enaigüem, enaigüeu, enaigüen -- pres_sub enaigüi, enaigüis, enaigüi, enaigüem, enaigüeu, enaigüin match = "^aguar", forms = { pres_stressed = "agú", pres_sub_stressed = "aguï", irreg = true, } }, { -- [[anar]] (full verb); highly irregular match = "^anar", var = "full", forms = { fut = "anir", pres_1s = "vaj", -- will be converted to 'vaig'; 'vaig' gets converted to 'vaic' pres_2s = "vas", pres_3s = "va", pres_3p = "van", pres_sub_stressed = "vagi", imp_2s = "ves", irreg = true, } }, { -- [[anar]] (auxiliary); highly irregular match = "^anar", var = "aux", forms = { pres_1s = "vaj", -- will be converted to 'vaig'; 'vaig' gets converted to 'vaic' pres_2s = {"vas", "vares"}, pres_3s = "va", pres_1p = {"vam", "vàrem"}, pres_2p = {"vau", "vàreu"}, pres_3p = {"van", "varen"}, pres_sub_stressed = "vagi", pres_sub_unstressed = "vàgi", impf1 = {}, impf2 = {}, fut = {}, pret = {}, pp = {}, gerund = {}, noimp = true, irreg = true, } }, { -- [[dar]] match = "^dar", forms = { pres_1s = {form = "do", footnotes = {"[obsolete]"}}, pres_2s = {form = "das", footnotes = {"[obsolete]"}}, pres_3s = {form = "da", footnotes = {"[obsolete]"}}, pres_3p = {form = "dan", footnotes = {"[obsolete]"}}, pres_sub_1s = {form = "de", footnotes = {"[obsolete]"}}, pres_sub_2s = {form = "des", footnotes = {"[obsolete]"}}, pres_sub_3s = {form = "de", footnotes = {"[obsolete]"}}, pres_sub_3p = {form = "den", footnotes = {"[obsolete]"}}, pret_1s = "di", -- regular except for lack of accent pret_3s = "da", -- regular except for lack of accent impf_sub_1s = "des", -- regular except for lack of accent impf_sub_3s = "des", -- regular except for lack of accent irreg = true, } }, { -- [[estar]]; highly irregular match = "^estar", forms = { pres_2s = "estàs", pres_3s = "està", pres_3p = "estan", g_infix = "estig", imp_2s = "estigues", imp_2p = "estigueu", pp = "estad", } }, -------------------------------------------------------------------------------------------- -- -er/-re -- -------------------------------------------------------------------------------------------- -- Regular verbs not needing entries here: -- -- [[rebre]], [[concebre]], [[decebre]], [[percebre]] -- [[rompre]] -- [[fúmer]], [[prémer]], [[témer]], [[trémer]] -- [[perdre]], [[batre]], [[botre]], [[fotre]], [[retre]] -- [[tòrcer]], [[vèncer]] -- etc. ------------------------------------------- -ldre/-ler -------------------------------------- { -- [[caldre]], [[doldre]], [[condoldre's]], [[oldre]] match = match_against_verbs("ldre", {"ca", "do", "^o"}), forms = { -- g_infix implies irreg = true -- g_infix adds -g to pres_1s, sub, pret and pp stems; combine_stem_ending() changes final -g to -c g_infix = "+", } }, { -- [[caler]] match = "caler", like = "caldre", }, { -- [[doler]] and compounds match = "doler", like = "doldre", }, { -- [[valer]], [[equivaler]], [[prevaler]], [[sobrevaler]] match = "valer", forms = { -- see above for g_infix effects fut = "valdr", g_infix = "+", } }, { -- [[valdre]] and compounds match = "valdre", like = "valer", }, { -- [[soler]] match = "^soler", -- this must precede -oldre rule below for alt form [[soldre]] forms = { -- see above for g_infix effects fut = {}, pret = {}, impf_sub = "solgué", -- regular, but we disabled the preterite, which would normally disable impf_sub too g_infix = "+", pp = {}, noimp = true, } }, { -- [[soldre]] match = "^soldre", -- this must precede -oldre rule below like = "soler", }, { -- [[coldre]], [[moldre]], [[absoldre]], [[dissoldre]], [[resoldre]], [[toldre]] match = "oldre", -- this must follow [[doldre]]/[[oldre]] rule above forms = { -- see above for g_infix effects g_infix = "+", pp = "olt", } }, { -- [[voler]], [[malvoler]] match = "voler", forms = { fut = "voldr", pres_1s = "vull", pres_sub_stressed = "vulgui", pres_sub_unstressed = "vulgue", g_infix = "+", imp_2s = "vulgues", imp_2p = "vulgueu", } }, --------------------------------------------- -ndre ---------------------------------------- { -- [[romandre]]; write it this way so there's a prefix with a vowel to prevent against the accent in the pp -- from being removed while still removing it in the feminine. match = match_against_verbs("mandre", {"^ro"}), forms = { -- see above for g_infix effects g_infix = "+", pp = "màs#", } }, { -- [[encendre]], [[atendre]], [[contendre]], [[desentendre's]], [[distendre]], [[entendre]], [[estendre]], -- [[pretendre]] match = match_against_verbs("endre", {"enc", "t"}), forms = { pres_3s = "én#", -- remove final accent without prefix with vowel; also removed when adding a suffix -- see above for g_infix effects g_infix = "+", pp = "ès#", -- see above for effect of final # } }, { -- [[vendre]], [[malvendre]], [[revendre]] match = "vendre", forms = { pres_3s = "vèn#", -- see above for effect of final # -- see above for g_infix effects g_infix = "+", pp = "venud", -- g_infix would normally make it vengud } }, { -- [[fendre]], [[defendre]], [[ofendre]], [[dependre]], [[despendre]], [[expendre]], [[suspendre]], [[prendre]], -- [[aprendre]], [[comprendre]], [[desprendre]], [[emprendre]], [[reprendre]], [[sorprendre]] match = "endre", -- this must follow previous -endre rules above forms = { pres_3s = "èn#", -- see above for effect of final # -- see above for g_infix effects g_infix = "+", pp = "ès#", -- see above for effect of final # } }, { -- [[enfondre]]; write it this way so there's a prefix with a vowel to prevent against the accent in the pp -- from being removed while still removing it in the feminine. match = match_against_verbs("fondre", {"^en"}), forms = { -- see above for g_infix effects g_infix = "+", pp = "fús#", } }, { -- [[pondre]], [[compondre]], [[correspondre]], [[descompondre]], [[despondre's]], [[respondre]] match = "pondre", forms = { -- see above for g_infix effects g_infix = "+", pp = "post", } }, { -- [[fondre]], [[confondre]], [[difondre]], [[infondre]], [[refondre]], [[tondre]] match = "ondre", -- this must follow previous -ondre rules above forms = { -- see above for g_infix effects g_infix = "+", pp = "ós#", -- see above for effect of final # } }, --------------------------------------------- -nyer ---------------------------------------- { -- [[atènyer]]; write it this way so there's a prefix with a vowel to prevent against the accent in the pp -- from being removed while still removing it in the feminine. match = match_against_verbs("tènyer", {"^a"}), forms = { pp = "tès#", irreg = true, } }, { -- [[empènyer]], [[espènyer]] match = match_against_verbs("pènyer", {"^em", "^es"}), forms = { pp = "pès#", irreg = true, } }, { -- [[estrènyer]], [[constrènyer]], [[destrènyer]], [[restrènyer]] match = match_against_verbs("strènyer", {"^e", "con", "^de", "^re"}), forms = { pp = "stret", irreg = true, } }, { -- [[fènyer]] match = "fènyer", forms = { pp = {"fengud", "fenyud"}, irreg = true, } }, { -- [[júnyer]] match = "júnyer", like = "junyir", }, { -- [[plànyer]], [[complànyer]], [[pertànyer]] match = match_against_verbs("ànyer", {"pl", "pert"}), forms = { pp = {"angud", "anyud"}, irreg = true, } }, --------------------------------------------- -aure ---------------------------------------- { -- [[caure]], [[decaure]], [[recaure]] match = "caure", forms = { -- stem ending in -ai and imperfect in -ia causes special stressed imperfect logic to take effect; we get -- impf1s queia, impf1p quèiem (preceding vowel changed to è and attached to initial consonant using -- combine_stem_ending(), which changes c- to qu-) stem = "caie", -- i dropped by g_infix before u -- g_infix implies irreg = true -- g_infix adds -g to pres_1s, sub, pret and pp stems; combine_stem_ending() changes final -g to -c -- g_infix sets pres_stressed to end in -u, removing a preceding -i or -v g_infix = "+", } }, { -- [[plaure]], [[complaure]] match = "plaure", forms = { stem = "plae", -- ï in impf1s -aïa gets generated automatically by combine_stem_ending() g_infix = "+", } }, { -- [[raure]] match = "^raure", forms = { stem = "rae", -- ï in impf1s -aïa gets generated automatically by combine_stem_ending() g_infix = "+", pp = {"ragud", "ras"}, } }, --------------------------------------------- -eure ---------------------------------------- { -- [[beure]], [[embeure]], [[deure]], [[lleure]] match = match_against_verbs("eure", {"b", "d", "ll"}), forms = { stem = "eve", -- v dropped by g_infix before g and u g_infix = "+", } }, { -- [[creure]], [[seure]], [[asseure]] match = match_against_verbs("eure", {"cr", "s"}), forms = { stem = "ee", pres_unstressed = "eie", -- affects pres_1p, pres_2p, gerund, imperfect (see [[caure]]) g_infix = "+", } }, { -- [[jeure]], [[ajeure]] match = "jeure", forms = { fut = "jaur", -- affects future and cond stressed_stem = "jee", -- affects stressed forms, which get g added by g_infix by added except for -- pres_stressed, which gets u added (controls pres_3s, pres_2s, pres_3p) unstressed_stem = "jae", -- affects unstressed_stem, which get g added by g_infix pres_stressed = {"jeu", "jau"}, pres_unstressed = "jaie", -- affects pres_1p, pres_2p, gerund, imperfect (see [[caure]]) pres_1s = {"jec", "jac"}, impf1 = "jei", -- otherwise we'd get impf_1s '#geia' etc. impf2 = "jèi", g_infix = "+", } }, { match = "jaure", like = "jeure", }, { -- [[treure]], [[abstreure]], [[atreure]], [[bestreure]], [[contreure]], [[detreure]], [[distreure]], -- [[extreure]], [[retreure], [[retrotreure]], [[sostreure]] match = "treure", forms = { -- like [[jeure]] except for irregular pp fut = "traur", stressed_stem = "tree", unstressed_stem = "trae", pres_stressed = {"treu", "trau"}, pres_unstressed = "traie", pres_1s = {"trec", "trac"}, g_infix = "+", pp = "tret", } }, { match = "traure", like = "treure", }, { -- [[veure]], [[entreveure]], [[preveure]], [[reveure]] match = "veure", forms = { stem = "veie", -- impf1s veia, impf1p vèiem (preceding vowel changed to è) pres_stressed = "veu", pres_1s = "vej", -- will be converted to 'veig'; 'veig' gets converted to 'veic' pres_sub_stressed = "vegi", pres_sub_unstressed = "vege", pret = {"veié", "vé"}, pret_1s = "viu", pret_3s = {"veié", "veu"}, impf_sub = "veié", pp = "vist", imp_2s = "veges", imp_2p = {"vegeu", "veieu"}, irreg = true, } }, --------------------------------------------- -iure ---------------------------------------- { -- [[escriure]], [[circumscriure]], [[descriure]], [[inscriure]], [[prescriure]], [[proscriure]], -- [[subscriure]], [[transcriure]] match = "scriure", forms = { stem = "scrivi", -- v dropped by g_infix before g and u; pres_1p/pres_2p have -ir endings g_infix = "+", pret = {"scriví", "scrigué"}, pp = "scrit", } }, { -- [[riure]], [[somriure]] match = "riure", -- must follow rule for 'scriure' forms = { stem = "rie", -- impf1s reia, impf1p rèiem (preceding vowel changed to è) g_infix = "+", } }, { -- [[viure]], [[conviure]], [[desviure's]], [[sobreviure]] match = "viure", forms = { stem = "vivi", -- v dropped by g_infix before g and u; pres_1p/pres_2p have -ir endings g_infix = "visc", -- applies to pres1s, sub, pret, pp } }, --------------------------------------------- -oure ---------------------------------------- { -- [[cloure]], [[concloure]], [[descloure]], [[encloure]], [[excloure]], [[incloure]], [[recloure]] match = "cloure", forms = { stem = "cloe", -- ï in impf1s cloïa gets generated automatically by combine_stem_ending() g_infix = "+", pp = "clòs#", -- remove final accent without prefix with vowel; also removed when adding a suffix } }, { -- [[coure]] "to cook" match = "coure", var = "cook", forms = { stem = "coe", -- ï in impf1s coïa gets generated automatically by combine_stem_ending() g_infix = "+", pp = "cuit", } }, { -- [[coure]] "to sting" match = "coure", var = "sting", forms = { stem = "coe", -- ï in impf1s coïa gets generated automatically by combine_stem_ending() g_infix = "+", -- pp regular 'cogud' } }, { -- [[moure]], [[promoure]], [[remoure]], [[somoure]], [[ploure]] match = match_against_verbs("oure", {"m", "pl"}), forms = { stem = "ove", -- v dropped by g_infix before g and u g_infix = "+", } }, { -- [[noure]] match = "noure", forms = { stem = "noe", -- ï in impf1s -aïa gets generated automatically by combine_stem_ending() g_infix = "+", } }, --------------------------------------------- -xer ---------------------------------------- { -- [[conèixer]], [[desconèixer]], [[reconèixer]] match = "conèixer", forms = { g_infix = "coneg", } }, { -- [[créixer]], [[acréixer]], [[decréixer]], [[recréixer]], [[sobrecréixer]] match = "créixer", forms = { pret = {"creixé", "cresqué"}, pres_sub_unstressed = {"creixe", "cresque"}, pp = "crescud", irreg = true, } }, { -- [[merèixer]], [[desmerèixer]], [[irèixer-se]] match = match_against_verbs("rèixer", {"me", "^i"}), forms = { pret = {"reixé", "resqué"}, pres_sub_unstressed = {"reixe", "resque"}, pp = "rescud", irreg = true, } }, { -- [[néixer]]/[[nàixer]], [[renéixer]]/[[renàixer]], [[sobrenéixer]]/[[sobrenàixer]], [[péixer]]/[[pàixer]] match = match_against_verbs("éixer", {"n", "p"}), forms = { stem = "aixe", fut = "aixer", pres_stressed = {"eix", "aix"}, pres_1s = "eixo", pret = {"aixé", "asqué"}, pres_sub_stressed = "eixi", pres_sub_unstressed = {"aixe", "asque"}, pp = "ascud", irreg = true, } }, { match = "àixer", like = "éixer", }, { -- [[parèixer]], [[aparèixer]], [[comparèixer]], [[desaparèixer]], [[reaparèixer]] match = "parèixer", forms = { g_infix = "pareg", } }, --------------------------------------------- misc ---------------------------------------- { -- [[cabre]] match = "cabre", forms = { pres_sub_stressed = "càpiga", pres_sub_unstressed = "capigue", irreg = true, } }, { -- [[caber]] match = "caber", like = "cabre", }, { -- [[saber]] match = "saber", forms = { fut = "sabr", pres_1s = "sé", pres_sub_stressed = "sàpiga", pres_sub_unstressed = "sapigue", imp_2s = "sàpiga", imp_2p = "sapigueu", irreg = true, } }, { -- [[poder]] match = "poder", forms = { fut = "podr", pres_1s = "puc", pres_sub_stressed = "pugui", pres_sub_unstressed = "pugue", g_infix = "pog", imp_2s = "pugues", imp_2p = "pugueu", irreg = true, } }, { -- [[córrer]], [[acórrer]], [[concórrer]], [[decórrer]], [[descórrer]], [[discórrer]], [[encórrer]], -- [[escórrer]], [[incórrer]], [[ocórrer]], [[recórrer]], [[socórrer]], [[transcórrer]] match = "córrer", forms = { pret = "corregué", pres_sub_unstressed = {"corre", "corregue"}, pp = "corregud", irreg = true, } }, { -- [[metre]], [[admetre]], [[arremetre]], [[cometre]], [[comprometre]], [[demetre]], [[descomprometre]], -- [[emetre]], [[entremetre's]], [[escometre]], [[malmetre]], [[manumetre]], [[ometre]], [[permetre]], -- [[prometre]], [[readmetre]], [[remetre]], [[retransmetre]], [[sotmetre]], [[trametre]], [[transmetre]] match = "metre", forms = { pp = "mès#", irreg = true, } }, -------------------------------------------------------------------------------------------- -- -ir -- -------------------------------------------------------------------------------------------- { -- [[acudir]]; NOTE: Separation by meaning does not occur in DCC, DIEC, DEIEC, and DCVB says the distinction -- is geographical and makes no mention of distinction by meaning. OTOH ca.wikt does say that the pronominal -- sense "to occur" tends to conjugate non-inchoative. match = "acudir", forms = { eix_infix = {{ form = "+", footnotes = {'[especially in the sense "to turn up, to be present"]'} }, { form = "-", footnotes = {'[especially in the pronominal sense "to occur"]'} }} } }, -- [[afegir]]: -- non-inchoative in Valencia, inchoative elsewhere { -- [[ajupir]] -- [[buixir]] -- [[bullir]], [[rebullir]] -- [[cruixir]], [[escruixir]] (Routledge says this is inchoative but DIEC, DEIEC and DCC all disagree; note -- pres_2s 'cruixes', handled automatically) -- [[dormir]], [[adormir]] -- [[funyir]] -- [[grunyir]] -- [[munyir]], [[esmunyir]] -- [[pudir]] -- [[punyir]] -- [[retrunyir]] -- [[sentir]], [[pressentir]], [[ressentir-se]]; not [[consentir]], with can be either non-inchoative or -- inchoative, and not [[assentir]] or [[dissentir]], which are only inchoative match = match_against_verbs("ir", {"ajup", "buix", "bull", "cruix", "dorm", "funy", "gruny", "muny", "pud", "puny", "retruny", "^sent", "pressent", "^ressent"}), forms = { eix_infix = "-", } }, { -- [[arrupir-se]]; -- [[brumir]]; -- [[brunzir]]; -- [[consumir]], [[resumir]], [[presumir]] (not [[sumir]], [[assumir]], [[subsumir]], which are regular) -- [[mentir]], [[desmentir]] -- [[percudir]]; cf. also [[acudir]], which to some extent has separate conjugations per meaning -- [[consentir]] match = match_against_verbs("ir", {"arrup", "brum", "brunz", "consum", "^resum", "presum", "ment", "percud", "consent"}), forms = { eix_infix = {"+", "-"}, } }, -- [[cenyir]]: -- non-inchoative or inchoative in Balearics, inchoative elsewhere { -- [[cobrir]], [[descobrir]], [[encobrir]], [[recobrir]], [[redescobrir]] match = "cobrir", forms = { pp = "cobert", irreg = true, } }, { -- [[collir]], [[acollir]], [[escollir]], [[recollir]] match = "collir", forms = { stressed_stem = "culli", eix_infix = "-", irreg = true, } }, { -- [[complir]], [[acomplir]], [[incomplir]] match = "complir", forms = { pp = {"complert", "complid"}, irreg = true, } }, { -- [[cosir]], [[descosir]], [[recosir]] match = "cosir", forms = { stressed_stem = "cusi", pres_3s = "cús#", eix_infix = "-", irreg = true, } }, { -- [[eixir]], [[deseixir-se]]; not [[teixir]] or [[entreteixir]], and not [[reeixir]] or [[sobreeixir]], -- which have an ï in the stem-stressed forms match = match_against_verbs("eixir", {"^", "des"}), forms = { stressed_stem = "ixi", eix_infix = "-", irreg = true, } }, { -- [[reeixir]], [[sobreeixir]] match = match_against_verbs("eixir", {"^re", "sobre"}), forms = { stressed_stem = "ïxi", eix_infix = "-", irreg = true, } }, -- [[engolir]]: -- non-inchoative in Valencia, inchoative elsewhere { -- [[escopir]] match = "escopir", forms = { stressed_stem = "escupi", eix_infix = "-", irreg = true, } }, { -- [[establir]], [[preestablir]], [[restablir]] match = "establir", forms = { pp = {"establert", "establid"}, irreg = true, } }, -- [[ferir]]: -- non-inchoative in Balearics, inchoative elsewhere -- [[fregir]]: -- non-inchoative in Valencia, inchoative elsewhere { -- [[fugir]], [[confugir]], [[defugir]], [[enfugir-se]]; pres sing ''fujo, fuges, fuig'' handled by -- combine_stem_ending(); can't be handled by rule above that lists many non-inchoative verbs because the -- prefix would be 'fug' and the front-back alternation code doesn't apply to prefixes. match = "fugir", forms = { eix_infix = "-", } }, { -- [[imprimir]], [[reimprimir]], [[sobreimprimir]]; not any other verbs in -primir; write it this way so -- there's a prefix with a vowel to prevent against the accent in the pp from being removed while still -- removing it in the feminine. match = match_against_verbs("primir", {"im"}), forms = { pp = "près#", irreg = true, } }, -- [[llegir]]: -- non-inchoative in Valencia and Minorca, inchoative elsewhere { -- [[lluir]]: regular inchoative in the figurative meaning "to display (something), to be showy" also in the -- legal meaning "free from a pecuniary obligation, such as a land-based tax (emphyteusis)"; irregular in the -- literal meaning "to shine"; use <no_built_in> to get regular conjugation. In the regular conjugation, -- umlauts appear in the following forms: pres_1p/pres_sub_1p/imp_1p lluïm, pres_2p/pres_sub_2p/imp_2p lluïu, -- impf_1s/impf_3s lluïa, impf_2s lluïes, impf_3p lluïen, pret_2s lluïres, pret_3p lluïren, -- impf_sub_2s lluïssis, impf_sub_3p lluïssin, throughout the pp: lluït, lluïda, lluïts, lluïdes. IN the -- irregular conjugation, umlauts appear in the same places as well as elsewhere in the present subjunctive: -- pres_sub_1s/pres_sub_3s/imp_3s lluï, pres_sub_2s lluïs, pres_sub_3p/imp_3p lluïn. Notably, they do *NOT* -- appear in the gerund lluint, the infinitive lluir, or anywhere in the future or conditional. Note that -- verbs.cat [https://www.verbs.cat/en/conjugation/899-lluir.html] lists additional irregular forms pres_1s -- lluu, and alternative impf_sub forms in -e- instead of -i- (lluïsses, lluíssem, lluísseu, lluïssen), but -- these are nonstandard or dialectal per both Routledge and DEIEC. match = "^lluir", forms = { eix_infix = "-", pres3s = {"lluu", "llu"}, -- generates pres_2s, imp_2s irreg = true, } }, { -- [[entrelluir]] "to be half-seen", [[relluir]] "to shine", [[traslluir-se]] "to be translucent"; either -- inchoative or non-inchoative, not distinguished by meaning; note, [[deslluir]] and [[enlluir]] are regular -- inchoative verbs. match = match_against_verbs("lluir", {"entre", "^re", "tras"}), forms = { eix_infix = {"+", "-"}, pres3s = {"llueix", "lluu", "llú"}, -- generates pres_2s, imp_2s; note, pres_2s will end in -es due to -- combine_stem_ending() irreg = true, } }, { -- [[morir]], [[premorir]]; but not [[atemorir]] match = match_against_verbs("morir", {"^", "pre"}), forms = { eix_infix = "-", pp = "mort", irreg = true, } }, { -- [[obrir]], [[entreobrir]], [[reobrir]]; not [[cobrir]] and derivatives, not [[empobrir]], so we have to list -- them individually match = match_against_verbs("obrir", {"^", "entre", "^re"}), forms = { eix_infix = "-", pp = "obert", irreg = true, } }, { -- [[oferir]]; but not [[proferir]] match = "^oferir", forms = { pp = {"ofert", "oferid"}, irreg = true, } }, -- [[oir]], [[desoir]], [[entreoir]]: -- per Routledge, non-inchoative or inchoative normally but only -- non-inchoative in Valencian; but all dictionaries disagree and say it is a regular inchoative-only verb. -- It has the same umlauts as lluir (and [[corroir]], another regular inchoative verb). { -- [[omplir]], [[desomplir-se]], [[reomplir]]; not [[complir]] and derivatives, so we have to list them -- individually match = match_against_verbs("omplir", {"^", "des", "^re"}), forms = { eix_infix = "-", pp = {"omplert", "omplid"}, irreg = true, } }, -- [[penedir-se]]: -- non-inchoative in Balearics, inchoative elsewhere { -- [[pruir]] "to itch": same umlauts as in [[lluir]]. match = "^pruir", forms = { eix_infix = "-", pres3s = {"pruu", "pru"}, -- generates pres_2s, imp_2s irreg = true, } }, { -- [[reblir]] match = "^reblir", forms = { pp = {"reblert", "reblid"}, irreg = true, } }, -- [[renyir]]: -- non-inchoative in Valencia, inchoative elsewhere { -- [[sofrir]] match = "^sofrir", forms = { pp = {"sofert", "sofrid"}, irreg = true, } }, { -- [[sortir]], [[ressortir]], [[sobresortir]]; but not [[assortir]], which is regular inchoative match = match_against_verbs("sortir", {"^", "^res", "sobre"}), forms = { stressed_stem = "surti", eix_infix = "-", irreg = true, } }, { -- [[suplir]] match = "^suplir", forms = { pp = {"suplert", "suplid"}, irreg = true, } }, -- [[teixir]], [[entreteixir]]: -- non-inchoative in Valencia, inchoative elsewhere { -- [[tenir]] but not any compounds; highly irregular match = "^tenir", forms = { fut = "tindr", pres_stressed = "ten", pres_3s = "té", imp_2s = {"té", "ten", "tingues"}, imp_2p = {"teniu", "tingueu"}, g_infix = "ting", } }, { -- [[abstenir-se]], [[atenir-se]], [[captenir-se]], [[cartenir]], [[contenir]], [[detenir]], [[entretenir]], -- [[mantenir]], [[menystenir]], [[obtenir]], [[retenir]], [[sostenir]], [[viltenir]]; highly irregular match = "tenir", forms = { fut = "tindr", pres_stressed = "ten", pres_3s = "té", imp_2s = {"tén", "tingues"}, imp_2p = {"teniu", "tingueu"}, g_infix = "ting", } }, { -- [[tindre]]: variant of [[tenir]] match = "tindre", like = "tenir", }, -- [[tenyir]], [[destenyir]]: -- non-inchoative in Valencia, but [[retenyir]] inchoative or non-inchoative in -- Valencia? (per Routledge); regular inchoative elsewhere { -- [[tossir]] "to cough" match = "^tossir", forms = { stressed_stem = "tussi", -- pres_2s gets 'tusses' pres_3s = "tus", -- note, pres_3s (a single form override) not pres3s (a stem override, which also affects -- pres_2s; but imp_2s is physically copied from pres_3s, so imp_2s correctly gets 'tus') eix_infix = "-", irreg = true, } }, { -- [[venir]] but not any compounds; highly irregular match = "^venir", forms = { fut = "vindr", pres_stressed = "ven", pres_3s = "ve", imp_2s = "vine", g_infix = "ving", } }, { -- compounds of [[venir]]: [[advenir]], [[avenir]], [[contravenir]], [[convenir]], [[desavenir-se]], -- [[desconvenir]], [[entrevenir]], [[esdevenir]], [[intervenir]], [[obvenir]], [[pervenir]], [[prevenir]], -- [[provenir]], [[reconvenir]], [[revenir]], [[sobrevenir]], [[subvenir]]; but not [[enjovenir]] or -- [[rejovenir]]; highly irregular match = match_against_verbs("venir", {"^ad", "^a", "contra", "con", "desa", "entre", "esde", "inter", "ob", "per", "pre", "pro", "^re", "sobre", "sub"}), forms = { fut = "vindr", pres_stressed = "ven", pres_3s = "vé", imp_2s = "vén", g_infix = "ving", } }, { -- [[vindre]]: variant of [[venir]] match = "vindre", like = "venir", }, -- [[vestir]], [[desvestir]], [[revestir]], maybe [[transvestir]]: non-inchoative in Valencia, inchoative or -- non-inchoative in the Balearics; regular inchoative elsewhere; but not [[envestir]] or [[investir]], which are -- regular inchoative everywhere { -- [[fer]], [[contrafer]], [[desfer]], [[estrafer]], [[perfer]], [[refer]], [[satisfer]]; highly irregular match = "fer", forms = { fut = "far", pres_1s = "faj", -- will be converted to 'faig'; 'faig' gets converted to 'faic' pres_2s = "fàs#", pres_3s = "fà#", pres_3p = "fan", pres_unstressed = "fe", impf1 = "fei", impf2 = "fèi", pres_sub_stressed = "faci", pres_sub_unstressed = "fe", pret = "fé", pret_1s = "fiu", pret_3s = "feu", impf_sub_1s = "fés#", -- regular except for base form [[fes]], lacking an accent impf_sub_3s = "fés#", -- same imp_2s = "fés#", pp = "fet", irreg = true, } }, { -- [[dir]], [[adir-se]], [[contradir]], [[desdir]], [[entredir]], [[interdir]], [[maldir]], [[predir]], [[redir]]; -- behaves like an -er/-re verb match = match_against_verbs("dir", {"^", "^a", "contra", "des", "entre", "inter", "mal", "pre", "^re"}), forms = { stem = "die", g_infix = "+", imp_2s = "digues", imp_2p = "digueu", pp = "dit", } }, { -- [[dur]], [[endur-se]]; behaves like an -er/-re verb match = "dur", forms = { stem = "due", g_infix = "+", pres3s = {"duu", "du"}, -- generates pres_2s, imp_2s impf1 = "dui", impf2 = "dúi", pp = "dut", } }, { -- [[ser]]; highly irregular match = "^ser", forms = { pres_1s = "soc", pres_2s = "ets", pres_3s = "és", pres_1p = "som", pres_2p = "sou", pres_3p = "són", impf1 = "er", impf2 = "ér", pres_sub_stressed = "sigui", pres_sub_unstressed = "sigue", pret = "fó", pret_1s = "fui", pret_3s = "fou", impf_sub_1s = "fos", -- regular except for lack of accent impf_sub_3s = "fos", -- same cond = {"serí", "fór"}, imp_2s = "sigues", imp_2p = "sigueu", pp = {"estad", "sigud"}, gerund = {"sent", "essent"}, irreg = true, } }, { -- [[ésser]]; variant of [[ser]] match = "^ésser", like = "ser", }, { -- [[haver]] as auxiliary; highly irregular match = "^haver", var = "aux", forms = { pres_1s = "he", pres_2s = "has", pres_3s = "ha", pres_1p = "hem", pres_2p = "heu", pres_3p = "han", fut = "haur", cond = {"haurí", "haguér"}, pres_sub_stressed = "hagi", pres_sub_unstressed = "hàgi", noimp = true, g_infix = "+", } }, { -- [[haver]] as full verb; highly irregular match = "^haver", var = "full", forms = { pres_1s = {"hec", "hac"}, pres_stressed = {"heu", "hau"}, fut = "haur", pres_sub_stressed = "hegui", g_infix = "+", } }, { -- [[heure]]; variant of full verb [[haver]] match = "^heure", like = "haver", likevar = "full", }, { -- [[haure]]; variant of full verb [[haver]] match = "^haure", like = "haver", likevar = "full", }, } local function skip_slot(base, slot, allow_overrides) if not allow_overrides and (base.basic_overrides[slot] or base.refl and base.basic_reflexive_only_overrides[slot]) then -- Skip any slots for which there are overrides. return true end if base.only3s and (slot:find("^pp_f") or slot:find("^pp_mp")) then -- diluviar, atardecer, neviscar; impersonal verbs have only masc sing pp return true end if not slot:find("[123]") then -- Don't skip non-personal slots. return false end if base.nofinite then return true end if (base.only3s or base.only3sp or base.only3p) and (slot:find("^imp_") or slot:find("^neg_imp_")) then return true end if base.only3s and not slot:find("3s") then -- diluviar, atardecer, neviscar return true end if base.only3sp and not slot:find("3[sp]") then -- atañer, concernir return true end if base.only3p and not slot:find("3p") then -- [[caer cuatro gotas]], [[caer chuzos de punta]], [[entrarle los siete males]] return true end return false end local function add_stem_ending(stem, ending) if ending == "" then return stem end if stem:find("#$") then -- remove final accent when adding a suffix stem = com.remove_accents((stem:gsub("#$", "")), "final syllable only") end return stem .. ending end local function process_stem(stem, fn) if stem:find("#$") then local stem_no_pound_sign = stem:match("^(.*)#$") return fn(stem_no_pound_sign) .. "#" else return fn(stem) end end -- Add the `stem` to the `ending` and apply any phonetic modifications. `is_full_word` indicates that we're creating -- a "full word" not a stem, and turns on devoicing of final consonants. `dont_include_prefix` is used when creating -- stems and indicates not to prepend the prefix in `base.prefix` to the result. `is_pres_sub_stressed` is used when -- creating the pres_sub_stressed stem, to correctly handle both [[desaiguar]] and [[argüir]], whose respective -- interactions between ü and i/ï are very tricky. -- -- WARNING: This function is written very carefully; changes to it can easily have unintended consequences. local function combine_stem_ending(base, stem, ending, is_full_word, dont_include_prefix, is_pres_sub_stressed) -- Include the prefix in the stem unless dont_include_prefix is given (used in construct_stems()), or the value of -- `stem` comes from a user-specified stem or form override. if not dont_include_prefix and not stem:find(IS_USER_STEM_OVERRIDE) and not stem:find(IS_USER_FORM_OVERRIDE) then stem = base.prefix .. stem end -- A * at the beginning of the ending is a signal to remove a stressed accent from the stem. This may feed any of -- the following rules. if ending:find("^%*") then ending = ending:gsub("^%*", "") stem = com.remove_accents(stem, "final syllable only") end -- If ending begins with s and stem ends in a sibilant, we need an e in between; cf. pres_2s 'apareixes' of -- [[aparèixer]], pres_2s 'torces' of [[tòrcer]], pres_2s 'fuges' of [[fugir]], pres_2s 'brunzes' of [[brunzir]]. -- This may feed the next rule. if ending:find("^s") and rfind(stem, "[çjsxz]$") then ending = "e" .. ending end -- By default, stems are in their "back" (standalone) form. Before a front vowel, convert the final consonant to -- its "front" form so the pronunciation doesn't change. if rfind(ending, "^" .. front_vowel_c) then -- adequar -> adeqües -- enaiguar -> enaigües -- pegar -> pegues -- arranjar -> arranges -- marcar -> marques -- abraçar -> abraces stem = com.back_to_front(stem) end -- Ending beginning in -i after diphthong ending in V + i compresses the two i's into one (cf. pret_1s 'desmaí' and -- pres_sub_1s 'desmaï' of [[desmaiar]]). This rule doesn't apply after pseudo-vowel u in gu/qu; cf. pret_1s 'guií' -- of [[guiar]] and contrast pret_1s 'cruí' of [[cruiar]]. This may feed the next rule. if rfind(ending, "^[iíï]") and rfind(stem, V .. "i$") and not rfind(stem, "[gq][uü]i$") then stem = stem:gsub("i$", "") end -- If ending begins with i (not í), it must get a diaeresis after a true vowel (not gu/qu, cf. pres_1p 'delinquim' -- of [[delinquir]], not '#delinquïm'; also not a diphthong ending in u, cf. pres_sub_1s 'apreui' of [[apreuar]] -- not '#apreuï') to prevent the two merging into a diphthong. Note that ü -> u before ï, but to simplify things -- we leave the double umlauts in place and remove the first one during postprocessing, in fix_double_umlauts(). -- Cf.: -- * impf_1s 'raïa' of [[raure]]; -- * pres_sub_1s 'creï' of [[crear]]; -- * pres_sub_1s 'associï' of [[associar]]; -- * impf_1s 'cloïa' of [[cloure]]; -- * pres_1p 'lluïm' of [[lluir]]; -- * pres_1p 'arguïm' of [[argüir]]. if ending:find("^i") and rfind(stem, "[aeiouü]$") and not stem:find("[aeiogq]u$") and -- Unstressed subjunctive endings of [[enaiguar]] remain without umlaut: enaigüi/enaigüis/enaigüin; -- but stressed endings of [[argüir]] that begin with 'i' do get an umlaut: arguït, impf. arguïa, including -- stressed subjunctive endings arguïm/arguïu. In both cases the ending is '-i' as part of the creation of -- the respective stems. There seems no way of distinguishing the two cases other than with a special flag. not (rfind(stem, "[gq]ü$") and ending == "i" and is_pres_sub_stressed) then ending = ending:gsub("^i", "ï") end local retval = add_stem_ending(stem, ending) if retval:find("#$") then -- remove final accent if no vowels in prefix retval = retval:gsub("#$", "") if not rfind(base.prefix, V) then retval = com.remove_accents(retval, "final syllable only") end end if is_full_word then local saw_is_user_form_override retval, saw_is_user_form_override = rsubb(retval, IS_USER_FORM_OVERRIDE, "") retval = retval:gsub(IS_USER_STEM_OVERRIDE, "") if not saw_is_user_form_override then -- Devoice final voiced obstruent (cf. pres_2s 'caps', pres_3s 'cap' of [[cabre]]). But not after a -- consonant (cf. pres_2s 'perds', pres_3s 'perd' of [[perdre]]), except for g -> c, which operates -- even after a consonant (pres_1s 'resolc' of [[resoldre]], pres_1s 'tinc' of [[tenir]]). retval = retval:gsub("g(s?)$", "c%1") retval = rsub(retval, "(" .. V .. ")([bdj])(s?)$", function(before, voiced, after) local devoice = { b = "p", d = "t", j = "ig", -- pres_3s 'fuj' of [[fugir]] -> 'fuig' } return before .. devoice[voiced] .. after end) end end return retval end local function add3(base, slot, stems, endings, footnotes, allow_overrides) if skip_slot(base, slot, allow_overrides) then return end local function do_combine_stem_ending(stem, ending) return combine_stem_ending(base, stem, ending, "is full word") end iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, nil, nil, footnotes) end local function insert_form(base, slot, form) if not skip_slot(base, slot) then iut.insert_form(base.forms, slot, form) end end local function insert_forms(base, slot, forms) if not skip_slot(base, slot) then iut.insert_forms(base.forms, slot, forms) end end local function add_single_stem_tense(base, slot_pref, stems, s1, s2, s3, p1, p2, p3) local function addit(slot, ending) add3(base, slot_pref .. "_" .. slot, stems, ending) end addit("1s", s1) addit("2s", s2) addit("3s", s3) addit("1p", p1) addit("2p", p2) addit("3p", p3) end local function map_general(stemforms, fn) return iut.map_forms(iut.convert_to_general_list_form(stemforms), fn) end local function flatmap_general(stemforms, fn) return iut.flatmap_forms(iut.convert_to_general_list_form(stemforms), fn) end -- Given a stem ending in a conjugation vowel -a/-e/-i/-ï, split into stem base and conjugation vowel, converting the -- stem base to "back" form if the conjugation vowel is front (hence 'torce' of [[tòrcer]] splits into 'torç' and 'e', -- and 'fugi' of [[fugir]] splits into 'fuj' and 'i'). local function split_conj_vowel(stem) local stem_base, conj_vowel = rmatch(stem, "^(.*)([aeiï])$") if not stem_base then error(("Internal error: Stem '%s' doesn't end in conjugation vowel a/e/i"):format(stem)) end if conj_vowel == "ï" then -- To simplify handling of ï, convert to i. It will be converted back to ï as necessary in -- combine_stem_ending(). conj_vowel = "i" end if rfind(conj_vowel, front_vowel_c) then stem_base = com.front_to_back(stem_base) end return stem_base, conj_vowel end local function construct_stems(base) base.output_stems = {} local stems = base.output_stems local bst = base.input_stems -- YUCK, see combine_stem_ending() for the necessity of is_pres_sub_stressed. local function combine(stem, ending, is_pres_sub_stressed) return combine_stem_ending(base, stem, ending, false, "dont include prefix", is_pres_sub_stressed) end stems.irreg = bst.irreg or bst.g_infix -- NOTE: Some stems end in a conjugation or similar vowel, specifically: -- * `stem` (ends in conjugation vowel -a/-e/-i); -- * `stressed_stem` (likewise); -- * `unstressed_stem` (likewise); -- * `pres_unstressed` (which assumes the form of the gerund minus the -nt; note that `pres_stressed` does *NOT* -- end in a conjugation vowel, but assumes the stem form; the value of pres_3s will be derived by adding -a for -- -ar verbs and otherwise adding an -e prop vowel when required, as in [[cobrir]], and otherwise adding no -- vowel); -- * `pres_sub_stressed` (which assumes the form of pres_sub_3s and hence usually ends in -i, occasionally -a); -- * `pres_sub_unstressed` (which assumes the form of pres_sub_1p minus the -m, hence ends in -e or -i). -- Save stem for use in add_categories_and_annotation() for determining the conjugation class. stems.stem = bst.stem or base.stem local eix_infix_stem if base.conj_vowel == "i" then -- Save eix_infix value for use in add_categories_and_annotation() for determining whether consonant -- alternations exist. stems.eix_infix = bst.eix_infix or bst.g_infix and "-" or "+" eix_infix_stem = flatmap_general(stems.eix_infix, function(form) if form == "+" then return map_general(stems.stem, function(form) local stem_base, conj_vowel = split_conj_vowel(form) return combine(stem_base, "eixe") end) elseif form == "-" then return stems.stem else return form end end) end local stressed_stem = bst.stressed_stem or eix_infix_stem or stems.stem local unstressed_stem = bst.unstressed_stem or stems.stem -- Add the 'g' that is characteristic of g-infix verbs. We remove a stem-final v, e.g. [[beure]] with stem 'beve' -- becomes 'beg'. local function add_g(stemforms) return map_general(stemforms, function(form) local stem_base, conj_vowel = split_conj_vowel(form) stem_base = stem_base:gsub("v$", "") return combine(stem_base, "g") end) end -- Add the 'u' of the pres_3s that is characteristic of g-infix verbs (and conjugation vowel 'e', later removed). -- We remove a stem-final v, as well as i as part of a diphthong, e.g. [[beure]] with stem 'beve' becomes 'beue' -- and [[veure]] with stem 'veie' becomes 'veue' (but [[riure]] with stem 'rie' becomes 'riue' not '#rue'). We -- don't add -u after a consonant, e.g. [[doldre]] with stem 'dole' becomes 'dole' not '#dolue'. local function add_u(stemforms) return map_general(stemforms, function(form) local stem_base, conj_vowel = split_conj_vowel(form) if stem_base:find("v$") then stem_base = stem_base:gsub("v$", "") else stem_base = rsub(stem_base, "(" .. V .. ")i$", "%1") end -- Add u after vowel but not after another u, so we get pres_3p 'duen' of [[dur]] not '#duuen'. if rfind(stem_base, V .. "$") and not stem_base:find("u$") then return combine(stem_base, "u") else return stem_base end end) end local stressed_g_infix, unstressed_g_infix, g_infix_pres_stressed if bst.g_infix then local function flatmap_g_infix(default) return flatmap_general(bst.g_infix, function(form) if form == "+" then return default else return form end end) end stressed_g_infix = flatmap_g_infix(add_g(stressed_stem)) unstressed_g_infix = flatmap_g_infix(add_g(unstressed_stem)) g_infix_pres_stressed = add_u(stressed_stem) end stems.pres_unstressed = bst.pres_unstressed or unstressed_stem stems.pres_stressed = -- If no_pres_stressed given, pres_stressed stem should be empty so no forms are generated. base.no_pres_stressed and {} or bst.pres_stressed or g_infix_pres_stressed or map_general(stressed_stem, function(form) local stem_base, conj_vowel = split_conj_vowel(form) return stem_base end) stems.pres1s = -- If no_pres_stressed given, pres1s stem should be empty so no forms are generated. base.no_pres_stressed and {} or stressed_g_infix or map_general(stems.pres_stressed, function(form) return combine(form, "o") end) stems.pres3s = -- If no_pres_stressed given, pres3s stem should be empty so no forms are generated. base.no_pres_stressed and {} or bst.pres3s or map_general(stems.pres_stressed, function(form) if base.conj_vowel == "a" then return combine(form, "a") elseif rfind(form, C .. "[lr]$") and not rfind(form, V .. "ll$") then return combine(form, "e") else return form end end) stems.pres3p = -- If no_pres_stressed given, pres3p stem should be empty so no forms are generated. base.no_pres_stressed and {} or map_general(stems.pres_stressed, function(form) return combine(form, "en") end) local function compute_impf_stem(with_accent) return map_general(stems.pres_unstressed, function(form) local stem_base, conj_vowel = split_conj_vowel(form) if conj_vowel == "a" then return combine(stem_base, with_accent and "àv" or "av") elseif stem_base:find("i#?$") then form = form:gsub("i#?$", "") return combine(rmatch(stem_base, "^(.-)" .. V .. "*$"), with_accent and "èi" or "ei") else return combine(stem_base, with_accent and "í" or "i") -- i -> ï after a vowel end end) end stems.impf1 = bst.impf1 or compute_impf_stem(false) stems.impf2 = bst.impf2 or compute_impf_stem(true) stems.pret = bst.pret or unstressed_g_infix and map_general(unstressed_g_infix, function(form) return combine(form, "é") end ) or map_general(unstressed_stem, function(form) local accent_conj_vowel = { a = "à", e = "é", i = "í", } local stem_base, conj_vowel = split_conj_vowel(form) return combine(stem_base, accent_conj_vowel[conj_vowel]) end) stems.fut = bst.fut or base.inf_stem stems.cond = bst.cond or map_general(stems.fut, function(form) return combine(form, "í") end) stems.pres_sub_stressed = bst.pres_sub_stressed or stressed_g_infix and map_general(stressed_g_infix, function(form) return combine(form, "i") end) or map_general(stressed_stem, function(form) local stem_base, conj_vowel = split_conj_vowel(form) return combine(stem_base, "i", "is pres_sub_stressed") end) stems.pres_sub_unstressed = bst.pres_sub_unstressed or unstressed_g_infix and map_general(unstressed_g_infix, function(form) return combine(form, "e") end) or map_general(unstressed_stem, function(form) local stem_base, conj_vowel = split_conj_vowel(form) return combine(stem_base, conj_vowel == "i" and conj_vowel or "e") end) stems.impf_sub = bst.impf_sub or map_general(stems.pret, function(form) local stem_base = rmatch(form, "^(.*)à$") -- already in "back" form, no need to convert if stem_base then return combine(stem_base, "é") else return form end end) stems.pp = bst.pp or unstressed_g_infix and map_general(unstressed_g_infix, function(form) return combine(form, "ud") end ) or map_general(unstressed_stem, function(form) local stem_base, conj_vowel = split_conj_vowel(form) -- use combine() so we get 'abduïd' from 'abdu-' of [[abduir]], 'seguid' from 'seg-' from [[seguir]], etc. return combine(stem_base, (conj_vowel == "e" and "u" or conj_vowel) .. "d") end) end local function a_to_e(base, stems, suffix) return map_general(stems, function(form) local stem_base = form:match("^(.-)a$") if stem_base then suffix = "e" .. suffix else stem_base = form end return combine_stem_ending(base, stem_base, suffix, "is full word") end) end local function add_present_indic(base) local stems = base.output_stems local function addit(slot, stems, ending) add3(base, "pres_" .. slot, stems, ending) end addit("1s", stems.pres1s, "") insert_forms(base, "pres_2s", a_to_e(base, stems.pres3s, "s")) addit("3s", stems.pres3s, "") insert_forms(base, "pres_1p", a_to_e(base, stems.pres_unstressed, "m")) insert_forms(base, "pres_2p", a_to_e(base, stems.pres_unstressed, "u")) addit("3p", stems.pres3p, "") end local function add_present_subj(base) local stems = base.output_stems local function addit(slot, stems, ending) add3(base, "pres_sub_" .. slot, stems, ending) end -- Regular -ar verb: [[amar]]: ami, amis, ami, amem, ameu, amin -- Regular -re verb: [[batre]]: bati, batis, bati, batem, bateu, batin (same as -ar verb) -- Regular -ir verb, no -eix- infix: [[dormir]]: dormi, dormis, dormi, dormim, dormiu, dormin -- Regular -ir verb, -eix- infix: [[imprimir]]: imprimeixi, imprimeixis, imprimeixi, imprimim, imprimiu, imprimeixin -- Stem changing in 123s/3p vs. 12p: -- * -eix- infix (-eix- in all stressed forms: 123s/3p of pres ind/sub, 2s imp) -- * [[collir]]: culli, cullis, culli, collim, colliu, cullin (cull- in all stressed forms) -- * [[cabre]]: càpiga, càpigues, càpiga, capiguem, capigueu, càpiguen (also different endings) addit("1s", stems.pres_sub_stressed, "") insert_forms(base, "pres_sub_2s", a_to_e(base, stems.pres_sub_stressed, "s")) addit("3s", stems.pres_sub_stressed, "") addit("1p", stems.pres_sub_unstressed, "m") addit("2p", stems.pres_sub_unstressed, "u") insert_forms(base, "pres_sub_3p", a_to_e(base, stems.pres_sub_stressed, "n")) end local function add_finite_non_present(base) local stems = base.output_stems local function add_tense(slot, stem, s1, s2, s3, p1, p2, p3) add_single_stem_tense(base, slot, stem, s1, s2, s3, p1, p2, p3) end add_tense("impf", stems.impf1, "a", "es", "a", nil, nil, "en") add_tense("impf", stems.impf2, nil, nil, nil, "em", "eu", nil) -- pret_1s ends in -í regardless of the normal vowel of the stem. insert_forms(base, "pret_1s", map_general(stems.pret, function(form) local stem_base, conj_vowel = rmatch(form, "^(.*)(" .. V .. ")$") if not stem_base then error(("Internal error: Preterite stem '%s' doesn't end in vowel"):format(form)) end if rfind(conj_vowel, front_vowel_c) then stem_base = com.front_to_back(stem_base) end -- Use combine_stem_ending() to handle back-to-front conversions, e.g. pegà -> peguí for [[pegar]] and ensure -- that the prefix gets added. return combine_stem_ending(base, stem_base, "í", "is full word") end)) -- * at the beginning of the ending means to remove an accent from the last vowel of the preterite stem. add_tense("pret", stems.pret, nil, "*res", "", "rem", "reu", "*ren") -- * at the beginning of the ending means to remove an accent from the last vowel of the imperfect subjunctive stem. add_tense("impf_sub", stems.impf_sub, "s", "*ssis", "s", "ssim", "ssiu", "*ssin") add_tense("fut", stems.fut, "é", "às", "à", "em", "eu", "an") add_tense("cond", stems.cond, "*a", "*es", "*a", "em", "eu", "*en") end local function add_non_finite_forms(base) local stems = base.output_stems local function addit(slot, stems, ending, footnotes) add3(base, slot, stems, ending, footnotes) end insert_form(base, "infinitive", {form = base.orig_verb}) -- Also insert "infinitive + reflexive pronoun" combinations if we're handling a reflexive verb. See comment below -- for "gerund + reflexive pronoun" combinations. if base.refl then for _, persnum in ipairs(person_number_list) do insert_form(base, "infinitive_" .. persnum, {form = base.orig_verb}) end end -- Gerunds don't have an umlaut over the i in cases like 'abduint' of 'abduir' (not '#abduïnt'). local pres_unstressed_no_umlaut = map_general(stems.pres_unstressed, function(form) return rsub(form, "ï$", "i") end) addit("gerund", pres_unstressed_no_umlaut, "nt") -- Also insert "gerund + reflexive pronoun" combinations if we're handling a reflexive verb. We insert exactly the -- same form as for the bare gerund; later on in add_reflexive_or_fixed_clitic_to_forms(), we add the appropriate -- clitic pronouns. It's important not to do this for non-reflexive verbs, because in that case, the clitic -- pronouns won't be added, and {{ca-verb form of}} will wrongly consider all these combinations as possible -- inflections of the bare gerund. Thanks to [[User:JeffDoozan]] for this bug fix. if base.refl then for _, persnum in ipairs(person_number_list) do addit("gerund_" .. persnum, pres_unstressed_no_umlaut, "nt") end end addit("pp_ms", stems.pp, "") if not base.pp_inv then addit("pp_fs", stems.pp, "a") -- make_plural() handles the complexities of e.g. 'vist' of [[veure]] -> 'vistos'/'vists' and 'romàs' of -- [[romandre]] -> 'romasos'. We need to use flatmap_general() because make_plural() may return more than one -- plural, and we need to use map_general() on the result, applying combine_stem_ending(), to ensure that -- prefixes get properly added and plurals like 'amads' of stem 'amad' of [[amar]] get converted to 'amats'. insert_forms(base, "pp_mp", map_general(flatmap_general(stems.pp, function(form) -- Remove any # indicating that an accent will be dropped; it will be dropped in any case by make_plural(). form = form:gsub("#$", "") return com.make_plural(form, "m") end), function(form) return combine_stem_ending(base, form, "", "is full word") end)) addit("pp_fp", stems.pp, "es") end end local function add_imperatives(base) if base.noimp then return end -- Copy pres3s to imperative since they are almost always the same. insert_forms(base, "imp_2s", iut.map_forms(base.forms.pres_3s, function(form) return form end)) -- Copy pres2p to imperative plural since they are almost always the same. insert_forms(base, "imp_2p", iut.map_forms(base.forms.pres_2p, function(form) return form end)) -- Copy subjunctives to imperatives. for _, persnum in ipairs({"3s", "1p", "3p"}) do local from = "pres_sub_" .. persnum local to = "imp_" .. persnum insert_forms(base, to, iut.map_forms(base.forms[from], function(form) return form end)) end end local function fix_double_umlauts(base) for slot, forms in pairs(base.forms) do for _, form in ipairs(forms) do form.form = form.form:gsub("üï", "uï") end end end local function process_slot_overrides(base, filter_slot, reflexive_only) local overrides = reflexive_only and base.basic_reflexive_only_overrides or base.basic_overrides for slot, forms in pairs(overrides) do if not filter_slot or filter_slot(slot) then add3(base, slot, forms, "", nil, "allow overrides") end end end local function link_clitic(clitic) return (clitic:gsub("([^ %-]+)", "[[%1]]")) end -- Prefix `form` with `clitic`, adding fixed text `between` between them. Add links as appropriate unless the user -- requested no links. Check whether form already has brackets (as will be the case if the form has a fixed clitic). local function prefix_clitic_to_form(base, clitic, between, form) if base.alternant_multiword_spec.args.noautolinkverb then return clitic .. between .. form else local clitic_pref = link_clitic(clitic) .. between if form:find("%[%[") then return clitic_pref .. form else return clitic_pref .. "[[" .. form .. "]]" end end end -- Suffix `form` with `clitic`. Add links as appropriate unless the user requested no links. Check whether form already -- has brackets (as will be the case if the form has a fixed clitic). local function suffix_clitic_to_form(base, clitic, form) local autolink = not base.alternant_multiword_spec.args.noautolinkverb if base.alternant_multiword_spec.args.noautolinkverb then return form .. clitic else local clitic_suf = link_clitic(clitic) if form:find("%[%[") then return form .. clitic_suf else return "[[" .. form .. "]]" .. clitic_suf end end end -- Add a reflexive pronoun or fixed clitic (FIXME: not working), as appropriate to the base forms that were generated. -- `do_joined` means to do only the forms where the pronoun is joined to the end of the form; otherwise, do only the -- forms where it is not joined and precedes the form. local function add_reflexive_or_fixed_clitic_to_forms(base, do_reflexive, do_joined) for _, slotaccel in ipairs(base.alternant_multiword_spec.verb_slots_basic) do local slot, accel = unpack(slotaccel) local persnum if slot:find("[123]") then persnum = slot:match("^.*_(.-)$") else persnum = "3s" end local function get_proclitic(form) --if not do_reflexive then -- return base.clitic if form:find("^[aeiouh]") then return proclitic_elided_person_number_to_reflexive_pronoun[persnum] else return proclitic_non_elided_person_number_to_reflexive_pronoun[persnum] end end local function get_enclitic(form) --if not do_reflexive then -- return base.clitic if rfind(form, C .. "$") or rfind(form, V .. "[iu]$") and not form:find("[gq]ui$") then return enclitic_non_elided_person_number_to_reflexive_pronoun[persnum] else return enclitic_elided_person_number_to_reflexive_pronoun[persnum] end end if base.forms[slot] then if do_reflexive and slot:find("^pp_") or slot == "infinitive_linked" then -- do nothing with reflexive past participles or with infinitive linked (handled at the end) elseif slot:find("^neg_imp_") then error("Internal error: Should not have forms set for negative imperative at this stage") else local slot_has_suffixed_clitic = slot:find("infinitive") or slot:find("gerund") or slot:find("^imp_") -- Maybe generate non-reflexive parts and separated syntactic variants for use in -- {{ca-verb form of}}. See comment in add_slots() above `need_special_verb_form_of_slots`. -- Check for do_joined so we only run this code once. if do_reflexive and do_joined and base.alternant_multiword_spec.source_template == "ca-verb form of" and -- Skip personal variants of infinitives and gerunds so we don't think [[arrependendo]] is a -- non-reflexive equivalent of [[arrependendo-me]]. not slot:find("infinitive_") and not slot:find("gerund_") then -- Clone the forms because we will be destructively modifying them just below, adding the reflexive -- pronoun. insert_forms(base, slot .. "_non_reflexive", mw.clone(base.forms[slot])) if slot_has_suffixed_clitic then insert_forms(base, slot .. "_variant", iut.map_forms(base.forms[slot], function(form) return prefix_clitic_to_form(base, get_proclitic(form), "... ", form) end)) end end if slot_has_suffixed_clitic then if do_joined then -- Add clitic after form. for _, form in ipairs(base.forms[slot]) do form.form = suffix_clitic_to_form(base, get_enclitic(form.form), form.form) end end elseif not do_joined then -- Add clitic before form. for _, form in ipairs(base.forms[slot]) do form.form = prefix_clitic_to_form(base, get_proclitic(form.form), "", form.form) end end end end end end local function handle_infinitive_linked(base) -- Compute linked versions of potential lemma slots, for use in {{ca-verb}}. -- We substitute the original lemma (before removing links) for forms that -- are the same as the lemma, if the original lemma has links. for _, slot in ipairs({"infinitive"}) do insert_forms(base, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.lemma and rfind(base.linked_lemma, "%[%[") then return base.linked_lemma else return form end end)) end end local function generate_negative_imperatives(base) if base.noimp then return end -- Copy subjunctives to negative imperatives, preceded by "no". for _, persnum in ipairs(neg_imp_person_number_list) do local from = "pres_sub_" .. persnum local to = "neg_imp_" .. persnum insert_forms(base, to, iut.map_forms(base.forms[from], function(form) if base.alternant_multiword_spec.args.noautolinkverb then return "no " .. form elseif form:find("%[%[") then -- already linked, e.g. when reflexive return "[[no]] " .. form else return "[[no]] [[" .. form .. "]]" end end)) end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function add_missing_links_to_forms(base) -- Any forms without links should get them now. Redundant ones will be stripped later. for slot, forms in pairs(base.forms) do for _, form in ipairs(forms) do if not form.form:find("%[%[") then form.form = "[[" .. form.form .. "]]" end end end end local function conjugate_verb(base) construct_stems(base) add_present_indic(base) add_present_subj(base) add_finite_non_present(base) add_non_finite_forms(base) fix_double_umlauts(base) -- do non-reflexive non-imperative slot overrides process_slot_overrides(base, function(slot) return not slot:find("^imp_") and not slot:find("^neg_imp_") end) -- This should happen after process_slot_overrides() in case a derived slot is based on an override -- (as with the imp_3s of [[dar]], [[estar]]). add_imperatives(base) -- do non-reflexive positive imperative slot overrides process_slot_overrides(base, function(slot) return slot:find("^imp_") end) -- We need to add joined reflexives, then joined and non-joined clitics, then non-joined reflexives, so we get -- [[arrepéndete]] but [[no]] [[te]] [[arrependas]]. if base.refl then add_reflexive_or_fixed_clitic_to_forms(base, "do reflexive", "do joined") process_slot_overrides(base, nil, "do reflexive") -- do reflexive-only slot overrides add_reflexive_or_fixed_clitic_to_forms(base, "do reflexive", false) end -- This should happen after add_reflexive_or_fixed_clitic_to_forms() so negative imperatives get the reflexive pronoun -- and clitic in them. generate_negative_imperatives(base) -- do non-reflexive negative imperative slot overrides -- FIXME: What about reflexive negative imperatives? process_slot_overrides(base, function(slot) return slot:find("^neg_imp_") end) -- This should happen before add_missing_links_to_forms() so that the comparison `form == base.lemma` -- in handle_infinitive_linked() works correctly and compares unlinked forms to unlinked forms. handle_infinitive_linked(base) process_addnote_specs(base) if not base.alternant_multiword_spec.args.noautolinkverb then add_missing_links_to_forms(base) end end local function parse_indicator_spec(angle_bracket_spec) -- Store the original angle bracket spec so we can reconstruct the overall conj spec with the lemma(s) in them. local base = { angle_bracket_spec = angle_bracket_spec, user_basic_overrides = {}, user_stems = {}, addnote_specs = {}, } local function parse_err(msg) error(msg .. ": " .. angle_bracket_spec) end local function fetch_footnotes(separated_group) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end local inside = angle_bracket_spec:match("^<(.*)>$") assert(inside) if inside == "" then return base end local segments = put.parse_balanced_segment_run(inside, "[", "]") local dot_separated_groups = put.split_alternating_runs(segments, "%.") for i, dot_separated_group in ipairs(dot_separated_groups) do local first_element = dot_separated_group[1] if first_element == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, {slot_specs = slot_specs, footnotes = spec_and_footnotes}) elseif indicator_flags[first_element] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end if base[first_element] then parse_err("Spec '" .. first_element .. "' specified twice") end base[first_element] = true elseif first_element:find("^var:") then if #dot_separated_group > 1 then parse_err(("Can't attach footnotes to 'var:' spec '%s'"):format(first_element)) end base.var = first_element:match("^var:(.*)$") elseif first_element:find(":") then local colon_separated_groups = put.split_alternating_runs(dot_separated_group, "%s*:%s*") local first_element = colon_separated_groups[1][1] if #colon_separated_groups[1] > 1 then parse_err("Can't attach footnotes directly to '" .. first_element .. "' spec; attach them to the " .. "colon-separated values following the initial colon") end if overridable_stems[first_element] then if base.user_stems[first_element] then parse_err("Overridable stem '" .. first_element .. "' specified twice") end table.remove(colon_separated_groups, 1) base.user_stems[first_element] = overridable_stems[first_element](colon_separated_groups, {prefix = first_element, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}) else -- assume a basic override; we validate further later when the possible slots are available if base.user_basic_overrides[first_element] then parse_err("Basic override '" .. first_element .. "' specified twice") end table.remove(colon_separated_groups, 1) base.user_basic_overrides[first_element] = allow_multiple_values_for_override(colon_separated_groups, {prefix = first_element, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}, "is form override") end else parse_err("Unrecognized spec '" .. first_element .. "'") end end return base end -- Normalize all lemmas, substituting the pagename for blank lemmas and adding links to multiword lemmas. local function normalize_all_lemmas(alternant_multiword_spec, head) -- (1) Add links to all before and after text. Remember the original text so we can reconstruct the verb spec later. if not alternant_multiword_spec.args.noautolinktext then iut.add_links_to_before_and_after_text(alternant_multiword_spec, "remember original") end -- (2) Remove any links from the lemma, but remember the original form so we can use it below in the 'lemma_linked' -- form. iut.map_word_specs(alternant_multiword_spec, function(base) if base.lemma == "" then base.lemma = head end base.user_specified_lemma = base.lemma base.lemma = m_links.remove_links(base.lemma) local refl_verb = base.lemma local verb, refl = rmatch(refl_verb, "^(.-)%-(se)$") if not verb then verb, refl = rmatch(refl_verb, "^(.-)('s)$") end if not verb then verb, refl = refl_verb, nil end base.user_specified_verb = verb base.refl = refl base.verb = base.user_specified_verb local linked_lemma if alternant_multiword_spec.args.noautolinkverb or base.user_specified_lemma:find("%[%[") then linked_lemma = base.user_specified_lemma elseif base.refl then -- Reconstruct the linked lemma with separate links around base verb, reflexive pronoun and clitic. linked_lemma = base.user_specified_verb == base.verb and "[[" .. base.user_specified_verb .. "]]" or "[[" .. base.verb .. "|" .. base.user_specified_verb .. "]]" linked_lemma = linked_lemma .. (refl and "-[[" .. refl .. "]]" or "") else -- Add links to the lemma so the user doesn't specifically need to, since we preserve links in multiword -- lemmas and include links in non-lemma forms rather than allowing the entire form to be a link. linked_lemma = iut.add_links(base.user_specified_lemma) end base.linked_lemma = linked_lemma end) end local function detect_indicator_spec(base) if (base.only3s and 1 or 0) + (base.only3sp and 1 or 0) + (base.only3p and 1 or 0) > 1 then error("Only one of 'only3s', 'only3sp' and 'only3p' can be specified") end base.forms = {} base.input_stems = {} base.basic_overrides = {} base.basic_reflexive_only_overrides = {} base.orig_verb = base.verb -- in case of a 'like = "..."' redirect if not base.no_built_in then local function match_built_in_spec(verb, built_in_spec) local prefix, non_prefixed_verb if type(built_in_spec.match) == "function" then prefix, non_prefixed_verb = built_in_spec.match(verb) elseif built_in_spec.match:find("^%^") and rsub(built_in_spec.match, "^%^", "") == verb then -- begins with ^, for exact match, and matches prefix, non_prefixed_verb = "", verb else prefix, non_prefixed_verb = rmatch(verb, "^(.*)(" .. built_in_spec.match .. ")$") end return prefix, non_prefixed_verb end local function find_built_in(verb, var) for _, built_in_spec in ipairs(built_in_conjugations) do local prefix, non_prefixed_verb = match_built_in_spec(verb, built_in_spec) if prefix then if not built_in_spec.var then if var then error(("Can't specify a variant spec 'var:%s' with verb '%s'"):format(var, verb)) end return prefix, non_prefixed_verb, built_in_spec elseif not var then local possible_vars = {} for _, built_in_spec in ipairs(built_in_conjugations) do local prefix, non_prefixed_verb = match_built_in_spec(verb, built_in_spec) if prefix then table.insert(possible_vars, built_in_spec.var) end end error(("For verb '%s', must specify a variant using 'var:...'; possible values are %s"):format( verb, table.concat(possible_vars, ", "))) elseif built_in_spec.var == var then return prefix, non_prefixed_verb, built_in_spec end end end return nil end local prefix, non_prefixed_verb, built_in_spec = find_built_in(base.verb, base.var) if prefix then -- we found a built-in verb if built_in_spec.like then -- we found a redirect to another verb that has the same conjugation, just a different infinitive base.verb = prefix .. built_in_spec.like local new_prefix, new_non_prefixed_verb, new_built_in_spec = find_built_in(base.verb, built_in_spec.likevar) if new_prefix then -- redirected to another built-in verb base.prefix = new_prefix base.non_prefixed_verb = new_non_prefixed_verb built_in_spec = new_built_in_spec else built_in_spec = nil end else base.prefix = prefix base.non_prefixed_verb = non_prefixed_verb end end if built_in_spec then -- we found a built-in verb, possibly redirecting to another built-in verb for stem, forms in pairs(built_in_spec.forms) do if type(forms) == "function" then forms = forms(base, base.prefix) end if stem:find("^refl_") then stem = stem:gsub("^refl_", "") if not base.alternant_multiword_spec.verb_slots_basic_map[stem] then error("Internal error: setting for 'refl_" .. stem .. "' does not refer to a basic verb slot") end base.basic_reflexive_only_overrides[stem] = forms elseif base.alternant_multiword_spec.verb_slots_basic_map[stem] then -- an individual form override of a basic form base.basic_overrides[stem] = forms else base.input_stems[stem] = forms end end end end -- Override built-in-verb stems and overrides with user-specified ones. for stem, values in pairs(base.user_stems) do base.input_stems[stem] = values end for override, values in pairs(base.user_basic_overrides) do if not base.alternant_multiword_spec.verb_slots_basic_map[override] then error("Unrecognized override '" .. override .. "': " .. base.angle_bracket_spec) end base.basic_overrides[override] = values end base.prefix = base.prefix or "" base.non_prefixed_verb = base.non_prefixed_verb or base.verb local inf_stem, suffix = rmatch(base.non_prefixed_verb, "^(.*)(re)$") if not inf_stem then inf_stem, suffix = rmatch(base.non_prefixed_verb, "^(.*)([aeiu]r)$") end if not inf_stem then error("Unrecognized infinitive: " .. base.verb) end -- Remove accents from e.g. [[parèixer]], [[córrer]]. inf_stem = com.remove_accents(inf_stem) -- Save full infinitive stem for use in future and conditional. base.inf_stem = (inf_stem .. suffix):gsub("e$", "") local stem = inf_stem if suffix == "re" then -- verbs in -ldre, -ndre have stem without the d stem = stem:gsub("([ln])d$", "%1") elseif suffix == "ur" then stem = stem .. "u" end base.conj_vowel = (suffix == "re" or suffix == "ur") and "e" or suffix:gsub("r$", "") -- If the stem is followed by a front vowel, convert it to its "back" form before calling combine_stem_ending(), -- which expects the "back" form of the stem and may convert it back to the "front" form. Don't do this conversion -- for ï so we leave [[arguïr]] (underlyingly 'argüïr') as 'argu' ("back" form), which becomes 'argü' ("front" form) -- before front vowel ï and we end up with base.stem containing the underlying form 'argüï'. We remove the first of -- two umlauts in a row in a postprocessing step (fix_double_umlauts()). if rfind(suffix, "^[ei]") then stem = com.front_to_back(stem) end -- Use combine_stem_ending() so we get ï if necessary. base.stem = combine_stem_ending(base, stem, base.conj_vowel, false, "dont include prefix") -- Propagate built-in-verb indicator flags to `base` and combine with user-specified flags. for indicator_flag, _ in pairs(indicator_flags) do base[indicator_flag] = base[indicator_flag] or base.input_stems[indicator_flag] end end local function detect_all_indicator_specs(alternant_multiword_spec) -- Propagate some settings up; some are used internally, others by [[Module:pt-headword]]. iut.map_word_specs(alternant_multiword_spec, function(base) -- Internal indicator flags. Do these before calling detect_indicator_spec() because add_slots() uses them. for _, prop in ipairs { "refl", "clitic" } do if base[prop] then alternant_multiword_spec[prop] = true end end base.alternant_multiword_spec = alternant_multiword_spec end) add_slots(alternant_multiword_spec) iut.map_word_specs(alternant_multiword_spec, function(base) detect_indicator_spec(base) -- User-specified indicator flags. Do these after calling detect_indicator_spec() because the latter may set these -- indicators for built-in verbs. for prop, _ in pairs(indicator_flags) do if base[prop] then alternant_multiword_spec[prop] = true end end end) end local function add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma) local function insert_ann(anntype, value) m_table.insertIfNot(alternant_multiword_spec.annotation[anntype], value) end local function insert_cat(cat, also_when_multiword) -- Don't place multiword terms in categories like 'Catalan verbs ending in -ar' to avoid spamming the -- categories with such terms. if also_when_multiword or not multiword_lemma then m_table.insertIfNot(alternant_multiword_spec.categories, "Catalan " .. cat) end end if check_for_red_links and alternant_multiword_spec.source_template == "ca-conj" and multiword_lemma then for _, slot_and_accel in ipairs(alternant_multiword_spec.all_verb_slots) do local slot = slot_and_accel[1] local forms = base.forms[slot] local must_break = false if forms then for _, form in ipairs(forms) do if not form.form:find("%[%[") then local title = mw.title.new(form.form) if title and not title.exists then insert_cat("verbs with red links in their inflection tables") must_break = true break end end end end if must_break then break end end end map_general(base.output_stems.stem, function(stem) local stem_base, conj_vowel = split_conj_vowel(stem) local need_no_eix_infix = true if conj_vowel ~= base.conj_vowel then insert_ann("conj", "[[Phụ lục:Động từ tiếng Catalan#Động từ bất quy tắc|mixed conjugation]]") insert_cat("mixed conjugation verbs") elseif conj_vowel == "a" then insert_ann("conj", "[[Phụ lục:Động từ tiếng Catalan#Chia động từ loại 1|loại 1]]") insert_cat("Chia động từ loại 1") elseif conj_vowel == "e" then insert_ann("conj", "[[Phụ lục:Động từ tiếng Catalan#Chia động từ loại 2|loại 2]]") insert_cat("Chia động từ loại 2") elseif conj_vowel == "i" then insert_ann("conj", "[[Phụ lục:Động từ tiếng Catalan#Chia động từ loại 3|loại 43]]") insert_cat("Chia động từ loại 3") need_no_eix_infix = false map_general(base.output_stems.eix_infix, function(form) if form == "+" then insert_ann("eix_infix", "with ''-eix-''") insert_cat("Chia động từ loại 3 với -eix-") elseif form == "-" then insert_ann("eix_infix", "without ''-eix-''") insert_cat("Chia động từ loại 3 không có -eix-") end end) else error(("Internal error: Stem '%s' doesn't end in conjugation vowel a/e/i and split_conj_vowel() didn't catch it" ):format(stem)) end if need_no_eix_infix then insert_ann("eix_infix", "no infix") end end) if base.input_stems.g_infix then insert_ann("g_infix", "with velar infix") insert_cat("verbs with velar infix") else insert_ann("g_infix", "no infix") end if base.output_stems.irreg then insert_ann("irreg", "irregular") insert_cat("irregular verbs") else insert_ann("irreg", "regular") end if base.only3s then insert_ann("defective", "impersonal") insert_cat("Động từ không ngôi") elseif base.only3sp then insert_ann("defective", "third-person only") insert_cat("Động từ chỉ có ngôi thứ 3") elseif base.only3p then insert_ann("defective", "third-person plural only") insert_cat("Động từ chỉ có ngôi thứ 3 số nhiều") elseif base.no_pres_stressed then insert_ann("defective", "defective") insert_cat("Động từ khiếm khuyết") else insert_ann("defective", "regular") end --if base.clitic then -- insert_cat("verbs with lexical clitics") --end if base.refl then insert_cat("reflexive verbs") end local stem_base, conj_vowel = split_conj_vowel(base.stem) local cons_alt if conj_vowel == "i" and base.output_stems.eix_infix == "+" then -- no alternations in verbs like [[afligir]] because all endings are front elseif stem_base:find("ç$") then cons_alt = "ç-c" elseif stem_base:find("c$") then cons_alt = "c-qu" elseif stem_base:find("g$") then cons_alt = "g-gu" elseif stem_base:find("gu$") then cons_alt = "gu-gü" elseif stem_base:find("j$") then cons_alt = "j-g" elseif stem_base:find("qu$") then cons_alt = "qu-qü" end if cons_alt then local desc = cons_alt .. " alternation" insert_ann("cons_alt", desc) insert_cat("verbs with " .. desc) else insert_ann("cons_alt", "non-alternating") end end -- Compute the categories to add the verb to, as well as the annotation to display in the -- conjugation title bar. We combine the code to do these functions as both categories and -- title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.categories = {} local ann = {} alternant_multiword_spec.annotation = ann ann.conj = {} ann.g_infix = {} ann.eix_infix = {} ann.irreg = {} ann.defective = {} ann.cons_alt = {} local multiword_lemma = false for _, form in ipairs(alternant_multiword_spec.forms.infinitive) do if form.form:find(" ") then multiword_lemma = true break end end iut.map_word_specs(alternant_multiword_spec, function(base) add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma) end) local ann_parts = {} local conj = table.concat(ann.conj, " or ") if conj ~= "" then table.insert(ann_parts, conj) end local eix_infix = table.concat(ann.eix_infix, " or ") if eix_infix ~= "" and eix_infix ~= "no infix" then table.insert(ann_parts, eix_infix) end local irreg = table.concat(ann.irreg, " or ") if irreg ~= "" and irreg ~= "regular" then table.insert(ann_parts, irreg) end local g_infix = table.concat(ann.g_infix, " or ") if g_infix ~= "" and g_infix ~= "no infix" then table.insert(ann_parts, g_infix) end local defective = table.concat(ann.defective, " or ") if defective ~= "" and defective ~= "regular" then table.insert(ann_parts, defective) end local cons_alt = table.concat(ann.cons_alt, " or ") if cons_alt ~= "" and cons_alt ~= "non-alternating" then table.insert(ann_parts, cons_alt) end alternant_multiword_spec.annotation = table.concat(ann_parts, ", ") end local function show_forms(alternant_multiword_spec) local lemmas = alternant_multiword_spec.forms.infinitive alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table() local reconstructed_verb_spec = iut.reconstruct_original_spec(alternant_multiword_spec) local function transform_accel_obj(slot, formobj, accel_obj) -- No accelerators for negative imperatives, which are always multiword and derived directly from the -- present subjunctive. if slot:find("^neg_imp") then return nil end if accel_obj then accel_obj.form = "verb-form-" .. reconstructed_verb_spec end return accel_obj end local props = { lang = lang, lemmas = lemmas, transform_accel_obj = transform_accel_obj, slot_list = alternant_multiword_spec.verb_slots_basic, } iut.show_forms(alternant_multiword_spec.forms, props) alternant_multiword_spec.footnote_basic = alternant_multiword_spec.forms.footnote end local notes_template = [=[ <div class="roa-footnote-outer-div" style="width:100%;"> <div class="roa-footnote-inner-div"> {footnote} </div></div> ]=] local basic_table = [=[ {description}<div class="NavFrame"> <div class="NavHead">&nbsp; &nbsp; Chia động từ {title}</div> <div class="NavContent"> {\op}| class="roa-inflection-table" data-toggle-category="inflection" |- ! colspan="3" class="roa-nonfinite-header" | <span title="infinitiu">nguyên mẫu</span> | colspan="5" | {infinitive} |- ! colspan="3" class="roa-nonfinite-header" | <span title="gerundi">gerund</span> | colspan="5" | {gerund} |- ! rowspan="3" colspan="2" class="roa-nonfinite-header" | <span title="participi passat">quá khứ phân từ</span> | colspan="2" class="roa-nonfinite-header" | ! colspan="2" class="roa-nonfinite-header" | giống đực ! colspan="2" class="roa-nonfinite-header" | giống cái |- ! colspan="2" class="roa-nonfinite-header" | số ít | colspan="2" | {pp_ms} | colspan="2" | {pp_fs} |- ! colspan="2" class="roa-nonfinite-header" | số nhiều | colspan="2" | {pp_mp} | colspan="2" | {pp_fp} |- ! colspan="2" rowspan="2" class="roa-person-number-header" | ngôi ! colspan="3" class="roa-person-number-header" | số ít ! colspan="3" class="roa-person-number-header" | số nhiều |- ! class="roa-person-number-header" style="width:12.5%;" | ngôi 1 ! class="roa-person-number-header" style="width:12.5%;" | ngôi 2 ! class="roa-person-number-header" style="width:12.5%;" | ngôi 3 ! class="roa-person-number-header" style="width:12.5%;" | ngôi 1 ! class="roa-person-number-header" style="width:12.5%;" | ngôi 2 ! class="roa-person-number-header" style="width:12.5%;" | ngôi 3 |- ! rowspan="6" class="roa-indicative-left-rail" | <span title="indicatiu">[[indicative|ind.]]</span> ! class="roa-indicative-left-rail" | ! class="roa-indicative-left-rail" | <<jo>> ! class="roa-indicative-left-rail" | <<tu>> ! class="roa-indicative-left-rail" | <<ell>>/<<ella>><br /><<vostè>> ! class="roa-indicative-left-rail" | <<nosaltres>><br /><<nós>> ! class="roa-indicative-left-rail" | <<vosaltres>><br /><<vós>> ! class="roa-indicative-left-rail" | <<ells>>/<<elles>><br /><<vostès>> |- ! class="roa-indicative-left-rail" style="height:3em;" | <span title="present">hiện tại</span> | {pres_1s} | {pres_2s} | {pres_3s} | {pres_1p} | {pres_2p} | {pres_3p} |- ! class="roa-indicative-left-rail" style="height:3em;" | <span title="imperfet">chưa hoàn thành</span> | {impf_1s} | {impf_2s} | {impf_3s} | {impf_1p} | {impf_2p} | {impf_3p} |- ! class="roa-indicative-left-rail" style="height:3em;" | <span title="futur">tương lai</span> | {fut_1s} | {fut_2s} | {fut_3s} | {fut_1p} | {fut_2p} | {fut_3p} |- ! class="roa-indicative-left-rail" style="height:3em;" | <span title="passat">quá khứ</span> | {pret_1s} | {pret_2s} | {pret_3s} | {pret_1p} | {pret_2p} | {pret_3p} |- ! class="roa-indicative-left-rail" style="height:3em;" | <span title="condicional">điều kiện</span> | {cond_1s} | {cond_2s} | {cond_3s} | {cond_1p} | {cond_2p} | {cond_3p} |- ! class="roa-subjunctive-left-rail" rowspan="3" | <span title="subjuntiu">giả định</span> ! class="roa-subjunctive-left-rail" | ! class="roa-subjunctive-left-rail" | <<jo>> ! class="roa-subjunctive-left-rail" | <<tu>> ! class="roa-subjunctive-left-rail" | <<ell>>/<<ella>><br /><<vostè>> ! class="roa-subjunctive-left-rail" | <<nosaltres>><br /><<nós>> ! class="roa-subjunctive-left-rail" | <<vosaltres>><br /><<vós>> ! class="roa-subjunctive-left-rail" | <<ells>>/<<elles>><br /><<vostès>> |- ! class="roa-subjunctive-left-rail" style="height:3em;" | <span title="present">hiện tại</span> | {pres_sub_1s} | {pres_sub_2s} | {pres_sub_3s} | {pres_sub_1p} | {pres_sub_2p} | {pres_sub_3p} |- ! class="roa-subjunctive-left-rail" style="height:3em;" rowspan="1" | <span title="imperfet">chưa hoàn thành</span> | {impf_sub_1s} | {impf_sub_2s} | {impf_sub_3s} | {impf_sub_1p} | {impf_sub_2p} | {impf_sub_3p} |- ! rowspan="3" class="roa-imperative-left-rail" style="height:3em;" | <span title="imperatiu">mệnh lệnh</span> ! class="roa-imperative-left-rail" | ! class="roa-imperative-left-rail" | &mdash; ! class="roa-imperative-left-rail" | <<tu>> ! class="roa-imperative-left-rail" | <<vostè>> ! class="roa-imperative-left-rail" | <<nosaltres>> ! class="roa-imperative-left-rail" | <<vosaltres>><br /><<vós>> ! class="roa-imperative-left-rail" | <<vostès>> |- ! class="roa-imperative-left-rail" style="height:3em;" | <span title="afirmatiu">khẳng định</span> | &mdash; | {imp_2s} | {imp_3s} | {imp_1p} | {imp_2p} | {imp_3p} |- ! class="roa-imperative-left-rail" style="height:3em;" | <span title="negatiu">phủ định</span> (<<no>>) | &mdash; | {neg_imp_2s} | {neg_imp_3s} | {neg_imp_1p} | {neg_imp_2p} | {neg_imp_3p} |{\cl}{notes_clause}</div></div>]=] local function make_table(alternant_multiword_spec) local forms = alternant_multiword_spec.forms forms.title = link_term(alternant_multiword_spec.lemmas[1].form, nil, "term") local ann_parts = {} if alternant_multiword_spec.annotation ~= "" then table.insert(ann_parts, alternant_multiword_spec.annotation) end if alternant_multiword_spec.args.titlenote then table.insert(ann_parts, alternant_multiword_spec.args.titlenote) end local annotation = table.concat(ann_parts, ", ") if annotation ~= "" then forms.title = forms.title .. " (" .. annotation .. ")" end forms.description = "" -- Format the table. forms.footnote = alternant_multiword_spec.footnote_basic forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or "" local table_with_pronouns = rsub(basic_table, "<<([^<>|]-)|([^<>|]-)>>", link_term) local table_with_pronouns = rsub(table_with_pronouns, "<<(.-)>>", link_term) return require("Module:TemplateStyles")("Module:roa-verb/style.css") .. m_string_utilities.format(table_with_pronouns, forms) end -- Externally callable function to parse and conjugate a verb given user-specified arguments. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, source_template, headword_head) local PAGENAME = mw.loadData("Module:headword/data").pagename local function in_template_space() return mw.title.getCurrentTitle().nsText == "Bản_mẫu" end -- Determine the verb spec we're being asked to generate the conjugation of. This may be taken from the -- current page title or the value of |pagename=; but not when called from {{ca-verb form of}}, where the -- page title is a non-lemma form. Note that the verb spec may omit the infinitive; e.g. it may be "<i-e>". -- For this reason, we use the value of `pagename` computed here down below, when calling normalize_all_lemmas(). local pagename = source_template ~= "ca-verb form of" and args.pagename or PAGENAME local head = headword_head or pagename local arg1 = args[1] if not arg1 then if (pagename == "ca-conj" or pagename == "ca-verb" or pagename == "ca-verb form of") and in_template_space() then arg1 = "amar<>" else arg1 = "<>" end end -- When called from {{ca-verb form of}}, determine the non-lemma form whose inflections we're being asked to -- determine. This normally comes from the page title or the value of |pagename=. local verb_form_of_form if source_template == "ca-verb form of" then verb_form_of_form = args.pagename if not verb_form_of_form then if PAGENAME == "ca-verb form of" and in_template_space() then verb_form_of_form = "ami" else verb_form_of_form = PAGENAME end end end local incorporated_headword_head_into_lemma = false if arg1:find("^<.*>$") then -- missing lemma if head:find(" ") then -- If multiword lemma, try to add arg spec after the first word. -- Try to preserve the brackets in the part after the verb, but don't do it -- if there aren't the same number of left and right brackets in the verb -- (which means the verb was linked as part of a larger expression). local refl_clitic_verb, post = rmatch(head, "^(.-)( .*)$") local left_brackets = rsub(refl_clitic_verb, "[^%[]", "") local right_brackets = rsub(refl_clitic_verb, "[^%]]", "") if #left_brackets == #right_brackets then arg1 = iut.remove_redundant_links(refl_clitic_verb) .. arg1 .. post incorporated_headword_head_into_lemma = true else -- Try again using the form without links. local linkless_head = m_links.remove_links(head) if linkless_head:find(" ") then refl_clitic_verb, post = rmatch(linkless_head, "^(.-)( .*)$") arg1 = refl_clitic_verb .. arg1 .. post else error("Unable to incorporate <...> spec into explicit head due to a multiword linked verb or " .. "unbalanced brackets; please include <> explicitly: " .. arg1) end end else -- Will be incorporated through `head` below in the call to normalize_all_lemmas(). incorporated_headword_head_into_lemma = true end end local function split_bracketed_runs_into_words(bracketed_runs) return put.split_alternating_runs(bracketed_runs, " ", "preserve splitchar") end local parse_props = { parse_indicator_spec = parse_indicator_spec, -- Split words only on spaces, not on hyphens, because that messes up reflexive verb parsing. split_bracketed_runs_into_words = split_bracketed_runs_into_words, allow_default_indicator = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(arg1, parse_props) alternant_multiword_spec.pos = pos or "verbs" alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template alternant_multiword_spec.verb_form_of_form = verb_form_of_form alternant_multiword_spec.incorporated_headword_head_into_lemma = incorporated_headword_head_into_lemma normalize_all_lemmas(alternant_multiword_spec, head) detect_all_indicator_specs(alternant_multiword_spec) local inflect_props = { slot_list = alternant_multiword_spec.all_verb_slots, inflect_word_spec = conjugate_verb, -- We add links around the generated verbal forms rather than allow the entire multiword -- expression to be a link, so ensure that user-specified links get included as well. include_user_specified_links = true, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) -- Remove redundant brackets around entire forms. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = iut.remove_redundant_links(form.form) end end compute_categories_and_annotation(alternant_multiword_spec) if args.json and source_template == "ca-conj" then return require("Module:JSON").toJSON(alternant_multiword_spec.forms) end return alternant_multiword_spec end -- Entry point for {{ca-conj}}. Template-callable function to parse and conjugate a verb given -- user-specified arguments and generate a displayable table of the conjugated forms. function export.show(frame) local parent_args = frame:getParent().args local params = { [1] = {}, ["titlenote"] = {}, ["noautolinktext"] = {type = "boolean"}, ["noautolinkverb"] = {type = "boolean"}, ["pagename"] = {}, -- for testing/documentation pages ["json"] = {type = "boolean"}, -- for bot use } local args = require("Module:parameters").process(parent_args, params) local alternant_multiword_spec = export.do_generate_forms(args, "ca-conj") if type(alternant_multiword_spec) == "string" then -- JSON return value return alternant_multiword_spec end show_forms(alternant_multiword_spec) return make_table(alternant_multiword_spec) .. require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang, nil, nil, force_cat) end return export qjh4dpt06f8kkehn73prihsb2t8arvq Mô đun:category tree/topic/Animals 828 324855 2345057 2337482 2026-04-14T00:49:22Z Hiyuune 50834 2345057 Scribunto text/plain local labels = {} labels["Động vật"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Sinh vật"}, commonscat = "Animalia", wpcat = true, } labels["Acanthurus"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[surgeonfish]], [[light-horseman]], [[louvar]]s, [[scat]]s, [[rabbitfish]], [[Moorish idol]]s and other fish in the [[perciform]] [[suborder]] [[Acanthuroidei]]", parents = {"Cá"}, } labels["accentors"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Prunellidae]]", parents = {"Bộ Sẻ"}, } labels["accipiters"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[besra]]s, [[Cooper's hawk]]s, [[goshawk]]s, [[sharp-shinned hawk]]s, [[shikra]]s, [[sparrowhawk]]s, and other [[hawk]]s in the [[genus]] ''[[Accipiter]]''", parents = {"birds of prey"}, } labels["Bộ Cá tầm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[paddlefish]], [[sturgeon]]s and other fish in the [[order]] [[Acipenseriformes]]", parents = {"Cá"}, } labels["adephagan beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[diving beetle]]s, [[ground beetle]]s (including [[bombardier beetle]]s and [[tiger beetle]]s), [[whirligig beetle]]s and other [[beetle]]s in the [[suborder]] [[Adephaga]]", parents = {"beetles"}, } labels["African insectivores"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aardvark]]s, [[elephant shrew]]s, [[golden mole]]s, [[otter shrew]]s, [[tenrec]]s, and other [[mammal]]s in the [[clade]] [[Afroinsectiphilia]]", parents = {"mammals"}, } labels["agamid lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[agama]]s, [[bearded dragon]]s, [[flying dragon]]s, [[frilled lizard]]s, [[moloch]]s, [[spiny-tailed lizard]]s, [[stellion]]s and other [[lizard]]s in the [[family]] [[Agamidae]]", parents = {"lizards"}, } labels["alcelaphine antelopes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blesbuck]]s, [[bontebok]]s, [[bubal]]s, [[gnu]]s or [[wildebeest]], [[hartebeest]]s, [[hirola]], [[sassaby]]s, [[topi]]s, [[tetel]]s, and other [[antelopes]] in the [[subfamily]] [[Alcelaphinae]]", parents = {"antelopes"}, } labels["ammonites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[extinct]] [[cephalopod]]s in the [[subclass]] [[Ammonoidea]]", parents = {"cephalopods"}, } labels["Lớp Lưỡng cư"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Amphibia", wpcat = true, } labels["amphipods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[beach flea]]s, [[lawn shrimp]], [[scud]]s, [[side swimmer]]s, [[skeleton shrimp]], [[whale louse|whale lice]], and other [[crustacean]]s in the [[order]] [[Amphipoda]]", parents = {"Phân ngành Giáp xác"}, } labels["Họ Vịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[:w:vi:Họ Vịt|họ Vịt]]: ([[vịt]], [[ngỗng]] và [[thiên nga]])", parents = {"Chim nước"}, } labels["annelids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[earthworm]]s, [[leech]]es, [[ragworm]]s and many other [[segment]]ed [[worm]]s in the [[phylum]] [[Annelida]]", parents = {"worms"}, } labels["Bộ Cá vây chân"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[order]] [[Lophiiformes]]", parents = {"Cá"}, } labels["anguimorph lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[alligator lizard]]s, [[beaded lizard]]s, [[blindworm]]s, [[crocodile monitor]]s, [[galliwasp]]s, [[Gila monster]]s, [[glass lizard]]s, [[goanna]]s, [[Komodo dragon]]s, [[legless lizard]]s, [[nile monitor]]s, [[perentie]]s, [[sheltopusik]]s, [[water monitor]]s, and other [[lizards]] in the [[suborder]] [[Anguimorpha]]", parents = {"lizards"}, } labels["anomurans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=crablike [[crustacean]]s in the [[decapod]] [[infraorder]] [[Anomura]], which are closely related to the true [[crab]]s in the infraorder [[Brachyura]]", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["anteaters and sloths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Pilosa]]", parents = {"mammals"}, } labels["antelopes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn"}, } labels["antilopine antelopes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blackbuck]]s, [[chinkara]]s, [[dibatag]]s, [[dik-dik]]s, [[gazelle]]s, [[gerenuk]]s, [[grysbok]]s, [[klipspringer]]s, [[oribi]]s, [[royal antelope]]s, [[saiga]]s, [[springbok]]s, [[steenbok]]s, [[zeren]], and other [[antelope]]s in the [[bovid]] [[subfamily]] [[Antilopinae]]", parents = {"antelopes"}, } labels["ants"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"hymenopterans"}, } labels["antshrikes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"suboscines", "perching birds"}, } labels["Anuran"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphibian]]s in the [[order]] [[Anura]], which are short-bodied and without tails, having long hind legs adapted for leaping that are typically folded at rest. Anurans are mostly known as [[frog]]s or [[toad]]s", parents = {"Lớp Lưỡng cư"}, } labels["Aphid"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[superfamily]] [[Aphidoidea]]", parents = {"Bộ Cánh nửa"}, } labels["apodiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hummingbird]]s, [[needletail]]s, [[spinetail]]s, [[swift]]s, [[swiftlet]]s, [[treeswift]]s, and other [[bird]]s in the [[order]] [[Apodiformes]]", parents = {"birds"}, } labels["Lớp Hình nhện"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Chân đốt"}, } labels["araneoid spiders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bird dropping spider]]s, [[cobweb spiders]] (including [[black widow]]s and [[redback]]s), [[orbweaver]]s (including [[cross spider]]s and [[writing spider]]s), [[long-jawed spider]]s, [[money spider]]s, [[nesticid]]s, [[pimoid]], [[pirate spider]]s, [[tetragnathid]]s and other [[spider]]s in the [[superfamily]] [[Araneoidea]]", parents = {"spiders"}, } labels["argentiniform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[argentine]]s, [[barreleye]]s, [[blacksmelt]]s, [[smoothtongue]]s and other fish in the [[order]] [[Argentiniformes]]", parents = {"fish"}, } labels["armadillos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["Ngành Chân đốt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Động vật"}, commonscat = "Arthropoda", wpcat = true, } labels["aschizan flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fly|flies]] in the [[dipteran]] [[section]] [[Aschiza]]", parents = {"dipterans"}, } labels["asilomorph flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bee fly|bee flies]], [[dance fly|dance flies]], [[Mydas fly|Mydas flies]], [[robber fly|robber flies]], [[stiletto fly|stiletto flies]], [[window fly|window flies]] and other [[fly|flies]] in the [[dipteran]] [[infraorder]] [[Asilomorpha]]", parents = {"dipterans"}, } labels["assassin bugs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ambush bug]]s, [[assassin bug]]s, [[corsair]]s, [[feather-legged bug]]s, [[kissing bug]]s or [[conenose bug]]s, [[masked hunter]]s, [[wheel bug]]s, and other [[true bug]]s in the [[family]] [[Reduviidae]]", parents = {"true bugs"}, } labels["astacideans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Astacidea]], including the original [[species]] known as [[crayfish]] and [[lobster]]s, and their relatives", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["atheriniform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue-eye]]s, [[hardyhead]]s, [[grunion]], [[jacksmelt]], [[rainbowfish]], [[silverside]]s, [[zona]], and other fish in the [[order]] [[Atheriniformes]]", parents = {"fish"}, } labels["Alcidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[auk]]s, [[guillemot]]s, [[murre]]s, [[puffin]]s, [[razorbill]]s, and other [[seabird]]s in the family [[Alcidae]]", parents = {"Chim biển"}, } labels["Bộ Cá răng kiếm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[daggertooth]]s, [[lancetfish]], [[sergeant baker]]s, [[greeneye]]s, [[telescopefish]], [[lizardfish]] and other fish in the [[order]] [[Aulopiformes]]", parents = {"Cá"}, } labels["Australasian robins"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] [[family]] [[Petroicidae]], which are not closely related to the [[European robin]] (an [[Old World flycatcher]] in the family [[Muscicapidae]]), or the [[American robin]] (a [[thrush]] in the family [[Turdidae]])", parents = {"perching birds"}, } labels["động vật khi nhỏ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"động vật"}, } labels["bandicoots and bilbies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[peramelid]]s, [[bandicoot]]s, [[marl]]s, [[quenda]]s, [[chaeropodid]]s, [[pig-footed bandicoot]]s, [[thylacomyid]]s, [[bilby|bilbies]], [[dalgite]]s, [[rabbit-eared bandicoot]]s, [[philander]]s, [[pinkie]]s, and other [[marsupial]]s in the [[order]] [[Peramelemorphia]]", parents = {"marsupials"}, } labels["barklice"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=non-[[parasitic]] [[insect]]s in the [[order]] [[Psocodea]]", parents = {"insects"}, } labels["barnacles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[infraclass]] [[Cirripedia]], including the parasitic [[rhizocephalan]]s", parents = {"Phân ngành Giáp xác"}, } labels["bats"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["bees"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"hymenopterans", "beekeeping"}, } labels["beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"insects"}, } labels["Bộ Cá nhói"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ballyhoo]], [[flying fish]], [[garfish]], [[halfbeak]]s, [[houndfish]], [[mackerel pike]]s, [[medaka]]s, [[needlefish]], [[ricefish]], [[saury|sauries]], [[silver gar]], and other fish in the [[order]] [[Beloniformes]]", parents = {"Cá"}, } labels["bibionomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[March fly|March flies]], [[cecidomyiid]] [[gall midge]]s, [[keroplatid]] [[fungus gnat]]s, [[mycetophilid]]s, [[sciarid]]s and other [[fly|flies]], [[gnat]]s and [[midge]]s in the [[dipteran]] [[infraorder]] [[Bibionomorpha]]", parents = {"dipterans"}, } labels["Lớp Chim"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Aves", wpcat = true, } labels["Chim săn mồi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds that live by [[predatory]] hunting, and from [[carrion]]", parents = {"Lớp Chim"}, } labels["bivalves"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[clam]]s, [[cockle]]s, [[mussel]]s, [[oyster]]s, [[scallop]]s and other [[mollusk]]s in the [[class]] [[Bivalvia]]", parents = {"Ngành Thân mềm"}, } labels["blennies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blenny|blennies]], [[chaenopsid]]s, [[clinid]]s, [[dactyloscopid]]s, [[klipfish]], [[labrisomid]]s, [[triplefin]]s, [[weedfish]] and other fish in the [[perciform]] [[suborder]] [[Blennioidei]]", parents = {"fish"}, } labels["boas"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[snake]]s in the family [[Boidae]]", parents = {"snakes"}, } labels["bostrichiform beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[carpet beetle]]s, [[deathwatch beetle]]s, [[drugstore beetle]]s, [[museum beetle]]s, [[powder-post beetle]]s, and other [[anobiid]]s/[[ptinid]]s, [[bostrichid]]s, [[dermestid]]s, [[derodontid]]s, [[jacobsoniid]]s and [[nosodendrid]]s in the [[coleopteran]] [[infraorder]] [[Bostrichiformia]]", parents = {"beetles"}, } labels["bovines"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn"}, } labels["brachiopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[animal]]s in the [[phylum]] [[Brachiopoda]]. <u>Note</u>: not to be confused with [[branchiopod]]s, which are [[crustacean]]s", parents = {"animals"}, } labels["branchiopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[[brine shrimp]], [[clam shrimp]], [[fairy shrimp]], [[tadpole shrimp]], [[water flea]]s, and other [[crustacean]]s in the [[class]] [[Branchiopoda]]. <u>Note</u>: not to be confused with [[brachiopod]]s, which are a separate [[phylum]]", parents = {"Phân ngành Giáp xác"}, } labels["bryozoans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[animal]]s in the [[phylum]] [[Bryozoa]], also known as [[Ectoprocta]]", parents = {"animals"}, } labels["bulbuls"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bulbul]]s, [[greenbul]]s, [[brownbul]]s, [[leaflove]]s, [[bristlebill]]s, and other birds in the [[passerine]] [[family]] [[Pycnonotidae]]", parents = {"perching birds"}, } labels["buteos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hawk]]s in the [[genus]] ''[[Buteo]]'', known as [[buzzard]]s in Europe", parents = {"birds of prey"}, } labels["Bướm ngày"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Côn trùng"}, } labels["caddis flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the order [[Trichoptera]], which are closely related to the [[butterfly|butterflies]] and [[moth]]s but with hairs on their wings instead of scales, and which have [[aquatic]] [[larvae]] that live in cases that they build around themselves", parents = {"insects"}, } labels["caecilians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphibian]]s in the [[order]] [[Gymnophiona]], which are legless and resemble [[earthworm]]s or [[snake]]s", parents = {"amphibians"}, } labels["Họ Lạc đà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=động vật thuộc họ [[lạc đà]]", parents = {"Lớp Thú", "Bộ Guốc chẵn"}, } labels["Họ Chó"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["Caprinae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sheep]], [[goat]]s, [[goat antelope]]s, [[chamois]], [[muskox]]en, [[bharal]], [[goral]], [[ibex]], [[mouflon]], [[serow]], [[tahr]], [[tur]], [[takin]] and other animals in the [[bovid]] [[subfamily]] [[Caprinae]], formerly known as the [[family]] Capridae", parents = {"Bộ Guốc chẵn"}, } labels["caprimulgiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[caprimulgiform]]s: birds in the taxonomic order [[Caprimulgiformes]]- the [[nightjar]]s, [[oilbird]]s, [[frogmouth]]s, [[potoo]]s, etc", parents = {"birds"}, } labels["carcharhiniform sharks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bull shark]]s, [[catshark]]s, [[gummy shark]]s, [[hammerhead]]s, [[leopard shark]]s, [[morgay]]s, [[requiem shark]]s, [[tiger shark]]s, [[tope]]s, [[whaler]]s, [[whitetip]]s and other sharks in the [[order]] [[Carcharhiniformes]]", parents = {"Liên bộ Cá mập"}, } labels["cardinalids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cardinal]]s, [[dickcissel]]s, [[indigo bunting]]s, [[pyrrhuloxia]]s, [[rose-breasted grosbeak]]s, [[scarlet tanager]]s, and other birds in the [[family]] [[Cardinalidae]]", parents = {"perching birds"}, } labels["caridean shrimp"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Caridea]], mostly known as [[shrimp]] or [[prawn]]s", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["Bộ Ăn thịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bear]]s, [[cat]]s, [[civet]]s, [[dog]]s, [[fossa]]s, [[hyaena]]s, [[mongoose]]s, [[panda]]s, [[raccoon]]s, [[seal]]s, [[skunk]]s, [[weasel]]s and various other [[mammal]]s in the [[order]] [[Carnivora]]", parents = {"Lớp Thú"}, } labels["Cá chép"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[subfamily]] [[Cyprininae]], the [[carps]] and [[goldfish]]", parents = {"Họ Cá chép"}, } labels["Bộ Cá da trơn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Cá", "Otomorpha"}, } labels["Mèo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cat]]s in the sense of members of the genus ''[[Felis]]''", parents = {"Họ Mèo"}, commonscat = "Felis silvestris catus", wpcat = true, } labels["cattle"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"bovines", "livestock"}, } labels["caviomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[agouti]]s, [[capybara]]s, [[chinchilla]]s, [[guinea pig]]s, [[New World porcupine]]s, [[nutria]]s, [[tuco-tuco]]s and other [[rodent]]s in the parvorder [[Caviomorpha]]", parents = {"Bộ Gặm nhấm"}, } labels["Lớp Chân đầu"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Thân mềm"}, } labels["cercopithecin monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue monkey]]s, [[Diana monkey]]s, [[guenon]]s, [[lesula]]s, [[malbrouck]]s, [[patas monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[Old World monkey]]s in the [[cercopithecine]] [[tribe]] [[Cercopithecini]]", parents = {"Old World monkeys"}, } labels["Liên họ Đuôi cứng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] [[superfamily]] [[Certhioidea]], the [[treecreeper]]s, [[nuthatch]]es, [[gnatcatcher]]s and [[wren]]s", parents = {"Bộ Sẻ"}, } labels["Họ Hươu nai"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn"}, } labels["cetaceans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cetacean]]s ([[dolphin]]s, [[whale]]s and [[porpoise]]s)", parents = {"Bộ Guốc chẵn"}, } labels["chalcidoid wasps"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[chalcidid]]s, [[encyrtid]]s, [[fig wasp]]s, [[jointworm]]s, [[mymarid]] [[fairyfly|fairyflies]], [[perilampid]]s, [[torymid]]s, [[trichogramma]]s, and other [[wasp]]s in the [[superfamily]] [[Chalcidoidea]]", parents = {"hymenopterans"}, } labels["Characidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the order [[Characiformes]]", parents = {"Cá", "Otomorpha"}, } labels["Gà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Gia cầm", "Bộ Gà"}, } labels["chimaeras (fish)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cartilaginous]] fish in the [[Chimaeriformes]], the only surviving [[order]] of the [[subclass]] [[Holocephali]], and separate from the [[shark]]s, [[ray]]s, [[skate]]s and [[sawfish]] of the subclass [[Elasmobranchii]]", parents = {"fish"}, } labels["Ngành Dây sống"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=animals in the [[phylum]] [[Chordata]]", parents = {"Động vật"}, } labels["chrysomeloid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cerambycid]]s or [[longhorn beetle]]s such as [[apple borer]]s, [[huhu beetle]]s, [[locust borer]]s and [[thunderbolt beetle]]s, as well as [[chrysomelid]]s or [[leaf beetle]]s such as [[asparagus beetle]]s, [[bean weevil]]s, [[Colorado beetle]]s, [[cucumber beetle]]s, [[flea beetle]]s, [[potato beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Chrysomeloidea]]", parents = {"beetles"}, } labels["cicadas"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[superfamily]] [[Cicadoidea]]", parents = {"hemipterans"}, } labels["cichlids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Cichlidae]]", parents = {"labroid fish"}, } labels["clinids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Clinidae]]", parents = {"fish"}, } labels["Ngành Thích ty bào"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[coral]]s, [[gorgonian]]s, [[hydra]]s, [[myxozoan]]s, [[Portuguese man-of-war]], [[sea anemone]]s, [[sea fir]]s, [[sea wasp]]s, and other animals in the in the [[phylum]] [[Cnidaria]]", parents = {"Động vật"}, wpcat = true, } labels["Phân ngành San hô"] = { type = "chủ đề thuộc nhóm tập hợp", description = "một phân ngành động vật không xương sống [[thủy sinh]] bao gồm [[hải quỳ]], [[:w:vi:Bộ San hô cứng|san hô đá]] và san hô mềm, thuộc ngành [[:w:vi:Ngành Thích ty bào|Ngành Thích ty bào]] (Cnidaria)", parents = {"Ngành Thích ty bào"}, wpcat = true, commonscat = "Anthozoa", } labels["cockatoos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crested]] [[parrot]]s in the [[family]] [[Cacatuidae]]", parents = {"parrots"}, } labels["cockroaches"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"insects"}, } labels["colobine monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[colobus]]es, [[douc]]s, [[langur]]s, [[guereza]]s, [[hanuman]]s,[[leaf monkey]]s, [[lutung]]s, [[proboscis monkey]]s, and other [[Old World monkey]]s in the [[subfamily]] [[Colobinae]]", parents = {"Old World monkeys"}, } labels["colubrid snakes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[snake]]s in the family [[Colubridae]]", parents = {"snakes"}, } labels["colugos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=the [[primate]]-like [[gliding]] [[mammal]]s in the [[order]] [[Dermoptera]], also known as [[flying lemur]]s", parents = {"mammals"}, } labels["columbids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[columbid]]s, i.e. [[pigeon]]s and [[dove]]s", parents = {"birds"}, } labels["copepods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[subclass]] [[Copepoda]]", parents = {"Phân ngành Giáp xác"}, } labels["coraciiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bee-eater]]s, [[ground rollers]], [[kingfisher]]s, [[motmot]]s, [[roller]]s, [[tody|todies]] and other birds in the taxonomic order [[Coraciiformes]]", parents = {"birds"}, } labels["corvids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds", "corvoid birds"}, } labels["corvoid birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[apostlebird]]s, [[bird of paradise|birds of paradise]], [[crow]]s, [[drongo]]s, [[fantail]]s, [[grinder]]s, [[jackdaw]]s, [[jay]]s, [[magpie]]s, [[magpie-lark]]s, [[manucode]]s, [[monarchid]]s, [[nutcracker]]s, [[piwakawaka]]s, [[raven]]s, [[restless flycatcher]]s, [[riflebird]]s, [[shrike]]s, [[standard-wing]]s, and other birds in the [[superfamily]] [[Corvoidea]]", parents = {"perching birds"}, } labels["cotingas"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[suboscine]] [[family]] [[Cotingidae]]", parents = {"suboscines"}, } labels["crabs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crab]]s, [[decapod]] [[crustacean]]s in the [[infraorder]] [[Brachyura]]", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["cranes (birds)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crane]]s", parents = {"gruiforms"}, } labels["cricetids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cotton rat]]s, [[deer mouse|deer mice]], [[hamster]]s, [[harvest mouse|harvest mice]], [[lemming]]s, [[vole]]s, [[woodrat]]s, and other [[rodent]]s in the [[family]] [[Cricetidae]]", parents = {"Bộ Gặm nhấm"}, } labels["crickets and grasshoppers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cricket]]s, [[grasshopper]]s, [[katydid]]s, [[weta]]s and other [[insect]]s in the order [[Orthoptera]]", parents = {"insects"}, } labels["croakers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[croaker]]s, [[drum]]s, [[weakfish]]s and other fish in the family [[Sciaenidae]]", parents = {"percoid fish"}, } labels["crocodilians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crocodile]]s, [[alligator]]s, [[caymans]], and other [[reptile]]s in the order [[Crocodilia]]", parents = {"reptiles"}, } labels["Phân ngành Giáp xác"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Chân đốt"}, } labels["cuckoos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cuckoo]]s and other birds in the [[family]] [[Cuculidae]]", parents = {"otidimorph birds"}, } labels["cuckooshrikes and minivets"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Campephagidae]]", parents = {"perching birds"}, } labels["cucujoid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[flower beetle]]s, [[fungus beetle]]s, [[grain beetle]]s, [[lady beetle]]s, [[lizard beetle]]s, [[Mexican bean beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Cucujoidea]]", parents = {"beetles"}, } labels["Ngành Sứa lược"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=animals in the [[phylum]] [[Ctenophora]], the [[comb jelly|comb jellies]]", parents = {"Động vật"}, } labels["culicomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[biting midge]]s, [[blackfly|blackflies]], [[blood worm]]s, [[glassworm]]s, [[meniscus midge]]s, [[mosquito]]s, [[no-see-um]]s, [[non-biting midge]]s, [[phantom midge]]s and other [[insect]]s in the [[dipteran]] [[infraorder]] [[Culicomorpha]]", parents = {"dipterans"}, } labels["Họ Cá chép"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[carp]], [[minnow]]s, [[chub]]s and other fish in the [[family]] [[Cyprinidae]]. In some classifications, this group is known as the [[superfamily]] [[Cyprinoidea]] or [[suborder]] [[Cyprinoidei]], with the [[cyprinid]] [[subfamily|subfamilies]] considered to be families", parents = {"Cá", "Otomorpha"}, } labels["Phân họ Vịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gadwall]]s [[garganey]]s, [[mallard]]s, [[mottled duck]]s, [[pintail]]s, [[shoveler]]s, [[teal]]s, [[wigeon]]s and other ducks in either the [[anatid]] [[tribe]] [[Anatini]] or [[subfamily]] [[Anatinae]], depending on the classification", parents = {"Vịt"}, } labels["damselflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bluestreak]]s, [[bluetail]]s, [[demoiselle]]s, [[flatwing]]s, [[redtail]]s, [[riverdamsel]]s, [[rubyspot]]s, [[spreadwing]]s, [[threadtail]]s, [[whitetip]]s, and other insects in the [[odonate]] [[suborder]] [[Zygoptera]]", parents = {"dragonflies and damselflies"}, } labels["danaine butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[clearwing]]s, [[crow]]s, [[milkweed]]s, [[monarch]]s, [[paper kite butterfly|paper kite butterflies]], [[tiger]]s, [[wanderer]]s and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Danainae]]", parents = {"nymphalid butterflies"}, } labels["dasyuromorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[thylacine]]s, [[numbat]]s, [[dasyure]]s, [[antechinus]]es, [[dibbler]]s, [[dunnart]]s, [[mulgara]]s. [[phascogale]]s, [[planigale]]s, [[quoll]]s, [[Tasmanian devil]]s, and other [[marsupial]]s in the [[order]] [[Dasyuromorphia]]", parents = {"marsupials"}, } labels["Bộ Mười chân"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crabs]], [[crayfish]], [[lobster]]s, [[prawn]]s, ([[caridean]]) [[shrimp]], and many other [[crustacean]]s in the [[order]] [[Decapoda]]", parents = {"Phân ngành Giáp xác"}, } labels["delphinids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=(oceanic) [[dolphin]]s, [[grampus]]es, [[killer whale]]s/[[orca]]s, [[pilot whale]]s, and other [[cetacean]]s in the [[family]] [[Delphinidae]]", additional = "Note: [[river dolphin]]s and [[porpoise]]s are in other families.", parents = {"cetaceans"}, } labels["designer dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, commonscat = true, wpcat = true, } labels["dinosaurs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["dionychan spiders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crab spider]]s, [[flattie]]s, [[ground spider]]s, [[huntsman spider]]s, [[jumping spider]], [[scorpion spider]]s, and other [[spiders]] in the [[entelegyne]] [[clade]] [[Dionycha]]", parents = {"spiders"}, } labels["dipterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fly|flies]], [[gnat]]s, [[midge]]s, [[mosquito]]s and other [[insect]]s in the order [[Diptera]]", parents = {"insects"}, } labels["Chó"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Chó"}, commonscat = true, wpcat = true, } labels["Mèo nhà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Mèo"}, } labels["dragonflies and damselflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the order [[Odonata]]", parents = {"insects"}, } labels["Vịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Vịt", "Gia cầm"}, } labels["dugongs and manatees"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the order [[Sirenia]]", parents = {"mammals"}, } labels["Đại bàng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim săn mồi"}, } labels["earthworms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=worms in the [[annelid]] [[suborder]] [[Lumbricina]]", parents = {"annelids"}, } labels["earwigs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the order [[Dermaptera]]", parents = {"insects"}, } labels["echinoderms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals"}, commonscat = "Echinodermata", wpcat = true, } labels["eels"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[eel]]s, elongated, snakelike fish in the order [[Anguilliformes]]", parents = {"elopomorph fish"}, } labels["elapid snakes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cobra]]s, [[coral snake]]s, [[krait]]s, [[mamba]]s, [[sea snake]]s, and other [[venomous]] snakes in the family [[Elapidae]]", parents = {"snakes"}, } labels["elateroid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[click beetle]]s/[[elaterid]]s, [[fire beetle]]s, [[firefly|fireflies]]/[[lampyrid]]s, [[glowworm]]s, [[net-winged beetle]]s/[[lycid]]s, [[railroad worm]]s/[[phengodid]]s, [[soldier beetle]]s/[[cantharid]]s, [[throscid]]s, [[wireworm]]s and other [[beetle]]s in the [[superfamily]] [[Elateroidea]]", parents = {"beetles"}, } labels["Họ Voi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, commonscat = "Elephantidae", wpcat = true, } labels["elopomorph fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bonefish]], [[eel]]s, [[gulper eel]]s, [[halosaur]]s, [[ladyfish]], [[tarpon]] and other fish in the [[superorder]] [[Elopomorpha]]", parents = {"fish"}, } labels["emberizids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bunting]]s, [[yellowhammer]]s and related birds in the [[passerine]] family [[Emberizidae]]", additional = "<u>Note</u>: for New World species that were formerly classified in this family, see [[:Category:{{{langcode}}}:New World sparrows]].", parents = {"perching birds"}, } labels["emydid turtles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=(North American) [[box turtle]]s, [[chicken turtle]]s, [[cooter]]s, [[ellachick]]s, [[pond turtle]]s, [[slider]]s, [[terrapin]]s, and other [[turtle]]s in the [[family]] [[Emydidae]]", parents = {"turtles"}, } labels["Họ Ngựa"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc lẻ"}, } labels["erinaceids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[erinaceid]]s – hedgehogs and relatives", parents = {"mammals"}, } labels["Eupleridae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[euplerid]]s &mdash; mongoose-like mammals found in Madagascar", parents = {"Bộ Ăn thịt"}, } labels["Bộ Guốc chẵn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Artiodactyla]]", parents = {"Lớp Thú"}, } labels["Họ Cắt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[caracara]]s, [[falcon]]s, [[hobby|hobbies]], [[kestrel]]s, [[lanner]]s, [[merlin]]s, [[saker]]s, and other birds in the [[family]] [[Falconidae]]", parents = {"Chim săn mồi"}, } labels["Họ Mèo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["female animals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals", "female"}, } labels["Cá"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Fish", wpcat = true, } labels["flamingos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim nước"}, } labels["flatfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sole]]s, [[flounder]]s, [[halibut]]s and other fish in the order [[Pleuronectiformes]]", parents = {"fish"}, } labels["flatworms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fluke]]s, [[monogenean]]s, [[planarian]]s, [[polyclad]]s, [[tapeworm]]s, and other animals in the [[phylum]] [[Platyhelminthes]]", additional = "For terms related to the study of [[parasitic]] [[worm#Noun|worms]], see [[:Category:Helminthology]] and its subcategories.", parents = {"worms"}, } labels["Bộ Bọ chét"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Côn trùng"}, } labels["Bộ Gà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fowl]]s: land birds in the [[order]] [[Galliformes]]", parents = {"Lớp Chim"}, } labels["Cáo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Chó"}, } labels["Chim nước"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds that live mainly in [[freshwater]] areas, including [[estuaries]]", parents = {"Lớp Chim"}, } labels["freshwater whitefish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cisco]]s, [[houting]]s, [[inconnu]]s, [[lavaret]]s, [[marena]]s, [[omul]]s, [[Otsego bass]], [[peled]]s, [[pollan]]s, [[roundfish]], [[tullibee]]s, [[vendace]]s, [[whitefish]] and other fish in the [[salmonid]] [[subfamily]] [[Coregoninae]]", parents = {"Họ Cá hồi"}, } labels["Bộ Không đuôi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Anuran"}, } labels["gadiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cod]], [[haddock]], [[hake]] and other fish in the [[order]] [[Gadiformes]]", parents = {"fish"}, } labels["gasterosteiform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[stickleback]]s, [[hypoptychid]] [[sand eel]]s, [[tubesnout]]s and other fish in the [[order]] [[Gasterosteiformes]]", additional = "Note: See [[:Category:Syngnathiform fish]] for a group formerly included within this order.", parents = {"fish"}, } labels["Lớp Chân bụng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Thân mềm"}, } labels["geckos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[lizard]]s in the [[infraorder]] [[Gekkota]], except for the [[legless lizards]] or [[pygopod]]s", parents = {"lizards"}, } labels["Ngỗng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Vịt", "Gia cầm"}, } labels["geometrid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[carpet]]s, [[engrailed]]s, [[heath]]s, [[pug]]s, [[peppered moth]]s, [[streak]]s, [[wave]]s and other [[moth]]s in the [[family]] [[Geometridae]], most of which have [[caterpillar]]s known as [[inchworm]]s, [[looper]]s, [[measuring worm]]s or [[spanworm]]s", parents = {"moths"}, } labels["goats"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Caprinae", "livestock"}, } labels["gobies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[goby|gobies]], [[dartfish]], [[mudskipper]]s, [[sea gudgeon]]s, [[sleeper]]s, [[wormfish]], and other [[fish]] in the [[perciform]] [[suborder]] [[Gobioidei]]", parents = {"fish"}, } labels["gossamer-winged butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue]]s, [[copper]]s, [[elfin]]s, [[harvester]]s, [[hairstreak]]s, [[sunbeam]]s and other [[butterfly|butterflies]] in the [[family]] [[Lycaenidae]]", parents = {"Bướm ngày"}, } labels["grebes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim nước"}, } labels["Gà gô"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blackcock]]s, [[capercaillie]]s, [[grouse]], [[moorcock]]s, [[prairie chicken]]s, [[ptarmigan]]s, [[sagehen]]s, and other birds in the [[phasianid]] [[subfamily]] [[Tetraoninae]]", parents = {"Bộ Gà"}, } labels["gruiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[coot]]s, [[crake]]s, [[crane]]s, [[finfoot]]s, [[flufftail]]s, [[gallinule]]s, [[limpkin]]s, [[rail]]s, [[sungrebe]]s, [[trumpeter]]s, and other birds in the [[order]] [[Gruiformes]]", parents = {"Chim nước"}, } labels["gulls"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gull]]s, [[seabird]]s in the [[family]] [[Laridae]]", parents = {"Chim biển"}, } labels["gun dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["hares"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"lagomorphs"}, } labels["Bộ Cánh nửa"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aphid]]s, [[leafhopper]]s, [[scale insect]]s, [[true bug]]s, [[whitefly|whiteflies]], and other [[insect]]s in the order [[Hemiptera]]", parents = {"Lớp Côn trùng"}, } labels["herding dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"pastoral dogs"}, } labels["herons"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[heron]]s, [[bittern]]s and [[egret]]s", parents = {"Chim nước"}, } labels["Họ Cầy lỏn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[herpestid]]s- mongooses, meerkats, and relatives", parents = {"Bộ Ăn thịt"}, } labels["Họ Cá trích"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[herring]]s, [[shad]]s, [[sardine]]s and other fish in the family [[Clupeidae]]", parents = {"Cá", "Otomorpha"}, } labels["holostean fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gar]]s and [[bowfin]]s, primitive fish in the [[infraclass]] [[Holostei]]", parents = {"fish"}, } labels["hominids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Linh trưởng"}, } labels["honeyeaters"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=Australian [[chat]]s, [[bellbird]]s, [[friarbird]]s, [[gibberbird]]s, [[honeyeater]]s, [[miner]]s, [[spinebill]]s, [[wattlebird]]s, and other birds in the [[family]] [[Meliphagidae]]", parents = {"meliphagoid birds"}, } labels["hoopoes and hornbills"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hoopoe]]s, [[woodhoopoe]]s (including [[scimitarbill]]s), [[hornbill]]s, [[ground hornbill]]s, and other birds in the taxonomic order [[Bucerotiformes]]", parents = {"birds"}, } labels["horseflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blind-fly|blind-flies]], [[breezefly|breezeflies]], [[cleg]]s, [[deerfly|deerflies]], [[forest fly|forest flies]], [[gadfly|gadflies]], [[horsefly|horseflies]], [[oxfly|oxflies]], [[zimb]]s, and other biting flies in the [[family]] [[Tabanidae]]", parents = {"dipterans"}, } labels["horse breeds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngựa"}, commonscat = true, wpcat = true, } labels["Ngựa"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Ngựa", "Gia súc"}, } labels["hummingbirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"apodiforms"}, } labels["Chó săn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó"}, } labels["hyaenids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["hydrozoans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bluebottle]]s, [[calycophoran]]s, [[filiferan]]s, [[hydra]]s, [[hydractinian]]s, [[leptothecate]]s, [[narcomedusa]]s, [[pandeid]]s, [[physonect]]s, [[plumularian]]s, [[Portuguese man-of-war]]s, [[siphonophore]]s, [[stylaster]]s, [[sea fir]]s, [[sea ginger]], [[trachylid]]s, [[trachymedusa]]s, amd other animals in the [[cnidarian]] [[class]] [[Hydrozoa]]", parents = {"cnidarians"}, } labels["hymenopterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ant]]s, [[bee]]s, [[ichneumon wasp]]s, [[sawfly|sawflies]], [[wasp]]s and other [[insect]]s in the order [[Hymenoptera]]", parents = {"insects"}, } labels["hyraxes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["ibises and spoonbills"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ibis]]es and [[spoonbill]]s", parents = {"Chim nước"}, } labels["ichthyosauromorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ichthyosaurs]] and related groups of [[extinct]] [[aquatic]] [[reptile]]s in the [[clade]] [[Ichthyosauromorpha]]", parents = {"reptiles"}, } labels["icterids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[New World]] [[passerine]] family [[Icteridae]]", parents = {"perching birds"}, } labels["iguanoid lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anole]]s, [[basilisk]]s, [[collared lizard]]s, [[chuckwalla]]s, [[fence lizard]]s, [[fringe-toed lizard]]s, [[horned lizard]]s, [[iguana]]s, [[leopard lizard]]s, [[side-blotched lizard]]s, [[zebra-tailed lizard]]s and other [[lizard]]s formerly included in the [[family]] [[Iguanidae]], and now mostly treated as comprising either the [[infraorder]] [[Pleurodonta]] or the [[superfamily]] [[Iguanoidea]]", parents = {"lizards"}, } labels["Lớp Côn trùng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Chân đốt"}, } labels["isopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gribble]]s, [[pillbug]]s, [[salve bug]]s, [[slater]]s, [[sea slater]]s, [[sowbug]]s, [[woodlouse|woodlice]], and other [[crustacean]]s in the [[order]] [[Isopoda]]", parents = {"Phân ngành Giáp xác"}, } labels["jackfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[jack]]s, [[pompano]]s, [[jack mackerel]]s, [[scad]]s and other fish in the family [[Carangidae]]", parents = {"percoid fish"}, } labels["jawless fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[lamprey]]s and [[hagfish]]: primitive eel-like fishes that have no jaws", parents = {"fish"}, } labels["kingfishers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"coraciiforms"}, } labels["kites (birds)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hawk]]s in the [[accipitrid]] [[subfamily|subfamilies]] [[Milvinae]] and [[Elaninae]], as well as some in the subfamily [[Perninae]]", parents = {"birds of prey"}, } labels["kyphosid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blackfish]], [[drummer]]s, [[footballer]]s, [[greenfish]], [[halfmoon]]s, [[luderick]]s, [[mado]]s, [[moonlighter]]s, [[nibbler]]s, [[opaleye]]s, [[sea chub]]s, [[stripey]]s, [[sweep]]s and other fish in the [[percoid]] [[family]] [[Kyphosidae]]", parents = {"percoid fish"}, } labels["labroid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anemonefish]], [[cale]]s, [[cichlid]]s, [[clownfish]], [[damselfish]], [[parrotfish]], [[surfperch]], [[wrasse]]s, and other fish in the [[perciform]] [[suborder]] [[Labroidei]]", parents = {"fish"}, } labels["labyrinth fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[climbing perch]], [[gourami]]s, [[paradisefish]], [[Siamese fighting fish]] and other fish in the [[suborder]] [[Anabantoidei]]", parents = {"fish"}, } labels["lacertoid lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphisbaena]]s, [[caiman lizard]]s, [[green lizard]]s, [[ocellated lizard]]s, [[racerunner]]s, [[rock lizard]]s, [[tegu]]s, [[teiid]]s, [[thunderworm]]s, [[viviparous lizard]]s, [[wall lizard]]s, [[whiptail]]s, and other [[lizard]]s in the [[superfamily]] [[Lacertoidea]]", parents = {"lizards"}, } labels["Bộ Thỏ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, } labels["lamniform sharks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[basking shark]]s, [[goblin shark]]s, [[great white shark]]s, [[mako shark]]s, [[megamouth shark]]s, [[porbeagle]]s, [[sand shark]]s, [[thresher shark]]s, and other [[shark]]s in the [[order]] [[Lamniformes]]", parents = {"Liên bộ Cá mập"}, } labels["lampriform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crestfish]], [[oarfish]], [[opah]]s, [[ribbonfish]], [[velifer]]s and other fish in the [[order]] [[Lampridiformes]] (not to be confused with the unrelated [[lamprey]]s)", parents = {"fish"}, } labels["larks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds"}, } labels["laughingthrushes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Leiothrichidae]]", parents = {"perching birds"}, } labels["leaf warblers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the family [[Phylloscopidae]]", parents = {"warblers"}, } labels["lesser apes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gibbon]]s (including [[hoolock]]s, [[lar gibbon]]s [[wow-wow]]s, etc.) and [[siamang]]s, comprising the [[family]] [[Hylobatidae]], which is closely related to the [[hominid]]s", parents = {"Bộ Linh trưởng"}, } labels["Cá Leuciscine"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bream]]s, [[chub]]s, [[dace]]s, [[ide]]s, many [[minnow]]s, [[nase]]s, [[roach]]es, [[shiner]]s, [[ziege]]s, and other fish in the [[cyprinid]] [[subfamily]] [[Leuciscinae]], sometimes treated as the [[family]] [[Leuciscidae]], or as the [[tribe]] [[Leuciscini]] within the [[subfamily]] [[Cyprininae]]", parents = {"Họ Cá chép"}, } labels["libellulid dragonflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amberwing]]s, [[basker]]s, [[darter]]s, [[dropwing]]s, [[duskhawk]]s, [[flutterer]]s, [[glider]]s, [[meadowhawk]]s, [[pennant]]s, [[percher]]s, [[skimmer]]s, [[slimwing]]s, [[swampdragon]]s, [[twister]]s, and other [[dragonfly|dragonflies]] in the [[family]] [[Libellulidae]]", parents = {"dragonflies and damselflies"}, } labels["lice"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[parasitic]] insects in the [[order]] [[Psocodea]]", parents = {"insects"}, } labels["limenitidine butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[admiral]]s, [[clipper]]s, [[count]]s, [[duke]]s, [[purple]]s, [[sister]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Limenitidinae]]", parents = {"nymphalid butterflies"}, } labels["littorinimorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[boat shell]]s, [[carrier shell]]s, [[conch]]s, [[cowry|cowries]], [[flamingo tongue]]s, [[helmet shell]]s, [[moon snail]]s, [[pebblesnail]]s, [[trumpet shell]]s, [[velutinid]]s, [[winkle]]s, [[worm-shell]]s, and other [[gastropod]]s in the [[order]] [[Littorinimorpha]]", parents = {"Lớp Chân bụng"}, } labels["livestock guardian dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"pastoral dogs"}, } labels["lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["loaches"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[cypriniform]] [[superfamily]] [[Cobitoidea]]", parents = {"fish", "Otomorpha"}, } labels["lobe-finned fishes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[coelacanth]]s, [[lungfish]] and other fishes in the [[subclass]] [[Sarcopterygii]] of the [[bony fish]]es", additional = "<u>Please note</u>: although the [[tetrapod]]s (including all [[reptile]]s, [[amphibian]]s, [[bird]]s and [[mammal]]s) are descended from within this group, they are excluded from this category by not being fish.", parents = {"fish"}, } labels["loons"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[loon]]s, birds known as [[diver]]s outside the US", parents = {"Chim nước"}, } labels["macaques"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[Barbary ape]]s, [[bonnet monkey]]s, [[crab-eating macaque]]s, [[Japanese macaque]]s, [[moor macaque]]s, [[pigtail macaque]]s, [[rhesus monkey]]s, [[toque]]s, and other [[Old World monkey]]s in the [[genus]] ''[[Macaca]]''", parents = {"Old World monkeys"}, } labels["macropods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bettong]]s, [[kangaroo]]s, [[pademelon]]s, [[potoroo]]s, [[quokka]]s, [[wallaby]]s, and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Macropodiformes]]", parents = {"marsupials"}, } labels["malaconotoid birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[Australian magpie]]s, [[bushshrike]]s, [[butcherbird]]s, [[boubou]]s, [[brubru]]s, [[currawong]]s, [[gonolek]]s, [[squeaker]]s, [[vanga]]s, and other birds in the [[passerine]] [[superfamily]] [[Malaconotoidea]]", parents = {"perching birds"}, } labels["male animals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals", "male"}, } labels["Lớp Thú"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, } labels["mantids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the [[order]] [[Mantodea]], often known as [[praying mantis]]es", parents = {"insects"}, } labels["marsupials"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["mayflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the [[order]] [[Ephemeroptera]]", parents = {"insects"}, } labels["megalopterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[alderfly|alderflies]], [[dobsonfly|dobsonflies]], [[fishfly|fishflies]] and other insects in the [[order]] [[Megaloptera]]", parents = {"insects"}, } labels["meliphagoid birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue wren]]s, [[bristlebird]]s, [[emu-wren]]s, [[fairywren]]s, [[gerygone]]s, [[grasswren]]s, [[honeyeater]]s, [[pardalote]]s, [[pilotbird]]s, [[redthroat]]s, [[scrubwren]]s, [[thornbill]]s, [[weebill]]s, [[whiteface]]s, and other birds in the [[passerine]] [[superfamily]] [[Meliphagoidea]]", parents = {"perching birds"}, } labels["mephitids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mephitid]]s: skunks and stink badgers", parents = {"Bộ Ăn thịt"}, } labels["Mergus"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[diving]] [[duck]]s in the [[genus]] ''[[Mergus]]'' and a few similar species", parents = {"Vịt"}, wpcat = true, } labels["mimids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[catbird]]s, [[mockingbird]]s, [[thrasher]]s and other birds in the [[passerine]] family [[Mimidae]]", parents = {"perching birds"}, } labels["mites and ticks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[arachnid]]s in the [[subclass]] [[Acari]]", parents = {"arachnids"}, } labels["Ngành Thân mềm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Động vật"}, commonscat = "Mollusca", wpcat = true, wp = "Động vật thân mềm", } labels["Khỉ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Linh trưởng"}, } labels["Bộ Đơn huyệt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, } labels["mosquitoes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[dipteran]] [[family]] [[Culicidae]]", parents = {"culicomorphs"}, } labels["moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"insects"}, } labels["murids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=a number of [[rats]], [[mice]], and other [[rodent]]s in the [[Old World]] [[family]] [[Muridae]]", parents = {"Bộ Gặm nhấm"}, } labels["muscicapids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] family [[Muscicapidae]]", parents = {"perching birds"}, } labels["muscoid flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anthomyiid]]s such as [[root fly|root flies]], [[cabbage fly|cabbage flies]] and [[onion fly|onion flies]]; [[fanniid]]s; [[muscid]]s such as [[housefly|houseflies]], [[face fly|face flies]] and [[stable fly|stable flies]]; [[scathophagid]]s such as [[dungfly|dungflies]]; and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Muscoidea]]", parents = {"dipterans"}, } labels["Họ Chồn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["mygalomorph spiders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[baboon spider]]s, [[barking spider]]s, [[bird spider]]s, [[purseweb spider]]s, [[tarantula]]s, [[trapdoor spider]]s, and other [[spider]]s in the [[infraorder]] [[Mygalomorphae]]", parents = {"spiders"}, } labels["myriapods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[centipede]]s, [[millipede]]s, [[pauropod]]s, [[symphylan]]s, and other [[arthropod]]s in the [[subphylum]] [[Myriapoda]]", parents = {"arthropods"}, } labels["myrmicine ants"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ant]]s in the [[subfamily]] [[Myrmicinae]]", parents = {"ants"}, } labels["nematodes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[filaria]], [[gapeworm]]s, [[lungworm]]s, [[pinworm]]s, [[threadworm]]s, [[wheatworm]]s, [[whipworm]]s and other [[worm]]s in the [[phylum]] [[Nematoda]]", parents = {"worms"}, } labels["Neogastropoda"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[admiral shell]]s, [[cone snail]]s, [[harp shell]]s, [[murex]]es, [[olive]]s, [[rhombus]]es, [[spindle]]s, [[tulip shell]]s, [[turnip shell]]s, [[volute]]s, [[whelk]]s, [[winkle]]s and other [[gastropod]]s in the [[clade]] [[Neogastropoda]] (treated as an [[order]] in some classifications)", parents = {"Lớp Chân bụng"}, } labels["New World monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[capuchin]]s, [[howler monkey]]s, [[marmochủ đề thuộc nhóm tập hợp]]s, [[night monkey]]s, [[saki]]s, [[spider monkey]]s, [[squirrel monkey]]s, [[tamarin]]s, [[titi]]s, [[uakari]]s, [[woolly monkey]]s, and other [[monkey]]s in the [[parvorder]] [[Platyrrhini]]", parents = {"Khỉ"}, } labels["Họ Cút Tân thế giới"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Odontophoridae]], most of which live in the [[New World]] and are known as [[quail]]s, but the family also includes the African [[genus]] ''[[Ptilopachus]]'' and some [[species]] are known as partridges", parents = {"Bộ Gà"}, } labels["New World sparrows"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sparrow]]- and [[finch]]-like birds in the [[passerine]] [[family]] [[Passerellidae]], until recently considered part of the family [[Emberizidae]]", parents = {"perching birds"}, } labels["New World warblers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the family [[Parulidae]]", parents = {"warblers"}, } labels["neuropterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[antlion]]s, [[lacewing]]s, [[mantisfly|mantisflies]], [[owlfly|owlflies]] and other insects in the [[order]] [[Neuroptera]]", parents = {"insects"}, } labels["newts"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[terrestrial]] [[salamander]]s in the [[subfamily]] [[Pleurodelinae]]", parents = {"salamanders"}, } labels["noctuoid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[armyworm]]s, [[cinnabar]]s, [[corn earworm]]s, [[cutworm]]s, [[gypsy moth]]s, [[owlet moth]]s, [[processionary|processionaries]], [[tiger moth]]s, [[underwing]]s, [[wainscot]]s, [[wooly bear]]s, and many other [[moth]]s (and [[caterpillar]]s) in the [[superfamily]] [[Noctuoidea]]", parents = {"moths"}, } labels["nudibranchs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sea slug]]s in the [[gastropod]] [[order]] [[Nudibranchia]]", parents = {"Lớp Chân bụng"}, } labels["nymphalid butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[admiral]]s, [[brown]]s, [[buckeye]]s, [[checkerspot]]s, [[emperor]]s, [[fritillary|fritillaries]], [[leafwing]]s, [[longwing]]s, [[monarch]]s, [[morpho]]s, [[painted lady|painted ladies]], [[ringlet]]s, [[satyr]]s, [[sister]]s, [[snout]]s, [[tortoiseshell]]s, and other butterflies in the [[family]] [[Nymphalidae]]", parents = {"Bướm ngày"}, } labels["octopuses"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"cephalopods"}, } labels["Bộ Guốc lẻ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Perissodactyla]], including the [[equid]]s, [[tapir]]s and [[rhinoceros]]es", parents = {"Lớp Thú"}, } labels["oestroid flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blowfly|blowflies]], [[bluebottle]]s, [[botfly|botflies]], [[flesh fly|flesh fles]], [[greenbottle]]s, [[mango fly|mango flies]], [[screwworm]]s, [[tachinid]]s, [[torsalo]]s, [[tumbu fly|tumbu flies]], [[warble fly|warble flies]], and other flies in the [[superfamily]] [[Oestroidea]]", parents = {"dipterans"}, } labels["Old World monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[baboon]]s, [[colobus]], [[douc]]s, [[gelada]]s, [[green monkey]]s, [[grivet]]s, [[langur]]s, [[malbrouck]]s, [[mandrill]]s, [[mangabey]]s, [[patas monkey]]s, [[proboscis monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[monkeys]] in the [[family]] [[Cercopithecidae]], the only [[members]] of the [[parvorder]] [[Catarrhini]] aside from the greater/lesser apes and humans", parents = {"Khỉ"}, } labels["Old World orioles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[perching bird]]s in the [[family]] [[Oriolidae]], which are not closely related to the New World orioles in the family [[Icteridae]]", parents = {"perching birds"}, } labels["ornithopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[camptosaurid]]s, [[hadrosaur]]s, [[iguanodontid]]s, [[lambeosaurid]]s, [[rhabdodontid]]s, [[saurolophid]]s, [[thescelosaurid]]s, [[trachodontid]]s, and other [[dinosaur]]s in the [[ornithischian]] [[clade]] [[Ornithopoda]]", parents = {"dinosaurs"}, } labels["osteoglossomorph fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aba]]s, [[arapaima]]s, [[arowana]]s, [[butterfly fish]], [[elephantfish]], [[featherback]]s, [[mooneye]]s and other fish in the [[superorder]] [[Osteoglossomorpha]]", parents = {"fish"}, } labels["Otariidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[family]] [[Otariidae]], including the [[fur seal]]s and [[sea lion]]s", parents = {"Pinnipedia"}, } labels["otidimorph birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bustard]]s in the [[family]] [[Otididae]] and [[order]] [[Otidiformes]]; [[turaco]]s or [[lourie]]s, [[go-away bird]]s, [[plantain-eater]]s, etc., in the [[family]] [[Musophagidae]] and [[order]] [[Musophagiformes]]; and [[cuckoo]]s in the [[family]] [[Cuculidae]] and [[order]] [[Cuculiformes]]; all in the [[clade]] [[Otidimorphae]]", parents = {"birds"}, } labels["Otomorpha"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anchovy|anchovies]], [[beaked salmon]], [[carp]], [[catfish]], [[characin]]s, [[electric eel]]s, [[ghost knifefish]], [[herring]]s, [[loach]]es, [[milkfish]], [[minnow]]s, [[mousefish]], [[slickhead]]s, [[sucker]]s, [[tubeshoulder]]s, and other fish in the [[clade]] [[Otocephala]]", parents = {"Cá"}, } labels["ovenbirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[suboscine]] family [[Furnariidae]], including the former family Dendrocolaptidae (now the [[subfamily]] [[Dendrocolaptinae]])", parents = {"suboscines"}, } labels["Bộ Cú"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim săn mồi"}, } labels["pangolins"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Pholidota]]", parents = {"mammals"}, } labels["Chi Báo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[panther]]s in the sense of members of the genus ''[[Panthera]]''", parents = {"Họ Mèo"}, } labels["parrots"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"birds"}, } labels["pastoral dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, } labels["chim cánh cụt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Chim"}, } labels["pentatomoid bugs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[acanthosomatid]]s, [[burrowing bug]]s, [[jewel bug]]s, [[shield bug]]s, [[stinkbug]]s, [[thyreocorid]]s, and other [[true bug]]s in the [[superfamily]] [[Pentatomoidea]]", parents = {"true bugs"}, } labels["perch and darters"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Percidae]]", parents = {"percoid fish"}, } labels["Bộ Sẻ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[passerine]]s or perching birds: members of the order [[Passeriformes]]", parents = {"Lớp Chim"}, } labels["percoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[archerfish]], [[bass]], [[bigeye]]s, [[bluefish]], [[butterflyfish]], [[cardinalfish]], [[cobia]], [[croaker]]s, [[flagtail]]s, [[goatfish]], [[grouper]]s, [[grunt]]s, [[horse mackerel]], [[jack]]s, [[jawfish]], [[leaffish]], [[mahi-mahi]], [[mojarra]], [[perch]], [[pomfret]]s, [[pompano]], [[ponyfish]], [[porgy|porgies]], [[remora]]s, [[roosterfish]], [[sea bass]], [[sea bream]], [[snapper]], [[sunfish]], [[sweeper]]s, [[threadfin]], [[tilefish]], [[wreckfish]], and other [[perciform]] fish in the [[superfamily]] [[Percoidea]]", parents = {"fish"}, } labels["Phiomorpha"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blesmol]]s, [[sand mole]]s, [[mole rat]]s, [[dassie rat]]s or [[rock rat]]s, [[Old World porcupine]]s, [[cane rat]]s or [[grasscutter]]s and other [[rodent]]s in the parvorder [[Phiomorpha]], which is the Old World counterpart of the [[caviomorph]]s", parents = {"Bộ Gặm nhấm"}, } labels["Họ Hải cẩu thật sự"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[family]] [[Phocidae]], including the [[earless seal]]s (also known as [[true seal]]s)", parents = {"Pinnipedia"}, } labels["piciforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[woodpecker]]s, [[aracari]]s, [[coppersmith]]s, [[honeyguide]]s, [[jacamar]]s, [[nunlet]]s, [[puffbird]]s, [[toucan]]s, and other birds in the [[order]] [[Piciformes]]", parents = {"birds"}, } labels["pierid butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[brimstone]]s, [[orange tip]]s, [[sulfur]]s, [[white]]s and other [[butterfly|butterflies]] in the [[family]] [[Pieridae]]", parents = {"Bướm ngày"}, } labels["lợn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn", "Gia súc"}, commonscat = "Suidae", wpcat = true, } labels["pikes (fish)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Esocidae]]", parents = {"fish"}, } labels["Pinnipedia"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["pipits and wagtails"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] family [[Motacillidae]]", parents = {"perching birds"}, } labels["placoderms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[extinct]] armored fish of the [[class]] [[Placodermi]] from the [[Silurian]] and [[Devonian]] [[geologic]] [[period]]s", parents = {"fish"}, } labels["plovers and lapwings"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[charadriiform]] [[family]] [[Charadriidae]]", parents = {"shorebirds"}, } labels["pomfrets"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Bramidae]]", parents = {"percoid fish"}, } labels["Bộ Linh trưởng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, commonscat = "Primates", wpcat = true, } labels["procyonids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[procyonid]]s: ([[raccoon]]s, [[coati]]s, [[kinkajou]]s, [[olingo]]s, [[ringtail]]s and [[cacomistle]]s)", parents = {"Bộ Ăn thịt"}, } labels["prosimians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Linh trưởng"}, } labels["pterosaurs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["pyraloid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bee moth]]s, [[flour moth]]s, [[leaf crumpler]]s, [[magpie moth]]s, [[melonworm]]s, [[mint moth]]s, [[orangeworm]]s, [[pantry moth]]s, [[pickleworm]]s, [[snout moth]]s, [[veneer moth]]s, [[wax moth]]s and other [[crambid]] and [[pyralid]] [[moths]] in the [[superfamily]] [[Pyraloidea]]", parents = {"moths"}, } labels["Thỏ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Thỏ"}, } labels["rallids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[rallid]]s: [[rail]]s and other birds in the family [[Rallidae]]", parents = {"gruiforms"}, } labels["ratites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ratite]]s: birds in the superorder [[Palaeognathae]], including large flightless birds such as [[ostrich]]es, and [[emu]]s, as well as the smaller [[kiwi]]s and [[flighted]] [[tinamous]]", parents = {"birds"}, } labels["rays and skates"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fish]] in the superorder [[Batoidea]]", parents = {"fish"}, } labels["reindeers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Hươu nai"}, } labels["Lớp Bò sát"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Reptilia", wpcat = true, } labels["retrievers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"gun dogs"}, } labels["rhinoceroses"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[rhinoceros]]es, [[mammal]]s in the [[perissodactylic]] [[family]] [[Rhinocerotidae]]", parents = {"odd-toed ungulates"}, } labels["Bộ Gặm nhấm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, } labels["salamanders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphiuma]]s, [[axolotl]]s, [[hellbender]]s, [[mud puppy|mud puppies]], [[olm]]s, [[newt]]s, [[salamander]]s, [[siren]]s, and other [[amphibian]]s in the [[order]] [[Caudata]]", parents = {"amphibians"}, } labels["Họ Cá hồi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[salmon]]s, [[trout]], and other fish in the family [[Salmonidae]]", parents = {"Cá"}, } labels["saturniid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[Atlas moth]]s, [[cecropia]]s, [[hickory horned devil]]s, [[io moth]]s, [[luna moth]]s, [[polyphemus moth]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Saturniidae]]", parents = {"moths"}, } labels["satyrine butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[brown]]s, [[forester]]s, [[grayling]]s, [[heath]]s, [[palmfly|palmflies]], [[ringlet]]s, [[satyr]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Satyrinae]]", parents = {"nymphalid butterflies"}, } labels["sauropods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[apatosaur]]s, [[brachiosaur]]s, [[brontosaur]]s, [[camarasaur]]s, [[cetiosaur]]s, [[diplodocus]]es, [[saltasaurid]]s, [[titanosaurian]]s, [[turiasaur]]s, [[vulcanodontid]]s, and other [[dinosaurs]] in the [[saurischian]] [[infraorder]] [[Sauropoda]]", parents = {"dinosaurs"}, } labels["sauropterygians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[elasmosaur]]s, [[placodont]]s, [[plesiosaur]]s, and other extinct aquatic [[reptile]]s in the [[superorder]] [[Sauropterygia]]", parents = {"reptiles"}, } labels["sawflies and wood wasps"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[horntail]]s, [[pigeon tremex]], [[rose slug]]s, [[sawfly|sawflies]], [[wood wasp]]s, and other primitive [[hymenopteran]]s in the [[suborder]] [[Symphyta]]", parents = {"hymenopterans"}, } labels["scale insects"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[superfamily]] [[Coccoidea]]", parents = {"hemipterans"}, } labels["scarabaeoids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cockchafer]]s, [[dor]]s, [[dung beetle]]s, [[June beetle]]s, [[rain beetle]]s, [[rose chafer]]s, [[scarab]]s, [[stag beetle]]s, and other beetles in the [[superfamily]] [[Scarabaeoidea]]", parents = {"beetles"}, } labels["scenthounds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["scincomorph lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue-tongue lizard]]s, [[night lizard]]s, [[sandfish]], [[skink]]s, [[sungazer]]s, and other [[lizard]]s in the [[infraorder]] [[Scincomorpha]]", parents = {"lizards"}, } labels["scolopacids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[curlew]]s, [[dunlin]]s, [[godwit]]s, [[knot]]s, [[redshank]]s, [[ruff]]s, [[sandpiper]]s, [[snipe]]s, [[stint]]s, [[turnstone]]s, [[tattler]]s, [[whimbrel]]s, [[woodcock]]s, [[yellowleg]]s, and other birds in the [[charadriiform]] [[family]] [[Scolopacidae]]", parents = {"shorebirds"}, } labels["Họ Cá thu ngừ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mackerel]]s, [[tuna]]s, [[barracuda]]s, [[swordfish]], and other fish in the suborder [[Scombroidei]]", parents = {"Cá"}, } labels["scorpaeniform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bullhead]]s, [[cabezon]], [[golomyanka]], [[greenling]]s, [[gurnard]]s, [[Irish lord]], [[lionfish]], [[lumpsucker]]s, [[pigfish]], [[poacher]]s, [[sablefish]], [[scorpionfish]], [[sculpin]]s, [[sea raven]]s, [[sea toad]]s, [[skilfish]], [[snailfish]], [[stonefish]], [[wingfish]], and other fish in the [[order]] [[Scorpaeniformes]]", parents = {"fish"}, } labels["scorpions"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=true [[scorpion]]s: [[arachnid]]s in the [[order]] [[Scorpiones]]", parents = {"arachnids"}, } labels["screamers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[screamer]]s: birds in the family [[Anhimidae]], related to [[duck]]s and [[geese]]", parents = {"birds"}, } labels["Chim biển"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Chim"}, } labels["sea anemones"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cnidarian]]s in the [[order]] [[Actiniaria]]", parents = {"cnidarians"}, } labels["sea cucumbers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[echinoderm]]s in the [[class]] [[Holothuroidea]]", parents = {"echinoderms"}, } labels["sea urchins"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[echinoderm]]s in the [[class]] [[Echinoidea]], including the [[sand dollar]]s", parents = {"echinoderms"}, } labels["sea turtles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[flatback]]s, [[green turtle]]s, [[hawksbill]]s, [[leatherback]]s, [[loggerhead]]s, [[ridley]]s, and other [[turtle]]s in the [[superfamily]] [[Chelonioidea]]", parents = {"turtles"}, } labels["sebastids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Sebastidae]]", parents = {"scorpaeniform fish"}, } labels["serranids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sea bass]], [[grouper]]s, [[rockcod]]s, [[comber]]s and other fish in the family [[Serranidae]]", parents = {"percoid fish"}, } labels["Liên bộ Cá mập"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Cá"}, } labels["Cừu"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Caprinae", "Gia súc"}, } labels["shorebirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"birds"}, } labels["shrikes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds", "corvoid birds"}, } labels["sighthounds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["skippers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the family [[Hesperiidae]]", parents = {"Bướm ngày"}, } labels["smelts"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[order]] [[Osmeriformes]]", parents = {"fish"}, } labels["snails"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Chân bụng"}, } labels["snakes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["snappers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[family]] [[Lutjanidae]]", parents = {"percoid fish"}, } labels["soft corals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[calcaxonian]]s, [[dead man's fingers]], [[fan coral]]s, [[gorgonian]]s, [[holaxonian]]s, [[scleraxonian]]s, [[sea feather]]s, [[sea willow]]s, [[stoloniferan]]s, [[whip coral]]s, and other marine animals in the [[cnidarian]] order [[Alcyonacea]]", parents = {"cnidarians"}, } labels["soricomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[shrew]]s, [[mole]]s, [[solenodon]]s, and other [[mammal]]s in the [[order]] [[Soricomorpha]]", parents = {"mammals"}, } labels["South American canids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fox-like [[canid]]s in the [[subtribe]] [[Cerdocyonina]], which are more closely related to the [[dog]]s and [[wolf|wolves]] than to the true [[fox]]es. Also known as [[zorro]]s", parents = {"Họ Chó"}, } labels["spaniels"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"gun dogs"}, } labels["sparids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sea breams]], [[porgie]]s, [[scup]]s and other fish in the family [[Sparidae]]", parents = {"percoid fish"}, } labels["sphinx moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hawkmoth]]s, [[hornworm]]s, [[hummingbird moth]]s, [[sphinx moth]]s,[[tomato worm]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Sphingidae]]", parents = {"moths"}, } labels["Nhện"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Hình nhện"}, } labels["sponges"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aquatic]] [[animal]]s in the [[phylum]] [[Porifera]]", parents = {"animals"}, } labels["squid"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"cephalopods"}, } labels["Họ Sóc"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[squirrel]]s, [[chipmunk]]s, [[marmot]]s, [[prairie dog]]s, [[woodchuck]]s and other [[rodent]]s in the family [[Sciuridae]]", parents = {"Bộ Gặm nhấm"}, } labels["staphylinoid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[beetle]]s in the [[superfamily]] [[Staphylinoidea]]", parents = {"beetles"}, } labels["starlings"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[starling]]s, [[mynah]]s, and other birds in the [[passerine]] family [[Sturnidae]]", parents = {"perching birds"}, } labels["stick insects"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s (including the [[leaf insect]]s) in the [[order]] known as either [[Phasmida]] or [[Phasmatodea]], which are noted for their extreme adaptations in form and color to look like parts of the plants they feed on", parents = {"insects"}, } labels["stoneflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[freshwater]] [[aquatic]] [[insect]]s in the [[order]] [[Plecoptera]]", parents = {"insects"}, } labels["stony corals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=marine animals in the [[cnidarian]] order [[Scleractinia]]", parents = {"cnidarians"}, } labels["storks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim nước"}, } labels["stromateoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[barrelfish]], [[blue eye cod]], [[dollarfish]], [[driftfish]], [[lafayette]], [[medusafish]], [[rudderfish]], [[squaretail]], [[warehou]], and other fish in the [[perciform]] [[suborder]] [[Stromateoidei]]", parents = {"fish"}, } labels["sturgeons"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Acipenseridae]]", parents = {"fish"}, } labels["suboscines"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[antpitta]]s, [[antshrike]]s, [[antthrush]]es, [[asity|asities]], [[broadbill]]s, [[cotinga]]s, [[crescentchest]]s, [[gnateater]]s, [[manakin]]s, [[ovenbird]]s, [[pitta]]s, [[sharpbill]]s, [[spadebill]]s, [[tapaculo]]s, [[tityra]]s, [[tyrant flycatcher]]s, [[woodcreeper]]s, and other birds in the [[passerine]] [[suborder]] [[Tyranni]]", parents = {"perching birds"}, } labels["suckers (fish)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[buffalo fish]], [[cuiui]], [[jumprock]]s, [[quillback]], [[redhorse]], [[sucker]]s, and other freshwater fish in the family [[Catostomidae]]", parents = {"fish", "Otomorpha"}, } labels["suliform birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anhinga]]s, [[booby|boobies]], [[cormorant]]s, [[frigatebird]]s, [[gannet]]s, and other [[seabirds]] in the [[order]] [[Suliformes]]", parents = {"seabirds"}, } labels["sunfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=freshwater fish in the family [[Centrarchidae]]", parents = {"percoid fish"}, } labels["swallows"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds"}, } labels["swallowtails"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[apollo]]s, [[batwing]]s, [[birdwing]]s, [[clubtail]]s, [[festoon]]s, [[flying handkerchief]]s, [[Helen]]s, [[jay]]s, [[mime]]s, [[parnassian]]s, [[rose]]s, [[swallowtail]]s, [[swordtail]]s, [[triangle]]s, [[turnus]]es, [[windmill]]s, [[zebra]]s, and other [[butterfly|butterflies]] in the [[family]] [[Papilionidae]], notable for (mostly) having tail-like extensions on their [[hindwing]]s", parents = {"Bướm ngày"}, } labels["Chi Thiên nga"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Vịt"}, } labels["syngnathiform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bellowsfish]], [[cornetfish]], [[pipefish]], [[razorfish]], [[sea dragon]]s, [[sea horse]]s, [[snipefish]], [[trumpetfish]], and other fish in the [[order]] [[Syngnathiformes]]", parents = {"fish"}, } labels["Thraupidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bananaquit]]s, [[conebill]]s, [[dacnis]]es, [[Darwin's finch]]es, [[grassquit]]s, [[ground finch]]es, [[honeycreeper]]s, [[pardusco]]s, [[tanager]]s, and other [[passerine]] birds in the family [[Thraupidae]]", parents = {"Bộ Sẻ"}, } labels["temnospondyls"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[extinct]] early [[amphibian]]s in the [[order]] [[Temnospondyli]]", parents = {"amphibians"}, } labels["tenebrionoid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aderid]]s, [[anthicid]]s, [[blister beetle]]s, [[borid]]s, [[ciid]]s, [[flour beetle]]s, [[darkling beetle]]s, [[mealworm]]s, [[melandryid]]s, [[mordellid]]s, [[mycetophagid]]s, [[oedemerid]]s, [[pinacate beetle]]s, [[pyrochroid]]s, [[pythid]]s, [[ripiphorid]]s, [[salpingid]]s, [[toktokkie]]s, [[ulodid]]s, [[wharf borer]]s, [[zopherid]]s and other [[beetle]]s in the [[superfamily]] [[Tenebrionoidea]]", parents = {"beetles"}, } labels["tephritoid flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cheese fly|cheese flies]], [[tephritid]] [[fruit fly|fruit flies]], [[picture-winged fly|picture-winged flies]] and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Tephritoidea]]", parents = {"dipterans"}, } labels["termites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[termite]]s, [[insect]]s in the former [[order]] [[Isoptera]], which is now considered a [[suborder]] or other group within the [[cockroach]]es in the order [[Blattodea]]", parents = {"insects", "cockroaches"}, } labels["terns"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[tern]]s, [[seabirds]] in the [[family]] [[Sternidae]]", parents = {"seabirds"}, } labels["tetraodontiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[pufferfish]], [[triggerfish]], [[boxfish]], [[ocean sunfish]] and other fish in the order [[Tetraodontiformes]]", parents = {"fish"}, } labels["Chó sục"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["theropods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[dinosaur]]s in the [[clade]] [[Theropoda]]", parents = {"dinosaurs"}, } labels["thrushes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds"}, } labels["ticks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bloodsucking]] [[arachnids]] in the [[order]] [[Ixodida]] (also known as [[Metastigmata]])", parents = {"mites and ticks"}, } labels["tinamous"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"ratites"}, } labels["tits"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[tit]]s, birds known as [[chickadee]]s in the US", parents = {"perching birds"}, } labels["toads"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Anuran"}, } labels["toothcarps"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[four-eyed fish]], [[guppy|guppies]], [[killifish]], [[molly|mollies]], [[mummichog]]s, [[platy|platies]], [[swordtail]]s, [[topminnow]]s and other fish in the [[order]] [[Cyprinodontiformes]]", parents = {"fish"}, } labels["tortoises"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[terrestrial]] [[turtle]]s in the [[family]] [[Testudinidae]]", parents = {"turtles"}, } labels["tortricid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[moth]]s (and [[caterpillar]]s) in the [[family]] [[Tortricidae]]", parents = {"moths"}, } labels["trachinoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[black swallower]]s, [[blue cod]], [[duckbill]]s, [[gaper]]s, [[sand eel]]s, [[torrentfish]], [[weeverfish]] and other fish in the [[perciform]] [[suborder]] [[Trachinoidei]]", parents = {"fish"}, } labels["toy dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, } labels["trilobites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"arthropods"}, } labels["true bugs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[hemipteran]] suborder [[Heteroptera]]", parents = {"hemipterans"}, } labels["Họ Sẻ thông"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[finch]]es in the [[passerine]] family [[Fringillidae]]", parents = {"Bộ Sẻ"}, } labels["true jellyfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cnidarian]]s in the [[class]] [[Scyphozoa]]", parents = {"cnidarians"}, } labels["true sparrows"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[passerine]] birds in the family [[Passeridae]] (for other birds called sparrows, see the [[emberizid]]s)", parents = {"perching birds"}, } labels["tubenose birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[albatross]]es, [[fulmar]]s, [[petrel]]s, [[prion]]s, [[shearwater]]s, and other [[seabird]]s in the [[order]] [[Procellariiformes]]", parents = {"seabirds"}, } labels["tunicates"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals"}, } labels["turtles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["tyrant flycatchers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[passerine]] birds in the family [[Tyrannidae]]", parents = {"suboscines"}, } labels["ursids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ursid]]s ([[bear]]s)", parents = {"Bộ Ăn thịt"}, } labels["Venerida order mollusks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[basket clam]]s, [[bean clam]]s, [[boring clam]]s, [[cockle]]s, [[duck clam]]s, [[giant clam]]s, [[hard clam]]s, [[lentil shell]]s, [[pipi]]s, [[pooquaw]]s, [[quahog]]s, [[surf clam]]s, [[trough-shell]]s, [[ugari]]s, [[Venus clam]]s, [[zebra mussel]]s, and other [[bivalve]]s in the [[order]] [[Venerida]]", parents = {"bivalves"}, } labels["Phân ngành Có xương sống"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Dây sống"}, wpcat = true, commonscat = "Vertebrata", } labels["vespids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hornet]]s, [[paper wasp]]s, [[pollen wasp]]s, [[potter wasp]]s, [[yellow jacket]]s, and other [[wasp]]s in the [[family]] [[Vespidae]]", parents = {"hymenopterans"}, } labels["Vetigastropoda"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[abalone]]s or [[ear shell]]s, [[duck's-bill limpet]]s, [[keyhole limpet]]s, [[rosary shell]]s, [[slit-shell]]s, [[topshell]]s, [[turban shell]]s, and other [[gastropod]]s in the [[clade]] [[Vetigastropoda]] (treated in some classifications as an [[order]], in others as [[subclass]])", parents = {"Lớp Chân bụng"}, } labels["vipers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[adder]]s, [[asp]]s, [[rattlesnake]]s, [[viper]]s, [[water moccasin]]s and other [[venomous]] snakes in the [[Viperidae]]", parents = {"snakes"}, } labels["viverrids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[viverrid]]s ([[civet]]s, [[genet]]s and relatives)", parents = {"Bộ Ăn thịt"}, } labels["vombatiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[diprotodontid]]s, [[diprotodon]]s, [[phascolarctid]]s, [[koala]]s, [[vombatid]]s, [[wombat]]s, [[phascolome]]s, [[ilariid]]s, [[maradid]]s, [[palorchestid]]s, [[thylacoleonid]]s, [[marsupial lion]]s , [[wynyardiid]]s and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Vombatiformes]]", parents = {"marsupials"}, } labels["vultures"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[vulture]]s (both Old World and New World)", parents = {"birds of prey"}, } labels["warblers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[warbler]]s, various small [[passerine]] songbirds, especially of the families Sylviidae (Old World warblers) and Parulidae (New World warblers)", parents = {"perching birds"}, } labels["warren hounds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["water dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"retrievers"}, } labels["weaver finches"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[finch]]es in the family [[Estrildidae]]", parents = {"perching birds"}, } labels["weaverbirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[baya]]s, [[bishop]]s, [[fody|fodies]], [[malimbe]]s, [[quelea]]s, [[sakabula]]s, [[taha]]s, [[weaver]]s, and other birds in the [[family]] [[Ploceidae]]", parents = {"perching birds"}, } labels["weevils"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bill-beetle]]s, [[curculio]]s, [[grugru worm]]s, [[snout beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Curculionoidea]]", parents = {"beetles"}, } labels["whales"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"cetaceans"}, } labels["wolves"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[wolves]]", parents = {"Họ Chó"}, } labels["woodpeckers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[flicker]]s, [[sapsucker]]s, [[wryneck]]s, and other birds in the [[family]] [[Picidae]]", parents = {"piciforms"}, } labels["working dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, } labels["worms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals"}, } labels["wrasses"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Labridae]]", parents = {"labroid fish"}, } labels["Họ Tiêu liêu"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Liên họ Đuôi cứng"}, } labels["zoarcoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[butterfish]], [[eelpout]]s, [[guffer]]s, [[gunnel]]s, [[lumper]]s, [[prickleback]]s, [[prowfish]], [[wolf eel]]s and other fish in the [[perciform]] [[suborder]] [[Zoarcoidei]]", parents = {"fish"}, } labels["zygaenoid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[burnet moth]]s, [[forester]]s, [[hag moth]]s, [[limacodid]]s, [[megalopygid]]s, [[monkey slug]]s, [[puss moth]]s, [[saddleback caterpillar]]s, [[zygaenid]]s, and other [[moth]]s in the [[superfamily]] [[Zygaenoidea]]", parents = {"moths"}, } return labels kshxmow6pwwmjdi6w4xyw109z0k9iuz 2345076 2345057 2026-04-14T01:16:48Z Hiyuune 50834 2345076 Scribunto text/plain local labels = {} labels["Động vật"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Sinh vật"}, commonscat = "Animalia", wpcat = true, } labels["Acanthurus"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[surgeonfish]], [[light-horseman]], [[louvar]]s, [[scat]]s, [[rabbitfish]], [[Moorish idol]]s and other fish in the [[perciform]] [[suborder]] [[Acanthuroidei]]", parents = {"Cá"}, } labels["accentors"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Prunellidae]]", parents = {"Bộ Sẻ"}, } labels["accipiters"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[besra]]s, [[Cooper's hawk]]s, [[goshawk]]s, [[sharp-shinned hawk]]s, [[shikra]]s, [[sparrowhawk]]s, and other [[hawk]]s in the [[genus]] ''[[Accipiter]]''", parents = {"birds of prey"}, } labels["Bộ Cá tầm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[paddlefish]], [[sturgeon]]s and other fish in the [[order]] [[Acipenseriformes]]", parents = {"Cá"}, } labels["adephagan beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[diving beetle]]s, [[ground beetle]]s (including [[bombardier beetle]]s and [[tiger beetle]]s), [[whirligig beetle]]s and other [[beetle]]s in the [[suborder]] [[Adephaga]]", parents = {"beetles"}, } labels["African insectivores"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aardvark]]s, [[elephant shrew]]s, [[golden mole]]s, [[otter shrew]]s, [[tenrec]]s, and other [[mammal]]s in the [[clade]] [[Afroinsectiphilia]]", parents = {"mammals"}, } labels["agamid lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[agama]]s, [[bearded dragon]]s, [[flying dragon]]s, [[frilled lizard]]s, [[moloch]]s, [[spiny-tailed lizard]]s, [[stellion]]s and other [[lizard]]s in the [[family]] [[Agamidae]]", parents = {"lizards"}, } labels["alcelaphine antelopes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blesbuck]]s, [[bontebok]]s, [[bubal]]s, [[gnu]]s or [[wildebeest]], [[hartebeest]]s, [[hirola]], [[sassaby]]s, [[topi]]s, [[tetel]]s, and other [[antelopes]] in the [[subfamily]] [[Alcelaphinae]]", parents = {"antelopes"}, } labels["ammonites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[extinct]] [[cephalopod]]s in the [[subclass]] [[Ammonoidea]]", parents = {"cephalopods"}, } labels["Lớp Lưỡng cư"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Amphibia", wpcat = true, } labels["amphipods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[beach flea]]s, [[lawn shrimp]], [[scud]]s, [[side swimmer]]s, [[skeleton shrimp]], [[whale louse|whale lice]], and other [[crustacean]]s in the [[order]] [[Amphipoda]]", parents = {"Phân ngành Giáp xác"}, } labels["Họ Vịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[:w:vi:Họ Vịt|họ Vịt]]: ([[vịt]], [[ngỗng]] và [[thiên nga]])", parents = {"Chim nước"}, } labels["annelids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[earthworm]]s, [[leech]]es, [[ragworm]]s and many other [[segment]]ed [[worm]]s in the [[phylum]] [[Annelida]]", parents = {"worms"}, } labels["Bộ Cá vây chân"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[order]] [[Lophiiformes]]", parents = {"Cá"}, } labels["anguimorph lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[alligator lizard]]s, [[beaded lizard]]s, [[blindworm]]s, [[crocodile monitor]]s, [[galliwasp]]s, [[Gila monster]]s, [[glass lizard]]s, [[goanna]]s, [[Komodo dragon]]s, [[legless lizard]]s, [[nile monitor]]s, [[perentie]]s, [[sheltopusik]]s, [[water monitor]]s, and other [[lizards]] in the [[suborder]] [[Anguimorpha]]", parents = {"lizards"}, } labels["anomurans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=crablike [[crustacean]]s in the [[decapod]] [[infraorder]] [[Anomura]], which are closely related to the true [[crab]]s in the infraorder [[Brachyura]]", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["anteaters and sloths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Pilosa]]", parents = {"mammals"}, } labels["antelopes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn"}, } labels["antilopine antelopes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blackbuck]]s, [[chinkara]]s, [[dibatag]]s, [[dik-dik]]s, [[gazelle]]s, [[gerenuk]]s, [[grysbok]]s, [[klipspringer]]s, [[oribi]]s, [[royal antelope]]s, [[saiga]]s, [[springbok]]s, [[steenbok]]s, [[zeren]], and other [[antelope]]s in the [[bovid]] [[subfamily]] [[Antilopinae]]", parents = {"antelopes"}, } labels["ants"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"hymenopterans"}, } labels["antshrikes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"suboscines", "perching birds"}, } labels["Anuran"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphibian]]s in the [[order]] [[Anura]], which are short-bodied and without tails, having long hind legs adapted for leaping that are typically folded at rest. Anurans are mostly known as [[frog]]s or [[toad]]s", parents = {"Lớp Lưỡng cư"}, } labels["Aphid"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[superfamily]] [[Aphidoidea]]", parents = {"Bộ Cánh nửa"}, } labels["apodiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hummingbird]]s, [[needletail]]s, [[spinetail]]s, [[swift]]s, [[swiftlet]]s, [[treeswift]]s, and other [[bird]]s in the [[order]] [[Apodiformes]]", parents = {"birds"}, } labels["Lớp Hình nhện"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Chân đốt"}, } labels["araneoid spiders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bird dropping spider]]s, [[cobweb spiders]] (including [[black widow]]s and [[redback]]s), [[orbweaver]]s (including [[cross spider]]s and [[writing spider]]s), [[long-jawed spider]]s, [[money spider]]s, [[nesticid]]s, [[pimoid]], [[pirate spider]]s, [[tetragnathid]]s and other [[spider]]s in the [[superfamily]] [[Araneoidea]]", parents = {"spiders"}, } labels["argentiniform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[argentine]]s, [[barreleye]]s, [[blacksmelt]]s, [[smoothtongue]]s and other fish in the [[order]] [[Argentiniformes]]", parents = {"fish"}, } labels["armadillos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["Ngành Chân đốt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Động vật"}, commonscat = "Arthropoda", wpcat = true, } labels["aschizan flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fly|flies]] in the [[dipteran]] [[section]] [[Aschiza]]", parents = {"dipterans"}, } labels["asilomorph flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bee fly|bee flies]], [[dance fly|dance flies]], [[Mydas fly|Mydas flies]], [[robber fly|robber flies]], [[stiletto fly|stiletto flies]], [[window fly|window flies]] and other [[fly|flies]] in the [[dipteran]] [[infraorder]] [[Asilomorpha]]", parents = {"dipterans"}, } labels["assassin bugs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ambush bug]]s, [[assassin bug]]s, [[corsair]]s, [[feather-legged bug]]s, [[kissing bug]]s or [[conenose bug]]s, [[masked hunter]]s, [[wheel bug]]s, and other [[true bug]]s in the [[family]] [[Reduviidae]]", parents = {"true bugs"}, } labels["astacideans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Astacidea]], including the original [[species]] known as [[crayfish]] and [[lobster]]s, and their relatives", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["atheriniform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue-eye]]s, [[hardyhead]]s, [[grunion]], [[jacksmelt]], [[rainbowfish]], [[silverside]]s, [[zona]], and other fish in the [[order]] [[Atheriniformes]]", parents = {"fish"}, } labels["Alcidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[auk]]s, [[guillemot]]s, [[murre]]s, [[puffin]]s, [[razorbill]]s, and other [[seabird]]s in the family [[Alcidae]]", parents = {"Chim biển"}, } labels["Bộ Cá răng kiếm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[daggertooth]]s, [[lancetfish]], [[sergeant baker]]s, [[greeneye]]s, [[telescopefish]], [[lizardfish]] and other fish in the [[order]] [[Aulopiformes]]", parents = {"Cá"}, } labels["Australasian robins"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] [[family]] [[Petroicidae]], which are not closely related to the [[European robin]] (an [[Old World flycatcher]] in the family [[Muscicapidae]]), or the [[American robin]] (a [[thrush]] in the family [[Turdidae]])", parents = {"perching birds"}, } labels["động vật khi nhỏ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"động vật"}, } labels["bandicoots and bilbies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[peramelid]]s, [[bandicoot]]s, [[marl]]s, [[quenda]]s, [[chaeropodid]]s, [[pig-footed bandicoot]]s, [[thylacomyid]]s, [[bilby|bilbies]], [[dalgite]]s, [[rabbit-eared bandicoot]]s, [[philander]]s, [[pinkie]]s, and other [[marsupial]]s in the [[order]] [[Peramelemorphia]]", parents = {"marsupials"}, } labels["barklice"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=non-[[parasitic]] [[insect]]s in the [[order]] [[Psocodea]]", parents = {"insects"}, } labels["barnacles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[infraclass]] [[Cirripedia]], including the parasitic [[rhizocephalan]]s", parents = {"Phân ngành Giáp xác"}, } labels["bats"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["bees"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"hymenopterans", "beekeeping"}, } labels["beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"insects"}, } labels["Bộ Cá nhói"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ballyhoo]], [[flying fish]], [[garfish]], [[halfbeak]]s, [[houndfish]], [[mackerel pike]]s, [[medaka]]s, [[needlefish]], [[ricefish]], [[saury|sauries]], [[silver gar]], and other fish in the [[order]] [[Beloniformes]]", parents = {"Cá"}, } labels["bibionomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[March fly|March flies]], [[cecidomyiid]] [[gall midge]]s, [[keroplatid]] [[fungus gnat]]s, [[mycetophilid]]s, [[sciarid]]s and other [[fly|flies]], [[gnat]]s and [[midge]]s in the [[dipteran]] [[infraorder]] [[Bibionomorpha]]", parents = {"dipterans"}, } labels["Lớp Chim"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Aves", wpcat = true, } labels["Chim săn mồi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds that live by [[predatory]] hunting, and from [[carrion]]", parents = {"Lớp Chim"}, } labels["bivalves"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[clam]]s, [[cockle]]s, [[mussel]]s, [[oyster]]s, [[scallop]]s and other [[mollusk]]s in the [[class]] [[Bivalvia]]", parents = {"Ngành Thân mềm"}, } labels["blennies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blenny|blennies]], [[chaenopsid]]s, [[clinid]]s, [[dactyloscopid]]s, [[klipfish]], [[labrisomid]]s, [[triplefin]]s, [[weedfish]] and other fish in the [[perciform]] [[suborder]] [[Blennioidei]]", parents = {"fish"}, } labels["boas"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[snake]]s in the family [[Boidae]]", parents = {"snakes"}, } labels["bostrichiform beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[carpet beetle]]s, [[deathwatch beetle]]s, [[drugstore beetle]]s, [[museum beetle]]s, [[powder-post beetle]]s, and other [[anobiid]]s/[[ptinid]]s, [[bostrichid]]s, [[dermestid]]s, [[derodontid]]s, [[jacobsoniid]]s and [[nosodendrid]]s in the [[coleopteran]] [[infraorder]] [[Bostrichiformia]]", parents = {"beetles"}, } labels["bovines"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn"}, } labels["brachiopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[animal]]s in the [[phylum]] [[Brachiopoda]]. <u>Note</u>: not to be confused with [[branchiopod]]s, which are [[crustacean]]s", parents = {"animals"}, } labels["branchiopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[[brine shrimp]], [[clam shrimp]], [[fairy shrimp]], [[tadpole shrimp]], [[water flea]]s, and other [[crustacean]]s in the [[class]] [[Branchiopoda]]. <u>Note</u>: not to be confused with [[brachiopod]]s, which are a separate [[phylum]]", parents = {"Phân ngành Giáp xác"}, } labels["bryozoans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[animal]]s in the [[phylum]] [[Bryozoa]], also known as [[Ectoprocta]]", parents = {"animals"}, } labels["bulbuls"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bulbul]]s, [[greenbul]]s, [[brownbul]]s, [[leaflove]]s, [[bristlebill]]s, and other birds in the [[passerine]] [[family]] [[Pycnonotidae]]", parents = {"perching birds"}, } labels["buteos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hawk]]s in the [[genus]] ''[[Buteo]]'', known as [[buzzard]]s in Europe", parents = {"birds of prey"}, } labels["Bướm ngày"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Côn trùng"}, } labels["caddis flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the order [[Trichoptera]], which are closely related to the [[butterfly|butterflies]] and [[moth]]s but with hairs on their wings instead of scales, and which have [[aquatic]] [[larvae]] that live in cases that they build around themselves", parents = {"insects"}, } labels["caecilians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphibian]]s in the [[order]] [[Gymnophiona]], which are legless and resemble [[earthworm]]s or [[snake]]s", parents = {"amphibians"}, } labels["Họ Lạc đà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=động vật thuộc họ [[lạc đà]]", parents = {"Lớp Thú", "Bộ Guốc chẵn"}, } labels["Họ Chó"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["Caprinae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sheep]], [[goat]]s, [[goat antelope]]s, [[chamois]], [[muskox]]en, [[bharal]], [[goral]], [[ibex]], [[mouflon]], [[serow]], [[tahr]], [[tur]], [[takin]] and other animals in the [[bovid]] [[subfamily]] [[Caprinae]], formerly known as the [[family]] Capridae", parents = {"Bộ Guốc chẵn"}, } labels["caprimulgiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[caprimulgiform]]s: birds in the taxonomic order [[Caprimulgiformes]]- the [[nightjar]]s, [[oilbird]]s, [[frogmouth]]s, [[potoo]]s, etc", parents = {"birds"}, } labels["carcharhiniform sharks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bull shark]]s, [[catshark]]s, [[gummy shark]]s, [[hammerhead]]s, [[leopard shark]]s, [[morgay]]s, [[requiem shark]]s, [[tiger shark]]s, [[tope]]s, [[whaler]]s, [[whitetip]]s and other sharks in the [[order]] [[Carcharhiniformes]]", parents = {"Liên bộ Cá mập"}, } labels["cardinalids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cardinal]]s, [[dickcissel]]s, [[indigo bunting]]s, [[pyrrhuloxia]]s, [[rose-breasted grosbeak]]s, [[scarlet tanager]]s, and other birds in the [[family]] [[Cardinalidae]]", parents = {"perching birds"}, } labels["caridean shrimp"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[decapod]] [[infraorder]] [[Caridea]], mostly known as [[shrimp]] or [[prawn]]s", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["Bộ Ăn thịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bear]]s, [[cat]]s, [[civet]]s, [[dog]]s, [[fossa]]s, [[hyaena]]s, [[mongoose]]s, [[panda]]s, [[raccoon]]s, [[seal]]s, [[skunk]]s, [[weasel]]s and various other [[mammal]]s in the [[order]] [[Carnivora]]", parents = {"Lớp Thú"}, } labels["Cá chép"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[subfamily]] [[Cyprininae]], the [[carps]] and [[goldfish]]", parents = {"Họ Cá chép"}, } labels["Bộ Cá da trơn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Cá", "Otomorpha"}, } labels["Mèo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cat]]s in the sense of members of the genus ''[[Felis]]''", parents = {"Họ Mèo"}, commonscat = "Felis silvestris catus", wpcat = true, } labels["cattle"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"bovines", "livestock"}, } labels["caviomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[agouti]]s, [[capybara]]s, [[chinchilla]]s, [[guinea pig]]s, [[New World porcupine]]s, [[nutria]]s, [[tuco-tuco]]s and other [[rodent]]s in the parvorder [[Caviomorpha]]", parents = {"Bộ Gặm nhấm"}, } labels["Lớp Chân đầu"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Thân mềm"}, } labels["cercopithecin monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue monkey]]s, [[Diana monkey]]s, [[guenon]]s, [[lesula]]s, [[malbrouck]]s, [[patas monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[Old World monkey]]s in the [[cercopithecine]] [[tribe]] [[Cercopithecini]]", parents = {"Old World monkeys"}, } labels["Liên họ Đuôi cứng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] [[superfamily]] [[Certhioidea]], the [[treecreeper]]s, [[nuthatch]]es, [[gnatcatcher]]s and [[wren]]s", parents = {"Bộ Sẻ"}, } labels["Họ Hươu nai"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn"}, } labels["cetaceans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cetacean]]s ([[dolphin]]s, [[whale]]s and [[porpoise]]s)", parents = {"Bộ Guốc chẵn"}, } labels["chalcidoid wasps"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[chalcidid]]s, [[encyrtid]]s, [[fig wasp]]s, [[jointworm]]s, [[mymarid]] [[fairyfly|fairyflies]], [[perilampid]]s, [[torymid]]s, [[trichogramma]]s, and other [[wasp]]s in the [[superfamily]] [[Chalcidoidea]]", parents = {"hymenopterans"}, } labels["Characidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the order [[Characiformes]]", parents = {"Cá", "Otomorpha"}, } labels["Gà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Gia cầm", "Bộ Gà"}, } labels["chimaeras (fish)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cartilaginous]] fish in the [[Chimaeriformes]], the only surviving [[order]] of the [[subclass]] [[Holocephali]], and separate from the [[shark]]s, [[ray]]s, [[skate]]s and [[sawfish]] of the subclass [[Elasmobranchii]]", parents = {"fish"}, } labels["Ngành Dây sống"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=animals in the [[phylum]] [[Chordata]]", parents = {"Động vật"}, } labels["chrysomeloid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cerambycid]]s or [[longhorn beetle]]s such as [[apple borer]]s, [[huhu beetle]]s, [[locust borer]]s and [[thunderbolt beetle]]s, as well as [[chrysomelid]]s or [[leaf beetle]]s such as [[asparagus beetle]]s, [[bean weevil]]s, [[Colorado beetle]]s, [[cucumber beetle]]s, [[flea beetle]]s, [[potato beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Chrysomeloidea]]", parents = {"beetles"}, } labels["cicadas"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[superfamily]] [[Cicadoidea]]", parents = {"hemipterans"}, } labels["cichlids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Cichlidae]]", parents = {"labroid fish"}, } labels["clinids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Clinidae]]", parents = {"fish"}, } labels["Ngành Thích ty bào"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[coral]]s, [[gorgonian]]s, [[hydra]]s, [[myxozoan]]s, [[Portuguese man-of-war]], [[sea anemone]]s, [[sea fir]]s, [[sea wasp]]s, and other animals in the in the [[phylum]] [[Cnidaria]]", parents = {"Động vật"}, wpcat = true, } labels["Phân ngành San hô"] = { type = "chủ đề thuộc nhóm tập hợp", description = "một phân ngành động vật không xương sống [[thủy sinh]] bao gồm [[hải quỳ]], [[:w:vi:Bộ San hô cứng|san hô đá]] và san hô mềm, thuộc ngành [[:w:vi:Ngành Thích ty bào|Ngành Thích ty bào]] (Cnidaria)", parents = {"Ngành Thích ty bào"}, wpcat = true, commonscat = "Anthozoa", } labels["cockatoos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crested]] [[parrot]]s in the [[family]] [[Cacatuidae]]", parents = {"parrots"}, } labels["cockroaches"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"insects"}, } labels["colobine monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[colobus]]es, [[douc]]s, [[langur]]s, [[guereza]]s, [[hanuman]]s,[[leaf monkey]]s, [[lutung]]s, [[proboscis monkey]]s, and other [[Old World monkey]]s in the [[subfamily]] [[Colobinae]]", parents = {"Old World monkeys"}, } labels["colubrid snakes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[snake]]s in the family [[Colubridae]]", parents = {"snakes"}, } labels["colugos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=the [[primate]]-like [[gliding]] [[mammal]]s in the [[order]] [[Dermoptera]], also known as [[flying lemur]]s", parents = {"mammals"}, } labels["columbids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[columbid]]s, i.e. [[pigeon]]s and [[dove]]s", parents = {"birds"}, } labels["copepods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crustacean]]s in the [[subclass]] [[Copepoda]]", parents = {"Phân ngành Giáp xác"}, } labels["coraciiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bee-eater]]s, [[ground rollers]], [[kingfisher]]s, [[motmot]]s, [[roller]]s, [[tody|todies]] and other birds in the taxonomic order [[Coraciiformes]]", parents = {"birds"}, } labels["corvids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds", "corvoid birds"}, } labels["corvoid birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[apostlebird]]s, [[bird of paradise|birds of paradise]], [[crow]]s, [[drongo]]s, [[fantail]]s, [[grinder]]s, [[jackdaw]]s, [[jay]]s, [[magpie]]s, [[magpie-lark]]s, [[manucode]]s, [[monarchid]]s, [[nutcracker]]s, [[piwakawaka]]s, [[raven]]s, [[restless flycatcher]]s, [[riflebird]]s, [[shrike]]s, [[standard-wing]]s, and other birds in the [[superfamily]] [[Corvoidea]]", parents = {"perching birds"}, } labels["cotingas"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[suboscine]] [[family]] [[Cotingidae]]", parents = {"suboscines"}, } labels["crabs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crab]]s, [[decapod]] [[crustacean]]s in the [[infraorder]] [[Brachyura]]", parents = {"Phân ngành Giáp xác", "Bộ Mười chân"}, } labels["cranes (birds)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crane]]s", parents = {"gruiforms"}, } labels["cricetids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cotton rat]]s, [[deer mouse|deer mice]], [[hamster]]s, [[harvest mouse|harvest mice]], [[lemming]]s, [[vole]]s, [[woodrat]]s, and other [[rodent]]s in the [[family]] [[Cricetidae]]", parents = {"Bộ Gặm nhấm"}, } labels["crickets and grasshoppers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cricket]]s, [[grasshopper]]s, [[katydid]]s, [[weta]]s and other [[insect]]s in the order [[Orthoptera]]", parents = {"insects"}, } labels["croakers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[croaker]]s, [[drum]]s, [[weakfish]]s and other fish in the family [[Sciaenidae]]", parents = {"percoid fish"}, } labels["crocodilians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crocodile]]s, [[alligator]]s, [[caymans]], and other [[reptile]]s in the order [[Crocodilia]]", parents = {"reptiles"}, } labels["Phân ngành Giáp xác"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Chân đốt"}, } labels["cuckoos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cuckoo]]s and other birds in the [[family]] [[Cuculidae]]", parents = {"otidimorph birds"}, } labels["cuckooshrikes and minivets"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Campephagidae]]", parents = {"perching birds"}, } labels["cucujoid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[flower beetle]]s, [[fungus beetle]]s, [[grain beetle]]s, [[lady beetle]]s, [[lizard beetle]]s, [[Mexican bean beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Cucujoidea]]", parents = {"beetles"}, } labels["Ngành Sứa lược"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=animals in the [[phylum]] [[Ctenophora]], the [[comb jelly|comb jellies]]", parents = {"Động vật"}, } labels["culicomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[biting midge]]s, [[blackfly|blackflies]], [[blood worm]]s, [[glassworm]]s, [[meniscus midge]]s, [[mosquito]]s, [[no-see-um]]s, [[non-biting midge]]s, [[phantom midge]]s and other [[insect]]s in the [[dipteran]] [[infraorder]] [[Culicomorpha]]", parents = {"dipterans"}, } labels["Họ Cá chép"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[carp]], [[minnow]]s, [[chub]]s and other fish in the [[family]] [[Cyprinidae]]. In some classifications, this group is known as the [[superfamily]] [[Cyprinoidea]] or [[suborder]] [[Cyprinoidei]], with the [[cyprinid]] [[subfamily|subfamilies]] considered to be families", parents = {"Cá", "Otomorpha"}, } labels["Phân họ Vịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gadwall]]s [[garganey]]s, [[mallard]]s, [[mottled duck]]s, [[pintail]]s, [[shoveler]]s, [[teal]]s, [[wigeon]]s and other ducks in either the [[anatid]] [[tribe]] [[Anatini]] or [[subfamily]] [[Anatinae]], depending on the classification", parents = {"Vịt"}, } labels["damselflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bluestreak]]s, [[bluetail]]s, [[demoiselle]]s, [[flatwing]]s, [[redtail]]s, [[riverdamsel]]s, [[rubyspot]]s, [[spreadwing]]s, [[threadtail]]s, [[whitetip]]s, and other insects in the [[odonate]] [[suborder]] [[Zygoptera]]", parents = {"dragonflies and damselflies"}, } labels["danaine butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[clearwing]]s, [[crow]]s, [[milkweed]]s, [[monarch]]s, [[paper kite butterfly|paper kite butterflies]], [[tiger]]s, [[wanderer]]s and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Danainae]]", parents = {"nymphalid butterflies"}, } labels["dasyuromorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[thylacine]]s, [[numbat]]s, [[dasyure]]s, [[antechinus]]es, [[dibbler]]s, [[dunnart]]s, [[mulgara]]s. [[phascogale]]s, [[planigale]]s, [[quoll]]s, [[Tasmanian devil]]s, and other [[marsupial]]s in the [[order]] [[Dasyuromorphia]]", parents = {"marsupials"}, } labels["Bộ Mười chân"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crabs]], [[crayfish]], [[lobster]]s, [[prawn]]s, ([[caridean]]) [[shrimp]], and many other [[crustacean]]s in the [[order]] [[Decapoda]]", parents = {"Phân ngành Giáp xác"}, } labels["delphinids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=(oceanic) [[dolphin]]s, [[grampus]]es, [[killer whale]]s/[[orca]]s, [[pilot whale]]s, and other [[cetacean]]s in the [[family]] [[Delphinidae]]", additional = "Note: [[river dolphin]]s and [[porpoise]]s are in other families.", parents = {"cetaceans"}, } labels["designer dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, commonscat = true, wpcat = true, } labels["dinosaurs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["dionychan spiders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crab spider]]s, [[flattie]]s, [[ground spider]]s, [[huntsman spider]]s, [[jumping spider]], [[scorpion spider]]s, and other [[spiders]] in the [[entelegyne]] [[clade]] [[Dionycha]]", parents = {"spiders"}, } labels["dipterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fly|flies]], [[gnat]]s, [[midge]]s, [[mosquito]]s and other [[insect]]s in the order [[Diptera]]", parents = {"insects"}, } labels["Chó"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Chó"}, commonscat = true, wpcat = true, } labels["Mèo nhà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Mèo"}, } labels["dragonflies and damselflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the order [[Odonata]]", parents = {"insects"}, } labels["Vịt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Vịt", "Gia cầm"}, } labels["dugongs and manatees"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the order [[Sirenia]]", parents = {"mammals"}, } labels["Đại bàng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim săn mồi"}, } labels["earthworms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=worms in the [[annelid]] [[suborder]] [[Lumbricina]]", parents = {"annelids"}, } labels["earwigs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the order [[Dermaptera]]", parents = {"insects"}, } labels["echinoderms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals"}, commonscat = "Echinodermata", wpcat = true, } labels["eels"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[eel]]s, elongated, snakelike fish in the order [[Anguilliformes]]", parents = {"elopomorph fish"}, } labels["elapid snakes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cobra]]s, [[coral snake]]s, [[krait]]s, [[mamba]]s, [[sea snake]]s, and other [[venomous]] snakes in the family [[Elapidae]]", parents = {"snakes"}, } labels["elateroid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[click beetle]]s/[[elaterid]]s, [[fire beetle]]s, [[firefly|fireflies]]/[[lampyrid]]s, [[glowworm]]s, [[net-winged beetle]]s/[[lycid]]s, [[railroad worm]]s/[[phengodid]]s, [[soldier beetle]]s/[[cantharid]]s, [[throscid]]s, [[wireworm]]s and other [[beetle]]s in the [[superfamily]] [[Elateroidea]]", parents = {"beetles"}, } labels["Họ Voi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, commonscat = "Elephantidae", wpcat = true, } labels["elopomorph fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bonefish]], [[eel]]s, [[gulper eel]]s, [[halosaur]]s, [[ladyfish]], [[tarpon]] and other fish in the [[superorder]] [[Elopomorpha]]", parents = {"fish"}, } labels["emberizids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bunting]]s, [[yellowhammer]]s and related birds in the [[passerine]] family [[Emberizidae]]", additional = "<u>Note</u>: for New World species that were formerly classified in this family, see [[:Category:{{{langcode}}}:New World sparrows]].", parents = {"perching birds"}, } labels["emydid turtles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=(North American) [[box turtle]]s, [[chicken turtle]]s, [[cooter]]s, [[ellachick]]s, [[pond turtle]]s, [[slider]]s, [[terrapin]]s, and other [[turtle]]s in the [[family]] [[Emydidae]]", parents = {"turtles"}, } labels["Họ Ngựa"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc lẻ"}, } labels["erinaceids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[erinaceid]]s – hedgehogs and relatives", parents = {"mammals"}, } labels["Eupleridae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[euplerid]]s &mdash; mongoose-like mammals found in Madagascar", parents = {"Bộ Ăn thịt"}, } labels["Bộ Guốc chẵn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Artiodactyla]]", parents = {"Lớp Thú"}, } labels["Họ Cắt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[caracara]]s, [[falcon]]s, [[hobby|hobbies]], [[kestrel]]s, [[lanner]]s, [[merlin]]s, [[saker]]s, and other birds in the [[family]] [[Falconidae]]", parents = {"Chim săn mồi"}, } labels["Họ Mèo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["female animals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals", "female"}, } labels["Cá"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Fish", wpcat = true, } labels["flamingos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim nước"}, } labels["flatfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sole]]s, [[flounder]]s, [[halibut]]s and other fish in the order [[Pleuronectiformes]]", parents = {"fish"}, } labels["flatworms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fluke]]s, [[monogenean]]s, [[planarian]]s, [[polyclad]]s, [[tapeworm]]s, and other animals in the [[phylum]] [[Platyhelminthes]]", additional = "For terms related to the study of [[parasitic]] [[worm#Noun|worms]], see [[:Category:Helminthology]] and its subcategories.", parents = {"worms"}, } labels["Bộ Bọ chét"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Côn trùng"}, } labels["Bộ Gà"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fowl]]s: land birds in the [[order]] [[Galliformes]]", parents = {"Lớp Chim"}, } labels["Cáo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Chó"}, } labels["Chim nước"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds that live mainly in [[freshwater]] areas, including [[estuaries]]", parents = {"Lớp Chim"}, } labels["freshwater whitefish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cisco]]s, [[houting]]s, [[inconnu]]s, [[lavaret]]s, [[marena]]s, [[omul]]s, [[Otsego bass]], [[peled]]s, [[pollan]]s, [[roundfish]], [[tullibee]]s, [[vendace]]s, [[whitefish]] and other fish in the [[salmonid]] [[subfamily]] [[Coregoninae]]", parents = {"Họ Cá hồi"}, } labels["Bộ Không đuôi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Anuran"}, } labels["gadiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cod]], [[haddock]], [[hake]] and other fish in the [[order]] [[Gadiformes]]", parents = {"fish"}, } labels["gasterosteiform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[stickleback]]s, [[hypoptychid]] [[sand eel]]s, [[tubesnout]]s and other fish in the [[order]] [[Gasterosteiformes]]", additional = "Note: See [[:Category:Syngnathiform fish]] for a group formerly included within this order.", parents = {"fish"}, } labels["Lớp Chân bụng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Thân mềm"}, } labels["geckos"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[lizard]]s in the [[infraorder]] [[Gekkota]], except for the [[legless lizards]] or [[pygopod]]s", parents = {"lizards"}, } labels["ngỗng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Vịt", "Gia cầm"}, } labels["geometrid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[carpet]]s, [[engrailed]]s, [[heath]]s, [[pug]]s, [[peppered moth]]s, [[streak]]s, [[wave]]s and other [[moth]]s in the [[family]] [[Geometridae]], most of which have [[caterpillar]]s known as [[inchworm]]s, [[looper]]s, [[measuring worm]]s or [[spanworm]]s", parents = {"moths"}, } labels["goats"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Caprinae", "livestock"}, } labels["gobies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[goby|gobies]], [[dartfish]], [[mudskipper]]s, [[sea gudgeon]]s, [[sleeper]]s, [[wormfish]], and other [[fish]] in the [[perciform]] [[suborder]] [[Gobioidei]]", parents = {"fish"}, } labels["gossamer-winged butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue]]s, [[copper]]s, [[elfin]]s, [[harvester]]s, [[hairstreak]]s, [[sunbeam]]s and other [[butterfly|butterflies]] in the [[family]] [[Lycaenidae]]", parents = {"Bướm ngày"}, } labels["grebes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim nước"}, } labels["Gà gô"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blackcock]]s, [[capercaillie]]s, [[grouse]], [[moorcock]]s, [[prairie chicken]]s, [[ptarmigan]]s, [[sagehen]]s, and other birds in the [[phasianid]] [[subfamily]] [[Tetraoninae]]", parents = {"Bộ Gà"}, } labels["gruiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[coot]]s, [[crake]]s, [[crane]]s, [[finfoot]]s, [[flufftail]]s, [[gallinule]]s, [[limpkin]]s, [[rail]]s, [[sungrebe]]s, [[trumpeter]]s, and other birds in the [[order]] [[Gruiformes]]", parents = {"Chim nước"}, } labels["gulls"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gull]]s, [[seabird]]s in the [[family]] [[Laridae]]", parents = {"Chim biển"}, } labels["gun dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["hares"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"lagomorphs"}, } labels["Bộ Cánh nửa"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aphid]]s, [[leafhopper]]s, [[scale insect]]s, [[true bug]]s, [[whitefly|whiteflies]], and other [[insect]]s in the order [[Hemiptera]]", parents = {"Lớp Côn trùng"}, } labels["herding dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"pastoral dogs"}, } labels["herons"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[heron]]s, [[bittern]]s and [[egret]]s", parents = {"Chim nước"}, } labels["Họ Cầy lỏn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[herpestid]]s- mongooses, meerkats, and relatives", parents = {"Bộ Ăn thịt"}, } labels["Họ Cá trích"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[herring]]s, [[shad]]s, [[sardine]]s and other fish in the family [[Clupeidae]]", parents = {"Cá", "Otomorpha"}, } labels["holostean fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gar]]s and [[bowfin]]s, primitive fish in the [[infraclass]] [[Holostei]]", parents = {"fish"}, } labels["hominids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Linh trưởng"}, } labels["honeyeaters"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=Australian [[chat]]s, [[bellbird]]s, [[friarbird]]s, [[gibberbird]]s, [[honeyeater]]s, [[miner]]s, [[spinebill]]s, [[wattlebird]]s, and other birds in the [[family]] [[Meliphagidae]]", parents = {"meliphagoid birds"}, } labels["hoopoes and hornbills"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hoopoe]]s, [[woodhoopoe]]s (including [[scimitarbill]]s), [[hornbill]]s, [[ground hornbill]]s, and other birds in the taxonomic order [[Bucerotiformes]]", parents = {"birds"}, } labels["horseflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blind-fly|blind-flies]], [[breezefly|breezeflies]], [[cleg]]s, [[deerfly|deerflies]], [[forest fly|forest flies]], [[gadfly|gadflies]], [[horsefly|horseflies]], [[oxfly|oxflies]], [[zimb]]s, and other biting flies in the [[family]] [[Tabanidae]]", parents = {"dipterans"}, } labels["horse breeds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngựa"}, commonscat = true, wpcat = true, } labels["Ngựa"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Ngựa", "Gia súc"}, } labels["hummingbirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"apodiforms"}, } labels["Chó săn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó"}, } labels["hyaenids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["hydrozoans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bluebottle]]s, [[calycophoran]]s, [[filiferan]]s, [[hydra]]s, [[hydractinian]]s, [[leptothecate]]s, [[narcomedusa]]s, [[pandeid]]s, [[physonect]]s, [[plumularian]]s, [[Portuguese man-of-war]]s, [[siphonophore]]s, [[stylaster]]s, [[sea fir]]s, [[sea ginger]], [[trachylid]]s, [[trachymedusa]]s, amd other animals in the [[cnidarian]] [[class]] [[Hydrozoa]]", parents = {"cnidarians"}, } labels["hymenopterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ant]]s, [[bee]]s, [[ichneumon wasp]]s, [[sawfly|sawflies]], [[wasp]]s and other [[insect]]s in the order [[Hymenoptera]]", parents = {"insects"}, } labels["hyraxes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["ibises and spoonbills"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ibis]]es and [[spoonbill]]s", parents = {"Chim nước"}, } labels["ichthyosauromorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ichthyosaurs]] and related groups of [[extinct]] [[aquatic]] [[reptile]]s in the [[clade]] [[Ichthyosauromorpha]]", parents = {"reptiles"}, } labels["icterids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[New World]] [[passerine]] family [[Icteridae]]", parents = {"perching birds"}, } labels["iguanoid lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anole]]s, [[basilisk]]s, [[collared lizard]]s, [[chuckwalla]]s, [[fence lizard]]s, [[fringe-toed lizard]]s, [[horned lizard]]s, [[iguana]]s, [[leopard lizard]]s, [[side-blotched lizard]]s, [[zebra-tailed lizard]]s and other [[lizard]]s formerly included in the [[family]] [[Iguanidae]], and now mostly treated as comprising either the [[infraorder]] [[Pleurodonta]] or the [[superfamily]] [[Iguanoidea]]", parents = {"lizards"}, } labels["Lớp Côn trùng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Chân đốt"}, } labels["isopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gribble]]s, [[pillbug]]s, [[salve bug]]s, [[slater]]s, [[sea slater]]s, [[sowbug]]s, [[woodlouse|woodlice]], and other [[crustacean]]s in the [[order]] [[Isopoda]]", parents = {"Phân ngành Giáp xác"}, } labels["jackfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[jack]]s, [[pompano]]s, [[jack mackerel]]s, [[scad]]s and other fish in the family [[Carangidae]]", parents = {"percoid fish"}, } labels["jawless fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[lamprey]]s and [[hagfish]]: primitive eel-like fishes that have no jaws", parents = {"fish"}, } labels["kingfishers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"coraciiforms"}, } labels["kites (birds)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hawk]]s in the [[accipitrid]] [[subfamily|subfamilies]] [[Milvinae]] and [[Elaninae]], as well as some in the subfamily [[Perninae]]", parents = {"birds of prey"}, } labels["kyphosid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blackfish]], [[drummer]]s, [[footballer]]s, [[greenfish]], [[halfmoon]]s, [[luderick]]s, [[mado]]s, [[moonlighter]]s, [[nibbler]]s, [[opaleye]]s, [[sea chub]]s, [[stripey]]s, [[sweep]]s and other fish in the [[percoid]] [[family]] [[Kyphosidae]]", parents = {"percoid fish"}, } labels["labroid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anemonefish]], [[cale]]s, [[cichlid]]s, [[clownfish]], [[damselfish]], [[parrotfish]], [[surfperch]], [[wrasse]]s, and other fish in the [[perciform]] [[suborder]] [[Labroidei]]", parents = {"fish"}, } labels["labyrinth fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[climbing perch]], [[gourami]]s, [[paradisefish]], [[Siamese fighting fish]] and other fish in the [[suborder]] [[Anabantoidei]]", parents = {"fish"}, } labels["lacertoid lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphisbaena]]s, [[caiman lizard]]s, [[green lizard]]s, [[ocellated lizard]]s, [[racerunner]]s, [[rock lizard]]s, [[tegu]]s, [[teiid]]s, [[thunderworm]]s, [[viviparous lizard]]s, [[wall lizard]]s, [[whiptail]]s, and other [[lizard]]s in the [[superfamily]] [[Lacertoidea]]", parents = {"lizards"}, } labels["Bộ Thỏ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, } labels["lamniform sharks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[basking shark]]s, [[goblin shark]]s, [[great white shark]]s, [[mako shark]]s, [[megamouth shark]]s, [[porbeagle]]s, [[sand shark]]s, [[thresher shark]]s, and other [[shark]]s in the [[order]] [[Lamniformes]]", parents = {"Liên bộ Cá mập"}, } labels["lampriform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[crestfish]], [[oarfish]], [[opah]]s, [[ribbonfish]], [[velifer]]s and other fish in the [[order]] [[Lampridiformes]] (not to be confused with the unrelated [[lamprey]]s)", parents = {"fish"}, } labels["larks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds"}, } labels["laughingthrushes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Leiothrichidae]]", parents = {"perching birds"}, } labels["leaf warblers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the family [[Phylloscopidae]]", parents = {"warblers"}, } labels["lesser apes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[gibbon]]s (including [[hoolock]]s, [[lar gibbon]]s [[wow-wow]]s, etc.) and [[siamang]]s, comprising the [[family]] [[Hylobatidae]], which is closely related to the [[hominid]]s", parents = {"Bộ Linh trưởng"}, } labels["Cá Leuciscine"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bream]]s, [[chub]]s, [[dace]]s, [[ide]]s, many [[minnow]]s, [[nase]]s, [[roach]]es, [[shiner]]s, [[ziege]]s, and other fish in the [[cyprinid]] [[subfamily]] [[Leuciscinae]], sometimes treated as the [[family]] [[Leuciscidae]], or as the [[tribe]] [[Leuciscini]] within the [[subfamily]] [[Cyprininae]]", parents = {"Họ Cá chép"}, } labels["libellulid dragonflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amberwing]]s, [[basker]]s, [[darter]]s, [[dropwing]]s, [[duskhawk]]s, [[flutterer]]s, [[glider]]s, [[meadowhawk]]s, [[pennant]]s, [[percher]]s, [[skimmer]]s, [[slimwing]]s, [[swampdragon]]s, [[twister]]s, and other [[dragonfly|dragonflies]] in the [[family]] [[Libellulidae]]", parents = {"dragonflies and damselflies"}, } labels["lice"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[parasitic]] insects in the [[order]] [[Psocodea]]", parents = {"insects"}, } labels["limenitidine butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[admiral]]s, [[clipper]]s, [[count]]s, [[duke]]s, [[purple]]s, [[sister]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Limenitidinae]]", parents = {"nymphalid butterflies"}, } labels["littorinimorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[boat shell]]s, [[carrier shell]]s, [[conch]]s, [[cowry|cowries]], [[flamingo tongue]]s, [[helmet shell]]s, [[moon snail]]s, [[pebblesnail]]s, [[trumpet shell]]s, [[velutinid]]s, [[winkle]]s, [[worm-shell]]s, and other [[gastropod]]s in the [[order]] [[Littorinimorpha]]", parents = {"Lớp Chân bụng"}, } labels["livestock guardian dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"pastoral dogs"}, } labels["lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["loaches"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[cypriniform]] [[superfamily]] [[Cobitoidea]]", parents = {"fish", "Otomorpha"}, } labels["lobe-finned fishes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[coelacanth]]s, [[lungfish]] and other fishes in the [[subclass]] [[Sarcopterygii]] of the [[bony fish]]es", additional = "<u>Please note</u>: although the [[tetrapod]]s (including all [[reptile]]s, [[amphibian]]s, [[bird]]s and [[mammal]]s) are descended from within this group, they are excluded from this category by not being fish.", parents = {"fish"}, } labels["loons"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[loon]]s, birds known as [[diver]]s outside the US", parents = {"Chim nước"}, } labels["macaques"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[Barbary ape]]s, [[bonnet monkey]]s, [[crab-eating macaque]]s, [[Japanese macaque]]s, [[moor macaque]]s, [[pigtail macaque]]s, [[rhesus monkey]]s, [[toque]]s, and other [[Old World monkey]]s in the [[genus]] ''[[Macaca]]''", parents = {"Old World monkeys"}, } labels["macropods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bettong]]s, [[kangaroo]]s, [[pademelon]]s, [[potoroo]]s, [[quokka]]s, [[wallaby]]s, and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Macropodiformes]]", parents = {"marsupials"}, } labels["malaconotoid birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[Australian magpie]]s, [[bushshrike]]s, [[butcherbird]]s, [[boubou]]s, [[brubru]]s, [[currawong]]s, [[gonolek]]s, [[squeaker]]s, [[vanga]]s, and other birds in the [[passerine]] [[superfamily]] [[Malaconotoidea]]", parents = {"perching birds"}, } labels["male animals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals", "male"}, } labels["Lớp Thú"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, } labels["mantids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the [[order]] [[Mantodea]], often known as [[praying mantis]]es", parents = {"insects"}, } labels["marsupials"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"mammals"}, } labels["mayflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the [[order]] [[Ephemeroptera]]", parents = {"insects"}, } labels["megalopterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[alderfly|alderflies]], [[dobsonfly|dobsonflies]], [[fishfly|fishflies]] and other insects in the [[order]] [[Megaloptera]]", parents = {"insects"}, } labels["meliphagoid birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue wren]]s, [[bristlebird]]s, [[emu-wren]]s, [[fairywren]]s, [[gerygone]]s, [[grasswren]]s, [[honeyeater]]s, [[pardalote]]s, [[pilotbird]]s, [[redthroat]]s, [[scrubwren]]s, [[thornbill]]s, [[weebill]]s, [[whiteface]]s, and other birds in the [[passerine]] [[superfamily]] [[Meliphagoidea]]", parents = {"perching birds"}, } labels["mephitids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mephitid]]s: skunks and stink badgers", parents = {"Bộ Ăn thịt"}, } labels["Mergus"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[diving]] [[duck]]s in the [[genus]] ''[[Mergus]]'' and a few similar species", parents = {"Vịt"}, wpcat = true, } labels["mimids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[catbird]]s, [[mockingbird]]s, [[thrasher]]s and other birds in the [[passerine]] family [[Mimidae]]", parents = {"perching birds"}, } labels["mites and ticks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[arachnid]]s in the [[subclass]] [[Acari]]", parents = {"arachnids"}, } labels["Ngành Thân mềm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Động vật"}, commonscat = "Mollusca", wpcat = true, wp = "Động vật thân mềm", } labels["Khỉ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Linh trưởng"}, } labels["Bộ Đơn huyệt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, } labels["mosquitoes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[dipteran]] [[family]] [[Culicidae]]", parents = {"culicomorphs"}, } labels["moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"insects"}, } labels["murids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=a number of [[rats]], [[mice]], and other [[rodent]]s in the [[Old World]] [[family]] [[Muridae]]", parents = {"Bộ Gặm nhấm"}, } labels["muscicapids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] family [[Muscicapidae]]", parents = {"perching birds"}, } labels["muscoid flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anthomyiid]]s such as [[root fly|root flies]], [[cabbage fly|cabbage flies]] and [[onion fly|onion flies]]; [[fanniid]]s; [[muscid]]s such as [[housefly|houseflies]], [[face fly|face flies]] and [[stable fly|stable flies]]; [[scathophagid]]s such as [[dungfly|dungflies]]; and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Muscoidea]]", parents = {"dipterans"}, } labels["Họ Chồn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["mygalomorph spiders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[baboon spider]]s, [[barking spider]]s, [[bird spider]]s, [[purseweb spider]]s, [[tarantula]]s, [[trapdoor spider]]s, and other [[spider]]s in the [[infraorder]] [[Mygalomorphae]]", parents = {"spiders"}, } labels["myriapods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[centipede]]s, [[millipede]]s, [[pauropod]]s, [[symphylan]]s, and other [[arthropod]]s in the [[subphylum]] [[Myriapoda]]", parents = {"arthropods"}, } labels["myrmicine ants"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ant]]s in the [[subfamily]] [[Myrmicinae]]", parents = {"ants"}, } labels["nematodes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[filaria]], [[gapeworm]]s, [[lungworm]]s, [[pinworm]]s, [[threadworm]]s, [[wheatworm]]s, [[whipworm]]s and other [[worm]]s in the [[phylum]] [[Nematoda]]", parents = {"worms"}, } labels["Neogastropoda"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[admiral shell]]s, [[cone snail]]s, [[harp shell]]s, [[murex]]es, [[olive]]s, [[rhombus]]es, [[spindle]]s, [[tulip shell]]s, [[turnip shell]]s, [[volute]]s, [[whelk]]s, [[winkle]]s and other [[gastropod]]s in the [[clade]] [[Neogastropoda]] (treated as an [[order]] in some classifications)", parents = {"Lớp Chân bụng"}, } labels["New World monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[capuchin]]s, [[howler monkey]]s, [[marmochủ đề thuộc nhóm tập hợp]]s, [[night monkey]]s, [[saki]]s, [[spider monkey]]s, [[squirrel monkey]]s, [[tamarin]]s, [[titi]]s, [[uakari]]s, [[woolly monkey]]s, and other [[monkey]]s in the [[parvorder]] [[Platyrrhini]]", parents = {"Khỉ"}, } labels["Họ Cút Tân thế giới"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[family]] [[Odontophoridae]], most of which live in the [[New World]] and are known as [[quail]]s, but the family also includes the African [[genus]] ''[[Ptilopachus]]'' and some [[species]] are known as partridges", parents = {"Bộ Gà"}, } labels["New World sparrows"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sparrow]]- and [[finch]]-like birds in the [[passerine]] [[family]] [[Passerellidae]], until recently considered part of the family [[Emberizidae]]", parents = {"perching birds"}, } labels["New World warblers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the family [[Parulidae]]", parents = {"warblers"}, } labels["neuropterans"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[antlion]]s, [[lacewing]]s, [[mantisfly|mantisflies]], [[owlfly|owlflies]] and other insects in the [[order]] [[Neuroptera]]", parents = {"insects"}, } labels["newts"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[terrestrial]] [[salamander]]s in the [[subfamily]] [[Pleurodelinae]]", parents = {"salamanders"}, } labels["noctuoid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[armyworm]]s, [[cinnabar]]s, [[corn earworm]]s, [[cutworm]]s, [[gypsy moth]]s, [[owlet moth]]s, [[processionary|processionaries]], [[tiger moth]]s, [[underwing]]s, [[wainscot]]s, [[wooly bear]]s, and many other [[moth]]s (and [[caterpillar]]s) in the [[superfamily]] [[Noctuoidea]]", parents = {"moths"}, } labels["nudibranchs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sea slug]]s in the [[gastropod]] [[order]] [[Nudibranchia]]", parents = {"Lớp Chân bụng"}, } labels["nymphalid butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[admiral]]s, [[brown]]s, [[buckeye]]s, [[checkerspot]]s, [[emperor]]s, [[fritillary|fritillaries]], [[leafwing]]s, [[longwing]]s, [[monarch]]s, [[morpho]]s, [[painted lady|painted ladies]], [[ringlet]]s, [[satyr]]s, [[sister]]s, [[snout]]s, [[tortoiseshell]]s, and other butterflies in the [[family]] [[Nymphalidae]]", parents = {"Bướm ngày"}, } labels["octopuses"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"cephalopods"}, } labels["Bộ Guốc lẻ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Perissodactyla]], including the [[equid]]s, [[tapir]]s and [[rhinoceros]]es", parents = {"Lớp Thú"}, } labels["oestroid flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blowfly|blowflies]], [[bluebottle]]s, [[botfly|botflies]], [[flesh fly|flesh fles]], [[greenbottle]]s, [[mango fly|mango flies]], [[screwworm]]s, [[tachinid]]s, [[torsalo]]s, [[tumbu fly|tumbu flies]], [[warble fly|warble flies]], and other flies in the [[superfamily]] [[Oestroidea]]", parents = {"dipterans"}, } labels["Old World monkeys"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[baboon]]s, [[colobus]], [[douc]]s, [[gelada]]s, [[green monkey]]s, [[grivet]]s, [[langur]]s, [[malbrouck]]s, [[mandrill]]s, [[mangabey]]s, [[patas monkey]]s, [[proboscis monkey]]s, [[talapoin]]s, [[vervet]]s, and other [[monkeys]] in the [[family]] [[Cercopithecidae]], the only [[members]] of the [[parvorder]] [[Catarrhini]] aside from the greater/lesser apes and humans", parents = {"Khỉ"}, } labels["Old World orioles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[perching bird]]s in the [[family]] [[Oriolidae]], which are not closely related to the New World orioles in the family [[Icteridae]]", parents = {"perching birds"}, } labels["ornithopods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[camptosaurid]]s, [[hadrosaur]]s, [[iguanodontid]]s, [[lambeosaurid]]s, [[rhabdodontid]]s, [[saurolophid]]s, [[thescelosaurid]]s, [[trachodontid]]s, and other [[dinosaur]]s in the [[ornithischian]] [[clade]] [[Ornithopoda]]", parents = {"dinosaurs"}, } labels["osteoglossomorph fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aba]]s, [[arapaima]]s, [[arowana]]s, [[butterfly fish]], [[elephantfish]], [[featherback]]s, [[mooneye]]s and other fish in the [[superorder]] [[Osteoglossomorpha]]", parents = {"fish"}, } labels["Otariidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[family]] [[Otariidae]], including the [[fur seal]]s and [[sea lion]]s", parents = {"Pinnipedia"}, } labels["otidimorph birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bustard]]s in the [[family]] [[Otididae]] and [[order]] [[Otidiformes]]; [[turaco]]s or [[lourie]]s, [[go-away bird]]s, [[plantain-eater]]s, etc., in the [[family]] [[Musophagidae]] and [[order]] [[Musophagiformes]]; and [[cuckoo]]s in the [[family]] [[Cuculidae]] and [[order]] [[Cuculiformes]]; all in the [[clade]] [[Otidimorphae]]", parents = {"birds"}, } labels["Otomorpha"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anchovy|anchovies]], [[beaked salmon]], [[carp]], [[catfish]], [[characin]]s, [[electric eel]]s, [[ghost knifefish]], [[herring]]s, [[loach]]es, [[milkfish]], [[minnow]]s, [[mousefish]], [[slickhead]]s, [[sucker]]s, [[tubeshoulder]]s, and other fish in the [[clade]] [[Otocephala]]", parents = {"Cá"}, } labels["ovenbirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[suboscine]] family [[Furnariidae]], including the former family Dendrocolaptidae (now the [[subfamily]] [[Dendrocolaptinae]])", parents = {"suboscines"}, } labels["Bộ Cú"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim săn mồi"}, } labels["pangolins"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[order]] [[Pholidota]]", parents = {"mammals"}, } labels["Chi Báo"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[panther]]s in the sense of members of the genus ''[[Panthera]]''", parents = {"Họ Mèo"}, } labels["parrots"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"birds"}, } labels["pastoral dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, } labels["chim cánh cụt"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Chim"}, } labels["pentatomoid bugs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[acanthosomatid]]s, [[burrowing bug]]s, [[jewel bug]]s, [[shield bug]]s, [[stinkbug]]s, [[thyreocorid]]s, and other [[true bug]]s in the [[superfamily]] [[Pentatomoidea]]", parents = {"true bugs"}, } labels["perch and darters"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Percidae]]", parents = {"percoid fish"}, } labels["Bộ Sẻ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[passerine]]s or perching birds: members of the order [[Passeriformes]]", parents = {"Lớp Chim"}, } labels["percoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[archerfish]], [[bass]], [[bigeye]]s, [[bluefish]], [[butterflyfish]], [[cardinalfish]], [[cobia]], [[croaker]]s, [[flagtail]]s, [[goatfish]], [[grouper]]s, [[grunt]]s, [[horse mackerel]], [[jack]]s, [[jawfish]], [[leaffish]], [[mahi-mahi]], [[mojarra]], [[perch]], [[pomfret]]s, [[pompano]], [[ponyfish]], [[porgy|porgies]], [[remora]]s, [[roosterfish]], [[sea bass]], [[sea bream]], [[snapper]], [[sunfish]], [[sweeper]]s, [[threadfin]], [[tilefish]], [[wreckfish]], and other [[perciform]] fish in the [[superfamily]] [[Percoidea]]", parents = {"fish"}, } labels["Phiomorpha"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blesmol]]s, [[sand mole]]s, [[mole rat]]s, [[dassie rat]]s or [[rock rat]]s, [[Old World porcupine]]s, [[cane rat]]s or [[grasscutter]]s and other [[rodent]]s in the parvorder [[Phiomorpha]], which is the Old World counterpart of the [[caviomorph]]s", parents = {"Bộ Gặm nhấm"}, } labels["Họ Hải cẩu thật sự"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mammal]]s in the [[family]] [[Phocidae]], including the [[earless seal]]s (also known as [[true seal]]s)", parents = {"Pinnipedia"}, } labels["piciforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[woodpecker]]s, [[aracari]]s, [[coppersmith]]s, [[honeyguide]]s, [[jacamar]]s, [[nunlet]]s, [[puffbird]]s, [[toucan]]s, and other birds in the [[order]] [[Piciformes]]", parents = {"birds"}, } labels["pierid butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[brimstone]]s, [[orange tip]]s, [[sulfur]]s, [[white]]s and other [[butterfly|butterflies]] in the [[family]] [[Pieridae]]", parents = {"Bướm ngày"}, } labels["lợn"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Guốc chẵn", "Gia súc"}, commonscat = "Suidae", wpcat = true, } labels["pikes (fish)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Esocidae]]", parents = {"fish"}, } labels["Pinnipedia"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Ăn thịt"}, } labels["pipits and wagtails"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[passerine]] family [[Motacillidae]]", parents = {"perching birds"}, } labels["placoderms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[extinct]] armored fish of the [[class]] [[Placodermi]] from the [[Silurian]] and [[Devonian]] [[geologic]] [[period]]s", parents = {"fish"}, } labels["plovers and lapwings"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=birds in the [[charadriiform]] [[family]] [[Charadriidae]]", parents = {"shorebirds"}, } labels["pomfrets"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Bramidae]]", parents = {"percoid fish"}, } labels["Bộ Linh trưởng"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, commonscat = "Primates", wpcat = true, } labels["procyonids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[procyonid]]s: ([[raccoon]]s, [[coati]]s, [[kinkajou]]s, [[olingo]]s, [[ringtail]]s and [[cacomistle]]s)", parents = {"Bộ Ăn thịt"}, } labels["prosimians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Linh trưởng"}, } labels["pterosaurs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["pyraloid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bee moth]]s, [[flour moth]]s, [[leaf crumpler]]s, [[magpie moth]]s, [[melonworm]]s, [[mint moth]]s, [[orangeworm]]s, [[pantry moth]]s, [[pickleworm]]s, [[snout moth]]s, [[veneer moth]]s, [[wax moth]]s and other [[crambid]] and [[pyralid]] [[moths]] in the [[superfamily]] [[Pyraloidea]]", parents = {"moths"}, } labels["Thỏ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Bộ Thỏ"}, } labels["rallids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[rallid]]s: [[rail]]s and other birds in the family [[Rallidae]]", parents = {"gruiforms"}, } labels["ratites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ratite]]s: birds in the superorder [[Palaeognathae]], including large flightless birds such as [[ostrich]]es, and [[emu]]s, as well as the smaller [[kiwi]]s and [[flighted]] [[tinamous]]", parents = {"birds"}, } labels["rays and skates"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[fish]] in the superorder [[Batoidea]]", parents = {"fish"}, } labels["reindeers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Hươu nai"}, } labels["Lớp Bò sát"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Phân ngành Có xương sống"}, commonscat = "Reptilia", wpcat = true, } labels["retrievers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"gun dogs"}, } labels["rhinoceroses"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[rhinoceros]]es, [[mammal]]s in the [[perissodactylic]] [[family]] [[Rhinocerotidae]]", parents = {"odd-toed ungulates"}, } labels["Bộ Gặm nhấm"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Thú"}, } labels["salamanders"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[amphiuma]]s, [[axolotl]]s, [[hellbender]]s, [[mud puppy|mud puppies]], [[olm]]s, [[newt]]s, [[salamander]]s, [[siren]]s, and other [[amphibian]]s in the [[order]] [[Caudata]]", parents = {"amphibians"}, } labels["Họ Cá hồi"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[salmon]]s, [[trout]], and other fish in the family [[Salmonidae]]", parents = {"Cá"}, } labels["saturniid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[Atlas moth]]s, [[cecropia]]s, [[hickory horned devil]]s, [[io moth]]s, [[luna moth]]s, [[polyphemus moth]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Saturniidae]]", parents = {"moths"}, } labels["satyrine butterflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[brown]]s, [[forester]]s, [[grayling]]s, [[heath]]s, [[palmfly|palmflies]], [[ringlet]]s, [[satyr]]s, and other [[butterfly|butterflies]] in the [[nymphalid]] [[subfamily]] [[Satyrinae]]", parents = {"nymphalid butterflies"}, } labels["sauropods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[apatosaur]]s, [[brachiosaur]]s, [[brontosaur]]s, [[camarasaur]]s, [[cetiosaur]]s, [[diplodocus]]es, [[saltasaurid]]s, [[titanosaurian]]s, [[turiasaur]]s, [[vulcanodontid]]s, and other [[dinosaurs]] in the [[saurischian]] [[infraorder]] [[Sauropoda]]", parents = {"dinosaurs"}, } labels["sauropterygians"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[elasmosaur]]s, [[placodont]]s, [[plesiosaur]]s, and other extinct aquatic [[reptile]]s in the [[superorder]] [[Sauropterygia]]", parents = {"reptiles"}, } labels["sawflies and wood wasps"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[horntail]]s, [[pigeon tremex]], [[rose slug]]s, [[sawfly|sawflies]], [[wood wasp]]s, and other primitive [[hymenopteran]]s in the [[suborder]] [[Symphyta]]", parents = {"hymenopterans"}, } labels["scale insects"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[superfamily]] [[Coccoidea]]", parents = {"hemipterans"}, } labels["scarabaeoids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cockchafer]]s, [[dor]]s, [[dung beetle]]s, [[June beetle]]s, [[rain beetle]]s, [[rose chafer]]s, [[scarab]]s, [[stag beetle]]s, and other beetles in the [[superfamily]] [[Scarabaeoidea]]", parents = {"beetles"}, } labels["scenthounds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["scincomorph lizards"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[blue-tongue lizard]]s, [[night lizard]]s, [[sandfish]], [[skink]]s, [[sungazer]]s, and other [[lizard]]s in the [[infraorder]] [[Scincomorpha]]", parents = {"lizards"}, } labels["scolopacids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[curlew]]s, [[dunlin]]s, [[godwit]]s, [[knot]]s, [[redshank]]s, [[ruff]]s, [[sandpiper]]s, [[snipe]]s, [[stint]]s, [[turnstone]]s, [[tattler]]s, [[whimbrel]]s, [[woodcock]]s, [[yellowleg]]s, and other birds in the [[charadriiform]] [[family]] [[Scolopacidae]]", parents = {"shorebirds"}, } labels["Họ Cá thu ngừ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[mackerel]]s, [[tuna]]s, [[barracuda]]s, [[swordfish]], and other fish in the suborder [[Scombroidei]]", parents = {"Cá"}, } labels["scorpaeniform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bullhead]]s, [[cabezon]], [[golomyanka]], [[greenling]]s, [[gurnard]]s, [[Irish lord]], [[lionfish]], [[lumpsucker]]s, [[pigfish]], [[poacher]]s, [[sablefish]], [[scorpionfish]], [[sculpin]]s, [[sea raven]]s, [[sea toad]]s, [[skilfish]], [[snailfish]], [[stonefish]], [[wingfish]], and other fish in the [[order]] [[Scorpaeniformes]]", parents = {"fish"}, } labels["scorpions"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=true [[scorpion]]s: [[arachnid]]s in the [[order]] [[Scorpiones]]", parents = {"arachnids"}, } labels["screamers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[screamer]]s: birds in the family [[Anhimidae]], related to [[duck]]s and [[geese]]", parents = {"birds"}, } labels["Chim biển"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Chim"}, } labels["sea anemones"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cnidarian]]s in the [[order]] [[Actiniaria]]", parents = {"cnidarians"}, } labels["sea cucumbers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[echinoderm]]s in the [[class]] [[Holothuroidea]]", parents = {"echinoderms"}, } labels["sea urchins"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[echinoderm]]s in the [[class]] [[Echinoidea]], including the [[sand dollar]]s", parents = {"echinoderms"}, } labels["sea turtles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[flatback]]s, [[green turtle]]s, [[hawksbill]]s, [[leatherback]]s, [[loggerhead]]s, [[ridley]]s, and other [[turtle]]s in the [[superfamily]] [[Chelonioidea]]", parents = {"turtles"}, } labels["sebastids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Sebastidae]]", parents = {"scorpaeniform fish"}, } labels["serranids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sea bass]], [[grouper]]s, [[rockcod]]s, [[comber]]s and other fish in the family [[Serranidae]]", parents = {"percoid fish"}, } labels["Liên bộ Cá mập"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Cá"}, } labels["Cừu"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Caprinae", "Gia súc"}, } labels["shorebirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"birds"}, } labels["shrikes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds", "corvoid birds"}, } labels["sighthounds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["skippers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=insects in the family [[Hesperiidae]]", parents = {"Bướm ngày"}, } labels["smelts"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[order]] [[Osmeriformes]]", parents = {"fish"}, } labels["snails"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Chân bụng"}, } labels["snakes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["snappers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the [[family]] [[Lutjanidae]]", parents = {"percoid fish"}, } labels["soft corals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[calcaxonian]]s, [[dead man's fingers]], [[fan coral]]s, [[gorgonian]]s, [[holaxonian]]s, [[scleraxonian]]s, [[sea feather]]s, [[sea willow]]s, [[stoloniferan]]s, [[whip coral]]s, and other marine animals in the [[cnidarian]] order [[Alcyonacea]]", parents = {"cnidarians"}, } labels["soricomorphs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[shrew]]s, [[mole]]s, [[solenodon]]s, and other [[mammal]]s in the [[order]] [[Soricomorpha]]", parents = {"mammals"}, } labels["South American canids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fox-like [[canid]]s in the [[subtribe]] [[Cerdocyonina]], which are more closely related to the [[dog]]s and [[wolf|wolves]] than to the true [[fox]]es. Also known as [[zorro]]s", parents = {"Họ Chó"}, } labels["spaniels"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"gun dogs"}, } labels["sparids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[sea breams]], [[porgie]]s, [[scup]]s and other fish in the family [[Sparidae]]", parents = {"percoid fish"}, } labels["sphinx moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hawkmoth]]s, [[hornworm]]s, [[hummingbird moth]]s, [[sphinx moth]]s,[[tomato worm]]s, and other [[moth]]s (and [[caterpillar]]s) in the [[family]] [[Sphingidae]]", parents = {"moths"}, } labels["Nhện"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Lớp Hình nhện"}, } labels["sponges"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aquatic]] [[animal]]s in the [[phylum]] [[Porifera]]", parents = {"animals"}, } labels["squid"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"cephalopods"}, } labels["Họ Sóc"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[squirrel]]s, [[chipmunk]]s, [[marmot]]s, [[prairie dog]]s, [[woodchuck]]s and other [[rodent]]s in the family [[Sciuridae]]", parents = {"Bộ Gặm nhấm"}, } labels["staphylinoid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[beetle]]s in the [[superfamily]] [[Staphylinoidea]]", parents = {"beetles"}, } labels["starlings"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[starling]]s, [[mynah]]s, and other birds in the [[passerine]] family [[Sturnidae]]", parents = {"perching birds"}, } labels["stick insects"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s (including the [[leaf insect]]s) in the [[order]] known as either [[Phasmida]] or [[Phasmatodea]], which are noted for their extreme adaptations in form and color to look like parts of the plants they feed on", parents = {"insects"}, } labels["stoneflies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[freshwater]] [[aquatic]] [[insect]]s in the [[order]] [[Plecoptera]]", parents = {"insects"}, } labels["stony corals"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=marine animals in the [[cnidarian]] order [[Scleractinia]]", parents = {"cnidarians"}, } labels["storks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chim nước"}, } labels["stromateoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[barrelfish]], [[blue eye cod]], [[dollarfish]], [[driftfish]], [[lafayette]], [[medusafish]], [[rudderfish]], [[squaretail]], [[warehou]], and other fish in the [[perciform]] [[suborder]] [[Stromateoidei]]", parents = {"fish"}, } labels["sturgeons"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Acipenseridae]]", parents = {"fish"}, } labels["suboscines"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[antpitta]]s, [[antshrike]]s, [[antthrush]]es, [[asity|asities]], [[broadbill]]s, [[cotinga]]s, [[crescentchest]]s, [[gnateater]]s, [[manakin]]s, [[ovenbird]]s, [[pitta]]s, [[sharpbill]]s, [[spadebill]]s, [[tapaculo]]s, [[tityra]]s, [[tyrant flycatcher]]s, [[woodcreeper]]s, and other birds in the [[passerine]] [[suborder]] [[Tyranni]]", parents = {"perching birds"}, } labels["suckers (fish)"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[buffalo fish]], [[cuiui]], [[jumprock]]s, [[quillback]], [[redhorse]], [[sucker]]s, and other freshwater fish in the family [[Catostomidae]]", parents = {"fish", "Otomorpha"}, } labels["suliform birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[anhinga]]s, [[booby|boobies]], [[cormorant]]s, [[frigatebird]]s, [[gannet]]s, and other [[seabirds]] in the [[order]] [[Suliformes]]", parents = {"seabirds"}, } labels["sunfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=freshwater fish in the family [[Centrarchidae]]", parents = {"percoid fish"}, } labels["swallows"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds"}, } labels["swallowtails"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[apollo]]s, [[batwing]]s, [[birdwing]]s, [[clubtail]]s, [[festoon]]s, [[flying handkerchief]]s, [[Helen]]s, [[jay]]s, [[mime]]s, [[parnassian]]s, [[rose]]s, [[swallowtail]]s, [[swordtail]]s, [[triangle]]s, [[turnus]]es, [[windmill]]s, [[zebra]]s, and other [[butterfly|butterflies]] in the [[family]] [[Papilionidae]], notable for (mostly) having tail-like extensions on their [[hindwing]]s", parents = {"Bướm ngày"}, } labels["Chi Thiên nga"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Họ Vịt"}, } labels["syngnathiform fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bellowsfish]], [[cornetfish]], [[pipefish]], [[razorfish]], [[sea dragon]]s, [[sea horse]]s, [[snipefish]], [[trumpetfish]], and other fish in the [[order]] [[Syngnathiformes]]", parents = {"fish"}, } labels["Thraupidae"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bananaquit]]s, [[conebill]]s, [[dacnis]]es, [[Darwin's finch]]es, [[grassquit]]s, [[ground finch]]es, [[honeycreeper]]s, [[pardusco]]s, [[tanager]]s, and other [[passerine]] birds in the family [[Thraupidae]]", parents = {"Bộ Sẻ"}, } labels["temnospondyls"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[extinct]] early [[amphibian]]s in the [[order]] [[Temnospondyli]]", parents = {"amphibians"}, } labels["tenebrionoid beetles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[aderid]]s, [[anthicid]]s, [[blister beetle]]s, [[borid]]s, [[ciid]]s, [[flour beetle]]s, [[darkling beetle]]s, [[mealworm]]s, [[melandryid]]s, [[mordellid]]s, [[mycetophagid]]s, [[oedemerid]]s, [[pinacate beetle]]s, [[pyrochroid]]s, [[pythid]]s, [[ripiphorid]]s, [[salpingid]]s, [[toktokkie]]s, [[ulodid]]s, [[wharf borer]]s, [[zopherid]]s and other [[beetle]]s in the [[superfamily]] [[Tenebrionoidea]]", parents = {"beetles"}, } labels["tephritoid flies"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cheese fly|cheese flies]], [[tephritid]] [[fruit fly|fruit flies]], [[picture-winged fly|picture-winged flies]] and other [[fly|flies]] in the [[dipteran]] [[superfamily]] [[Tephritoidea]]", parents = {"dipterans"}, } labels["termites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[termite]]s, [[insect]]s in the former [[order]] [[Isoptera]], which is now considered a [[suborder]] or other group within the [[cockroach]]es in the order [[Blattodea]]", parents = {"insects", "cockroaches"}, } labels["terns"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[tern]]s, [[seabirds]] in the [[family]] [[Sternidae]]", parents = {"seabirds"}, } labels["tetraodontiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[pufferfish]], [[triggerfish]], [[boxfish]], [[ocean sunfish]] and other fish in the order [[Tetraodontiformes]]", parents = {"fish"}, } labels["Chó sục"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["theropods"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[dinosaur]]s in the [[clade]] [[Theropoda]]", parents = {"dinosaurs"}, } labels["thrushes"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"perching birds"}, } labels["ticks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bloodsucking]] [[arachnids]] in the [[order]] [[Ixodida]] (also known as [[Metastigmata]])", parents = {"mites and ticks"}, } labels["tinamous"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"ratites"}, } labels["tits"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[tit]]s, birds known as [[chickadee]]s in the US", parents = {"perching birds"}, } labels["toads"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Anuran"}, } labels["toothcarps"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[four-eyed fish]], [[guppy|guppies]], [[killifish]], [[molly|mollies]], [[mummichog]]s, [[platy|platies]], [[swordtail]]s, [[topminnow]]s and other fish in the [[order]] [[Cyprinodontiformes]]", parents = {"fish"}, } labels["tortoises"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[terrestrial]] [[turtle]]s in the [[family]] [[Testudinidae]]", parents = {"turtles"}, } labels["tortricid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[moth]]s (and [[caterpillar]]s) in the [[family]] [[Tortricidae]]", parents = {"moths"}, } labels["trachinoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[black swallower]]s, [[blue cod]], [[duckbill]]s, [[gaper]]s, [[sand eel]]s, [[torrentfish]], [[weeverfish]] and other fish in the [[perciform]] [[suborder]] [[Trachinoidei]]", parents = {"fish"}, } labels["toy dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, } labels["trilobites"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"arthropods"}, } labels["true bugs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[insect]]s in the [[hemipteran]] suborder [[Heteroptera]]", parents = {"hemipterans"}, } labels["Họ Sẻ thông"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[finch]]es in the [[passerine]] family [[Fringillidae]]", parents = {"Bộ Sẻ"}, } labels["true jellyfish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[cnidarian]]s in the [[class]] [[Scyphozoa]]", parents = {"cnidarians"}, } labels["true sparrows"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[passerine]] birds in the family [[Passeridae]] (for other birds called sparrows, see the [[emberizid]]s)", parents = {"perching birds"}, } labels["tubenose birds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[albatross]]es, [[fulmar]]s, [[petrel]]s, [[prion]]s, [[shearwater]]s, and other [[seabird]]s in the [[order]] [[Procellariiformes]]", parents = {"seabirds"}, } labels["tunicates"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals"}, } labels["turtles"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"reptiles"}, } labels["tyrant flycatchers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[passerine]] birds in the family [[Tyrannidae]]", parents = {"suboscines"}, } labels["ursids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[ursid]]s ([[bear]]s)", parents = {"Bộ Ăn thịt"}, } labels["Venerida order mollusks"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[basket clam]]s, [[bean clam]]s, [[boring clam]]s, [[cockle]]s, [[duck clam]]s, [[giant clam]]s, [[hard clam]]s, [[lentil shell]]s, [[pipi]]s, [[pooquaw]]s, [[quahog]]s, [[surf clam]]s, [[trough-shell]]s, [[ugari]]s, [[Venus clam]]s, [[zebra mussel]]s, and other [[bivalve]]s in the [[order]] [[Venerida]]", parents = {"bivalves"}, } labels["Phân ngành Có xương sống"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Ngành Dây sống"}, wpcat = true, commonscat = "Vertebrata", } labels["vespids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[hornet]]s, [[paper wasp]]s, [[pollen wasp]]s, [[potter wasp]]s, [[yellow jacket]]s, and other [[wasp]]s in the [[family]] [[Vespidae]]", parents = {"hymenopterans"}, } labels["Vetigastropoda"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[abalone]]s or [[ear shell]]s, [[duck's-bill limpet]]s, [[keyhole limpet]]s, [[rosary shell]]s, [[slit-shell]]s, [[topshell]]s, [[turban shell]]s, and other [[gastropod]]s in the [[clade]] [[Vetigastropoda]] (treated in some classifications as an [[order]], in others as [[subclass]])", parents = {"Lớp Chân bụng"}, } labels["vipers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[adder]]s, [[asp]]s, [[rattlesnake]]s, [[viper]]s, [[water moccasin]]s and other [[venomous]] snakes in the [[Viperidae]]", parents = {"snakes"}, } labels["viverrids"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[viverrid]]s ([[civet]]s, [[genet]]s and relatives)", parents = {"Bộ Ăn thịt"}, } labels["vombatiforms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[diprotodontid]]s, [[diprotodon]]s, [[phascolarctid]]s, [[koala]]s, [[vombatid]]s, [[wombat]]s, [[phascolome]]s, [[ilariid]]s, [[maradid]]s, [[palorchestid]]s, [[thylacoleonid]]s, [[marsupial lion]]s , [[wynyardiid]]s and other [[marsupial]]s in the [[diprotodont]] [[suborder]] [[Vombatiformes]]", parents = {"marsupials"}, } labels["vultures"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[vulture]]s (both Old World and New World)", parents = {"birds of prey"}, } labels["warblers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[warbler]]s, various small [[passerine]] songbirds, especially of the families Sylviidae (Old World warblers) and Parulidae (New World warblers)", parents = {"perching birds"}, } labels["warren hounds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Chó săn"}, } labels["water dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"retrievers"}, } labels["weaver finches"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[finch]]es in the family [[Estrildidae]]", parents = {"perching birds"}, } labels["weaverbirds"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[baya]]s, [[bishop]]s, [[fody|fodies]], [[malimbe]]s, [[quelea]]s, [[sakabula]]s, [[taha]]s, [[weaver]]s, and other birds in the [[family]] [[Ploceidae]]", parents = {"perching birds"}, } labels["weevils"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[bill-beetle]]s, [[curculio]]s, [[grugru worm]]s, [[snout beetle]]s, and other [[beetle]]s in the [[superfamily]] [[Curculionoidea]]", parents = {"beetles"}, } labels["whales"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"cetaceans"}, } labels["wolves"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[wolves]]", parents = {"Họ Chó"}, } labels["woodpeckers"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[flicker]]s, [[sapsucker]]s, [[wryneck]]s, and other birds in the [[family]] [[Picidae]]", parents = {"piciforms"}, } labels["working dogs"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"dogs"}, } labels["worms"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"animals"}, } labels["wrasses"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=fish in the family [[Labridae]]", parents = {"labroid fish"}, } labels["Họ Tiêu liêu"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Liên họ Đuôi cứng"}, } labels["zoarcoid fish"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[butterfish]], [[eelpout]]s, [[guffer]]s, [[gunnel]]s, [[lumper]]s, [[prickleback]]s, [[prowfish]], [[wolf eel]]s and other fish in the [[perciform]] [[suborder]] [[Zoarcoidei]]", parents = {"fish"}, } labels["zygaenoid moths"] = { type = "chủ đề thuộc nhóm tập hợp", description = "=[[burnet moth]]s, [[forester]]s, [[hag moth]]s, [[limacodid]]s, [[megalopygid]]s, [[monkey slug]]s, [[puss moth]]s, [[saddleback caterpillar]]s, [[zygaenid]]s, and other [[moth]]s in the [[superfamily]] [[Zygaenoidea]]", parents = {"moths"}, } return labels df3c65kd1b8185itpl5jqg11das69gk Thể loại:vi:Thần bí học 14 330157 2345115 2263736 2026-04-14T03:09:02Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Thần bí học/Tiếng Việt]] thành [[Thể loại:vi:Thần bí học]] 2263736 wikitext text/x-wiki [[Thể loại:Siêu nhiên/Tiếng Việt]] [[Thể loại:Forteana/Tiếng Việt]] [[Thể loại:Danh sách chủ đề thuộc nhóm liên quan/Tiếng Việt]] [[Thể loại:Thần bí học]] qtqogwiis538argaiy7ue5nuy04izrz 2345117 2345115 2026-04-14T03:09:26Z Hiyuune 50834 2345117 wikitext text/x-wiki [[Thể loại:vi:Siêu nhiên]] [[Thể loại:vi:Forteana]] [[Thể loại:vi:Danh sách chủ đề thuộc nhóm liên quan]] [[Thể loại:Thần bí học]] r63u78fpd3slncroke9kel04i170973 Mô đun:etymon 828 331836 2345015 2344440 2026-04-13T15:12:38Z TheHighFighter2 42988 2345015 Scribunto text/plain --[=[ This module implements the {{etymon}} template for structured etymology data on Wiktionary. It enables the creation of etymology trees and text by parsing etymon chains, scraping linked pages for their own {{etymon}} data, and recursively building a tree of derivational relationships. Tác giả: - Triển khai ban đầu: [[Thành viên:Ioaxxere]] - Tái cấu trúc lại mô đun (tháng 9 năm 2025): [[Thành viên:Fenakhay]] ([[:en:Special:Diff/86717746]]) Modules: - [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping - [[Module:etymon/data]]: keyword definitions, configuration, and status constants - [[Module:etymon/tree]]: etymology tree rendering - [[Module:etymon/text]]: etymology text generation - [[Module:etymon/categories]]: category generation logic ]=] local export = {} local etymon_data_module = "Module:etymon/data" local etymon_text_module = "Module:etymon/text" local etymon_tree_module = "Module:etymon/tree" local etymon_categories_module = "Module:etymon/categories" local etymon_descendants_module = "Module:etymon/descendants" local ucfirst = require("Module:string utilities").ucfirst local __state = { cached_etymon_args = {}, cached_etymon_pages = {}, cached_descendants_checks = {}, senseid_parent_etymon = {}, available_etymon_ids = {}, single_etymons = {}, entry_title = nil, entry_lang_code = nil, current_page_has_inline_etymology = false, current_page_has_redundant_etymology = false, used_idless_etymon = false, toplevel_has_inline_etymology = false, toplevel_redundant_etymology = false, toplevel_idless_etymon = false, has_mismatched_id = false, max_depth_reached = 0, total_nodes = 0, language_count = {}, toplevel_keyword_stats = {}, warnings = {}, } local loader = require("Module:module loader") local M = loader.init({ require = { data = etymon_data_module, tree = etymon_tree_module, text = etymon_text_module, categories = etymon_categories_module, descendants = etymon_descendants_module, anchors = "Module:anchors", etydate = "Module:etydate", etymology = "Module:etymology", families = "Module:families", languages = "Module:languages", languages_errorgetby = "Module:languages/errorGetBy", links = "Module:links", pages = "Module:pages", parameters = "Module:parameters", string_utilities = "Module:string utilities", template_parser = "Module:template parser", utilities = "Module:utilities", debug = "Module:debug", en_utilities = "Module:en-utilities", parse_utilities = "Module:parse utilities", references = "Module:references", track = "Module:debug/track", template_styles = "Module:TemplateStyles", script_utilities = "Module:script utilities", JSON = "Module:JSON", yesno = "Module:yesno", }, loadData = { headword_data = "Module:headword/data", parameters_data = "Module:parameters/data", text_allowed = "Module:etymon/data/text_allowed", }, }) local Util = {} function Util.format_error(message, preview_only) if preview_only and not M.pages.is_preview() then return nil end return '<span class="error">' .. message .. '</span>' end function Util.add_warning(message, preview_only) local formatted = Util.format_error(message, preview_only) if formatted then table.insert(__state.warnings, formatted) end end function Util.is_text_param_allowed_for_lang(lang) if not lang or type(lang) ~= "table" then return false end local types = lang.getTypes and lang:getTypes() if types and types.family then local code = lang.getCode and lang:getCode() return code and M.text_allowed.families[code] == true end local full_code = lang.getFullCode and lang:getFullCode() if full_code and M.text_allowed.langs[full_code] then return true end if lang.inFamily then for family_code in pairs(M.text_allowed.families) do if lang:inFamily(family_code) then return true end end end return false end function Util.get_lang(code, no_error) if no_error then return M.languages.getByCode(code, nil, true) end return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true) end function Util.get_family(code) return M.families.getByCode(code) end function Util.get_lang_exception(lang) -- Families have no language-specific exceptions if lang.getTypes and lang:getTypes().family then return nil end local code = lang:getCode() local lang_exceptions = M.data.config.lang_exceptions if lang_exceptions[code] then return lang_exceptions[code] end for norm_code, exc in pairs(lang_exceptions) do if exc.normalize_to and code == exc.normalize_to then return exc end if exc.normalize_from_families then local should_normalize = false for _, family in ipairs(exc.normalize_from_families) do if lang:inFamily(family) then should_normalize = true break end end if should_normalize and exc.normalize_exclude_families then for _, family in ipairs(exc.normalize_exclude_families) do if lang:inFamily(family) then should_normalize = false break end end end if should_normalize then local ret = {} for k, v in pairs(exc) do ret[k] = v end ret.suppress_tr = nil return ret end end end return nil end function Util.get_norm_lang(lang) local exc = Util.get_lang_exception(lang) if exc and exc.normalize_to then return M.languages.getByCode(exc.normalize_to) end return lang end -- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>) -- This is needed because Module:parse utilities expects boolean modifiers to have explicit values function Util.add_boolean_defaults(str, param_mods) local result = str for name, spec in pairs(param_mods) do if spec.type == "boolean" then -- Replace <name> with <name:1> (but not <name:...> which already has a value) result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>") end end return result end -- Centralized term formatting: handles suppress_term, unknown_term, and regular terms function Util.format_term(term, is_toplevel, opts) opts = opts or {} -- suppress_term (-) returns nil if term.suppress_term then return nil end local lang = term.lang local exc = Util.get_lang_exception(lang) if is_toplevel then local display_text = term.alt or term.title or "" local sc = term.sc or lang:findBestScript(display_text) local bold_text = tostring(mw.html.create("strong") :addClass("selflink") :wikitext(display_text)) return M.script_utilities.tag_text(bold_text, lang, sc, "term") end local link_params = { lang = lang } link_params.term = not term.unknown_term and term.title or nil link_params.alt = term.alt link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil if not (exc and exc.suppress_tr) then link_params.tr = term.tr link_params.ts = term.ts else link_params.suppress_tr = true end link_params.lit = (opts.lit ~= "suppress") and term.lit or nil if opts.gloss ~= "suppress" then link_params.gloss = term.t end if opts.pos ~= "suppress" then link_params.pos = term.pos end if exc and exc.suppress_tr then link_params.lit = nil end local show_qualifiers if opts.tree_ql ~= "suppress" then if term.q then link_params.q = term.q end if term.qq then link_params.qq = term.qq end if term.l then link_params.l = term.l end if term.ll then link_params.ll = term.ll end show_qualifiers = term.q or term.qq or term.l or term.ll end return M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil) end local __is_content_page_cached function Util.is_content_page() if __is_content_page_cached == nil then __is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle()) end return __is_content_page_cached end local __page_data_cached function Util.get_page_data() if not __page_data_cached then __page_data_cached = M.headword_data.page end return __page_data_cached end -- Extract base keyword from param (without modifiers) local function get_keyword_base(param) if type(param) ~= "string" then return nil end local base = param:match("^:?([^<]+)") or param:gsub("^:", "") return base end local function is_keyword(param, allow_colon_less) if type(param) ~= "string" then return false end local keywords = M.data.keywords if param:sub(1, 1) == ":" then local base = get_keyword_base(param) return keywords[base] ~= nil end if allow_colon_less then local base = get_keyword_base(param) return keywords[base] ~= nil end return false end local function get_keyword(param, allow_colon_less) if type(param) ~= "string" then return nil end local keywords = M.data.keywords if param:sub(1, 1) == ":" then return get_keyword_base(param) end if allow_colon_less then local base = get_keyword_base(param) if keywords[base] then return base end end return nil end local function normalize_keyword(keyword) if keyword:sub(1, 1) == ":" then return keyword end return ":" .. keyword end -- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries local function get_canonical_keyword(keyword) if not keyword then return keyword end return M.data.keyword_canonical[keyword] or keyword end -- Build text/phrase for nominalization with <g:code> (uses data module for codes only). local function get_nominalization_label_for_g(code) if not code or code == "" then return nil end local codes = M.data.nominalization_g_codes local adj = codes[code] if not adj and #code == 2 then local gender_adj = codes[code:sub(1, 1)] local number_adj = codes[code:sub(2, 2)] if gender_adj and number_adj then adj = gender_adj .. " " .. number_adj end end if not adj then return nil end local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " nominalization of" local phrase = M.en_utilities.add_indefinite_article(adj .. " nominalization of", false) return { text = text, phrase = phrase } end local EtymonParser = {} -- Keyword modifier definitions EtymonParser.keyword_param_mods = { unc = { type = "boolean" }, ref = {}, text = { restrict = { keywords = { "from", "derived" } } }, lit = { restrict = { keywords = { "affix", "surf", "univerbation" } } }, conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc. g = { restrict = { keywords = { "nominalization" } } }, } -- Term modifier definitions EtymonParser.etymon_param_mods = { id = {}, t = {}, tr = {}, ts = {}, q = {}, qq = {}, l = {}, ll = {}, pos = {}, alt = {}, ety = {}, lit = {}, unc = { type = "boolean" }, ref = {}, aftype = { restrict = { keywords = { "affix", "surf", "afeq" } } }, postype = {}, bor = { type = "boolean", restrict = { keywords = { "affix", "surf" } } }, slbor = { type = "boolean", restrict = { keywords = { "affix", "surf" } } }, lbor = { type = "boolean", restrict = { keywords = { "affix", "surf" } } }, } local function get_clean_param_mods(param_mods) local clean = {} for mod_name, mod_def in pairs(param_mods) do clean[mod_name] = {} for key, value in pairs(mod_def) do if key ~= "restrict" then clean[mod_name][key] = value end end end return clean end function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods) for mod_name, mod_value in pairs(modifiers) do -- Only check restrictions if the modifier has a non-false/nil value if mod_value then local mod_def = param_mods[mod_name] if mod_def and mod_def.restrict and mod_def.restrict.keywords then local allowed_keywords = mod_def.restrict.keywords local is_allowed = false for _, allowed_keyword in ipairs(allowed_keywords) do if current_keyword == allowed_keyword then is_allowed = true break end end if not is_allowed then local keyword_list = {} for _, kw in ipairs(allowed_keywords) do table.insert(keyword_list, ":" .. kw) end local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ") if #keyword_list > 2 then -- Replace last comma with "or" keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1") end local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">" error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".") end end end end end -- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>") function EtymonParser.parse_keyword_modifiers(param) if type(param) ~= "string" then return nil, {} end local base_keyword = get_keyword_base(param) if not base_keyword then return nil, {} end local canonical_keyword = get_canonical_keyword(base_keyword) -- Check if there are any modifiers if not param:find("<", 1, true) then return canonical_keyword, {} end -- Parse modifiers using the same mechanism as etymon parsing local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods) local function generate_obj(ignored) return {} end local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""), { param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj }) local modifiers = { unc = parsed.unc or false, ref = parsed.ref, text = parsed.text, lit = parsed.lit, conj = parsed.conj, g = parsed.g, } -- Validate modifiers against restrictions EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods) return canonical_keyword, modifiers end function EtymonParser.parse_balanced_segments(str) local segments = {} local current = "" local depth = 0 local i = 1 while i <= #str do local char = str:sub(i, i) if char == "<" then if depth == 0 and current ~= "" then table.insert(segments, current) current = "" end depth = depth + 1 current = current .. char elseif char == ">" then current = current .. char depth = depth - 1 if depth == 0 then table.insert(segments, current) current = "" elseif depth < 0 then error("Unbalanced brackets in etymon: unexpected '>'") end else current = current .. char end i = i + 1 end if depth ~= 0 then error("Unbalanced brackets in etymon: missing '>'") end if current ~= "" then table.insert(segments, current) end return segments end function EtymonParser.parse_inline_ety(ety_string, context_lang) local segments = EtymonParser.parse_balanced_segments(ety_string) if #segments == 0 then error("Empty inline etymology") end local keyword = M.string_utilities.trim(segments[1]) if not is_keyword(keyword, true) then error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>") end local args = { context_lang:getCode(), normalize_keyword(get_canonical_keyword(keyword)) } for i = 2, #segments do local segment = segments[i] if segment:sub(1, 1) == "<" and segment:sub(-1) == ">" then local inner = segment:sub(2, -2) if inner ~= "" then table.insert(args, inner) end elseif is_keyword(segment, true) then -- Handle keywords that appear between bracketed segments table.insert(args, normalize_keyword(get_canonical_keyword(get_keyword(segment, true)))) end end return args end function EtymonParser.parse_etymon(param, context_lang) if is_keyword(param) then return nil end if type(param) ~= "string" then return nil end local lang, rest local is_family = false local before_bracket = param:match("^([^<]*)") or param local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$") if lang_code then local potential_lang = Util.get_lang(lang_code, true) if potential_lang then lang = potential_lang rest = param:sub(#lang_code + 2) else local potential_family = Util.get_family(lang_code) if potential_family then lang = potential_family rest = param:sub(#lang_code + 2) is_family = true else lang = context_lang rest = param end end else lang = context_lang rest = param end if rest == "" then M.track("etymon/term/empty") elseif rest == "?" then M.track("etymon/term/question-mark") elseif rest == "-" then M.track("etymon/term/hyphen") end if rest == "" then return { lang = lang, term = nil, unknown_term = true, is_family = is_family, } end if rest == "-" then return { lang = lang, term = nil, suppress_term = true, is_family = is_family, } end if not rest:find("<", 1, true) then return { lang = lang, term = M.string_utilities.trim(rest), is_family = is_family, } end local term_text = rest:match("^([^<]*)") or "" local is_unknown = (term_text == "") local is_suppress = (term_text == "-") local function generate_obj(ignored_term) return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) } end local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods) local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults, { param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj }) if parsed_obj.id and parsed_obj.id:match("^!") then parsed_obj.id = parsed_obj.id:sub(2) parsed_obj.override = true end parsed_obj.lang = lang parsed_obj.is_family = is_family if is_unknown then parsed_obj.unknown_term = true elseif is_suppress then parsed_obj.suppress_term = true end return parsed_obj end function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code) -- id is now optional, so only validate if provided if id then if mw.ustring.len(id) < 2 then error("The `id` parameter must have at least two characters.") end if id == title or id == Util.get_page_data().pagename then error("The `id` parameter must not be the same as the page title.") end end local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true } if pos and not valid_pos[pos] then error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. ".") end local current_keyword = "from" local etymons_in_group = {} local keywords = M.data.keywords local function checkGroup() if keywords[current_keyword] and keywords[current_keyword].is_group and current_keyword ~= "affix" and current_keyword ~= "surf" and current_keyword ~= "afeq" and #etymons_in_group <= 1 then error("Detected `:" .. current_keyword .. "` group with fewer than two etymons.") end etymons_in_group = {} end local start_index = starts_with_lang_code and 2 or 1 for i = start_index, #args do local param = args[i] if type(param) ~= "string" then elseif param:sub(1, 1) == ":" and not is_keyword(param) then error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif is_keyword(param) then checkGroup() current_keyword = get_canonical_keyword(get_keyword(param)) else local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then table.insert(etymons_in_group, param) local param_lang = etymon_data.lang if etymon_data.is_family and current_keyword == "inherited" then error("`:inh` does not support family codes; use a specific language.") end if etymon_data.is_family and not etymon_data.suppress_term then error("Family codes require suppressed term (use family:-).") end if current_keyword == "from" and param_lang:getFullCode() ~= lang:getFullCode() then error("`:from` is for same-language derivation, but language does not match. " .. "Expected '" .. lang:getFullCode() .. "', got '" .. param_lang:getFullCode() .. "'.") elseif current_keyword == "inherited" then M.etymology.check_ancestor(lang, param_lang) end -- Check modifier restrictions EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods) -- postype must be "root" or "word" local VALID_POSTYPES = { root = true, word = true } if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\".") end if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true) end else table.insert(etymons_in_group, param) end end end checkGroup() end local DataRetriever = {} -- Given an etymon data, scrape its page and cache the result in the global state object. function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel) local content = etymon_title:getContent() if not content then __state.cached_etymon_args[key] = M.data.STATUS.REDLINK return end -- Check if the linked page is a redirect. If it is, the template parsing -- code below will be effectively skipped, and `scrape_page` will be called -- again on the redirect target (see the bottom of this function) local lang_section_for_descendants = nil local redirect_target = etymon_title.redirect_target if not redirect_target then content = M.pages.get_section(content, etymon_lang:getFullName(), 2) if not content then __state.cached_etymon_args[key] = M.data.STATUS.MISSING return end lang_section_for_descendants = content end local etymon_lang_code = etymon_lang:getFullCode() local lang_page_key = etymon_lang_code .. ":" .. etymon_page local found_templates_for_lang = {} local found_ids = {} local has_idless_etymon = false local get_node_class = M.template_parser.class_else_type -- Look for all {{etymon}} templates within the page content using the template parser -- This way the same page is never parsed more than once -- Build a map from senseids to their parent etymonids. local active_etymon_args = nil for node in M.template_parser.parse(content):iterate_nodes() do local node_class = get_node_class(node) if node_class == "heading" then -- A new L2 or etymology section acts as a barrier: an {{etymon}} usage -- used previously cannot be the parent of any subsequent senseids. -- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above. if node:get_name():find("^Etymology") then active_etymon_args = nil end elseif node_class == "template" then local template_name = node:get_name() if template_name == "etymon" then local template_args = node:get_arguments() -- Check if this etymon is for our language if template_args[1] == etymon_lang_code then table.insert(found_templates_for_lang, template_args) if template_args.id then local etymon_key = lang_page_key .. ":" .. template_args.id __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, template_args.id) active_etymon_args = template_args else has_idless_etymon = true -- Store idless etymon with default key local etymon_key = lang_page_key .. ":*" __state.cached_etymon_args[etymon_key] = template_args __state.cached_etymon_pages[etymon_key] = tostring(etymon_page) table.insert(found_ids, "*") active_etymon_args = template_args end end elseif active_etymon_args and template_name == "senseid" then local template_args = node:get_arguments() -- This should always be true for proper usages of {{senseid}}. if template_args[1] == etymon_lang_code and template_args[2] then local sense_id_key = lang_page_key .. ":" .. template_args[2] __state.senseid_parent_etymon[sense_id_key] = active_etymon_args __state.cached_etymon_pages[sense_id_key] = tostring(etymon_page) end end end end if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then M.descendants.cache_page_checks({ lang_section = lang_section_for_descendants, etymon_lang_code = etymon_lang_code, found_templates_for_lang = found_templates_for_lang, entry_title = __state.entry_title, entry_lang_code = __state.entry_lang_code, entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil, cached_descendants_checks = __state.cached_descendants_checks, lang_page_key = lang_page_key, redirected_from = redirected_from, }) end -- Error if multiple etymons exist and at least one is missing an id if #found_templates_for_lang > 1 and has_idless_etymon then error("Page '[[" .. tostring(etymon_page) .. "]]' has " .. #found_templates_for_lang .. " etymon templates for " .. etymon_lang:getCanonicalName() .. ", but at least one is missing an id. All etymons must have unique IDs when there are multiple.") end local id_data_list = {} for _, args in ipairs(found_templates_for_lang) do local id = args.id or "*" table.insert(id_data_list, { id = id, pos = args.pos }) end __state.available_etymon_ids[lang_page_key] = id_data_list if #found_templates_for_lang == 1 then __state.single_etymons[lang_page_key] = found_templates_for_lang[1] end if redirected_from and __state.available_etymon_ids[lang_page_key] then __state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {} for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do table.insert(__state.available_etymon_ids[redirected_from], id_data) end end if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then -- All done! return elseif redirect_target and not redirected_from then -- Try scraping the redirect. etymon_page = redirect_target.prefixedText DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel) __state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id] else __state.cached_etymon_args[key] = M.data.STATUS.MISSING end end -- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name. function DataRetriever.get_etymon_args(etymon_data, is_toplevel) local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page if etymon_data.id then local key = base_key .. ":" .. etymon_data.id local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] if cached_args == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel) end cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh -- Get etymon_id from parent if this was resolved via senseid local parent_etymon = __state.senseid_parent_etymon[key] local resolved_etymon_id = parent_etymon and parent_etymon.id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { explicit_id = etymon_data.id, parent_etymon = parent_etymon, }, }) end end return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check else __state.used_idless_etymon = true if is_toplevel then __state.toplevel_idless_etymon = true end if __state.available_etymon_ids[base_key] == nil then local title = mw.title.new(page) if not title then error('Invalid page title "' .. page .. '" encountered.') end DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel) end local ids = __state.available_etymon_ids[base_key] or {} local count = #ids -- Try to filter by postype if available and we have multiple candidates if count > 1 and etymon_data.postype then local matching_ids = {} for _, id_data in ipairs(ids) do if id_data.pos == etymon_data.postype then table.insert(matching_ids, id_data) end end if #matching_ids == 1 then local matched_id = matching_ids[1].id local matched_key = base_key .. ":" .. matched_id local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id = matched_id }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id = matched_id }, }) end end return __state.cached_etymon_args[matched_key], __state.cached_etymon_pages[matched_key], nil, descendants_check end end if count == 1 then local only_id_data = ids[1] local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*" local descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = is_toplevel, base_key = base_key, lookup = { id_data = only_id_data }, }) if is_toplevel and descendants_check == nil then local title = mw.title.new(page) if title then DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true) descendants_check = M.descendants.get_lookup_check({ cached_descendants_checks = __state.cached_descendants_checks, is_toplevel = true, base_key = base_key, lookup = { id_data = only_id_data }, }) end end return __state.single_etymons[base_key], __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check elseif count > 1 then local id_list = {} for _, id_data in ipairs(ids) do local id = type(id_data) == "table" and id_data.id or id_data if id and id ~= "" then table.insert(id_list, "\"" .. id .. "\"") end end local suggestion_text = "" if #id_list > 0 then suggestion_text = " Available IDs: " .. table.concat(id_list, ", ") .. "." end Util.add_warning("Etymology link to '[[" .. page .. "]]' is ambiguous. The page has " .. count .. " etymon templates for " .. norm_lang:getCanonicalName() .. ". Please specify an ID." .. suggestion_text, true) return M.data.STATUS.AMBIGUOUS, nil, nil, nil else return M.data.STATUS.MISSING, nil, nil, nil end end end local TreeBuilder = {} local function parse_etymon_references(refs_text) if not refs_text or refs_text == "" then return "" end return M.references.parse_references(refs_text) end local function parse_tree_references(node) if node.ref then node.parsed_ref = parse_etymon_references(node.ref) end if node.children then for _, container in ipairs(node.children) do if container.terms then for _, term in ipairs(container.terms) do parse_tree_references(term) end end end end end -- Build a unique key for deduplication in the seen table function TreeBuilder.build_key(lang, title, args) local norm_lang_code = Util.get_norm_lang(lang):getFullCode() local is_table = type(args) == "table" local id = (is_table and args.id) or "" if title then return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id end if is_table and args.status == M.data.STATUS.INLINE then local content_parts = {} for i = 1, #args do content_parts[i] = tostring(args[i]) end return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0") end return norm_lang_code .. ":*:" .. id end function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion) seen = seen or {} depth = depth or 0 local is_toplevel = (depth == 0) if depth > __state.max_depth_reached then __state.max_depth_reached = depth end __state.total_nodes = __state.total_nodes + 1 local lang_code = lang:getCode() __state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1 local current_id = (type(args) == "table" and args.id) or "" local key = TreeBuilder.build_key(lang, title, args) local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK } if type(args) ~= "table" or seen[key] then node.status = args or M.data.STATUS.MISSING -- Mark as duplicate if we've seen this node before if seen[key] then node.is_duplicate = true node.duplicate_key = key local original_node = seen[key] if type(original_node) == "table" and original_node.children and #original_node.children > 0 then node.original_has_children = true end end return node end node.status = args.status or M.data.STATUS.OK seen[key] = node -- If stop_recursion is set, skip parsing children but check for visible children if stop_recursion then local keywords = M.data.keywords local has_visible_children = false for i = 2, #args do local param = args[i] if type(param) == "string" then local keyword_base = get_keyword_base(param) if keyword_base and keywords[keyword_base] then -- It's a keyword, check if visible in tree (invisible "all" or "tree" = hidden in tree) local keyword_info = keywords[keyword_base] local inv = keyword_info.invisible if not (inv == "all" or inv == true or inv == "tree") then has_visible_children = true break end elseif param:sub(1, 1) ~= ":" then -- It's a term (not a keyword), so there are visible children has_visible_children = true break end end end node.has_visible_children = has_visible_children return node end -- Parse args into keyword containers local current_keyword = "from" local current_keyword_modifiers = {} local current_container = nil -- Helper to track keyword usage at top level local function track_keyword_usage(keyword, target_lang, source_lang) if not is_toplevel then return end if not __state.toplevel_keyword_stats[keyword] then __state.toplevel_keyword_stats[keyword] = { count = 0, target_langs = {}, source_langs = {}, } end local keyword_data = __state.toplevel_keyword_stats[keyword] keyword_data.count = keyword_data.count + 1 local target_code = target_lang:getCode() keyword_data.target_langs[target_code] = (keyword_data.target_langs[target_code] or 0) + 1 if source_lang then local source_code = source_lang:getCode() keyword_data.source_langs[source_code] = (keyword_data.source_langs[source_code] or 0) + 1 end end local function ensure_container() if not current_container or current_container.keyword ~= current_keyword then current_container = { keyword = current_keyword, keyword_info = M.data.keywords[current_keyword], keyword_modifiers = current_keyword_modifiers, terms = {}, } table.insert(node.children, current_container) -- Override keyword text/phrase for nominalization with <g:code> if current_keyword_modifiers.g and current_keyword == "nominalization" then local labels = get_nominalization_label_for_g(current_keyword_modifiers.g) if not labels then local codes = {} for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end table.sort(codes) error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", ")) end current_container.keyword_info = {} for k, v in pairs(M.data.keywords[current_keyword]) do current_container.keyword_info[k] = v end current_container.keyword_info.text = labels.text current_container.keyword_info.phrase = labels.phrase end end end for i = 2, #args do local param = args[i] if is_keyword(param) then local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param) current_keyword = keyword current_keyword_modifiers = modifiers current_container = nil -- Force new container for new keyword elseif type(param) == "string" and param:sub(1, 1) == ":" then error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?") elseif type(param) == "string" then local etymon_data = EtymonParser.parse_etymon(param, lang) if etymon_data then -- Track keyword usage at top level track_keyword_usage(current_keyword, lang, etymon_data.lang) local term_node = {} -- Handle suppress_term (-) and unknown_term (empty) directly if etymon_data.suppress_term or etymon_data.unknown_term then ensure_container() if etymon_data.ety then local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1) else term_node = { lang = etymon_data.lang, children = {}, status = M.data.STATUS.OK, } end term_node.suppress_term = etymon_data.suppress_term term_node.unknown_term = etymon_data.unknown_term term_node.is_family = etymon_data.is_family term_node.is_uncertain = etymon_data.unc term_node.ref = etymon_data.ref term_node.t = etymon_data.t term_node.tr = etymon_data.tr term_node.ts = etymon_data.ts term_node.alt = etymon_data.alt term_node.pos = etymon_data.pos term_node.lit = etymon_data.lit term_node.q = etymon_data.q term_node.qq = etymon_data.qq term_node.l = etymon_data.l term_node.ll = etymon_data.ll else -- Regular term: fetch arguments from page local etymon_args, page_of, resolved_etymon_id, descendants_check = DataRetriever.get_etymon_args(etymon_data, is_toplevel) if etymon_data.id and etymon_args == M.data.STATUS.MISSING and not etymon_data.ety then local page = M.links.get_link_page(etymon_data.term, etymon_data.lang) local norm_lang = Util.get_norm_lang(etymon_data.lang) local base_key = norm_lang:getFullCode() .. ":" .. page local available_ids = __state.available_etymon_ids[base_key] or {} if #available_ids > 0 then __state.has_mismatched_id = true end end -- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing if etymon_data.ety then if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then __state.current_page_has_inline_etymology = true if is_toplevel then __state.toplevel_has_inline_etymology = true end local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang) -- Track inline ety keywords too local inline_keyword = get_keyword(inline_args[2], true) if inline_keyword and #inline_args >= 3 then local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang) if inline_etymon then track_keyword_usage(inline_keyword, etymon_data.lang, inline_etymon.lang) end end inline_args.id = etymon_data.id inline_args.status = M.data.STATUS.INLINE etymon_args = inline_args term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent else -- Scraped arguments exist, <ety> is redundant and ignored __state.current_page_has_redundant_etymology = true if is_toplevel then __state.toplevel_redundant_etymology = true end end end -- Ensure container exists before checking keyword info ensure_container() -- Check if current keyword has no_child_categories - if so, stop recursion local keyword_info = current_container.keyword_info local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories)) term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion) term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() .. ":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang) term_node.id = etymon_data.id term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid term_node.t = etymon_data.t term_node.tr = etymon_data.tr term_node.ts = etymon_data.ts term_node.pos = etymon_data.pos term_node.alt = etymon_data.alt term_node.ref = etymon_data.ref term_node.is_uncertain = etymon_data.unc term_node.override = etymon_data.override term_node.page_of = page_of term_node.aftype = etymon_data.aftype term_node.postype = etymon_data.postype term_node.bor = etymon_data.bor term_node.lbor = etymon_data.lbor term_node.slbor = etymon_data.slbor term_node.lit = etymon_data.lit term_node.is_family = etymon_data.is_family term_node.q = etymon_data.q term_node.qq = etymon_data.qq term_node.l = etymon_data.l term_node.ll = etymon_data.ll term_node.missing_descendants_header, term_node.missing_descendants_entry = M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check) end table.insert(current_container.terms, term_node) end end end return node end -- Convert etymology tree to JSON-serializable table local function tree_to_json(node) local obj = { term = node.title, lang = node.lang:getCode(), lang_name = node.lang:getCanonicalName(), id = (node.id and node.id ~= "") and node.id or nil, status = node.status, is_uncertain = node.is_uncertain or nil, is_duplicate = node.is_duplicate or nil, gloss = node.t, transliteration = node.tr, transcription = node.ts, alt = node.alt, pos = node.pos, children = {}, } for _, container in ipairs(node.children or {}) do local keyword_info = container.keyword_info if keyword_info then local container_obj = { keyword = container.keyword, keyword_label = keyword_info.text, keyword_abbrev = keyword_info.abbrev, is_group = keyword_info.is_group or nil, is_invisible = keyword_info.invisible or nil, is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil, terms = {}, } for _, term in ipairs(container.terms or {}) do table.insert(container_obj.terms, tree_to_json(term)) end table.insert(obj.children, container_obj) end end return obj end local function track_ranges(base_key, value, ranges, lang_code) M.track("etymon/" .. base_key .. "/" .. value) if lang_code then M.track("etymon/lang/" .. lang_code .. "/" .. base_key .. "/" .. value) end for _, range in ipairs(ranges) do local matches = false if range.min and range.max then matches = value >= range.min and value <= range.max elseif range.min then matches = value >= range.min elseif range.max then matches = value <= range.max elseif range.exact then matches = value == range.exact end if matches then M.track("etymon/" .. base_key .. "/" .. range.label) if lang_code then M.track("etymon/lang/" .. lang_code .. "/" .. base_key .. "/" .. range.label) end break end end end -- Build and return the etymology data tree for a given term. function export.get_tree(lang, title, args, options) options = options or {} __state.entry_title = title __state.entry_lang_code = lang:getCode() if options.validate then EtymonParser.validate(lang, args, options.id, title, options.pos, false) end local lang_code = lang:getCode() local start_index = (args[1] == lang_code) and 2 or 1 local tree_args = { [1] = lang_code, id = options.id or args.id } for i = start_index, #args do table.insert(tree_args, args[i]) end __state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args local ety_data_tree = TreeBuilder.build(lang, title, tree_args) parse_tree_references(ety_data_tree) if options.json then return M.JSON.toJSON(tree_to_json(ety_data_tree)) end return ety_data_tree end -- Given a language code, page name and optionally the id= parameter, -- render the tree and only the etymology tree for the relevant page. -- Fetches and parses the corresponding {{etymon}} from the requested page, -- and any further pages needed to render the tree. -- Parameters can be passed either through the #invoke or as -- template parameters *through* an #invoke. function export.render_tree_for_etymon_on_page(frame) local frame_args = frame.args local parent_args = frame:getParent().args local langcode = frame_args[1] or parent_args[1] local pagename = frame_args[2] or parent_args[2] local id = frame_args["id"] or parent_args["id"] local display_title = frame_args["title"] or parent_args["title"] local parsed_title = mw.title.new(pagename, 0) local title if parsed_title.namespace == 0 then title = M.pages.safe_page_name(parsed_title) elseif parsed_title.namespace == 118 then title = "*" .. M.pages.safe_page_name(parsed_title) else error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace) end local lang = Util.get_lang(langcode) -- Construct etymon_data for DataRetriever.get_args. local etymon_data = { lang = lang, term = title, id = id } local args, pagename = DataRetriever.get_etymon_args(etymon_data, true) if args == M.data.STATUS.MISSING then error("The etymon template was not found (language " .. langcode .. ", title '" .. title .. "'" .. (id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.") end local ety_data_tree = export.get_tree(lang, display_title or title, args, { validate = true, id = id, }) local output = {} table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { gloss = "suppress", pos = "suppress", lit = "suppress", tree_ql = "suppress", }) end, })) return table.concat(output) end function export.main(frame) local parent_args = frame:getParent().args local args = M.parameters.process(parent_args, M.parameters_data.etymon) local lang = args[1] local etymon_args = args[2] local id = args.id local title = args.title local text = args.text local tree = args.tree local etydate = args.etydate local rfe = args.rfe local page_data = Util.get_page_data() if not title then title = page_data.pagename if page_data.namespace == "Từ tái tạo" then title = "*" .. title end end local current_L2 = M.pages.get_current_L2() if current_L2 then local norm_lang = Util.get_norm_lang(lang) local norm_name = ucfirst(norm_lang:getCanonicalName()) if current_L2 ~= norm_name then local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")" if norm_lang:getCode() ~= lang:getCode() then lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")" end error("Ngôn ngữ '" .. lang_desc .. "' không khớp với đầu mục L2 (" .. current_L2 .. ").") end end local ety_data_tree = export.get_tree(lang, title, etymon_args, { validate = true, pos = args.pos, id = id, json = args.json, }) if args.json then return ety_data_tree end local output = {} local text_allowlist_mode = M.text_allowed.default_mode or "off" if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() .. "; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter." if text_allowlist_mode == "error" then error(msg) else Util.add_warning(msg, true) end end local lang_exc = Util.get_lang_exception(lang) if lang_exc and lang_exc.disallow then local disallow = lang_exc.disallow local error_text = " for " .. lang:getFullName() if disallow.ref then error_text = error_text .. "; see " .. disallow.ref else error_text = error_text .. "." end if tree and disallow.tree then error("Etymology trees are not allowed" .. error_text) end if text and disallow.text then error("Etymology texts are not allowed" .. error_text) end end if etydate then local etydate_param_mods = { ref = { list = true, type = "references", allow_holes = true }, refn = { list = true, allow_holes = true }, nocap = { type = "boolean" }, } local function generate_etydate_obj(etydate_text) local etydate_specs = {} for spec in etydate_text:gmatch("[^,]+") do table.insert(etydate_specs, mw.text.trim(spec)) end return { [1] = etydate_specs } end local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj }) local etydate_args = { [1] = parsed_etydate[1], nocap = parsed_etydate.nocap or false, ref = parsed_etydate.ref or {}, refn = parsed_etydate.refn or { maxindex = 0 } } if etydate_args.refn then local max = 0 for k, v in pairs(etydate_args.refn) do if type(k) == "number" and k > max then max = k end end etydate_args.refn.maxindex = max end ety_data_tree.etydate = M.etydate.format_etydate(etydate_args) -- Parse and store references separately for text rendering local refs_text = "" for _, ref in ipairs(etydate_args.ref) do refs_text = refs_text .. (refs_text ~= "" and "" or "") .. ref end if refs_text ~= "" then ety_data_tree.etydate_refs = M.references.parse_references(refs_text) end end if tree then table.insert(output, M.template_styles("Module:etymon/styles.css")) table.insert(output, M.tree.render({ data_tree = ety_data_tree, format_term_func = function(term, is_toplevel) return Util.format_term(term, is_toplevel, { gloss = "suppress", pos = "suppress", lit = "suppress", tree_ql = "suppress", }) end, })) end -- Check if there are any visible children in tree (invisible "all" or "tree" = hidden in tree) local has_visible_children = false for _, child in ipairs(ety_data_tree.children or {}) do local child_keyword_info = child.keyword_info local inv = child_keyword_info and child_keyword_info.invisible if not (inv == "all" or inv == true or inv == "tree") then has_visible_children = true break end end local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree local anchor = M.anchors.etymonid(lang, id, { no_tree = args.notree, title = title, empty_tree = (not has_visible_children) or tree_disallowed }) table.insert(output, anchor) if text then local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink if text == "++" then max_depth, stop_at_blue_link = false, false elseif text == "+" then max_depth, stop_at_blue_link = 1, false elseif text == "*" then max_depth, stop_at_blue_link = false, true elseif text:match("^:[^*]+%*$") then -- Stop at a specific language OR first bluelink after it, e.g., ":ota*" -- If the target language is a redlink, continue to the first bluelink local lang_code = text:match("^:([^*]+)%*$") if lang_code and lang_code ~= "" then local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang_or_bluelink = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false end elseif text:sub(1, 1) == ":" then -- Stop at a specific language, e.g., ":ar" stops at first Arabic term local lang_code = text:sub(2) if lang_code ~= "" then -- Validate the language code local lang_obj = Util.get_lang(lang_code, true) if lang_obj then stop_at_lang = lang_code else Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else Util.add_warning('Empty language code in text parameter. Showing full chain instead.') max_depth, stop_at_blue_link = false, false -- default to ++ end else local num = tonumber(text) if num and num >= 1 then max_depth, stop_at_blue_link = num, false else error('Invalid text value "' .. text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)') end end table.insert(output, M.text.render({ data_tree = ety_data_tree, format_term_func = Util.format_term, max_depth = max_depth, stop_at_blue_link = stop_at_blue_link, curr_page = page_data.pagename, nodot = args.nodot, stop_at_lang = stop_at_lang, stop_at_lang_or_bluelink = stop_at_lang_or_bluelink, })) end if rfe then local rfe_param_mods = { nocat = { type = "boolean" }, sort = {}, y = {}, m = {}, fragment = {}, section = {}, box = { type = "boolean" }, noes = { type = "boolean" }, } local function generate_rfe_obj(rfe_text) -- Check if it's a boolean true value if M.yesno(rfe_text, false) then return { is_boolean = true } else return { text = rfe_text } end end local rfe_with_defaults = Util.add_boolean_defaults(rfe, rfe_param_mods) local parsed_rfe = M.parse_utilities.parse_inline_modifiers(rfe_with_defaults, { param_mods = rfe_param_mods, generate_obj = generate_rfe_obj }) local rfe_args = { [1] = lang:getCode(), nocat = parsed_rfe.nocat, sort = parsed_rfe.sort, y = parsed_rfe.y, m = parsed_rfe.m, fragment = parsed_rfe.fragment, section = parsed_rfe.section, box = parsed_rfe.box, noes = parsed_rfe.noes, } if not parsed_rfe.is_boolean then rfe_args[2] = parsed_rfe.text end table.insert(output, frame:expandTemplate({ title = "rfe", args = rfe_args })) end if Util.is_content_page() and __state.max_depth_reached > 0 then local lang_code = lang:getCode() local depth_ranges = { { min = 50, label = "extremely-deep" }, { min = 20, label = "20+" }, { min = 10, max = 19, label = "10-19" }, { min = 5, max = 9, label = "5-9" }, { min = 3, max = 4, label = "3-4" }, { max = 2, label = "1-2" } } local node_ranges = { { min = 100, label = "extremely-large" }, { min = 50, label = "50+" }, { min = 20, max = 49, label = "20-49" }, { min = 10, max = 19, label = "10-19" }, { min = 5, max = 9, label = "5-9" }, { max = 4, label = "1-4" } } local language_ranges = { { min = 10, label = "10+" }, { min = 5, max = 9, label = "5-9" }, { min = 3, max = 4, label = "3-4" }, { exact = 2, label = "2" }, { exact = 1, label = "1" } } track_ranges("depth", __state.max_depth_reached, depth_ranges, lang_code) track_ranges("nodes", __state.total_nodes, node_ranges, lang_code) local unique_languages = 0 for _ in pairs(__state.language_count) do unique_languages = unique_languages + 1 end track_ranges("unique-languages", unique_languages, language_ranges, lang_code) if __state.total_nodes == __state.max_depth_reached + 1 then track_ranges("linear-depth", __state.max_depth_reached, depth_ranges, lang_code) end end local categories = {} if Util.is_content_page() then local should_suppress_categories = lang_exc and lang_exc.suppress_categories if not should_suppress_categories and not args.nocat then categories = M.categories.render({ data_tree = ety_data_tree, page_lang = lang, available_etymon_ids = __state.available_etymon_ids, senseid_parent_etymon = __state.senseid_parent_etymon, get_norm_lang_func = Util.get_norm_lang, lang_exc = lang_exc, }) end local target_lang_code = lang:getCode() for keyword, keyword_data in pairs(__state.toplevel_keyword_stats) do -- Track keyword globally M.track("etymon/keyword/" .. keyword) -- Track keyword per target language M.track("etymon/keyword/" .. keyword .. "/target/" .. target_lang_code) -- Track keyword per source language for source_code, count in pairs(keyword_data.source_langs) do M.track("etymon/keyword/" .. keyword .. "/source/" .. source_code) -- Track keyword per target+source combination M.track("etymon/keyword/" .. keyword .. "/target/" .. target_lang_code .. "/source/" .. source_code) end end if tree then table.insert(categories, "Trang có cây từ nguyên") table.insert(categories, "Mục từ có cây từ nguyên " .. lang:getCanonicalName()) end if text then table.insert(categories, "Mục từ có văn bản giải thích từ nguyên " .. lang:getCanonicalName()) end if args.exnihilo then table.insert(categories, lang:getCanonicalName() .. " terms coined ex nihilo") end if __state.toplevel_has_inline_etymology then table.insert(categories, "Trang có nguyên từ nội dòng liên kết đỏ") end if __state.toplevel_redundant_etymology then table.insert(categories, "Trang có nguyên từ nội dòng thừa") end if __state.toplevel_idless_etymon then table.insert(categories, "Trang có nguyên từ thiếu ID") end if __state.has_mismatched_id then table.insert(categories, lang:getCanonicalName() .. " entries referencing etymons with mismatched IDs") end end if #categories > 0 then table.insert(output, M.utilities.format_categories(categories, lang)) end if __state.warnings then for _, warning in ipairs(__state.warnings) do table.insert(output, "\n" .. warning) end end return table.concat(output) end return export e7pk19hp4wzkm13nxd903zkcvwmrslz 𑣌𑣁𑣜𑣚𑣁 0 332029 2345165 2216620 2026-04-14T07:33:25Z WhoAlone 40420 2345165 wikitext text/x-wiki =={{langname|hoc}}== ==={{ĐM|noun}}=== {{head|hoc|Danh từ|tr=karla}} # [[mướp đắng]], [[khổ qua]]. {{c|hoc|Trái cây}} 89aw08e4i40dn7w6z3j7dshm5jo7py9 0 335845 2345002 2222232 2026-04-13T14:14:17Z WhoAlone 40420 2345002 wikitext text/x-wiki {{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=32|rad=土|as=06|sn=9|four=42161|canj=GHMR|ids=⿰土后}} ===={{ĐM|drv}}==== * {{l|mul|[[𢞄]], [[𬈉]]}} ===={{ĐM|ref}}==== * {{Han ref|kx=0228.190|dkj=05058|dj=0464.150|hdz=10440.010|uh=57A2|ud=22434|bh=ABAF|bd=43951}} =={{langname|jpx-hcj}}== {{attention|jpx-hcj}} ==={{ĐM|kanji}}=== {{jpx-hcj-kanji}} ==={{ĐM|reading}}=== {{jpx-hcj-readings |kun=あか- }} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|あか}} # [[bụi]] [[bẩn]]. cgu5wc7io646d42k3sudulghtfgvhxa Mô đun:tr-verb form of 828 338056 2345035 2344060 2026-04-14T00:18:08Z Hiyuune 50834 2345035 Scribunto text/plain local export = {} local m_harmony = require("Module:tr-harmony") local m_form_of = require("Module:form of") local lang = require("Module:languages").getByCode("tr") function export.show(frame) local args = require "Module:parameters".process(frame:getParent().args, { [1] = { required = true }, ["title"] = { default = nil }, }) local lemma = args[1] local title = args["title"] or mw.loadData("Module:headword/data").pagename if not mw.ustring.match(lemma, "m[ae]k$") then error("dạng từ phải kết thúc bằng -mak hoặc -mek") end local stem = lemma:sub(1, -4) local soft_stem = m_harmony.soften(stem) local has_soft_stem = stem ~= soft_stem local stem_last_word = mw.ustring.match(stem, "(%w+)$") local one_syllable = not mw.ustring.match(stem_last_word, "[" .. m_harmony.vowels .. "][^" .. m_harmony.vowels .. "]+[" .. m_harmony.vowels .. "]") local etmek_style = mw.ustring.match(stem, "et$") local could_have_2_way_aorist = one_syllable or etmek_style forms = {} local lemma_obj = { lang = lang, term = lemma, } function add_form_to_base(base, suffixes, tags) suffixed = m_harmony.attach_suffixes(base, suffixes, nil, could_have_2_way_aorist, true) for _, form in ipairs(suffixed) do forms[form] = tags end end function add_form(suffixes, tags) add_form_to_base(stem, suffixes, tags) if has_soft_stem then -- here, more checks could potentially be added based on the suffixes add_form_to_base(soft_stem, suffixes, tags) end end -- mệnh lệnh add_form("", { "imp", "ở", "2", "s" }) add_form("sIn", { "imp", "ở", "3", "s" }) add_form("YIn", { "imp", "ở", "2", "p" }) add_form("YInIz", { "imp", "polite", "ở", "2", "p" }) add_form("sInlAr", { "imp", "ở", "3", "p" }) add_form("mA", { "imp", "neg", "ở", "2", "s" }) add_form("mAsIn", { "imp", "neg", "ở", "3", "s" }) add_form("mAyIn", { "imp", "neg", "ở", "2", "p" }) add_form("mAyInIz", { "imp", "polite", "neg", "ở", "2", "p" }) add_form("mAsInlAr", { "imp", "neg", "ở", "2", "p" }) -- trần thuật --- quá khứ bất định add_form("RIm", { "ind", "aor", "ở", "1", "s" }) add_form("RsIn", { "ind", "aor", "ở", "2", "s" }) add_form("R", { "ind", "aor", "ở", "3", "s" }) add_form("RIz", { "ind", "aor", "ở", "1", "p" }) add_form("RsInIz", { "ind", "aor", "ở", "2", "p" }) add_form("RlAr", { "ind", "aor", "ở", "3", "p" }) add_form("mAm", { "ind", "neg", "aor", "ở", "1", "s" }) add_form("mAzsIn", { "ind", "neg", "aor", "ở", "2", "s" }) add_form("mAz", { "ind", "neg", "aor", "ở", "3", "s" }) add_form("mAyIz", { "ind", "neg", "aor", "ở", "1", "p" }) add_form("mAzsInIz", { "ind", "neg", "aor", "ở", "2", "p" }) add_form("mAzlAr", { "ind", "neg", "aor", "ở", "3", "p" }) --- quá khứ đơn add_form("DIm", { "ind", "simple past", "ở", "1", "s" }) add_form("DIn", { "ind", "simple past", "ở", "2", "s" }) add_form("DI", { "ind", "simple past", "ở", "3", "s" }) add_form("DIk", { "ind", "simple past", "ở", "1", "p" }) add_form("DInIz", { "ind", "simple past", "ở", "2", "p" }) add_form("DIlAr", { "ind", "simple past", "ở", "3", "p" }) add_form("mAdIm", { "ind", "neg", "simple past", "ở", "1", "s" }) add_form("mAdIn", { "ind", "neg", "simple past", "ở", "2", "s" }) add_form("mAdI", { "ind", "neg", "simple past", "ở", "3", "s" }) add_form("mAdIk", { "ind", "neg", "simple past", "ở", "1", "p" }) add_form("mAdInIz", { "ind", "neg", "simple past", "ở", "2", "p" }) add_form("mAdIlAr", { "ind", "neg", "simple past", "ở", "3", "p" }) --- tương lai add_form("YAcAğIm", { "ind", "fut", "ở", "1", "s" }) add_form("YAcAksIn", { "ind", "fut", "ở", "2", "s" }) add_form("YAcAk", { "ind", "fut", "ở", "3", "s" }) add_form("YAcAğIz", { "ind", "fut", "ở", "1", "p" }) add_form("YAcAksInIz", { "ind", "fut", "ở", "2", "p" }) add_form("YAcAklAr", { "ind", "fut", "ở", "3", "p" }) add_form("mAyAcAğIm", { "ind", "neg", "fut", "ở", "1", "s" }) add_form("mAyAcAksIn", { "ind", "neg", "fut", "ở", "2", "s" }) add_form("mAyAcAk", { "ind", "neg", "fut", "ở", "3", "s" }) add_form("mAyAcAğIz", { "ind", "neg", "fut", "ở", "1", "p" }) add_form("mAyAcAksInIz", { "ind", "neg", "fut", "ở", "2", "p" }) add_form("mAyAcAklAr", { "ind", "neg", "fut", "ở", "3", "p" }) --- phân từ add_form("YAn", { "ptcp", "pres"}) --- danh động từ add_form("YArAk", { "gerund" }) add_form("Ip", { "gerund" }) tags = forms[title] if tags then return m_form_of.tagged_inflections { lang = lang, tags = tags, lemmas = {lemma_obj}, lemma_face = "term", POS = "verb" } else error("không rõ biến thể hình thái động từ") end end return export omgf2ggaobph2a0c3arb5l3pgcg5cfm Mô đun:gl-verb 828 339351 2345197 2269173 2026-04-14T11:03:27Z Hiyuune 50834 2345197 Scribunto text/plain --[=[ This module implements {{gl-conj}} and provides the underlying conjugation functions for {{gl-verb}} (whose actual formatting is done in [[Module:gl-headword]]). This module uses the standard norm for Galician spelling. See also [[Module:gl-reinteg-verb]], which implements the reintegrationist norm. Authorship: Ben Wing <benwing2> ]=] local export = {} --[=[ TERMINOLOGY: -- "slot" = A particular combination of tense/mood/person/number/etc. Example slot names for verbs are "pres_1s" (present indicative first-person singular), "pres_sub_2s" (present subjunctive second-person singular) "impf_sub_3p" (imperfect subjunctive third-person plural). Each slot is filled with zero or more forms. -- "form" = The conjugated Galician form representing the value of a given slot. -- "lemma" = The dictionary form of a given Galician term. For Galician, always the infinitive. ]=] --[=[ FIXME: --]=] local lang = require("Module:languages").getByCode("gl") local m_string_utilities = require("Module:string utilities") local m_links = require("Module:links") local m_table = require("Module:table") local iut = require("Module:inflection utilities") local put = require("Module:parse utilities") local com = require("Module:gl-common") local force_cat = false -- set to true for debugging local check_for_red_links = false -- set to false for debugging local rfind = mw.ustring.find local rmatch = mw.ustring.match local rsplit = mw.text.split local rsub = com.rsub local u = mw.ustring.char local function link_term(term, display) return m_links.full_link({ lang = lang, term = term, alt = display }, "term") end local V = com.V -- vowel regex class local AV = com.AV -- accented vowel regex class local C = com.C -- consonant regex class local TEMPC1 = u(0xFFF1) -- temporary character used for consonant substitutions local short_pp_footnote = "[usually used with auxiliary verbs " .. link_term("ser") .. " and " .. link_term("estar") .. "]" local long_pp_footnote = "[usually used with auxiliary verbs " .. link_term("haber") .. " and " .. link_term("ter") .. "]" --[=[ Vowel alternations: <i-e>: 'i' in pres1s, imp2s and the whole present subjunctive; 'e' elsewhere when stressed. Generally 'e' otherwise when unstressed. E.g. [[sentir]], [[conseguir]] (the latter additionally with 'gu-g' alternation). <u-o>: 'u' in pres1s, imp2s and the whole present subjunctive; 'o' elsewhere when stressed. Generally 'u' otherwise when unstressed. E.g. [[durmir]], [[subir]]. <i>: 'i' whenever stressed (in the present singular and third plural) and throughout the whole present subjunctive. Otherwise 'e'. E.g. [[vestir]], [[pedir]]. <u>: 'u' whenever stressed (in the present singular and third plural) and throughout the whole present subjunctive. Otherwise 'o'. There may be no such verbs in standard Galician. <í>: The last 'i' of the stem) becomes 'í' when stressed. E.g.: * [[faiscar]] (only3sp; faísca, faíscan, faísque, faísquen' also with 'c-qu' alternation), [[acainzar]], [[avaiñar]], [[cainzar]], [[caiñar]], [[desenvaiñar]], [[envaiñar]], [[arremuiñar]], [[arrepuiñar]], [[arruinar]], [[cuincar]], [[cuiñar]], [[muiñar]] * verbs in -eizar and -aizar, e.g. [[europeizar]] ('europeízo, europeíce', etc. also with 'z-c' alternation) * [[desenraizar]], [[enraizar]], [[hebraizar]], [[xudaizar]] * [[europeizar]], [[homoxeneizar]] * some verbs in -uizar: * [[enxuizar]] (enxuízo, enxuíza, enxuíce, enxuícen, also with 'z-c' alternation), [[axuizar]] * but not any in -guizar ([[arreguizar]], [[desgaleguizar]], [[empreguizar]], [[esguizar]], [[espreguizar]], [[galeguizar]]) or -quizar ([[catequizar]], [[esnaquizar]], [[xerarquizar]]) * none in -aiar? * not [[abraiar]], [[achaiar]], [[alfaiar]], [[amaiar]], [[arraiar]], [[atalaiar]], [[desmaiar]], [[encaiar]], [[engraiar]], [[ensaiar]], [[espraiar]], [[faiar]], [[laiar]], [[maiar]], [[raiar]], [[salaiar]] * unknown: [[craiar]] * some verbs in -biar: * [[adobiar]], [[asubiar]], [[espabiar]] * but not [[arrubiar]], [[asoberbiar]] /e/?, [[cambiar]], [[descambiar]], [[enrabiar]], [[ensoberbiar]] /e/?, [[entibiar]], [[gabiar]], [[gobiar]] /ɔ/, [[intercambiar]], [[rabiar]], [[recambiar]], [[sarabiar]] (only3s), [[turbiar]] * none in -ciar: * not [[acariciar]], [[agraciar]], [[anunciar]], [[apreciar]] /e/?, [[asociar]] /ɔ/, [[auspiciar]], [[autofinanciar]], [[aviciar]], [[axenciar]] /ɛ/, [[beneficiar]], [[comerciar]] /ɛ/, [[concienciar]] /ɛ/, [[conferenciar]] /e/?, [[congraciar]], [[denunciar]], [[depreciar]] /e/?, [[desasociar]] /ɔ/, [[desenviciar]], [[desgraciar]], [[desperdiciar]], [[diferenciar]] /e/?, [[dilixenciar]] /e/?, [[disociar]] /ɔ/, [[distanciar]], [[divorciar]] /ɔ/, [[enranciar]], [[ensuciar]], [[enunciar]], [[enviciar]], [[escanciar]], [[especiar]] /?/, [[evidenciar]] /e/?, [[financiar]], [[graciar]], [[influenciar]] /e/?, [[iniciar]], [[licenciar]] /ɛ/, [[maliciar]], [[negociar]] /ɔ/, [[oficiar]], [[potenciar]] /e/?, [[prenunciar]], [[presenciar]] /e/?, [[pronunciar]], [[propiciar]], [[quintaesenciar]] /e/?, [[reiniciar]], [[renunciar]], [[reverenciar]] /e/?, [[saciar]], [[sentenciar]] /e/?, [[silenciar]] /e/?, [[viciar]] * some verbs in -diar: * [[adiar]], [[vadiar]] * but not [[asediar]] /ɛ/, [[compendiar]] /ɛ/, [[custodiar]] /ɔ/, [[deslendiar]] /e/?, [[entremediar]] /e/?, [[estipendiar]] /e/?, [[fastidiar]], [[incendiar]] /e/?, [[insidiar]], [[irradiar]], [[mediar]] /e/?, [[odiar]] /ɔ/, [[parodiar]] /ɔ/, [[preludiar]], [[radiar]], [[remediar]] /ɛ/, [[repudiar]], [[salmodiar]] /ɔ/, [[subsidiar]], [[vilipendiar]] /ɛ/ * some verbs in -fiar: * [[afiar]], [[confiar]], [[desafiar]], [[desconfiar]], [[desenfiar]], [[enfiar]], [[esfiar]], [[esgrafiar]], [[fiar]], [[porfiar]], probably [[sobrefiar]] (not indicated) * but not [[atrofiar]] /ɔ/, [[hipertrofiar]] /ɔ/ * verbs in -guiar: * [[guiar]], [[radioguiar]], [[teleguiar]] * verbs in -hiar: * [[chiar]], [[rechiar]], [[rechouchiar]] * some verbs in -liar: * [[aliar]] (alío, alía, alíe, alíen), [[ampliar]], [[avaliar]], [[desliar]], [[liar]] * but not [[afiliar]] (afilio, afilia, afilie, afilien), [[auxiliar]], [[conciliar]], [[defoliar]], [[domiciliar]], [[escoliar]], [[espoliar]], [[exfoliar]], [[exiliar]], [[interfoliar]], [[reconciliar]] * [[paliar]] goes both ways: 'palio/palío', 'palia/palía', 'palie/palíe', 'palien/palíen' * unknown: [[represaliar]] * some verbs in -miar: * [[gurrumiar]], [[miar]] * but not [[agremiar]], [[amomiar]], [[encomiar]], [[premiar]], [[rumiar]] * some verbs in -niar: * [[agoniar]], [[desagoniar]] * but not [[calumniar]], [[conxeniar]], [[herniar]], [[miniar]] * none in -oiar? * not [[aboiar]] /ɔ/, [[acoiar]] /ɔ/, [[apoiar]] /o/, [[arroiar]] /o/ (only3s), [[choiar]]/[[enchoiar]] /ɔ/, [[enxoiar]] /ɔ/, [[loiar]] /o/ * some verbs in -piar: * [[arrepiar]], [[espiar]], [[expiar]], [[piar]] * but not [[apropiar]], [[copiar]], [[expropiar]], [[fotocopiar]], [[lurpiar]], [[principiar]], [[recopiar]], [[tapiar]], [[xerocopiar]] * some verbs in -quiar: * [[esquiar]], [[maquiar]], [[remaquiar]], [[tosquiar]] * but not [[obsequiar]] * unknown: [[franquiar]] * some verbs in -riar: * [[arrefriar]], [[arriar]], [[avariar]], [[criar]], [[desvariar]], [[enriar]], [[escagarriar]], [[estriar]], [[malcriar]], [[recriar]], [[variar]] * but not [[anguriar]], [[asalariar]], [[cariar]] (only3sp), [[contrariar]], [[desmemoriar]], [[expatriar]], [[gloriar]], [[historiar]], [[inventariar]], [[inxuriar]], [[leriar]], [[repatriar]], [[seriar]], [[vangloriar]] * some verbs in -siar: * [[fantasiar]] * but not [[anestesiar]], [[extasiar]] * [[ansiar]] goes both ways: 'ansio/ansío', 'ansia/ansía', 'ansie/ansíe', 'ansien/ansíen' * some verbs in -tiar: * [[amnistiar]], [[desenfastiar]], [[enfastiar]] * but not [[angustiar]], [[sitiar]] * some verbs in -viar: * [[ataviar]], [[aviar]], [[desataviar]], [[desviar]], [[enviar]], [[extraviar]], [[reenviar]] * but not [[abreviar]], [[agraviar]], [[aliviar]], [[desagraviar]], [[diluviar]] (only3s), [[obviar]] * some verbs in -xiar: * [[vixiar]] * but not [[asfixiar]], [[colexiar]] /e/, [[contaxiar]], [[desprestixiar]], [[eloxiar]], [[plaxiar]], [[presaxiar]], [[prestixiar]], [[privilexiar]] /e/, [[refuxiar]] <ú>: The last 'u' of the stem becomes 'ú' when stressed. E.g.: * [[reunir]] ('reúno, reúne(s), reúnem, reúna(s), reúnan') * [[esmiuzar]] ('esmiúzo, esmiúza(s), esmiúza, esmiúce(s), esmiúcen' also with 'z-c' alternation) * [[saudar]] ('saúdo, saúda(s), saúda, saúde(s), saúden') * [[auñar]], [[desembaular]], [[embaular]] * [[afiuzar]], [[desafiuzar]], [[desmiudar]], [[desmiuzar]], [[enviuvar]], [[esmiuzar]] but not [[triunfar]] * NOTE: It seems most or all verbs in -uar other than in -guar, -quar have stressed ú, so we make it the default. ]=] local vowel_alternants = m_table.listToSet({"i-e", "i", "í", "u-o", "u", "ú", "+"}) local vowel_alternant_to_desc = { ["i-e"] = "''i-e'' alternation in present singular", ["i"] = "''e'' becomes ''i'' when stressed", ["í"] = "''i'' becomes ''í'' when stressed", ["u-o"] = "''u-o'' alternation in present singular", ["u"] = "''o'' becomes ''u'' when stressed", ["ú"] = "''u'' becomes ''ú'' when stressed", } local vowel_alternant_to_cat = { ["i-e"] = "i-e alternation in present singular", ["i"] = "e becoming i when stressed", ["í"] = "i becoming í when stressed", ["u-o"] = "u-o alternation in present singular", ["u"] = "o becoming u when stressed", ["ú"] = "u becoming ú when stressed", } local all_persons_numbers = { ["1s"] = "1|s", ["2s"] = "2|s", ["3s"] = "3|s", ["1p"] = "1|p", ["2p"] = "2|p", ["3p"] = "3|p", } local person_number_list = {"1s", "2s", "3s", "1p", "2p", "3p"} local imp_person_number_list = {"2s", "3s", "1p", "2p", "3p"} local neg_imp_person_number_list = {"2s", "3s", "1p", "2p", "3p"} person_number_to_reflexive_pronoun = { ["1s"] = "me", ["2s"] = "te", ["3s"] = "se", ["1p"] = "nos", ["2p"] = "vos", ["3p"] = "se", } local indicator_flags = m_table.listToSet { "no_pres_stressed", "no_pres1_and_sub", "only3s", "only3sp", "only3p", "noimp", "pp_inv", "irreg", "no_built_in", } -- Initialize all the slots for which we generate forms. local function add_slots(alternant_multiword_spec) -- "Basic" slots: All slots that go into the regular table (not the reflexive form-of table). alternant_multiword_spec.verb_slots_basic = { {"infinitive", "inf"}, {"infinitive_linked", "inf"}, {"gerund", "ger"}, {"short_pp_ms", "short|m|s|past|part"}, {"short_pp_fs", "short|f|s|past|part"}, {"short_pp_mp", "short|m|p|past|part"}, {"short_pp_fp", "short|f|p|past|part"}, {"pp_ms", "m|s|past|part"}, {"pp_fs", "f|s|past|part"}, {"pp_mp", "m|p|past|part"}, {"pp_fp", "f|p|past|part"}, } -- Special slots used to handle non-reflexive parts of reflexive verbs in {{gl-verb form of}}. For example, for a -- reflexive-only verb like [[arrepentirse]], we want to be able to use {{gl-verb form of}} on [[arrepinta]] (which -- should mention that it is a part of 'me arrepinta', first-person singular present subjunctive, and -- 'se arrepinta', third-person singular present subjunctive) or on [[arrepentimos]] (which should mention that it -- is a part of 'arrepentímonos', first-person plural present indicative or preterite). Similarly, we want to use -- {{gl-verb form of}} on [[arrepentindo]] (which should mention that it is a part of 'se ... arrepentindo', -- syntactic variant of [[arrepentíndose]], which is the gerund of [[arrepentirse]]). To do this, we need to be -- able to map non-reflexive parts like [[arrepinta]], [[arrepentimos]], [[arrepentindo]], etc. to their reflexive -- equivalent(s), to the tag(s) of the equivalent(s), and, in the case of forms like [[arrepentindo]], -- [[arrepentir]] and imperatives, to the separated syntactic variant of the verb+clitic combination. We do this by -- creating slots for the non-reflexive part equivalent of each basic reflexive slot, and for the separated -- syntactic-variant equivalent of each basic reflexive slot that is formed of verb+clitic. We use slots in this -- way to deal with multiword lemmas. Note that we run into difficulties mapping between reflexive verbs, -- non-reflexive part equivalents, and separated syntactic variants if a slot contains more than one form. To -- handle this, if there are the same number of forms in two slots we're trying to match up, we assume the forms -- match one-to-one; otherwise we don't match up the two slots (which means {{gl-verb form of}} won't work in this -- case, but such a case is extremely rare and not worth worrying about). Alternatives that handle this "properly" -- are significantly more complicated and require non-trivial modifications to [[Module:inflection utilities]]. local need_special_verb_form_of_slots = alternant_multiword_spec.source_template == "gl-verb form of" and alternant_multiword_spec.refl if need_special_verb_form_of_slots then alternant_multiword_spec.verb_slots_reflexive_verb_form_of = { {"infinitive_non_reflexive", "-"}, {"infinitive_variant", "-"}, {"gerund_non_reflexive", "-"}, {"gerund_variant", "-"}, } else alternant_multiword_spec.verb_slots_reflexive_verb_form_of = {} end -- Add entries for a slot with person/number variants. -- `verb_slots` is the table to add to. -- `slot_prefix` is the prefix of the slot, typically specifying the tense/aspect. -- `tag_suffix` is a string listing the set of inflection tags to add after the person/number tags. -- `person_number_list` is a list of the person/number slot suffixes to add to `slot_prefix`. local function add_personal_slot(verb_slots, slot_prefix, tag_suffix, person_number_list) for _, persnum in ipairs(person_number_list) do local persnum_tag = all_persons_numbers[persnum] local slot = slot_prefix .. "_" .. persnum local accel = persnum_tag .. "|" .. tag_suffix table.insert(verb_slots, {slot, accel}) end end -- Add a personal slot (i.e. a slot with person/number variants) to `verb_slots_basic`. local function add_basic_personal_slot(slot_prefix, tag_suffix, person_number_list, no_special_verb_form_of_slot) add_personal_slot(alternant_multiword_spec.verb_slots_basic, slot_prefix, tag_suffix, person_number_list) -- Add special slots for handling non-reflexive parts of reflexive verbs in {{gl-verb form of}}. -- See comment above in `need_special_verb_form_of_slots`. if need_special_verb_form_of_slots and not no_special_verb_form_of_slot then for _, persnum in ipairs(person_number_list) do local persnum_tag = all_persons_numbers[persnum] local basic_slot = slot_prefix .. "_" .. persnum local accel = persnum_tag .. "|" .. tag_suffix table.insert(alternant_multiword_spec.verb_slots_reflexive_verb_form_of, {basic_slot .. "_non_reflexive", "-"}) end end end add_basic_personal_slot("pres", "pres|ind", person_number_list) add_basic_personal_slot("impf", "impf|ind", person_number_list) add_basic_personal_slot("pret", "pret|ind", person_number_list) add_basic_personal_slot("plup", "plup|ind", person_number_list) add_basic_personal_slot("fut", "fut|ind", person_number_list) add_basic_personal_slot("cond", "cond", person_number_list) add_basic_personal_slot("pres_sub", "pres|sub", person_number_list) add_basic_personal_slot("impf_sub", "impf|sub", person_number_list) add_basic_personal_slot("fut_sub", "fut|sub", person_number_list) add_basic_personal_slot("imp", "imp", imp_person_number_list) add_basic_personal_slot("pers_inf", "pers|inf", person_number_list) -- Don't need special non-reflexive-part slots because the negative imperative is multiword, of which the -- individual words are 'non' + subjunctive. add_basic_personal_slot("neg_imp", "neg|imp", neg_imp_person_number_list, "no special verb form of") -- Don't need special non-reflexive-part slots because we don't want [[arrependendo]] mapping to [[arrependendo-me]] -- (only [[arrependendo-se]]) or [[arrepender]] mapping to [[arrepender-me]] (only [[arrepender-se]]). add_basic_personal_slot("infinitive", "inf", person_number_list, "no special verb form of") add_basic_personal_slot("gerund", "ger", person_number_list, "no special verb form of") -- Generate the list of all slots. alternant_multiword_spec.all_verb_slots = {} for _, slot_and_accel in ipairs(alternant_multiword_spec.verb_slots_basic) do table.insert(alternant_multiword_spec.all_verb_slots, slot_and_accel) end for _, slot_and_accel in ipairs(alternant_multiword_spec.verb_slots_reflexive_verb_form_of) do table.insert(alternant_multiword_spec.all_verb_slots, slot_and_accel) end alternant_multiword_spec.verb_slots_basic_map = {} for _, slotaccel in ipairs(alternant_multiword_spec.verb_slots_basic) do local slot, accel = unpack(slotaccel) alternant_multiword_spec.verb_slots_basic_map[slot] = accel end end local overridable_stems = {} local function allow_multiple_values(separated_groups, data) local retvals = {} for _, separated_group in ipairs(separated_groups) do local footnotes = data.fetch_footnotes(separated_group) local retval = {form = separated_group[1], footnotes = footnotes} table.insert(retvals, retval) end return retvals end local function simple_choice(choices) return function(separated_groups, data) if #separated_groups > 1 then data.parse_err("For spec '" .. data.prefix .. ":', only one value currently allowed") end if #separated_groups[1] > 1 then data.parse_err("For spec '" .. data.prefix .. ":', no footnotes currently allowed") end local choice = separated_groups[1][1] if not m_table.contains(choices, choice) then data.parse_err("For spec '" .. data.prefix .. ":', saw value '" .. choice .. "' but expected one of '" .. table.concat(choices, ",") .. "'") end return choice end end for _, overridable_stem in ipairs { "pres_unstressed", "pres_stressed", "pres1_and_sub", -- Don't include pres1; use pres_1s if you need to override just that form "impf", "full_impf", {"pret_conj", simple_choice({"irreg", "ar", "er", "ir"}) }, "pret_base", "pret", "short_pret", "fut", "cond", "pres_sub_stressed", "pres_sub_unstressed", {"sub_conj", simple_choice({"ar", "er"}) }, "plup", "impf_sub", "fut_sub", "pers_inf", "pp", "short_pp", } do if type(overridable_stem) == "string" then overridable_stems[overridable_stem] = allow_multiple_values else local stem, validator = unpack(overridable_stem) overridable_stems[stem] = validator end end -- Useful as the value of the `match` property of a built-in verb. `main_verb_spec` is a Lua pattern that should match -- the non-prefixed part of a verb, and `prefix_specs` is a list of Lua patterns that should match the prefixed part of -- a verb. If a prefix spec is preceded by ^, it must match exactly at the beginning of the verb; otherwise, additional -- prefixes (e.g. re-, des-) may precede. Return the prefix and main verb. local function match_against_verbs(main_verb_spec, prefix_specs) return function(verb) for _, prefix_spec in ipairs(prefix_specs) do if prefix_spec:find("^%^") then -- must match exactly prefix_spec = prefix_spec:gsub("^%^", "") if prefix_spec == "" then -- We can't use the second branch of the if-else statement because an empty () returns the current position -- in rmatch(). local main_verb = rmatch(verb, "^(" .. main_verb_spec .. ")$") if main_verb then return "", main_verb end else local prefix, main_verb = rmatch(verb, "^(" .. prefix_spec .. ")(" .. main_verb_spec .. ")$") if prefix then return prefix, main_verb end end else local prefix, main_verb = rmatch(verb, "^(.*" .. prefix_spec .. ")(" .. main_verb_spec .. ")$") if prefix then return prefix, main_verb end end end return nil end end --[=[ Built-in (usually irregular) conjugations. Each entry is processed in turn and consists of an object with two fields: 1. match=: Specifies the built-in verbs that match this object. 2. forms=: Specifies the built-in stems and forms for these verbs. The value of match= is either a string beginning with "^" (match only the specified verb), a string not beginning with "^" (match any verb ending in that string), or a function that is passed in the verb and should return the prefix of the verb if it matches, otherwise nil. The function match_against_verbs() is provided to facilitate matching a set of verbs with a common ending and specific prefixes (e.g. [[ter]] and [[ater]] but not [[abater]], etc.). The value of forms= is a table specifying stems and individual override forms. Each key of the table names either a stem (e.g. `pres_stressed`), a stem property (e.g. `vowel_alt`) or an individual override form (e.g. `pres_1s`). Each value of a stem can either be a string (a single stem), a list of strings, or a list of objects of the form {form = STEM, footnotes = {FOONOTES}}. Each value of an individual override should be of exactly the same form except that the strings specify full forms rather than stems. The values of a stem property depend on the specific property but are generally strings or booleans. In order to understand how the stem specifications work, it's important to understand the phonetic modifications done by combine_stem_ending(). In general, the complexities of predictable prefix, stem and ending modifications are all handled in this function. In particular: 1. Spelling-based modifications (c/z, g/gu, gu/gü, g/j) occur automatically as appropriate for the ending. 2. If the stem begins with an acute accent, the accent is moved onto the last vowel of the prefix (for handling verbs in -uar such as [[minguar]], pres_3s 'míngua'). 3. If the ending begins with a double asterisk, this is a signal to conditionally delete the accent on the last letter of the stem. "Conditionally" means we don't do it if the last two letters would form a diphthong without the accent on the second one (e.g. in [[sair]], with stem 'saí'); but as an exception, we do delete the accent in stems ending in -guí, -quí (e.g. in [[conseguir]]) because in this case the ui isn't a diphthong. 4. If the ending begins with an asterisk, this is a signal to delete the accent on the last letter of the stem, e.g. fizé -> fizermos. Unlike for **, this removal is unconditional, so we get e.g. 'sairmos' not #'saírmos'. 5. If ending begins with i, it must get an accent after an unstressed vowel (in some but not all cases) to prevent the two merging into a diphthong. See combine_stem_ending() for specifics. The following stems are recognized: -- pres_unstressed: The present indicative unstressed stem (1p, 2p). Also controls the imperative 2p and gerund. Defaults to the infinitive stem (minus the ending -ar/-er/-ir/-or). -- pres_stressed: The present indicative stressed stem (1s, 2s, 3s, 3p). Also controls the imperative 2s. Default is empty if indicator `no_pres_stressed`, else a vowel alternation if such an indicator is given (e.g. `ue`, `ì`), else the infinitive stem. -- pres1_and_sub: Overriding stem for 1s present indicative and the entire subjunctive. Only set by irregular verbs and by the indicators `no_pres_stressed` (e.g. [[precaver]]) and `no_pres1_and_sub` (since verbs of this sort, e.g. [[puir]], are missing the entire subjunctive as well as the 1s present indicative). Used by many irregular verbs, e.g. [[caber]], verbs in '-air', [[dizer]], [[ter]], [[valer]], etc. Some verbs set this and then supply an override for the pres_1s if it's irregular, e.g. [[saber]], with irregular subjunctive stem "saib-" and special 1s present indicative "sei". -- pres1: Special stem for 1s present indicative. Normally, do not set this explicitly. If you need to specify an irregular 1s present indicative, use the form override pres_1s= to specify the entire form. Defaults to pres1_and_sub if given, else pres_stressed. -- pres_sub_unstressed: The present subjunctive unstressed stem (1p, 2p). Defaults to pres1_and_sub if given, else the infinitive stem. -- pres_sub_stressed: The present subjunctive stressed stem (1s, 2s, 3s, 1p). Defaults to pres1. -- sub_conj: Determines the set of endings used in the subjunctive. Should be one of "ar" or "er". -- impf: The imperfect stem (not including the -av-/-i- stem suffix, which is determined by the conjugation). Defaults to the infinitive stem. -- full_impf: The full imperfect stem missing only the endings (-a, -as, -am, etc.). Used for verbs with irregular imperfects such as [[ser]], [[ter]], [[vir]] and [[pór]]. -- pret_conj: Determines the set of endings used in the preterite. Should be one of "ar", "er", "ir" or "irreg". Defaults to the conjugation as determined from the infinitive. When pret_conj == "irreg", `pret` is used, otherwise `pret_base`. -- pret_base: The preterite stem (not including the -a-/-e-/-i- stem suffix). Defaults to the infinitive stem. Only used when pret_conj ~= "irreg". -- pret: The full preterite stem missing only the endings (-ste, -mos, etc.), e.g. 'fige', 'fo'. Only used for verbs with irregular preterites (pret_conj == "irreg") such as [[facer]], [[poder]], [[traer]], etc. The pret_1s and pret_3s are handled using the short_pret stem instead (pret_1s '-en', pret_3s '-o'). Defaults to `pret_base` + the conjugation vowel. -- short_pret: The short preterite stem, used with 1s and 3s endings (pret_1s '-en', pret_3s '-o'). Only used with irregular preterites (pret_conj == "irreg"). Normally derived from pret by deleting the final vowel, and doesn't need to be given explicitly. -- fut: The future stem. Defaults to the infinitive stem + the conjugation vowel. -- cond: The conditional stem. Defaults to `fut`. -- impf_sub: The imperfect subjunctive stem. Defaults to `pret`. -- fut_sub: The future subjunctive stem. Defaults to `pret`. -- plup: The pluperfect stem. Defaults to `pret`. -- pers_inf: The personal infinitive stem. Defaults to the infinitive stem + the conjugation vowel. -- pp: The masculine singular past participle. Default is based on the verb conjugation: infinitive stem + '-ado' for -ar verbs, otherwise infinitive stem + '-ido'. -- short_pp: The short masculine singular past participle, for verbs with such a form. No default. -- pp_inv: `true` if the past participle exists only in the masculine singular. ]=] local built_in_conjugations = { -------------------------------------------------------------------------------------------- -- -ar -- -------------------------------------------------------------------------------------------- -- Verbs not needing entries here: -- -- (1) Verbs with short past participles: need to specify the short pp explicitly. -- -- aceitar: use <short_pp:aceite> -- anexar, completar, expressar, expulsar, findar, fritar, ganhar, gastar, limpar, pagar, pasmar, pegar, soltar: -- use <short_pp:anexo> etc. -- assentar: use <short_pp:assente> -- entregar: use <short_pp:entregue> -- enxugar: use <short_pp:enxuto> -- matar: use <short_pp:morto> -- -- (2) Verbs with orthographic consonant alternations: handled automatically. -- -- -car (brincar, buscar, pecar, trancar, etc.): automatically handled in combine_stem_ending() -- -zar (alcanzar, comezar, lazar): automatically handled in combine_stem_ending() -- -gar (apagar, cegar, esmagar, largar, navegar, resmungar, sugar, etc.): automatically handled in combine_stem_ending() -- -guar (iguar, minguar): automatically handled in combine_stem_ending() -- -- (3) Verbs with vowel alternations: need to specify the alternation explicitly unless it always happens, in -- which case it's handled automatically through an entry below. -- -- esmiuzar changing to esmiúzo: use <ú> -- faiscar changing to faísco: use <í> -- -izar changing to -ízo (ajuizar, enraizar, homogeneizar, plebeizar, etc.): use <í> -- reusar changing to reúso: use <ú> -- saudar changing to saúdo: use <ú> -- tuitar/retuitar changing to (re)tuíto: use <í> { -- dar match = "^dar", -- [[desdar]] doesn't seem to exist; [[redar]] is regular and unrelated to [[dar]] forms = { pres_1s = "dou", pres_2s = "dás", pres_3s = "dá", pres_3p = "dán#", pres1_and_sub = "de", -- only for subjunctive as we override pres_1s sub_conj = "er", pret_conj = "irreg", pret = "de", pret_1s = "dei", pret_3s = "deu", -- /dɛw/ irreg = true, } }, { -- estar match = "^estar", -- [[sobestar]] and [[sobrestar]] seem not to exist forms = { pres_1s = "estou", pres_2s = "estás", pres_3s = "está", pres_3p = "están", pres1_and_sub = "este", -- only for subjunctive as we override pres_1s sub_conj = "er", pret_conj = "irreg", pret = "estive", pp_inv = true, -- no [[sobestar]] or [[sobrestar]], which would be transitive irreg = true, } }, { -- verbs in -uar but not -guar match = function(verb) if verb:find("guar$") then return nil else return match_against_verbs("uar", {""})(verb) end end, forms = { vowel_alt = "ú", } }, -------------------------------------------------------------------------------------------- -- -er -- -------------------------------------------------------------------------------------------- -- Verbs not needing entries here: -- -- -cer (verbs in -ecer, vencer, etc.): automatically handled in combine_stem_ending() -- -guer (erguer/soerguer): automatically handled in combine_stem_ending() { -- must be listed before -aer match = "^traer", forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() pres1_and_sub = "trai", pret_conj = "irreg", pret = "trouxe", irreg = true, } }, { -- verbs in -aer (caer, raer, debaer, degraer, esvaer and derivatives of traer, but not traer itself: -- acaer/decaer/recaer, -- abstraer/atraer/contraer/descontraer/detraer/distraer/extraer/maltraer/retraer/retrotraer/subtraer) match = "aer", forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() pres1_and_sub = "ai", irreg = true, } }, { -- caber match = "caber", forms = { pres1_and_sub = "caib", pret_conj = "irreg", pret = "coube", irreg = true, } }, { -- crer, descrer match = "crer", forms = { pres1_and_sub = "cre", pres_2s = "crés#", pres_3s = "cré#", pres_3p = "crén#", -- regular except the lack of accent in base verb pret_1p = "crín#", irreg = true, } }, { -- acender, prender/aprender; not comprender/desprender/reprender, etc. match = match_against_verbs("ender", {"^ac", "^pr", "^apr"}), forms = {short_pp = "eso"}, }, { -- erguer; but not soerguer match = "^erguer", forms = {short_pp = "ergueito"}, }, { -- facer, afacer, contrafacer, desafacer, desfacer, perfacer, rarefacer, refacer, satisfacer, tumefacer match = "facer", forms = { -- use 'fagu' because we're in a front environment; if we use 'fag', we'll get '#fajo' pres1_and_sub = "fagu", pres_2s = "fás#", pres_3s = "fai", pres_3p = "fán#", pret_conj = "irreg", pret = "fixe", pp = "feito", fut = "far", irreg = true, cons_alt = false, -- avoid claiming we have a c-z alternation } }, { match = "^haber", forms = { pres_1s = "hei", pres_2s = "has", pres_3s = {"ha", "hai"}, pres_3p = "han", pres1_and_sub = "hax", -- only for subjunctive as we override pres_1s pret_conj = "irreg", pret = "hoube", noimp = true, irreg = true, } }, { -- ler, reler, trasler; not escoller, expeler, valer, etc. match = match_against_verbs("ler", {"^", "^re", "tras"}), forms = { pres1_and_sub = "le", pres_2s = "lés#", pres_3s = "lé#", pres_3p = "lén#", -- regular except the lack of accent in base verb pret_1p = "lín#", irreg = true, } }, { -- morrer, premorrer match = "morrer", forms = {pp = "morto"}, }, { -- nacer; but not renacer match = "^nacer", forms = {short_pp = "nado"}, }, { -- moer, but not remoer match = "^moer", forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() pres1_and_sub = "moi", short_pp = "mudo", -- the main table says 'mundo' but the page for [[mundo]] says 'mudo' is "máis recomendable" irreg = true, } }, { -- choer/deschoer, doer/condoer, remoer, proer, roer/corroer match = "oer", forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() pres1_and_sub = "oi", irreg = true, } }, { -- coller, toller and derivatives (acoller, desacoller, desencoller, encoller, entrecoller, escoller, recoller; -- destoller, entretoller) match = "oller", forms = {short_pp = "olleito"}, }, { -- poder match = "poder", forms = { pres1_and_sub = "poid", -- only for subjunctive as we override pres_1s pres_1s = "podo", -- /ɔ/ pret_conj = "irreg", pret = "puide", irreg = true, } }, { -- poñer, antepoñer, apoñer/desapoñer, arrepoñer, compoñer/descompoñer/recompoñer, contrapoñer, depoñer, -- dispoñer/indispoñer/predispoñer, empoñer, expoñer/sobreexpoñer/subexpoñer, impoñer/reimpoñer, interpoñer, -- opoñer, pospoñer, propoñer, repoñer, sobrepoñer, superpoñer, supoñer/presupoñer, traspoñer, xustapoñer match = "poñer", forms = { pres_2s = "pós#", pres_3s = "pón#", pret_conj = "irreg", pret = "puxe", pp = "posto", irreg = true, } }, { -- pracer, but not apracer, compracer, descompracer, despracer match = "^pracer", forms = { pret_conj = "irreg", pret = "prougue", irreg = true, } }, -- prover below, just below ver { -- querer match = "querer", forms = { pres1_and_sub = "queir", -- only for subjunctive as we override pres_1s pres_1s = "quero", -- /ɛ/ pret_conj = "irreg", pret = "quixe", irreg = true, } }, { -- romper; but not corromper, interromper, irromper or prorromper match = "^romper", forms = {short_pp = "roto"}, }, { -- saber, ressaber match = "saber", forms = { pres_1s = "sei", pres1_and_sub = "saib", -- only for subjunctive as we override pres_1s pret_conj = "irreg", pret = "soube", irreg = true, } }, { -- absolver, disolver, resolver match = "solver", forms = {short_pp = "solto"}, }, { -- suspender; but not others in -pender match = "suspender", forms = {short_pp = "suspenso"}, }, { match = "^ser", forms = { pres_1s = "son", pres_2s = "es", pres_3s = "é", pres_1p = "somos", pres_2p = "sodes", pres_3p = "son", pres1_and_sub = "sex", -- only for subjunctive as we override pres_1s full_impf = "er", pret_conj = "irreg", pret = "fo", pret_1s = "fun", pret_2s = "fuches", pret_3s = "foi", imp_2s = "sé", imp_2p = "sede", irreg = true, } }, { -- We want to match abster, conter, deter, etc. but not abater, cometer, etc. No way to avoid listing each verb. match = match_against_verbs("ter", {"abs", "^a", "con", "de", "entre", "man", "ob", "^re", "sos", "^"}), forms = { pres_2s = "tés#", pres_3s = "tén#", pres_2p = {"tendes", "tedes"}, pres_3p = "teñen", pres1_and_sub = "teñ", full_impf = "tiñ", pret_conj = "irreg", pret = "tive", irreg = true, } }, -- traer listed above at the beginning of the -er verbs { -- valer, equivaler match = "valer", forms = { pres1_and_sub = "vall", irreg = true, } }, { -- We want to match antever etc. but not absolver, atrever etc. No way to avoid listing each verb. -- NOTE: [[rever]] has two meanings, one with regular conjugation. Use <no_built_in> for this one. match = match_against_verbs("ver", {"entre", "pre", "^re", "^"}), forms = { pres_2s = "vés#", pres_3s = "vé#", pres_3p = "vén#", pres1_and_sub = "vex", pret_conj = "irreg", pret = "vi", pret_1s = "vín#", pret_3s = "viu", pp = "visto", irreg = true, } }, { -- [[prover]] has regular preterite and past participle match = "^prover", forms = { pres_2s = "provés", pres_3s = "prové", pres_3p = "provén", pres1_and_sub = "provex", short_pp = "provisto", irreg = true, } }, { -- [[desprover]] has its own conjugation match = "^desprover", forms = { pres_2s = "desprovés", pres_3s = "desprové", pres_3p = "desprovén", pres1_and_sub = "desprove", short_pp = "desprovisto", irreg = true, } }, { -- volver, avolver/desenvolver/devolver/envolver/revolver match = "volver", forms = {short_pp = "volto"}, }, -------------------------------------------------------------------------------------------- -- -ir -- -------------------------------------------------------------------------------------------- -- Verbs not needing entries here: -- -- subir (NOT rubir), acudir/sacudir (NOT escudir, aludir/eludir), urdir/desurdir, xurdir/rexurdir, -- engulir, pulir, bulir/rebulir, ulir, mulir (NOT escapulir), durmir, sumir/consumir/ensumir (NOT -- asumir/reasumir/presumir/resumir/subsumir), cuspir/chuspir, sufrir, tusir, xunguir/conxunguir/desxunguir, -- munguir, fuxir/muxir/ruxir: use <u-o> -- [NOTE: imp_2s durme, consume/sume] -- sosubir/susubir: use <u-o>? (archaic, not in RAG dictionary) -- abolir: use <no_pres_stressed> -- descolorir: use <no_pres_stressed> -- empedernir: use <no_pres_stressed> -- espir/despir, refletir, adherir, pedir/desapedir/despedir/expedir/impedir/reexpedir, medir/comedir/descomedir, -- aferir/conferir/deferir/diferir/inferir/interferir/preferir/proferir/referir/transferir, -- dixerir/enxerir/suxerir, preterir, competir/repetir, advertir/divertir, vestir/investir/revestir/travestir, -- agredir/transgredir, espelir: use <i> -- mentir/desmentir, sentir/asentir/consentir/disentir/presentir/resentir, ferir (but no derivatives), servir, -- seguir/conseguir/perseguir/proseguir: use <i-e> -- [NOTE: imp_2s minte] -- denegrir: use <i.only3sp> -- prohibir/coibir: regular -- cumprir: use <no_built_in> in the meaning "fulfill" -- reunir: use <ú> -- argüír/redargüír: use <ú>? -- -- -cir alternations (aducir, resarcir): automatically handled in combine_stem_ending() -- -guir alternations (e.g. conseguir, cinguir, xunguir, tinguir): automatically handled in combine_stem_ending() -- -quir alternations (e.g. delinquir): automatically handled in combine_stem_ending() -- -güír alternations (e.g. argüír): automatically handled in combine_stem_ending() { -- saír/sobresaír match = "aír", forms = { pres1_and_sub = "ai", -- all occurrences of accented í and ï in endings handled in combine_stem_ending() irreg = true, } }, { -- abrir/desabrir/reabrir match = "abrir", forms = {pp = "aberto"}, }, { -- aflixir match = "aflixir", -- FIXME: should this be {pp = {"aflicto", "aflixido"}}? forms = {short_pp = "aflicto"}, }, { -- cubrir/descubrir/encubrir/recubrir/redescubrir match = "cubrir", forms = {vowel_alt = "u-o", pp = "coberto"}, }, { -- cumprir (only in the meaning "to be necessary"; otherwise use <no_built_in>) match = "^cumprir", forms = { -- We could create a <u-ó> just for this verb but that seems overkill unless another such verb appears pres_stressed = "cómpr", pres1_and_sub = "cumpr", }, }, { -- dicir, bendicir, contradicir, desdicir, maldicir, predicir -- FIXME: bendicir and maldicir can also be entirely regular. This could be handled like this: -- ((bendicir<>,bendicir<no_built_in>)) match = "dicir", forms = { -- use 'digu' because we're in a front environment; if we use 'dig', we'll get '#dijo' pres1_and_sub = "digu", pres_2s = "dís#", pres_3s = "dí#", pres_3p = "dín#", pret_conj = "irreg", pret = "dixe", pp = function(base, prefix) return (prefix == "" or prefix == "des" or prefix == "pre") and "dito" or {"dito", "dicido"} end, pp = "dito", fut = "dir", irreg = true, cons_alt = false, -- avoid claiming we have a c-z alternation } }, { -- elixir, reelixir match = "elixir", -- FIXME: should this be {pp = {"electo", "elixido"}}? forms = {short_pp = "electo"}, }, { -- frixir/sofrixir, fritir/sofritir match = "fri[xt]ir", forms = {short_pp = "frito"}, }, { -- inserir, reinserir match = "inserir", forms = { vowel_alt = "i", short_pp = "inserto", }, }, { -- ir match = "^ir", forms = { pres_1s = "vou", pres_2s = "vas", pres_3s = "vai", pres_1p = "imos", pres_2p = "ides", pres_3p = "van", pres1_and_sub = "vai", -- only for subjunctive as we override pres_1s pret_conj = "irreg", pret = "fo", pret_1s = "fun", pret_2s = "fuches", pret_3s = "foi", imp_1p = "vamos", irreg = true, } }, { -- oír, desoír, entreoír match = "oír", forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() pres1_and_sub = "oi", -- /ɔ/ irreg = true, } }, { match = "ouvir", forms = { pres1_and_sub = "ouz", irreg = true, } }, { -- parir, malparir match = "parir", forms = { pres1_and_sub = "pair", irreg = true, } }, { -- imprimir/reimprimir/sobreimprimir, but not comprimir/descomprimir, deprimir, oprimir, reprimir, suprimir match = "imprimir", forms = {short_pp = "impreso"} }, { -- rir, sorrir match = match_against_verbs("rir", {"^", "sor"}), forms = { pres_2s = "ris#", pres_3s = "ri#", pres_3p = "rin#", pret_1s = "rin#", -- regular except the lack of accent in base verb pres1_and_sub = "rí", irreg = true, } }, { -- adscribir, circunscribir, describir, escribir/reescribir, inscribir, prescribir, proscribir, sobrescribir, -- subscribir, transcribir match = "scribir", forms = { pp = "scrito", irreg = true, } }, { -- concluír/recluír; not excluír/incluír/ocluír match = match_against_verbs("cluír", {"con", "re"}), forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() vowel_alt = "ú", short_pp = "cluso", } }, { -- posuír; not desposuír match = "^posuír", forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() vowel_alt = "ú", short_pp = "poseso", } }, { -- remaining verbs in -uír (excluír/incluír/ocluír, diluír, -- afluír/confluír/difluír/fluír/efluír/influír/refluír, atuír/desatuír, -- atribuír/contribuír/distribuír/redistribuír/retribuír/substituír, -- constituír/destituír/instituír/prostituír/reconstituír/restituír, -- construír/desobstruír/destruír/instruír/obstruír/reconstruír, derruír, -- desposuír, diminuír, luír/esluír, estatuír, imbuír, inmiscuír, intuír, puír, pruír) match = "[uü]ír", -- this won't match -guir verbs (e.g. [[conseguir]]) or -quir verbs (e.g. [[delinquir]]) forms = { -- all occurrences of accented í and ï in endings handled in combine_stem_ending() vowel_alt = "ú", } }, { -- We want to match advir, convir, devir, etc. but not ouvir, servir, etc. No way to avoid listing each verb. match = match_against_verbs("vir", {"ad", "^a", "con", "contra", "de", "^desa", "inter", "pre", "pro", "sobre", "^"}), forms = { pres_2s = "vés", pres_3s = "vén", pres_2p = {"vindes", "vides"}, pres_3p = "veñen", pres1_and_sub = "veñ", full_impf = "viñ", pret_conj = "irreg", pret = "viñe", pret_1s = "vín#", pret_3s = "veu", pp = "vindo", -- FIXME! The following is as in the RAG tables but may be a typo and should be vén for [[vir]] like pres_3s imp_2s = "vén#", irreg = true, } }, -------------------------------------------------------------------------------------------- -- misc -- -------------------------------------------------------------------------------------------- { -- pór, antepor, apor/desapor, arrepor, compor/descompor/recompor, contrapor, depor, dispor/indispor/predispor, -- empor, expor/sobreexpor/subexpor, impor/reimpor, interpor, opor, pospor, propor, repor, sobrepor, -- superpor, supor/presupor, traspor, xustapor match = "p[oó]r", forms = { pres_2s = "pós#", pres_3s = "pón#", pres_1p = "pomos", pres_2p = "pondes", pres_3p = "pón#", pres1_and_sub = "poñ", full_impf = "puñ", pret_conj = "irreg", pret = "puxe", fut = "por", pers_inf = "po", pers_inf_1s = function(base, prefix) return prefix == "" and "pór" or "por" end, pers_inf_3s = function(base, prefix) return prefix == "" and "pór" or "por" end, gerund = "pondo", pp = "posto", irreg = true, } }, } local function skip_slot(base, slot, allow_overrides) if not allow_overrides and (base.basic_overrides[slot] or base.refl and base.basic_reflexive_only_overrides[slot]) then -- Skip any slots for which there are overrides. return true end if base.only3s and (slot:find("^pp_f") or slot:find("^pp_mp")) then -- diluviar, atardecer, neviscar; impersonal verbs have only masc sing pp return true end if not slot:find("[123]") then -- Don't skip non-personal slots. return false end if base.nofinite then return true end if (base.noimp or base.only3s or base.only3sp or base.only3p) and (slot:find("^imp_") or slot:find("^neg_imp_")) then return true end if base.only3s and not slot:find("3s") then -- diluviar, atardecer, neviscar return true end if base.only3sp and not slot:find("3[sp]") then -- atañer, concernir return true end if base.only3p and not slot:find("3p") then -- [[caer cuatro gotas]], [[caer chuzos de punta]], [[entrarle los siete males]] return true end return false end -- Apply vowel alternations to stem. local function apply_vowel_alternations(stem, alternations) local alternation_stems = {} local saw_pres1_and_sub = false local saw_pres_stressed = false local saw_imp2s_override = false local origstem = stem -- Treat final -gu, -qu as a consonant, so the previous vowel can alternate (e.g. conseguir -> consigo). -- This means a verb in -guar can't have a u-ú alternation but I don't think there are any verbs like that. stem = rsub(stem, "([gq])u$", "%1" .. TEMPC1) -- Process alternations other than +. for _, altobj in ipairs(alternations) do local alt = altobj.form local pres1_and_sub, pres_stressed, imp2s_override, err if alt == "+" then -- do nothing yet else local before_last_vowel, last_vowel, after_last_vowel = rmatch(stem, "^(.*)(" .. V .. ")(.-)$") if alt == "i-e" then if last_vowel == "e" or last_vowel == "i" then pres1_and_sub = before_last_vowel .. "i" .. after_last_vowel imp2s_override = pres1_and_sub if last_vowel == "i" then pres_stressed = before_last_vowel .. "e" .. after_last_vowel end else err = "should have -e- or -i- as the last vowel" end elseif alt == "i" then if last_vowel == "e" then pres1_and_sub = before_last_vowel .. "i" .. after_last_vowel pres_stressed = pres1_and_sub else err = "should have -e- as the last vowel" end elseif alt == "u-o" then if last_vowel == "o" or last_vowel == "u" then pres1_and_sub = before_last_vowel .. "u" .. after_last_vowel imp2s_override = pres1_and_sub if last_vowel == "u" then pres_stressed = before_last_vowel .. "o" .. after_last_vowel end else err = "should have -o- or -u- as the last vowel" end elseif alt == "u" then if last_vowel == "o" then pres1_and_sub = before_last_vowel .. "u" .. after_last_vowel pres_stressed = pres1_and_sub else err = "should have -o- as the last vowel" end elseif alt == "í" then if last_vowel == "i" then pres_stressed = before_last_vowel .. "í" .. after_last_vowel else err = "should have -i- as the last vowel" end elseif alt == "ú" then if last_vowel == "u" or last_vowel == "ü" then pres_stressed = before_last_vowel .. "ú" .. after_last_vowel else err = "should have -u- or -ü- as the last vowel" end else error("Internal error: Unrecognized vowel alternation '" .. alt .. "'") end end local function unapply_u_mod(val) if val then return {form = val:gsub(TEMPC1, "u"), footnotes = altobj.footnotes}, true else return nil, false end end pres1_and_sub, saw_pres1_and_sub = unapply_u_mod(pres1_and_sub) pres_stressed, saw_pres_stressed = unapply_u_mod(pres_stressed) imp2s_override, saw_imp2s_override = unapply_u_mod(imp2s_override) table.insert(alternation_stems, { altobj = altobj, pres1_and_sub = pres1_and_sub, pres_stressed = pres_stressed, imp2s_override = imp2s_override, err = err }) end -- Now do +. We check to see which stems are used by other alternations and specify those so any footnotes are -- properly attached. for _, alternation_stem in ipairs(alternation_stems) do if alternation_stem.altobj.form == "+" then local stemobj = {form = origstem, footnotes = alternation_stem.altobj.footnotes} alternation_stem.pres1_and_sub = saw_pres1_and_sub and stemobj or nil alternation_stem.pres_stressed = saw_pres_stressed and stemobj or nil alternation_stem.imp2s_override = saw_imp2s_override and stemobj or nil end end return alternation_stems end -- Add the `stem` to the `ending` for the given `slot` and apply any phonetic modifications. -- WARNING: This function is written very carefully; changes to it can easily have unintended consequences. local function combine_stem_ending(base, slot, prefix, stem, ending, dont_include_prefix) -- If the ending begins with an acute accent, it goes after the last vowel, but we don't have to do anything. -- Use the full stem for checking for -gui ending and such, because 'stem' is just 'u' for [[arguir]], -- [[delinquir]]. local full_stem = prefix .. stem -- Include the prefix in the stem unless dont_include_prefix is given (used for the past participle stem). if not dont_include_prefix then stem = full_stem end -- If ending begins with i, it must get an accent after a/o/u to prevent the two merging into a diphthong: -- caer -> caíches, caído; doer -> doíches, doído; concluír -> concluíches, concluído. if ending:find("^i") and stem:find("[aouü]$") and not stem:find("[gq]u$") then -- Special case for impf_1p/impf_2p, where the i is unstressed and changes into ï. FIXME: Maybe we should be -- checking the slot value instead. if ending == "iamos" or ending == "iades" then ending = ending:gsub("^i", "ï") else ending = ending:gsub("^i", "í") end end -- Spelling changes in the stem; it depends on whether the stem given is the pre-front-vowel or -- pre-back-vowel variant, as indicated by `frontback`. We want these front-back spelling changes to happen -- between stem and ending, not between prefix and stem; the prefix may not have the same "front/backness" -- as the stem. local is_front = rfind(ending, "^[eiéíï]") if base.frontback == "front" and not is_front then stem = stem:gsub("c$", "z") -- coñecer -> coñezo, vencer -> venzo, inmiscir -> inmiszo stem = stem:gsub("gu$", "g") -- distinguir -> distingo, conseguir -> consigo stem = stem:gsub("qu$", "c") -- delinquir -> delinco stem = stem:gsub("gü$", "gu") -- argüír -> arguamos elseif base.frontback == "back" and is_front then stem = stem:gsub("gu$", "gü") -- iguar -> igüei stem = stem:gsub("g$", "gu") -- cargar -> carguei, apagar -> apaguei stem = stem:gsub("c$", "qu") -- marcar -> marquei stem = rsub(stem, "z$", "c") -- aderezar -> aderecei end local retval = stem .. ending if retval:find("#$") then -- remove final accent if no prefix retval = retval:gsub("#$", "") if prefix == "" then retval = com.remove_final_accent(retval) end end return retval end local function add3(base, slot, stems, endings, footnotes, allow_overrides) if skip_slot(base, slot, allow_overrides) then return end local function do_combine_stem_ending(stem, ending) return combine_stem_ending(base, slot, base.prefix, stem, ending) end iut.add_forms(base.forms, slot, stems, endings, do_combine_stem_ending, nil, nil, footnotes) end local function insert_form(base, slot, form) if not skip_slot(base, slot) then iut.insert_form(base.forms, slot, form) end end local function insert_forms(base, slot, forms) if not skip_slot(base, slot) then iut.insert_forms(base.forms, slot, forms) end end local function add_single_stem_tense(base, slot_pref, stems, s1, s2, s3, p1, p2, p3) local function addit(slot, ending) add3(base, slot_pref .. "_" .. slot, stems, ending) end addit("1s", s1) addit("2s", s2) addit("3s", s3) addit("1p", p1) addit("2p", p2) addit("3p", p3) end local function construct_stems(base, vowel_alt, imp_only) local stems = {} if imp_only then stems.imp2s_override = -- If no_pres_stressed given, there should be no imp_2s. not base.no_pres_stressed and ( base.stems.imp2s_override or vowel_alt.imp2s_override or nil) or nil base.this_stems = stems return end local function combine(slot, stem, ending) return combine_stem_ending(base, slot, base.prefix, stem, ending, "dont include prefix") end stems.pres_unstressed = base.stems.pres_unstressed or base.inf_stem stems.pres_stressed = -- If no_pres_stressed given, pres_stressed stem should be empty so no forms are generated. base.no_pres_stressed and {} or base.stems.pres_stressed or vowel_alt.pres_stressed or base.inf_stem stems.pres1_and_sub = -- If no_pres_stressed given, the entire subjunctive is missing. base.no_pres_stressed and {} or -- If no_pres1_and_sub given, pres1 and entire subjunctive are missing. base.no_pres1_and_sub and {} or base.stems.pres1_and_sub or vowel_alt.pres1_and_sub or nil stems.pres1 = base.stems.pres1 or stems.pres1_and_sub or stems.pres_stressed stems.impf = base.stems.impf or base.inf_stem stems.full_impf = base.stems.full_impf stems.pret_base = base.stems.pret_base or base.inf_stem stems.pret_conj = base.stems.pret_conj or base.conj stems.pret = base.stems.pret or iut.map_forms(iut.convert_to_general_list_form(stems.pret_base), -- use combine_stem_ending esp. so we get saíra etc. function(form) return combine("pret", form, base.conj_vowel) end) stems.short_pret = base.stems.gl_short_pret or iut.map_forms(iut.convert_to_general_list_form(stems.pret), function(form) return rsub(form, com.V .. "$", "") end) stems.fut = base.stems.fut or base.inf_stem .. base.conj stems.cond = base.stems.cond or stems.fut stems.pres_sub_stressed = base.stems.pres_sub_stressed or stems.pres1 stems.pres_sub_unstressed = base.stems.pres_sub_unstressed or stems.pres1_and_sub or stems.pres_unstressed stems.sub_conj = base.stems.sub_conj or base.conj stems.plup = base.stems.plup or stems.pret -- Needed for plup_1p and plup_2p if there's an accent in the regular pluperfect stem (as for [[saír]]). stems.plup_unstressed = iut.map_forms(iut.convert_to_general_list_form(stems.plup), com.remove_final_accent) stems.impf_sub = base.stems.impf_sub or stems.pret -- Needed for impf_sub_1p and impf_sub_2p. We can't just add an acute accent because there may already be one -- (as for [[saír]]). stems.impf_sub_antepenult_stressed = iut.map_forms(iut.convert_to_general_list_form(stems.impf_sub), com.add_final_accent) stems.fut_sub = base.stems.fut_sub or stems.pret -- use combine_stem_ending esp. so we get saír, saírmos, etc. stems.pers_inf = base.stems.pers_inf or combine("pers_inf", base.inf_stem, base.conj_vowel) -- use combine_stem_ending esp. so we get roído, caído, etc. stems.pp = base.stems.pp or combine("pp_ms", base.inf_stem, base.conj == "ar" and "ado" or "ido") stems.pp_ms = stems.pp local function masc_to_fem(form) if rfind(form, "o$") then return rsub(form, "o$", "a") else return form end end stems.pp_fs = iut.map_forms(iut.convert_to_general_list_form(stems.pp_ms), masc_to_fem) if base.stems.short_pp then stems.short_pp_ms = base.stems.short_pp stems.short_pp_fs = iut.map_forms(iut.convert_to_general_list_form(stems.short_pp_ms), masc_to_fem) end base.this_stems = stems end local function add_present_indic(base) local stems = base.this_stems local function addit(slot, stems, ending) add3(base, "pres_" .. slot, stems, ending) end local s2, s3, p1, p2, p3 if base.conj == "ar" then s2, s3, p1, p2, p3 = "as", "a", "amos", "ades", "an" elseif base.conj == "er" or base.conj == "or" then -- verbs in -por have the present overridden s2, s3, p1, p2, p3 = "es", "e", "emos", "edes", "en" elseif base.conj == "ir" then s2, s3, p1, p2, p3 = "es", "e", "imos", "ides", "en" else error("Internal error: Unrecognized conjugation " .. base.conj) end addit("1s", stems.pres1, "o") addit("2s", stems.pres_stressed, s2) addit("3s", stems.pres_stressed, s3) addit("1p", stems.pres_unstressed, p1) addit("2p", stems.pres_unstressed, p2) addit("3p", stems.pres_stressed, p3) end local function add_present_subj(base) local stems = base.this_stems local function addit(slot, stems, ending) add3(base, "pres_sub_" .. slot, stems, ending) end local s1, s2, s3, p1, p2, p3 if stems.sub_conj == "ar" then s1, s2, s3, p1, p2, p3 = "e", "es", "e", "emos", "edes", "en" else s1, s2, s3, p1, p2, p3 = "a", "as", "a", "amos", "ades", "an" end addit("1s", stems.pres_sub_stressed, s1) addit("2s", stems.pres_sub_stressed, s2) addit("3s", stems.pres_sub_stressed, s3) addit("1p", stems.pres_sub_unstressed, p1) addit("2p", stems.pres_sub_unstressed, p2) addit("3p", stems.pres_sub_stressed, p3) end local function add_finite_non_present(base) local stems = base.this_stems local function add_tense(slot, stem, s1, s2, s3, p1, p2, p3) add_single_stem_tense(base, slot, stem, s1, s2, s3, p1, p2, p3) end if stems.full_impf then add_tense("impf", stems.full_impf, "a", "as", "a", "amos", "ades", "an") elseif base.conj == "ar" then add_tense("impf", stems.impf, "aba", "abas", "aba", "abamos", "abades", "aban") else add_tense("impf", stems.impf, "ía", "ías", "ía", "iamos", "iades", "ían") end if stems.pret_conj == "irreg" then add_tense("pret", stems.short_pret, "en", nil, "o") add_tense("pret", stems.pret, nil, "ches", nil, "mos", "stes", "ron") elseif stems.pret_conj == "ar" then add_tense("pret", stems.pret_base, "ei", "aches", "ou", "amos", "astes", "aron") elseif stems.pret_conj == "er" then add_tense("pret", stems.pret_base, "ín", "iches", "eu", "emos", "estes", "eron") else add_tense("pret", stems.pret_base, "ín", "iches", "iu", "imos", "istes", "iron") end add_tense("plup", stems.plup, "ra", "ras", "ra", nil, nil, "ran") add_tense("plup", stems.plup_unstressed, nil, nil, nil, "ramos", "rades", nil) add_tense("impf_sub", stems.impf_sub, "se", "ses", "se", nil, nil, "sen") add_tense("impf_sub", stems.impf_sub_antepenult_stressed, nil, nil, nil, "semos", "sedes", nil) add_tense("fut_sub", stems.fut_sub, "r", "res", "r", "rmos", "rdes", "ren") add_tense("fut", stems.fut, "ei", "ás", "á", "emos", "edes", "án") add_tense("cond", stems.cond, "ía", "ías", "ía", "iamos", "iades", "ían") -- [[pór]] needs overrides of the pers_inf_1s and pers_inf_3s. add_tense("pers_inf", stems.pers_inf, "r", "res", "r", "rmos", "rdes", "ren") end local function add_non_finite_forms(base) local stems = base.this_stems local function addit(slot, stems, ending, footnotes) add3(base, slot, stems, ending, footnotes) end insert_form(base, "infinitive", {form = base.verb}) -- Also insert "infinitive + reflexive pronoun" combinations if we're handling a reflexive verb. See comment below -- for "gerund + reflexive pronoun" combinations. if base.refl then for _, persnum in ipairs(person_number_list) do insert_form(base, "infinitive_" .. persnum, {form = base.verb}) end end -- verbs in -por have the gerund overridden local ger_ending = base.conj == "ar" and "ando" or base.conj == "er" and "endo" or "indo" addit("gerund", stems.pres_unstressed, ger_ending) -- Also insert "gerund + reflexive pronoun" combinations if we're handling a reflexive verb. We insert exactly the -- same form as for the bare gerund; later on in add_reflexive_or_fixed_clitic_to_forms(), we add the appropriate -- clitic pronouns. It's important not to do this for non-reflexive verbs, because in that case, the clitic -- pronouns won't be added, and {{gl-verb form of}} will wrongly consider all these combinations as possible -- inflections of the bare gerund. Thanks to [[User:JeffDoozan]] for this bug fix. if base.refl then for _, persnum in ipairs(person_number_list) do addit("gerund_" .. persnum, stems.pres_unstressed, ger_ending) end end -- Skip the long/short past participle footnotes if called from {{gl-verb}} so they don't show in the headword. local long_pp_footnotes = stems.short_pp_ms and base.alternant_multiword_spec.source_template ~= "gl-verb" and {long_pp_footnote} or nil addit("pp_ms", stems.pp_ms, "", long_pp_footnotes) if not base.pp_inv then addit("pp_fs", stems.pp_fs, "", long_pp_footnotes) addit("pp_mp", stems.pp_ms, "s", long_pp_footnotes) addit("pp_fp", stems.pp_fs, "s", long_pp_footnotes) end if stems.short_pp_ms then local short_pp_footnotes = stems.short_pp_ms and base.alternant_multiword_spec.source_template ~= "gl-verb" and {short_pp_footnote} or nil addit("short_pp_ms", stems.short_pp_ms, "", short_pp_footnotes) if not base.pp_inv then addit("short_pp_fs", stems.short_pp_fs, "", short_pp_footnotes) addit("short_pp_mp", stems.short_pp_ms, "s", short_pp_footnotes) addit("short_pp_fp", stems.short_pp_fs, "s", short_pp_footnotes) end end end local function add_imperatives(base) for _, vowel_alt in ipairs(base.vowel_alt_stems) do construct_stems(base, vowel_alt, "imp only") local stems = base.this_stems if stems.imp2s_override then add3(base, "imp_2s", stems.imp2s_override, base.conj == "ar" and "a" or "e") else -- Copy pres3s to imperative since they are almost always the same. insert_forms(base, "imp_2s", iut.map_forms(base.forms.pres_3s, function(form) return form end)) end end if not skip_slot(base, "imp_2p") then -- Copy pres2p to imperative 2p minus -s since they are almost always the same. -- But not if there's an override, to avoid possibly throwing an error. insert_forms(base, "imp_2p", iut.map_forms(base.forms.pres_2p, function(form) local form_no_s = rmatch(form, "^(.*)s$") if not form_no_s then error("Can't derive second-person plural imperative from second-person plural present indicative " .. "because form '" .. form .. "' doesn't end in -s") end return form_no_s end)) end -- Copy subjunctives to imperatives, unless there's an override for the given slot (as with the imp_1p of [[ir]]). for _, persnum in ipairs({"3s", "1p", "3p"}) do local from = "pres_sub_" .. persnum local to = "imp_" .. persnum insert_forms(base, to, iut.map_forms(base.forms[from], function(form) return form end)) end end local function process_slot_overrides(base, filter_slot, reflexive_only) local overrides = reflexive_only and base.basic_reflexive_only_overrides or base.basic_overrides for slot, forms in pairs(overrides) do if not filter_slot or filter_slot(slot) then add3(base, slot, forms, "", nil, "allow overrides") end end end -- Prefix `form` with `clitic`, adding fixed text `between` between them. Add links as appropriate unless the user -- requested no links. Check whether form already has brackets (as will be the case if the form has a fixed clitic). local function prefix_clitic_to_form(base, clitic, between, form) if base.alternant_multiword_spec.args.noautolinkverb then return clitic .. between .. form else local clitic_pref = "[[" .. clitic .. "]]" .. between if form:find("%[%[") then return clitic_pref .. form else return clitic_pref .. "[[" .. form .. "]]" end end end -- Add the appropriate clitic pronouns in `clitics` to the forms in `base_slot`. `store_cliticized_form` is a function -- of three arguments (clitic, formobj, cliticized_form) and should store the cliticized form for the specified clitic -- and form object. local function suffix_clitic_to_forms(base, base_slot, clitics, store_cliticized_form) if not base.forms[base_slot] then -- This can happen, e.g. in only3s/only3sp/only3p verbs. return end for _, formobj in ipairs(base.forms[base_slot]) do -- Figure out the correct accenting of the verb when a clitic pronoun is attached to it. We may need to -- add or remove an accent mark: -- (1) No accent mark currently, none needed: infinitive sentar -> sentarse; imperative singular ten -> tente; -- (2) Accent mark currently, still needed: infinitive concluír -> concluírse; -- (3) No accent mark currently, accent needed: imperative singular sinte -> síntete; -- (4) Accent mark currently, not needed: third singular sentirá -> sentirase, imperative singular dá -> date. local syllables = com.syllabify(formobj.form) local sylno = com.stressed_syllable(syllables) table.insert(syllables, "lo") -- arbitrary stand-in local needs_accent = com.accent_needed(syllables, sylno) if needs_accent then syllables[sylno] = com.add_accent_to_syllable(syllables[sylno]) else syllables[sylno] = com.remove_accent_from_syllable(syllables[sylno]) end table.remove(syllables) -- remove added clitic pronoun local reaccented_form = table.concat(syllables) for _, clitic in ipairs(clitics) do local cliticized_form -- Some further special cases. if base_slot:find("_1p$") and clitic == "nos" then -- Final -s disappears: sintamos + nos -> sintámonos cliticized_form = reaccented_form:gsub("s$", "") .. clitic elseif clitic:find("^[oa]s?$") then if reaccented_form:find("[rs]$") then cliticized_form = reaccented_form:gsub("[rs]$", "l") .. clitic elseif reaccented_form:find(V .. "[iu]$") then cliticized_form = reaccented_form .. "n" .. clitic else cliticized_form = reaccented_form .. clitic end else cliticized_form = reaccented_form .. clitic end store_cliticized_form(clitic, formobj, cliticized_form) end end end -- Add a reflexive pronoun or fixed clitic (FIXME: not working), as appropriate to the base forms that were generated. -- `do_joined` means to do only the forms where the pronoun is joined to the end of the form; otherwise, do only the -- forms where it is not joined and precedes the form. local function add_reflexive_or_fixed_clitic_to_forms(base, do_reflexive, do_joined) for _, slotaccel in ipairs(base.alternant_multiword_spec.verb_slots_basic) do local slot, accel = unpack(slotaccel) local clitic if not do_reflexive then clitic = base.clitic elseif slot:find("[123]") then local persnum = slot:match("^.*_(.-)$") clitic = person_number_to_reflexive_pronoun[persnum] else clitic = "se" end if base.forms[slot] then if do_reflexive and slot:find("^pp_") or slot == "infinitive_linked" then -- do nothing with reflexive past participles or with infinitive linked (handled at the end) elseif slot:find("^neg_imp_") then error("Internal error: Should not have forms set for negative imperative at this stage") else local slot_has_suffixed_clitic = not slot:find("_sub") -- Maybe generate non-reflexive parts and separated syntactic variants for use in -- {{gl-verb form of}}. See comment in add_slots() above `need_special_verb_form_of_slots`. -- Check for do_joined so we only run this code once. if do_reflexive and do_joined and base.alternant_multiword_spec.source_template == "gl-verb form of" and -- Skip personal variants of infinitives and gerunds so we don't think [[arrependendo]] is a -- non-reflexive equivalent of [[arrependendo-me]]. not slot:find("infinitive_") and not slot:find("gerund_") then -- Clone the forms because we will be destructively modifying them just below, adding the reflexive -- pronoun. insert_forms(base, slot .. "_non_reflexive", mw.clone(base.forms[slot])) if slot_has_suffixed_clitic then insert_forms(base, slot .. "_variant", iut.map_forms(base.forms[slot], function(form) return prefix_clitic_to_form(base, clitic, " ... ", form) end)) end end if slot_has_suffixed_clitic then if do_joined then suffix_clitic_to_forms(base, slot, {clitic}, function(clitic, formobj, cliticized_form) formobj.form = cliticized_form end ) end elseif not do_joined then -- Add clitic as separate word before all other forms. for _, form in ipairs(base.forms[slot]) do form.form = prefix_clitic_to_form(base, clitic, " ", form.form) end end end end end end local function handle_infinitive_linked(base) -- Compute linked versions of potential lemma slots, for use in {{gl-verb}}. -- We substitute the original lemma (before removing links) for forms that -- are the same as the lemma, if the original lemma has links. for _, slot in ipairs({"infinitive"}) do insert_forms(base, slot .. "_linked", iut.map_forms(base.forms[slot], function(form) if form == base.lemma and rfind(base.linked_lemma, "%[%[") then return base.linked_lemma else return form end end)) end end local function generate_negative_imperatives(base) -- Copy subjunctives to negative imperatives, preceded by "non". for _, persnum in ipairs(neg_imp_person_number_list) do local from = "pres_sub_" .. persnum local to = "neg_imp_" .. persnum insert_forms(base, to, iut.map_forms(base.forms[from], function(form) if base.alternant_multiword_spec.args.noautolinkverb then return "non " .. form elseif form:find("%[%[") then -- already linked, e.g. when reflexive return "[[non]] " .. form else return "[[non]] [[" .. form .. "]]" end end)) end end -- Process specs given by the user using 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'. local function process_addnote_specs(base) for _, spec in ipairs(base.addnote_specs) do for _, slot_spec in ipairs(spec.slot_specs) do slot_spec = "^" .. slot_spec .. "$" for slot, forms in pairs(base.forms) do if rfind(slot, slot_spec) then -- To save on memory, side-effect the existing forms. for _, form in ipairs(forms) do form.footnotes = iut.combine_footnotes(form.footnotes, spec.footnotes) end end end end end end local function add_missing_links_to_forms(base) -- Any forms without links should get them now. Redundant ones will be stripped later. for slot, forms in pairs(base.forms) do for _, form in ipairs(forms) do if not form.form:find("%[%[") then form.form = "[[" .. form.form .. "]]" end end end end local function conjugate_verb(base) for _, vowel_alt in ipairs(base.vowel_alt_stems) do construct_stems(base, vowel_alt) add_present_indic(base) add_present_subj(base) end add_finite_non_present(base) add_non_finite_forms(base) -- do non-reflexive non-imperative slot overrides process_slot_overrides(base, function(slot) return not slot:find("^imp_") and not slot:find("^neg_imp_") end) -- This should happen after process_slot_overrides() in case a derived slot is based on an override -- (as with the imp_3s of [[dar]], [[estar]]). add_imperatives(base) -- do non-reflexive positive imperative slot overrides process_slot_overrides(base, function(slot) return slot:find("^imp_") end) -- We need to add joined reflexives, then joined and non-joined clitics, then non-joined reflexives, so we get -- [[arrepéndete]] but [[non]] [[te]] [[arrependas]]. if base.refl then add_reflexive_or_fixed_clitic_to_forms(base, "do reflexive", "do joined") process_slot_overrides(base, nil, "do reflexive") -- do reflexive-only slot overrides add_reflexive_or_fixed_clitic_to_forms(base, "do reflexive", false) end -- This should happen after add_reflexive_or_fixed_clitic_to_forms() so negative imperatives get the reflexive pronoun -- and clitic in them. generate_negative_imperatives(base) -- do non-reflexive negative imperative slot overrides -- FIXME: What about reflexive negative imperatives? process_slot_overrides(base, function(slot) return slot:find("^neg_imp_") end) -- This should happen before add_missing_links_to_forms() so that the comparison `form == base.lemma` -- in handle_infinitive_linked() works correctly and compares unlinked forms to unlinked forms. handle_infinitive_linked(base) process_addnote_specs(base) if not base.alternant_multiword_spec.args.noautolinkverb then add_missing_links_to_forms(base) end end local function parse_indicator_spec(angle_bracket_spec) -- Store the original angle bracket spec so we can reconstruct the overall conj spec with the lemma(s) in them. local base = { angle_bracket_spec = angle_bracket_spec, user_basic_overrides = {}, user_stems = {}, addnote_specs = {}, } local function parse_err(msg) error(msg .. ": " .. angle_bracket_spec) end local function fetch_footnotes(separated_group) local footnotes for j = 2, #separated_group - 1, 2 do if separated_group[j + 1] ~= "" then parse_err("Extraneous text after bracketed footnotes: '" .. table.concat(separated_group) .. "'") end if not footnotes then footnotes = {} end table.insert(footnotes, separated_group[j]) end return footnotes end local inside = angle_bracket_spec:match("^<(.*)>$") assert(inside) if inside == "" then return base end local segments = put.parse_balanced_segment_run(inside, "[", "]") local dot_separated_groups = put.split_alternating_runs(segments, "%.") for i, dot_separated_group in ipairs(dot_separated_groups) do local first_element = dot_separated_group[1] if first_element == "addnote" then local spec_and_footnotes = fetch_footnotes(dot_separated_group) if #spec_and_footnotes < 2 then parse_err("Spec with 'addnote' should be of the form 'addnote[SLOTSPEC][FOOTNOTE][FOOTNOTE][...]'") end local slot_spec = table.remove(spec_and_footnotes, 1) local slot_spec_inside = rmatch(slot_spec, "^%[(.*)%]$") if not slot_spec_inside then parse_err("Internal error: slot_spec " .. slot_spec .. " should be surrounded with brackets") end local slot_specs = rsplit(slot_spec_inside, ",") -- FIXME: Here, [[Module:it-verb]] called strip_spaces(). Generally we don't do this. Should we? table.insert(base.addnote_specs, {slot_specs = slot_specs, footnotes = spec_and_footnotes}) elseif indicator_flags[first_element] then if #dot_separated_group > 1 then parse_err("No footnotes allowed with '" .. first_element .. "' spec") end if base[first_element] then parse_err("Spec '" .. first_element .. "' specified twice") end base[first_element] = true elseif rfind(first_element, ":") then local colon_separated_groups = put.split_alternating_runs(dot_separated_group, "%s*:%s*") local first_element = colon_separated_groups[1][1] if #colon_separated_groups[1] > 1 then parse_err("Can't attach footnotes directly to '" .. first_element .. "' spec; attach them to the " .. "colon-separated values following the initial colon") end if overridable_stems[first_element] then if base.user_stems[first_element] then parse_err("Overridable stem '" .. first_element .. "' specified twice") end table.remove(colon_separated_groups, 1) base.user_stems[first_element] = overridable_stems[first_element](colon_separated_groups, {prefix = first_element, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}) else -- assume a basic override; we validate further later when the possible slots are available if base.user_basic_overrides[first_element] then parse_err("Basic override '" .. first_element .. "' specified twice") end table.remove(colon_separated_groups, 1) base.user_basic_overrides[first_element] = allow_multiple_values(colon_separated_groups, {prefix = first_element, base = base, parse_err = parse_err, fetch_footnotes = fetch_footnotes}) end else local comma_separated_groups = put.split_alternating_runs(dot_separated_group, "%s*,%s*") for j = 1, #comma_separated_groups do local alt = comma_separated_groups[j][1] if not vowel_alternants[alt] then if #comma_separated_groups == 1 then parse_err("Unrecognized spec or vowel alternant '" .. alt .. "'") else parse_err("Unrecognized vowel alternant '" .. alt .. "'") end end if base.vowel_alt then for _, existing_alt in ipairs(base.vowel_alt) do if existing_alt.form == alt then parse_err("Vowel alternant '" .. alt .. "' specified twice") end end else base.vowel_alt = {} end table.insert(base.vowel_alt, {form = alt, footnotes = fetch_footnotes(comma_separated_groups[j])}) end end end return base end -- Normalize all lemmas, substituting the pagename for blank lemmas and adding links to multiword lemmas. local function normalize_all_lemmas(alternant_multiword_spec, head) -- (1) Add links to all before and after text. Remember the original text so we can reconstruct the verb spec later. if not alternant_multiword_spec.args.noautolinktext then iut.add_links_to_before_and_after_text(alternant_multiword_spec, "remember original") end -- (2) Remove any links from the lemma, but remember the original form -- so we can use it below in the 'lemma_linked' form. iut.map_word_specs(alternant_multiword_spec, function(base) if base.lemma == "" then base.lemma = head end base.user_specified_lemma = base.lemma base.lemma = m_links.remove_links(base.lemma) local refl_verb = base.lemma local verb, refl = rmatch(refl_verb, "^(.-)(se)$") if not verb then verb, refl = refl_verb, nil end base.user_specified_verb = verb base.refl = refl base.verb = base.user_specified_verb local linked_lemma if alternant_multiword_spec.args.noautolinkverb or base.user_specified_lemma:find("%[%[") then linked_lemma = base.user_specified_lemma elseif base.refl then -- Reconstruct the linked lemma with separate links around base verb, reflexive pronoun and clitic. linked_lemma = base.user_specified_verb == base.verb and "[[" .. base.user_specified_verb .. "]]" or "[[" .. base.verb .. "|" .. base.user_specified_verb .. "]]" linked_lemma = linked_lemma .. (refl and "[[" .. refl .. "]]" or "") else -- Add links to the lemma so the user doesn't specifically need to, since we preserve -- links in multiword lemmas and include links in non-lemma forms rather than allowing -- the entire form to be a link. linked_lemma = iut.add_links(base.user_specified_lemma) end base.linked_lemma = linked_lemma end) end local function detect_indicator_spec(base) if (base.only3s and 1 or 0) + (base.only3sp and 1 or 0) + (base.only3p and 1 or 0) > 1 then error("Only one of 'only3s', 'only3sp' and 'only3p' can be specified") end base.forms = {} base.stems = {} base.basic_overrides = {} base.basic_reflexive_only_overrides = {} if not base.no_built_in then for _, built_in_conj in ipairs(built_in_conjugations) do if type(built_in_conj.match) == "function" then base.prefix, base.non_prefixed_verb = built_in_conj.match(base.verb) elseif built_in_conj.match:find("^%^") and rsub(built_in_conj.match, "^%^", "") == base.verb then -- begins with ^, for exact match, and matches base.prefix, base.non_prefixed_verb = "", base.verb else base.prefix, base.non_prefixed_verb = rmatch(base.verb, "^(.*)(" .. built_in_conj.match .. ")$") end if base.prefix then -- we found a built-in verb for stem, forms in pairs(built_in_conj.forms) do if type(forms) == "function" then forms = forms(base, base.prefix) end if stem:find("^refl_") then stem = stem:gsub("^refl_", "") if not base.alternant_multiword_spec.verb_slots_basic_map[stem] then error("Internal error: setting for 'refl_" .. stem .. "' does not refer to a basic verb slot") end base.basic_reflexive_only_overrides[stem] = forms elseif base.alternant_multiword_spec.verb_slots_basic_map[stem] then -- an individual form override of a basic form base.basic_overrides[stem] = forms else base.stems[stem] = forms end end break end end end -- Override built-in-verb stems and overrides with user-specified ones. for stem, values in pairs(base.user_stems) do base.stems[stem] = values end for override, values in pairs(base.user_basic_overrides) do if not base.alternant_multiword_spec.verb_slots_basic_map[override] then error("Unrecognized override '" .. override .. "': " .. base.angle_bracket_spec) end base.basic_overrides[override] = values end base.prefix = base.prefix or "" base.non_prefixed_verb = base.non_prefixed_verb or base.verb local inf_stem, suffix = rmatch(base.non_prefixed_verb, "^(.*)([aeiíoó]r)$") if not inf_stem then error("Unrecognized infinitive: " .. base.verb) end base.inf_stem = inf_stem suffix = suffix == "ór" and "or" or suffix == "ír" and "ir" or suffix base.conj = suffix base.conj_vowel = suffix == "ar" and "a" or suffix == "ir" and "i" or "e" base.frontback = suffix == "ar" and "back" or "front" if base.stems.vowel_alt then -- built-in verb with specified vowel alternation if base.vowel_alt then error(base.verb .. " is a recognized built-in verb, and should not have vowel alternations specified with it") end base.vowel_alt = iut.convert_to_general_list_form(base.stems.vowel_alt) end -- Propagate built-in-verb indicator flags to `base` and combine with user-specified flags. for indicator_flag, _ in pairs(indicator_flags) do base[indicator_flag] = base[indicator_flag] or base.stems[indicator_flag] end -- Convert vowel alternation indicators into stems. local vowel_alt = base.vowel_alt or {{form = "+"}} base.vowel_alt_stems = apply_vowel_alternations(base.inf_stem, vowel_alt) for _, vowel_alt_stems in ipairs(base.vowel_alt_stems) do if vowel_alt_stems.err then error("To use '" .. vowel_alt_stems.altobj.form .. "', present stem '" .. base.prefix .. base.inf_stem .. "' " .. vowel_alt_stems.err) end end end local function detect_all_indicator_specs(alternant_multiword_spec) -- Propagate some settings up; some are used internally, others by [[Module:gl-headword]]. iut.map_word_specs(alternant_multiword_spec, function(base) -- Internal indicator flags. Do these before calling detect_indicator_spec() because add_slots() uses them. for _, prop in ipairs { "refl", "clitic" } do if base[prop] then alternant_multiword_spec[prop] = true end end base.alternant_multiword_spec = alternant_multiword_spec end) add_slots(alternant_multiword_spec) alternant_multiword_spec.vowel_alt = {} iut.map_word_specs(alternant_multiword_spec, function(base) detect_indicator_spec(base) -- User-specified indicator flags. Do these after calling detect_indicator_spec() because the latter may set these -- indicators for built-in verbs. for prop, _ in pairs(indicator_flags) do if base[prop] then alternant_multiword_spec[prop] = true end end -- Vowel alternants. Do these after calling detect_indicator_spec() because the latter sets base.vowel_alt for -- built-in verbs. if base.vowel_alt then for _, altobj in ipairs(base.vowel_alt) do m_table.insertIfNot(alternant_multiword_spec.vowel_alt, altobj.form) end end end) end local function add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma) local function insert_ann(anntype, value) m_table.insertIfNot(alternant_multiword_spec.annotation[anntype], value) end local function insert_cat(cat, also_when_multiword) -- Don't place multiword terms in categories like 'Galician verbs ending in -ar' to avoid spamming the -- categories with such terms. if also_when_multiword or not multiword_lemma then m_table.insertIfNot(alternant_multiword_spec.categories, "Galician " .. cat) end end if check_for_red_links and alternant_multiword_spec.source_template == "gl-conj" and multiword_lemma then for _, slot_and_accel in ipairs(alternant_multiword_spec.all_verb_slots) do local slot = slot_and_accel[1] local forms = base.forms[slot] local must_break = false if forms then for _, form in ipairs(forms) do if not form.form:find("%[%[") then local title = mw.title.new(form.form) if title and not title.exists then insert_cat("Động từ có liên kết đỏ trong bảng biến tố") must_break = true break end end end end if must_break then break end end end if(base.conj == "or") then insert_cat("Động từ kết thúc bằng -er") else insert_cat("Động từ kết thúc bằng -" .. base.conj) end if base.irreg then insert_ann("irreg", "irregular") insert_cat("Động từ bất quy tắc") else insert_ann("irreg", "regular") end if base.only3s then insert_ann("defective", "impersonal") insert_cat("Động từ không ngôi") elseif base.only3sp then insert_ann("defective", "third-person only") insert_cat("Động từ chỉ có ngôi số 3") elseif base.only3p then insert_ann("defective", "third-person plural only") insert_cat("Động từ chỉ có ngôi số 3 số nhiều") elseif base.no_pres_stressed or base.no_pres1_and_sub then insert_ann("defective", "defective") insert_cat("defective verbs") else insert_ann("defective", "regular") end if base.stems.short_pp then insert_ann("short_pp", "irregular short past participle") insert_cat("Động từ bất quy tắc có quá khứ phân từ ngắn") else insert_ann("short_pp", "regular") end if base.clitic then insert_cat("verbs with lexical clitics") end if base.refl then insert_cat("Động từ phản thân") end if not base.vowel_alt then insert_ann("vowel_alt", "non-alternating") else for _, alt in ipairs(base.vowel_alt) do if alt.form == "+" then insert_ann("vowel_alt", "non-alternating") else insert_ann("vowel_alt", vowel_alternant_to_desc[alt.form]) insert_cat("verbs with " .. vowel_alternant_to_cat[alt.form]) end end end local cons_alt = base.stems.cons_alt if cons_alt == nil then if base.conj == "ar" then if base.inf_stem:find("z$") then cons_alt = "c-z" elseif base.inf_stem:find("c$") then cons_alt = "c-qu" elseif base.inf_stem:find("g$") then cons_alt = "g-gu" elseif base.inf_stem:find("gu$") then cons_alt = "gu-gü" end else if base.no_pres_stressed or base.no_pres1_and_sub then cons_alt = nil -- no e.g. c-z alternation in this case elseif base.inf_stem:find("c$") then cons_alt = "c-z" elseif base.inf_stem:find("qu$") then cons_alt = "c-qu" elseif base.inf_stem:find("gu$") then cons_alt = "g-gu" elseif base.inf_stem:find("gü$") then cons_alt = "gu-gü" end end end if cons_alt then local desc = cons_alt .. " alternation" insert_ann("cons_alt", desc) insert_cat("verbs with " .. desc) else insert_ann("cons_alt", "non-alternating") end end -- Compute the categories to add the verb to, as well as the annotation to display in the -- conjugation title bar. We combine the code to do these functions as both categories and -- title bar contain similar information. local function compute_categories_and_annotation(alternant_multiword_spec) alternant_multiword_spec.categories = {} local ann = {} alternant_multiword_spec.annotation = ann ann.irreg = {} ann.short_pp = {} ann.defective = {} ann.vowel_alt = {} ann.cons_alt = {} local multiword_lemma = false for _, form in ipairs(alternant_multiword_spec.forms.infinitive) do if form.form:find(" ") then multiword_lemma = true break end end iut.map_word_specs(alternant_multiword_spec, function(base) add_categories_and_annotation(alternant_multiword_spec, base, multiword_lemma) end) local ann_parts = {} local irreg = table.concat(ann.irreg, " or ") if irreg ~= "" and irreg ~= "regular" then table.insert(ann_parts, irreg) end local short_pp = table.concat(ann.short_pp, " or ") if short_pp ~= "" and short_pp ~= "regular" then table.insert(ann_parts, short_pp) end local defective = table.concat(ann.defective, " or ") if defective ~= "" and defective ~= "regular" then table.insert(ann_parts, defective) end local vowel_alt = table.concat(ann.vowel_alt, " or ") if vowel_alt ~= "" and vowel_alt ~= "non-alternating" then table.insert(ann_parts, vowel_alt) end local cons_alt = table.concat(ann.cons_alt, " or ") if cons_alt ~= "" and cons_alt ~= "non-alternating" then table.insert(ann_parts, cons_alt) end alternant_multiword_spec.annotation = table.concat(ann_parts, "; ") end local function show_forms(alternant_multiword_spec) local lemmas = alternant_multiword_spec.forms.infinitive alternant_multiword_spec.lemmas = lemmas -- save for later use in make_table() if alternant_multiword_spec.forms.short_pp_ms then alternant_multiword_spec.has_short_pp = true end local reconstructed_verb_spec = iut.reconstruct_original_spec(alternant_multiword_spec) local function transform_accel_obj(slot, formobj, accel_obj) -- No accelerators for negative imperatives, which are always multiword and derived directly from the -- present subjunctive. if slot:find("^neg_imp") then return nil end if accel_obj then if slot:find("^pp_") then accel_obj.form = slot elseif slot == "gerund" then accel_obj.form = "gerund-" .. reconstructed_verb_spec else accel_obj.form = "verb-form-" .. reconstructed_verb_spec end end return accel_obj end local props = { lang = lang, lemmas = lemmas, transform_accel_obj = transform_accel_obj, slot_list = alternant_multiword_spec.verb_slots_basic, } iut.show_forms(alternant_multiword_spec.forms, props) alternant_multiword_spec.footnote_basic = alternant_multiword_spec.forms.footnote end local notes_template = [=[ <div class="roa-footnote-outer-div" style="width:100%;"> <div class="roa-footnote-inner-div"> {footnote} </div></div> ]=] local basic_table = [=[ {description}<div class="NavFrame"> <div class="NavHead" align=center>&nbsp; &nbsp; Bảng chia động từ của {title}</div> <div class="NavContent" align="left"> {\op}| class="roa-inflection-table" data-toggle-category="inflection" |- ! class="roa-person-number-header" rowspan="2" | ! class="roa-person-number-header" colspan="3" | Số ít ! class="roa-person-number-header" colspan="3" | Số nhiều |- ! class="roa-person-number-header" style="width:12.5%" | Ngôi thứ nhất<br />(<<eu>>) ! class="roa-person-number-header" style="width:12.5%" | Ngôi thứ hai<br />(<<ti>>) ! class="roa-person-number-header" style="width:12.5%" | Ngôi thứ ba<br />(<<el>> / <<ela>> / <<vostede|Vde.>>) ! class="roa-person-number-header" style="width:12.5%" | Ngôi thứ nhất<br />(<<nós>>) ! class="roa-person-number-header" style="width:12.5%" | Ngôi thứ hai<br />(<<vós>>) ! class="roa-person-number-header" style="width:12.5%" | Ngôi thứ ba<br />(<<eles>> / <<elas>> / <<vostedes|Vdes.>>) |- ! class="roa-nonfinite-header" colspan="7" | ''<span title="infinitivo">Nguyên mẫu</span>'' |- ! class="roa-nonfinite-header" | '''<span title="infinitivo impersoal">Không ngôi</span>''' | colspan="6" | {infinitive} |- ! class="roa-nonfinite-header" | '''<span title="infinitivo conxugado">Có ngôi</span>''' | {pers_inf_1s} | {pers_inf_2s} | {pers_inf_3s} | {pers_inf_1p} | {pers_inf_2p} | {pers_inf_3p} |- ! class="roa-nonfinite-header" colspan="7" | ''<span title="xerundio">Danh động từ</span>'' |- | class="roa-nonfinite-header" | | colspan="6" | {gerund} |-{pp_clause} ! class="roa-indicative-left-rail" colspan="7" | ''<span title="indicativo">Trần thuật</span>'' |- ! class="roa-indicative-left-rail" | <span title="presente">Hiện tại</span> | {pres_1s} | {pres_2s} | {pres_3s} | {pres_1p} | {pres_2p} | {pres_3p} |- ! class="roa-indicative-left-rail" | <span title="pretérito imperfecto">Chưa hoàn thành</span> | {impf_1s} | {impf_2s} | {impf_3s} | {impf_1p} | {impf_2p} | {impf_3p} |- ! class="roa-indicative-left-rail" | <span title="pretérito perfecto">Hoàn thành</span> | {pret_1s} | {pret_2s} | {pret_3s} | {pret_1p} | {pret_2p} | {pret_3p} |- ! class="roa-indicative-left-rail" | <span title="pretérito pluscuamperfecto">Quá khứ<br/>hoàn thành</span> | {plup_1s} | {plup_2s} | {plup_3s} | {plup_1p} | {plup_2p} | {plup_3p} |- ! class="roa-indicative-left-rail" | <span title="futuro do presente">Tương lai</span> | {fut_1s} | {fut_2s} | {fut_3s} | {fut_1p} | {fut_2p} | {fut_3p} |- ! class="roa-indicative-left-rail" | <span title="condicional">Điều kiện</span> | {cond_1s} | {cond_2s} | {cond_3s} | {cond_1p} | {cond_2p} | {cond_3p} |- ! class="roa-subjunctive-left-rail" colspan="7" | ''<span title="subxuntivo">Giả định</span>'' |- ! class="roa-subjunctive-left-rail" | <span title=" presente do subxuntivo">Hiện tại</span> | {pres_sub_1s} | {pres_sub_2s} | {pres_sub_3s} | {pres_sub_1p} | {pres_sub_2p} | {pres_sub_3p} |- ! class="roa-subjunctive-left-rail" | <span title="pretérito imperfecto do subxuntivo">Chưa hoàn thành</span> | {impf_sub_1s} | {impf_sub_2s} | {impf_sub_3s} | {impf_sub_1p} | {impf_sub_2p} | {impf_sub_3p} |- ! class="roa-subjunctive-left-rail" | <span title="futuro do subxuntivo">Tương lai</span> | {fut_sub_1s} | {fut_sub_2s} | {fut_sub_3s} | {fut_sub_1p} | {fut_sub_2p} | {fut_sub_3p} |- ! class="roa-imperative-left-rail" colspan="7" | ''<span title="imperativo">Mệnh lệnh</span>'' |- ! class="roa-imperative-left-rail" | <span title="imperativo afirmativo">Khẳng định</span> | rowspan="2" | | {imp_2s} | {imp_3s} | {imp_1p} | {imp_2p} | {imp_3p} |- ! class="roa-imperative-left-rail" | <span title="imperativo negativo">Phủ định</span> (<<non>>) | {neg_imp_2s} | {neg_imp_3s} | {neg_imp_1p} | {neg_imp_2p} | {neg_imp_3p} |{\cl}{notes_clause}</div></div> ]=] local double_pp_template = [=[ ! class="roa-nonfinite-header" colspan="7" | ''<span title="participio irregular">Quá khứ<br/>phân từ</br/>ngắn</span>'' |- ! class="roa-nonfinite-header" | Giống đực | colspan="3" | {short_pp_ms} | colspan="3" | {short_pp_mp} |- ! class="roa-nonfinite-header" | Giống cái | colspan="3" | {short_pp_fs} | colspan="3" | {short_pp_fp} |- ! class="roa-nonfinite-header" colspan="7" | ''<span title="participio regular">Quá khứ<br/>phân từ</br/>dài</span>'' |- ! class="roa-nonfinite-header" | Giống đực | colspan="3" | {pp_ms} | colspan="3" | {pp_mp} |- ! class="roa-nonfinite-header" | Giống cái | colspan="3" | {pp_fs} | colspan="3" | {pp_fp} |-]=] local single_pp_template = [=[ ! class="roa-nonfinite-header" colspan="7" | ''<span title="participio pasado">Quá khứ<br/>phân từ</span>'' |- ! class="roa-nonfinite-header" | Giống đực | colspan="3" | {pp_ms} | colspan="3" | {pp_mp} |- ! class="roa-nonfinite-header" | Giống cái | colspan="3" | {pp_fs} | colspan="3" | {pp_fp} |-]=] local function make_table(alternant_multiword_spec) local forms = alternant_multiword_spec.forms forms.title = link_term(alternant_multiword_spec.lemmas[1].form) if alternant_multiword_spec.annotation ~= "" then forms.title = forms.title .. " (" .. alternant_multiword_spec.annotation .. ")" end forms.description = "" -- Format the table. forms.footnote = alternant_multiword_spec.footnote_basic forms.notes_clause = forms.footnote ~= "" and m_string_utilities.format(notes_template, forms) or "" -- has_short_pp is computed in show_forms(). local pp_template = alternant_multiword_spec.has_short_pp and double_pp_template or single_pp_template forms.pp_clause = m_string_utilities.format(pp_template, forms) local table_with_pronouns = rsub(basic_table, "<<([^<>|]-)|([^<>|]-)>>", link_term) local table_with_pronouns = rsub(table_with_pronouns, "<<(.-)>>", link_term) return require("Module:TemplateStyles")("Module:roa-verb/style.css") .. m_string_utilities.format(table_with_pronouns, forms) end -- Externally callable function to parse and conjugate a verb given user-specified arguments. -- Return value is WORD_SPEC, an object where the conjugated forms are in `WORD_SPEC.forms` -- for each slot. If there are no values for a slot, the slot key will be missing. The value -- for a given slot is a list of objects {form=FORM, footnotes=FOOTNOTES}. function export.do_generate_forms(args, source_template, headword_head) local PAGENAME = mw.title.getCurrentTitle().text local function in_template_space() return mw.title.getCurrentTitle().nsText == "Bản_mẫu" end -- Determine the verb spec we're being asked to generate the conjugation of. This may be taken from the -- current page title or the value of |pagename=; but not when called from {{gl-verb form of}}, where the -- page title is a non-lemma form. Note that the verb spec may omit the infinitive; e.g. it may be "<i-e>". -- For this reason, we use the value of `pagename` computed here down below, when calling normalize_all_lemmas(). local pagename = source_template ~= "gl-verb form of" and args.pagename or PAGENAME local head = headword_head or pagename local arg1 = args[1] if not arg1 then if (pagename == "gl-conj" or pagename == "gl-verb") and in_template_space() then arg1 = "paliar<í,+>" elseif pagename == "gl-verb form of" and in_template_space() then arg1 = "amar" else arg1 = "<>" end end -- When called from {{gl-verb form of}}, determine the non-lemma form whose inflections we're being asked to -- determine. This normally comes from the page title or the value of |pagename=. local verb_form_of_form if source_template == "gl-verb form of" then verb_form_of_form = args.pagename if not verb_form_of_form then if PAGENAME == "gl-verb form of" and in_template_space() then verb_form_of_form = "ame" else verb_form_of_form = PAGENAME end end end local incorporated_headword_head_into_lemma = false if arg1:find("^<.*>$") then -- missing lemma if head:find(" ") then -- If multiword lemma, try to add arg spec after the first word. -- Try to preserve the brackets in the part after the verb, but don't do it -- if there aren't the same number of left and right brackets in the verb -- (which means the verb was linked as part of a larger expression). local refl_clitic_verb, post = rmatch(head, "^(.-)( .*)$") local left_brackets = rsub(refl_clitic_verb, "[^%[]", "") local right_brackets = rsub(refl_clitic_verb, "[^%]]", "") if #left_brackets == #right_brackets then arg1 = iut.remove_redundant_links(refl_clitic_verb) .. arg1 .. post incorporated_headword_head_into_lemma = true else -- Try again using the form without links. local linkless_head = m_links.remove_links(head) if linkless_head:find(" ") then refl_clitic_verb, post = rmatch(linkless_head, "^(.-)( .*)$") arg1 = refl_clitic_verb .. arg1 .. post else error("Unable to incorporate <...> spec into explicit head due to a multiword linked verb or " .. "unbalanced brackets; please include <> explicitly: " .. arg1) end end else -- Will be incorporated through `head` below in the call to normalize_all_lemmas(). incorporated_headword_head_into_lemma = true end end local function split_bracketed_runs_into_words(bracketed_runs) return put.split_alternating_runs(bracketed_runs, " ", "preserve splitchar") end local parse_props = { parse_indicator_spec = parse_indicator_spec, -- Split words only on spaces, not on hyphens, because that messes up reflexive verb parsing. split_bracketed_runs_into_words = split_bracketed_runs_into_words, allow_default_indicator = true, allow_blank_lemma = true, } local alternant_multiword_spec = iut.parse_inflected_text(arg1, parse_props) alternant_multiword_spec.pos = pos or "verbs" alternant_multiword_spec.args = args alternant_multiword_spec.source_template = source_template alternant_multiword_spec.verb_form_of_form = verb_form_of_form alternant_multiword_spec.incorporated_headword_head_into_lemma = incorporated_headword_head_into_lemma normalize_all_lemmas(alternant_multiword_spec, head) detect_all_indicator_specs(alternant_multiword_spec) local inflect_props = { slot_list = alternant_multiword_spec.all_verb_slots, inflect_word_spec = conjugate_verb, -- We add links around the generated verbal forms rather than allow the entire multiword -- expression to be a link, so ensure that user-specified links get included as well. include_user_specified_links = true, } iut.inflect_multiword_or_alternant_multiword_spec(alternant_multiword_spec, inflect_props) -- Remove redundant brackets around entire forms. for slot, forms in pairs(alternant_multiword_spec.forms) do for _, form in ipairs(forms) do form.form = iut.remove_redundant_links(form.form) end end compute_categories_and_annotation(alternant_multiword_spec) if args.json and source_template == "gl-conj" then return require("Module:JSON").toJSON(alternant_multiword_spec.forms) end return alternant_multiword_spec end -- Entry point for {{gl-conj}}. Template-callable function to parse and conjugate a verb given -- user-specified arguments and generate a displayable table of the conjugated forms. function export.show(frame) local parent_args = frame:getParent().args local params = { [1] = {}, ["noautolinktext"] = {type = "boolean"}, ["noautolinkverb"] = {type = "boolean"}, ["pagename"] = {}, -- for testing/documentation pages ["json"] = {type = "boolean"}, -- for bot use } local args = require("Module:parameters").process(parent_args, params) local alternant_multiword_spec = export.do_generate_forms(args, "gl-conj") if type(alternant_multiword_spec) == "string" then -- JSON return value return alternant_multiword_spec end show_forms(alternant_multiword_spec) return make_table(alternant_multiword_spec) .. require("Module:utilities").format_categories(alternant_multiword_spec.categories, lang, nil, nil, force_cat) end return export fzdfi5nigsymp033r74uyvrmy7xwnty Mô đun:category tree/wiktionary maintenance 828 342446 2345017 2305427 2026-04-13T15:38:28Z TheHighFighter2 42988 2345017 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local m_template_parser = require("Module:template parser") local get_lang = require("Module:languages").getByCode local insert = table.insert local is_internal_title = require("Module:pages").is_internal_title local new_title = mw.title.new local split_lang_label = require("Module:category tree").split_lang_label local php_trim = require("Module:Scribunto").php_trim local uses_hidden_category = require("Module:maintenance category").uses_hidden_category ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Bảo quản Wiktionary"] = { description = "Categories containing pages that are being tracked for attention and improvement by editors.", breadcrumb = "Bảo quản", parents = "Wiktionary", } raw_categories["Mục từ dùng cấu trúc mục từ Wiktionary cũ"] = { description = "Thể loai này chứa các mục từ dùng cấu trúc mục từ Wiktionary cũ.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor"] = { description = "Thể loại này chứa các trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Mục từ có ký tự chưa được mã hóa"] = { description = "Thể loại này chứa các mục từ có ký tự chưa được mã hóa.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có thẻ tọa độ hỏng"] = { description = "Thể loại này chứa các trang có lỗi cú pháp khi sử dụng hàm <code><nowiki>{{#coordinates}}</nowiki></code> hoặc gọi bản mẫu {{Liên kết bản mẫu|coord}}.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Không đưa lên Trang Chính"] = { description = "Thể loại này tồn tại để loại trừ mọi mục từ không nên đưa lên Trang Chính khỏi {{Liên kết bản mẫu|Mục từ mới}}, tại vì phần mở rộng [[MW:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] không hỗ trợ thể loại con.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Tài liệu bản mẫu"] = { description = "Trang này chứa các trang tài liệu bản mẫu.", breadcrumb = "Tài liệu bản mẫu", parents = "Wiktionary", } raw_categories["Bản mẫu và mô đun chưa có tài liệu"] = { description = "Thể loại này chứa các trang bản mẫu và mô đun chưa có tài liệu.", parents = { "Tài liệu bản mẫu", "Category:Bảo quản Wiktionary", } } raw_categories["Yêu cầu bỏ cấm"] = { description = "Trang này chứa các yêu cầu bỏ cấm trong không gian thảo luận thành viên.", breadcrumb = "Yêu cầu bỏ cấm", parents = { "Bảo quản Wiktionary", "Category:Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời.", breadcrumb = "Bản mẫu lỗi thời", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đang được viết"] = { description = "Trang này liệt kê các trang đang viết hoặc xây dựng. Các trang trong thể loại thường được đưa vào đây bằng cách sử dụng bản mẫu {{lkbm|đang viết}}.", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ biến tố có liên kết đỏ đến mục từ chính"] = { description = "Trang này chứa các mục từ biến tố có liên kết đỏ đến mục từ chính.", breadcrumb = "Mục từ biến tố có liên kết đỏ đến mục từ chính", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời nhưng được giữ lại vì lý do bảo tồn.", breadcrumb = "Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn", parents = { "Bản mẫu lỗi thời", }, can_be_empty = true, hidden = true, } raw_categories["Chờ xóa"] = { description = "Trang này chứa các trang đã được gắn thẻ để [[Wiktionary:Quy định xóa trang#Xóa nhanh|xóa nhanh]]. Bạn có thể thêm các trang vào thể loại này bằng cách sử dụng {{LKBM|Chờ xóa}}. Hãy nhớ kiểm tra nội dung và lịch sử của trang trước khi xóa trang.", breadcrumb = "Chờ xóa", parents = { "Bảo quản Wiktionary", "Category:Trang có người đề nghị xóa", }, can_be_empty = true, hidden = true, } raw_categories["Trang có người đề nghị xóa"] = { description = "Trang này chứa các trang đề nghị xóa", breadcrumb = "Có người đề nghị xóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code>. Các mục từ sẽ được tự động đưa vào thể loại [[:Thể loại:Mục từ chất lượng kém]] để dễ quản lý và tự động đưa vào [[:Thể loại:Mục từ chất lượng kém quá 7 ngày]] đối với các mục từ đã đặt bảng chất lượng kém quá 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém quá 7 ngày"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code> đã hơn 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém quá 7 ngày", parents = { "Mục từ chất lượng kém", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Yêu cầu sửa đổi trang bị khóa"] = { description = "Trang này chứa các trang có lời yêu cầu {{Liên kết bản mẫu|Sửa trang khóa}} chưa được giải quyết.", breadcrumb = "Yêu cầu sửa đổi trang bị khóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại theo dõi"] = { description = "Các thể loại con của thể loại này là những thể loại theo dõi khác. Để thêm một thể loại vào thể loại này, gắn thẻ nó với {{lkbm|Thể loại theo dõi}}. Để có một danh sách của các thể loại theo dõi được tự động tạo bởi phần mềm wiki, hãy xem [[Đặc biệt:Thể loại theo dõi]].", breadcrumb = "Thể loại theo dõi", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có sử dụng tập tin không tồn tại"] = { description = "Thể loại này chứa các trang có sử dụng tập tin không tồn tại.", breadcrumb = "Trang có sử dụng tập tin không tồn tại", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép"] = { description = "Thể loại này chứa các trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép.", breadcrumb = "Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao"] = { description = "Thể loại này được phần mềm MediaWiki xây dựng tự động. (Nó được đặt tên theo nội dung của [[MediaWiki:Expensive-parserfunction-category]].) Nó chứa các trang [[w:en:Wikipedia:Template limits#Expensive parser function calls|gọi hàm cú pháp cần mức độ xử lý cao]] quá nhiều lần. Vào ngày 14 tháng 10 năm 2010, các hàm cần mức độ xử lý cao là <code>#ifexist</code>, <code><nowiki>{{PAGESINCATEGORY}}</nowiki></code>, và <code><nowiki>{{PAGESIZE}}</nowiki></code>. Các trang bên dưới cần được sửa chữa để giảm số lần gọi các hàm này.", breadcrumb = "Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đưa đối số thừa vào bản mẫu"] = { description = "Thể loại này bao gồm các trang được phần mềm phát hiện nhập giá trị nhiều lần cho cùng một tham số trong lúc gọi bản mẫu, chẳng hạn <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> và <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>. Nếu một tham số được nhập nhiều lần, chỉ giá trị cuối cùng sẽ được phần mềm sử dụng.", breadcrumb = "Trang đưa đối số thừa vào bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại đổi hướng không trống"] = { description = "Thể loại này chứa các trang đổi hướng không trống.", breadcrumb = "Thể loại đổi hướng không trống", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có các đối số formatnum không phải số"] = { description = "Thể loại này chứa các trang có các đối số formatnum không phải số.", breadcrumb = "Trang có các đối số formatnum không phải số", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có chứa tham số bản mẫu bị loại bỏ"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có chứa tham số bản mẫu bị loại bỏ", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có tên hiển thị được bỏ qua"] = { description = "Thể loại này dành cho các trang có tên hiển thị được bỏ qua.", breadcrumb = "Trang có tên hiển thị được bỏ qua", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang dùng thuộc tính enclose cũ"] = { description = "Thể loại này dành cho các trang dùng thuộc tính enclose cũ.", breadcrumb = "Trang dùng thuộc tính enclose cũ", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kết xuất khuông nhạc"] = { description = "Thể loại này dành cho các trang có lỗi kết xuất khuông nhạc.", breadcrumb = "Trang có lỗi kết xuất khuông nhạc", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi bảng kiểu bản mẫu"] = { description = "Thể loại này dành cho các trang có lỗi bảng kiểu bản mẫu.", breadcrumb = "Trang có lỗi bảng kiểu bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Bảng dịch không chú thích ngữ nghĩa"] = { description = "Thể loại này chứa các trang có bảng dịch không chú thích ngữ nghĩa.", breadcrumb = "Bảng dịch không chú thích ngữ nghĩa", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang bị khóa"] = { description = "Thể loại này tổ chức các thể loại con cụ thể hơn có chứa '''[[Wiktionary:Quy định khóa trang|các trang bị khóa]]'''. Để biết danh sách động và sắp xếp tất cả các trang được khóa, hãy xem [[Special:ProtectedPages]].", breadcrumb = "Trang bị khóa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị hạn chế sửa đổi"] = { description = "Thể loại này chứa các trang bản mẫu bị hạn chế sửa đổi.", breadcrumb = "Bản mẫu bị hạn chế sửa đổi", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị khóa"] = { description = "Thể loại này có chứa các [[Trợ giúp:Bản mẫu|bản mẫu]] đã được [[Wiktionary:Quy định khóa trang|khóa hoàn toàn]]. Điều này thường thực hiện để ngăn ngừa [[Wiktionary:Phá hoại|phá hoại]] với những bản mẫu được dùng ở rất nhiều trang hoặc ở những trang dễ thấy như [[Trang Chính]] (còn gọi là bản mẫu có nguy cơ cao), vì phá hoại những bản mẫu như vậy sẽ gây thay đổi lớn dễ nhận thấy. Chỉ [[Wiktionary:Bảo quản viên|bảo quản viên]] mới có thể sửa bản mẫu bị khóa hoàn toàn.", additional = "Để thêm một bản mẫu vào thể loại này, hãy thêm <tt>{{[[Bản mẫu:pp-template|pp-template]]}}</tt> vào bản mẫu. Hãy cẩn thận và đặt nó vào mục <tt><nowiki><noinclude></nowiki></tt>, để các trang sử dụng bản mẫu không bị thêm vào thể loại. Điều này chỉ có tác dụng nếu trang bị khóa thật sự - chỉ thêm pp-template vào bản mẫu cũng không phải là khóa trang.", breadcrumb = "Bản mẫu bị khóa", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Thể loại trống"] = { topright = "{{shortcut|CAT:EC}}", description = "Categories with no members.", additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories. Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up. Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có tên thể loại không đúng"] = { description = "Categories with names that do not match the expected form within the category tree.", additional = [=[This usually happens when additional parameters have been given to {{lkbm|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name. ==Xem thêm== * [[:Thể loại:Thể loại chưa được xác định trên cây thể loại Wiktionary]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại chưa được xác định trên cây thể loại Wiktionary"] = { description = "Thể loại có sử dụng {{lkbm|auto cat}}, nhưng không có nhãn ở dữ liệu mô đun cây thể loại.", additional = [=[See the error box displayed on any of these categories for more info. ==Xem thêm== * [[:Thể loại:Trang có tên thể loại không đúng]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại ẩn"] = { description = "Trang này liệt kê các thể loại con của một thể loại ẩn có thể bị ẩn hoặc có thể không bị ẩn, tùy thuộc vào bản mẫu hoặc từ ma thuật <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> trong thể loại con hoặc trong thể loại mẹ.", additional = "Các thể loại xuất hiện ở đây chỉ nên là những thể loại chỉ dùng để bảo trì, tức là những thể loại phản ánh trạng thái hiện tại của một trang, chứ không phải dùng để phân loại trang. Thể loại ẩn không được liệt kê tại trang. Nếu bạn đang lo lắng tại sao thể loại bạn đã thêm vào bài viết không hiện ra, hãy kiểm tra xem thể loại đó có ẩn hay không. Xem trước trang sẽ liệt kê những thể loại ẩn tại cuối trang, dưới danh sách các bản mẫu sử dụng. Thể loại ẩn không ẩn tại trang thể loại. Bạn có thể tắt tính năng này đi trong giao diện của bạn bằng cách chọn hộp '''Hiển thị thể loại ẩn''' tại [[Đặc biệt:Tùy chọn#mw-prefsection-rendering|tùy chọn cá nhân]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại quá tải"] = { description = "Thể loại có hơn 1 triệu trang.", additional = "Such categories have the [[mw:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] extension disabled, which is normally used to list the newest and oldest pages in a category. This is because categories above that size load very slowly when it is enabled, and in some cases become inaccessible due to timing-out.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang được ghi chỉ mục"] = { description = "Trang này có từ thần chú <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.", breadcrumb = "Trang được ghi chỉ mục", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang không hiển thị trong bộ máy tìm kiếm"] = { description = "Thể loại này theo dõi các trang có sử dụng thẻ [[mw:Help:Magic words|chuyển đổi hành vi]] <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code>, để cho chúng không hiển thị trên các bộ máy tìm kiếm như Google. Các trang sẽ được vào thể loại này một cách tự động bởi phần mềm MediaWiki. Tên thể loại này được định nghĩa trong [[MediaWiki:Noindex-category]]. Để biết danh sách các thể loại theo dõi do MediaWiki điền, hãy xem [[Special:TrackingCategories]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu lỗi thời"] = { description = "This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.", additional = [=[This category is populated by {{lkbm|deprecated code}} and {{lkbm|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Thể loại:Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Thể loại:Trang dùng bản mẫu lỗi thời]]. Ideally, this category will be empty. Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=], breadcrumb = "Bản mẫu lỗi thời", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu con"] = { description = "Pages which use at least one of the lite templates.", additional = "Xem thêm [[:Thể loại:Bản mẫu Lua-free]].", breadcrumb = "Using lite templates", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng thừa"] = { description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.", additional = "These should be reviewed and simplified to avoid redundant specification.", breadcrumb = "Nguyên từ nội dòng thừa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ thiếu ID"] = { description = "Pages where {{tl|etymon}} is used without an ID and the linked page has only one etymon template for the language.", additional = "These should be updated to specify an explicit ID to avoid ambiguity if more etymons are added later.", breadcrumb = "Nguyên từ thiếu ID", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng liên kết đỏ"] = { description = "Trang sử dụng {{tl|etymon}} bên trong một {{tl|etymon}} khác và có liên kết đỏ đến mục từ đích.", additional = "Nên kiểm tra lại sau khi các mục từ đích được tạo.", breadcrumb = "Nguyên từ nội dòng liên kết đỏ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with tab characters"] = { description = "Pages which contain a tab character in their wikitext.", additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].", breadcrumb = "Tab characters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không đúng thứ tự"] = { description = "Trang có đề mục ngôn ngữ không đúng thứ tự.", additional = "Đề mục ngôn ngữ cấp 2 nên được xếp theo bảng chữ cái (từ A đến Z), riêng đề mục ngôn ngữ Đa ngữ và tiếng Việt được xếp đầu.", breadcrumb = "Đề mục ngôn ngữ không đúng thứ tự", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không chuẩn"] = { description = "Pages which contain a level 2 heading which does not match any language's canonical name.", additional = "The level 2 language heading for each language should always be that language's canonical name.", breadcrumb = "Đề mục ngôn ngữ không chuẩn", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with unwanted L1 headings"] = { description = "Pages which contain an unwanted level 1 heading.", additional = "Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.", breadcrumb = "Unwanted L1 headings", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with raw triple-brace template parameters"] = { description = "Pages which contain raw template parameters in the form of triple braces.", additional = "Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.", breadcrumb = "Raw template parameters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DEFAULTSORT"] = { topright = "{{shortcut|CAT:DEFAULTSORT}}", description = "Pages on which the {{lkbm|DEFAULTSORT:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DISPLAYTITLE]].", breadcrumb = "Xung đột với DEFAULTSORT", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DISPLAYTITLE"] = { topright = "{{shortcut|CAT:DISPLAYTITLE}}", description = "Pages on which the {{lkbm|DISPLAYTITLE:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DEFAULTSORT]].", breadcrumb = "Xung đột với DISPLAYTITLE", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có mã sắp xếp thô"] = { description = "Pages on which a sortkey has been used with a raw category.", additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." .. "\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" .. "By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.", breadcrumb = "Raw sortkeys", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kịch bản"] = { topright = "", description = "Các trang trong thể loại này có lỗi kịch bản [[Wiktionary:Scribunto|Lua]].", breadcrumb = "Lỗi kịch bản", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with ParserFunction errors"] = { topright = "{{shortcut|CAT:PFE}}", description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.", additional = "Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." .. "\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." .. "\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." .. "\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." .. "\n\nSee also [[:Category:Pages with module errors]].", breadcrumb = "ParserFunction errors", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi bản mẫu với tham số không hợp lệ"] = { description = "Pages that use unrecognized parameters when calling a template.", parents = "Bảo quản Wiktionary", can_be_empty = true, } raw_categories["Trang có sử dụng catfix"] = { description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.", additional = "This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi Bản mẫu:minitoc"] = { description = "Pages that display a mini table of contents by calling {{lkbm|minitoc}}.", additional = "This is is used on very large pages with many entries, to assist with navigation.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại gọi Bản mẫu:auto cat"] = { description = "Categories that have been placed in another category by calling {{lkbm|auto cat}}.", additional = "This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{lkbm|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Categories with categories using raw markup"] = { description = "Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng thẻ source cũ"] = { description = "Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.", breadcrumb = "Thẻ source cũ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ"] = { description = "Thiếu mã ngôn ngữ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ/IPA"] = { description = "Thiếu mã ngôn ngữ/IPA", parents = "Thiếu mã ngôn ngữ", can_be_empty = true, hidden = true, } insert(raw_handlers, function(data) local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$") if not template_type then return end local parents = {{ name = "Pages using invalid parameters when calling templates", sort = template_type == "general use" and "*" or template_type, }} local lang = require("Module:languages").getByCanonicalName(template_type, nil, true) if lang then insert(parents, {name = "Bảo trì mục từ", is_label = true, lang = lang:getCode()}) end return { lang = lang and lang:getCode() or nil, description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.", parents = parents, breadcrumb = template_type, } end) do local prefixes = require("Module:table").listToSet{"list", "P", "R", "RQ", "table", "U"} local function add_parent(parents, seen, cat_type, sortkey) if seen[cat_type] then return end insert(parents, { name = ("Pages using invalid parameters when calling %s templates"):format(cat_type), sort = sortkey, }) seen[cat_type] = true end insert(raw_handlers, function(data) local template = data.category:match("^Pages using invalid parameters when calling (.+)$") if not template then return end -- Resolve any redirects. template = new_title(template) while template do local redirect = template.redirectTarget if not (redirect and is_internal_title(redirect)) then break end template = redirect end -- Disallow templates which would always hidden maintennace categories (e.g. sandboxes). if not (template and not uses_hidden_category(template)) then return end local prefixed_text, lang = template.prefixedText if template.namespace == 10 then local name = template.text -- Remove the prefix if present (e.g. "R:" or "RQ:"). local prefix, text = name:match("^(.-):(.+)") if not (prefix and prefixes[prefix]) then text = name end -- Check the initial language code, chopping off hyphenated sections until there's a match or they run out. local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]") while code do lang = get_lang(code) if lang then break end code = code:match("(.+)%-%a*$") end -- If no match and it's a list: or table: template, check if the template name ends "/CODE". if not lang and (prefix == "list" or prefix == "table") then code = text:match("%f[^/]%l[%a-]*%a$") if code then lang = get_lang(code) end end end local sortkey = template.text local parents, seen = {}, {} -- Categorize as language-specific if a language was found. if lang then add_parent(parents, seen, lang:getCanonicalName(), sortkey) end -- Also grab any language categories from the template page. for _, cat in ipairs(template.categories) do if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then local cat_lang = split_lang_label(new_title(cat).text) if cat_lang then add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey) end end end -- If none were found, categorize as general use. if #parents == 0 then add_parent(parents, seen, "general use", sortkey) end -- Only add can_be_empty if the template exists and contains checkparams. local content, can_be_empty = template:getContent() if content then -- Check for {{#invoke:checkparams|warn|...}}. -- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present. for template in require("Module:template parser").find_templates(content) do if template:get_name() == "#INVOKE:" then local args = template:get_arguments() local arg_2 = args[2] if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then can_be_empty = true break end end end end return { canonical_name = "Pages using invalid parameters when calling " .. prefixed_text, lang = lang and lang:getCode() or nil, description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.") :format(m_template_parser.getTemplateInvocationName(template)), additional = "These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.", breadcrumb = prefixed_text, parents = parents, can_be_empty = can_be_empty, hidden = true, } end) end return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} jmpsvvzsq4nzwkq3pghmbh69elieux8 2345189 2345017 2026-04-14T09:50:58Z TheHighFighter2 42988 2345189 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local m_template_parser = require("Module:template parser") local get_lang = require("Module:languages").getByCode local insert = table.insert local is_internal_title = require("Module:pages").is_internal_title local new_title = mw.title.new local split_lang_label = require("Module:category tree").split_lang_label local php_trim = require("Module:Scribunto").php_trim local uses_hidden_category = require("Module:maintenance category").uses_hidden_category ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Bảo quản Wiktionary"] = { description = "Categories containing pages that are being tracked for attention and improvement by editors.", breadcrumb = "Bảo quản", parents = "Wiktionary", } raw_categories["Mục từ dùng cấu trúc mục từ Wiktionary cũ"] = { description = "Thể loai này chứa các mục từ dùng cấu trúc mục từ Wiktionary cũ.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor"] = { description = "Thể loại này chứa các trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Mục từ có ký tự chưa được mã hóa"] = { description = "Thể loại này chứa các mục từ có ký tự chưa được mã hóa.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có thẻ tọa độ hỏng"] = { description = "Thể loại này chứa các trang có lỗi cú pháp khi sử dụng hàm <code><nowiki>{{#coordinates}}</nowiki></code> hoặc gọi bản mẫu {{Liên kết bản mẫu|coord}}.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Không đưa lên Trang Chính"] = { description = "Thể loại này tồn tại để loại trừ mọi mục từ không nên đưa lên Trang Chính khỏi {{Liên kết bản mẫu|Mục từ mới}}, tại vì phần mở rộng [[MW:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] không hỗ trợ thể loại con.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Tài liệu bản mẫu"] = { description = "Trang này chứa các trang tài liệu bản mẫu.", breadcrumb = "Tài liệu bản mẫu", parents = "Wiktionary", } raw_categories["Bản mẫu và mô đun chưa có tài liệu"] = { description = "Thể loại này chứa các trang bản mẫu và mô đun chưa có tài liệu.", parents = { "Tài liệu bản mẫu", "Category:Bảo quản Wiktionary", } } raw_categories["Yêu cầu bỏ cấm"] = { description = "Trang này chứa các yêu cầu bỏ cấm trong không gian thảo luận thành viên.", breadcrumb = "Yêu cầu bỏ cấm", parents = { "Bảo quản Wiktionary", "Category:Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời.", breadcrumb = "Bản mẫu lỗi thời", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đang được viết"] = { description = "Trang này liệt kê các trang đang viết hoặc xây dựng. Các trang trong thể loại thường được đưa vào đây bằng cách sử dụng bản mẫu {{lkbm|đang viết}}.", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ biến tố có liên kết đỏ đến mục từ chính"] = { description = "Trang này chứa các mục từ biến tố có liên kết đỏ đến mục từ chính.", breadcrumb = "Mục từ biến tố có liên kết đỏ đến mục từ chính", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời nhưng được giữ lại vì lý do bảo tồn.", breadcrumb = "Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn", parents = { "Bản mẫu lỗi thời", }, can_be_empty = true, hidden = true, } raw_categories["Chờ xóa"] = { description = "Trang này chứa các trang đã được gắn thẻ để [[Wiktionary:Quy định xóa trang#Xóa nhanh|xóa nhanh]]. Bạn có thể thêm các trang vào thể loại này bằng cách sử dụng {{LKBM|Chờ xóa}}. Hãy nhớ kiểm tra nội dung và lịch sử của trang trước khi xóa trang.", breadcrumb = "Chờ xóa", parents = { "Bảo quản Wiktionary", "Category:Trang có người đề nghị xóa", }, can_be_empty = true, hidden = true, } raw_categories["Trang có người đề nghị xóa"] = { description = "Trang này chứa các trang đề nghị xóa", breadcrumb = "Có người đề nghị xóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code>. Các mục từ sẽ được tự động đưa vào thể loại [[:Thể loại:Mục từ chất lượng kém]] để dễ quản lý và tự động đưa vào [[:Thể loại:Mục từ chất lượng kém quá 7 ngày]] đối với các mục từ đã đặt bảng chất lượng kém quá 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém quá 7 ngày"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code> đã hơn 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém quá 7 ngày", parents = { "Mục từ chất lượng kém", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Yêu cầu sửa đổi trang bị khóa"] = { description = "Trang này chứa các trang có lời yêu cầu {{Liên kết bản mẫu|Sửa trang khóa}} chưa được giải quyết.", breadcrumb = "Yêu cầu sửa đổi trang bị khóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại theo dõi"] = { description = "Các thể loại con của thể loại này là những thể loại theo dõi khác. Để thêm một thể loại vào thể loại này, gắn thẻ nó với {{lkbm|Thể loại theo dõi}}. Để có một danh sách của các thể loại theo dõi được tự động tạo bởi phần mềm wiki, hãy xem [[Đặc biệt:Thể loại theo dõi]].", breadcrumb = "Thể loại theo dõi", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có sử dụng tập tin không tồn tại"] = { description = "Thể loại này chứa các trang có sử dụng tập tin không tồn tại.", breadcrumb = "Trang có sử dụng tập tin không tồn tại", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép"] = { description = "Thể loại này chứa các trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép.", breadcrumb = "Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao"] = { description = "Thể loại này được phần mềm MediaWiki xây dựng tự động. (Nó được đặt tên theo nội dung của [[MediaWiki:Expensive-parserfunction-category]].) Nó chứa các trang [[w:en:Wikipedia:Template limits#Expensive parser function calls|gọi hàm cú pháp cần mức độ xử lý cao]] quá nhiều lần. Vào ngày 14 tháng 10 năm 2010, các hàm cần mức độ xử lý cao là <code>#ifexist</code>, <code><nowiki>{{PAGESINCATEGORY}}</nowiki></code>, và <code><nowiki>{{PAGESIZE}}</nowiki></code>. Các trang bên dưới cần được sửa chữa để giảm số lần gọi các hàm này.", breadcrumb = "Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đưa đối số thừa vào bản mẫu"] = { description = "Thể loại này bao gồm các trang được phần mềm phát hiện nhập giá trị nhiều lần cho cùng một tham số trong lúc gọi bản mẫu, chẳng hạn <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> và <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>. Nếu một tham số được nhập nhiều lần, chỉ giá trị cuối cùng sẽ được phần mềm sử dụng.", breadcrumb = "Trang đưa đối số thừa vào bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại đổi hướng không trống"] = { description = "Thể loại này chứa các trang đổi hướng không trống.", breadcrumb = "Thể loại đổi hướng không trống", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có các đối số formatnum không phải số"] = { description = "Thể loại này chứa các trang có các đối số formatnum không phải số.", breadcrumb = "Trang có các đối số formatnum không phải số", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có chứa tham số bản mẫu bị loại bỏ"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có chứa tham số bản mẫu bị loại bỏ", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có tên hiển thị được bỏ qua"] = { description = "Thể loại này dành cho các trang có tên hiển thị được bỏ qua.", breadcrumb = "Trang có tên hiển thị được bỏ qua", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang dùng thuộc tính enclose cũ"] = { description = "Thể loại này dành cho các trang dùng thuộc tính enclose cũ.", breadcrumb = "Trang dùng thuộc tính enclose cũ", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kết xuất khuông nhạc"] = { description = "Thể loại này dành cho các trang có lỗi kết xuất khuông nhạc.", breadcrumb = "Trang có lỗi kết xuất khuông nhạc", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi bảng kiểu bản mẫu"] = { description = "Thể loại này dành cho các trang có lỗi bảng kiểu bản mẫu.", breadcrumb = "Trang có lỗi bảng kiểu bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Bảng dịch không chú thích ngữ nghĩa"] = { description = "Thể loại này chứa các trang có bảng dịch không chú thích ngữ nghĩa.", breadcrumb = "Bảng dịch không chú thích ngữ nghĩa", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang bị khóa"] = { description = "Thể loại này tổ chức các thể loại con cụ thể hơn có chứa '''[[Wiktionary:Quy định khóa trang|các trang bị khóa]]'''. Để biết danh sách động và sắp xếp tất cả các trang được khóa, hãy xem [[Special:ProtectedPages]].", breadcrumb = "Trang bị khóa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị hạn chế sửa đổi"] = { description = "Thể loại này chứa các trang bản mẫu bị hạn chế sửa đổi.", breadcrumb = "Bản mẫu bị hạn chế sửa đổi", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị khóa"] = { description = "Thể loại này có chứa các [[Trợ giúp:Bản mẫu|bản mẫu]] đã được [[Wiktionary:Quy định khóa trang|khóa hoàn toàn]]. Điều này thường thực hiện để ngăn ngừa [[Wiktionary:Phá hoại|phá hoại]] với những bản mẫu được dùng ở rất nhiều trang hoặc ở những trang dễ thấy như [[Trang Chính]] (còn gọi là bản mẫu có nguy cơ cao), vì phá hoại những bản mẫu như vậy sẽ gây thay đổi lớn dễ nhận thấy. Chỉ [[Wiktionary:Bảo quản viên|bảo quản viên]] mới có thể sửa bản mẫu bị khóa hoàn toàn.", additional = "Để thêm một bản mẫu vào thể loại này, hãy thêm <tt>{{[[Bản mẫu:pp-template|pp-template]]}}</tt> vào bản mẫu. Hãy cẩn thận và đặt nó vào mục <tt><nowiki><noinclude></nowiki></tt>, để các trang sử dụng bản mẫu không bị thêm vào thể loại. Điều này chỉ có tác dụng nếu trang bị khóa thật sự - chỉ thêm pp-template vào bản mẫu cũng không phải là khóa trang.", breadcrumb = "Bản mẫu bị khóa", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Thể loại trống"] = { topright = "{{shortcut|CAT:EC}}", description = "Categories with no members.", additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories. Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up. Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có tên thể loại không đúng"] = { description = "Categories with names that do not match the expected form within the category tree.", additional = [=[This usually happens when additional parameters have been given to {{lkbm|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name. ==Xem thêm== * [[:Thể loại:Thể loại chưa được xác định trên cây thể loại Wiktionary]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại chưa được xác định trên cây thể loại Wiktionary"] = { description = "Thể loại có sử dụng {{lkbm|auto cat}}, nhưng không có nhãn ở dữ liệu mô đun cây thể loại.", additional = [=[See the error box displayed on any of these categories for more info. ==Xem thêm== * [[:Thể loại:Trang có tên thể loại không đúng]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại ẩn"] = { description = "Trang này liệt kê các thể loại con của một thể loại ẩn có thể bị ẩn hoặc có thể không bị ẩn, tùy thuộc vào bản mẫu hoặc từ ma thuật <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> trong thể loại con hoặc trong thể loại mẹ.", additional = "Các thể loại xuất hiện ở đây chỉ nên là những thể loại chỉ dùng để bảo trì, tức là những thể loại phản ánh trạng thái hiện tại của một trang, chứ không phải dùng để phân loại trang. Thể loại ẩn không được liệt kê tại trang. Nếu bạn đang lo lắng tại sao thể loại bạn đã thêm vào bài viết không hiện ra, hãy kiểm tra xem thể loại đó có ẩn hay không. Xem trước trang sẽ liệt kê những thể loại ẩn tại cuối trang, dưới danh sách các bản mẫu sử dụng. Thể loại ẩn không ẩn tại trang thể loại. Bạn có thể tắt tính năng này đi trong giao diện của bạn bằng cách chọn hộp '''Hiển thị thể loại ẩn''' tại [[Đặc biệt:Tùy chọn#mw-prefsection-rendering|tùy chọn cá nhân]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại quá tải"] = { description = "Thể loại có hơn 1 triệu trang.", additional = "Such categories have the [[mw:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] extension disabled, which is normally used to list the newest and oldest pages in a category. This is because categories above that size load very slowly when it is enabled, and in some cases become inaccessible due to timing-out.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang được ghi chỉ mục"] = { description = "Trang này có từ thần chú <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.", breadcrumb = "Trang được ghi chỉ mục", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang không hiển thị trong bộ máy tìm kiếm"] = { description = "Thể loại này theo dõi các trang có sử dụng thẻ [[mw:Help:Magic words|chuyển đổi hành vi]] <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code>, để cho chúng không hiển thị trên các bộ máy tìm kiếm như Google. Các trang sẽ được vào thể loại này một cách tự động bởi phần mềm MediaWiki. Tên thể loại này được định nghĩa trong [[MediaWiki:Noindex-category]]. Để biết danh sách các thể loại theo dõi do MediaWiki điền, hãy xem [[Special:TrackingCategories]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu lỗi thời"] = { description = "This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.", additional = [=[This category is populated by {{lkbm|deprecated code}} and {{lkbm|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Thể loại:Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Thể loại:Trang dùng bản mẫu lỗi thời]]. Ideally, this category will be empty. Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=], breadcrumb = "Bản mẫu lỗi thời", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu con"] = { description = "Pages which use at least one of the lite templates.", additional = "Xem thêm [[:Thể loại:Bản mẫu Lua-free]].", breadcrumb = "Using lite templates", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng thừa"] = { description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.", additional = "These should be reviewed and simplified to avoid redundant specification.", breadcrumb = "Nguyên từ nội dòng thừa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ thiếu ID"] = { description = "Trang sử dụng {{tl|etymon}} bị thiếu ID, và trang được liên kết chỉ chứa duy nhất một bản mẫu nguyên từ cho ngôn ngữ đó.", additional = "Cần cập nhật những thông tin này để chỉ định rõ ID cụ thể, nhằm tránh sự mơ hồ nếu sau này có thêm nguyên từ khác được bổ sung.", breadcrumb = "Nguyên từ thiếu ID", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng liên kết đỏ"] = { description = "Trang sử dụng {{tl|etymon}} bên trong một {{tl|etymon}} khác và có liên kết đỏ đến mục từ đích.", additional = "Nên kiểm tra lại sau khi các mục từ đích được tạo.", breadcrumb = "Nguyên từ nội dòng liên kết đỏ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with tab characters"] = { description = "Pages which contain a tab character in their wikitext.", additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].", breadcrumb = "Tab characters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không đúng thứ tự"] = { description = "Trang có đề mục ngôn ngữ không đúng thứ tự.", additional = "Đề mục ngôn ngữ cấp 2 nên được xếp theo bảng chữ cái (từ A đến Z), riêng đề mục ngôn ngữ Đa ngữ và tiếng Việt được xếp đầu.", breadcrumb = "Đề mục ngôn ngữ không đúng thứ tự", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không chuẩn"] = { description = "Pages which contain a level 2 heading which does not match any language's canonical name.", additional = "The level 2 language heading for each language should always be that language's canonical name.", breadcrumb = "Đề mục ngôn ngữ không chuẩn", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with unwanted L1 headings"] = { description = "Pages which contain an unwanted level 1 heading.", additional = "Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.", breadcrumb = "Unwanted L1 headings", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with raw triple-brace template parameters"] = { description = "Pages which contain raw template parameters in the form of triple braces.", additional = "Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.", breadcrumb = "Raw template parameters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DEFAULTSORT"] = { topright = "{{shortcut|CAT:DEFAULTSORT}}", description = "Pages on which the {{lkbm|DEFAULTSORT:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DISPLAYTITLE]].", breadcrumb = "Xung đột với DEFAULTSORT", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DISPLAYTITLE"] = { topright = "{{shortcut|CAT:DISPLAYTITLE}}", description = "Pages on which the {{lkbm|DISPLAYTITLE:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DEFAULTSORT]].", breadcrumb = "Xung đột với DISPLAYTITLE", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có mã sắp xếp thô"] = { description = "Pages on which a sortkey has been used with a raw category.", additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." .. "\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" .. "By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.", breadcrumb = "Raw sortkeys", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kịch bản"] = { topright = "", description = "Các trang trong thể loại này có lỗi kịch bản [[Wiktionary:Scribunto|Lua]].", breadcrumb = "Lỗi kịch bản", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with ParserFunction errors"] = { topright = "{{shortcut|CAT:PFE}}", description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.", additional = "Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." .. "\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." .. "\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." .. "\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." .. "\n\nSee also [[:Category:Pages with module errors]].", breadcrumb = "ParserFunction errors", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi bản mẫu với tham số không hợp lệ"] = { description = "Pages that use unrecognized parameters when calling a template.", parents = "Bảo quản Wiktionary", can_be_empty = true, } raw_categories["Trang có sử dụng catfix"] = { description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.", additional = "This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi Bản mẫu:minitoc"] = { description = "Pages that display a mini table of contents by calling {{lkbm|minitoc}}.", additional = "This is is used on very large pages with many entries, to assist with navigation.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại gọi Bản mẫu:auto cat"] = { description = "Categories that have been placed in another category by calling {{lkbm|auto cat}}.", additional = "This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{lkbm|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Categories with categories using raw markup"] = { description = "Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng thẻ source cũ"] = { description = "Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.", breadcrumb = "Thẻ source cũ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ"] = { description = "Thiếu mã ngôn ngữ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ/IPA"] = { description = "Thiếu mã ngôn ngữ/IPA", parents = "Thiếu mã ngôn ngữ", can_be_empty = true, hidden = true, } insert(raw_handlers, function(data) local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$") if not template_type then return end local parents = {{ name = "Pages using invalid parameters when calling templates", sort = template_type == "general use" and "*" or template_type, }} local lang = require("Module:languages").getByCanonicalName(template_type, nil, true) if lang then insert(parents, {name = "Bảo trì mục từ", is_label = true, lang = lang:getCode()}) end return { lang = lang and lang:getCode() or nil, description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.", parents = parents, breadcrumb = template_type, } end) do local prefixes = require("Module:table").listToSet{"list", "P", "R", "RQ", "table", "U"} local function add_parent(parents, seen, cat_type, sortkey) if seen[cat_type] then return end insert(parents, { name = ("Pages using invalid parameters when calling %s templates"):format(cat_type), sort = sortkey, }) seen[cat_type] = true end insert(raw_handlers, function(data) local template = data.category:match("^Pages using invalid parameters when calling (.+)$") if not template then return end -- Resolve any redirects. template = new_title(template) while template do local redirect = template.redirectTarget if not (redirect and is_internal_title(redirect)) then break end template = redirect end -- Disallow templates which would always hidden maintennace categories (e.g. sandboxes). if not (template and not uses_hidden_category(template)) then return end local prefixed_text, lang = template.prefixedText if template.namespace == 10 then local name = template.text -- Remove the prefix if present (e.g. "R:" or "RQ:"). local prefix, text = name:match("^(.-):(.+)") if not (prefix and prefixes[prefix]) then text = name end -- Check the initial language code, chopping off hyphenated sections until there's a match or they run out. local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]") while code do lang = get_lang(code) if lang then break end code = code:match("(.+)%-%a*$") end -- If no match and it's a list: or table: template, check if the template name ends "/CODE". if not lang and (prefix == "list" or prefix == "table") then code = text:match("%f[^/]%l[%a-]*%a$") if code then lang = get_lang(code) end end end local sortkey = template.text local parents, seen = {}, {} -- Categorize as language-specific if a language was found. if lang then add_parent(parents, seen, lang:getCanonicalName(), sortkey) end -- Also grab any language categories from the template page. for _, cat in ipairs(template.categories) do if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then local cat_lang = split_lang_label(new_title(cat).text) if cat_lang then add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey) end end end -- If none were found, categorize as general use. if #parents == 0 then add_parent(parents, seen, "general use", sortkey) end -- Only add can_be_empty if the template exists and contains checkparams. local content, can_be_empty = template:getContent() if content then -- Check for {{#invoke:checkparams|warn|...}}. -- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present. for template in require("Module:template parser").find_templates(content) do if template:get_name() == "#INVOKE:" then local args = template:get_arguments() local arg_2 = args[2] if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then can_be_empty = true break end end end end return { canonical_name = "Pages using invalid parameters when calling " .. prefixed_text, lang = lang and lang:getCode() or nil, description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.") :format(m_template_parser.getTemplateInvocationName(template)), additional = "These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.", breadcrumb = prefixed_text, parents = parents, can_be_empty = can_be_empty, hidden = true, } end) end return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} ak9jsohtnyi5qegm6qujeo23onif191 2345191 2345189 2026-04-14T09:59:59Z TheHighFighter2 42988 2345191 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local m_template_parser = require("Module:template parser") local get_lang = require("Module:languages").getByCode local insert = table.insert local is_internal_title = require("Module:pages").is_internal_title local new_title = mw.title.new local split_lang_label = require("Module:category tree").split_lang_label local php_trim = require("Module:Scribunto").php_trim local uses_hidden_category = require("Module:maintenance category").uses_hidden_category ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Bảo quản Wiktionary"] = { description = "Categories containing pages that are being tracked for attention and improvement by editors.", breadcrumb = "Bảo quản", parents = "Wiktionary", } raw_categories["Mục từ dùng cấu trúc mục từ Wiktionary cũ"] = { description = "Thể loai này chứa các mục từ dùng cấu trúc mục từ Wiktionary cũ.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor"] = { description = "Thể loại này chứa các trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Mục từ có ký tự chưa được mã hóa"] = { description = "Thể loại này chứa các mục từ có ký tự chưa được mã hóa.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có thẻ tọa độ hỏng"] = { description = "Thể loại này chứa các trang có lỗi cú pháp khi sử dụng hàm <code><nowiki>{{#coordinates}}</nowiki></code> hoặc gọi bản mẫu {{Liên kết bản mẫu|coord}}.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Không đưa lên Trang Chính"] = { description = "Thể loại này tồn tại để loại trừ mọi mục từ không nên đưa lên Trang Chính khỏi {{Liên kết bản mẫu|Mục từ mới}}, tại vì phần mở rộng [[MW:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] không hỗ trợ thể loại con.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Tài liệu bản mẫu"] = { description = "Trang này chứa các trang tài liệu bản mẫu.", breadcrumb = "Tài liệu bản mẫu", parents = "Wiktionary", } raw_categories["Bản mẫu và mô đun chưa có tài liệu"] = { description = "Thể loại này chứa các trang bản mẫu và mô đun chưa có tài liệu.", parents = { "Tài liệu bản mẫu", "Category:Bảo quản Wiktionary", } } raw_categories["Yêu cầu bỏ cấm"] = { description = "Trang này chứa các yêu cầu bỏ cấm trong không gian thảo luận thành viên.", breadcrumb = "Yêu cầu bỏ cấm", parents = { "Bảo quản Wiktionary", "Category:Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời.", breadcrumb = "Bản mẫu lỗi thời", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đang được viết"] = { description = "Trang này liệt kê các trang đang viết hoặc xây dựng. Các trang trong thể loại thường được đưa vào đây bằng cách sử dụng bản mẫu {{lkbm|đang viết}}.", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ biến tố có liên kết đỏ đến mục từ chính"] = { description = "Trang này chứa các mục từ biến tố có liên kết đỏ đến mục từ chính.", breadcrumb = "Mục từ biến tố có liên kết đỏ đến mục từ chính", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời nhưng được giữ lại vì lý do bảo tồn.", breadcrumb = "Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn", parents = { "Bản mẫu lỗi thời", }, can_be_empty = true, hidden = true, } raw_categories["Chờ xóa"] = { description = "Trang này chứa các trang đã được gắn thẻ để [[Wiktionary:Quy định xóa trang#Xóa nhanh|xóa nhanh]]. Bạn có thể thêm các trang vào thể loại này bằng cách sử dụng {{LKBM|Chờ xóa}}. Hãy nhớ kiểm tra nội dung và lịch sử của trang trước khi xóa trang.", breadcrumb = "Chờ xóa", parents = { "Bảo quản Wiktionary", "Category:Trang có người đề nghị xóa", }, can_be_empty = true, hidden = true, } raw_categories["Trang có người đề nghị xóa"] = { description = "Trang này chứa các trang đề nghị xóa", breadcrumb = "Có người đề nghị xóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code>. Các mục từ sẽ được tự động đưa vào thể loại [[:Thể loại:Mục từ chất lượng kém]] để dễ quản lý và tự động đưa vào [[:Thể loại:Mục từ chất lượng kém quá 7 ngày]] đối với các mục từ đã đặt bảng chất lượng kém quá 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém quá 7 ngày"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code> đã hơn 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém quá 7 ngày", parents = { "Mục từ chất lượng kém", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Yêu cầu sửa đổi trang bị khóa"] = { description = "Trang này chứa các trang có lời yêu cầu {{Liên kết bản mẫu|Sửa trang khóa}} chưa được giải quyết.", breadcrumb = "Yêu cầu sửa đổi trang bị khóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại theo dõi"] = { description = "Các thể loại con của thể loại này là những thể loại theo dõi khác. Để thêm một thể loại vào thể loại này, gắn thẻ nó với {{lkbm|Thể loại theo dõi}}. Để có một danh sách của các thể loại theo dõi được tự động tạo bởi phần mềm wiki, hãy xem [[Đặc biệt:Thể loại theo dõi]].", breadcrumb = "Thể loại theo dõi", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có sử dụng tập tin không tồn tại"] = { description = "Thể loại này chứa các trang có sử dụng tập tin không tồn tại.", breadcrumb = "Trang có sử dụng tập tin không tồn tại", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép"] = { description = "Thể loại này chứa các trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép.", breadcrumb = "Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao"] = { description = "Thể loại này được phần mềm MediaWiki xây dựng tự động. (Nó được đặt tên theo nội dung của [[MediaWiki:Expensive-parserfunction-category]].) Nó chứa các trang [[w:en:Wikipedia:Template limits#Expensive parser function calls|gọi hàm cú pháp cần mức độ xử lý cao]] quá nhiều lần. Vào ngày 14 tháng 10 năm 2010, các hàm cần mức độ xử lý cao là <code>#ifexist</code>, <code><nowiki>{{PAGESINCATEGORY}}</nowiki></code>, và <code><nowiki>{{PAGESIZE}}</nowiki></code>. Các trang bên dưới cần được sửa chữa để giảm số lần gọi các hàm này.", breadcrumb = "Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đưa đối số thừa vào bản mẫu"] = { description = "Thể loại này bao gồm các trang được phần mềm phát hiện nhập giá trị nhiều lần cho cùng một tham số trong lúc gọi bản mẫu, chẳng hạn <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> và <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>. Nếu một tham số được nhập nhiều lần, chỉ giá trị cuối cùng sẽ được phần mềm sử dụng.", breadcrumb = "Trang đưa đối số thừa vào bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại đổi hướng không trống"] = { description = "Thể loại này chứa các trang đổi hướng không trống.", breadcrumb = "Thể loại đổi hướng không trống", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có các đối số formatnum không phải số"] = { description = "Thể loại này chứa các trang có các đối số formatnum không phải số.", breadcrumb = "Trang có các đối số formatnum không phải số", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có chứa tham số bản mẫu bị loại bỏ"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có chứa tham số bản mẫu bị loại bỏ", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có tên hiển thị được bỏ qua"] = { description = "Thể loại này dành cho các trang có tên hiển thị được bỏ qua.", breadcrumb = "Trang có tên hiển thị được bỏ qua", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang dùng thuộc tính enclose cũ"] = { description = "Thể loại này dành cho các trang dùng thuộc tính enclose cũ.", breadcrumb = "Trang dùng thuộc tính enclose cũ", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kết xuất khuông nhạc"] = { description = "Thể loại này dành cho các trang có lỗi kết xuất khuông nhạc.", breadcrumb = "Trang có lỗi kết xuất khuông nhạc", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi bảng kiểu bản mẫu"] = { description = "Thể loại này dành cho các trang có lỗi bảng kiểu bản mẫu.", breadcrumb = "Trang có lỗi bảng kiểu bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Bảng dịch không chú thích ngữ nghĩa"] = { description = "Thể loại này chứa các trang có bảng dịch không chú thích ngữ nghĩa.", breadcrumb = "Bảng dịch không chú thích ngữ nghĩa", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang bị khóa"] = { description = "Thể loại này tổ chức các thể loại con cụ thể hơn có chứa '''[[Wiktionary:Quy định khóa trang|các trang bị khóa]]'''. Để biết danh sách động và sắp xếp tất cả các trang được khóa, hãy xem [[Special:ProtectedPages]].", breadcrumb = "Trang bị khóa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị hạn chế sửa đổi"] = { description = "Thể loại này chứa các trang bản mẫu bị hạn chế sửa đổi.", breadcrumb = "Bản mẫu bị hạn chế sửa đổi", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị khóa"] = { description = "Thể loại này có chứa các [[Trợ giúp:Bản mẫu|bản mẫu]] đã được [[Wiktionary:Quy định khóa trang|khóa hoàn toàn]]. Điều này thường thực hiện để ngăn ngừa [[Wiktionary:Phá hoại|phá hoại]] với những bản mẫu được dùng ở rất nhiều trang hoặc ở những trang dễ thấy như [[Trang Chính]] (còn gọi là bản mẫu có nguy cơ cao), vì phá hoại những bản mẫu như vậy sẽ gây thay đổi lớn dễ nhận thấy. Chỉ [[Wiktionary:Bảo quản viên|bảo quản viên]] mới có thể sửa bản mẫu bị khóa hoàn toàn.", additional = "Để thêm một bản mẫu vào thể loại này, hãy thêm <tt>{{[[Bản mẫu:pp-template|pp-template]]}}</tt> vào bản mẫu. Hãy cẩn thận và đặt nó vào mục <tt><nowiki><noinclude></nowiki></tt>, để các trang sử dụng bản mẫu không bị thêm vào thể loại. Điều này chỉ có tác dụng nếu trang bị khóa thật sự - chỉ thêm pp-template vào bản mẫu cũng không phải là khóa trang.", breadcrumb = "Bản mẫu bị khóa", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Thể loại trống"] = { topright = "{{shortcut|CAT:EC}}", description = "Categories with no members.", additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories. Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up. Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có tên thể loại không đúng"] = { description = "Categories with names that do not match the expected form within the category tree.", additional = [=[This usually happens when additional parameters have been given to {{lkbm|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name. ==Xem thêm== * [[:Thể loại:Thể loại chưa được xác định trên cây thể loại Wiktionary]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại chưa được xác định trên cây thể loại Wiktionary"] = { description = "Thể loại có sử dụng {{lkbm|auto cat}}, nhưng không có nhãn ở dữ liệu mô đun cây thể loại.", additional = [=[See the error box displayed on any of these categories for more info. ==Xem thêm== * [[:Thể loại:Trang có tên thể loại không đúng]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại ẩn"] = { description = "Trang này liệt kê các thể loại con của một thể loại ẩn có thể bị ẩn hoặc có thể không bị ẩn, tùy thuộc vào bản mẫu hoặc từ ma thuật <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> trong thể loại con hoặc trong thể loại mẹ.", additional = "Các thể loại xuất hiện ở đây chỉ nên là những thể loại chỉ dùng để bảo trì, tức là những thể loại phản ánh trạng thái hiện tại của một trang, chứ không phải dùng để phân loại trang. Thể loại ẩn không được liệt kê tại trang. Nếu bạn đang lo lắng tại sao thể loại bạn đã thêm vào bài viết không hiện ra, hãy kiểm tra xem thể loại đó có ẩn hay không. Xem trước trang sẽ liệt kê những thể loại ẩn tại cuối trang, dưới danh sách các bản mẫu sử dụng. Thể loại ẩn không ẩn tại trang thể loại. Bạn có thể tắt tính năng này đi trong giao diện của bạn bằng cách chọn hộp '''Hiển thị thể loại ẩn''' tại [[Đặc biệt:Tùy chọn#mw-prefsection-rendering|tùy chọn cá nhân]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại quá tải"] = { description = "Thể loại có hơn 1 triệu trang.", additional = "Such categories have the [[mw:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] extension disabled, which is normally used to list the newest and oldest pages in a category. This is because categories above that size load very slowly when it is enabled, and in some cases become inaccessible due to timing-out.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang được ghi chỉ mục"] = { description = "Trang này có từ thần chú <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.", breadcrumb = "Trang được ghi chỉ mục", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang không hiển thị trong bộ máy tìm kiếm"] = { description = "Thể loại này theo dõi các trang có sử dụng thẻ [[mw:Help:Magic words|chuyển đổi hành vi]] <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code>, để cho chúng không hiển thị trên các bộ máy tìm kiếm như Google. Các trang sẽ được vào thể loại này một cách tự động bởi phần mềm MediaWiki. Tên thể loại này được định nghĩa trong [[MediaWiki:Noindex-category]]. Để biết danh sách các thể loại theo dõi do MediaWiki điền, hãy xem [[Special:TrackingCategories]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu lỗi thời"] = { description = "This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.", additional = [=[This category is populated by {{lkbm|deprecated code}} and {{lkbm|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Thể loại:Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Thể loại:Trang dùng bản mẫu lỗi thời]]. Ideally, this category will be empty. Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=], breadcrumb = "Bản mẫu lỗi thời", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu con"] = { description = "Pages which use at least one of the lite templates.", additional = "Xem thêm [[:Thể loại:Bản mẫu Lua-free]].", breadcrumb = "Using lite templates", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng thừa"] = { description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.", additional = "These should be reviewed and simplified to avoid redundant specification.", breadcrumb = "Nguyên từ nội dòng thừa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ thiếu ID"] = { description = "Trang sử dụng {{tl|etymon}} bị thiếu ID, đồng thời chỉ có một bản mẫu nguyên từ cho ngôn ngữ đó tại trang được liên kết.", additional = "Cần cập nhật những thông tin này để chỉ định rõ ID cụ thể, nhằm tránh sự mơ hồ nếu sau này có thêm nguyên từ khác được bổ sung.", breadcrumb = "Nguyên từ thiếu ID", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng liên kết đỏ"] = { description = "Trang sử dụng {{tl|etymon}} bên trong một {{tl|etymon}} khác và có liên kết đỏ đến mục từ đích.", additional = "Nên kiểm tra lại sau khi các mục từ đích được tạo.", breadcrumb = "Nguyên từ nội dòng liên kết đỏ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with tab characters"] = { description = "Pages which contain a tab character in their wikitext.", additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].", breadcrumb = "Tab characters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không đúng thứ tự"] = { description = "Trang có đề mục ngôn ngữ không đúng thứ tự.", additional = "Đề mục ngôn ngữ cấp 2 nên được xếp theo bảng chữ cái (từ A đến Z), riêng đề mục ngôn ngữ Đa ngữ và tiếng Việt được xếp đầu.", breadcrumb = "Đề mục ngôn ngữ không đúng thứ tự", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không chuẩn"] = { description = "Pages which contain a level 2 heading which does not match any language's canonical name.", additional = "The level 2 language heading for each language should always be that language's canonical name.", breadcrumb = "Đề mục ngôn ngữ không chuẩn", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with unwanted L1 headings"] = { description = "Pages which contain an unwanted level 1 heading.", additional = "Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.", breadcrumb = "Unwanted L1 headings", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with raw triple-brace template parameters"] = { description = "Pages which contain raw template parameters in the form of triple braces.", additional = "Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.", breadcrumb = "Raw template parameters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DEFAULTSORT"] = { topright = "{{shortcut|CAT:DEFAULTSORT}}", description = "Pages on which the {{lkbm|DEFAULTSORT:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DISPLAYTITLE]].", breadcrumb = "Xung đột với DEFAULTSORT", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DISPLAYTITLE"] = { topright = "{{shortcut|CAT:DISPLAYTITLE}}", description = "Pages on which the {{lkbm|DISPLAYTITLE:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DEFAULTSORT]].", breadcrumb = "Xung đột với DISPLAYTITLE", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có mã sắp xếp thô"] = { description = "Pages on which a sortkey has been used with a raw category.", additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." .. "\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" .. "By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.", breadcrumb = "Raw sortkeys", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kịch bản"] = { topright = "", description = "Các trang trong thể loại này có lỗi kịch bản [[Wiktionary:Scribunto|Lua]].", breadcrumb = "Lỗi kịch bản", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with ParserFunction errors"] = { topright = "{{shortcut|CAT:PFE}}", description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.", additional = "Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." .. "\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." .. "\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." .. "\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." .. "\n\nSee also [[:Category:Pages with module errors]].", breadcrumb = "ParserFunction errors", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi bản mẫu với tham số không hợp lệ"] = { description = "Pages that use unrecognized parameters when calling a template.", parents = "Bảo quản Wiktionary", can_be_empty = true, } raw_categories["Trang có sử dụng catfix"] = { description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.", additional = "This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi Bản mẫu:minitoc"] = { description = "Pages that display a mini table of contents by calling {{lkbm|minitoc}}.", additional = "This is is used on very large pages with many entries, to assist with navigation.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại gọi Bản mẫu:auto cat"] = { description = "Categories that have been placed in another category by calling {{lkbm|auto cat}}.", additional = "This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{lkbm|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Categories with categories using raw markup"] = { description = "Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng thẻ source cũ"] = { description = "Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.", breadcrumb = "Thẻ source cũ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ"] = { description = "Thiếu mã ngôn ngữ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ/IPA"] = { description = "Thiếu mã ngôn ngữ/IPA", parents = "Thiếu mã ngôn ngữ", can_be_empty = true, hidden = true, } insert(raw_handlers, function(data) local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$") if not template_type then return end local parents = {{ name = "Pages using invalid parameters when calling templates", sort = template_type == "general use" and "*" or template_type, }} local lang = require("Module:languages").getByCanonicalName(template_type, nil, true) if lang then insert(parents, {name = "Bảo trì mục từ", is_label = true, lang = lang:getCode()}) end return { lang = lang and lang:getCode() or nil, description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.", parents = parents, breadcrumb = template_type, } end) do local prefixes = require("Module:table").listToSet{"list", "P", "R", "RQ", "table", "U"} local function add_parent(parents, seen, cat_type, sortkey) if seen[cat_type] then return end insert(parents, { name = ("Pages using invalid parameters when calling %s templates"):format(cat_type), sort = sortkey, }) seen[cat_type] = true end insert(raw_handlers, function(data) local template = data.category:match("^Pages using invalid parameters when calling (.+)$") if not template then return end -- Resolve any redirects. template = new_title(template) while template do local redirect = template.redirectTarget if not (redirect and is_internal_title(redirect)) then break end template = redirect end -- Disallow templates which would always hidden maintennace categories (e.g. sandboxes). if not (template and not uses_hidden_category(template)) then return end local prefixed_text, lang = template.prefixedText if template.namespace == 10 then local name = template.text -- Remove the prefix if present (e.g. "R:" or "RQ:"). local prefix, text = name:match("^(.-):(.+)") if not (prefix and prefixes[prefix]) then text = name end -- Check the initial language code, chopping off hyphenated sections until there's a match or they run out. local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]") while code do lang = get_lang(code) if lang then break end code = code:match("(.+)%-%a*$") end -- If no match and it's a list: or table: template, check if the template name ends "/CODE". if not lang and (prefix == "list" or prefix == "table") then code = text:match("%f[^/]%l[%a-]*%a$") if code then lang = get_lang(code) end end end local sortkey = template.text local parents, seen = {}, {} -- Categorize as language-specific if a language was found. if lang then add_parent(parents, seen, lang:getCanonicalName(), sortkey) end -- Also grab any language categories from the template page. for _, cat in ipairs(template.categories) do if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then local cat_lang = split_lang_label(new_title(cat).text) if cat_lang then add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey) end end end -- If none were found, categorize as general use. if #parents == 0 then add_parent(parents, seen, "general use", sortkey) end -- Only add can_be_empty if the template exists and contains checkparams. local content, can_be_empty = template:getContent() if content then -- Check for {{#invoke:checkparams|warn|...}}. -- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present. for template in require("Module:template parser").find_templates(content) do if template:get_name() == "#INVOKE:" then local args = template:get_arguments() local arg_2 = args[2] if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then can_be_empty = true break end end end end return { canonical_name = "Pages using invalid parameters when calling " .. prefixed_text, lang = lang and lang:getCode() or nil, description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.") :format(m_template_parser.getTemplateInvocationName(template)), additional = "These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.", breadcrumb = prefixed_text, parents = parents, can_be_empty = can_be_empty, hidden = true, } end) end return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} jlve0nnfin6y8f5xzsa73nsnvgqyzai 2345192 2345191 2026-04-14T10:02:37Z TheHighFighter2 42988 2345192 Scribunto text/plain local raw_categories = {} local raw_handlers = {} local m_template_parser = require("Module:template parser") local get_lang = require("Module:languages").getByCode local insert = table.insert local is_internal_title = require("Module:pages").is_internal_title local new_title = mw.title.new local split_lang_label = require("Module:category tree").split_lang_label local php_trim = require("Module:Scribunto").php_trim local uses_hidden_category = require("Module:maintenance category").uses_hidden_category ----------------------------------------------------------------------------- -- -- -- RAW CATEGORIES -- -- -- ----------------------------------------------------------------------------- raw_categories["Bảo quản Wiktionary"] = { description = "Categories containing pages that are being tracked for attention and improvement by editors.", breadcrumb = "Bảo quản", parents = "Wiktionary", } raw_categories["Mục từ dùng cấu trúc mục từ Wiktionary cũ"] = { description = "Thể loai này chứa các mục từ dùng cấu trúc mục từ Wiktionary cũ.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor"] = { description = "Thể loại này chứa các trang liên kết đến Phụ lục:Từ điển thuật ngữ không tìm thấy anchor.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Mục từ có ký tự chưa được mã hóa"] = { description = "Thể loại này chứa các mục từ có ký tự chưa được mã hóa.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có thẻ tọa độ hỏng"] = { description = "Thể loại này chứa các trang có lỗi cú pháp khi sử dụng hàm <code><nowiki>{{#coordinates}}</nowiki></code> hoặc gọi bản mẫu {{Liên kết bản mẫu|coord}}.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Không đưa lên Trang Chính"] = { description = "Thể loại này tồn tại để loại trừ mọi mục từ không nên đưa lên Trang Chính khỏi {{Liên kết bản mẫu|Mục từ mới}}, tại vì phần mở rộng [[MW:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] không hỗ trợ thể loại con.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Tài liệu bản mẫu"] = { description = "Trang này chứa các trang tài liệu bản mẫu.", breadcrumb = "Tài liệu bản mẫu", parents = "Wiktionary", } raw_categories["Bản mẫu và mô đun chưa có tài liệu"] = { description = "Thể loại này chứa các trang bản mẫu và mô đun chưa có tài liệu.", parents = { "Tài liệu bản mẫu", "Category:Bảo quản Wiktionary", } } raw_categories["Yêu cầu bỏ cấm"] = { description = "Trang này chứa các yêu cầu bỏ cấm trong không gian thảo luận thành viên.", breadcrumb = "Yêu cầu bỏ cấm", parents = { "Bảo quản Wiktionary", "Category:Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời.", breadcrumb = "Bản mẫu lỗi thời", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đang được viết"] = { description = "Trang này liệt kê các trang đang viết hoặc xây dựng. Các trang trong thể loại thường được đưa vào đây bằng cách sử dụng bản mẫu {{lkbm|đang viết}}.", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ biến tố có liên kết đỏ đến mục từ chính"] = { description = "Trang này chứa các mục từ biến tố có liên kết đỏ đến mục từ chính.", breadcrumb = "Mục từ biến tố có liên kết đỏ đến mục từ chính", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn"] = { description = "Trang này chứa các trang bản mẫu đã lỗi thời nhưng được giữ lại vì lý do bảo tồn.", breadcrumb = "Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn", parents = { "Bản mẫu lỗi thời", }, can_be_empty = true, hidden = true, } raw_categories["Chờ xóa"] = { description = "Trang này chứa các trang đã được gắn thẻ để [[Wiktionary:Quy định xóa trang#Xóa nhanh|xóa nhanh]]. Bạn có thể thêm các trang vào thể loại này bằng cách sử dụng {{LKBM|Chờ xóa}}. Hãy nhớ kiểm tra nội dung và lịch sử của trang trước khi xóa trang.", breadcrumb = "Chờ xóa", parents = { "Bảo quản Wiktionary", "Category:Trang có người đề nghị xóa", }, can_be_empty = true, hidden = true, } raw_categories["Trang có người đề nghị xóa"] = { description = "Trang này chứa các trang đề nghị xóa", breadcrumb = "Có người đề nghị xóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code>. Các mục từ sẽ được tự động đưa vào thể loại [[:Thể loại:Mục từ chất lượng kém]] để dễ quản lý và tự động đưa vào [[:Thể loại:Mục từ chất lượng kém quá 7 ngày]] đối với các mục từ đã đặt bảng chất lượng kém quá 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Mục từ chất lượng kém quá 7 ngày"] = { description = "Trang này chứa các mục từ được gắn nhãn <code><nowiki>{{subst:chất lượng kém}}</nowiki></code> đã hơn 7 ngày.", additional = "'''Gửi bảo quản viên''': Xin hãy kiểm tra lại lịch sử trang xem có sửa đổi nào mang tính bổ sung kể từ khi bị đánh dấu hay không trước khi xóa. Hãy luôn nhớ rằng, xóa đi một bài thì rất nhanh, nhưng để có được một mục từ tốt trên Wiktionary là điều rất khó.", breadcrumb = "Mục từ chất lượng kém quá 7 ngày", parents = { "Mục từ chất lượng kém", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Yêu cầu sửa đổi trang bị khóa"] = { description = "Trang này chứa các trang có lời yêu cầu {{Liên kết bản mẫu|Sửa trang khóa}} chưa được giải quyết.", breadcrumb = "Yêu cầu sửa đổi trang bị khóa", parents = { "Bảo quản Wiktionary", "Category:Yêu cầu", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại theo dõi"] = { description = "Các thể loại con của thể loại này là những thể loại theo dõi khác. Để thêm một thể loại vào thể loại này, gắn thẻ nó với {{lkbm|Thể loại theo dõi}}. Để có một danh sách của các thể loại theo dõi được tự động tạo bởi phần mềm wiki, hãy xem [[Đặc biệt:Thể loại theo dõi]].", breadcrumb = "Thể loại theo dõi", parents = { "Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có sử dụng tập tin không tồn tại"] = { description = "Thể loại này chứa các trang có sử dụng tập tin không tồn tại.", breadcrumb = "Trang có sử dụng tập tin không tồn tại", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép"] = { description = "Thể loại này chứa các trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép.", breadcrumb = "Trang có độ sâu bung bản mẫu vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao"] = { description = "Thể loại này được phần mềm MediaWiki xây dựng tự động. (Nó được đặt tên theo nội dung của [[MediaWiki:Expensive-parserfunction-category]].) Nó chứa các trang [[w:en:Wikipedia:Template limits#Expensive parser function calls|gọi hàm cú pháp cần mức độ xử lý cao]] quá nhiều lần. Vào ngày 14 tháng 10 năm 2010, các hàm cần mức độ xử lý cao là <code>#ifexist</code>, <code><nowiki>{{PAGESINCATEGORY}}</nowiki></code>, và <code><nowiki>{{PAGESIZE}}</nowiki></code>. Các trang bên dưới cần được sửa chữa để giảm số lần gọi các hàm này.", breadcrumb = "Trang có quá nhiều lời gọi hàm cú pháp cần mức độ xử lý cao", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang đưa đối số thừa vào bản mẫu"] = { description = "Thể loại này bao gồm các trang được phần mềm phát hiện nhập giá trị nhiều lần cho cùng một tham số trong lúc gọi bản mẫu, chẳng hạn <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> và <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>. Nếu một tham số được nhập nhiều lần, chỉ giá trị cuối cùng sẽ được phần mềm sử dụng.", breadcrumb = "Trang đưa đối số thừa vào bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Thể loại đổi hướng không trống"] = { description = "Thể loại này chứa các trang đổi hướng không trống.", breadcrumb = "Thể loại đổi hướng không trống", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang có các đối số formatnum không phải số"] = { description = "Thể loại này chứa các trang có các đối số formatnum không phải số.", breadcrumb = "Trang có các đối số formatnum không phải số", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có chứa tham số bản mẫu bị loại bỏ"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có chứa tham số bản mẫu bị loại bỏ", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép"] = { description = "Trang này sẽ vượt quá <code>$wgMaxArticleSize</code> nếu bung một tham số bản mẫu (tức định danh có mỗi bên ba dấu ngoặc móc, thí dụ <code><nowiki>{{{Thí dụ}}}</nowiki></code>). Để biết danh sách các thể loại theo dõi do MediaWiki điền, xem [[Special:TrackingCategories]].", breadcrumb = "Trang có kích thước bản mẫu nhúng vào vượt quá giới hạn cho phép", parents = { "Thể loại theo dõi", }, can_be_empty = true, hidden = true, } raw_categories["Trang có tên hiển thị được bỏ qua"] = { description = "Thể loại này dành cho các trang có tên hiển thị được bỏ qua.", breadcrumb = "Trang có tên hiển thị được bỏ qua", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang dùng thuộc tính enclose cũ"] = { description = "Thể loại này dành cho các trang dùng thuộc tính enclose cũ.", breadcrumb = "Trang dùng thuộc tính enclose cũ", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kết xuất khuông nhạc"] = { description = "Thể loại này dành cho các trang có lỗi kết xuất khuông nhạc.", breadcrumb = "Trang có lỗi kết xuất khuông nhạc", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi bảng kiểu bản mẫu"] = { description = "Thể loại này dành cho các trang có lỗi bảng kiểu bản mẫu.", breadcrumb = "Trang có lỗi bảng kiểu bản mẫu", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary" }, can_be_empty = true, hidden = true, } raw_categories["Bảng dịch không chú thích ngữ nghĩa"] = { description = "Thể loại này chứa các trang có bảng dịch không chú thích ngữ nghĩa.", breadcrumb = "Bảng dịch không chú thích ngữ nghĩa", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang bị khóa"] = { description = "Thể loại này tổ chức các thể loại con cụ thể hơn có chứa '''[[Wiktionary:Quy định khóa trang|các trang bị khóa]]'''. Để biết danh sách động và sắp xếp tất cả các trang được khóa, hãy xem [[Special:ProtectedPages]].", breadcrumb = "Trang bị khóa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị hạn chế sửa đổi"] = { description = "Thể loại này chứa các trang bản mẫu bị hạn chế sửa đổi.", breadcrumb = "Bản mẫu bị hạn chế sửa đổi", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Bản mẫu bị khóa"] = { description = "Thể loại này có chứa các [[Trợ giúp:Bản mẫu|bản mẫu]] đã được [[Wiktionary:Quy định khóa trang|khóa hoàn toàn]]. Điều này thường thực hiện để ngăn ngừa [[Wiktionary:Phá hoại|phá hoại]] với những bản mẫu được dùng ở rất nhiều trang hoặc ở những trang dễ thấy như [[Trang Chính]] (còn gọi là bản mẫu có nguy cơ cao), vì phá hoại những bản mẫu như vậy sẽ gây thay đổi lớn dễ nhận thấy. Chỉ [[Wiktionary:Bảo quản viên|bảo quản viên]] mới có thể sửa bản mẫu bị khóa hoàn toàn.", additional = "Để thêm một bản mẫu vào thể loại này, hãy thêm <tt>{{[[Bản mẫu:pp-template|pp-template]]}}</tt> vào bản mẫu. Hãy cẩn thận và đặt nó vào mục <tt><nowiki><noinclude></nowiki></tt>, để các trang sử dụng bản mẫu không bị thêm vào thể loại. Điều này chỉ có tác dụng nếu trang bị khóa thật sự - chỉ thêm pp-template vào bản mẫu cũng không phải là khóa trang.", breadcrumb = "Bản mẫu bị khóa", parents = "Trang bị khóa", can_be_empty = true, hidden = true, } raw_categories["Thể loại trống"] = { topright = "{{shortcut|CAT:EC}}", description = "Categories with no members.", additional = [=[Categories are placed here by [[Module:category tree]] when they contain no pages or subcategories. Empty categories are not necessarily a problem, but they can clutter up their parent categories, or become orphaned if the structure of the category tree changes. This category therefore helps track down such cases, and allows them to be cleaned up. Because of the way the wiki software works, categories will appear here for a while afterwards if they were empty at first but had entries added to them later. This can be fixed by simply performing a "null edit" on the category page: edit the page, and save without making any changes. (Alternatively, use the "null edit" option provided by the "purge tab" [[Special:Preferences#mw-prefsection-gadgets|gadget]].) This can be avoided by adding entries to categories before creating them. It also helps to create categories from the "bottom up": start at the lowest level that has entries, then create its parent categories, then the parent categories of that, and so on.]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có tên thể loại không đúng"] = { description = "Categories with names that do not match the expected form within the category tree.", additional = [=[This usually happens when additional parameters have been given to {{lkbm|auto cat}} that don't match the name of the category, or when there is a problem with capitalization or spacing in the category name. ==Xem thêm== * [[:Thể loại:Thể loại chưa được xác định trên cây thể loại Wiktionary]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại chưa được xác định trên cây thể loại Wiktionary"] = { description = "Thể loại có sử dụng {{lkbm|auto cat}}, nhưng không có nhãn ở dữ liệu mô đun cây thể loại.", additional = [=[See the error box displayed on any of these categories for more info. ==Xem thêm== * [[:Thể loại:Trang có tên thể loại không đúng]]]=], parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại ẩn"] = { description = "Trang này liệt kê các thể loại con của một thể loại ẩn có thể bị ẩn hoặc có thể không bị ẩn, tùy thuộc vào bản mẫu hoặc từ ma thuật <code>[[mw:Help:Magic words#HIDDENCAT|<nowiki>__HIDDENCAT__</nowiki>]]</code> trong thể loại con hoặc trong thể loại mẹ.", additional = "Các thể loại xuất hiện ở đây chỉ nên là những thể loại chỉ dùng để bảo trì, tức là những thể loại phản ánh trạng thái hiện tại của một trang, chứ không phải dùng để phân loại trang. Thể loại ẩn không được liệt kê tại trang. Nếu bạn đang lo lắng tại sao thể loại bạn đã thêm vào bài viết không hiện ra, hãy kiểm tra xem thể loại đó có ẩn hay không. Xem trước trang sẽ liệt kê những thể loại ẩn tại cuối trang, dưới danh sách các bản mẫu sử dụng. Thể loại ẩn không ẩn tại trang thể loại. Bạn có thể tắt tính năng này đi trong giao diện của bạn bằng cách chọn hộp '''Hiển thị thể loại ẩn''' tại [[Đặc biệt:Tùy chọn#mw-prefsection-rendering|tùy chọn cá nhân]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại quá tải"] = { description = "Thể loại có hơn 1 triệu trang.", additional = "Such categories have the [[mw:Extension:DynamicPageList (Wikimedia)|DynamicPageList]] extension disabled, which is normally used to list the newest and oldest pages in a category. This is because categories above that size load very slowly when it is enabled, and in some cases become inaccessible due to timing-out.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang được ghi chỉ mục"] = { description = "Trang này có từ thần chú <code>[[mw:Help:Magic words#INDEX|<nowiki>__INDEX__</nowiki>]]</code> và nằm trong một không gian tên cho phép từ thần chú này, nên được các robot đánh chỉ mục, trong khi bình thường nó không được đánh chỉ mục.", breadcrumb = "Trang được ghi chỉ mục", parents = { "Thể loại theo dõi", "Category:Bảo quản Wiktionary", }, can_be_empty = true, hidden = true, } raw_categories["Trang không hiển thị trong bộ máy tìm kiếm"] = { description = "Thể loại này theo dõi các trang có sử dụng thẻ [[mw:Help:Magic words|chuyển đổi hành vi]] <code>[[mw:Help:Magic words#NOINDEX|<nowiki>__NOINDEX__</nowiki>]]</code>, để cho chúng không hiển thị trên các bộ máy tìm kiếm như Google. Các trang sẽ được vào thể loại này một cách tự động bởi phần mềm MediaWiki. Tên thể loại này được định nghĩa trong [[MediaWiki:Noindex-category]]. Để biết danh sách các thể loại theo dõi do MediaWiki điền, hãy xem [[Special:TrackingCategories]].", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu lỗi thời"] = { description = "This category contains entries, reconstruction pages, appendixes, sign glosses and citations pages using deprecated templates—templates that have failed our deletion process, and/or that have been replaced by superior templates.", additional = [=[This category is populated by {{lkbm|deprecated code}} and {{lkbm|deprecated lang param usage}}. The former is wrapped around templates that have been completely deprecated and remove from mainspace (particularly those in [[:Thể loại:Bản mẫu lỗi thời được giữ lại vì lý do bảo tồn]]). The latter is wrapped around non-deprecated templates that accept the deprecated {{para|lang}} parameter; any use of that parameter will place the page in [[:Thể loại:Trang dùng bản mẫu lỗi thời]]. Ideally, this category will be empty. Any pages in this category, particularly those in the mainspace, need to have their deprecated template usages corrected. ]=], breadcrumb = "Bản mẫu lỗi thời", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng bản mẫu con"] = { description = "Pages which use at least one of the lite templates.", additional = "Xem thêm [[:Thể loại:Bản mẫu Lua-free]].", breadcrumb = "Using lite templates", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng thừa"] = { description = "Pages where the inline etymon term exists and the ID matches the one on the etymon page.", additional = "These should be reviewed and simplified to avoid redundant specification.", breadcrumb = "Nguyên từ nội dòng thừa", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ thiếu ID"] = { description = "Trang sử dụng {{tl|etymon}} bị thiếu ID, đồng thời chỉ có một bản mẫu nguyên từ cho ngôn ngữ tại trang được liên kết.", additional = "Cần cập nhật những thông tin này để chỉ định rõ ID cụ thể, nhằm tránh sự mơ hồ nếu sau này có thêm nguyên từ khác được bổ sung.", breadcrumb = "Nguyên từ thiếu ID", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có nguyên từ nội dòng liên kết đỏ"] = { description = "Trang sử dụng {{tl|etymon}} bên trong một {{tl|etymon}} khác và có liên kết đỏ đến mục từ đích.", additional = "Nên kiểm tra lại sau khi các mục từ đích được tạo.", breadcrumb = "Nguyên từ nội dòng liên kết đỏ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with tab characters"] = { description = "Pages which contain a tab character in their wikitext.", additional = "These should either be removed or replaced with spaces, because they go against [[WT:NORM]].", breadcrumb = "Tab characters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không đúng thứ tự"] = { description = "Trang có đề mục ngôn ngữ không đúng thứ tự.", additional = "Đề mục ngôn ngữ cấp 2 nên được xếp theo bảng chữ cái (từ A đến Z), riêng đề mục ngôn ngữ Đa ngữ và tiếng Việt được xếp đầu.", breadcrumb = "Đề mục ngôn ngữ không đúng thứ tự", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có đề mục ngôn ngữ không chuẩn"] = { description = "Pages which contain a level 2 heading which does not match any language's canonical name.", additional = "The level 2 language heading for each language should always be that language's canonical name.", breadcrumb = "Đề mục ngôn ngữ không chuẩn", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with unwanted L1 headings"] = { description = "Pages which contain an unwanted level 1 heading.", additional = "Level 1 headings are not used in Wiktionary content pages, and only occur due to user error or vandalism.", breadcrumb = "Unwanted L1 headings", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with raw triple-brace template parameters"] = { description = "Pages which contain raw template parameters in the form of triple braces.", additional = "Triple-brace template parameters (e.g. {{param|param}}) are intended for use in templates, as they are substituted with the relevant template argument when the page is transcluded. Although they can theoretically be used on any page, there are currently no legitimate uses for them in content namespaces.\n\nTemplate parameters usually occur due to typos, or when {{tl|subst:}} has been used with a template that isn't supposed to be substed.", breadcrumb = "Raw template parameters", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DEFAULTSORT"] = { topright = "{{shortcut|CAT:DEFAULTSORT}}", description = "Pages on which the {{lkbm|DEFAULTSORT:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DEFAULTSORT:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DISPLAYTITLE]].", breadcrumb = "Xung đột với DEFAULTSORT", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có xung đột với DISPLAYTITLE"] = { topright = "{{shortcut|CAT:DISPLAYTITLE}}", description = "Pages on which the {{lkbm|DISPLAYTITLE:}} magic word has been used multiple times with different values.", additional = "In some (but not all) cases, this causes a warning to display on the page. In the vast majority of instances, an explicit use of {{lkbm|DISPLAYTITLE:}} in wikitext should be <u>removed</u>.This is because the {{lkbm|head}} template handles it automatically. The only instances where it should be used in wikitext is outside of entries (i.e. outside of mainspace or the Reconstruction namespace)." .. "\n\nXem thêm [[:Thể loại:Trang có xung đột với DEFAULTSORT]].", breadcrumb = "Xung đột với DISPLAYTITLE", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có mã sắp xếp thô"] = { description = "Pages on which a sortkey has been used with a raw category.", additional = "For example, {{code|[[<nowiki/>Category:IPA symbols|B]]}}." .. "\n\nThese are a priority to replace with category templates, since they are hard-coded and override the {{tl|DEFAULTSORT:}} value for the page. This causes problems if there are any changes to the sorting scheme for the category, because there is no way of changing them centrally.\n\n" .. "By comparison, raw categories which have no sortkey are less of a problem, because they will use the {{tl|DEFAULTSORT:}} value; this can be centrally controlled and is designed to be language-neutral, so avoids the issue of different editors using multiple different sorting schemes for the same category. However, they should still be replaced with category templates, since there may be additional language-specific sorting rules which cannot otherwise be applied.", breadcrumb = "Raw sortkeys", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có lỗi kịch bản"] = { topright = "", description = "Các trang trong thể loại này có lỗi kịch bản [[Wiktionary:Scribunto|Lua]].", breadcrumb = "Lỗi kịch bản", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Pages with ParserFunction errors"] = { topright = "{{shortcut|CAT:PFE}}", description = "Pages that have errors in a [[mw:Help:Extension:ParserFunctions|ParserFunction]] magic word.", additional = "Examples of these magic words are {{tl|#expr:}} and {{tl|#time:}}. If entries are listed here for more than a day or two, the error should probably be reported at [[Wiktionary:GP|the Grease Pit]]." .. "\n\nBecause the software does not immediately update pages when a change occurs in a template or module, errors listed here may have already been fixed. Therefore, please ensure that the error is still present before reporting problems. You can do this by performing a \"[[meta:Help:Dummy_edit#Null_edit|null edit]]\" (editing the page and saving without making changes). If the error goes away then, it has already been fixed." .. "\n\n<u>You can use [https://en.wiktionary.org/wiki/Special:ApiSandbox#action=purge&format=json&forcelinkupdate=1&generator=categorymembers&utf8=1&formatversion=2&gcmtitle=Category%3APages%20with%20ParserFunction%20errors&gcmlimit=20 this link] and press \"Make request\" to purge the cache of up to 20 pages from this category in one click.</u> This number can be adjusted up to 5,000, but anything above 30–100 will likely cause time-outs (depending on the size of the pages)." .. "\n\nThe contents of this category is controlled by [[Template:maintenance category]]. It is currently set to place talk pages, user pages{{,}} and user sandbox modules and templates in a separate category." .. "\n\nSee also [[:Category:Pages with module errors]].", breadcrumb = "ParserFunction errors", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi bản mẫu với tham số không hợp lệ"] = { description = "Pages that use unrecognized parameters when calling a template.", parents = "Bảo quản Wiktionary", can_be_empty = true, } raw_categories["Trang có sử dụng catfix"] = { description = "Pages that use the <code>[[MediaWiki:Gadget-catfix.js|catfix]]</code> gadget.", additional = "This processes links to entries in language-specific categories by adding language-specific formatting, and points them to the language's section of the entry.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang có gọi Bản mẫu:minitoc"] = { description = "Pages that display a mini table of contents by calling {{lkbm|minitoc}}.", additional = "This is is used on very large pages with many entries, to assist with navigation.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thể loại gọi Bản mẫu:auto cat"] = { description = "Categories that have been placed in another category by calling {{lkbm|auto cat}}.", additional = "This is the preferred way for categories to be subcategorized. The chief reason for this category is to facilitate the finding of categories which are not using {{lkbm|auto cat}} through the use of negative searches (e.g. qualifying a search with {{code|-incategory:\"{{PAGENAME}}\"}}).", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Categories with categories using raw markup"] = { description = "Categories that have been placed in another category using raw wiki markup (e.g. {{cl|Wiktionary}}). They should be added to the [[Module:category tree|category tree]] data instead.", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Trang dùng thẻ source cũ"] = { description = "Pages that use the [[mw:Extension:SyntaxHighlight|SyntaxHighlight]] extension with legacy {{wt|source}} tags instead of {{wt|syntaxhighlight}}.", breadcrumb = "Thẻ source cũ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ"] = { description = "Thiếu mã ngôn ngữ", parents = "Bảo quản Wiktionary", can_be_empty = true, hidden = true, } raw_categories["Thiếu mã ngôn ngữ/IPA"] = { description = "Thiếu mã ngôn ngữ/IPA", parents = "Thiếu mã ngôn ngữ", can_be_empty = true, hidden = true, } insert(raw_handlers, function(data) local template_type = data.category:match("^Pages using invalid parameters when calling (.+) templates$") if not template_type then return end local parents = {{ name = "Pages using invalid parameters when calling templates", sort = template_type == "general use" and "*" or template_type, }} local lang = require("Module:languages").getByCanonicalName(template_type, nil, true) if lang then insert(parents, {name = "Bảo trì mục từ", is_label = true, lang = lang:getCode()}) end return { lang = lang and lang:getCode() or nil, description = "Pages that use unrecognized parameters when calling " .. template_type .. " templates.", parents = parents, breadcrumb = template_type, } end) do local prefixes = require("Module:table").listToSet{"list", "P", "R", "RQ", "table", "U"} local function add_parent(parents, seen, cat_type, sortkey) if seen[cat_type] then return end insert(parents, { name = ("Pages using invalid parameters when calling %s templates"):format(cat_type), sort = sortkey, }) seen[cat_type] = true end insert(raw_handlers, function(data) local template = data.category:match("^Pages using invalid parameters when calling (.+)$") if not template then return end -- Resolve any redirects. template = new_title(template) while template do local redirect = template.redirectTarget if not (redirect and is_internal_title(redirect)) then break end template = redirect end -- Disallow templates which would always hidden maintennace categories (e.g. sandboxes). if not (template and not uses_hidden_category(template)) then return end local prefixed_text, lang = template.prefixedText if template.namespace == 10 then local name = template.text -- Remove the prefix if present (e.g. "R:" or "RQ:"). local prefix, text = name:match("^(.-):(.+)") if not (prefix and prefixes[prefix]) then text = name end -- Check the initial language code, chopping off hyphenated sections until there's a match or they run out. local code = mw.ustring.match(text, "^[a-z][a-zA-Z-]*[a-zA-Z]%f[^%w]") while code do lang = get_lang(code) if lang then break end code = code:match("(.+)%-%a*$") end -- If no match and it's a list: or table: template, check if the template name ends "/CODE". if not lang and (prefix == "list" or prefix == "table") then code = text:match("%f[^/]%l[%a-]*%a$") if code then lang = get_lang(code) end end end local sortkey = template.text local parents, seen = {}, {} -- Categorize as language-specific if a language was found. if lang then add_parent(parents, seen, lang:getCanonicalName(), sortkey) end -- Also grab any language categories from the template page. for _, cat in ipairs(template.categories) do if cat:sub(-10) == " templates" or cat:sub(-13) == " subtemplates" then local cat_lang = split_lang_label(new_title(cat).text) if cat_lang then add_parent(parents, seen, cat_lang:getCanonicalName(), sortkey) end end end -- If none were found, categorize as general use. if #parents == 0 then add_parent(parents, seen, "general use", sortkey) end -- Only add can_be_empty if the template exists and contains checkparams. local content, can_be_empty = template:getContent() if content then -- Check for {{#invoke:checkparams|warn|...}}. -- args[1] is the module and args[2] is the function name, so #INVOKE: will throw an error if either is not present. for template in require("Module:template parser").find_templates(content) do if template:get_name() == "#INVOKE:" then local args = template:get_arguments() local arg_2 = args[2] if arg_2 and php_trim(args[1]) == "checkparams" and php_trim(arg_2) == "warn" then can_be_empty = true break end end end end return { canonical_name = "Pages using invalid parameters when calling " .. prefixed_text, lang = lang and lang:getCode() or nil, description = ("Pages that use unrecognized parameters when calling {{tl|%s}}.") :format(m_template_parser.getTemplateInvocationName(template)), additional = "These template calls should be reviewed and the invalid parameter(s) should be corrected or removed.", breadcrumb = prefixed_text, parents = parents, can_be_empty = can_be_empty, hidden = true, } end) end return {RAW_CATEGORIES = raw_categories, RAW_HANDLERS = raw_handlers} mo9k3ot3l9bytdopsdc29h0ttw6zufo Mô đun:category tree/topic/Society 828 343897 2345106 2322308 2026-04-14T03:03:36Z Hiyuune 50834 2345106 Scribunto text/plain local labels = {} local unpack = unpack or table.unpack -- Lua 5.2 compatibility labels["Xã hội"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tất cả chủ đề"}, } labels["academic degrees"] = { type = "name", description = "default", parents = {"education"}, } labels["academic grades"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Giáo dục"}, } labels["Kế toán"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tài chính"}, } labels["administrative divisions"] = { type = "set", description = "default", parents = {"Chính phủ"}, } labels["advertising"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"business", "marketing"}, } labels["alt-right"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the [[alt-right]], a loosely connected [[far-right]], [[white nationalist]] movement", parents = {"conservatism", "fascism", "ideologies", "white supremacist ideology"}, } labels["anarchism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Ý thức hệ", "chủ nghĩa cộng sản cánh tả"}, } labels["chủ nghĩa cộng sản cánh tả"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Ý thức hệ"}, } labels["anti-Semitism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of discrimination"}, } labels["awards"] = { type = "name,type", description = "default", parents = {"society"}, } labels["banking"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tài chính", "industries"}, } labels["bars"] = { type = "type", description = "default", parents = {"businesses", "drinking"}, } labels["Basque nationalism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Basque Country, Spain", "nationalism"}, } labels["bedding"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Chỗ ở"}, } labels["Rèn"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Gia công cơ khí"}, } labels["bond market"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"Tài chính"}, } labels["bookbinding"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xuất bản"}, } labels["book sizes"] = { type = "name", description = "default", parents = {"bookbinding"}, } labels["Brexit"] = { type = "chủ đề thuộc nhóm liên quan", description = "={{w|Brexit}}, i.e. the withdrawal of the {{w|United Kingdom}} from the {{w|European Union}}", parents = {"nationalism", "European politics", "UK politics"}, } labels["burial"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society", "death"}, } labels["Kinh doanh"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh tế học", "Xã hội"}, } labels["Chứng khoán"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh tế học"}, } labels["Ngân hàng"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh tế học"}, } labels["businesses"] = { type = "type", description = "=[[business]]es (specific commercial enterprises or establishments)", parents = {"business"}, } labels["capitalism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh tế học", "ideologies"}, } labels["chairs"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"furniture", "sitting"}, } labels["child abuse"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crime", "children", "violence"}, } labels["Chinese restaurants"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"restaurants", "China"}, } labels["cleaning"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Chỗ ở"}, } labels["coins"] = { type = "set,chủ đề thuộc nhóm liên quan", description = "default", parents = {"money"}, } labels["conservatism"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[conservatism]] or [[traditionalist]] beliefs", parents = {"ideologies"}, } labels["commerce"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"business"}, } labels["commercial documents"] = { type = "set", description = "default", parents = {"commerce"}, } labels["commercial law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law", "commerce"}, } labels["competition law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["antitrust law"] = { description = "default", parents = {"competition law"}, } labels["law of unfair competition"] = { description = "default with the", parents = {"competition law"}, } labels["Chủ nghĩa cộng sản"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Ý thức hệ", "Chủ nghĩa xã hội", "chủ nghĩa cộng sản cánh tả"}, } labels["constitutional law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["copyright"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"intellectual property"}, } labels["copyright licenses"] = { type = "name", description = "=[[license]]s of [[copyright]]", parents = {"copyright"}, } labels["corporate law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["Tham nhũng"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tội phạm", "Chính trị"}, } labels["Thủ công"] = { type = "chủ đề thuộc nhóm loại hình", description = "default", parents = {"Xã hội"}, } labels["Tội phạm"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xã hội", "Luật hình sự"}, } labels["Tổ chức tội phạm"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tội phạm"}, } labels["Tổ chức khủng bố"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tổ chức tội phạm","Khủng bố"}, } labels["Khủng bố"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Chính trị"}, } labels["crime prevention"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"public safety", "crime"}, } labels["Luật hình sự"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Luật pháp"}, } labels["crochet"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts"}, } labels["cryptocurrency"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"currency", "cryptography", "technology"}, } labels["Đơn vị tiền tệ"] = { type = "chủ đề thuộc nhóm tập hợp", description = "default", parents = {"Tiền", "Tiền tệ"}, } labels["Tiền tệ"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tiền"}, } labels["dairy farming"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"agriculture", "industries"}, } labels["democracy"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of government"}, } labels["Ngoại giao"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xã hội"}, } labels["discrimination"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society"}, } labels["drug trafficking"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crime", "drugs"}, } labels["Giáo dục"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xã hội"}, } labels["emergency services"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"public safety"}, } labels["employment"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"business", "work"}, } labels["espionage"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"security", "deception", "secrecy"}, } labels["evil"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ethics", "religion"}, } labels["fame"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society", "knowledge"}, } labels["fascism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies"}, } labels["farriery"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Rèn", "horses"}, } labels["feminism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"gender", "female", "ideologies", "society", "sociology"}, } labels["feudalism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of government"}, } labels["Tài chính"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh doanh"}, } labels["firefighting"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"emergency services", "fire"}, } labels["forms of discrimination"] = { type = "type", description = "{{{langname}}} terms for [[form]]s of [[discrimination]].", additional = "{{also|Category:{{{langcode}}}:Biases|Category:{{{langcode}}}:Conspiracy theories|Category:{{{langcode}}}:Ideologies}}", parents = {"discrimination"}, } labels["forms of government"] = { type = "type", description = "{{{langname}}} terms for [[form]]s of [[government]].", parents = {"Chính phủ"}, } labels["freedom"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society"}, } labels["freedom of speech"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"freedom", "law"}, } labels["freemasonry"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"organizations"}, } labels["funeral"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society", "death", "industries"}, } labels["furniture"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Chỗ ở"}, commonscat = true, wpcat = true, } labels["gender-critical feminism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"feminism", "gender", "transphobia"}, } labels["glassblowing"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts", "glass"}, } labels["good"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ethics", "religion"}, } labels["Chính phủ"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xã hội", "Chính trị"}, } labels["hairdressing"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"hair", "crafts"}, } labels["high society"] = { type = "chủ đề thuộc nhóm liên quan", description = "=royalty and nobility", parents = {"society"}, } labels["Hindutva"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[Hindutva]] or {{w|Hindu nationalism}}", parents = {"conservatism", "Hinduism", "ideologies", "Indian politics", "nationalism", "theocracy"}, } labels["historical currencies"] = { type = "set", description = "default", parents = {"currencies"}, } labels["Chỗ ở"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"Xã hội"}, } labels["hospitality"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"business"}, } labels["host industry"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"hospitality", "businesses"}, } labels["hotels"] = { type = "type", description = "default", parents = {"businesses", "tourism", "hospitality"}, } labels["household"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Chỗ ở"}, } labels["housing"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Chỗ ở", "buildings"}, } labels["human resources"] = { type = "chủ đề thuộc nhóm liên quan", description = "default no singularize", parents = {"business", "sociology"}, } labels["Ý thức hệ"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xã hội", "Chính trị"}, } labels["imperialism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies"}, } labels["import/export"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[import]]s and [[export]]s", parents = {"trading", "transport"}, } labels["Stock symbols for companies"] = { type = "chủ đề thuộc nhóm liên quan", description = "=default", parents = {"trading"}, } labels["incel community"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the [[incel]] community", parents = {"masculism", "sex"}, } labels["incoterms"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[Incoterm]]s", parents = {"business", "import/export"}, } labels["Công nghiệp"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh doanh"}, } labels["Bảo hiểm"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tài chính", "Công nghiệp"}, } labels["intellectual property"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[intellectual property]] [[law]]", parents = {"law"}, } labels["international law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["Quan hệ quốc tế"] = { type = "chủ đề thuộc nhóm liên quan", description = "default wikify", parents = {"Chính trị", "Trái Đất"}, } labels["Islamic finance"] = { type = "chủ đề thuộc nhóm liên quan", description = "default wikify", parents = {"Tài chính", "banking", "Islam"}, } labels["Islamic law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default wikify", parents = {"Islam", "law"}, } labels["Islamism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "conservatism", "Islam", "theocracy"}, } labels["Juche"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"North Korea", "communism", "nationalism"}, } labels["Công lý"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Xã hội"}, } labels["Nhân quyền"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Công lý"}, } labels["Kentucky Fried Chicken"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the Kentucky Fried Chicken chain of fast-food restaurants", parents = {"restaurants"}, } labels["knitting"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts"}, } labels["Ku Klux Klan"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"organizations", "white supremacist ideology"}, } labels["kyabakura industry"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"hospitality", "businesses"}, } labels["labour"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[labour]] or the [[w:labour movement|labour movement]]", parents = {"work", "chủ nghĩa cộng sản cánh tả"}, } labels["laundry"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"cleaning"}, } labels["Luật pháp"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the science and practice of [[law]]", parents = {"Công lý"}, } labels["Luật pháp Việt Nam"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Luật pháp"}, } labels["law of obligations"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the no singularize", parents = {"law"}, } labels["family law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["inheritance law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["law enforcement"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crime prevention", "emergency services", "law"}, } labels["leatherworking"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts"}, } labels["Chính trị cánh tả"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Ý thức hệ"}, } labels["liberalism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies"}, } labels["libertarianism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies"}, } labels["logistics"] = { type = "chủ đề thuộc nhóm liên quan", description = "default no singularize", parents = {"operations"}, } labels["management"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"business"}, } labels["Maoism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "communism", "Marxism"}, } labels["marketing"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"business"}, } labels["Marxism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "Chủ nghĩa xã hội"}, } labels["masculism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "male"}, } labels["Gia công cơ khí"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Thủ công", "Luyện kim"}, } labels["McDonald's"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the McDonald's chain of fast-food restaurants", parents = {"restaurants"}, } labels["micronationalism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of government", "ideologies"}, } labels["Quân sự"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"Xã hội"}, } labels["military units"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"military", "occupations"}, } labels["mining"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"industries"}, } labels["monarchism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "monarchy"}, } labels["monarchy"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of government", "high society"}, } labels["Tiền"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh doanh"}, } labels["museums"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"businesses", "tourism", "art"}, } labels["nationalism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies"}, } labels["Nazism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"fascism", "white supremacist ideology", "ideologies"}, } labels["neo-Nazism"] = { -- Adjacent to Nazism, but not quite the same thing. type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Nazism", "fascism", "white supremacist ideology", "ideologies"}, } labels["Nobel Prize"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"awards"}, } labels["nuclear warfare"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"war", "weapons"}, } labels["Objectivism"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the political philosophy of {{w|Objectivism}} developed by {{w|Ayn Rand}}", parents = {"ideologies", "libertarianism"}, } labels["offices"] = { type = "type", description = "=offices, in the sense \"position of responsibility of some authority within an organisation\"", parents = {"Chính phủ"}, } labels["oil industry"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"industries", "petroleum"}, } labels["operations"] = { type = "chủ đề thuộc nhóm liên quan", description = "{{{langname}}} terms covering all operational matters in [[production]], [[logistics]], or [[services]].", parents = {"management", "systems theory"}, } labels["Tổ chức"] = { type = "chủ đề thuộc nhóm tên gọi", description = "default", parents = {"Xã hội"}, } labels["papermaking"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts", "industries"}, } labels["patent law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["peace"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"security"}, } labels["pensions"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Tài chính"}, } labels["philanthropy"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society"}, } labels["Philmont Scout Ranch"] = { type = "chủ đề thuộc nhóm liên quan", description = "={{w|Philmont Scout Ranch}}, a Scouting ranch in the United States", parents = {"Scouting"}, } labels["piracy"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crime", "nautical"}, } labels["Chính trị"] = { type = "chủ đề thuộc nhóm liên quan", description = "default no singularize", parents = {"Xã hội"}, } labels["poverty"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"wealth"}, } for _, country_demonym in ipairs { {"Argentina", "Argentine"}, {"Australia", "Australian"}, {"Bangladesh", "Bangladeshi"}, {"Brazil", "Brazilian"}, {"Canada", "Canadian"}, {"Chile", "Chilean"}, {"China", "Chinese"}, {"Europe", "European"}, {"European Union", "EU", "the European Union", "European politics"}, {"France", "French", nil, "European politics"}, {"Germany", "German", nil, "European politics"}, {"Hong Kong", "Hong Kong"}, {"Hungary", "Hungarian", nil, "European politics"}, {"India", "Indian"}, {"Indonesia", "Indonesian"}, {"Ireland", "Irish", nil, "European politics"}, {"Japan", "Japanese"}, {"Malaysia", "Malaysian"}, {"Mexico", "Mexican"}, {"New Zealand", "New Zealand"}, {"Nigeria", "Nigeria"}, {"Pakistan", "Pakistani"}, {"Palestine", "Palestinian"}, {"Peru", "Peruvian"}, {"Philippines", "Philippine", "the Philippines"}, {"Portugal", "Portuguese", nil, "European politics"}, {"Russia", "Russian"}, {"Singapore", "Singaporean"}, {"South Africa", "South African"}, {"South Korea", "South Korean"}, {"Spain", "Spanish", nil, "European politics"}, {"Switzerland", "Swiss", nil, "European politics"}, {"Taiwan", "Taiwanese"}, {"United Kingdom", "UK", "the United Kingdom"}, {"United States", "US", "the United States"}, {"Venezuela", "Venezuelan"}, } do local country, demonym, full_country, parent = unpack(country_demonym) labels["Chính trị " .. demonym] = { type = "chủ đề thuộc nhóm liên quan", description = ("={{w|Chính trị %s}}"):format(full_country or country), parents = {parent or "Chính trị", country}, } end labels["In ấn"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Công nghiệp"}, } labels["prison"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law enforcement", "buildings"}, } labels["procedural law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["property law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law"}, } labels["public administration"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the field of [[public]] [[administration]]", parents = {"government"}, } labels["public safety"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the field of [[public]] [[safety]]", parents = {"public administration", "security"}, } labels["Xuất bản"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Công nghiệp", "Truyền thông đại chúng"}, } labels["QAnon"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the [[QAnon]] movement", parents = {"alt-right", "conspiracy theories", "Donald Trump", "pedophilia"}, } labels["racism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of discrimination"}, } labels["hiếp dâm"] = { type = "chủ đề thuộc nhóm liên quan", description = "=mảng [[bạo hành tình dục]]", parents = {"tình dục", "tội phạm", "bạo lực"}, } labels["real estate"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"industries", "housing"}, } labels["restaurants"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[restaurant]]s (including [[pub]]s, [[café]]s etc.)", parents = {"businesses", "food and drink"}, } labels["royal residences"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"housing", "monarchy"}, } labels["Trường học"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Giáo dục", "Tòa nhà"}, } -- Note: this is the usual term, not "Scottish law". labels["Scots law"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law", "Scotland"}, } labels["Scouting"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society"}, } labels["security"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society"}, } labels["sexism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of discrimination", "gender"}, } labels["sewing"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[sewing]], sewing tools, sewing [[technique]]s and so on", parents = {"crafts"}, } labels["shoemaking"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts"}, } labels["slavery"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"society", "work"}, } labels["Chủ nghĩa xã hội"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh tế học", "Ý thức hệ", "Chính trị cánh tả"}, } labels["social justice"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"politics", "society", "sociology", "chủ nghĩa cộng sản cánh tả"}, } labels["social security"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"government", "law", "money"}, } labels["spinning"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[spinning]], the process of making [[yarn]] or [[string]] from raw [[fiber]]", parents = {"crafts"}, } labels["square dancing"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"dance"}, } labels["standards of identity"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"law", "food and drink"}, } labels["stock market"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"Tài chính"}, } labels["supply chain"] = { type = "chủ đề thuộc nhóm liên quan", description = "default no singularize", parents = {"operations"}, } labels["taxation"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"government", "law", "money"}, } labels["theft"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crime"}, } labels["theocracy"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "religion"}, } labels["timber industry"] = { type = "chủ đề thuộc nhóm liên quan", description = "default with the", parents = {"industries"}, } labels["trademark"] = { type = "chủ đề thuộc nhóm liên quan", description = "=[[trademark]] [[law]]", parents = {"intellectual property"}, } labels["Thương mại"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh doanh"}, } labels["transphobia"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"forms of discrimination", "transgender"}, } labels["trust"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"security"}, } labels["United Nations"] = { type = "chủ đề thuộc nhóm liên quan", description = "=the [[United Nations Organization]]", parents = {"organizations"}, } labels["universities"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"schools"}, } labels["voting systems"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"democracy", "systems"}, } labels["war"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"military", "conflict", "violence"}, } labels["Wars"] = { type = "set", description = "default", parents = {"war","historical events"}, } labels["wealth"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Kinh tế học"}, } labels["Dệt"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"Thủ công"}, } labels["white supremacist ideology"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"racism", "anti-Semitism", "ideologies"}, } labels["woodworking"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"crafts"}, } labels["Zionism"] = { type = "chủ đề thuộc nhóm liên quan", description = "default", parents = {"ideologies", "Judaism", "Israel", "nationalism"}, } return labels nw2x475364kmaw8gdr5oggs5c6i6t2z Thể loại:en:Địa danh của Hawaii, Hoa Kỳ 14 354772 2345134 2257220 2026-04-14T03:22:37Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Hawaii, Hoa Kỳ/Tiếng Anh]] thành [[Thể loại:en:Địa danh của Hawaii, Hoa Kỳ]] 2257220 wikitext text/x-wiki [[Thể loại:Hawaii, Hoa Kỳ/Tiếng Anh]] [[Thể loại:Địa danh của Hoa Kỳ/Tiếng Anh]] [[Thể loại:Danh sách chủ đề thuộc nhóm tên gọi/Tiếng Anh]] [[Thể loại:Địa danh của Hawaii, Hoa Kỳ|A]] 49fxxt9c9pn4z13j6cpmaonww2qwelp 2345136 2345134 2026-04-14T03:23:19Z Hiyuune 50834 2345136 wikitext text/x-wiki [[Thể loại:en:Hawaii, Hoa Kỳ]] [[Thể loại:en:Địa danh của Hoa Kỳ]] [[Thể loại:en:Danh sách chủ đề thuộc nhóm tên gọi]] [[Thể loại:Địa danh của Hawaii, Hoa Kỳ|A]] apxry5ae4lb9xgphkqu0hv279tf4zqs Thể loại:vi:Địa danh của Biên Hòa 14 357398 2345036 2263221 2026-04-14T00:27:08Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Biên Hòa/Tiếng Việt]] thành [[Thể loại:vi:Địa danh của Biên Hòa]] 2263221 wikitext text/x-wiki [[Thể loại:Biên Hòa/Tiếng Việt]] [[Thể loại:Địa danh của Đồng Nai, Việt Nam/Tiếng Việt]] [[Thể loại:Danh sách chủ đề thuộc nhóm tên gọi/Tiếng Việt]] [[Thể loại:Địa danh của Biên Hòa|V]] rerc4z5vix7eszuf3recdeza2faov1f 2345038 2345036 2026-04-14T00:27:40Z Hiyuune 50834 2345038 wikitext text/x-wiki [[Thể loại:vi:Biên Hòa]] [[Thể loại:vi:Địa danh của Đồng Nai, Việt Nam]] [[Thể loại:vi:Danh sách chủ đề thuộc nhóm tên gọi]] [[Thể loại:Địa danh của Biên Hòa|V]] bbiwp2qjyjf002nwoair82kvpq3dmfh Thể loại:ja:Địa danh của Chile 14 358509 2345087 2267375 2026-04-14T01:23:05Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Chile/Tiếng Nhật]] thành [[Thể loại:vi:Địa danh của Chile]] 2267375 wikitext text/x-wiki [[Thể loại:Chile/Tiếng Nhật]] [[Thể loại:Địa danh/Tiếng Nhật]] [[Thể loại:Danh sách chủ đề thuộc nhóm tên gọi/Tiếng Nhật]] [[Thể loại:Địa danh của Chile|N]] 0rpzrgci9lf2hydzx6sozzpyzewfd95 2345089 2345087 2026-04-14T01:23:42Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:vi:Địa danh của Chile]] thành [[Thể loại:ja:Địa danh của Chile]] 2267375 wikitext text/x-wiki [[Thể loại:Chile/Tiếng Nhật]] [[Thể loại:Địa danh/Tiếng Nhật]] [[Thể loại:Danh sách chủ đề thuộc nhóm tên gọi/Tiếng Nhật]] [[Thể loại:Địa danh của Chile|N]] 0rpzrgci9lf2hydzx6sozzpyzewfd95 2345091 2345089 2026-04-14T01:24:05Z Hiyuune 50834 2345091 wikitext text/x-wiki [[Thể loại:ja:Chile]] [[Thể loại:ja:Địa danh]] [[Thể loại:ja:Danh sách chủ đề thuộc nhóm tên gọi]] [[Thể loại:Địa danh của Chile|N]] 42byujfdxszoywy0c147rc3rg88ygoa Thể loại:ja:Địa danh của Ehime, Nhật Bản 14 358681 2345109 2267704 2026-04-14T03:06:12Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Ehime, Nhật Bản/Tiếng Nhật]] thành [[Thể loại:ja:Địa danh của Ehime, Nhật Bản]] 2267704 wikitext text/x-wiki [[Thể loại:Ehime, Nhật Bản/Tiếng Nhật]] [[Thể loại:Địa danh của Nhật Bản/Tiếng Nhật|E]] [[Thể loại:Danh sách chủ đề thuộc nhóm tên gọi/Tiếng Nhật|E]] [[Thể loại:Địa danh của Ehime, Nhật Bản|N]] tj84phviincsmm884r1hbtbp2xdycq9 2345111 2345109 2026-04-14T03:06:34Z Hiyuune 50834 2345111 wikitext text/x-wiki [[Thể loại:ja:Ehime, Nhật Bản]] [[Thể loại:ja:Địa danh của Nhật Bản|E]] [[Thể loại:ja:Danh sách chủ đề thuộc nhóm tên gọi|E]] [[Thể loại:Địa danh của Ehime, Nhật Bản|N]] j0t04ktvs1w8px8i8ccd1p8yemr98uu Bản mẫu:dum-verb 10 360090 2344955 2271933 2026-04-13T12:55:21Z Hiyuune 50834 2344955 wikitext text/x-wiki {{head|dum|{{{cat|Động từ}}}|head={{{head|}}}|head2={{{head2|}}}|sort={{{sort|}}} |cat2={{{cat2|}}} }}<noinclude>{{tài liệu}}</noinclude> kg1wrtrxggt48hkeomgz1fu6v1uq827 0 360389 2345006 2272547 2026-04-13T14:21:14Z WhoAlone 40420 2345006 wikitext text/x-wiki {{also|貓|描}} {{character info}} =={{langname|mul}}== {{stroke order|strokes=11}} {{stroke order|type=canimate}} <div style="float:right;">{{stroke order|type=janimate}}</div> {{ja-forms|猫|猫|[[貓]]}} ==={{ĐM|han}}=== {{Han char|rn=94|rad=犬|as=08|sn=11|canj=KHTW|four=44260|ids=⿰犭苗}} ===={{ĐM|ref}}==== * {{Han ref|kx=0714.270|dkj=20535|dj=1127.010|hdz=21352.010|uh=732B|ud=29483}} {{clear}} =={{langname|jpx-hcj}}== {{attention|jpx-hcj}} ==={{ĐM|kanji}}=== {{jpx-hcj-kanji}} ==={{ĐM|reading}}=== {{jpx-hcj-readings |kun=ねこ- }} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|ねこ}} # [[mèo]]. {{c|jpx-hcj|Mèo}} qh5v2x4ex2iyoxfcvfwntaab9zgcir9 Mô đun:fi-verbs 828 368088 2344958 2306685 2026-04-13T12:57:59Z Hiyuune 50834 2344958 Scribunto text/plain local export = {} local m_str_utils = require("Module:string utilities") local find = m_str_utils.find local gsub = m_str_utils.gsub local match = m_str_utils.match local sub = m_str_utils.sub local unpack = unpack or table.unpack -- Lua 5.2 compatibility local lang = require("Module:languages").getByCode("fi") -- Functions that do the actual inflecting by creating the forms of a basic term. local inflections = {} local kotus_grad_type = { ["kk-k"] = "A", ["pp-p"] = "B", ["tt-t"] = "C", ["k-"] = "D", ["p-v"] = "E", ["t-d"] = "F", ["nk-ng"] = "G", ["mp-mm"] = "H", ["lt-ll"] = "I", ["nt-nn"] = "J", ["rt-rr"] = "K", ["k-j"] = "L", ["k-v"] = "M" } local function tag_term(term) -- return require("Module:script utilities").tag_text(term, lang, nil, "term") return '<i class="Latn mention" lang="fi">' .. term .. '</i>' end local function normalize_apostrophes(term, link_target) if link_target then if term and find(term, "’") then term = gsub(term, "’", "'") end else if term and find(term, "'") then term = gsub(term, "'", "’") end end return term end -- Creates a link to a form. local function make_link(term, accel_form) -- do not link inflected forms of suffixes if match(term, "^-") or find(term, "%[%[%-") then term = gsub(term, "[%[%]]", "") if target == mw.title.getCurrentTitle().fullText then return '<span class="Latn" lang="fi"><strong class="selflink">' .. term .. '</strong></span>' end return '<span class="Latn" lang="fi">' .. term .. '</span>' end -- if there is something difficult, use full module. if find(term, "[:<]") or (accel_form and find(term, "%[")) then if find(term, ":") then term = gsub(term, ":", "\\:") end return require("Module:links").full_link({ lang = lang, term = term, accel = accel_form and ({ form = accel_form }) or nil }) end -- otherwise, we can save a ton of memory by doing this manually. local target = normalize_apostrophes(term, true) if target == mw.title.getCurrentTitle().fullText then return '<span class="Latn" lang="fi"><strong class="selflink">' .. term .. '</strong></span>' end if find(term, "%[") then return '<span class="Latn" lang="fi">' .. term .. '</span>' end if not accel_form then return '<span class="Latn" lang="fi">[[' .. target .. '#Tiếng Phần Lan|' .. term .. ']]</span>' end return '<span class="Latn form-of lang-fi ' .. accel_form .. '-form-of" lang="fi">[[' .. target .. '#Tiếng Phần Lan|' .. term .. ']]</span>' end -- The main entry point. -- This is the only function that can be invoked from a template. function export.show(frame) local infl_type = frame.args[1] or error("Loại biến tố không được chỉ rõ. Vui lòng thêm tham số đầu tiên để gọi mô đun.") local args = frame:getParent().args if not inflections[infl_type] then error("Không rõ loại biến tố '" .. infl_type .. "'") end local data = { forms = {}, title = nil, categories = {}, vh = nil, pagename = mw.title.getCurrentTitle().text } if args["title"] and mw.title.getCurrentTitle().namespace > 0 then data.pagename = args.title end data.pagename = normalize_apostrophes(data.pagename) -- Generate the forms inflections[infl_type](args, data) -- Postprocess postprocess(args, data) if args["appendix"] then table.insert(data.categories, "fi-conj with appendix") end if args["noagent"] then table.insert(data.categories, "fi-conj with noagent") end if args["qual"] or args["q1sg"] or args["q2sg"] or args["q1pl"] or args["q2pl"] or args["q3p"] or args["qpass"] or args["q1sgp"] or args["q2sgp"] or args["q1plp"] or args["q2plp"] or args["q3pp"] or args["qpassp"] or args["q4i"] then table.insert(data.categories, "fi-conj with qual") end local categories if args["appendix"] then categories = "" else categories = require("Module:utilities").format_categories(data.categories, lang) end return make_table(data) .. categories .. require("Module:TemplateStyles")("Module:fi-verbs/style.css") end local function args_get_required(args, i, purpose) local v = args[i] if not v then error(purpose .. " (tham số " .. i .. ") có thể đã bỏ qua.") end return v end local function args_get_vowel_harmony(args, i) local v = args[i] if not v or not match(v, "^[aä]$") then error("Hài hòa nguyên âm (tham số " .. i .. ") phải là \"a\" hoặc \"ä\".") end return v end -- Get parameters from the template, in standard order and numbering local function get_params(args, num, invert_grades) local params = {} params.base = normalize_apostrophes(args[1]) if num >= 2 then if num >= 4 then params.strong = normalize_apostrophes(args_get_required(args, 2, "Bậc nguyên mẫu")) params.weak = normalize_apostrophes(args_get_required(args, 3, "Bậc khác")) -- Swap the grades if invert_grades then params.strong, params.weak = params.weak, params.strong end end if num >= 5 then params.final = args_get_required(args, 4, "Chữ cái cuối cùng") end params.a = args_get_vowel_harmony(args, num) end if params.a then params.o = params.a == "ä" and "ö" or "o" params.u = params.a == "ä" and "y" or "u" end return params end --[=[ Inflection functions ]=]-- local stem_endings = {} stem_endings["inf1"] = { ["inf1"] = "a", ["inf1_long"] = "akse¤", } stem_endings["inf2"] = { ["inf2_ine"] = "essa¤", ["inf2_ins"] = "en", } stem_endings["pres"] = { ["pres_3sg"] = "V", ["pres_3pl"] = "vat", ["inf3_ine"] = "massa", ["inf3_ela"] = "masta", ["inf3_ill"] = "maan", ["inf3_ade"] = "malla", ["inf3_abe"] = "matta", ["inf3_ins"] = "man", ["inf4"] = "minen", ["inf5"] = "maisilla¤", ["pres_part"] = "va", ["agnt_part"] = "ma", ["nega_part"] = "maton", } stem_endings["pres_weak"] = { ["pres_1sg"] = "n", ["pres_2sg"] = "t", ["pres_1pl"] = "mme", ["pres_2pl"] = "tte", ["pres_conn"] = "", ["impr_2sg"] = "", } stem_endings["past"] = { ["past_3sg"] = "", ["past_3pl"] = "vat", } stem_endings["past_weak"] = { ["past_1sg"] = "n", ["past_2sg"] = "t", ["past_1pl"] = "mme", ["past_2pl"] = "tte", } stem_endings["cond"] = { ["cond_1sg"] = "sin", ["cond_2sg"] = "sit", ["cond_3sg"] = "si", ["cond_1pl"] = "simme", ["cond_2pl"] = "sitte", ["cond_3pl"] = "sivat", ["cond_conn"] = "si", } stem_endings["impr"] = { ["impr_3sg"] = "oon", ["impr_1pl"] = "aamme", ["impr_2pl"] = "aa", ["impr_3pl"] = "oot", ["impr_conn"] = "o", } stem_endings["potn"] = { ["potn_1sg"] = "en", ["potn_2sg"] = "et", ["potn_3sg"] = "ee", ["potn_1pl"] = "emme", ["potn_2pl"] = "ette", ["potn_3pl"] = "evat", ["potn_conn"] = "e", ["past_part"] = "ut", ["past_part_pl"] = "eet", } stem_endings["pres_pasv"] = { ["pres_pasv"] = "aan", ["pres_pasv_conn"] = "a", } stem_endings["past_pasv"] = { ["past_pasv"] = "iin", ["cond_pasv"] = "aisiin", ["cond_pasv_conn"] = "aisi", ["impr_pasv"] = "akoon", ["impr_pasv_conn"] = "ako", ["potn_pasv"] = "aneen", ["potn_pasv_conn"] = "ane", ["inf2_pasv_ine"] = "aessa", ["inf3_pasv_ins"] = "aman", ["pres_pasv_part"] = "ava", ["past_pasv_part"] = "u", } -- Make a copy of the endings, with front vowels stem_endings = {["a"] = stem_endings, ["ä"] = mw.clone(stem_endings)} for stem_key, endings in pairs(stem_endings["ä"]) do for key, ending in pairs(endings) do endings[key] = gsub(endings[key], "([aou])", {["a"] = "ä", ["o"] = "ö", ["u"] = "y"}) end end local function process_stems(data, stems, vh, no_make_stems) -- Create any stems that were not given if not no_make_stems then stems["inf1"] = stems["inf1"] or mw.clone(stems["pres"]) if not stems["cond"] and stems["pres"] then stems["cond"] = {} for _, stem in ipairs(stems["pres"]) do table.insert(stems["cond"], gsub(stem, "[ei]$", "") .. "i") end end if not stems["impr"] and stems["pres"] then stems["impr"] = {} for _, stem in ipairs(stems["pres"]) do table.insert(stems["impr"], stem .. "k") end end if not stems["potn"] and stems["pres"] then stems["potn"] = {} for _, stem in ipairs(stems["pres"]) do table.insert(stems["potn"], stem .. "n") end end end -- Create forms based on each stem, by adding endings to it if not stems["inf2"] and stems["inf1"] then stems["inf2"] = {} for _, stem in ipairs(stems["inf1"]) do table.insert(stems["inf2"], (gsub(stem, "e$", "i"))) end end stems["pres_weak"] = stems["pres_weak"] or mw.clone(stems["pres"]) stems["past_weak"] = stems["past_weak"] or mw.clone(stems["past"]) -- Go through each of the stems given for stem_key, substems in pairs(stems) do for _, stem in ipairs(substems) do -- Attach the endings to the stem for form_key, ending in pairs(stem_endings[vh][stem_key]) do if not data.forms[form_key] then data.forms[form_key] = {} end -- If the ending is "V" then it is a copy of the preceding vowel... if ending == "V" then -- ...but not if the stem ends in a long vowel or diphthong. if find(stem, "([aeiouyäö])%1$") or find(stem, "([aeiouyäö])[iuy]$") or find(stem, "ie$") or find(stem, "uo$") or find(stem, "yö$") then ending = "" else ending = match(stem, "([aeiouyäö])$") or "" end end table.insert(data.forms[form_key], stem .. ending) end end end data["vh"] = vh end local KOTUS_TYPE = "[[Kotus]] loại " local function make_kotus_title_number(type_number) return KOTUS_TYPE .. type_number end local function make_kotus_title_word(reference_word) return '/<span lang="fi" class="Latn">[[Phụ lục:Chia động từ tiếng Phần Lan/' .. reference_word .. '|' .. reference_word .. ']]</span>' end local function make_kotus_title(number, reference_word) return make_kotus_title_number(number) .. make_kotus_title_word(reference_word) end local function inflection_type_is(data, number, reference_word, strong, weak) local title = make_kotus_title_number(number) local has_gradation = strong and strong ~= weak if has_gradation then local letter = kotus_grad_type[strong .. "-" .. weak] if letter then title = title .. "*" .. letter else title = title .. "*" end end title = title .. make_kotus_title_word(reference_word) if has_gradation then local EMPTY = "<small>∅</small>" local function format(grade) if grade == "" then return EMPTY else return "''" .. grade .. "''" end end title = title .. ", luân phiên nguyên âm " .. format(strong) .. "-" .. format(weak) else title = title .. ", không luân phiên nguyên âm" end data.title = title table.insert(data.categories, "Động từ loại " .. reference_word .. " tiếng Phần Lan") end local function inflection_type_is_t_d(data, number, reference_word, weak) if weak == "d" then inflection_type_is(data, number, reference_word, "t", "d") else inflection_type_is(data, number, reference_word, weak .. "t", weak .. weak) end end local function inflection_type_is_combo(data, number_a, reference_word_a, number_b, reference_word_b, strong, weak) local title = KOTUS_TYPE local has_gradation = strong and strong ~= weak local gradation_suffix = "" if has_gradation then local letter = kotus_grad_type[strong .. "-" .. weak] if letter then gradation_suffix = "*" .. letter else gradation_suffix = "*" end end title = title .. number_a .. gradation_suffix .. make_kotus_title_word(reference_word_a) title = title .. " and " .. number_b .. gradation_suffix .. make_kotus_title_word(reference_word_b) if has_gradation then local EMPTY = "<small>∅</small>" local function format(grade) if grade == "" then return EMPTY else return "''" .. grade .. "''" end end title = title .. ", luân phiên nguyên âm " .. format(strong) .. "-" .. format(weak) else title = title .. ", không luân phiên nguyên âm" end data.title = title table.insert(data.categories, "Động từ loại " .. reference_word_a .. " tiếng Phần Lan") -- only tag the first class - this is on purpose. -- table.insert(data.categories, "Finnish " .. reference_word_b .. "-type verbs") end --[=[ Inflection types ]=]-- inflections["sanoa"] = function(args, data) local params = get_params(args, 5) local apo = (params.weak == "" and sub(params.base, -1) == params.final) and "'" or "" local stems = {} stems["pres"] = {params.base .. params.strong .. params.final} stems["pres_weak"] = {params.base .. params.weak .. apo .. params.final} stems["past"] = {params.base .. params.strong .. params.final .. "i"} stems["past_weak"] = {params.base .. params.weak .. apo .. params.final .. "i"} stems["pres_pasv"] = {params.base .. params.weak .. apo .. params.final .. "t"} stems["past_pasv"] = {params.base .. params.weak .. apo .. params.final .. "tt"} inflection_type_is(data, 52, "sanoa", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["muistaa"] = function(args, data) local params = get_params(args, 4) local stems = {} stems["pres"] = {params.base .. params.strong .. params.a} stems["pres_weak"] = {params.base .. params.weak .. params.a} stems["past"] = {params.base .. params.strong .. "i"} stems["past_weak"] = {params.base .. params.weak .. "i"} stems["pres_pasv"] = {params.base .. params.weak .. "et"} stems["past_pasv"] = {params.base .. params.weak .. "ett"} inflection_type_is(data, 53, "muistaa", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["huutaa"] = function(args, data) local params = get_params(args, 2) local weak = match(params.base, "([lnr])$") or "d" local stems = {} stems["pres"] = {params.base .. "t" .. params.a} stems["pres_weak"] = {params.base .. weak .. params.a} stems["past"] = {params.base .. "si"} stems["pres_pasv"] = {params.base .. weak .. "et"} stems["past_pasv"] = {params.base .. weak .. "ett"} inflection_type_is_t_d(data, 54, "huutaa", weak) process_stems(data, stems, params.a) end inflections["soutaa"] = function(args, data) local params = get_params(args, 2) local weak = match(params.base, "([lnr])$") or "d" local stems = {} stems["pres"] = {params.base .. "t" .. params.a} stems["pres_weak"] = {params.base .. weak .. params.a} stems["past"] = {params.base .. "ti", params.base .. "si"} stems["past_weak"] = {params.base .. weak .. "i", params.base .. "si"} stems["pres_pasv"] = {params.base .. weak .. "et"} stems["past_pasv"] = {params.base .. weak .. "ett"} inflection_type_is_t_d(data, 55, "soutaa", weak) process_stems(data, stems, params.a) end inflections["kaivaa"] = function(args, data) local params = get_params(args, 4) local stems = {} stems["pres"] = {params.base .. params.strong .. params.a} stems["pres_weak"] = {params.base .. params.weak .. params.a} stems["past"] = {params.base .. params.strong .. params.o .. "i"} stems["past_weak"] = {params.base .. params.weak .. params.o .. "i"} stems["pres_pasv"] = {params.base .. params.weak .. "et"} stems["past_pasv"] = {params.base .. params.weak .. "ett"} inflection_type_is(data, 56, "kaivaa", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["saartaa"] = function(args, data) local params = get_params(args, 2) local weak = match(params.base, "([lnr])$") or "d" local stems = {} stems["pres"] = {params.base .. "t" .. params.a} stems["pres_weak"] = {params.base .. weak .. params.a} stems["past"] = {params.base .. "si", params.base .. "t" .. params.o .. "i"} stems["past_weak"] = {params.base .. "si", params.base .. weak .. params.o .. "i"} stems["pres_pasv"] = {params.base .. weak .. "et"} stems["past_pasv"] = {params.base .. weak .. "ett"} inflection_type_is_t_d(data, 57, "saartaa", weak) process_stems(data, stems, params.a) end inflections["laskea"] = function(args, data) local params = get_params(args, 4) local stems = {} stems["pres"] = {params.base .. params.strong .. "e"} stems["pres_weak"] = {params.base .. params.weak .. "e"} stems["past"] = {params.base .. params.strong .. "i"} stems["past_weak"] = {params.base .. params.weak .. "i"} stems["pres_pasv"] = {params.base .. params.weak .. "et"} stems["past_pasv"] = {params.base .. params.weak .. "ett"} inflection_type_is(data, 58, "laskea", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["tuntea"] = function(args, data) local params = get_params(args, 2) local weak = match(params.base, "([lnr])$") or "d" local stems = {} stems["pres"] = {params.base .. "te"} stems["pres_weak"] = {params.base .. weak .. "e"} stems["past"] = {params.base .. "si"} stems["pres_pasv"] = {params.base .. weak .. "et"} stems["past_pasv"] = {params.base .. weak .. "ett"} inflection_type_is_t_d(data, 59, "tuntea", weak) process_stems(data, stems, params.a) end inflections["lähteä"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["pres"] = {params.base .. "hte"} stems["pres_weak"] = {params.base .. "hde"} stems["past"] = {params.base .. "hti", params.base .. "ksi"} stems["past_weak"] = {params.base .. "hdi", params.base .. "ksi"} stems["pres_pasv"] = {params.base .. "hdet"} stems["past_pasv"] = {params.base .. "hdett"} inflection_type_is(data, 60, "lähteä", "t", "d") process_stems(data, stems, params.a) end inflections["sallia"] = function(args, data) local params = get_params(args, 4) local apo = (params.weak == "" and sub(params.base, -1) == "i") and "'" or "" local stems = {} stems["pres"] = {params.base .. params.strong .. "i"} stems["pres_weak"] = {params.base .. params.weak .. apo .. "i"} stems["past"] = {params.base .. params.strong .. "i"} stems["past_weak"] = {params.base .. params.weak .. apo .. "i"} stems["pres_pasv"] = {params.base .. params.weak .. apo .. "it"} stems["past_pasv"] = {params.base .. params.weak .. apo .. "itt"} inflection_type_is(data, 61, "sallia", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["voida"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["inf1"] = {params.base .. "d"} stems["pres"] = {params.base} stems["past"] = {params.base} stems["pres_pasv"] = {params.base .. "d"} stems["past_pasv"] = {params.base .. "t"} inflection_type_is(data, 62, "voida") process_stems(data, stems, params.a) end inflections["saada"] = function(args, data) local params = get_params(args, 2) local vowel = sub(params.base, -1) local stems = {} stems["inf1"] = {params.base .. vowel .. "d"} stems["pres"] = {params.base .. vowel} stems["past"] = {params.base .. "i"} stems["cond"] = {params.base .. "i"} stems["pres_pasv"] = {params.base .. vowel .. "d"} stems["past_pasv"] = {params.base .. vowel .. "t"} inflection_type_is(data, 63, "saada") process_stems(data, stems, params.a) end inflections["juoda"] = function(args, data) local params = get_params(args, 2) local past_cond_stem = sub(params.base, 1, -3) .. sub(params.base, -1) local stems = {} stems["inf1"] = {params.base .. "d"} stems["pres"] = {params.base} stems["past"] = {past_cond_stem .. "i"} stems["cond"] = {past_cond_stem .. "i"} stems["pres_pasv"] = {params.base .. "d"} stems["past_pasv"] = {params.base .. "t"} inflection_type_is(data, 64, "juoda") process_stems(data, stems, params.a) end inflections["käydä"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["inf1"] = {params.base .. params.u .. "d"} stems["pres"] = {params.base .. params.u} stems["past"] = {params.base .. "vi"} stems["cond"] = {params.base .. "vi"} stems["pres_pasv"] = {params.base .. params.u .. "d"} stems["past_pasv"] = {params.base .. params.u .. "t"} inflection_type_is(data, 65, "käydä") process_stems(data, stems, params.a) end inflections["rohkaista"] = function(args, data) local params = get_params(args, 5, true) local stems = {} stems["inf1"] = {params.base .. params.weak .. params.final .. "st"} stems["pres"] = {params.base .. params.strong .. params.final .. "se"} stems["past"] = {params.base .. params.strong .. params.final .. "si"} stems["impr"] = {params.base .. params.weak .. params.final .. "sk"} stems["potn"] = {params.base .. params.weak .. params.final .. "ss"} stems["pres_pasv"] = {params.base .. params.weak .. params.final .. "st"} stems["past_pasv"] = {params.base .. params.weak .. params.final .. "st"} inflection_type_is(data, 66, "rohkaista", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["tulla"] = function(args, data) local params = get_params(args, 5, true) local cons = sub(params.final, -1) local stems = {} stems["inf1"] = {params.base .. params.weak .. params.final .. cons} stems["pres"] = {params.base .. params.strong .. params.final .. "e"} stems["past"] = {params.base .. params.strong .. params.final .. "i"} stems["impr"] = {params.base .. params.weak .. params.final .. "k"} stems["potn"] = {params.base .. params.weak .. params.final .. cons} stems["pres_pasv"] = {params.base .. params.weak .. params.final .. cons} stems["past_pasv"] = {params.base .. params.weak .. params.final .. "t"} inflection_type_is(data, 67, "tulla", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["tupakoida"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["inf1"] = {params.base .. "d"} stems["pres"] = {params.base, params.base .. "tse"} stems["past"] = {params.base, params.base .. "tsi"} stems["impr"] = {params.base .. "k"} stems["potn"] = {params.base .. "n"} stems["pres_pasv"] = {params.base .. "d"} stems["past_pasv"] = {params.base .. "t"} inflection_type_is(data, 68, "tupakoida") process_stems(data, stems, params.a) end inflections["valita"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["inf1"] = {params.base .. "t"} stems["pres"] = {params.base .. "tse"} stems["past"] = {params.base .. "tsi"} stems["impr"] = {params.base .. "tk"} stems["potn"] = {params.base .. "nn"} stems["pres_pasv"] = {params.base .. "t"} stems["past_pasv"] = {params.base .. "tt"} inflection_type_is(data, 69, "valita") process_stems(data, stems, params.a) end inflections["juosta"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["inf1"] = {params.base .. "st"} stems["pres"] = {params.base .. "kse"} stems["past"] = {params.base .. "ksi"} stems["impr"] = {params.base .. "sk"} stems["potn"] = {params.base .. "ss"} stems["pres_pasv"] = {params.base .. "st"} stems["past_pasv"] = {params.base .. "st"} inflection_type_is(data, 70, "juosta") process_stems(data, stems, params.a) end inflections["nähdä"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["inf1"] = {params.base .. "hd"} stems["pres"] = {params.base .. "ke"} stems["pres_weak"] = {params.base .. "e"} stems["past"] = {params.base .. "ki"} stems["past_weak"] = {params.base .. "i"} stems["impr"] = {params.base .. "hk"} stems["potn"] = {params.base .. "hn"} stems["pres_pasv"] = {params.base .. "hd"} stems["past_pasv"] = {params.base .. "ht"} inflection_type_is(data, 71, "nähdä", "k", "") process_stems(data, stems, params.a) end inflections["vanheta"] = function(args, data) local params = get_params(args, 5, true) local stems = {} stems["inf1"] = {params.base .. params.weak .. params.final .. "t"} stems["pres"] = {params.base .. params.strong .. params.final .. "ne"} stems["past"] = {params.base .. params.strong .. params.final .. "ni"} stems["impr"] = {params.base .. params.weak .. params.final .. "tk"} stems["potn"] = {params.base .. params.weak .. params.final .. "nn"} stems["pres_pasv"] = {params.base .. params.weak .. params.final .. "t"} stems["past_pasv"] = {params.base .. params.weak .. params.final .. "tt"} inflection_type_is(data, 72, "vanheta", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["salata"] = function(args, data) local params = get_params(args, 4, true) local stems = {} stems["inf1"] = {params.base .. params.weak .. params.a .. "t"} stems["pres"] = {params.base .. params.strong .. params.a .. params.a} stems["past"] = {params.base .. params.strong .. params.a .. "si"} stems["cond"] = {params.base .. params.strong .. params.a .. "i"} stems["impr"] = {params.base .. params.weak .. params.a .. "tk"} stems["potn"] = {params.base .. params.weak .. params.a .. "nn"} stems["pres_pasv"] = {params.base .. params.weak .. params.a .. "t"} stems["past_pasv"] = {params.base .. params.weak .. params.a .. "tt"} inflection_type_is(data, 73, "salata", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["katketa"] = function(args, data) local params = get_params(args, 5, true) local stems = {} stems["inf1"] = {params.base .. params.weak .. params.final .. "t"} stems["pres"] = {params.base .. params.strong .. params.final .. params.a} stems["past"] = {params.base .. params.strong .. params.final .. "si"} stems["cond"] = {params.base .. params.strong .. params.final .. params.a .. "i", params.base .. params.strong .. params.final .. "i"} stems["impr"] = {params.base .. params.weak .. params.final .. "tk"} stems["potn"] = {params.base .. params.weak .. params.final .. "nn"} stems["pres_pasv"] = {params.base .. params.weak .. params.final .. "t"} stems["past_pasv"] = {params.base .. params.weak .. params.final .. "tt"} inflection_type_is(data, 74, "katketa", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["selvitä"] = function(args, data) local params = get_params(args, 5, true) local stems = {} stems["inf1"] = {params.base .. params.weak .. params.final .. "t"} stems["pres"] = {params.base .. params.strong .. params.final .. params.a} stems["past"] = {params.base .. params.strong .. params.final .. "si"} stems["impr"] = {params.base .. params.weak .. params.final .. "tk"} stems["potn"] = {params.base .. params.weak .. params.final .. "nn"} stems["pres_pasv"] = {params.base .. params.weak .. params.final .. "t"} stems["past_pasv"] = {params.base .. params.weak .. params.final .. "tt"} inflection_type_is(data, 75, "selvitä", params.strong, params.weak) process_stems(data, stems, params.a) end inflections["taitaa"] = function(args, data) local params = get_params(args, 2) local stems = {} stems["pres"] = {params.base .. "t" .. params.a} stems["pres_weak"] = {params.base .. "d" .. params.a} stems["past"] = {params.base .. "si"} stems["potn"] = {params.base .. "t" .. params.a .. "n", params.base .. "nn"} stems["pres_pasv"] = {params.base .. "det"} stems["past_pasv"] = {params.base .. "dett"} inflection_type_is(data, 76, "taitaa", "t", "d") process_stems(data, stems, params.a) end inflections["virkkaa"] = function(args, data) local stems = {} stems["inf1"] = {"virkka"} stems["pres"] = {"virkka"} stems["pres_weak"] = {"virka"} stems["past"] = {"virkkoi"} stems["past_weak"] = {"virkoi"} stems["cond"] = {"virkkai"} stems["impr"] = {"virkkak"} stems["potn"] = {"virkkan"} process_stems(data, stems, "a", true) local stems = {} stems["pres_pasv"] = {"virket"} stems["past_pasv"] = {"virkett"} process_stems(data, stems, "ä", true) inflection_type_is_combo(data, 56, "kaivaa", 53, "muistaa", "kk", "k") data.title = data.title .. ", hài hòa nguyên âm bất quy tắc" end inflections["seistä"] = function(args, data) local stems = {} stems["inf1"] = {"seist"} stems["impr"] = {"seisk"} stems["potn"] = {"seiss"} stems["pres_pasv"] = {"seist"} stems["past_pasv"] = {"seist"} process_stems(data, stems, "ä", true) local stems = {} stems["pres"] = {"seiso"} stems["past"] = {"seisoi"} stems["cond"] = {"seisoi"} process_stems(data, stems, "a", true) inflection_type_is_combo(data, 66, "rohkaista", 52, "sanoa") end inflections["olla"] = function(args, data) local stems = {} stems["inf1"] = {"oll"} stems["pres"] = {"ole"} stems["past"] = {"oli"} stems["impr"] = {"olk"} stems["potn"] = {"oll"} stems["pres_pasv"] = {"oll"} stems["past_pasv"] = {"olt"} process_stems(data, stems, "a") data.forms["pres_3sg"] = {"on"} data.forms["pres_3pl"] = {"ovat"} data.forms["potn_1sg"] = {"lienen"} data.forms["potn_2sg"] = {"lienet"} data.forms["potn_3sg"] = {"lienee"} data.forms["potn_1pl"] = {"lienemme"} data.forms["potn_2pl"] = {"lienette"} data.forms["potn_3pl"] = {"lienevät"} data.forms["potn_conn"] = {"liene"} inflection_type_is_combo(data, 67, "tulla", 64, "juoda") end -- Helper functions local complex_forms = { -- Present ["pres_1sg_neg"] = { "en", "pres_conn" }, ["pres_2sg_neg"] = { "et", "pres_conn" }, ["pres_3sg_neg"] = { "ei", "pres_conn" }, ["pres_1pl_neg"] = { "emme", "pres_conn" }, ["pres_2pl_neg"] = { "ette", "pres_conn" }, ["pres_3pl_neg"] = { "eivät", "pres_conn" }, ["pres_pasv_neg"] = { "ei", "pres_pasv_conn" }, ["pres_perf_1sg"] = { "olen", "past_part" }, ["pres_perf_2sg"] = { "olet", "past_part" }, ["pres_perf_3sg"] = { "on", "past_part" }, ["pres_perf_1pl"] = { "olemme", "past_part_pl" }, ["pres_perf_2pl"] = { "olette", "past_part_pl" }, ["pres_perf_3pl"] = { "ovat", "past_part_pl" }, ["pres_perf_pasv"] = { "on", "past_pasv_part" }, ["pres_perf_1sg_neg"] = { "en ole", "past_part" }, ["pres_perf_2sg_neg"] = { "et ole", "past_part" }, ["pres_perf_3sg_neg"] = { "ei ole", "past_part" }, ["pres_perf_1pl_neg"] = { "emme ole", "past_part_pl" }, ["pres_perf_2pl_neg"] = { "ette ole", "past_part_pl" }, ["pres_perf_3pl_neg"] = { "eivät ole", "past_part_pl" }, ["pres_perf_pasv_neg"] = { "ei ole", "past_pasv_part" }, -- Past ["past_1sg_neg"] = { "en", "past_part" }, ["past_2sg_neg"] = { "et", "past_part" }, ["past_3sg_neg"] = { "ei", "past_part" }, ["past_1pl_neg"] = { "emme", "past_part_pl" }, ["past_2pl_neg"] = { "ette", "past_part_pl" }, ["past_3pl_neg"] = { "eivät", "past_part_pl" }, ["past_pasv_neg"] = { "ei", "past_pasv_part" }, ["past_perf_1sg"] = { "olin", "past_part" }, ["past_perf_2sg"] = { "olit", "past_part" }, ["past_perf_3sg"] = { "oli", "past_part" }, ["past_perf_1pl"] = { "olimme", "past_part_pl" }, ["past_perf_2pl"] = { "olitte", "past_part_pl" }, ["past_perf_3pl"] = { "olivat", "past_part_pl" }, ["past_perf_pasv"] = { "oli", "past_pasv_part" }, ["past_perf_1sg_neg"] = { "en ollut", "past_part" }, ["past_perf_2sg_neg"] = { "et ollut", "past_part" }, ["past_perf_3sg_neg"] = { "ei ollut", "past_part" }, ["past_perf_1pl_neg"] = { "emme olleet", "past_part_pl" }, ["past_perf_2pl_neg"] = { "ette olleet", "past_part_pl" }, ["past_perf_3pl_neg"] = { "eivät olleet", "past_part_pl" }, ["past_perf_pasv_neg"] = { "ei ollut", "past_pasv_part" }, -- Conditional ["cond_1sg_neg"] = { "en", "cond_conn" }, ["cond_2sg_neg"] = { "et", "cond_conn" }, ["cond_3sg_neg"] = { "ei", "cond_conn" }, ["cond_1pl_neg"] = { "emme", "cond_conn" }, ["cond_2pl_neg"] = { "ette", "cond_conn" }, ["cond_3pl_neg"] = { "eivät", "cond_conn" }, ["cond_pasv_neg"] = { "ei", "cond_pasv_conn" }, ["cond_perf_1sg"] = { "olisin", "past_part" }, ["cond_perf_2sg"] = { "olisit", "past_part" }, ["cond_perf_3sg"] = { "olisi", "past_part" }, ["cond_perf_1pl"] = { "olisimme", "past_part_pl" }, ["cond_perf_2pl"] = { "olisitte", "past_part_pl" }, ["cond_perf_3pl"] = { "olisivat", "past_part_pl" }, ["cond_perf_pasv"] = { "olisi", "past_pasv_part" }, ["cond_perf_1sg_neg"] = { "en olisi", "past_part" }, ["cond_perf_2sg_neg"] = { "et olisi", "past_part" }, ["cond_perf_3sg_neg"] = { "ei olisi", "past_part" }, ["cond_perf_1pl_neg"] = { "emme olisi", "past_part_pl" }, ["cond_perf_2pl_neg"] = { "ette olisi", "past_part_pl" }, ["cond_perf_3pl_neg"] = { "eivät olisi", "past_part_pl" }, ["cond_perf_pasv_neg"] = { "ei olisi", "past_pasv_part" }, -- Imperative ["impr_2sg_neg"] = { "älä", "impr_2sg" }, ["impr_3sg_neg"] = { "älköön", "impr_conn" }, ["impr_1pl_neg"] = { "älkäämme", "impr_conn" }, ["impr_2pl_neg"] = { "älkää", "impr_conn" }, ["impr_3pl_neg"] = { "älkööt", "impr_conn" }, ["impr_pasv_neg"] = { "älköön", "impr_pasv_conn" }, ["impr_perf_3sg"] = { "olkoon", "past_part" }, ["impr_perf_3pl"] = { "olkoot", "past_part_pl" }, ["impr_perf_pasv"] = { "olkoon", "past_pasv_part" }, ["impr_perf_3sg_neg"] = { "älköön olko", "past_part" }, ["impr_perf_3pl_neg"] = { "älkööt olko", "past_part_pl" }, ["impr_perf_pasv_neg"] = { "älköön olko", "past_pasv_part" }, -- Potential ["potn_1sg_neg"] = { "en", "potn_conn" }, ["potn_2sg_neg"] = { "et", "potn_conn" }, ["potn_3sg_neg"] = { "ei", "potn_conn" }, ["potn_1pl_neg"] = { "emme", "potn_conn" }, ["potn_2pl_neg"] = { "ette", "potn_conn" }, ["potn_3pl_neg"] = { "eivät", "potn_conn" }, ["potn_pasv_neg"] = { "ei", "potn_pasv_conn" }, ["potn_perf_1sg"] = { "lienen", "past_part" }, ["potn_perf_2sg"] = { "lienet", "past_part" }, ["potn_perf_3sg"] = { "lienee", "past_part" }, ["potn_perf_1pl"] = { "lienemme", "past_part_pl" }, ["potn_perf_2pl"] = { "lienette", "past_part_pl" }, ["potn_perf_3pl"] = { "lienevät", "past_part_pl" }, ["potn_perf_pasv"] = { "lienee", "past_pasv_part" }, ["potn_perf_1sg_neg"] = { "en liene", "past_part" }, ["potn_perf_2sg_neg"] = { "et liene", "past_part" }, ["potn_perf_3sg_neg"] = { "ei liene", "past_part" }, ["potn_perf_1pl_neg"] = { "emme liene", "past_part_pl" }, ["potn_perf_2pl_neg"] = { "ette liene", "past_part_pl" }, ["potn_perf_3pl_neg"] = { "eivät liene", "past_part_pl" }, ["potn_perf_pasv_neg"] = { "ei liene", "past_pasv_part" }, } function postprocess(args, data) local appendix = args["appendix"]; if appendix == "" then appendix = nil end local qual = args["qual"]; if qual == "" then qual = nil end local q4i = args["q4i"]; if q4i == "" then q4i = nil end local extranotes = {} -- Create the periphrastic forms (negative and perfect) local function make_forms(aux, forms) if not forms then return nil end local ret = {} for _, form in ipairs(forms) do table.insert(ret, aux .. " [[" .. form .. "]]") end return ret end if qual then data.no_accel = true end -- Present for key, value in pairs(complex_forms) do data.forms[key] = make_forms(value[1], data.forms[value[2]]) end -- Add qualifier for key, form in pairs(data.forms) do -- Add qual -- for participles, qual is before, while for others it is after if q4i and key == "inf4" then for i, subform in ipairs(form) do subform = (q4i and q4i .. " " or "") .. subform form[i] = subform end if form.rare then for i, subform in ipairs(form.rare) do subform = (q4i and q4i .. " " or "") .. subform form.rare[i] = subform end end elseif string.sub(key, -5) == "_part" then for i, subform in ipairs(form) do subform = (qual and qual .. " " or "") .. subform form[i] = subform end if form.rare then for i, subform in ipairs(form.rare) do subform = (qual and qual .. " " or "") .. subform form.rare[i] = subform end end else for i, subform in ipairs(form) do subform = subform .. (qual and " " .. qual or "") form[i] = subform end if form.rare then for i, subform in ipairs(form.rare) do subform = subform .. (qual and " " .. qual or "") form.rare[i] = subform end end end data.forms[key] = form end data.is_appendix = appendix if args.noagent then data.forms["agnt_part"] = nil end if data.forms["inf1"][1] == data.forms["pres_3sg"][1] then table.insert(extranotes, "&#42; The third-person singular indicative form " .. tag_term(data.forms["inf1"][1]) .. " does not exhibit [[Appendix:Finnish pronunciation#Final gemination|final gemination]], <br/>unlike the first infinitive (the lemma form), even though they are spelled identically.") end if extranotes then data.extranotes = extranotes end -- Check if the lemma form matches the page name if not appendix and not (args["q1sg"] or args["q2sg"] or args["q1pl"] or args["q2pl"] or args["q3p"] or args["qpass"]) and (lang:makeEntryName(data.forms["inf1"][1])) ~= normalize_apostrophes(data.pagename, true) then mw.addWarning("<i>Vui lòng kiểm tra tham số bản mẫu fi-conj-...!</i>") table.insert(data.categories, "Mục từ có biến tố không khớp với tên trang tiếng Phần Lan") end end local inf_to_accel = { ["1"] = nil, ["1_long"] = "long|first|inf", ["2_ine"] = "ine|of|second|actv|inf", ["2_pasv_ine"] = "ine|of|second|pasv|inf", ["2_ins"] = "ist|of|second|actv|inf", ["3_ine"] = "ine|of|third|actv|inf", ["3_ela"] = "ela|of|third|actv|inf", ["3_ill"] = "ill|of|third|actv|inf", ["3_ade"] = "ade|of|third|actv|inf", ["3_abe"] = "abe|of|third|actv|inf", ["3_ins"] = "ist|of|third|actv|inf", ["3_pasv_ins"] = "ist|of|third|pasv|inf", ["4"] = "vnoun", ["5"] = "fifth|inf" } local part_to_accel = { ["pres_part"] = "pres|actv|part", ["pres_pasv_part"] = "pres|pasv|part", ["past_part"] = "past|actv|part", ["past_pasv_part"] = "past|pasv|part", ["agnt_part"] = "agentpart", ["nega_part"] = "neg|part" } function convert_to_accel_inf(form) return inf_to_accel[sub(form, 4)] end function convert_to_accel_part(form) return "participle-" .. part_to_accel[form] end function convert_to_accel(form, vh) if match(form, "_perf") then -- all perf forms involve the past participle which we do not want -- to create manually return nil elseif form == "inf4" then return "vnoun-" .. vh elseif match(form, "^inf") then return convert_to_accel_inf(form) elseif match(form, "_part$") then return convert_to_accel_part(form) end -- imperative connegative is special if form == "impr_2sg_neg" then return "2|s|impr|conn" elseif match(form, "impr_%d%a%a_neg") then return "3|or|p|impr|conn" end -- split to tense/mood, person, extra local tmood, person, extra = unpack(mw.text.split(form, "_")) local tense, mood = "", tmood if tmood == "pres" or tmood == "past" then tense, mood = tmood .. "|", "indc" end -- negative/connegative? if extra == "neg" then local result = tense if person == "pasv" then result = result .. "pasv" else -- not passive => active (no distinction between person here) result = result .. "actv" end result = result .. "|" .. mood .. "|conn" return result end -- convert person if not passive person = gsub(person, "(%d)(%a)%a", "%1|%2") return person .. "|" .. tense .. mood end local poss_endings = { ["1s"] = "ni", ["2s"] = "si", ["1p"] = "mme", ["2p"] = "nne", ["3"] = "nsa" } local accel_prefixes = { ["1s"] = "1|s", ["2s"] = "2|s", ["1p"] = "1|p", ["2p"] = "2|p", ["3"] = "3" } -- Make the table function make_table(data) local vh = data.vh local function show_form(form, accel_form) if not form then return "&mdash;" elseif type(form) ~= "table" then error("a non-table value was given in the list of inflected forms.") end local ret = {} for key, subform in ipairs(form) do if find(subform, "¤") then subform = gsub(subform, "¤", "") end local accel = (accel_form and not data.no_accel) and accel_form or nil table.insert(ret, make_link(subform, accel)) end return table.concat(ret, "<br/>") end local function make_and_show_poss_table(form, vh, accel_suffix) local short if find(form, "([aäe])¤") then short = gsub(form, "([aäe])¤", "%1%1n") end local function poss_repl(mode) local ending = poss_endings[mode] if find(ending, "a") then ending = gsub(ending, "a", vh) end local forms = {(gsub(form, "¤", ending))} if mode == "3" and short then table.insert(forms, 1, short) end local ret = {} for key, subform in ipairs(forms) do local accel = (accel_suffix and not data.no_accel) and accel_prefixes[mode] .. "|form|of|" .. accel_suffix or nil table.insert(ret, make_link(subform, accel)) end return table.concat(ret, "<br/>") end local poss_table_wikicode = [=[ {| class="inflection-table vsSwitcher fi-conj-poss" data-toggle-category="possessive inflection" |- class="fi-conj-poss-header" ! class="vsToggleElement fi-conj-poss-toggle" colspan="3" | Dạng sở hữu |- class="vsHide" ! ngôi ! số ít ! số nhiều |- class="vsHide" ! 1 | {{{1s}}} | {{{1p}}} |- class="vsHide" ! 2 | {{{2s}}} | {{{2p}}} |- class="vsHide" ! 3 | colspan="2" | {{{3}}} |}]=] return gsub(poss_table_wikicode, "{{{([a-z0-9_:]+)}}}", poss_repl) end local function repl(param) if param == "lemma" then return (data.is_appendix and make_link(data.pagename) or tag_term(data.pagename)) elseif param == "info" then return data.title and " (" .. data.title .. ")" or "" elseif param == "extranotes" then if data.extranotes and #data.extranotes > 0 then return "<br/>\n" .. table.concat(data.extranotes, "<br/>\n") else return "" end elseif find(param, "^m_") then return tag_term(sub(param, 3)) elseif find(param, "^poss_") then local result = "" local accel_suffix = convert_to_accel(sub(param, 6), nil) for _, subform in ipairs(data.forms[sub(param, 6)]) do result = result .. make_and_show_poss_table(subform, vh, accel_suffix) .. "\n" end return result else return show_form(data.forms[param], convert_to_accel(param, vh)) end end local wikicode = [=[ <div class="noresize"> {| class="inflection-table vsSwitcher fi-conj" data-toggle-category="conjugation" |- ! class="vsToggleElement" colspan="7" | [[Phụ lục:Biến thể hình thái động từ tiếng Phần Lan|Biến tố]] của {{{lemma}}}{{{info}}} |- class="vsHide" ! colspan="7" | trần thuật |- class="vsHide" ! colspan="4" | thì hiện tại ! colspan="3" | hoàn thành |- class="vsHide" ! class="fi-conj-header-person" colspan="2" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định ! class="fi-conj-header-person" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{pres_1sg}}} | data-accel-col="2" | {{{pres_1sg_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{pres_perf_1sg}}} | data-accel-col="4" | {{{pres_perf_1sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{pres_2sg}}} | data-accel-col="2" | {{{pres_2sg_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{pres_perf_2sg}}} | data-accel-col="4" | {{{pres_perf_2sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số ít | data-accel-col="1" | {{{pres_3sg}}} | data-accel-col="2" | {{{pres_3sg_neg}}} ! ngôi thứ ba số ít | data-accel-col="3" | {{{pres_perf_3sg}}} | data-accel-col="4" | {{{pres_perf_3sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ nhất số nhiều | data-accel-col="1" | {{{pres_1pl}}} | data-accel-col="2" | {{{pres_1pl_neg}}} ! ngôi thứ nhất số nhiều | data-accel-col="3" | {{{pres_perf_1pl}}} | data-accel-col="4" | {{{pres_perf_1pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số nhiều | data-accel-col="1" | {{{pres_2pl}}} | data-accel-col="2" | {{{pres_2pl_neg}}} ! ngôi thứ hai số nhiều | data-accel-col="3" | {{{pres_perf_2pl}}} | data-accel-col="4" | {{{pres_perf_2pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{pres_3pl}}} | data-accel-col="2" | {{{pres_3pl_neg}}} ! ngôi thứ ba số nhiều | data-accel-col="3" | {{{pres_perf_3pl}}} | data-accel-col="4" | {{{pres_perf_3pl_neg}}} |- class="vsHide" ! colspan="2" | bị động không ngôi | data-accel-col="1" | {{{pres_pasv}}} | data-accel-col="2" | {{{pres_pasv_neg}}} ! bị động không ngôi | data-accel-col="3" | {{{pres_perf_pasv}}} | data-accel-col="4" | {{{pres_perf_pasv_neg}}} |- class="vsHide" ! colspan="4" | thì quá khứ ! colspan="3" | hoàn thành số nhiều |- class="vsHide" ! class="fi-conj-header-person" colspan="2" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định ! class="fi-conj-header-person" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{past_1sg}}} | data-accel-col="2" | {{{past_1sg_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{past_perf_1sg}}} | data-accel-col="4" | {{{past_perf_1sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{past_2sg}}} | data-accel-col="2" | {{{past_2sg_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{past_perf_2sg}}} | data-accel-col="4" | {{{past_perf_2sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số ít | data-accel-col="1" | {{{past_3sg}}} | data-accel-col="2" | {{{past_3sg_neg}}} ! ngôi thứ ba số ít | data-accel-col="3" | {{{past_perf_3sg}}} | data-accel-col="4" | {{{past_perf_3sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{past_1pl}}} | data-accel-col="2" | {{{past_1pl_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{past_perf_1pl}}} | data-accel-col="4" | {{{past_perf_1pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{past_2pl}}} | data-accel-col="2" | {{{past_2pl_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{past_perf_2pl}}} | data-accel-col="4" | {{{past_perf_2pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{past_3pl}}} | data-accel-col="2" | {{{past_3pl_neg}}} ! ngôi thứ ba số nhiều | data-accel-col="3" | {{{past_perf_3pl}}} | data-accel-col="4" | {{{past_perf_3pl_neg}}} |- class="vsHide" ! colspan="2" | bị động không ngôi | data-accel-col="1" | {{{past_pasv}}} | data-accel-col="2" | {{{past_pasv_neg}}} ! bị động không ngôi | data-accel-col="3" | {{{past_perf_pasv}}} | data-accel-col="4" | {{{past_perf_pasv_neg}}} |- class="vsHide" ! colspan="7" | lối điều kiện |- class="vsHide" ! colspan="4" | hiện tại ! colspan="3" | hoàn thành |- class="vsHide" ! class="fi-conj-header-person" colspan="2" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định ! class="fi-conj-header-person" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{cond_1sg}}} | data-accel-col="2" | {{{cond_1sg_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{cond_perf_1sg}}} | data-accel-col="4" | {{{cond_perf_1sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{cond_2sg}}} | data-accel-col="2" | {{{cond_2sg_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{cond_perf_2sg}}} | data-accel-col="4" | {{{cond_perf_2sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số ít | data-accel-col="1" | {{{cond_3sg}}} | data-accel-col="2" | {{{cond_3sg_neg}}} ! ngôi thứ ba số ít | data-accel-col="3" | {{{cond_perf_3sg}}} | data-accel-col="4" | {{{cond_perf_3sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{cond_1pl}}} | data-accel-col="2" | {{{cond_1pl_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{cond_perf_1pl}}} | data-accel-col="4" | {{{cond_perf_1pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{cond_2pl}}} | data-accel-col="2" | {{{cond_2pl_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{cond_perf_2pl}}} | data-accel-col="4" | {{{cond_perf_2pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{cond_3pl}}} | data-accel-col="2" | {{{cond_3pl_neg}}} ! ngôi thứ ba số nhiều | data-accel-col="3" | {{{cond_perf_3pl}}} | data-accel-col="4" | {{{cond_perf_3pl_neg}}} |- class="vsHide" ! colspan="2" | bị động không ngôi | data-accel-col="1" | {{{cond_pasv}}} | data-accel-col="2" | {{{cond_pasv_neg}}} ! bị động không ngôi | data-accel-col="3" | {{{cond_perf_pasv}}} | data-accel-col="4" | {{{cond_perf_pasv_neg}}} |- class="vsHide" ! colspan="7" | lối mệnh mệnh |- class="vsHide" ! colspan="4" | hiện tại ! colspan="3" | hoàn thành |- class="vsHide" ! class="fi-conj-header-person" colspan="2" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định ! class="fi-conj-header-person" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | &mdash; | &mdash; ! ngôi thứ nhất số ít | &mdash; | &mdash; |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{impr_2sg}}} | data-accel-col="2" | {{{impr_2sg_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | &mdash; | data-accel-col="4" | &mdash; |- class="vsHide" ! colspan="2" | ngôi thứ ba số ít | data-accel-col="1" | {{{impr_3sg}}} | data-accel-col="2" | {{{impr_3sg_neg}}} ! ngôi thứ ba số ít | data-accel-col="3" | {{{impr_perf_3sg}}} | data-accel-col="4" | {{{impr_perf_3sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{impr_1pl}}} | data-accel-col="2" | {{{impr_1pl_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | &mdash; | data-accel-col="4" | &mdash; |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{impr_2pl}}} | data-accel-col="2" | {{{impr_2pl_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | &mdash; | data-accel-col="4" | &mdash; |- class="vsHide" ! colspan="2" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{impr_3pl}}} | data-accel-col="2" | {{{impr_3pl_neg}}} ! ngôi thứ ba số nhiều | data-accel-col="3" | {{{impr_perf_3pl}}} | data-accel-col="4" | {{{impr_perf_3pl_neg}}} |- class="vsHide" ! colspan="2" | bị động không ngôi | data-accel-col="1" | {{{impr_pasv}}} | data-accel-col="2" | {{{impr_pasv_neg}}} ! bị động không ngôi | data-accel-col="3" | {{{impr_perf_pasv}}} | data-accel-col="4" | {{{impr_perf_pasv_neg}}} |- class="vsHide" ! colspan="7" | lối lịch sự |- class="vsHide" ! colspan="4" | hiện tại ! colspan="3" | hoàn thành |- class="vsHide" ! class="fi-conj-header-person" colspan="2" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định ! class="fi-conj-header-person" | ngôi ! class="fi-conj-header-posneg thsub" | khẳng định ! class="fi-conj-header-posneg thsub" | phủ định |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{potn_1sg}}} | data-accel-col="2" | {{{potn_1sg_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{potn_perf_1sg}}} | data-accel-col="4" | {{{potn_perf_1sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{potn_2sg}}} | data-accel-col="2" | {{{potn_2sg_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{potn_perf_2sg}}} | data-accel-col="4" | {{{potn_perf_2sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số ít | data-accel-col="1" | {{{potn_3sg}}} | data-accel-col="2" | {{{potn_3sg_neg}}} ! ngôi thứ ba số ít | data-accel-col="3" | {{{potn_perf_3sg}}} | data-accel-col="4" | {{{potn_perf_3sg_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ nhất số ít | data-accel-col="1" | {{{potn_1pl}}} | data-accel-col="2" | {{{potn_1pl_neg}}} ! ngôi thứ nhất số ít | data-accel-col="3" | {{{potn_perf_1pl}}} | data-accel-col="4" | {{{potn_perf_1pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ hai số ít | data-accel-col="1" | {{{potn_2pl}}} | data-accel-col="2" | {{{potn_2pl_neg}}} ! ngôi thứ hai số ít | data-accel-col="3" | {{{potn_perf_2pl}}} | data-accel-col="4" | {{{potn_perf_2pl_neg}}} |- class="vsHide" ! colspan="2" | ngôi thứ ba số nhiều | data-accel-col="1" | {{{potn_3pl}}} | data-accel-col="2" | {{{potn_3pl_neg}}} ! ngôi thứ ba số nhiều | data-accel-col="3" | {{{potn_perf_3pl}}} | data-accel-col="4" | {{{potn_perf_3pl_neg}}} |- class="vsHide" ! colspan="2" | bị động không ngôi | data-accel-col="1" | {{{potn_pasv}}} | data-accel-col="2" | {{{potn_pasv_neg}}} ! bị động không ngôi | data-accel-col="3" | {{{potn_perf_pasv}}} | data-accel-col="4" | {{{potn_perf_pasv_neg}}} |- class="vsHide" ! colspan="7" | Dạng danh tính |- class="vsHide" ! colspan="4" | nguyên mẫu ! colspan="3" | phân từ |- class="vsHide" ! colspan="2" | ! class="thsub" |chủ động ! class="thsub" |bị động ! ! class="thsub" |chủ động ! class="thsub" |bị động |- class="vsHide" ! colspan="2" | ngôi thứ nhất | data-accel-col="1" colspan="2" | {{{inf1}}} ! hiện tại | data-accel-col="1" | {{{pres_part}}} | data-accel-col="1" | {{{pres_pasv_part}}} |- class="vsHide" ! colspan="2" | ngôi thứ nhất (dài)<sup>1</sup> | data-accel-col="1" colspan="2" | {{{poss_inf1_long}}} ! quá khứ | data-accel-col="1" | {{{past_part}}} | data-accel-col="1" | {{{past_pasv_part}}} |- class="vsHide" ! rowspan="3" | ngôi thứ hai ! class="thsub" rowspan="2" | [[inessive|định vị cách]]<sup>2</sup> | data-accel-col="1" | {{{inf2_ine}}} | data-accel-col="1" | {{{inf2_pasv_ine}}} ! tác nhân<sup>4</sup> | data-accel-col="1" colspan="2" | {{{agnt_part}}} |- class="vsHide" | data-accel-col="1" colspan="2" | {{{poss_inf2_ine}}} ! phủ định | data-accel-col="1" colspan="2" | {{{nega_part}}} |- class="vsHide" ! class="thsub" | [[instructive|hướng cách]] | data-accel-col="1" | {{{inf2_ins}}} | &mdash; | colspan="3" rowspan="10" class="fi-conj-notes" | <div style="white-space:normal;min-width:100%;max-width:min-content;"><sup>1)</sup> Chỉ dùng với dạng hậu tố sở hữu.<br/> <sup>2)</sup> Thường dùng với dạng hậu tố sở hữu (chỉ có ở chủ động).<br/> <sup>3)</sup> Một số dạng danh động từ có thể là 'nguyên mẫu ở ngôi thứ tư' (xem [[Phụ lục:Biến thể hình thái động từ tiếng Phần Lan#Nguyên mẫu ở ngôi thứ tư|phụ lục]]).<br/> <sup>4)</sup> Thường dùng với dạng hậu tố sở hữu. Không phải tất cả động từ đều có, đặc biệt là ở nội động từ (xem [[Phụ lục:Phân từ tiếng Phần Lan#Phân từ tác nhân|phụ lục]]). Danh từ có sự khác biệt rõ ràng với hậu tố {{{m_-ma}}} và dạng nguyên mẫu ở ngôi thứ ba.{{{extranotes}}}</div> |- class="vsHide" ! rowspan="6" | ngôi thứ ba ! class="thsub" | [[inessive|định vị cách]] | data-accel-col="1" | {{{inf3_ine}}} | &mdash; |- class="vsHide" ! class="thsub" | [[elative|xuất cách]] | data-accel-col="1" | {{{inf3_ela}}} | &mdash; |- class="vsHide" ! class="thsub" | [[illative|nhập cách]] | data-accel-col="1" | {{{inf3_ill}}} | &mdash; |- class="vsHide thsub" | ! class="thsub" | [[adessive|cách kế cận]] | data-accel-col="1" | {{{inf3_ade}}} | &mdash; |- class="vsHide thsub" | ! class="thsub" | [[abessive|vô cách]] | data-accel-col="1" | {{{inf3_abe}}} | &mdash; |- class="vsHide thsub" | ! class="thsub" | [[instructive|hướng cách]] | data-accel-col="1" | {{{inf3_ins}}} | data-accel-col="1" | {{{inf3_pasv_ins}}} |- class="vsHide thsub" | ! ngôi thứ tư<sup>3</sup> ! class="thsub" | danh động từ | colspan="2" data-accel-col="1" | {{{inf4}}} |- class="vsHide thsub" | ! colspan="2" | ngôi thứ năm<sup>1</sup> | colspan="2" data-accel-col="1" | {{{poss_inf5}}} |} </div>]=] return gsub(wikicode, "{{{([a-z0-9_-]+)}}}", repl) end return export auer66lvtl5l12dzci3r0y8tb3qun9j Từ tái tạo:Tiếng Munda nguyên thủy/daˀk 0 378237 2345180 2337427 2026-04-14T07:39:37Z WhoAlone 40420 2345180 wikitext text/x-wiki {{reconstruction}} =={{langname|mun-pro}}== ==={{section|etym}}=== {{inh+|mun-pro|aav-pro|*ɗaːkʔ}}. ==={{section|n}}=== '''*daˀk'''{{cln|mun-pro|Mục từ|Danh từ}} # [[nước|Nước]]. ===={{section|desc}}==== {{top2}} * Bắc Munda: ** Kherwaria: *** {{desc|biy|दाः}} *** {{desc|hoc|𑣔𑣁𑣄|tr=daʔ}} *** {{desc|kfp|dak}} *** {{desc|unr|दाः}} *** {{desc|sat|ᱫᱟᱜ}} ** {{desc|kfq|daʔ}} * Nam Munda: ** Trung Munda: *** {{desc|jun|ଡକ୍|tr=ḍak}} *** {{desc|khr|डा'}} ** Munda Koraput: *** Bắc Koraput: **** {{desc|srb|𑃔𑃢𑃢|ts=daʔa}} *** Nam Koraput: **** {{desc|bfw||tr=daʔ}} **** {{desc|gbj||tr=daʔ}} {{bottom}} ==={{section|ref}}=== * {{cite-web|year=2019|last=Rau|first=Felix|work=Munda cognate set with proto-Munda reconstructions (0.1.0) [Data set]|url=https://zenodo.org/records/3380874}} * {{cite-web|year=2019|last=Rau|first=Felix|title=Advances in Munda historical phonology|url=https://doi.org/10.5281/ZENODO.3380907|work=Zenodo}} * {{cite-web|en|author=SEAlang Library|title=SEAlang Munda Languages Project|url=http://www.sealang.net/munda/dictionary/|year=n.d.|work=sealang.net}} __HIDDENCAT__ {{catname|Trang có|đề mục ngôn ngữ}} {{catname|Trang có|1 đề mục ngôn ngữ}} [[en:Reconstruction:Proto-Munda/daˀk]] kipam9zexetaaentgat894iq9ej0yuv あおさ 0 387028 2345054 2334326 2026-04-14T00:47:47Z WhoAlone 40420 2345054 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/aosa/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[rau diếp]] [[xanh]]. ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} =={{langname|ja}}== {{ja-see|石蓴}} j7e4nr1jbua3djhds6llrj3t8ul97n1 liễu Chương Đài 0 390886 2345013 2342685 2026-04-13T14:37:05Z TheHighFighter2 42988 /* Danh từ */ 2345013 wikitext text/x-wiki =={{langname|vi}}== ==={{section|etym}}=== Lấy trong [[s:zh:寄柳氏|bài thơ]] của [[w:zh:韓翃|Hàn Hoành]] đời Đường gửi cho Liễu thị. ==={{section|pron}}=== {{vi-IPA}} ==={{section|noun}}=== {{vi-noun|head=[[liễu]] Chương Đài|柳章臺}} # {{nhãn|vi|nghĩa bóng|thơ ca}} [[người yêu|Người yêu]], [[tình nhân]]. #: {{syn|vi|khách Chương Đài}} #* {{RQ:Truyện Kiều|year_published=1866|line=1261-1262|passage=欺𧗱𠳨'''柳章臺'''</br>梗春㐌𢯏朱𠊛專𢬣|tr=Khi về hỏi '''liễu Chương Đài''',</br>Cành xuân đã bẻ cho người chuyên tay!}} #* {{w|Nguyễn Khuyến}}, ''[[s:Văn đàn bảo giám/Quyển thứ nhất/Lục bát|Chế bác đồ mắc lừa gái]]'': #*: {{quote|vi|Từ ngày gặp '''liễu chương-đài''',</br>Càng sâu nghĩa bể, càng dài tình sông.}} tt1rehympc872ynaclebkyzztdc4f7r hanulo 0 391781 2344921 2343234 2026-04-13T12:01:37Z Hiyuune 50834 /* Tiếng Ido */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344921 wikitext text/x-wiki =={{langname|io}}== ==={{đm|etym}}=== {{suffix|io|hano|gloss1=gà|ulo|pos2=hậu tố giống đực}} ==={{đm|noun}}=== {{io-noun|hanul}} # [[gà trống|Gà trống]]. rlzyqylr0ctr6orqxxid3hx7vmyw23c ཉ་ཤ 0 392786 2344919 2026-04-13T11:59:18Z Hiyuune 50834 + bo 2344919 wikitext text/x-wiki {{also|ཉི་ཤུ}} =={{langname|bo}}== ==={{section|etym}}=== {{compound|bo|ཉ|ཤ}} ==={{section|pron}}=== {{rfp|bo}} ==={{section|n}}=== {{head|bo|Danh từ}} # [[thịt|Thịt]] [[cá]]. ==={{section|ref}}=== * {{R:THL|2=66688}} * {{R:TED}} 8a5bf0xu96qmmwemtoivicawk38jd9i hanuli 0 392787 2344920 2026-04-13T12:01:01Z Hiyuune 50834 + io 2344920 wikitext text/x-wiki =={{langname|io}}== ==={{section|noun}}=== {{head|io|Biến thể hình thái danh từ}} # {{plural of|io|hanulo}} m21n1jete06t7bitl4b72imtbki9bzd Thể loại:Vần:Tiếng Lào/ek̚ 14 392788 2344923 2026-04-13T12:03:23Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2344923 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx ເຄັກ 0 392789 2344924 2026-04-13T12:04:54Z Hiyuune 50834 + lo 2344924 wikitext text/x-wiki =={{langname|lo}}== ==={{section|etym}}=== Từ {{bor|lo|en|cake}}. ==={{section|pron}}=== {{lo-pron}} ==={{section|noun}}=== {{lo-noun}} # [[bánh|Bánh]]. ===={{section|rel}}==== * {{l|lo|ກັຜເຄ້ກ}} 6hxin21qgracgmm0wc2no6sae4kprq0 𑜫 0 392790 2344925 2026-04-13T12:06:29Z Hiyuune 50834 Trang mới: “{{character info}} =={{langname|aho}}== ==={{section|letter}}=== {{head|aho|Chữ cái}} # {{w|Virama}}.” 2344925 wikitext text/x-wiki {{character info}} =={{langname|aho}}== ==={{section|letter}}=== {{head|aho|Chữ cái}} # {{w|Virama}}. beushl0zeh197wm1ni2da84mvgxawrh 𑜰 0 392791 2344926 2026-04-13T12:08:06Z Hiyuune 50834 Trang mới: “{{character info}} =={{langname|aho}}== ==={{section|num}}=== {{head|aho|Số từ}} # Số [[không]] (0). {{cln|aho|Ký tự số}}” 2344926 wikitext text/x-wiki {{character info}} =={{langname|aho}}== ==={{section|num}}=== {{head|aho|Số từ}} # Số [[không]] (0). {{cln|aho|Ký tự số}} rqy0yd7qz0vvd6bxqi1sb7kwj2h5n3u 𑜱 0 392792 2344927 2026-04-13T12:09:44Z Hiyuune 50834 Trang mới: “{{character info}} =={{langname|aho}}== ==={{section|num}}=== {{head|aho|Số từ|từ|𑜎𑜢𑜤𑜂𑜫}} # [[một|Một]] (1). {{cln|aho|Ký tự số}}” 2344927 wikitext text/x-wiki {{character info}} =={{langname|aho}}== ==={{section|num}}=== {{head|aho|Số từ|từ|𑜎𑜢𑜤𑜂𑜫}} # [[một|Một]] (1). {{cln|aho|Ký tự số}} ef9eu8dz2cz6d4jwunj9hkegxhc6fnz 𑜎𑜢𑜤𑜂𑜫 0 392793 2344928 2026-04-13T12:11:59Z Hiyuune 50834 Trang mới: “=={{langname|aho}}== {{cardinalbox|aho||𑜱|𑜲||𑜏𑜨𑜂𑜫}} ==={{section|etym}} 1=== Từ {{inh|aho|tai-pro|*nɯːŋᴮ||một}}. Cùng gốc với {{cog|th|หนึ่ง}}, {{cog|nod|ᨶᩧ᩠᩵ᨦ}}, {{cog|lo|ໜຶ່ງ}} hoặc {{mention|lo|ນຶ່ງ}}, {{cog|khb|ᦓᦹᧂᧈ}}, {{cog|shn|ၼိုင်ႈ}}, {{cog|aio|လိုင်}}, {{cog|zzj|nwngq}}. ===={{section|num}}==== {{head|aho|Số từ}} # [[một|Một]]. ====={{section|see}}=====…” 2344928 wikitext text/x-wiki =={{langname|aho}}== {{cardinalbox|aho||𑜱|𑜲||𑜏𑜨𑜂𑜫}} ==={{section|etym}} 1=== Từ {{inh|aho|tai-pro|*nɯːŋᴮ||một}}. Cùng gốc với {{cog|th|หนึ่ง}}, {{cog|nod|ᨶᩧ᩠᩵ᨦ}}, {{cog|lo|ໜຶ່ງ}} hoặc {{mention|lo|ນຶ່ງ}}, {{cog|khb|ᦓᦹᧂᧈ}}, {{cog|shn|ၼိုင်ႈ}}, {{cog|aio|လိုင်}}, {{cog|zzj|nwngq}}. ===={{section|num}}==== {{head|aho|Số từ}} # [[một|Một]]. ====={{section|see}}===== * {{l|aho|𑜱}} ==={{section|etym}} 2=== Từ {{inh|aho|tai-pro|*ʰlɯəŋᴬ||màu vàng}}. Cùng gốc với {{cog|th|เหลือง}}, {{cog|lo|ເຫຼືອງ}}, {{cog|khb|ᦵᦜᦲᧂ}}, {{cog|shn|လိူင်}}, {{cog|za|lieng}}. ===={{section|adj}}==== {{head|aho|Tính từ}} # Màu [[vàng]]. {{C|aho|Màu sắc}} 3zgvkee5r3vo2leace8hqce8g9byhi4 သွင် 0 392794 2344929 2026-04-13T12:13:32Z Hiyuune 50834 Trang mới: “=={{langname|shn}}== {{cardinalbox|shn|႑|႒|႓|ၼိုင်ႈ|သၢမ်|ord=ထီႉသွင်}} ==={{section|etym}}=== Từ {{inh|shn|tai-pro|*soːŋᴬ}}, từ {{der|shn|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|tdd|ᥔᥩᥒᥴ}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}. ==={{section|pron}}=== {{shn-pron…” 2344929 wikitext text/x-wiki =={{langname|shn}}== {{cardinalbox|shn|႑|႒|႓|ၼိုင်ႈ|သၢမ်|ord=ထီႉသွင်}} ==={{section|etym}}=== Từ {{inh|shn|tai-pro|*soːŋᴬ}}, từ {{der|shn|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|tdd|ᥔᥩᥒᥴ}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}. ==={{section|pron}}=== {{shn-pron|audio=shn-{{PAGENAME}}.wav}} ==={{section|num}}=== {{head|shn|Số từ}} # {{cln|shn|Số đếm}} [[hai|Hai]]. rtjosht980fc9z8s55ju40eom3uwz9b ᥔᥩᥒᥴ 0 392795 2344930 2026-04-13T12:15:07Z Hiyuune 50834 + tdd 2344930 wikitext text/x-wiki =={{langname|tdd}}== ==={{section|etym}}=== Từ {{inh|tdd|tai-pro|*soːŋᴬ}}, từ {{der|tdd|ltc|-}} {{ltc-l|雙|[[hai]]}}. Cùng gốc với {{cog|th|สอง}}, {{cog|nod|ᩈᩬᨦ}}, {{cog|lo|ສອງ}}, {{cog|khb|ᦉᦸᧂ}}, {{cog|blt|ꪎꪮꪉ}}, {{cog|shn|သွင်}}, {{cog|aho|𑜏𑜨𑜂𑜫}}, {{cog|pcc|soongl}}, {{cog|za|song}}. ==={{section|num}}=== {{tdd-num}} # [[hai|Hai]]. 1mo1v7oh6us2z9zki82cay1sbuzkgr7 dodošajai 0 392796 2344934 2026-04-13T12:25:27Z Hiyuune 50834 + lv 2344934 wikitext text/x-wiki =={{langname|lv}}== ==={{section|ptcp}}=== {{head|lv|Biến thể hình thái phân từ}} # {{infl of|lv|dodošais||dat|ở|f|s}} mptavzo49uuc9qca311t51xq0tecbjq dodošais 0 392797 2344935 2026-04-13T12:28:01Z Hiyuune 50834 Trang mới: “=={{langname|lv}}== ==={{section|ptcp}}=== {{head|lv|Phân từ|bất định|dodošs|phó từ|dodoši}} # {{participle of|lv|dot||pres|def|act}} ===={{section|decl}}==== {{lv-decl-part|dod|oš|def|extrawidth=-100}}” 2344935 wikitext text/x-wiki =={{langname|lv}}== ==={{section|ptcp}}=== {{head|lv|Phân từ|bất định|dodošs|phó từ|dodoši}} # {{participle of|lv|dot||pres|def|act}} ===={{section|decl}}==== {{lv-decl-part|dod|oš|def|extrawidth=-100}} 4rkcbcpprkcl6q607617prkpdalr0ad Bản mẫu:lv-decl-part-table 10 392798 2344936 2026-04-13T12:30:36Z Hiyuune 50834 Trang mới: “{{inflection-table-top|title={{#switch:{{{31|}}}|def=Biến cách xác định {{small|([[noteiktā]] [[galotne]])}}|raw=Declension|#default=Biến cách bất định {{small|([[nenoteiktā]] [[galotne]])}}}} của {{mention|lv|{{pagename}}}}|palette=blue|tall=yes}} ! class="outer" | ! class="outer" colspan="2" | giống đực {{small|({{l|lv|vīrietis|vīriešu}} {{l|lv|dzimte}})}} | class="separator" rowspan="999" | ! class="outer" colspan="2" | giống cái {{small|(…” 2344936 wikitext text/x-wiki {{inflection-table-top|title={{#switch:{{{31|}}}|def=Biến cách xác định {{small|([[noteiktā]] [[galotne]])}}|raw=Declension|#default=Biến cách bất định {{small|([[nenoteiktā]] [[galotne]])}}}} của {{mention|lv|{{pagename}}}}|palette=blue|tall=yes}} ! class="outer" | ! class="outer" colspan="2" | giống đực {{small|({{l|lv|vīrietis|vīriešu}} {{l|lv|dzimte}})}} | class="separator" rowspan="999" | ! class="outer" colspan="2" | giống cái {{small|({{l|lv|sieviete|sieviešu}} {{l|lv|dzimte}})}} |- ! ! số ít<br>{{small|({{l|lv|vienskaitlis}})}} ! số nhiều<br>{{small|({{l|lv|daudzskaitlis}})}} ! số ít<br>{{small|({{l|lv|vienskaitlis}})}} ! số nhiều<br>{{small|({{l|lv|daudzskaitlis}})}} |- ! [[nominative|danh cách]] | {{#ifeq:{{{1|}}}|—|—|{{l|lv|{{{1}}}}}}} | {{#ifeq:{{{2|}}}|—|—|{{l|lv|{{{2}}}}}}} | {{#ifeq:{{{3|}}}|—|—|{{l|lv|{{{3}}}}}}} | {{#ifeq:{{{4|}}}|—|—|{{l|lv|{{{4}}}}}}} |- ! [[genitive|sinh cách]] | {{#ifeq:{{{9|}}}|—|—|{{l|lv|{{{9}}}}}}} | {{#ifeq:{{{10|}}}|—|—|{{l|lv|{{{10}}}}}}} | {{#ifeq:{{{11|}}}|—|—|{{l|lv|{{{11}}}}}}} | {{#ifeq:{{{12|}}}|—|—|{{l|lv|{{{12}}}}}}} |- ! [[dative|dữ cách]] | {{#ifeq:{{{13|}}}|—|—|{{l|lv|{{{13}}}}}}} | {{#ifeq:{{{14|}}}|—|—|{{l|lv|{{{14}}}}}}} | {{#ifeq:{{{15|}}}|—|—|{{l|lv|{{{15}}}}}}} | {{#ifeq:{{{16|}}}|—|—|{{l|lv|{{{16}}}}}}} |- ! [[accusative|đối cách]] | {{#ifeq:{{{5|}}}|—|—|{{l|lv|{{{5}}}}}}} | {{#ifeq:{{{6|}}}|—|—|{{l|lv|{{{6}}}}}}} | {{#ifeq:{{{7|}}}|—|—|{{l|lv|{{{7}}}}}}} | {{#ifeq:{{{8|}}}|—|—|{{l|lv|{{{8}}}}}}} |- ! [[instrumental|cách công cụ]] | {{#ifeq:{{{17|}}}|—|—|{{l|lv|{{{17}}}}}}} | {{#ifeq:{{{18|}}}|—|—|{{l|lv|{{{18}}}}}}} | {{#ifeq:{{{19|}}}|—|—|{{l|lv|{{{19}}}}}}} | {{#ifeq:{{{20|}}}|—|—|{{l|lv|{{{20}}}}}}} |- ! [[locative|định vị cách]] | {{#ifeq:{{{21|}}}|—|—|{{l|lv|{{{21}}}}}}} | {{#ifeq:{{{22|}}}|—|—|{{l|lv|{{{22}}}}}}} | {{#ifeq:{{{23|}}}|—|—|{{l|lv|{{{23}}}}}}} | {{#ifeq:{{{24|}}}|—|—|{{l|lv|{{{24}}}}}}} |- ! [[vocative|hô cách]] | {{#switch:{{{31|}}}|def={{l|lv|{{{25}}}}}, {{l|lv|{{{26}}}}}|raw={{#if:{{{25|}}}|{{l|lv|{{{25}}}}}|—}}|—}} | {{#switch:{{{31|}}}|def={{l|lv|{{{27}}}}}|raw={{#if:{{{27|}}}|{{l|lv|{{{27}}}}}|—}}|—}} | {{#switch:{{{31|}}}|def={{l|lv|{{{28}}}}}, {{l|lv|{{{29}}}}}|raw={{#if:{{{28|}}}|{{l|lv|{{{28}}}}}|—}}|—}} | {{#switch:{{{31|}}}|def={{l|lv|{{{30}}}}}|raw={{#if:{{{30|}}}|{{l|lv|{{{30}}}}}|—}}|—}} {{inflection-table-bottom}}<!-- -->{{#ifeq:{{{2|}}}|def|[[Thể loại:Biến thể hình thái phân từ tiếng Latvia]]}}<!-- --> <noinclude> {{tcat|adecl:*}} </noinclude> fpbw1gs9r5nzy6yz239jmsekxk56xow Bản mẫu:lv-decl-part-past-pass 10 392799 2344937 2026-04-13T12:32:18Z Hiyuune 50834 Trang mới: “{{lv-decl-part-table |1={{{1}}}{{#ifeq:{{{2|}}}|def|ai}}s |2={{{1}}}i{{#ifeq:{{{2|}}}|def|e}} |3={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |4={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |5={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |6={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}}s |7={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |8={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |9={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |10={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |11={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |12={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}}…” 2344937 wikitext text/x-wiki {{lv-decl-part-table |1={{{1}}}{{#ifeq:{{{2|}}}|def|ai}}s |2={{{1}}}i{{#ifeq:{{{2|}}}|def|e}} |3={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |4={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |5={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |6={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}}s |7={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |8={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |9={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |10={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |11={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |12={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |13={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}am |14={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}iem |15={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ai |16={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ām |17={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |18={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}iem |19={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |20={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ām |21={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ā |22={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}os |23={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ā |24={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ās |25={{{1}}}o |26={{{1}}}ais |27={{{1}}}ie |28={{{1}}}o |29={{{1}}}ā |30={{{1}}}ās |31={{{2}}} |x={{{x|0}}}}}<!-- -->{{#ifeq:{{{2|}}}|def|[[Thể loại:Biến thể hình thái phân từ tiếng Latvia]]}}<!-- --><noinclude>{{tài liệu}}</noinclude> irmm0v1ljlryye10nz2av7ngufo368t Bản mẫu:lv-decl-part-pres-act 10 392800 2344938 2026-04-13T12:36:50Z Hiyuune 50834 Trang mới: “{{lv-decl-part-table |1={{{1}}}{{#ifeq:{{{2|}}}|def|ai}}s |2={{{1}}}i{{#ifeq:{{{2|}}}|def|e}} |3={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |4={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |5={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |6={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}}s |7={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |8={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |9={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |10={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |11={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |12={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}}…” 2344938 wikitext text/x-wiki {{lv-decl-part-table |1={{{1}}}{{#ifeq:{{{2|}}}|def|ai}}s |2={{{1}}}i{{#ifeq:{{{2|}}}|def|e}} |3={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |4={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |5={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |6={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}}s |7={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |8={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |9={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}} |10={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |11={{{1}}}{{#ifeq:{{{2|}}}|def|ā|a}}s |12={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |13={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}am |14={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}iem |15={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ai |16={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ām |17={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |18={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}iem |19={{{1}}}{{#ifeq:{{{2|}}}|def|o|u}} |20={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ām |21={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ā |22={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}os |23={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ā |24={{{1}}}{{#ifeq:{{{2|}}}|def|aj|}}ās |25={{{1}}}o |26={{{1}}}ais |27={{{1}}}ie |28={{{1}}}o |29={{{1}}}ā |30={{{1}}}ās |31={{{2}}} |x={{{x|0}}}}}<!-- -->{{#ifeq:{{{2|}}}|def|[[Thể loại:Biến thể hình thái phân từ tiếng Latvia]]}}<!-- --><noinclude>{{tài liệu}}</noinclude> irmm0v1ljlryye10nz2av7ngufo368t Bản mẫu:lv-decl-part 10 392801 2344939 2026-04-13T12:38:09Z Hiyuune 50834 Trang mới: “{{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{#switch:{{{2}}}|t={{lv-decl-part-past-pass|{{{1}}}t|{{{3|indef}}}|x={{{extrawidth|0}}}}}|tāk={{lv-decl-part-past-pass|{{{1}}}tāk|{{{3|indef}}}|x={{{extrawidth|0}}}}}|oš={{lv-decl-part-pres-act|{{{1}}}oš|{{{3|indef}}}|x={{{extrawidth|0}}}}}|ošāk={{lv-decl-part-pres-act|{{{1}}}ošāk|{{{3|indef}}}|x={{{extrawidth|0}}}}}|m={{lv-decl-part-pres-pass|{{{1}}}|{{{3|indef}}}|x={{{extrawidth|0}}}}}|is={{lv-dec…” 2344939 wikitext text/x-wiki {{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{#switch:{{{2}}}|t={{lv-decl-part-past-pass|{{{1}}}t|{{{3|indef}}}|x={{{extrawidth|0}}}}}|tāk={{lv-decl-part-past-pass|{{{1}}}tāk|{{{3|indef}}}|x={{{extrawidth|0}}}}}|oš={{lv-decl-part-pres-act|{{{1}}}oš|{{{3|indef}}}|x={{{extrawidth|0}}}}}|ošāk={{lv-decl-part-pres-act|{{{1}}}ošāk|{{{3|indef}}}|x={{{extrawidth|0}}}}}|m={{lv-decl-part-pres-pass|{{{1}}}|{{{3|indef}}}|x={{{extrawidth|0}}}}}|is={{lv-decl-part-past-act|{{{1}}}|{{{3|indef}}}|x={{{extrawidth|0}}}}}|ies={{lv-decl-part-past-act-refl|{{{1}}}|{{{3|indef}}}|x={{{extrawidth|0}}}}}|cis={{lv-decl-part-past-act|{{{1}}}|{{{3|indef}}}|k|x={{{extrawidth|0}}}}}|dzis={{lv-decl-part-past-act|{{{1}}}|{{{3|indef}}}|g|x={{{extrawidth|0}}}}}}}<noinclude>{{tài liệu}}</noinclude> 95uisavg5h4sk9va1frl030qfui5574 欲さい 0 392802 2344940 2026-04-13T12:38:46Z WhoAlone 40420 Trang mới: “=={{langname|kzg}}== {{kzg-kanjitab|ぷ|yomi=k}} ==={{ĐM|alter form}}=== * {{alt|kzg|欲しゃい|tr=pushai}} ==={{ĐM|etym}}=== Từ {{inh|kzg|jpx-ryu-pro|*posi|sort=ぷさい}}, từ {{inh|kzg|jpx-pro|*pəsi|sort=ぷさい}}. Cùng gốc với {{cog|ja|欲しい|tr=hoshii|sort=ぷさい}}. ==={{ĐM|pron}}=== * {{IPA4|kzg|/pusai/}} ==={{ĐM|adj}}=== {{kzg-head|adjective|ぷさい}} # [[mong muốn]], [[khao khát]]. ==={{ĐM|ref}}=== * {{cite-book|ja|author=ja:岩…” 2344940 wikitext text/x-wiki =={{langname|kzg}}== {{kzg-kanjitab|ぷ|yomi=k}} ==={{ĐM|alter form}}=== * {{alt|kzg|欲しゃい|tr=pushai}} ==={{ĐM|etym}}=== Từ {{inh|kzg|jpx-ryu-pro|*posi|sort=ぷさい}}, từ {{inh|kzg|jpx-pro|*pəsi|sort=ぷさい}}. Cùng gốc với {{cog|ja|欲しい|tr=hoshii|sort=ぷさい}}. ==={{ĐM|pron}}=== * {{IPA4|kzg|/pusai/}} ==={{ĐM|adj}}=== {{kzg-head|adjective|ぷさい}} # [[mong muốn]], [[khao khát]]. ==={{ĐM|ref}}=== * {{cite-book|ja|author=ja:岩倉市郎|title=ja:喜界島方言集|trans-title=Kikai-jima Dialect Collection|publisher=ja:中央公論社|year=1941|url=https://dl.ndl.go.jp/pid/1852965|page=251}} ktaiwe6yc32tajdvwm61c22qg9f7vsr 欲しゃい 0 392803 2344941 2026-04-13T12:39:50Z WhoAlone 40420 Trang mới: “=={{langname|kzg}}== {{kzg-kanjitab}} ==={{ĐM|adj}}=== {{kzg-head|adjective|ぷしゃい}} # {{alt form|kzg|欲さい}}” 2344941 wikitext text/x-wiki =={{langname|kzg}}== {{kzg-kanjitab}} ==={{ĐM|adj}}=== {{kzg-head|adjective|ぷしゃい}} # {{alt form|kzg|欲さい}} neg9nolzpbo7pakv9q7i5zpa06pyyll Thể loại:Từ không có yomi tiếng Kikai 14 392804 2344942 2026-04-13T12:40:28Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2344942 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với kanji lớp 6 tiếng Kikai 14 392805 2344943 2026-04-13T12:40:41Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2344943 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với kanji lớp 6 theo ngôn ngữ 14 392806 2344944 2026-04-13T12:41:12Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2344944 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx ぷさい 0 392807 2344945 2026-04-13T12:42:13Z WhoAlone 40420 Trang mới: “=={{langname|kzg}}== ==={{ĐM|adj}}=== {{kzg-head|adjective}} # {{kzg-def|欲さい}} [[mong muốn]], [[khao khát]].” 2344945 wikitext text/x-wiki =={{langname|kzg}}== ==={{ĐM|adj}}=== {{kzg-head|adjective}} # {{kzg-def|欲さい}} [[mong muốn]], [[khao khát]]. o202trijfr6jp6ffkdaqiotq9rfhbdf ぷしゃい 0 392808 2344946 2026-04-13T12:42:31Z WhoAlone 40420 Trang mới: “=={{langname|kzg}}== ==={{ĐM|adj}}=== {{kzg-head|adjective}} # {{kzg-def|欲しゃい}} [[mong muốn]], [[khao khát]].” 2344946 wikitext text/x-wiki =={{langname|kzg}}== ==={{ĐM|adj}}=== {{kzg-head|adjective}} # {{kzg-def|欲しゃい}} [[mong muốn]], [[khao khát]]. mdfiqbmi7xrcre6cv0td32ec187zj3q ラムドン 0 392809 2344948 2026-04-13T12:49:02Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{wikipedia|lang=ja|ラムドン省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Lâm Đồng}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Lâm Đồng|tỉnh|c/Việt Nam}}” 2344948 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|lang=ja|ラムドン省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Lâm Đồng}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Lâm Đồng|tỉnh|c/Việt Nam}} bevom7jelxkduw4d3qogfoty93ra5pi 2344966 2344948 2026-04-13T13:08:30Z Hiyuune 50834 /* Tiếng Nhật */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344966 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|ja:+省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Lâm Đồng}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Lâm Đồng|tỉnh|c/Việt Nam}} 1sbj4sxrxtsu5917jw070vqw5oq0kwl Mô đun:dum-verbs 828 392810 2344950 2026-04-13T12:52:38Z Hiyuune 50834 Trang mới: “local m_links = require("Module:links") local lang = require("Module:languages").getByCode("dum") local export = {} local function append(l, key, val) if not l[key] then l[key] = {} end table.insert(l[key], val) end local function checked(stem) local rest, vowel, cons = mw.ustring.match(stem, "^(.-)([aeiouâêîôûāēōë]+)([^aeiouâêîôûāēōë]+)$") if not rest then return stem end if mw.ustring.len(cons) == 1 and mw.ustring.len(vowel) == 1…” 2344950 Scribunto text/plain local m_links = require("Module:links") local lang = require("Module:languages").getByCode("dum") local export = {} local function append(l, key, val) if not l[key] then l[key] = {} end table.insert(l[key], val) end local function checked(stem) local rest, vowel, cons = mw.ustring.match(stem, "^(.-)([aeiouâêîôûāēōë]+)([^aeiouâêîôûāēōë]+)$") if not rest then return stem end if mw.ustring.len(cons) == 1 and mw.ustring.len(vowel) == 1 then if mw.ustring.find(vowel, "[âêāē]") then vowel = vowel .. "e" elseif mw.ustring.find(vowel, "[iî]") then vowel = vowel .. "j" elseif mw.ustring.find(vowel, "[ôō]") then vowel = vowel .. "o" elseif mw.ustring.find(vowel, "[uû]") then vowel = vowel .. "u" end end if cons == "w" then if mw.ustring.find(vowel, "[uû]$") then cons = "" else cons = "u" end end cons = mw.ustring.gsub(cons, "(.)%1", "%1") cons = mw.ustring.gsub(cons, "c?k$", "c") return rest .. vowel .. cons end local function free(stem) if mw.ustring.find(stem, "u?w$") then return (mw.ustring.gsub(stem, "u?w$", "u")) else return checked(stem) end end local function devoiced(stem) local rest, cons = mw.ustring.match(stem, "^(.-)([^aeiouâêîôûāēōë]+)$") if not rest then return stem end cons = mw.ustring.gsub(cons, "(.)%1", "%1") cons = mw.ustring.gsub(cons, "ng$", "nc") cons = mw.ustring.gsub(cons, "[bdgv]", {["b"] = "p", ["d"] = "t", ["g"] = "ch", ["v"] = "f"}) return rest .. cons end local function shortened(stem) local rest, vowel, cons = mw.ustring.match(stem, "^(.-)([aeiouâêîôûāēōë]+)([^aeiouâêîôûāēōë]+)$") if not rest then return stem end if mw.ustring.len(cons) == 1 then if mw.ustring.find(vowel, "^[aā]e?$") then vowel = "a" elseif mw.ustring.find(vowel, "^[eē]e?$") then vowel = "e" elseif mw.ustring.find(vowel, "^[oō]o?$") then vowel = "o" end end return rest .. vowel .. cons end function export.weak(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, --[2] = {required = true, default = "{{{2}}}", list = "past"}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = {forms = {}, info = "yếu", categories = {"Động từ yếu " .. lang:getCanonicalName()}} local stem_devoiced = devoiced(checked(args[1])) data.forms["inf"] = {args[1] .. "en"} data.forms["inf_gen"] = {args[1] .. "ens"} data.forms["inf_dat"] = {args[1] .. "ene"} data.forms["pres_indc_1s"] = {args[1] .. "e"} data.forms["pres_indc_2s"] = {stem_devoiced .. (mw.ustring.find(stem_devoiced, "s$") and "" or "s"), args[1] .. "es"} data.forms["pres_indc_3s"] = {stem_devoiced .. (mw.ustring.find(stem_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_indc_1p"] = {args[1] .. "en"} data.forms["pres_indc_2p"] = {stem_devoiced .. (mw.ustring.find(stem_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_indc_3p"] = {args[1] .. "en"} data.forms["pres_subj_1s"] = {args[1] .. "e"} data.forms["pres_subj_2s"] = {stem_devoiced .. (mw.ustring.find(stem_devoiced, "s$") and "" or "s"), args[1] .. "es"} data.forms["pres_subj_3s"] = {args[1] .. "e"} data.forms["pres_subj_1p"] = {args[1] .. "en"} data.forms["pres_subj_2p"] = {stem_devoiced .. (mw.ustring.find(stem_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_subj_3p"] = {args[1] .. "en"} data.forms["impr_s"] = {devoiced(free(args[1])), args[1] .. "e"} data.forms["impr_p"] = {stem_devoiced .. (mw.ustring.find(stem_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_ptcp"] = {args[1] .. "ende"} --[=[ for _, past in ipairs(args[2]) do append(data.forms, "past_indc_1s", past .. "e") append(data.forms, "past_indc_2s", past .. "es") append(data.forms, "past_indc_3s", past .. "e") append(data.forms, "past_indc_1p", past .. "en") append(data.forms, "past_indc_2p", past .. "et") append(data.forms, "past_indc_3p", past .. "en") append(data.forms, "past_subj_1s", past .. "e") append(data.forms, "past_subj_2s", past .. "es") append(data.forms, "past_subj_3s", past .. "e") append(data.forms, "past_subj_1p", past .. "en") append(data.forms, "past_subj_2p", past .. "et") append(data.forms, "past_subj_3p", past .. "en") append(data.forms, "past_ptcp", "ge" .. devoiced(past)) end ]=] return make_table(data) end function export.strong(frame) local params = { [1] = {required = true, default = "{{{1}}}"}, [2] = {required = true, default = "{{{2}}}"}, [3] = {required = true, default = "{{{3}}}"}, [4] = {required = true, default = "{{{4}}}"}, ["class"] = {}, } local args = require("Module:parameters").process(frame:getParent().args, params) local data = {forms = {}, info = (args["class"] and " lớp " .. args["class"] or "") .. " mạnh", categories = {"Động từ " .. (args["class"] and " lớp " .. args["class"] or "") .. " mạnh " .. lang:getCanonicalName()}} local pres_devoiced = devoiced(checked(args[1])) local pres_free = devoiced(free(args[1])) local impr_shortened = devoiced(free(shortened(args[1]))) local past_sg_devoiced = devoiced(free(args[2])) local past_pl_devoiced = devoiced(checked(args[3])) data.forms["inf"] = {args[1] .. "en"} data.forms["inf_gen"] = {args[1] .. "ens"} data.forms["inf_dat"] = {args[1] .. "ene"} data.forms["pres_indc_1s"] = {args[1] .. "e"} data.forms["pres_indc_2s"] = {pres_devoiced .. (mw.ustring.find(pres_devoiced, "s$") and "" or "s"), args[1] .. "es"} data.forms["pres_indc_3s"] = {pres_devoiced .. (mw.ustring.find(pres_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_indc_1p"] = {args[1] .. "en"} data.forms["pres_indc_2p"] = {pres_devoiced .. (mw.ustring.find(pres_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_indc_3p"] = {args[1] .. "en"} data.forms["pres_subj_1s"] = {args[1] .. "e"} data.forms["pres_subj_2s"] = {pres_devoiced .. (mw.ustring.find(pres_devoiced, "s$") and "" or "s"), args[1] .. "es"} data.forms["pres_subj_3s"] = {args[1] .. "e"} data.forms["pres_subj_1p"] = {args[1] .. "en"} data.forms["pres_subj_2p"] = {pres_devoiced .. (mw.ustring.find(pres_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_subj_3p"] = {args[1] .. "en"} data.forms["impr_s"] = {pres_free, args[1] .. "e"} if impr_shortened ~= pres_free then table.insert(data.forms["impr_s"], 1, impr_shortened) end data.forms["impr_p"] = {pres_devoiced .. (mw.ustring.find(pres_devoiced, "t$") and "" or "t"), args[1] .. "et"} data.forms["pres_ptcp"] = {args[1] .. "ende"} data.forms["past_indc_1s"] = {past_sg_devoiced} data.forms["past_indc_2s"] = {past_pl_devoiced .. (mw.ustring.find(past_pl_devoiced, "s$") and "" or "s"), args[3] .. "es"} data.forms["past_indc_3s"] = {past_sg_devoiced} data.forms["past_indc_1p"] = {args[3] .. "en"} data.forms["past_indc_2p"] = {past_pl_devoiced .. (mw.ustring.find(past_pl_devoiced, "t$") and "" or "t"), args[3] .. "et"} data.forms["past_indc_3p"] = {args[3] .. "en"} data.forms["past_subj_1s"] = {args[3] .. "e"} data.forms["past_subj_2s"] = {args[3] .. "es"} data.forms["past_subj_3s"] = {args[3] .. "e"} data.forms["past_subj_1p"] = {args[3] .. "en"} data.forms["past_subj_2p"] = {args[3] .. "et"} data.forms["past_subj_3p"] = {args[3] .. "en"} data.forms["past_ptcp"] = {args[4]} return make_table(data) end -- Make the table function make_table(data) local function repl(param) if param == "info" then return data.info or "" end local form = data.forms[param] if not form or #form == 0 then return "&mdash;" end local ret = {} for key, subform in ipairs(form) do table.insert(ret, m_links.full_link({lang = lang, alt = subform})) end return table.concat(ret, ", ") end local names = { ["s"] = "số ít", ["1s"] = "ngôi thứ nhất số ít", ["2s"] = "ngôi thứ hai số ít", ["3s"] = "ngôi thứ ba số ít", ["p"] = "số nhiều", ["1p"] = "ngôi thứ nhất số nhiều", ["2p"] = "ngôi thứ hai số nhiều", ["3p"] = "ngôi thứ ba số nhiều", ["pres"] = "thì hiện tại", ["past"] = "thì quá khứ", ["indc"] = "trần thuật", ["subj"] = "giả định", ["impr"] = "mệnh lệnh", ["inf"] = "nguyên mẫu", ["inf_gen"] = "sinh cách", ["inf_dat"] = "dữ cách", ["ptcp"] = "phân từ", ["past_indc_3s"] = "phân từ ở ngôi thứ ba số ít", ["past_indc_3p"] = "phân từ ở ngôi thứ ba số nhiều", ["past_ptcp"] = "phân từ quá khứ", } local person_numbers = {"1s", "2s", "3s", "1p", "2p", "3p"} local tenses = {"pres", "past"} local moods = {"indc", "subj", "impr", "ptcp"} local infs = {"inf", "inf_gen", "inf_dat"} local wikicode = mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-top', args = { title = "Bảng chia động từ của ''{{{inf}}}'' ({{{info}}})", palette = 'blue', tall = 'yes', } } .. [=[ |- ! rowspan="3" | nguyên mẫu ! class="secondary" | dạng cơ bản | colspan="2" | {{{inf}}} | class="blank-end-row" rowspan="3" colspan="3" | |- ! class="secondary" | [[genitive|sinh cách]] | colspan="2" | {{{inf_gen}}} |- ! class="secondary" | [[dative|dữ cách]] | colspan="2" | {{{inf_dat}}} |- | class="separator" colspan="4" | | class="separator" colspan="1" rowspan="1" | | class="separator" colspan="3" | |- ! class="outer" colspan="2" | ! class="outer" colspan="2" | trần thuật | class="separator" rowspan="8" | ! class="outer" colspan="2" | giả định |- ! colspan="2" | ! thì hiện tại ! thì quá khứ ! thì hiện tại ! thì quá khứ |- ! colspan="2" | ngôi thứ nhất số ít | {{{pres_indc_1s}}} | {{{past_indc_1s}}} | {{{pres_subj_1s}}} | {{{past_subj_1s}}} |- ! colspan="2" | ngôi thứ hai số ít | {{{pres_indc_2s}}} | {{{past_indc_2s}}} | {{{pres_subj_2s}}} | {{{past_subj_2s}}} |- ! colspan="2" | ngôi thứ ba số ít | {{{pres_indc_3s}}} | {{{past_indc_3s}}} | {{{pres_subj_3s}}} | {{{past_subj_3s}}} |- ! colspan="2" | ngôi thứ nhất số nhiều | {{{pres_indc_1p}}} | {{{past_indc_1p}}} | {{{pres_subj_1p}}} | {{{past_subj_1p}}} |- ! colspan="2" | ngôi thứ hai số nhiều | {{{pres_indc_2p}}} | {{{past_indc_2p}}} | {{{pres_subj_2p}}} | {{{past_subj_2p}}} |- ! colspan="2" | ngôi thứ ba số nhiều | {{{pres_indc_3p}}} | {{{past_indc_3p}}} | {{{pres_subj_3p}}} | {{{past_subj_3p}}} |- | class="separator" colspan="3" | | class="blank-end-row" rowspan="4" colspan="4" | |- ! class="outer" colspan="2" | ! class="outer" | mệnh lệnh |- ! colspan="2" | số ít | {{{impr_s}}} |- ! colspan="2" | số nhiều | {{{impr_p}}} |- | class="separator" colspan="4" | | class="blank-end-row" rowspan="4" colspan="4" | |- ! colspan="2" | ! thì hiện tại ! thì quá khứ |- ! colspan="2" | phân từ | {{{pres_ptcp}}} | {{{past_ptcp}}} ]=] .. mw.getCurrentFrame():expandTemplate{ title = 'inflection-table-bottom' } return (mw.ustring.gsub(wikicode, "{{{([a-z0-9_]+)}}}", repl)) .. require("Module:utilities").format_categories(data.categories, lang) end return export k4uqe8lv9qjdrft07raljs05wsyj3hx ダクラク 0 392811 2344951 2026-04-13T12:52:49Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{wikipedia|lang=ja|ダクラク省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đắk Lắk}}, từ {{derived|mng|dak Lak}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đắk Lắk|tỉnh|c/Việt Nam}}” 2344951 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|lang=ja|ダクラク省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đắk Lắk}}, từ {{derived|mng|dak Lak}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đắk Lắk|tỉnh|c/Việt Nam}} f83e7p8mryd9qgs9n867wpa5s9u1h2b 2344952 2344951 2026-04-13T12:53:00Z WhoAlone 40420 2344952 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|lang=ja|ダクラク省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đắk Lắk}}, từ {{derived|ja|mng|dak Lak}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đắk Lắk|tỉnh|c/Việt Nam}} dd6rie1tu946b9n0gfmtt3uwssvu11w 2344964 2344952 2026-04-13T13:07:55Z Hiyuune 50834 /* Tiếng Nhật */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344964 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|ja:+省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đắk Lắk}}, từ {{derived|ja|mng|dak Lak}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đắk Lắk|tỉnh|c/Việt Nam}} 53tqp5cq6sfh91pdk4stnbt2vxny0qr Bản mẫu:dum-conj-wk 10 392812 2344953 2026-04-13T12:53:50Z Hiyuune 50834 Trang mới: “{{#invoke:dum-verbs|weak}}<noinclude>{{tài liệu}}</noinclude>” 2344953 wikitext text/x-wiki {{#invoke:dum-verbs|weak}}<noinclude>{{tài liệu}}</noinclude> 4b7848przvx15wfxy1ju000nroqf8i4 テイニン 0 392813 2344954 2026-04-13T12:54:48Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{wikipedia|lang=ja|テイニン省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Tây Ninh}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Tây Ninh|tỉnh|c/Việt Nam}}” 2344954 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|lang=ja|テイニン省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Tây Ninh}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Tây Ninh|tỉnh|c/Việt Nam}} 1omag6wdkx3o8f5xtwrfap749kp8pt0 2344965 2344954 2026-04-13T13:08:20Z Hiyuune 50834 /* Tiếng Nhật */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344965 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|ja:+省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Tây Ninh}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Tây Ninh|tỉnh|c/Việt Nam}} 69lppm6tbf4jjr4bwcdxnd88yrqthom ドンナイ 0 392814 2344956 2026-04-13T12:56:02Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{wikipedia|lang=ja|ドンナイ省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đồng Nai}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đồng Nai|tỉnh|c/Việt Nam}}” 2344956 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|lang=ja|ドンナイ省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đồng Nai}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đồng Nai|tỉnh|c/Việt Nam}} pi750qcv4vzb456l1pmvqhnyegp01th 2344963 2344956 2026-04-13T13:06:49Z Hiyuune 50834 /* Tiếng Nhật */ dùng hàm (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]]) 2344963 wikitext text/x-wiki =={{langname|ja}}== {{wikipedia|ja:+省}} ==={{ĐM|etym}}=== Từ {{borrowed|ja|vi|Đồng Nai}}. ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{place|ja|t=Đồng Nai|tỉnh|c/Việt Nam}} 235qxvkn0ech51ewdnezfwd51njnke4 Thể loại:Mục từ có mã sắp xếp thủ công không thừa tiếng Kikai 14 392815 2344967 2026-04-13T13:09:06Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2344967 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx arçıma 0 392816 2344969 2026-04-13T13:13:39Z Hiyuune 50834 + crh 2344969 wikitext text/x-wiki =={{langname|crh}}== ==={{section|v}}=== {{head|crh|Biến thể hình thái động từ}} # {{gerund of|crh|arçımaq}} qn1gf6fyqlap7h66fbanyjk3g7gc6x3 arçırman 0 392817 2344970 2026-04-13T13:15:03Z Hiyuune 50834 + 2344970 wikitext text/x-wiki =={{langname|crh}}== ==={{section|v}}=== {{head|crh|Biến thể hình thái động từ}} # {{infl of|crh|arçımaq||indc|pres|đơn|ở|1s}} n13atoouydr7p5lhpgeya3y8f67p28h undercapitalises 0 392818 2344975 2026-04-13T13:43:09Z Hiyuune 50834 + en 2344975 wikitext text/x-wiki =={{langname|en}}== ==={{section|v}}=== {{head|en|Biến thể hình thái động từ}} # {{infl of|en|undercapitalise||s-verb-form}} oijmemdaduu5duxorjdhomj7rsmzzss undercapitalising 0 392819 2344976 2026-04-13T13:44:36Z Hiyuune 50834 Trang mới: “=={{langname|en}}== ==={{section|v}}=== {{head|en|Biến thể hình thái động từ}} # {{infl of|en|undercapitalise||ing-form}}” 2344976 wikitext text/x-wiki =={{langname|en}}== ==={{section|v}}=== {{head|en|Biến thể hình thái động từ}} # {{infl of|en|undercapitalise||ing-form}} 6h2kg5rgz018zn4ngcq2t3c7fc6cqog heliskiing 0 392820 2344977 2026-04-13T13:46:44Z Hiyuune 50834 + en 2344977 wikitext text/x-wiki {{also|heli-skiing}} =={{langname|en}}== ==={{section|n}}=== {{en-noun|-}} # {{alternative spelling of|en|heli-skiing}}. ==={{section|v}}=== {{head|en|Biến thể hình thái động từ}} # {{alternative spelling of|en|heli-skiing}}. ajrejuyioor05yclfcdl0pfgys48v9e hotpressed 0 392821 2344978 2026-04-13T13:47:31Z Hiyuune 50834 + en 2344978 wikitext text/x-wiki =={{langname|en}}== ==={{section|adj}}=== {{en-adj|-}} # {{alternative form of|en|hot-pressed}} ==={{section|v}}=== {{head|en|Biến thể hình thái động từ}} # {{alternative form of|en|hot-pressed}} t4xpkqgdlkm0lls3v6lx50jfmc7e2h0 whinedst 0 392822 2344979 2026-04-13T13:48:27Z Hiyuune 50834 + en 2344979 wikitext text/x-wiki =={{langname|en}}== ==={{section|v}}=== {{head|en|Biến thể hình thái động từ}} # {{infl of|en|whine||st-past-form}} fi7w9rsu0e5jltdnnn7xlgwm1dcdadx 0 392823 2344982 2026-04-13T13:50:25Z Lcsnes 40261 Trang mới: “{{-Latn-}} ==={{ĐM|desction}}=== {{head|mul|Chữ cái|chữ hoa|M̃}} #[[chữ cái|Chữ cái]] '''m thường''' với dấu ngã (◌̃). ==={{ĐM|see}}=== {{Latn-script}} =={{langname|bki}}== ==={{ĐM|letter}}=== {{head|bki|Chữ cái|chữ hoa|M̃}} #Chữ cái thứ 11 viết thường trong bảng chữ cái Latinh tiếng Baki. #:{{ux|bki|I'''m̃'''auano|[[s:Công vụ các Sứ đồ|Công vụ các Sứ đồ]]|inline=1}} ==={{ĐM|see}}=== *{{letters|lang=bki…” 2344982 wikitext text/x-wiki {{-Latn-}} ==={{ĐM|desction}}=== {{head|mul|Chữ cái|chữ hoa|M̃}} #[[chữ cái|Chữ cái]] '''m thường''' với dấu ngã (◌̃). ==={{ĐM|see}}=== {{Latn-script}} =={{langname|bki}}== ==={{ĐM|letter}}=== {{head|bki|Chữ cái|chữ hoa|M̃}} #Chữ cái thứ 11 viết thường trong bảng chữ cái Latinh tiếng Baki. #:{{ux|bki|I'''m̃'''auano|[[s:Công vụ các Sứ đồ|Công vụ các Sứ đồ]]|inline=1}} ==={{ĐM|see}}=== *{{letters|lang=bki|sc=Latn|qual=Bảng chữ cái Latinh tiếng Baki|Aa|Bb|Dd|Ee|Gg|Ii|Jj|Kk|Ll|Mm|M̃/m̃|Nn|Oo|Pp|P̃/p̃|Rr|Ss|Tt|Uu|Vv|Ṽṽ|Ww|Yy}} ==={{ĐM|ref}}=== *{{Chú thích web|bki|author=Wycliffe Bible Translators, Inc.|work=Verikariano Vou Na Baki|year=2018|entryurl=https://www.bible.com/bible/2420/ACT.1.BKI|entry=Im̃auano 1}} =={{langname|erk}}== ==={{ĐM|pron}}=== *{{IPA4|erk|/ŋ͡m/}} ==={{ĐM|letter}}=== {{head|erk|Chữ cái}} #Phụ âm thứ 6 trong tiếng Efate Nam, viết bằng chữ Latinh. #:{{ux|erk|'''m̃'''aat|con [[rắn]]|inline=1}}󠌋󠌋󠌋 ==={{ĐM|see}}=== *{{letters|lang=erk|sc=Latn|qual=Chữ Latinh tiếng Efate Nam|a|e|i|o|u|f|g|k|l|m|m̃|n|nr|p|p̃|r|s|t|w|y}} ==={{ĐM|ref}}=== *{{Chú thích web|en|author=Nicholas Thieberger|work=[https://paradisec.org.au/SELexicon/index-english/main.htm Dictionary of South Efate]|year=2011|entry=m}} =={{langname|klv}}== ==={{ĐM|pron}}=== *{{IPA4|klv|/mʷ/}} ==={{ĐM|letter}}=== {{head|klv|Chữ cái|chữ hoa|M̃}} #Chữ cái thứ 13 viết thường trong bảng chữ cái Latinh tiếng Maskelynes. #:{{quote|klv|AGot esu'''m̃'''an naulu'''m̃'''an toutaut tia hǝn b̃itai nǝkadhuhai gail hǝn nakuvkuv; nǝhai p̃isi lǝsǝṽan hǝn naṽit tovoi, gai dereh titaii, bar hǝn gail vi lan nǝhab.|Bây giờ cái búa đã để kề rễ cây; vậy hễ cây nào không sanh trái tốt, thì sẽ phải đốn và chụm. ([[s:Ma-thi-ơ/3#3:10|Ma-thi-ơ 3:10]])}}󠌋󠌋󠌋 ==={{ĐM|see}}=== *{{letters|lang=klv|sc=Latn|qual=Bảng chữ cái Latinh tiếng Maskelynes|Aa|Bb|B̃/b̃|Dd|Ee|Əə|Gg|Hh|Ii|Kk|Ll|Mm|M̃/m̃|Nn|Ŋŋ|Oo|Pp|P̃/p̃|Rr|Ss|Tt|Uu|Vv|Ṽṽ|Ww|Yy}} ==={{ĐM|ref}}=== *{{Chú thích web|klv|author=Wycliffe Bible Translators, Inc.|work=Mɑskelynes|year=2013|entryurl=https://www.bible.com/bible/1247/MAT.3.KLV|entry=Mattiu 3}} =={{langname|mye}}== ==={{ĐM|symbol}}=== {{head|mye|Ký tự|chữ hoa|M̃}} #Biến thể chữ '''{{l|mye|m}}''' trong tiếng Myene. #:{{ux|mye|Nau'''m̃'''u|[[s:Na-hum|Na-hum]]|inline=1}} ==={{ĐM|see}}=== *{{letters|lang=mye|sc=Latn|qual=Bảng chữ cái Latinh tiếng Myene|Aa|Bb|Cc|(¢)|Dd|Ee|Èè|Ff|Gg|Ii|Jj|Kk|Ll|Mm|(M̃/m̃)|Ṁṁ|Nn|(Ṉ/ṉ)|Ññ|Ńń|Oo|Òò|Pp|Rr|Ss|Tt|Uu|Vv|(Ṽṽ)|Ww|Yy|Zz}} ==={{ĐM|ref}}=== *{{Chú thích web|mye|author=British & Foreign Bible Society|work=Bibili 1927 (Omyene)|year=1927|entryurl=https://www.bible.com/bible/3438/NAM.1.MYE|entry=Naum̃u 1}} igj2cvh77rfupp0s7a7wtf7ubkzfe06 respiciundus 0 392824 2344986 2026-04-13T14:00:34Z Hiyuune 50834 Trang mới: “=={{langname|la}}== ==={{section|pron}}=== * {{la-IPA|respiciundus}} * {{hyph|la|res|pi|ci|un|dus}} ==={{section|ptcp}}=== {{la-part|respiciundus}} # {{infl of|la|respiciō||part|fut|pass}}” 2344986 wikitext text/x-wiki =={{langname|la}}== ==={{section|pron}}=== * {{la-IPA|respiciundus}} * {{hyph|la|res|pi|ci|un|dus}} ==={{section|ptcp}}=== {{la-part|respiciundus}} # {{infl of|la|respiciō||part|fut|pass}} aeprxc1tt5l59a0pr28gedsp3vwoz31 Thể loại:Mục từ có chuyển tự thủ công không thừa tiếng Hachijō 14 392825 2344997 2026-04-13T14:08:08Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2344997 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Yêu cầu cần chú ý liên quan tiếng Hachijō 14 392826 2344999 2026-04-13T14:10:15Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2344999 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Yêu cầu liên quan đến tiếng Hachijō 14 392827 2345000 2026-04-13T14:10:24Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345000 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với 垢 tiếng Hachijō 14 392828 2345003 2026-04-13T14:14:23Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345003 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với 垢 theo ngôn ngữ 14 392829 2345004 2026-04-13T14:14:30Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345004 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx ねこ 0 392830 2345007 2026-04-13T14:26:17Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/neko/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[mèo]]. #:{{syn|jpx-hcj|ねっこめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}}” 2345007 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/neko/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[mèo]]. #:{{syn|jpx-hcj|ねっこめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} 31upypx03ybduyvfdryxz1irxc4d6cr ねっこめ 0 392831 2345008 2026-04-13T14:26:44Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/nekkome/|a=Mitsune|Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[mèo]]. #:{{syn|jpx-hcj|ねこ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}}” 2345008 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/nekkome/|a=Mitsune|Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[mèo]]. #:{{syn|jpx-hcj|ねこ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} edv30u04nxb97gz7tfbua49oyqtgo2x 2345009 2345008 2026-04-13T14:26:58Z WhoAlone 40420 2345009 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/nekkome/|a=Mitsune|Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[mèo]]. #:{{syn|jpx-hcj|ねこ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Mèo}} tr33kul4gh765ts5uyw7tdq0u3e6irh 2345010 2345009 2026-04-13T14:27:35Z WhoAlone 40420 2345010 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/nekkome/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[mèo]]. #:{{syn|jpx-hcj|ねこ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Mèo}} hnnn6yd76obvdel732pfvs8ejrb37xt いぬ 0 392832 2345011 2026-04-13T14:28:15Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/inu/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[chó]]. #:{{syn|jpx-hcj|いぬめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Chó}}” 2345011 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/inu/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[chó]]. #:{{syn|jpx-hcj|いぬめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Chó}} 0iqbug7nr5pvn84febj2j24bajwjw6w いぬめ 0 392833 2345012 2026-04-13T14:28:41Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/inume/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[chó]]. #:{{syn|jpx-hcj|いぬ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Chó}}” 2345012 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/inume/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[chó]]. #:{{syn|jpx-hcj|いぬ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Chó}} b26rxhm5srb1nbamwklrbtcjujsu70q Thể loại:Trang có cây từ nguyên 14 392834 2345014 2026-04-13T14:42:01Z TheHighFighter2 42988 Trang mới: “__HIDDENCAT__ <!--TODO use {{auto cat}}-->” 2345014 wikitext text/x-wiki __HIDDENCAT__ <!--TODO use {{auto cat}}--> mccjgsylmsf484stpq0h9n2yodu0789 Thể loại:Trang có nguyên từ nội dòng liên kết đỏ 14 392835 2345018 2026-04-13T15:39:24Z TheHighFighter2 42988 Trang mới: “{{auto cat}}” 2345018 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx jiàngxià 0 392836 2345019 2026-04-13T16:26:30Z Hiyuune 50834 + cmn 2345019 wikitext text/x-wiki =={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{cmn-pinyin of|降下}} 8q9uw2zj76ceyffowu3x8hgvtxkje4p Thể loại:Từ dẫn xuất từ tiếng M'Nông Đông tiếng Nhật 14 392837 2345020 2026-04-13T16:34:27Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345020 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ dẫn xuất từ nhóm ngôn ngữ Bahnar tiếng Nhật 14 392838 2345021 2026-04-13T16:34:43Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345021 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ dẫn xuất từ nhóm ngôn ngữ Bahnar theo ngôn ngữ 14 392839 2345022 2026-04-13T16:35:00Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345022 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ dẫn xuất từ tiếng M'Nông Đông theo ngôn ngữ 14 392840 2345023 2026-04-13T16:37:15Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345023 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Liên từ tiếng M'Nông Đông 14 392841 2345024 2026-04-13T17:27:17Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345024 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Mô đun:dialect synonyms/ain/ウパㇱ 828 392842 2345025 2026-04-13T23:58:06Z Hiyuune 50834 Trang mới: “local export = {} export.gloss = "tuyết" export.syns = { -- Hokkaido: Southern/Central ["Abuta"] = { "" }, ["Azuma"] = { "" }, ["Biratori"] = { "" }, ["Chitose"] = { "" }, ["Ebeotsu"] = { "" }, ["Hagino"] = { "" }, ["Hidaka"] = { "" }, ["Hobetsu"] = { "" }, ["Horobetsu"] = { "ウパㇱ:upás((H))" }, ["Horoman"] = { "" }, ["Mitsuishi"] = { "" }, ["Mukawa"] = { "" }, ["Muroran"] = { "" }, ["Niikappu"] = { "" }, ["Nukkibetsu"] = { "" }, ["Ogifushi"] = {…” 2345025 Scribunto text/plain local export = {} export.gloss = "tuyết" export.syns = { -- Hokkaido: Southern/Central ["Abuta"] = { "" }, ["Azuma"] = { "" }, ["Biratori"] = { "" }, ["Chitose"] = { "" }, ["Ebeotsu"] = { "" }, ["Hagino"] = { "" }, ["Hidaka"] = { "" }, ["Hobetsu"] = { "" }, ["Horobetsu"] = { "ウパㇱ:upás((H))" }, ["Horoman"] = { "" }, ["Mitsuishi"] = { "" }, ["Mukawa"] = { "" }, ["Muroran"] = { "" }, ["Niikappu"] = { "" }, ["Nukkibetsu"] = { "" }, ["Ogifushi"] = { "" }, ["Oshamambe"] = { "" }, ["Rebun"] = { "" }, ["Samani"] = { "" }, ["Saru"] = { "ウパㇱ:upás((H))" }, ["Shiraoi"] = { "" }, ["Shizunai"] = { "" }, ["Takae"] = { "" }, ["Takashima"] = { "" }, ["Toyoura"] = { "" }, ["Urakawa"] = { "" }, ["Usu"] = { "" }, ["Yakumo"] = { "ウパㇱ:upás((H))" }, -- Hokkaido: Northern ["Asahikawa"] = { "ウパㇱ:upás((H))" }, ["Chikabumi"] = { "" }, ["Nayoro"] = { "ウパㇱ:upás((H))" }, ["Soya"] = { "オパㇱ:opás((H))" }, ["Teshio"] = { "" }, -- Hokkaido: Eastern ["Abashiri"] = { "" }, ["Akan"] = { "" }, ["Ashoro"] = { "" }, ["Bihoro"] = { "ウパㇱ:upas((H))" }, ["Biroo"] = { "" }, ["Chirotto"] = { "" }, ["Fupushinai"] = { "" }, ["Fushiko"] = { "" }, ["Harutori"] = { "" }, ["Kitami"] = { "" }, ["Kushiro"] = { "" }, ["Kussharo"] = { "" }, ["Memuro"] = { "" }, ["Mokoto"] = { "" }, ["Nemuro"] = { "" }, ["Nijibetsu"] = { "" }, ["Obihiro"] = { "ウパㇱ:upás((H))" }, ["Otofuke"] = { "" }, ["Shari"] = { "" }, ["Shiranuka"] = { "" }, ["Tokachi"] = { "" }, ["Tooro"] = { "" }, -- Sakhalin: West Coast ["Chirai"] = { "" }, ["Maoka"] = { "" }, ["Raichishka"] = { "オパㇱ:opas((H))" }, ["Shiranushi"] = { "" }, ["Tarantomari"] = { "" }, ["Usoro"] = { "" }, -- Sakhalin: East Coast ["Aihama"] = { "" }, ["Nairo"] = { "" }, ["Niitoi"] = { "" }, ["Ochiho"] = { "" }, ["Shirahama"] = { "" }, ["Shiraura"] = { "" }, ["Taraika"] = { "" }, ["Tonnai"] = { "" }, ["Yamambetsu"] = { "" }, -- Kuril: Northern ["Kuril"] = { "" }, ["Paramushir"] = { "" }, ["Shumshu"] = { "ウバス:ubasu (119)", "ウバシ:ubashi' (129)((H))", "ウォバス:wobasu(雪)((M1892))" }, -- Kuril: Southern ["Etorofu"] = { "" }, ["South Kuril"] = { "ウパㇱ:upas(雪)((BS))" }, } return export f5hpay488u3caeixcuw0cuh2hklgqbd Bản mẫu:dialect map/ain/ウパㇱ 10 392843 2345026 2026-04-13T23:59:02Z Hiyuune 50834 Trang mới: “{{dialect map}}” 2345026 wikitext text/x-wiki {{dialect map}} d6v0nb58x909aihj701mhww3omkirht オパㇱ 0 392844 2345028 2026-04-14T00:02:19Z Hiyuune 50834 Trang mới: “=={{langname|ain}}== ==={{section|n}}=== {{head|ain|Danh từ|tr=opas}} # {{lb|ain|Sakhalin}} [[tuyết|Tuyết]]. ===={{section|alt}}==== * {{alter|ain|ウパㇱ||Hokkaido|Kuril}} * {{alter|ain|ヲバス||Kuril}} ===={{section|etym}}==== Từ tiếng Ainu nguyên thủy ''*opas'' LH (“tuyết”).<ref>{{R:ain:Vovin:1993|page=119}}</ref> ===={{section|pron}}==== {{ain-IPA|opas}} File:MapOfAinuLanguage-Snow.svg|thumb|400px|Bản đồ phương ngữ tiếng Ainu:…” 2345028 wikitext text/x-wiki =={{langname|ain}}== ==={{section|n}}=== {{head|ain|Danh từ|tr=opas}} # {{lb|ain|Sakhalin}} [[tuyết|Tuyết]]. ===={{section|alt}}==== * {{alter|ain|ウパㇱ||Hokkaido|Kuril}} * {{alter|ain|ヲバス||Kuril}} ===={{section|etym}}==== Từ tiếng Ainu nguyên thủy ''*opas'' LH (“tuyết”).<ref>{{R:ain:Vovin:1993|page=119}}</ref> ===={{section|pron}}==== {{ain-IPA|opas}} [[File:MapOfAinuLanguage-Snow.svg|thumb|400px|Bản đồ phương ngữ tiếng Ainu: tuyết]] {|class="wikitable" |+ dialect table: [[snow]] (1960)<ref>{{R:ain:HattoriAndChiri:1960}}</ref> ! địa danh !! cách phát âm |- ! Yakumo (八雲) | 'upas |- ! Oshamambe (長万部) | 'upas |- ! Horobetsu (幌別) | 'upas |- ! Hiratori (平取) | 'upas |- ! Nukkibetsu (貫気別) | 'upas |- ! Niikappu (新冠) | 'upas |- ! Samani (様似) | 'upas |- ! Obihiro (帯広) | 'upas |- ! Kushiro (釧路) | 'upas |- ! Bihoro (美幌) | 'upas |- ! Asahikawa (旭川) | 'upas |- ! Nayoro (名寄) | 'upas |- ! Soya (宗谷) | 'opás |- ! Ochiho (落帆) | 'opás |- ! Tarantomari (多蘭泊) | 'opás |- ! Maoka (真岡) | 'opás |- ! Shiraura (白浦) | 'opás |- ! Raichishka (ライチシカ) | 'opás |- ! Nairo (内路) | 'opás |} ===={{section|syn}}==== {{dial syn|ain|ウパㇱ}} ==={{section|ref}}=== <references/> :* {{R:ain:KarafutoWordlist}} 7rh0q9oklpq0301wz8a0k07gb0b0tme アムシペ 0 392845 2345029 2026-04-14T00:06:17Z Hiyuune 50834 + ain 2345029 wikitext text/x-wiki =={{langname|ain}}== ==={{section|n}}=== {{head|ain|Danh từ|tr=amusipe}} # {{alternative form of|ain|アムㇱペ}} 79b62ievu6tg9pagjc9irjtjqorqo6d タカㇵカ 0 392846 2345030 2026-04-14T00:08:31Z Hiyuune 50834 Trang mới: “=={{langname|ain}}== ==={{section|n}}=== [[File:MapOfAinuLanguage-Crab.svg|thumb|400px|Bản đồ phương ngữ tiếng Ainu: [[cua]]]] {{head|ain|noun|tr=takahka}} # {{lb|ain|Sakhalin}} [[cua|Cua]] [[Alaska]] ({{taxlink|Paralithodes camtschaticus|loài}}) ===={{section|syn}}==== {{dial syn|ain|アンパヤヤ}} ==={{section|ref}}=== :* {{R:ain:KarafutoWordlist}}” 2345030 wikitext text/x-wiki =={{langname|ain}}== ==={{section|n}}=== [[File:MapOfAinuLanguage-Crab.svg|thumb|400px|Bản đồ phương ngữ tiếng Ainu: [[cua]]]] {{head|ain|noun|tr=takahka}} # {{lb|ain|Sakhalin}} [[cua|Cua]] [[Alaska]] ({{taxlink|Paralithodes camtschaticus|loài}}) ===={{section|syn}}==== {{dial syn|ain|アンパヤヤ}} ==={{section|ref}}=== :* {{R:ain:KarafutoWordlist}} 7kgoet8jiuxlixxbd31krhwemr5s2i3 拡げる 0 392847 2345031 2026-04-14T00:11:25Z Hiyuune 50834 Trang mới: “=={{langname|ja}}== {{ja-kanjitab|ひろ|y=k}} {{ja-see|ひろげる}}” 2345031 wikitext text/x-wiki =={{langname|ja}}== {{ja-kanjitab|ひろ|y=k}} {{ja-see|ひろげる}} mynjg2gi4ijkeqm7s1zbojxdxzlyjl6 Thể loại:Động từ tiếng Azerbaijan 14 392848 2345032 2026-04-14T00:12:59Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345032 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx ağlayırsan 0 392849 2345033 2026-04-14T00:14:28Z Hiyuune 50834 + az 2345033 wikitext text/x-wiki =={{langname|az}}== ==={{section|v}}=== {{head|az|Biến thể hình thái động từ}} # {{infl of|az|ağlamaq||pres|đơn|ở|2s}} iprtti9lenvyhx2w7yej2rrs522qsne ağlayan 0 392850 2345034 2026-04-14T00:16:03Z Hiyuune 50834 + az, tr 2345034 wikitext text/x-wiki =={{langname|az}}== ==={{section|ptcp}}=== {{head|az|Phân từ phi quá khứ chủ ngữ}} # {{participle of|az|ağlamaq||non-past|subject}} =={{langname|tr}}== ==={{section|v}}=== {{head|tr|Biến thể hình thái động từ}} # {{tr-verb form of|ağlamak}} sz77r8v7goj4k09as2crwvmkhf0mumz Thể loại:Địa danh của Biên Hòa/Tiếng Việt 14 392851 2345037 2026-04-14T00:27:08Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Biên Hòa/Tiếng Việt]] thành [[Thể loại:vi:Địa danh của Biên Hòa]] 2345037 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:vi:Địa danh của Biên Hòa}} srt2igxxjgtbyf6rap0b99gp0i8bqr3 ぶため 0 392852 2345040 2026-04-14T00:36:04Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/butame/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[lợn]]. ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Gia súc}}” 2345040 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/butame/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[lợn]]. ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Gia súc}} f220ei4vmjefraumbjdjpp9xyw54iyw うしめ 0 392853 2345043 2026-04-14T00:38:35Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/uɕime/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[bò]]. #:{{syn|jpx-hcj|ぞく|ぞくめ|ちょんこめ|ばめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Gia súc}}” 2345043 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/uɕime/|a=Mitsune, Sueyoshi}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[bò]]. #:{{syn|jpx-hcj|ぞく|ぞくめ|ちょんこめ|ばめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Gia súc}} gskv2mx7u9iwe8lwlxb2qqjv3oxgjbp ぞく 0 392854 2345045 2026-04-14T00:39:35Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/zoku/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[bò]]. #:{{syn|jpx-hcj|うしめ|ぞくめ|ちょんこめ|ばめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Gia súc}}” 2345045 wikitext text/x-wiki =={{langname|jpx-hcj}}== ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/zoku/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun}} # [[bò]]. #:{{syn|jpx-hcj|うしめ|ぞくめ|ちょんこめ|ばめ}} ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} {{c|jpx-hcj|Gia súc}} ct3kt6pe8dgwu4gpzkkse5wka8espmi 石蓴 0 392855 2345051 2026-04-14T00:46:35Z WhoAlone 40420 Trang mới: “=={{langname|jpx-hcj}}== {{jpx-hcj-kanjitab|あおさ2|yomi=irr}} ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/aosa/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|あおさ}} # [[rau diếp]] [[xanh]]. ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} =={{langname|ja}}== {{ja-kanjitab|あおさ2|yomi=irr}…” 2345051 wikitext text/x-wiki =={{langname|jpx-hcj}}== {{jpx-hcj-kanjitab|あおさ2|yomi=irr}} ==={{ĐM|pron}}=== * {{IPA4|jpx-hcj|/aosa/|a=Mitsune}} ==={{ĐM|noun}}=== {{jpx-hcj-head|noun|あおさ}} # [[rau diếp]] [[xanh]]. ==={{ĐM|ref}}=== * {{cite-web|ja|title=ja:日本の危機言語|work=ja:日本の危機言語|titleurl=https://kikigengo.ninjal.ac.jp/data/tango/search?lang=ja|url=http://kikigengo.ninjal.ac.jp/|year=2022|publisher=}} =={{langname|ja}}== {{ja-kanjitab|あおさ2|yomi=irr}} {{swp|ja:アオサ}} ==={{ĐM|etym}}=== Dạng danh từ của tính từ {{mention|ja|青い|tr=aoi|t=xanh}}. {{rfv-etym|ja}} ==={{ĐM|pron}}=== {{ja-pron|あおさ|acc=0|acc_ref=DJR}} ==={{ĐM|noun}}=== {{ja-noun|あおさ|アオサ|hhira=あをさ}} # [[rau diếp]] [[biển]]. ==={{ĐM|ref}}=== <references/> :* {{R:Kanjipedia Kotoba|0003948900|〈石<sup>▲</sup>蓴〉}} {{C|ja|Thực vật}} =={{langname|ryu}}== ==={{ĐM|etym}}=== {{ryu-kanjitab|yomi=irr}} Cùng gốc với {{cog|ja|石蓴|tr=aosa}}. ==={{ĐM|pron}}=== * {{IPA4|ryu|[ʔaːsa]}} ==={{ĐM|noun}}=== {{ryu-head|noun|あーさ}} # [[rau diếp]] [[biển]]. ==={{ĐM|ref}}=== * {{R:JLect|あーさ【石蓴】|861|aasa}} * {{R:Shuri-Naha Dialect Dictionary|アーサ|50002}} * {{R:Shuri-Naha Dialect Dictionary|アーサ|00012}} {{c|ryu|Thực vật}} kjm3cg5n3g2pjlfk7sqpcsllr2fs9gl アオサ 0 392856 2345052 2026-04-14T00:47:23Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{ja-see|石蓴}}” 2345052 wikitext text/x-wiki =={{langname|ja}}== {{ja-see|石蓴}} kybere28plctxnxyfudqeebz10b1zin あをさ 0 392857 2345055 2026-04-14T00:47:50Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{ja-see|石蓴}}” 2345055 wikitext text/x-wiki =={{langname|ja}}== {{ja-see|石蓴}} kybere28plctxnxyfudqeebz10b1zin Thể loại:km:Chim cánh cụt 14 392858 2345059 2026-04-14T00:50:17Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345059 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx aosa 0 392859 2345060 2026-04-14T00:51:52Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|あおさ}} # {{ja-romanization of|アオサ}}” 2345060 wikitext text/x-wiki =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|あおさ}} # {{ja-romanization of|アオサ}} s1d0qn718taer3vokif47r9mof1nvmq あーさ 0 392860 2345061 2026-04-14T00:52:45Z WhoAlone 40420 Trang mới: “=={{langname|ryu}}== ==={{ĐM|pron}}=== * {{IPA4|ryu|/ʔaːsa/}} ==={{ĐM|noun}}=== {{ryu-head|noun}} # {{ryu-def|石蓴}} [[rau diếp]] [[biển]].” 2345061 wikitext text/x-wiki =={{langname|ryu}}== ==={{ĐM|pron}}=== * {{IPA4|ryu|/ʔaːsa/}} ==={{ĐM|noun}}=== {{ryu-head|noun}} # {{ryu-def|石蓴}} [[rau diếp]] [[biển]]. nflzu0st97ww3z6vuvhhs6v0eo54scm Thể loại:Từ đánh vần với ー tiếng Okinawa 14 392861 2345062 2026-04-14T00:54:02Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345062 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Chim cánh cụt 14 392862 2345065 2026-04-14T00:55:18Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345065 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ có âm đọc kanji bất quy tắc tiếng Hachijō 14 392863 2345066 2026-04-14T00:56:40Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345066 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với kanji hyōgai tiếng Hachijō 14 392864 2345067 2026-04-14T00:56:42Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345067 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:ja:Chim cánh cụt 14 392865 2345069 2026-04-14T00:58:36Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345069 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:ja:Lớp Chim 14 392866 2345070 2026-04-14T00:59:36Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345070 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Ngỗng/Tiếng Việt 14 392867 2345075 2026-04-14T01:15:25Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Ngỗng/Tiếng Việt]] thành [[Thể loại:vi:Ngỗng]] 2345075 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:vi:Ngỗng}} 6xuzlbmgxj7ik6t8waowkph8difcmke Thể loại:Vịt/Tiếng Việt 14 392868 2345080 2026-04-14T01:19:14Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Vịt/Tiếng Việt]] thành [[Thể loại:vi:Vịt]] 2345080 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:vi:Vịt}} gvgz9jjk612ignzhuuf4lklr9kyk78s Thể loại:Gia cầm/Tiếng Việt 14 392869 2345085 2026-04-14T01:21:52Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Gia cầm/Tiếng Việt]] thành [[Thể loại:vi:Gia cầm]] 2345085 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:vi:Gia cầm}} 7extcxjikqv1mk1a5ir05s51lk5tc6l Mô đun:dialect synonyms/pt/berlinde 828 392872 2345095 2026-04-14T02:21:00Z Hiyuune 50834 Trang mới: “local export = {} export.title = "" export.meaning = "đá cẩm thạch" export.note = "" export.syns = { --Brazil ["Aracaju"] = { "bola de gude", "marraio" }, ["Belém"] = { "peteca" }, ["Belo Horizonte"] = { "birosca", "bolinha de gude", "bolinha de vidro" }, ["Boa Vista"] = { "peteca" }, ["Campo Grande"] = { "bola de gude", "bolinha de gude", "bolita" }, ["Cuiabá"] = { "bola de gude", "bolita" }, ["Curitiba"] = { "bola de gude", "búrica" }, ["Florianópoli…” 2345095 Scribunto text/plain local export = {} export.title = "" export.meaning = "đá cẩm thạch" export.note = "" export.syns = { --Brazil ["Aracaju"] = { "bola de gude", "marraio" }, ["Belém"] = { "peteca" }, ["Belo Horizonte"] = { "birosca", "bolinha de gude", "bolinha de vidro" }, ["Boa Vista"] = { "peteca" }, ["Campo Grande"] = { "bola de gude", "bolinha de gude", "bolita" }, ["Cuiabá"] = { "bola de gude", "bolita" }, ["Curitiba"] = { "bola de gude", "búrica" }, ["Florianópolis"] = { "bola de gude", "bolinha de gude", "bolinha de vidro", "boreba", "tilica" }, ["Fortaleza"] = { "bila", "cabeçulinha", "bola de gude" }, ["Goiânia"] = { "bola de gude", "bolinha de gude", "bolinha de vidro", "biloca" }, ["João Pessoa"] = { "bila", "bola de fona", "bola de gude" }, ["Macapá"] = { "peteca" }, ["Maceió"] = { "bola de gude", "bolinha de gude", "ximbra" }, ["Manaus"] = { "bola de gude", "bolinha de gude", "peteca" }, ["Natal"] = { "biloca", "bola de gude", "bolinha de vidro" }, ["Porto Alegre"] = { "bola de gude", "bolinha de gude", "bolita" }, ["Porto Velho"] = { "peteca" }, ["Recife"] = { "bola de gude", "bolinha de gude" }, ["Rio Branco"] = { "peteca" }, ["Rio de Janeiro"] = { "bola de gude", "bolinha de gude" }, ["Salvador"] = { "bola de gude" }, ["São Luís"] = { "bola de gude", "bolinha de gude", "peteca" }, ["São Paulo"] = { "bola de gude", "bolinha de gude", "bolinha de vidro" }, ["Teresina"] = { "bola de gude", "bolinha de gude", "peteca" }, ["Vitória"] = { "bola de gude", "bolinha de gude", "bolinha de vidro" }, --Portugal ["Funchal"] = { "berlinde" }, ["Lisboa"] = { "berlinde" }, ["Ponta Delgada"] = { "berlinde" }, --Angola ["Luanda"] = { "berlinde" }, --Mozambique ["Maputo"] = { "berlinde" }, } return export pqrdkomelqpuvnaefdkvedtg3nbu9u3 berlinde 0 392873 2345096 2026-04-14T02:22:44Z Hiyuune 50834 + pt 2345096 wikitext text/x-wiki =={{langname|pt}}== {{wp|pt:}} ==={{section|alt}}=== * {{alt|pt|belindre}} ==={{section|pron}}=== {{pt-IPA}} ==={{section|n}}=== {{pt-noun|m}} # {{lb|pt|Portugal}} [[đá|Đá]] [[cẩm thạch]]. ===={{section|syn}}==== {{dialect synonyms|pt}} ==={{section|further}}=== * {{R:pt:Aulete}} * {{R:pt:DAN}} * {{R:pt:Priberam}} 65sfttcn6g0fdgqcujov7chnu6fdeh8 Bản mẫu:dialect map/pt/berlinde 10 392874 2345097 2026-04-14T02:24:34Z Hiyuune 50834 Trang mới: “{{dialect map}}” 2345097 wikitext text/x-wiki {{dialect map}} d6v0nb58x909aihj701mhww3omkirht Mô đun:dialect synonyms/pt/galinha-d'angola 828 392875 2345098 2026-04-14T02:39:41Z Hiyuune 50834 Trang mới: “local export = {} export.title = "" export.meaning = "gà sao" export.note = "" export.syns = { --Brazil ["Aracaju"] = { "galinha-d'angola", "guiné", "tô-fraco" }, ["Belém"] = { "capote", "galinha-d'angola", "picote" }, ["Belo Horizonte"] = { "galinha-d'angola" }, ["Boa Vista"] = { "capote", "galinha-d'angola", "picote", "tô-fraco" }, ["Campo Grande"] = { "galinha-d'angola" }, ["Cuiabá"] = { "cocar", "galinha-d'angola" }, ["Fortaleza"] = { "capão", "capote"…” 2345098 Scribunto text/plain local export = {} export.title = "" export.meaning = "gà sao" export.note = "" export.syns = { --Brazil ["Aracaju"] = { "galinha-d'angola", "guiné", "tô-fraco" }, ["Belém"] = { "capote", "galinha-d'angola", "picote" }, ["Belo Horizonte"] = { "galinha-d'angola" }, ["Boa Vista"] = { "capote", "galinha-d'angola", "picote", "tô-fraco" }, ["Campo Grande"] = { "galinha-d'angola" }, ["Cuiabá"] = { "cocar", "galinha-d'angola" }, ["Fortaleza"] = { "capão", "capote", "galinha-d'angola", "tô-fraco" }, ["João Pessoa"] = { "galinha-d'angola", "guiné", "tô-fraco" }, ["Maceió"] = { "galinha-d'água", "guiné", "tô-fraco" }, ["Manaus"] = { "galinha-d'angola", "picote" }, ["Porto Velho"] = { "galinha-d'angola", "picote" }, ["Recife"] = { "galinha-d'angola", "guiné", "tô-fraco" }, ["Rio Branco"] = { "capote", "galinha-d'angola" }, ["Rio de Janeiro"] = { "galinha-d'angola" }, ["Salvador"] = { "galinha-d'angola", "guiné", "saqué", "tô-fraco" }, ["São Luís"] = { "capote", "catraia", "galinha-d'angola", "tô-fraco" }, ["Teresina"] = { "capão", "capote", "galinha-d'angola", "guiné", "saqué", "tô-fraco" }, ["Vitória"] = { "galinha-d'angola", "galhinhola", "tô-fraco" }, -- Amapá -- ["ALAP-1"] = { "capote", "galinha-d'angola", "picote" }, ["ALAP-2"] = { "picote" }, ["ALAP-3"] = { "picote" }, ["ALAP-4"] = { "capote", "picote" }, ["ALAP-5"] = { "capote", "picote" }, ["ALAP-6"] = { "galinha-d'angola", "picote" }, ["ALAP-7"] = { "galinha-d'angola", "picote" }, ["ALAP-8"] = { "picote" }, ["ALAP-9"] = { "picote" }, ["ALAP-10"] = { "galinha-d'angola", "picote" }, -- Amazonas -- ["ALSAM-1"] = { "capote", "galinha-d'angola" }, ["ALSAM-2"] = { "capote", "gandola" }, ["ALSAM-3"] = { "picota" }, ["ALSAM-4"] = { "galinha-d'angola", "picote" }, ["ALSAM-5"] = { "picote" }, ["ALSAM-6"] = { "galinha-d'angola", "picota" }, -- Ceará -- ["ALSCE-01"] = { "capote", "galinha-d'angola" }, ["ALSCE-02"] = { "capote", "galinha-de-angola" }, ["ALSCE-03"] = { "capote", "galinha-de-angola" }, ["ALSCE-04"] = { "capote", "galinha-de-angola" }, ["ALSCE-05"] = { "capote" }, ["ALSCE-06"] = { "capote" }, ["ALSCE-07"] = { "capote", "galinha-de-angola" }, ["ALSCE-08"] = { "capote", "galinha-d'angola", "galinha-de-angola" }, ["ALSCE-09"] = { "capote", "galinha-de-angola" }, --Goiás ["Alingo-1"] = { "cocar" }, ["Alingo-2"] = { "angola", "cocar" }, ["Alingo-3"] = { "angola", "cocar" }, ["Alingo-4"] = { "angola", "cocar" }, ["Alingo-5"] = { "angola", "cocar" }, ["Alingo-6"] = { "angola", "cocar" }, ["Alingo-7"] = { "angola", "capote", "galinha-de-pote"}, ["Alingo-8"] = { "angola" }, ["Alingo-9"] = { "angola", "cocar" }, ["Alingo-10"] = { "angola", "cocar" }, ["Alingo-11"] = { "angola", "cocar" }, ["Alingo-12"] = { "angola", "cocar" }, ["Alingo-13"] = { "angola", "curicaca" }, ["Alingo-14"] = { "angola", "cocar" }, ["Alingo-15"] = { "angola", "cocar" }, ["Alingo-16"] = { "angola" }, ["Alingo-17"] = { "angola", "cocar" }, ["Alingo-18"] = { "angola", "cocar" }, ["Alingo-19"] = { "angola", "cocar" }, ["Alingo-20"] = { "angola", "cocar", "galinha-angola"}, ["Alingo-21"] = { "angola", "cocar" }, ["Alingo-22"] = { "angola" }, ["Alingo-23"] = { "angola", "cocar" }, ["Alingo-24"] = { "angola", "cocar" }, ["Alingo-25"] = { "angola" }, ["Alingo-26"] = { "angola", "cocar", "saqué"}, ["Alingo-27"] = { "" }, ["Alingo-28"] = { "angola" }, ["Alingo-29"] = { "angola", "cocar" }, ["Alingo-30"] = { "angola", "cocar" }, ["Alingo-31"] = { "angola" }, ["Alingo-32"] = { "angola", "cocar" }, ["Alingo-33"] = { "angola", "cocar" }, ["Alingo-34"] = { "angola" }, ["Alingo-35"] = { "angola", "cocar" }, ["Alingo-36"] = { "cocar" }, ["Alingo-37"] = { "angola", "cocar", "guiné"}, ["Alingo-38"] = { "angola", "cocar" }, ["Alingo-39"] = { "angola" }, ["Alingo-40"] = { "angola" }, ["Alingo-41"] = { "angola" }, ["Alingo-42"] = { "angola", "capote" }, ["Alingo-43"] = { "angola", "cocar", "guiné"}, ["Alingo-44"] = { "cocar" }, ["Alingo-45"] = { "angola" }, ["Alingo-46"] = { "angola", "cocar" }, ["Alingo-47"] = { "angola" }, ["Alingo-48"] = { "angola", "cocar" }, ["Alingo-49"] = { "caricaca", "cocar", "tetel"}, ["Alingo-50"] = { "angola", "capote", "cocar"}, ["Goiânia"] = { "cocar", "galinha-d'angola" }, -- South Brazil -- --Paraná ["ALERS-005"] = { "angola" }, ["ALERS-011"] = { "angola" }, ["ALERS-029"] = { "angola" }, ["ALERS-034"] = { "angola" }, ["ALERS-050"] = { "angola" }, ["ALERS-055"] = { "angola" }, ["ALERS-064"] = { "angola" }, ["ALERS-067"] = { "angola" }, ["ALERS-074"] = { "angola" }, ["ALERS-089"] = { "angola" }, ["ALERS-091"] = { "angola" }, ["ALERS-093"] = { "angola" }, ["ALERS-100"] = { "angola" }, ["ALERS-106"] = { "angola" }, ["ALERS-107"] = { "angola" }, ["ALERS-114"] = { "angola" }, ["ALERS-118"] = { "angola" }, ["ALERS-122"] = { "angola" }, ["ALERS-126"] = { "angola" }, ["ALERS-135"] = { "angola" }, ["ALERS-144"] = { "angola" }, ["ALERS-148"] = { "angola" }, ["ALERS-150"] = { "angola" }, ["ALERS-152"] = { "angola" }, ["ALERS-155"] = { "galinha-d'angola" }, ["ALERS-158"] = { "angola" }, ["ALERS-167"] = { "angola" }, ["ALERS-171"] = { "angola" }, ["ALERS-177"] = { "angola" }, ["ALERS-185"] = { "angola" }, ["ALERS-186"] = { "angolista" }, ["ALERS-190"] = { "angola" }, ["ALERS-192"] = { "galinha-d'angola" }, ["ALERS-193"] = { "angola" }, ["ALERS-194"] = { "angolista" }, ["ALERS-198"] = { "angolista" }, ["ALERS-201"] = { "angolista" }, ["ALERS-202"] = { "angolista" }, ["ALERS-203"] = { "angolista" }, ["ALERS-205"] = { "angola" }, ["ALERS-206"] = { "angola" }, ["ALERS-207"] = { "angola" }, ["ALERS-209"] = { "angola" }, ["ALERS-210"] = { "angola" }, ["ALERS-211"] = { "angola" }, ["ALERS-212"] = { "angola" }, ["ALERS-214"] = { "galinha-d'angola" }, ["ALERS-217"] = { "angola" }, ["ALERS-218"] = { "angolista" }, ["ALERS-219"] = { "angolista" }, ["ALERS-220"] = { "angolista" }, ["ALERS-221"] = { "angola" }, ["ALERS-222"] = { "angolista" }, ["ALERS-224"] = { "galinha-angola" }, ["ALERS-225"] = { "angola" }, ["ALERS-227"] = { "angolista" }, ["ALERS-236"] = { "angolista" }, ["ALERS-240"] = { "angola" }, ["ALERS-241"] = { "galinha-angolista" }, ["ALERS-246"] = { "angola" }, ["ALERS-247"] = { "galinha-d'angola" }, ["ALERS-250"] = { "angolista" }, ["ALERS-251"] = { "angolista" }, ["ALERS-255"] = { "angolista" }, ["ALERS-258"] = { "galinha-d'angola" }, ["ALERS-262"] = { "galinha-angola" }, ["ALERS-263"] = { "angolista" }, ["ALERS-264"] = { "angolista" }, ["ALERS-271"] = { "angola" }, ["ALERS-277"] = { "angola" }, ["ALERS-278"] = { "angolista" }, ["ALERS-281"] = { "galinha-angola" }, ["ALERS-283"] = { "galinha-angola" }, ["ALERS-284"] = { "angolista" }, ["ALERS-290"] = { "angolista" }, ["ALERS-291"] = { "angolista" }, ["ALERS-293"] = { "angolista" }, ["ALERS-296"] = { "angolista" }, --Santa Catarina ["ALERS-551"] = { "angolista", "galinha-d'angola", "tô-fraco" }, ["ASELVI-1"] = { "galinha-d'angola" }, ["ASELVI-2"] = { "angolista", "galinha-do-mato" }, ["ASELVI-3"] = { "angolista", "galinha-d'angola" }, ["ASELVI-4"] = { "galinha-d'angola" }, --Rio Grande do Sul ["ALERS-602"] = { "angolista" }, ["ALERS-611"] = { "angolista" }, ["ALERS-648"] = { "angola" }, ["ALERS-651"] = { "angolista" }, ["ALERS-659"] = { "angolista" }, ["ALERS-661"] = { "angolista" }, ["ALERS-671"] = { "angola" }, ["ALERS-677"] = { "angolista" }, ["ALERS-679"] = { "angola" }, ["ALERS-684"] = { "angola" }, ["ALERS-686"] = { "angola" }, ["ALERS-689"] = { "angolista" }, ["ALERS-691"] = { "angolista" }, ["ALERS-693"] = { "angolista" }, ["ALERS-698"] = { "angolista" }, ["ALERS-703"] = { "angolista" }, ["ALERS-706"] = { "angolista" }, ["ALERS-709"] = { "angola" }, ["ALERS-710"] = { "angola" }, ["ALERS-711"] = { "angolista" }, ["ALERS-713"] = { "angolista" }, ["ALERS-714"] = { "angolista" }, ["ALERS-722"] = { "angolista" }, ["ALERS-745"] = { "angolista" }, ["ALERS-746"] = { "angolista" }, ["ALERS-762"] = { "galinha-angola" }, ["ALERS-783"] = { "angolista" }, ["ALERS-785"] = { "angolista" }, ["ALERS-791"] = { "angolista" }, ["ALERS-809"] = { "angolista" }, ["ALERS-817"] = { "angolista", "galinha-d'angola", "tô-fraco" }, ["ALERS-822"] = { "angolista" }, ["ALERS-823"] = { "angolista" }, ["ALERS-828"] = { "angolista" }, ["ALERS-832"] = { "angolista" }, ["ALERS-833"] = { "angolista" }, ["ALERS-834"] = { "angolista" }, ["ALERS-839"] = { "angolista" }, ["ALERS-840"] = { "angolista" }, --Rio Grande do Norte ["Natal"] = { "galinha-d'água", "galinha-d'angola", "guiné" }, ["RN-1"] = { "capote", "galinha-d'angola", "guiné" }, ["RN-2"] = { "capote", "galinha-d'angola", "guiné" }, ["RN-3"] = { "capote", "galinha-d'angola", "guiné" }, ["RN-4"] = { "capote", "guiné" }, ["RN-5"] = { "guiné" }, ["RN-6"] = { "capote", "galinha-d'angola", "guiné" }, ["RN-7"] = { "galinha-d'angola", "guiné" }, ["RN-8"] = { "capote", "galinha-d'angola", "guiné" }, --São Paulo ["São Paulo"] = { "galinha-d'angola" }, ["SP-DI"] = { "galinha-d'angola" }, ["SP-MA"] = { "galinha-d'angola" }, ["SP-RGS"] = { "cocar" }, ["SP-RP"] = { "galinha-d'angola" }, ["SP-SA"] = { "galinha-d'angola" }, ["SP-SAP"] = { "galinha-d'angola" }, ["SP-SBCR"] = { "galinha-d'angola" }, ["SP-SCS"] = { "galinha-d'angola" }, ["Caraguatatuba"] = { "galinha-d'angola", "polaca" }, ["Ilhabela"] = { "galinha-d'angola" }, ["São Sebastião"] = { "galinha-d'angola" }, ["Ubatuba"] = { "galinha-d'angola", "macuco" }, ["ALTOSP-1"] = { "angola" }, ["ALTOSP-2"] = { "angola", "galinha-d'angola", "capote" }, ["ALTOSP-3"] = { "angola", "galinha-angola", "guiné" }, ["ALTOSP-4"] = { "angola", "galinha-d'angola", "guiné" }, --Tocantins ["ALITTETO-1"] = { "angolista", "cocar", "capote", "galinha-d'angola", "galinhola", "guiné" }, ["ALITTETO-2"] = { "angolista", "cocar", "guiné" }, ["ALITTETO-3"] = { "angolista", "cocar", "capote", "galinha-d'angola", "guiné", "tô-fraco" }, ["ALITTETO-4"] = { "angolista", "cocar", "galinha-d'angola", "guiné" }, ["ALITTETO-5"] = { "angolista", "cocar", "galinha-d'angola" }, ["ALITTETO-6"] = { "angolista", "cocar", "galinha-d'angola", "galinhola", "guiné" }, ["ALITTETO-7"] = { "cocar", "guiné"}, ["ALITTETO-8"] = { "angolista", "cocar", "capote", "galinha-d'angola" }, ["ALITTETO-9"] = { "cocar", "capote", "galinha-d'angola" }, ["ALITTETO-10"] = { "angolista", "cocar", "galinha-d'angola", "galinhola" }, ["ALITTETO-11"] = { "cocar", "galinha-d'angola", "guiné", "tô-fraco" }, ["ALITTETO-12"] = { "cocar", "galinha-d'angola", "guiné" }, -- Portugal -- ["Lisboa"] = { "fraca", "fraca-da-guiné", "pintada", "pintada-da-guiné" }, -- Açores -- ["ALEAç-4"] = { "galinha-da-guiné" }, ["ALEAç-12"] = { "guiné" }, ["ALEAç-13"] = { "tabaca" }, --Angola ["Luanda"] = { "fraca", "pintada" }, --GB ["Bissau"] = { "galinha-do-mato" }, --Mozambique ["Maputo"] = { "pintada", "galinha-do-mato" }, } return export 9rme77qeknchioe0wgq3eu5qdf3oukq Mô đun:dialect synonyms/pt/semáforo 828 392876 2345099 2026-04-14T02:47:17Z Hiyuune 50834 Trang mới: “local export = {} export.title = "" export.meaning = "đèn giao thông" export.note = "" export.syns = { --Brazil ["Aracaju"] = { "semáforo", "sinal" }, ["Belém"] = { "semáforo", "sinal" }, ["Belo Horizonte"] = { "sinal" }, ["Boa Vista"] = { "semáforo", "sinal", "sinaleiro" }, ["Campo Grande"] = { "luminoso", "semáforo", "sinal", "sinaleiro" }, ["Cuiabá"] = { "semáforo", "sinal", "sinaleiro" }, ["Curitiba"] = { "farol", "semáforo", "sinal", "sinaleiro" }…” 2345099 Scribunto text/plain local export = {} export.title = "" export.meaning = "đèn giao thông" export.note = "" export.syns = { --Brazil ["Aracaju"] = { "semáforo", "sinal" }, ["Belém"] = { "semáforo", "sinal" }, ["Belo Horizonte"] = { "sinal" }, ["Boa Vista"] = { "semáforo", "sinal", "sinaleiro" }, ["Campo Grande"] = { "luminoso", "semáforo", "sinal", "sinaleiro" }, ["Cuiabá"] = { "semáforo", "sinal", "sinaleiro" }, ["Curitiba"] = { "farol", "semáforo", "sinal", "sinaleiro" }, ["Florianópolis"] = { "semáforo", "sinaleira", "sinaleiro" }, ["Fortaleza"] = { "semáforo", "sinal" }, ["Goiânia"] = { "luminoso", "semáforo", "sinal", "sinaleiro" }, ["João Pessoa"] = { "semáforo", "sinal" }, ["Macapá"] = { "semáforo", "sinal" }, ["Maceió"] = { "semáforo", "sinal" }, ["Manaus"] = { "semáforo", "sinal" }, ["Natal"] = { "semáforo", "sinal" }, ["Porto Alegre"] = { "semáforo", "sinal", "sinaleira", "sinaleiro" }, ["Porto Velho"] = { "semáforo", "sinal", "sinaleiro" }, ["Recife"] = { "farol", "semáforo", "sinal" }, ["Rio Branco"] = { "semáforo", "sinal" }, ["Rio de Janeiro"] = { "sinal" }, ["Salvador"] = { "farol", "semáforo", "sinal", "sinaleira", "sinaleiro" }, ["São Luís"] = { "semáforo", "sinal" }, ["São Paulo"] = { "farol", "semáforo", "sinal" }, ["Teresina"] = { "semáforo", "sinal" }, ["Vitória"] = { "farol", "semáforo", "sinal" }, --Portugal ["Funchal"] = { "semáforo" }, ["Lisboa"] = { "semáforo", "sinal luminoso" }, ["Ponta Delgada"] = { "semáforo" }, --Angola ["Luanda"] = { "semáforo" }, --Guinea ["Bissau"] = { "semáforo" }, --Mozambique ["Maputo"] = { "semáforo" }, } return export 6pnufohcw6fp6569hbx7iyw7s1sx4je Mô đun:dialect synonyms/pt/mosquito 828 392877 2345100 2026-04-14T02:56:24Z Hiyuune 50834 Trang mới: “local export = {} export.title = "" export.meaning = "muỗi" export.note = "" export.syns = { -- Brazil -- ["Aracaju"] = { "mosquito", "muriçoca", "pernilongo" }, ["Belém"] = { "carapanã" }, ["Belo Horizonte"] = { "pernilongo" }, ["Boa Vista"] = { "carapanã", "mosquito", "muriçoca", "pernilongo" }, ["Campo Grande"] = { "mosquito", "pernilongo" }, ["Cuiabá"] = { "mosquito", "muriçoca", "pernilongo" }, ["Curitiba"] = { "mosquito", "pernilongo" }, ["Florian…” 2345100 Scribunto text/plain local export = {} export.title = "" export.meaning = "muỗi" export.note = "" export.syns = { -- Brazil -- ["Aracaju"] = { "mosquito", "muriçoca", "pernilongo" }, ["Belém"] = { "carapanã" }, ["Belo Horizonte"] = { "pernilongo" }, ["Boa Vista"] = { "carapanã", "mosquito", "muriçoca", "pernilongo" }, ["Campo Grande"] = { "mosquito", "pernilongo" }, ["Cuiabá"] = { "mosquito", "muriçoca", "pernilongo" }, ["Curitiba"] = { "mosquito", "pernilongo" }, ["Florianópolis"] = { "pernilongo" }, ["Fortaleza"] = { "mosquito", "muriçoca", "pernilongo" }, ["Goiânia"] = { "muriçoca", "pernilongo" }, ["João Pessoa"] = { "mosquito", "muriçoca", "pernilongo" }, ["Macapá"] = { "carapanã", "muriçoca", "pernilongo" }, ["Maceió"] = { "mosquito", "muriçoca", "pernilongo" }, ["Manaus"] = { "carapanã", "mosquito", "muriçoca", "pernilongo" }, ["Natal"] = { "mosquito", "muriçoca", "pernilongo" }, ["Porto Alegre"] = { "mosquito", "pernilongo" }, ["Porto Velho"] = { "carapanã", "mosquito", "muriçoca", "pernilongo" }, ["Recife"] = { "mosquito", "muriçoca", "pernilongo" }, ["Rio Branco"] = { "carapanã", "pernilongo" }, ["Rio de Janeiro"] = { "mosquito", "pernilongo" }, ["Salvador"] = { "mosquito", "muriçoca", "pernilongo" }, ["São Luís"] = { "mosquito", "muriçoca", "pernilongo", "praga" }, ["São Paulo"] = { "mosquito", "pernilongo" }, ["Teresina"] = { "muriçoca", "pernilongo" }, ["Vitória"] = { "mosquito", "muriçoca", "pernilongo" }, -- Portugal -- ["Lisboa"] = { "melga", "mosquito" }, -- Azores -- -- (specially Culex pipiens) ["ALEAç-1"] = { "mosquito" }, ["ALEAç-2"] = { "mosquito" }, ["ALEAç-3"] = { "mosquito" }, ["ALEAç-4"] = { "mosquito", }, ["ALEAç-5"] = { "mosquito" }, ["ALEAç-6"] = { "mosquito-bravo" }, ["ALEAç-7"] = { "mosquito", "mosquito-bravo" }, ["ALEAç-8"] = { "mosquito", "melga" }, ["ALEAç-9"] = { "mosquito" }, ["ALEAç-10"] = { "mosquito" }, ["ALEAç-11"] = { "mosquito" }, ["ALEAç-12"] = { "mosquito" }, ["ALEAç-13"] = { "mosquito" }, ["ALEAç-14"] = { "mosquito" }, ["ALEAç-15"] = { "mosquito" }, ["ALEAç-16"] = { "mosquito" }, -- "zângão" ["ALEAç-17"] = { "mosquito" }, } return export 60t3pgfi24hrp3lo549xm6plxijhu3c Thể loại:Chó/Tiếng Hà Lan 14 392878 2345104 2026-04-14T03:02:30Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Chó/Tiếng Hà Lan]] thành [[Thể loại:nl:Chó]] 2345104 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:nl:Chó}} 2yi9qkyjpoot9nxsywwl91ncuq6q4hu 弘次 0 392879 2345107 2026-04-14T03:04:57Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こう|じ|yomi=kanon,o}} ==={{ĐM|pron}}=== {{ja-pron|こうじ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こうじ}} # {{given name|ja|nam|sort=こうじ}}” 2345107 wikitext text/x-wiki =={{langname|ja}}== {{ja-kanjitab|こう|じ|yomi=kanon,o}} ==={{ĐM|pron}}=== {{ja-pron|こうじ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こうじ}} # {{given name|ja|nam|sort=こうじ}} fwj4bfk45mq9qdoyt72vyuvnfbwn2gc 公治 0 392880 2345108 2026-04-14T03:04:57Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こう|じ|yomi=kanon,goon}} ==={{ĐM|pron}}=== {{ja-pron|こうじ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こうじ}} # {{given name|ja|nam|sort=こうじ}}” 2345108 wikitext text/x-wiki =={{langname|ja}}== {{ja-kanjitab|こう|じ|yomi=kanon,goon}} ==={{ĐM|pron}}=== {{ja-pron|こうじ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こうじ}} # {{given name|ja|nam|sort=こうじ}} 2ada25vthe7922vpsog5rgladxx19w5 Thể loại:Địa danh của Ehime, Nhật Bản/Tiếng Nhật 14 392881 2345110 2026-04-14T03:06:12Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Ehime, Nhật Bản/Tiếng Nhật]] thành [[Thể loại:ja:Địa danh của Ehime, Nhật Bản]] 2345110 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:ja:Địa danh của Ehime, Nhật Bản}} gov8fk5b9bqcnwemum8wnl1swgt0pji Thể loại:Từ đánh vần với 弘 là こう tiếng Nhật 14 392882 2345112 2026-04-14T03:07:43Z WhoAlone 40420 Trang mới: “{{auto cat|kan'on}}” 2345112 wikitext text/x-wiki {{auto cat|kan'on}} clmo3b09zci1t12px7gti5vw1yfsq0y Thể loại:Từ đánh vần với 弘 tiếng Nhật 14 392883 2345114 2026-04-14T03:08:59Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345114 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Thần bí học/Tiếng Việt 14 392884 2345116 2026-04-14T03:09:02Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Thần bí học/Tiếng Việt]] thành [[Thể loại:vi:Thần bí học]] 2345116 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:vi:Thần bí học}} 3oj5vre1cckws4e4nt6qquqoclwwjht Thể loại:Từ đánh vần với 弘 theo ngôn ngữ 14 392885 2345118 2026-04-14T03:09:42Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345118 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx 掘鼠 0 392886 2345120 2026-04-14T03:11:37Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{swp|ja:ホリネズミ}} {{ja-kanjitab|ほり|ねずみ|yomi=kun}} ==={{ĐM|etym}}=== Từ {{ja-com|掘|ほり|t1=đào|鼠|ねずみ|t2=chuột}}. ==={{ĐM|noun}}=== {{ja-pos|noun|ほり ねずみ|ホリ ネズミ}} # [[chuột nang]]. ({{taxfmt|Geomyidae|family}}) ===={{ĐM|usage}}==== * {{U:ja:biology|ホリネズミ}} {{c|ja|Bộ Gặm nhấm}}” 2345120 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:ホリネズミ}} {{ja-kanjitab|ほり|ねずみ|yomi=kun}} ==={{ĐM|etym}}=== Từ {{ja-com|掘|ほり|t1=đào|鼠|ねずみ|t2=chuột}}. ==={{ĐM|noun}}=== {{ja-pos|noun|ほり ねずみ|ホリ ネズミ}} # [[chuột nang]]. ({{taxfmt|Geomyidae|family}}) ===={{ĐM|usage}}==== * {{U:ja:biology|ホリネズミ}} {{c|ja|Bộ Gặm nhấm}} 6a53224lpufue6ep6cez2nsi1xbxwt6 ほりねずみ 0 392887 2345122 2026-04-14T03:12:03Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{ja-see|掘鼠}}” 2345122 wikitext text/x-wiki =={{langname|ja}}== {{ja-see|掘鼠}} kbp7oxkbpkjosld7dtzx66r23jwu6lk ホリネズミ 0 392888 2345123 2026-04-14T03:12:08Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{ja-see|掘鼠}}” 2345123 wikitext text/x-wiki =={{langname|ja}}== {{ja-see|掘鼠}} kbp7oxkbpkjosld7dtzx66r23jwu6lk カンガルー 0 392889 2345125 2026-04-14T03:14:57Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|en|kangaroo}}, từ {{der|ja|kky|gangurru||{{w|Macropus giganteus}}}}. ==={{ĐM|pron}}=== {{ja-pron|acc=3|acc_ref=DJR,NHK,SMK5}} ==={{ĐM|noun}}=== {{ja-noun}} # [[chuột túi]]. ==={{ĐM|ref}}=== <references/> {{C|ja|Thú có túi}}” 2345125 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|en|kangaroo}}, từ {{der|ja|kky|gangurru||{{w|Macropus giganteus}}}}. ==={{ĐM|pron}}=== {{ja-pron|acc=3|acc_ref=DJR,NHK,SMK5}} ==={{ĐM|noun}}=== {{ja-noun}} # [[chuột túi]]. ==={{ĐM|ref}}=== <references/> {{C|ja|Thú có túi}} mpft2nlv621lnyu6v94xjw4kggn3zvi kangarū 0 392890 2345126 2026-04-14T03:16:26Z WhoAlone 40420 Trang mới: “=={{langname|mi}}== ==={{ĐM|etym}}=== {{bor+|mi|en|kangaroo}}, từ {{w|Guugu Yimidhirr}} {{mention|kky|gangurru}}. ==={{ĐM|pron}}=== * {{mi-IPA|kangarū|stress=--'}} ==={{ĐM|noun}}=== {{head|mi|Danh từ}} # [[chuột túi]]. {{c|mi|Úc}} =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|カンガルー}}” 2345126 wikitext text/x-wiki =={{langname|mi}}== ==={{ĐM|etym}}=== {{bor+|mi|en|kangaroo}}, từ {{w|Guugu Yimidhirr}} {{mention|kky|gangurru}}. ==={{ĐM|pron}}=== * {{mi-IPA|kangarū|stress=--'}} ==={{ĐM|noun}}=== {{head|mi|Danh từ}} # [[chuột túi]]. {{c|mi|Úc}} =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|カンガルー}} mib0m5j9lfrh8hfi776dgiounap6p21 リャマ 0 392891 2345128 2026-04-14T03:19:04Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{swp|ja:}} ==={{ĐM|alter form}}=== * {{ja-r|ラマ}} * {{ja-r|ジャマ}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|llama}}, từ {{der|ja|qu|llama}}. ==={{ĐM|pron}}=== {{ja-pron|acc=a}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà không bướu}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}}” 2345128 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{ĐM|alter form}}=== * {{ja-r|ラマ}} * {{ja-r|ジャマ}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|llama}}, từ {{der|ja|qu|llama}}. ==={{ĐM|pron}}=== {{ja-pron|acc=a}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà không bướu}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}} 6sit2wb34vs5bnisje70kgc9z5ankmp Thể loại:ja:Họ Lạc đà 14 392892 2345129 2026-04-14T03:19:08Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345129 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Trường học/Tiếng Volapük 14 392893 2345132 2026-04-14T03:20:26Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Trường học/Tiếng Volapük]] thành [[Thể loại:vo:Trường học]] 2345132 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:vo:Trường học}} iz2ceu3gmdgmzw0swpdzd6b141necqw Thể loại:Địa danh của Hawaii, Hoa Kỳ/Tiếng Anh 14 392894 2345135 2026-04-14T03:22:37Z Hiyuune 50834 Hiyuune đã đổi [[Thể loại:Địa danh của Hawaii, Hoa Kỳ/Tiếng Anh]] thành [[Thể loại:en:Địa danh của Hawaii, Hoa Kỳ]] 2345135 wikitext text/x-wiki {{Đổi hướng thể loại|Thể loại:en:Địa danh của Hawaii, Hoa Kỳ}} 3ymdjyustt01nrwfs1rw3avfaz09b8p Thể loại:ja:Bộ Guốc chẵn 14 392895 2345137 2026-04-14T03:31:14Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345137 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với リャ tiếng Nhật 14 392896 2345138 2026-04-14T03:50:34Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345138 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Từ đánh vần với リャ theo ngôn ngữ 14 392897 2345139 2026-04-14T03:50:59Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345139 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx ラマ 0 392898 2345140 2026-04-14T03:53:13Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== ==={{ĐM|pron}}=== {{ja-pron|acc=1}} * {{hmp|ja|蘿藦|sort=らま}} ==={{ĐM|noun}}=== {{ja-noun}} # {{alt form|ja|リャマ|tr=ryama||{{w|lạc đà không bướu}}}}” 2345140 wikitext text/x-wiki =={{langname|ja}}== ==={{ĐM|pron}}=== {{ja-pron|acc=1}} * {{hmp|ja|蘿藦|sort=らま}} ==={{ĐM|noun}}=== {{ja-noun}} # {{alt form|ja|リャマ|tr=ryama||{{w|lạc đà không bướu}}}} 0e8d9p7fj5p3gtj8q13zl0e5bva1r1l ジャマ 0 392899 2345141 2026-04-14T03:53:31Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== ==={{ĐM|pron}}=== {{ja-pron|acc=1}} ==={{ĐM|noun}}=== {{ja-noun}} # {{alt form|ja|リャマ|tr=ryama||{{w|lạc đà không bướu}}}}” 2345141 wikitext text/x-wiki =={{langname|ja}}== ==={{ĐM|pron}}=== {{ja-pron|acc=1}} ==={{ĐM|noun}}=== {{ja-noun}} # {{alt form|ja|リャマ|tr=ryama||{{w|lạc đà không bướu}}}} 9fn5us8gd28b2q0yjpgvg65xqhsyl29 ryama 0 392900 2345142 2026-04-14T03:54:00Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|リャマ}}” 2345142 wikitext text/x-wiki =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|リャマ}} ntgh86lwnq3qnmq1cfdn4vx58gnvnnf アルパカ 0 392901 2345143 2026-04-14T03:56:38Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|alpaca}}. ==={{ĐM|pron}}=== {{ja-pron|acc=0}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà Alpaca}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}}” 2345143 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|alpaca}}. ==={{ĐM|pron}}=== {{ja-pron|acc=0}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà Alpaca}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}} h5d7g5hls83vefmi2fnplohpfcf2bne arupaka 0 392902 2345144 2026-04-14T03:57:29Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|アルパカ}}” 2345144 wikitext text/x-wiki =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|アルパカ}} 48qznf9s35oihyp4piz5cgamk3dig1k グアナコ 0 392903 2345145 2026-04-14T03:58:37Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|guanaco}}. ==={{ĐM|pron}}=== {{ja-pron|acc=0}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà Guanaco}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}}” 2345145 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|guanaco}}. ==={{ĐM|pron}}=== {{ja-pron|acc=0}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà Guanaco}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}} rgtwbxs80ona4ribxfxl084je2sxbdh ビクーニャ 0 392904 2345146 2026-04-14T04:02:45Z WhoAlone 40420 Trang mới: “=={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|vicuña}}. ==={{ĐM|pron}}=== {{ja-pron|acc=2}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà Vicuña}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}}” 2345146 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== Từ {{bor|ja|es|vicuña}}. ==={{ĐM|pron}}=== {{ja-pron|acc=2}} ==={{ĐM|noun}}=== {{ja-noun}} # {{w|Lạc đà Vicuña}}. ==={{ĐM|see also}}=== {{list:camelids/ja}} {{C|ja|Họ Lạc đà}} 1w8iszwjc3r3zcmial66jojtr0we6u5 sanko 0 392905 2345147 2026-04-14T04:17:42Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{com|ycr|san|ko}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # [[ba]] [[thứ]]. ==={{ĐM|ref}}=== * {{R:ycr:sound substitution}}” 2345147 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{com|ycr|san|ko}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # [[ba]] [[thứ]]. ==={{ĐM|ref}}=== * {{R:ycr:sound substitution}} ec08yvqaybdjsxuya7g36oqtu9ecjfn sannensye 0 392906 2345148 2026-04-14T04:20:08Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|三年生|tr=san'nensei}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[sinh viên]] [[năm]] [[ba]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Giáo dục}}” 2345148 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|三年生|tr=san'nensei}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[sinh viên]] [[năm]] [[ba]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Giáo dục}} cnnu51uawlgzqwtooqxe05c94r5ot38 sannici 0 392907 2345149 2026-04-14T04:20:52Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{com|ycr|san|nici}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[ba]] [[ngày]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345149 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{com|ycr|san|nici}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[ba]] [[ngày]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} mw3if3ro35t3zpx94g7uw3nv6ftzht7 sanzikan 0 392908 2345150 2026-04-14T04:22:13Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|三時間|tr=sanjikan}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[ba]] [[giờ]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345150 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|三時間|tr=sanjikan}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[ba]] [[giờ]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} aq7gkbngj59553rwpsz6464kcpcg1s3 saru 0 392909 2345152 2026-04-14T04:24:11Z WhoAlone 40420 Trang mới: “{{also|saRu}} =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|猿|tr=saru}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[khỉ]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345152 wikitext text/x-wiki {{also|saRu}} =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|猿|tr=saru}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[khỉ]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} 8fy9q81jc6y8k9iufdxzrx6t7ggyn70 2345160 2345152 2026-04-14T05:07:33Z Hiyuune 50834 2345160 wikitext text/x-wiki {{also|saRu}} =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|猿|tr=saru}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[khỉ|Khỉ]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|さる}} alydiq1uxfqmb2j9nj9uqj4xes4smaj satoimo 0 392910 2345153 2026-04-14T04:25:12Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|里芋|tr=satoimo}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[khoai tây]], [[khoai môn]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345153 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|里芋|tr=satoimo}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[khoai tây]], [[khoai môn]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} 9xqlanynnt77318mfvdwdtln4uiysxd semay 0 392911 2345154 2026-04-14T04:26:04Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|狭い|tr=semai}}. ==={{ĐM|adj}}=== {{head|ycr|Tính từ}} # {{label|ycr|Áo Hoa}} [[hẹp]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345154 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|狭い|tr=semai}}. ==={{ĐM|adj}}=== {{head|ycr|Tính từ}} # {{label|ycr|Áo Hoa}} [[hẹp]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} e888epprt0qagqd8thacvlqrhn3vuzn senaka 0 392912 2345155 2026-04-14T04:26:53Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|背中|tr=senaka}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[lưng]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345155 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|背中|tr=senaka}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[lưng]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} 66793ohqz7ubookh2u89k4ewx5jwwpo seri 0 392913 2345156 2026-04-14T04:27:55Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|整理|tr=seiri}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} Sự [[sắp xếp]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345156 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|整理|tr=seiri}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} Sự [[sắp xếp]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} 4inz4wmgd7y3mtrei6a0bcah2bxmm2x syeri 0 392914 2345157 2026-04-14T04:28:11Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|整理|tr=seiri}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{alt form of|ycr|seri}}. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}}” 2345157 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|整理|tr=seiri}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{alt form of|ycr|seri}}. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} i2wd1h35cxul3hrjaz8v1juyfred4fl siroy 0 392915 2345158 2026-04-14T04:29:47Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|白い|tr=shiroi}}. ==={{ĐM|adj}}=== {{head|ycr|Tính từ}} # {{label|ycr|Áo Hoa}} [[trắng]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Màu sắc}}” 2345158 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|白い|tr=shiroi}}. ==={{ĐM|adj}}=== {{head|ycr|Tính từ}} # {{label|ycr|Áo Hoa}} [[trắng]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Màu sắc}} exh1l0qmrmiet951pq7ld84ymytxvsg siru 0 392916 2345159 2026-04-14T04:30:31Z WhoAlone 40420 Trang mới: “=={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|汁|tr=shiru}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[xúp]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Thực phẩm}}” 2345159 wikitext text/x-wiki =={{langname|ycr}}== ==={{ĐM|etym}}=== {{der+|ycr|ja|汁|tr=shiru}}. ==={{ĐM|noun}}=== {{head|ycr|Danh từ}} # {{label|ycr|Áo Hoa}} [[xúp]]. ==={{ĐM|ref}}=== * {{R:ycr:Lin 2022}} {{c|ycr|Thực phẩm}} qipiavif6dq41o6s7a8prthqemab8rk ボールペン 0 392917 2345162 2026-04-14T05:17:46Z Kelly zhrm 58416 Trang mới: “=={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== {{bor+|ja|en|ball pen}}. ==={{ĐM|pron}}=== {{ja-pron|acc=0}} ==={{ĐM|n}}=== {{ja-noun}} # [[bút bi|Bút bi]]. ==={{ĐM|see}}=== * {{ja-r|ボール}} * {{ja-r|ペン}} {{C|ja|Vật dụng viết}}” 2345162 wikitext text/x-wiki =={{langname|ja}}== {{swp|ja:}} ==={{ĐM|etym}}=== {{bor+|ja|en|ball pen}}. ==={{ĐM|pron}}=== {{ja-pron|acc=0}} ==={{ĐM|n}}=== {{ja-noun}} # [[bút bi|Bút bi]]. ==={{ĐM|see}}=== * {{ja-r|ボール}} * {{ja-r|ペン}} {{C|ja|Vật dụng viết}} t2blt6yog3dbqeqvnqy54axxzhfw7s6 bōrupen 0 392918 2345163 2026-04-14T05:18:29Z Kelly zhrm 58416 Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|ボールペン}}” 2345163 wikitext text/x-wiki =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|ボールペン}} 1k3twk8tt0yeyq86wuo2frvjpzr7ucg Thể loại:Bản mẫu liên kết tiếng Mahal 14 392919 2345164 2026-04-14T07:32:34Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345164 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Trái cây 14 392920 2345166 2026-04-14T07:33:37Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345166 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Thực phẩm 14 392921 2345167 2026-04-14T07:34:06Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345167 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Danh sách chủ đề thuộc nhóm tập hợp 14 392922 2345168 2026-04-14T07:34:08Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345168 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Thực vật 14 392923 2345169 2026-04-14T07:34:10Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345169 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Sinh vật 14 392924 2345170 2026-04-14T07:35:06Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345170 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Danh sách chủ đề thuộc nhóm loại hình 14 392925 2345171 2026-04-14T07:35:08Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345171 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Tất cả chủ đề 14 392926 2345172 2026-04-14T07:35:36Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345172 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Sự sống 14 392927 2345173 2026-04-14T07:35:47Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345173 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Ăn 14 392928 2345174 2026-04-14T07:36:04Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345174 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Ăn uống 14 392929 2345175 2026-04-14T07:36:07Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345175 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Tự nhiên 14 392930 2345176 2026-04-14T07:36:15Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345176 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Danh sách chủ đề thuộc nhóm liên quan 14 392931 2345177 2026-04-14T07:36:17Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345177 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Hành vi con người 14 392932 2345178 2026-04-14T07:36:34Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345178 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:hoc:Con người 14 392933 2345179 2026-04-14T07:36:53Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345179 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Yêu cầu chữ viết bản địa mục từ tiếng Gadaba Bodo 14 392934 2345181 2026-04-14T07:39:51Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345181 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Yêu cầu chữ viết bản địa mục từ tiếng Bondo 14 392935 2345182 2026-04-14T07:39:56Z WhoAlone 40420 Trang mới: “{{auto cat}}” 2345182 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Bản mẫu:se-infl-verb-contr 10 392936 2345186 2026-04-14T09:23:06Z Higashizakura 36666 Trang mới 2345186 wikitext text/x-wiki {{#invoke:se-verbs|contr}}<!-- --><noinclude>{{tài liệu}}</noinclude> 4qfjn38fpjexma8gv193epgp0ubnwfa čorget 0 392937 2345187 2026-04-14T09:26:18Z Higashizakura 36666 Trang mới 2345187 wikitext text/x-wiki =={{langname|se}}== ==={{đm|etym}}=== {{rfe|se}} ==={{đm|pron}}=== * {{se-IPA}} ==={{đm|v}}=== {{se-verb}} # [[lau|Lau]], [[dọn]]. ===={{đm|infl}}==== {{se-infl-verb-contr|čorge}} ===={{đm|drv}}==== * {{l|se|čorgejeaddji}} ===={{đm|further}}==== * {{R:Álgu|14723}} at8qozhkxci366bm11ap0eh1xwstoy6 Thể loại:Trang có nguyên từ thiếu ID 14 392938 2345190 2026-04-14T09:51:29Z TheHighFighter2 42988 Trang mới: “{{auto cat}}” 2345190 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx długopis 0 392939 2345194 2026-04-14T10:54:16Z Kelly zhrm 58416 Trang mới: “=={{langname|pl}}== {{wp|pl:}} [[Image:03-BICcristal2008-03-26.jpg|thumb|długopis]] ==={{ĐM|etym}}=== Từ {{affix|pl|długi|-o-|pisać}}. ==={{ĐM|pron}}=== {{pl-pr|a=Pl-długopis.ogg}} ==={{ĐM|n}}=== {{pl-noun|m-in}} # [[bút bi|Bút bi]]. ===={{ĐM|decl}}==== {{pl-decl-noun-m-in}} ===={{ĐM|drv}}==== {{col|pl|title=tính từ|długopisowy}} ==={{ĐM|further}}=== * {{R:pl:WSJP}} * {{R:pl:PWN}} {{C|pl|Vật dụng viết}}” 2345194 wikitext text/x-wiki =={{langname|pl}}== {{wp|pl:}} [[Image:03-BICcristal2008-03-26.jpg|thumb|długopis]] ==={{ĐM|etym}}=== Từ {{affix|pl|długi|-o-|pisać}}. ==={{ĐM|pron}}=== {{pl-pr|a=Pl-długopis.ogg}} ==={{ĐM|n}}=== {{pl-noun|m-in}} # [[bút bi|Bút bi]]. ===={{ĐM|decl}}==== {{pl-decl-noun-m-in}} ===={{ĐM|drv}}==== {{col|pl|title=tính từ|długopisowy}} ==={{ĐM|further}}=== * {{R:pl:WSJP}} * {{R:pl:PWN}} {{C|pl|Vật dụng viết}} 6watnrcukpi2jnh94gmr91hxqoyentf cagana 0 392940 2345196 2026-04-14T11:01:10Z Hiyuune 50834 + se 2345196 wikitext text/x-wiki =={{langname|se}}== ==={{section|pron}}=== * {{se-IPA}} ==={{section|noun}}=== {{head|se|Biến thể hình thái danh từ}} # {{infl of|se|cagan||acc//gen|s}} h43s09qi0ur5jtwdnm8m8ft4dxjw3a6 Thể loại:Khối ký tự Cyrillic Supplement 14 392941 2345198 2026-04-14T11:15:13Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345198 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Khối ký tự Egyptian Hieroglyphs Extended-A 14 392942 2345199 2026-04-14T11:16:20Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345199 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Khối ký tự Gurung Khema 14 392943 2345200 2026-04-14T11:20:01Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345200 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx Thể loại:Khối ký tự Ol Onal 14 392944 2345201 2026-04-14T11:20:49Z Hiyuune 50834 Trang mới: “{{auto cat}}” 2345201 wikitext text/x-wiki {{auto cat}} eomzlm5v4j7ond1phrju7cnue91g5qx leaskalohku 0 392945 2345202 2026-04-14T11:24:51Z Hiyuune 50834 Trang mới: “=={{langname|se}}== ==={{section|etym}}=== {{compound|se|leaska|lohku}} ==={{section|pron}}=== * {{se-IPA}} ==={{section|n}}=== {{se-noun}} # [[số lẻ|Số lẻ]]. ===={{section|infl}}==== {{se-infl-noun-even|leaskalohku}}” 2345202 wikitext text/x-wiki =={{langname|se}}== ==={{section|etym}}=== {{compound|se|leaska|lohku}} ==={{section|pron}}=== * {{se-IPA}} ==={{section|n}}=== {{se-noun}} # [[số lẻ|Số lẻ]]. ===={{section|infl}}==== {{se-infl-noun-even|leaskalohku}} 12ufwfot0yy55w393l10einfhww2czi Mô đun:dialect synonyms/ain/ヤトッタ 828 392946 2345204 2026-04-14T11:56:26Z Hiyuune 50834 Trang mới: “local export = {} export.gloss = "diều" export.syns = { -- Hokkaido: Trung/Nam ["Abuta"] = { "" }, ["Azuma"] = { "" }, ["Biratori"] = { "" }, ["Chitose"] = { "ヤットゥイ:yattuy" }, ["Ebeotsu"] = { "" }, ["Hagino"] = { "" }, ["Hidaka"] = { "" }, ["Hobetsu"] = { "" }, ["Horobetsu"] = { "ヤトッタ:yátotta" }, ["Horoman"] = { "" }, ["Mitsuishi"] = { "" }, ["Mukawa"] = { "" }, ["Muroran"] = { "" }, ["Niikappu"] = { "" }, ["Nukkibetsu"] = { "" }, […” 2345204 Scribunto text/plain local export = {} export.gloss = "diều" export.syns = { -- Hokkaido: Trung/Nam ["Abuta"] = { "" }, ["Azuma"] = { "" }, ["Biratori"] = { "" }, ["Chitose"] = { "ヤットゥイ:yattuy" }, ["Ebeotsu"] = { "" }, ["Hagino"] = { "" }, ["Hidaka"] = { "" }, ["Hobetsu"] = { "" }, ["Horobetsu"] = { "ヤトッタ:yátotta" }, ["Horoman"] = { "" }, ["Mitsuishi"] = { "" }, ["Mukawa"] = { "" }, ["Muroran"] = { "" }, ["Niikappu"] = { "" }, ["Nukkibetsu"] = { "" }, ["Ogifushi"] = { "" }, ["Oshamambe"] = { "" }, ["Rebun"] = { "ヤトッタ:yatotta" }, ["Samani"] = { "" }, ["Saru"] = { "ヤットゥイ:yáttuy", "シチカㇷ゚:sícikap", "ピヨロロ:píyororo[幼]" }, ["Shiraoi"] = { "" }, ["Shizunai"] = { "ヤットゥイ:yattuy" }, ["Takae"] = { "" }, ["Takashima"] = { "" }, ["Toyoura"] = { "" }, ["Urakawa"] = { "ヤトッ:yatot" }, ["Usu"] = { "" }, ["Yakumo"] = { "ヤトッタ:yátotta" }, -- Hokkaido: Bắc ["Asahikawa"] = { "ヤトッタ:yátotta" }, ["Chikabumi"] = { "" }, ["Nayoro"] = { "ヤットゥイ:yáttuy" }, ["Soya"] = { "" }, ["Teshio"] = { "" }, -- Hokkaido: Đông ["Abashiri"] = { "" }, ["Akan"] = { "" }, ["Ashoro"] = { "" }, ["Bihoro"] = { "ワトッタ:watotta", "ワトッタカムイ:watottakamuy" }, ["Biroo"] = { "" }, ["Chirotto"] = { "" }, ["Fupushinai"] = { "" }, ["Fushiko"] = { "" }, ["Harutori"] = { "" }, ["Kitami"] = { "" }, ["Kushiro"] = { "" }, ["Kussharo"] = { "ヤトッタ:yatotta" }, ["Memuro"] = { "" }, ["Mokoto"] = { "" }, ["Nemuro"] = { "" }, ["Nijibetsu"] = { "" }, ["Obihiro"] = { "ヤトッタ:yátotta" }, ["Otofuke"] = { "" }, ["Shari"] = { "" }, ["Shiranuka"] = { "" }, ["Tokachi"] = { "" }, ["Tooro"] = { "" }, -- Sakhalin: Bở Tây ["Chirai"] = { "" }, ["Maoka"] = { "" }, ["Raichishka"] = { "" }, ["Shiranushi"] = { "" }, ["Tarantomari"] = { "" }, ["Usoro"] = { "" }, -- Sakhalin: Bờ Đông ["Aihama"] = { "" }, ["Nairo"] = { "" }, ["Niitoi"] = { "" }, ["Ochiho"] = { "" }, ["Shirahama"] = { "" }, ["Shiraura"] = { "" }, ["Taraika"] = { "" }, ["Tonnai"] = { "" }, ["Yamambetsu"] = { "" }, -- Kuril: Bắc ["Kuril"] = { "" }, ["Paramushir"] = { "" }, ["Shumshu"] = { "" }, -- Kuril: Nam ["Etorofu"] = { "" }, ["South Kuril"] = { "" }, } return export 4918jrvk0igx452d7pe3g2tgroduwff