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. – ''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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/41|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/42|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/43|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/44|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/45|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/46|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/47|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/48|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/49|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/50|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/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ý 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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/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ý 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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/03|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/04|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/05|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/06|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/07|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/08|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/09|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/10|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/11|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/12|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/13|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/14|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/15|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><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]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/16|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><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]]. – [[Thành viên:Mxn|Nguyễn Xuân Minh]] <sup>[[Thảo luận Thành viên:Mxn|<span style="display: inline-block;">💬</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 = "; "
local SPACE_LBRAC = " ["
local RBRAC = "]"
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,
' <span class="error" style="font-size:88%">Invalid ISBN</span>[[Category:Pages with ISBN errors]]'
)
end
local function issn(text)
return "[https://www.worldcat.org/issn/"
.. text
.. " →ISSN]"
.. check_issn(
text,
' <span class="error" style="font-size:88%">Invalid 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] = "<",
[TEMP_GT] = ">",
[TEMP_LBRAC] = "[",
[TEMP_RBRAC] = "]",
[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=[{{w|Gilbert Clerke}}]
* 2ndauthor=Martin Biddle & Sally Badham
* author=Peter Christen Asbjørnsen
There may be both embedded semicolons and HTML entities with semicolons in them:
* author=[{{w|Voltaire}} [pseudonym; François-Marie Arouet]]
In general we want to treat [ like an opening bracket and ] like a closing bracket. Beware that they may be
mismatched:
* author=Anonymous [{{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 = " – "
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(" ", " ")
:gsub(" ", " ")
:gsub(" ", " ")
:gsub("[", "[")
:gsub("]", "]")
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("‎<sup>[" .. (archiveurl or url) .. "]</sup>")
elseif urls then
verify_title_supplied(urls_fullname)
sep = nil
add("‎<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("–", "–")
check_val = check_val:gsub("–", "–")
check_val = check_val:gsub("—", "—")
check_val = check_val:gsub("—", "—")
-- 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 = ": " -- 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 = "; "
local SPACE_LBRAC = " ["
local RBRAC = "]"
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,
' <span class="error" style="font-size:88%">Invalid ISBN</span>[[Category:Pages with ISBN errors]]'
)
end
local function issn(text)
return "[https://www.worldcat.org/issn/"
.. text
.. " →ISSN]"
.. check_issn(
text,
' <span class="error" style="font-size:88%">Invalid 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] = "<",
[TEMP_GT] = ">",
[TEMP_LBRAC] = "[",
[TEMP_RBRAC] = "]",
[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=[{{w|Gilbert Clerke}}]
* 2ndauthor=Martin Biddle & Sally Badham
* author=Peter Christen Asbjørnsen
There may be both embedded semicolons and HTML entities with semicolons in them:
* author=[{{w|Voltaire}} [pseudonym; François-Marie Arouet]]
In general we want to treat [ like an opening bracket and ] like a closing bracket. Beware that they may be
mismatched:
* author=Anonymous [{{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 = " – "
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(" ", " ")
:gsub(" ", " ")
:gsub(" ", " ")
:gsub("[", "[")
:gsub("]", "]")
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("‎<sup>[" .. (archiveurl or url) .. "]</sup>")
elseif urls then
verify_title_supplied(urls_fullname)
sep = nil
add("‎<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("–", "–")
check_val = check_val:gsub("–", "–")
check_val = check_val:gsub("—", "—")
check_val = check_val:gsub("—", "—")
-- 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 = ": " -- 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"> [[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 "—"
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 thứ 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 thứ 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 thứ 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 "—"
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 loại 1
! style="background: var(--wikt-palette-mint);color:inherit;" | điều kiện 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 "—"
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 loại 1
! style="background: var(--wikt-palette-mint);color:inherit;" | điều kiện 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"> 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" | —
! 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>
| —
| {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>>)
| —
| {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 — 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 — 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> 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, "* 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 "—"
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
| —
| —
! ngôi thứ nhất số ít
| —
| —
|- 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" | —
| data-accel-col="4" | —
|- 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" | —
| data-accel-col="4" | —
|- 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" | —
| data-accel-col="4" | —
|- 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}}}
| —
| 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}}}
| —
|- class="vsHide"
! class="thsub" | [[elative|xuất cách]]
| data-accel-col="1" | {{{inf3_ela}}}
| —
|- class="vsHide"
! class="thsub" | [[illative|nhập cách]]
| data-accel-col="1" | {{{inf3_ill}}}
| —
|- class="vsHide thsub" |
! class="thsub" | [[adessive|cách kế cận]]
| data-accel-col="1" | {{{inf3_ade}}}
| —
|- class="vsHide thsub" |
! class="thsub" | [[abessive|vô cách]]
| data-accel-col="1" | {{{inf3_abe}}}
| —
|- 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 "—"
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
m̃
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