Wiktionary
viwiktionary
https://vi.wiktionary.org/wiki/Wiktionary:Trang_Ch%C3%ADnh
MediaWiki 1.46.0-wmf.24
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
baseball
0
8431
2348901
2062406
2026-04-27T14:34:41Z
Hiyuune
50834
2348901
wikitext
text/x-wiki
{{also|Baseball|base ball|base-ball}}
=={{langname|en}}==
[[Hình:Baseball.jpg|thumb|baseball]]
==={{section|alt}}===
* {{alt|en|base ball||obsolete}} {{defdate|thập niên 1800}}
* {{alt|en|base-ball||dated}}
==={{section|etym}}===
{{ety|en|:af|base<id:cơ sở>|ball}}
Từ {{affix|en|base|ball}}.
==={{section|pron}}===
* {{IPA4|en|/ˈbeɪs.bɔːl/|a=UK}}
* {{IPA4|en|/ˈbeɪs.bɔl/|/ˈbeɪs.bɑl/|a=US}}
* {{audio|en|En-us-baseball.ogg|a=US}}
==={{section|n}}===
{{en-noun|~}}
# [[bóng chày|Bóng chày]].
===={{section|drv}}====
{{col|en|antibaseball|baseballdom|baseballese|baseballing|basebrawl|nonbaseball|baseball bat|baseball hat|insider baseball
|baseball cap|baseball uniform
|baseball diamond
|baseballer
|baseball game
|baseball glove
|baseballist
|baseball mitt
|baseball player
|baseball stadium|baseball plant
|indoor baseball
|British baseball|Welsh baseball|baseball Annie|baseball card|baseball field|baseball rule|fantasy baseball|inside baseball|inside-baseball|organized baseball|rotisserie baseball|scrub baseball}}
==={{section|see}}===
* {{l|en|rounders}}
* {{l|en|softball}}
* {{l|en|wiffleball}}
==={{section|ref}}===
* {{R:FVDP|db=ev}}
==={{section|further}}===
* {{R:commons}}
* {{pedia|lang=en}}
* {{R:wquote}}
* {{R:wvoyage}}
{{C|en|Bóng chày|Thể thao}}
e5vtp2pbpqe15kb2aay2us169xj1aj2
ngả mũ
0
28915
2348881
1880246
2026-04-27T14:19:02Z
Hiyuune
50834
2348881
wikitext
text/x-wiki
=={{langname|vi}}==
==={{section|pron}}===
{{vi-pron}}
==={{section|v}}===
{{vi-verb}}
# [[bỏ|Bỏ]] [[mũ]] xuống để [[chào]] một cách [[kính cẩn]].
#: {{ux|vi|Học trò đều '''ngả mũ''' chào thầy giáo.}}
==={{section|ref}}===
* {{R:FVDP}}
9jfij7h68d4d2jovuawcwb05kcllly8
base
0
37078
2348900
2282910
2026-04-27T14:32:01Z
Hiyuune
50834
2348900
wikitext
text/x-wiki
{{-eng-}}
[[Hình:Base.arcature.eglise.Saint.Denis.png|thumb|base]]
{{-pron-}}
* [[Wiktionary:IPA|IPA]]: {{IPA|/ˈbeɪs/}}
{{pron-audio
|place=Hoa Kỳ (California)
|file=En-us-base.ogg
|pron=ˈbeɪs}}
{{-noun-}}
{{eng-noun}} {{IPA|/ˈbeɪs/}}
# [[cơ sở|Cơ sở]], [[nền]], [[nền tảng]], [[nền móng]].
# [[đáy|Đáy]], [[chấn]] [[đế]].
# [[căn cứ|Căn cứ]].
#: ''air '''base''''' — căn cứ không quân
#: ''military '''base''''' — căn cứ quân sự
#: '''''base''' of operation'' — căn cứ tác chiến
# {{@|toán học}} [[đường|Đường]] [[đáy]], [[mặt đáy]].
#: '''''base''' of a triangle'' — đáy tam giác
# {{@|toán học}} [[cơ số|Cơ số]].
#: '''''base''' of logarithm'' — cơ số của logarit
# {{@|ngôn ngữ học}} [[gốc từ|Gốc từ]].
# {{@|hoá học}} [[bazơ|Bazơ]].
# (''Bóng chày'') [[căn cứ|Căn cứ]], [[chốt]]; một trong [[bốn]] [[điểm]] phải được [[chạm]] [[bóng]].
{{-expr-}}
* '''to be off one's base''': {{@|Mỹ||thông tục}} [[mất trí|Mất trí]].
* '''to get to first base''': {{@|Mỹ||thông tục}} [[khởi công|Khởi công]], [[bắt đầu]] làm (việc gì).
{{-tr-verb-}}
'''base''' ''ngoại động từ'' {{IPA|/ˈbeɪs/}}
# [[đặt tên|Đặt tên]], đặt [[cơ sở]] (cái gì) trên.
# [[dựa|Dựa]] vào, [[căn cứ]] vào.
#: ''to '''base''' oneself on facts'' — dựa vào thực tế
{{-forms-}}
{{eng-verb|base=base|bas|ing}}
{{-adj-}}
{{eng-adj|base|r}} {{IPA|/ˈbeɪs/}}
# [[hèn hạ|Hèn hạ]], [[đê tiện]]; [[khúm núm]], [[quỵ luỵ]].
# [[thường|Thường]], không [[quý]] ([[kim loại]]).
#: '''''base''' metals'' — kim loại thường
# [[giả|Giả]] ([[tiền]]).
#: '''''base''' coin'' — đồng tiền giả
{{-ref-}}
{{R:FVDP|db=ev}}
{{-fra-}}
{{-pron-}}
* [[Wiktionary:IPA|IPA]]: {{IPA|/bɑz/}}
* {{pron-audio|place=Pháp (Paris)|file=fr-base.ogg|pron=baz}}
{{-noun-}}
{{fra-noun|
s=base|p=bases|
sp=/bɑz/|pp=/bɑz/}}
'''base''' {{IPA|/bɑz/}} {{f}}
# [[gốc|Gốc]], [[đáy]], [[chân]], [[nền]].
#: ''La '''base''' du cœur'' — đáy tim
#: ''La '''base''' d’un triangle'' — đáy tam giác
#: ''Un médicament à '''base''' de mercure'' — một vị thuốc mà chất nền là thủy ngân
#: ''La '''base''' d’une colonne'' — chân cột
# [[căn cứ|Căn cứ]].
#: '''''Bases''' militaires'' — căn cứ quân sự
# {{@|hóa học}} [[bazơ|Bazơ]].
# {{@|toán học}} [[cơ số|Cơ số]].
# {{@|ngôn ngữ học}} [[thân từ|Thân từ]].
# [[nền tảng|Nền tảng]], [[cơ sở]].
#: ''Poser les '''bases''' d’une science'' — đặt cơ sở cho một khoa học
#: ''Sur la '''base''' de'' — trên cơ sở
#: ''carré par la '''base'''; carré de '''base''''' — cương trực
{{-ref-}}
{{R:FVDP|db=fv}}
[[Thể loại:Danh từ tiếng Anh]]
[[Thể loại:Danh từ tiếng Pháp]]
[[Thể loại:Tính từ tiếng Anh]]
[[Thể loại:Động từ tiếng Anh]]
[[Thể loại:en:Bóng chày]]
=={{langname|dru}}==
==={{ĐM|noun}}===
{{head|dru|Danh từ}}
# [[xe buýt]].
# món [[canh]], món [[xúp]].
d1bxqv01uo8q79peqwqtsxhso9upzcg
Trà My
0
85722
2348894
1310811
2026-04-27T14:29:39Z
Hiyuune
50834
2348894
wikitext
text/x-wiki
=={{langname|vi}}==
{{wp|<dab!>}}
==={{section|pron}}===
{{vi-pron}}
==={{section|pr-noun}}===
{{vi-proper noun|head=[[trà|Trà]] [[my|My]]}}
# {{place|vi|xã|city/Đà Nẵng|c/Việt Nam}}
# {{lb|vi|historical}} {{place|vi|huyện|p/Quảng Nam|c/Việt Nam}}
==={{section|ref}}===
* {{R:FVDP}}
7drg30cgwokd74o60n7oi7ngbs1an6t
tài
0
92476
2348920
2273715
2026-04-27T15:11:21Z
Hiyuune
50834
2348920
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "tai"}}
=={{langname|vi}}==
==={{section|pron}}===
{{vi-IPA}}
==={{section|etym}} 1===
{{vi-etym-sino|才}}
===={{section|alt}}====
* {{q|Nam Bộ, không còn dùng}} {{l|vi|tời}}
===={{section|n}}====
{{vi-noun}}
# [[khả năng|Khả năng]] đặc [[biệt]] làm một [[việc]] nào đó.
#: {{ux|vi|Một nhà văn có '''tài'''.}}
#: {{ux|vi|'''Tài''' ngoại giao.}}
#: {{ux|vi|Cậy '''tài'''.}}
#: {{ux|vi|Hội thi '''tài''' của thợ trẻ.}}
===={{section|adj}}====
{{vi-adj}}
# Có [[tài năng]].
#: {{ux|vi|Người '''tài'''.}}
#: {{ux|vi|Bắn súng rất '''tài'''.}}
===={{section|drv}}====
{{col4|vi|tài năng|tài giỏi|tài ba|tài hoa|tài sắc|tài tình|tài tử|nhân tài|tài đức|tam tài|thiên tài|tài cán|trổ tài|danh tài|kì tài|đại tài|hiền tài|bất tài|tài trí|anh tài|đa tài|thực tài|tài lanh|tài không đợi tuổi|trai tài gái sắc|nô tài|tài lực|tài sắc|biệt tài|chân tài|so tài|tài lẻ|tranh tài|tài phán|đặc tài|thử tài}}
==={{section|etym}} 2===
===={{section|n}}====
{{vi-noun}}
# {{lb|vi|colloquial}} {{short for|vi|tài xế}}
==={{section|etym}} 3===
===={{section|rom}}====
{{head|vi|Latinh hóa}}
# {{sino-vietnamese reading of|財}}
====={{section|drv}}=====
{{col3|vi|gia tài|tài sản|tài chính|hãm tài|tiền tài|tài nguyên|tài phiệt|cung hỉ phát tài|tấn tài tấn lộc|tài lộc|Thần Tài|Thiện Tài|tham tài}}
==={{section|etym}} 4===
===={{section|rom}}====
{{head|vi|Latinh hóa}}
# {{sino-vietnamese reading of|裁}}
====={{section|drv}}=====
{{col|vi|chế tài|độc tài|tài chế}}
==={{section|etym}} 5===
===={{section|rom}}====
{{head|vi|Latinh hóa}}
# {{sino-vietnamese reading of|材}}
====={{section|drv}}=====
{{col|vi|đề tài|khí tài|quan tài|tài binh|tài liệu}}
==={{section|etym}} 6===
===={{section|rom}}====
{{head|vi|Latinh hóa}}
# {{sino-vietnamese reading of|裁}}
====={{section|drv}}=====
{{col|vi|tổng tài|trọng tài}}
==={{section|ref}}===
* {{R:FVDP}}
* {{R:WinVNKey:Lê Sơn Thanh}}
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{cmn-pinyin of|夣}}
# {{cmn-pinyin of|太}}
# {{cmn-pinyin of|夳}}
# {{cmn-pinyin of|忕}}
# {{cmn-pinyin of|忲}}
# {{cmn-pinyin of|态}}
# {{cmn-pinyin of|態}}
# {{cmn-pinyin of|曃}}
# {{cmn-pinyin of|汏}}
# {{cmn-pinyin of|汰}}
# {{cmn-pinyin of|泰}}
# {{cmn-pinyin of|溙}}
# {{cmn-pinyin of|燤}}
# {{cmn-pinyin of|肽}}
# {{cmn-pinyin of|胼}}
# {{cmn-pinyin of|舦}}
# {{cmn-pinyin of|酞}}
# {{cmn-pinyin of|鈦}}
# {{cmn-pinyin of|㑷}}
# {{cmn-pinyin of|能}}
==={{section|ref}}===
* [[w:en:Wenlin|Từ điển Bính âm Wenlin]]
biyl82w4szno9td20bnvkj6k4jmrd2k
Thảo luận Wiktionary:Thảo luận
5
103987
2348988
2348577
2026-04-27T18:06:29Z
MediaWiki message delivery
19980
Mục mới: /* Bản tin Kỹ thuật: Tuần 18-2026 */
2348988
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 [[gitiles:operations/mediawiki-config/+/a2d2aaab9ace84280dd2f4c70a33bb69cd73850f/dblists/small.dblist|nhỏ]] và [[gitiles: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 -->
== Bản tin Kỹ thuật: Tuần 17-2026 ==
<section begin="technews-2026-W17"/><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/17|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'''
* Sau hai năm phát triển, [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], hay còn được biết đến với tên [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], sẽ được chính thức đưa ra khỏi giai đoạn beta vào thứ 3, ngày 21 tháng 4. Nó mang lại khả năng đọc mã nguồn và mã wiki tốt hơn, giảm thiểu lỗi đánh máy cùng những [[mw:Special:MyLanguage/Help:Extension:CodeMirror|lợi ích]] khác cho tất cả người dùng sử dụng trình tô sáng cú pháp tiêu chuẩn. Xin gửi lời cảm ơn chân thành đến tình nguyện viên [https://phabricator.wikimedia.org/p/Bhsd/ Bhsd] vì đã phát triển nhiều tính năng mới, bao gồm [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Code folding|gấp mã nguồn]], [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Autocompletion|tự động điền]], và [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|kiểm tra lỗi]]. [https://phabricator.wikimedia.org/T259059]
* Một bản cập nhật lớn dành cho ứng dụng Wikipedia trên iOS hiện đang được triển khai, nhằm thiết kế lại giao diện để phù hợp với thiết kế trực quan "Liquid Glass" mới nhất của Apple. [https://apps.apple.com/us/app/wikipedia/id324715238 Hãy tải phiên bản mới nhất] và khám phá bản cập nhật này.
'''Cập nhật cho biên tập viên'''
* [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|Danh sách đọc]] là một tính năng cho phép người đọc lưu các bài viết vào danh sách để đọc sau. Tính năng này hiện đang trong giai đoạn thử nghiệm beta trên Wikipedia tiếng Ả Rập, tiếng Pháp, tiếng Indonesia, tiếng Việt và tiếng Trung, và được bật mặc định cho tất cả các tài khoản mới trên tất cả các trang Wikipedia.
* Một thử nghiệm khám phá việc mở rộng [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|tính năng Xem trước Trang cho trang web di động]] sẽ được triển khai trong tuần ngày 20 tháng 4 trên các trang Wikipedia tiếng Ả Rập, tiếng Anh, tiếng Pháp, tiếng Ý, tiếng Ba Lan và tiếng Việt. Tính năng Xem trước Trang là pop-up hiển thị hình thu nhỏ kèm liên kết mở toàn bộ bài viết từ liên kết xanh, từ đó cải thiện khả năng tìm kiếm nội dung. Tính năng này hiện đã có sẵn trên máy tính để bàn và trong ứng dụng. [[m:Special:MyLanguage/List of experiments in Product and Technology#Template|Đọc thêm về thử nghiệm này cùng những thử nghiệm khác]].
* Trên một số trang wiki, những biên tập viên đã đăng nhập nhưng chưa [[mw:Special:MyLanguage/Help:Email confirmation|xác nhận địa chỉ thư điện tử (email) của mình]] nay có thể nhìn thấy một biểu ngữ khuyến khích họ làm vậy. Việc xác nhận địa chỉ email cho phép người dùng khôi phục quyền truy cập vào tài khoản nếu họ bị mất quyền truy cập đó. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Encouraging users to confirm their email addresses|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T421366]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:15}} {{PLURAL:15|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à việc sửa đổi các trang wiki rất lớn trong trình soạn thảo mã wiki 2017 gây ra hiện tượng tải chậm, bị trễ khi xem trước và cuộn, cũng như các vấn đề về hiệu suất khi chọn, cắt hay dán nội dung, nay đã được giải quyết. [https://phabricator.wikimedia.org/T184857]
'''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 việc nâng cấp [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] từ tính năng beta lên làm tính năng chính thức, tất cả người dùng sẽ sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] làm trình tô sáng cú pháp khi sửa đổi các trang nội dung bằng JavaScript, CSS, JSON, Vue và Lua. [https://phabricator.wikimedia.org/T419332]
* Dịch vụ <code>mirrors.wikimedia.org</code> dành cho người dùng Debian và Ubuntu sẽ kết thúc hỗ trợ và ngừng hoạt động vào ngày 15 tháng 5. Tài nguyên dịch vụ này sẽ được thay thế bằng những tùy chọn mới và tốt hơn. Một số người dùng có thể cần phải chuyển sang máy chủ khác, quá trình này sẽ mất khoảng một phút. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/LJYRIS4WB66HIRCAO4GIDTXCMDVZRBMA/ Bạn có thể đọc thêm]. [https://phabricator.wikimedia.org/T416707]
* Bảng <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi> sẽ bị loại bỏ khỏi [[wikitech:Help:Wiki Replicas|wikireplicas]]. Nếu công cụ hoặc truy vấn của bạn truy cập trực tiếp vào <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> hoặc <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi>, vui lòng cập nhật chúng để sử dụng bảng <bdi lang="zxx" dir="ltr"><code><nowiki>file</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>filerevision</nowiki></code></bdi> trước ngày 28 tháng 5. [https://phabricator.wikimedia.org/T28741]
* Sau việc triển khai những giới hạn tần suất truy cập API toàn cục gần đây đối với lưu lượng truy cập không xác định, Quỹ Wikimedia sẽ tiếp tục nỗ lực đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng hợp lý cơ sở hạ tầng]] bằng cách áp dụng giới hạn toàn cục đối với lưu lượng truy cập API xác định kể từ tuần cuối cùng của tháng 4. Những giới hạn này được cố ý đặt ở mức cao nhất có thể để 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 hiện sẽ không bị ảnh hưởng. Dù vậy, tất cả các nhà phát triển được khuyến cáo nên tuân theo những 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 tần suất]] và [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits/FAQ|Câu hỏi Thường gặp]].
* [[mw:Special:MyLanguage/Attribution API|API Ghi công]] hiện có sẵn dưới dạng [[mw:Special:MyLanguage/Wikimedia APIs/Stability policy|tính năng beta]]. API này lấy thông tin nhằm ghi công các bài viết và tập tin phương tiện của Wikimedia bất kỳ chỗ nào mà chúng được sử dụng. Trang tài liệu tham khảo có sẵn thông qua trang đặc biệt Chỗ thử REST có mặt trên tất cả các trang wiki của Wikimedia (chẳng hạn như [https://en.wikipedia.org/w/index.php?api=attribution.v0-beta&title=Special%3ARestSandbox chỗ thử REST trên Wikipedia tiếng Anh]). Hãy chia sẻ phản hồi của bạn trên [[mw:Talk:Attribution API|trang thảo luận dự án]].
* 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/2026/17|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-W17"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:00, ngày 20 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=30432763 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[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]]) 00:58, ngày 26 tháng 4 năm 2026 (UTC)
</bdi>
<!-- Tin nhắn của Thành viên:Codename Noreste@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=30424282 -->
== Bản tin Kỹ thuật: Tuần 18-2026 ==
<section begin="technews-2026-W18"/><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/18|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'''
* Sẽ có một thay đổi về cách người dùng mới được tự động xác nhận nhằm cải thiện khả năng bảo vệ chống phá hoại. Hiện tại, người dùng đã mở tài khoản được vài ngày và thực hiện được một vài sửa đổi được tự động thêm vào nhóm [[{{int:grouppage-autoconfirmed/{{CONTENTLANGUAGE}}}}|{{int:group-autoconfirmed}}]]. Cấu hình này thường bị một số thành viên phá hoại lợi dụng bằng cách tạo tài khoản và chỉ bắt đầu sử dụng nó sau một khoảng thời gian. Để giảm thiểu điều này, trong tuần tới cấu hình này sẽ được cập nhật sao cho – nhằm mục đích được tự động xác nhận – tuổi của tài khoản sẽ được tính từ sửa đổi đầu tiên của họ, thay vì ngày tạo tài khoản. Giá trị số của ngưỡng tuổi vẫn sẽ được giữ nguyên. Thay đổi này sẽ chỉ được triển khai đến các wiki yêu cầu ít nhất một sửa đổi là một phần trong điều kiện để có thể được tự động xác nhận. [https://phabricator.wikimedia.org/T418484]
* Tất cả người dùng Wikipedia đã tạo tài khoản mới và những người đã kích hoạt tùy chọn "tự động bật hầu hết các tính năng beta" trong tùy chọn của mình giờ đây có thể sử dụng tính năng beta [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|danh sách đọc]] để lưu bài viết để đọc sau. Điều này giúp người dùng có thể sắp xếp mọi sở thích đọc ở một nơi để có thể dễ dàng truy cậ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 vấn đề khiến cho hình ảnh trong hộp thông tin có khoảng đệm quá lớn trên Firefox đã được giải quyết. [https://phabricator.wikimedia.org/T423676]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Nhắc lại, trong tuần này giới hạn tần suất truy cập API toàn cục sẽ được áp dụng cho lưu lượng truy cập API đã được xác định. Điều này giúp đảm bảo việc [[mw:MediaWiki Product Insights/Responsible Reuse|sử dụng cơ sở hạ tầng một cách hợp lý]]. Các bot chạy trong Toolforge/WMCS hoặc có quyền người dùng bot trên bất kỳ wiki nào hiện tại sẽ không bị ảnh hưởng. Dù vậy, tất cả các nhà phát triển được khuyến cáo tuân theo cách sử dụng thực tiễn được cập nhật. Để biết thêm thông tin, bao gồm giới hạn tần suất truy cập thực tế, xem [[mw:Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn tần suất truy cập]] và [[mw:Wikimedia APIs/Rate limits/FAQ|Câu hỏi Thường gặp]].
* [[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.26|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/18|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-W18"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:06, ngày 27 tháng 4 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=30458046 -->
j1dwqk83oz9c496k2tb7ncsvphrrpjx
bag
0
105648
2348899
2062400
2026-04-27T14:31:41Z
Hiyuune
50834
2348899
wikitext
text/x-wiki
{{-eng-}}
{{-pron-}}
* [[Wiktionary:IPA|IPA]]: {{IPA|/ˈbæɡ/}} {{term|Anh, Mỹ}}, {{IPA|[ˈbɛːɡ]}} {{term|Mỹ}} {{term|Thông tục}}
{{pron-audio
|place=Bắc California, Hoa Kỳ (nữ giới)
|file=En-us-bag.ogg
|pron=ˈbæːɡ}}
{{-etymology-}}
{{etym-from
| lang = enm | term = bagge | from = {{etym-from
| lang = non | term = baggi | meaning = bao, túi, bó | from = {{etym-from
| lang = ine-proto | attested = 0 | term = bʰak-
}}
}}
}} So sánh với {{cym|style=plain}} ''[[baich]]'' (gánh nặng, bó), {{grc|style=plain}} ''[[βάσταγμα]]'' (''bástagma'', gánh nặng).
{{-noun-}}
{{eng-noun}}
# [[bao|Bao]], [[túi]], [[bị]], [[xắc]], [[cặp]].
# [[va li|Va li]].
# [[cặp|Cặp]] [[sách]]; cái [[ba lô]] [[đeo]] trên [[vai]].
# Cái được [[ưa thích]] hơn.
# {{@|tục tĩu}} [[mụ già|Mụ già]] [[xấu]] như [[quỷ]].
# [[mẻ|Mẻ]] [[săn]].
#: ''to get a good '''bag''''' — săn được nhiều
# {{@|động vật học}} [[túi|Túi]], [[bọng]], [[bọc]].
#: ''honey '''bag''''' — bọng ong
# [[vú|Vú]] ([[bò]]).
# [[chỗ|Chỗ]] [[húp]] [[lên]] (dưới [[mắt]]).
# {{@|số nhiều}} [[của cải|Của cải]], [[tiền bạc]].
# {{@|số nhiều||lóng}} [[quần|Quần]].
# [[chỗ|Chỗ]] [[phùng]] ra, chỗ [[lụng thụng]] (ở [[quần áo]]...).
# (''Bóng chày'') [[gối|Gối]] bằng [[vải]] nằm trên các [[chốt]] [[một]], [[hai]], [[ba]].
# (''Bóng chày'') [[chốt|Chốt]] [[một]], [[hai]], hoặc [[ba]].
# {{term|[[the#Tiếng Anh|the]] +}} [[máy|Máy]] [[đo]] [[độ]] [[cồn]] trong [[máy]] của [[người]] [[lái xe]].
# {{@|toán học}} [[đa|Đa]] [[tập hợp]].
{{-syn-}}
; bao
* [[sack]]
* [[tote]]
* [[poke]] {{term|cũ}}
; va li
* [[suitcase]]
; cặp sách
* [[school-bag]]
* [[backpack]]
; cái được ưa thích hơn
* [[preference]]
; mụ già xấu
* [[hag]]
; chốt
* [[base]]
; máy đo độ cồn
* [[breathalyzer]]
; đa tập hợp
* [[multiset]]
{{-expr-}}
* '''bag of bones''': [[người|Người]] [[gầy]] [[giơ xương]], người [[toàn]] [[xương]].
* '''bag of wind''': [[kẻ|Kẻ]] [[lắm điều]], kẻ hay [[ba hoa]], kẻ hay [[bép xép]], kẻ hay [[nói]] [[huyên]] [[thuyên]].
* '''to give somebody the bag to hold''': [[chuồn|Chuồn]], [[bỏ mặc]] ai [[trong lúc]] [[khó khăn]].
* '''in the bag''': {{term|Thông tục}} [[nắm chắc|Nắm chắc]] trong [[tay]], [[chắc chắn]].
* '''in the bottom of one's bag''': [[cùng kế|Cùng kế]].
* '''to let the cat out of the bag''': {{see-entry|let}}
* '''to pack up bag and baggage''': [[cuốn gói|Cuốn gói]] [[trốn]] đi.
* '''to put somebody in a bag''': [[thắng|Thắng]] ai.
* '''whole bag of tricks''':
*# [[đủ|Đủ]] các [[mưu mẹo]], [[thiên phương bách kế]].
*# [[tất cả|Tất cả]] không [[để lại]] cái gì.
{{-tr-verb-}}
'''bag''' ''ngoại động từ'' {{IPA|/ˈbæɡ/}}
# [[bỏ|Bỏ]] vào [[túi]], bỏ vào [[bao]].
# {{@|săn bắn}} [[bỏ|Bỏ]] vào [[túi]] [[săn]]; [[bắn]] [[giết]], [[săn]] được.
# [[thu nhặt|Thu nhặt]].
# {{@|thông tục}} [[lấy|Lấy]], [[ăn cắp]].
# {{@|lóng||Mỹ đen}} Đi với [[người]] [[đàn bà]] mình mới [[gặp]] [[ngoài đường]].
# {{@|lóng}} [[nhạo báng|Nhạo báng]].
# [[gặt|Gặt]] ([[lúa]]) bằng [[liềm]].
{{-forms-}}
{{eng-verb|base=bag|bag|g|ed}}
{{-intr-verb-}}
'''bag''' ''nội động từ'' {{IPA|/ˈbæɡ/}}
# [[phồng|Phồng]] lên, [[nở]] ra, [[phùng]] ra.
#: ''these trousers '''bag''' at the knees'' — cái quần này phùng ra ở đầu gối
# {{@|hàng hải}} [[thõng|Thõng]] xuống ([[buồm]]).
# Đi [[chệch]] [[hướng]] ([[thuyền]]).
# {{@|lóng||Mỹ đen}} Bị [[cảnh sát]] [[bắt giữ]].
# {{@|lóng||Mỹ đen}} [[cười|Cười]] [[hô hố]], [[cười ha hả]].
# {{@|y học}} [[thông hơi|Thông hơi]] dùng [[máy]] [[thở]] [[túi]]–[[van]]–[[mặt nạ]] ([[BVM]]).
{{-expr-}}
* '''I bag; bags I; bags!''': {{@|ngôn ngữ nhà trường||lóng}} [[đến|Đến]] [[lượt]] [[tớ]], đến [[phiên]] tớ!
{{-ref-}}
{{R:FVDP}}
[[Thể loại:Danh từ tiếng Anh]]
[[Thể loại:Ngoại động từ tiếng Anh]]
[[Thể loại:Nội động từ tiếng Anh]]
[[Thể loại:en:Bóng chày]]
{{-dta-}}
{{-verb-}}
{{pn}}
# [[bò]] đực.
[[Thể loại:Động từ tiếng Daur]]
ss2jle1exs6r3zs6zcyd9w80au4jini
breechblock
0
144990
2348882
265074
2026-04-27T14:19:44Z
Hiyuune
50834
Hiyuune đã đổi [[breech-block]] thành [[breechblock]]
265074
wikitext
text/x-wiki
{{-eng-}}
{{-noun-}}
'''breech-block'''
# [[tấm|Tấm]] [[thép]] đóng [[khoá]] [[nòng súng]].
{{-ref-}}
{{R:FVDP}}
[[Thể loại:Danh từ tiếng Anh]]
exvlj77nh84ql1afqgh7hnyrnugp5mf
2348884
2348882
2026-04-27T14:21:19Z
Hiyuune
50834
2348884
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|alt}}===
* {{l|en|breech block}}
==={{section|etym}}===
Từ {{compound|en|breech|block}}.
==={{section|n}}===
{{wp|en:}}
{{en-noun}}
# {{lb|en|firearms}} [[tấm|Tấm]] [[thép]] đóng [[khoá]] [[nòng súng]].
==={{section|etym}}===
* {{R:FVDP|db=ev}}
b4alit1naycvdbpm0epi9uxhvevhkwc
out
0
171051
2348898
2258721
2026-04-27T14:31:18Z
Hiyuune
50834
2348898
wikitext
text/x-wiki
{{-eng-}}
{{rank-eng|if|there|more|54|out|into|up|your}}
{{-pron-}}
* [[Wiktionary:IPA|IPA]]: {{IPA|/ˈɑʊt/}}, {{IPA|/ˈʌʊt/}} {{term|Canada}}
{{pron-audio
|place=Canada (nam giới)
|file=En-ca-out.ogg
|pron=ˈʌʊt}}
{{pron-audio
|place=Bắc California, Hoa Kỳ (nữ giới)
|file=En-us-out.ogg
|pron=ˈɑʊt}}
{{-etymology-}}
{{etym-from
| lang = ang | term = ut | lterm = ūt
| 2 term = ute | 2 lterm = ūte
}} Cùng nguồn gốc với {{nld|style=plain}} ''[[uit]]''; {{deu|style=plain}} ''[[aus]]''; {{swe|style=plain}} ''[[ut]]'', ''[[ute]]''; và {{dan|style=plain}} ''[[ud]]'', ''[[ude]]''.
{{-adv-}}
{{eng-adv}}
# [[ngoài|Ngoài]], [[ở ngoài]], [[ra]] ngoài.
#: ''to be '''out''' in the rain'' — ở ngoài mưa
#: ''to be '''out''''' — đi vắng
#: ''to put '''out''' to sea'' — ra khơi
#: ''to be '''out''' at sea'' — ở ngoài khơi
# [[ra|Ra]].
#: ''the war broke '''out''''' — chiến tranh nổ ra
#: ''to spread '''out''''' — trải rộng ra
#: ''to lenngthen '''out''''' — dài ra
#: ''to dead '''out''''' — chia ra
#: ''to pick '''out''''' — chọn ra
# [[hẳn|Hẳn]], [[hoàn toàn]] [[hết]].
#: ''to dry '''out''''' — khô hẳn
#: ''to be tired '''out''''' — mệt lử
#: ''to die '''out''''' — chết hẳn
#: ''before the week is '''out''''' — trước khi hết tuần
#: ''have you read it '''out'''?'' — anh ta đã đọc hết cuốn sách đó chưa?
#: ''he would not hear me '''out''''' — nó nhất định không nghe tôi nói hết đã
# Không [[nắm]] [[chính quyền]].
#: ''Tories are '''out''''' — đảng Bảo thủ (Anh) không nắm chính quyền
# Đang [[bãi công]].
#: ''miners are '''out''''' — công nhân mỏ đang bãi công
# [[tắt|Tắt]], không [[cháy]].
#: ''the fire is '''out''''' — đám cháy tắt
#: ''to turn '''out''' the light'' — tắt đèn
# Không [[còn]] là [[mốt]] nữa.
#: ''top hats are '''out''''' — mũ chóp cao không còn là mốt nữa
# [[to|To]] [[thẳng]], [[rõ]] ra.
#: ''to sing '''out''''' — hát to
#: ''to speak '''out''''' — nói to; nói thẳng
#: ''to have it '''out''' with somebody'' — giải thích cho rõ ra với ai, nói thẳng ra với ai
# [[sai khớp|Sai khớp]], [[trật khớp]], [[trẹo xương]].
#: ''arm is '''out''''' — cánh tay bị trẹo xương
# [[gục|Gục]], [[bất tỉnh]].
#: ''to knock '''out''''' — đánh gục, đánh bất tỉnh, cho đo ván
#: ''to pass '''out''''' — ngất đi, bất tỉnh
# [[sai|Sai]], [[lầm]].
#: ''to be '''out''' in one's calculations'' — sai trong sự tính toán
# Không như [[bình thường]], [[bối rối]], [[luống cuống]], [[lúng túng]].
#: ''the news put him '''out''''' — tin đó làm anh ra bối rối
#: ''I have forgotten my part and I am '''out''''' — tôi quên mất phần vở (kịch) của tôi và tôi cuống lên
# Đã [[xuất bản]] ([[sách]]); đã [[nở]] ([[gà]] [[con]]); đã được [[cho]] [[ra]] [[giao du]] ([[con gái]] mới [[lớn lên]]); đã [[truyền]] đi ([[bức điện]]).
# (''Bóng chày'') Đã bị [[đội]] [[đối thủ]] [[loại]] ra khỏi [[cuộc]] ([[vận động viên]]).
{{-syn-}}
; ngoài
* [[away]]
{{-ant-}}
; ngoài
* [[in]]
{{-expr-}}
* '''all out''': {{@|thông tục}} [[hoàn toàn|Hoàn toàn]], [[hết sức]], [[hết]] [[lực]]; [[toàn tâm]] [[toàn]] [[ý]].
* '''to be out and about''': Đã [[dậy]] ra [[ngoài]] được (sau khi [[ốm]] [[khỏi]]).
* '''out and away''': [[bỏ xa|Bỏ xa]], không thể [[so sánh]] được với.
* '''out and to be out for something''': Đang đi [[tìm]] cái gì; [[theo đuổi]] cái gì; [[quyết tâm]] [[kiếm]] bằng được cái gì.
* '''out from under''': {{@|Mỹ||thông tục}} [[thoát khỏi|Thoát khỏi]] [[cảnh]] [[khó khăn]], thoát khỏi cảnh [[hiểm nghèo]].
* '''out of''':
*# [[ra|Ra]] [[ngoài]], ra [[khỏi]], ngoài.
*#: '''''out''' of the house'' — ra khỏi nhà
*#: '''''out''' of reach'' — ngoài tầm với
*#: '''''out''' of danger'' — thoát khỏi cảnh hiểm nguy
*# [[vì|Vì]].
*#: '''''out''' of curiosity'' — vì tò mò
*#: '''''out''' of pity'' — vì lòng trắc ẩn
*#: '''''out''' of mecessity'' — vì cần thiết
*# [[bằng|Bằng]].
*#: ''made '''out''' of stone'' — làm bằng đá
*# [[cách xa|Cách xa]], [[cách]].
*#: ''three kilometers '''out''' of Hanoi'' — cách Hà nội ba kilômet
*#: '''''out''' of sight '''out''' of mind'' — xa mặt cách lòng
*# [[sai lạc|Sai lạc]].
*#: ''to sing '''out''' of tune'' — hát sai, hát lạc điệu
*#: '''''out''' of drawing'' — vẽ sai
*# [[trong|Trong]], trong [[số]], trong [[đám]].
*#: ''nine '''out''' of ten'' — chín trong mười cái (lần...)
*#: ''to take one '''out''' of the lot'' — lấy ra một cái trong đám
*# [[hết|Hết]]; [[mất]].
*#: ''to be '''out''' of money'' — hết tiền
*#: ''to be '''out''' of patience'' — không kiên nhẫn được nữa, không nhịn được nữa
*#: ''to be '''out''' of one's mind'' — mất bình tĩnh
*#: ''to cheat someone '''out''' of his money'' — lừa ai lấy hết tiền
*# [[không|Không]].
*#: '''''out''' of doubt'' — không còn nghi ngờ gì nữa, chắc chắn
*#: '''''out''' of number'' — không đếm xuể, vô số
*#: '''''out''' of place'' — không đúng chỗ, không đúng lúc
* '''out to''': {{@|Mỹ}} [[quyết tâm|Quyết tâm]], [[gắng sức]] (làm điều gì).
* '''out with''':
*# [[cút|Cút]] đi, cút [[khỏi]], [[ra]] khỏi.
*#: '''''out''' with him!'' — tống cổ nó ra!
*#: '''''out''' with it!'' — nói ra đi!, cứ nói đi!
*# [[bất hoà|Bất hoà]], [[xích mích]], không [[thân thiện]].
*#: ''to be '''out''' with somebody'' — xích mích với ai, không thân thiện với ai
{{-prep-}}
'''out'''
# [[từ|Từ]] [[ở]]... [[ra]], từ... ra.
#: ''from '''out''' the room came a voice'' — một giọng nói vọng từ trong buồng ra
# [[ở|Ở]] [[ngoài]], ngoài.
#: '''''out''' this window'' — ở ngoài cửa sổ này
# {{nhãn|en|thông tục}} [[từ|Từ]] [[trung tâm]] [[ra]].
{{-syn-}}
; từ ở... ra
* [[through]]
; ở ngoài
* [[out of]]
; từ trung tâm ra
* [[out of]]
* [[out on]]
{{-ant-}}
; từ ở... ra
* [[in]]
; từ trung tâm ra
* [[into]]
{{-adj-}}
{{eng-adj|-}}
# Ở [[ngoài]], ở [[xa]].
#: ''an '''out''' match'' — một trận đấu ở sân khác (không phải ở sân nhà)
# [[quá|Quá]]. {{see-entry|out-}}
#: '''''out'''sized'' — cỡ quá khổ
{{-noun-}}
{{eng-noun}}
# [[lối thoát|Lối thoát]]; cách [[cáo từ]], cách [[thoái thác]].
# (''Bóng chày'') [[lần|Lần]] một [[đội]] [[loại]] ra một [[vận động viên]] [[đối thủ]] khỏi [[cuộc]].
# [[quả bóng|Quả bóng]] [[đánh]] ra [[ngoài]] [[sân]] ([[quần vợt]]).
# [[bài|Bài]] có thể làm [[thắng]] một [[ván]] ([[đánh]] [[pôke]]).
# [[đảng|Đảng]] không [[nắm]] [[chính quyền]].
# Sự [[bỏ sót]] [[chữ]]; chữ bỏ sót.
{{-expr-}}
* '''the ins and outs''': {{see-entry|in}}
{{-tr-verb-}}
'''out''' ''ngoại động từ'' {{IPA|/ˈɑʊt/}}
# {{nhãn|en|thông tục}} [[tống cổ|Tống cổ]] [[nó]] đi.
# {{nhãn|en|sports}} [[cho|Cho]] [[nó]] [[đo ván]] ([[quyền Anh]]).
# [[lộ|Lộ]] ra mình là [[người]] [[đồng tính]] [[luyến ái]].
# [[lộ|Lộ]] ra ([[điều]] [[bí mật]]...).
{{-forms-}}
{{eng-verb|base=out|out|ed}}
{{-ref-}}
{{R:FVDP}}
{{-deu-}}
{{-pron-}}
* [[Wiktionary:IPA|IPA]]: {{IPA|/ʔaʊ̯t/}}
{{-etymology-}}
{{etym-from
| lang = eng | term = out
}}
{{-adj-}}
'''out''' (''không thể so sánh'')
# Không [[đúng]] [[mốt]], không [[hợp]] [[thời trang]].
[[Thể loại:Phó từ tiếng Anh]]
[[Thể loại:Giới từ tiếng Anh]]
[[Thể loại:Tính từ tiếng Anh]]
[[Thể loại:Danh từ tiếng Anh]]
[[Thể loại:Ngoại động từ tiếng Anh]]
[[Thể loại:Tính từ tiếng Đức]]
[[Thể loại:en:Bóng chày]]
c4c0ghalggzzmrttrxm1n25guw27btq
deterring
0
223283
2348873
2165751
2026-04-27T12:47:42Z
Hiyuune
50834
2348873
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|deter||ing-form}}.
==={{section|ana}}===
* {{đảo chữ|en|a=deeginrrt|trigender}}
ter3o0gwp6fz95xi9gh8rslnfbjj8qw
deters
0
223285
2348874
1824634
2026-04-27T12:48:49Z
Hiyuune
50834
2348874
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|deter||s-verb-form}}
==={{section|ana}}===
* {{anagrams|en|a=deerst|desert|dreest|rested}}
59ljke0z1dxnzu61jcpj2lq49w6tqxw
hobnobbing
0
223286
2348875
2166837
2026-04-27T12:49:22Z
Hiyuune
50834
2348875
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|hobnob||ing-form}}.
p2r6tuyq1myffu5fpky605xaagsyxyb
furrowing
0
223289
2349016
2166436
2026-04-28T02:33:00Z
Hiyuune
50834
2349016
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|furrow||ing-form}}.
spivpto15yc07yup7e656utlqkwtb7k
looming
0
223291
2349017
2167068
2026-04-28T02:33:17Z
Hiyuune
50834
2349017
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|loom||ing-form}}.
6s3eylat8yqy73odx5rjtvy6q5to8vi
roping
0
223297
2349018
2167187
2026-04-28T02:33:38Z
Hiyuune
50834
2349018
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|rope||ing-form}}.
==={{section|ana}}===
* {{anagrams|en|a=ginopr|poring}}
ls92rcxuj3xeskwip89hn4tpmmteopt
deplaning
0
223303
2349025
2165719
2026-04-28T02:35:24Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349025
wikitext
text/x-wiki
{{-eng-2-}}
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|deplane||ing-form}}.
egalrrtop7522fl1j5dd3vc3ppv6tio
2349027
2349025
2026-04-28T02:35:35Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349027
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|deplane||ing-form}}.
afcbtnor9ws4aoibpqbnvc9oondtq8e
endangering
0
223306
2349023
2165760
2026-04-28T02:35:24Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349023
wikitext
text/x-wiki
{{-eng-2-}}
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|endanger||ing-form}}.
8whg9r17ybopdba7k6ko9otrokepsx9
2349028
2349023
2026-04-28T02:35:35Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349028
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|endanger||ing-form}}.
96e4oj7uq2c3x4qwy96iegyha7g0t8j
hoaxing
0
223320
2349022
2166534
2026-04-28T02:35:24Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349022
wikitext
text/x-wiki
{{-eng-2-}}
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|hoax||ing-form}}.
re6aff4dz8kt6gg91ogschc8wjkyuzr
2349031
2349022
2026-04-28T02:35:35Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349031
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|hoax||ing-form}}.
bs55w3h5zqger4y7bss2tom8wc2jl2s
sharecropping
0
223327
2349021
2162928
2026-04-28T02:35:24Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349021
wikitext
text/x-wiki
{{-eng-2-}}
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|sharecrop||ing-form}}.
l9l7ar8k397efs5zb50bivnpj52em01
2349030
2349021
2026-04-28T02:35:35Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349030
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|sharecrop||ing-form}}.
l1elz95yiwl906f0gb4ed9t3zp8kkv3
macadamising
0
223330
2349024
2166913
2026-04-28T02:35:24Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349024
wikitext
text/x-wiki
{{-eng-2-}}
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|macadamise||ing-form}}.
tqb5112a5luny521ak9toxs6sb06ey7
2349029
2349024
2026-04-28T02:35:35Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349029
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|macadamise||ing-form}}.
kv2ji6lsbk1xry3z9bz6wi6volnnzb7
granting
0
223333
2349020
2163558
2026-04-28T02:35:24Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349020
wikitext
text/x-wiki
{{-eng-2-}}
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|grant||ing-form}}.
5dv54erfdjoo95cgo00xtcyt1k5jcsj
2349026
2349020
2026-04-28T02:35:35Z
Hiyuune
50834
(By [[meta:Indic-TechCom/Tools|FindAndReplace]])
2349026
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|verb}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|grant||ing-form}}.
eu2jhome6ol5dm1tem3x2y0k7ekc81f
belonging
0
223335
2349032
2163035
2026-04-28T02:36:00Z
Hiyuune
50834
2349032
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|belong||ing-form}}.
==={{section|ana}}===
* {{anagrams|en|a=beggilnno|englobing}}
t7pnmud9lqwplqv6opfe37lt6yxw4ox
poring
0
229275
2349019
2167186
2026-04-28T02:34:15Z
Hiyuune
50834
2349019
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|pore||ing-form}}.
==={{section|ana}}===
* {{anagrams|en|a=ginopr|roping}}
gxh4bbpj0f1t0ik1flys3g0gbrs4i87
钛
0
234849
2348904
2029015
2026-04-27T14:38:45Z
Hiyuune
50834
2348904
wikitext
text/x-wiki
{{also|鈦}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=钅|as=04|sn=9|four=|canj=CKI,OPKI,XXCKI|ids=⿰钅太}}
===={{section|ref}}====
* {{Han ref|kx=1328.061|hdz=64174.150|uh=949B}}
=={{langname|zh}}==
{{zh-see|鈦}}
snnppzzsjhdiz7t95sidrppg5bsrcqw
鈦
0
235043
2348905
2028669
2026-04-27T14:40:23Z
Hiyuune
50834
2348905
wikitext
text/x-wiki
{{also|钛}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=金|as=04|sn=12|four=84130|canj=CKI,XCKI|ids=⿰釒太}}
===={{section|ref}}====
* {{Han ref|kx=1299.191|dkj=40257|hdz=64174.140|uh=9226}}
=={{langname|zh}}==
{{zh-forms|s=钛}}
{{chemical element box|zh}}
{{wp|zh:}}
==={{section|glyph origin}}===
{{Han compound|金|太|ls=psc|c1=s|t1=kim loại|c2=p|tr2=tài}}.
==={{section|etym}}===
Được vay mượn từ {{bor|zh|la-new|titanium|'''ti'''tanium}}.
==={{section|pron}}===
{{zh-pron
|m=tài
|c=taai3
|mn=ml:thài
|w=sh:5tha
|mc=
|oc=
|ma=
|cat=n
}}
==={{section|dfn}}===
{{head|zh|Hanzi}}
# {{lb|zh|chemical element}} [[titan|Titan]].
==={{section|com}}===
{{col3|zh|二氧化鈦|鈦合金|鈦白|四氯化鈦}}
==={{section|ref}}===
* {{R:yue:Hanzi}}
nr1m6d0vlv9mvai7epbw0z084h1o0ys
2348919
2348905
2026-04-27T15:05:29Z
Hiyuune
50834
/* Định nghĩa */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2348919
wikitext
text/x-wiki
{{also|钛}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=金|as=04|sn=12|four=84130|canj=CKI,XCKI|ids=⿰釒太}}
===={{section|ref}}====
* {{Han ref|kx=1299.191|dkj=40257|hdz=64174.140|uh=9226}}
=={{langname|zh}}==
{{zh-forms|s=钛}}
{{chemical element box|zh}}
{{wp|zh:}}
==={{section|glyph origin}}===
{{Han compound|金|太|ls=psc|c1=s|t1=kim loại|c2=p|tr2=tài}}.
==={{section|etym}}===
Được vay mượn từ {{bor|zh|la-new|titanium|'''ti'''tanium}}.
==={{section|pron}}===
{{zh-pron
|m=tài
|c=taai3
|mn=ml:thài
|w=sh:5tha
|mc=
|oc=
|ma=
|cat=n
}}
==={{section|dfn}}===
{{head|zh|Hanzi}}
# {{lb|zh|nguyên tố hóa học}} [[titan|Titan]].
==={{section|com}}===
{{col3|zh|二氧化鈦|鈦合金|鈦白|四氯化鈦}}
==={{section|ref}}===
* {{R:yue:Hanzi}}
6nktcsa1ubrzlrshs9sfvo4uxobahax
鍾
0
235094
2349002
2028932
2026-04-28T01:59:53Z
Hiyuune
50834
2349002
wikitext
text/x-wiki
{{also|钟|锺|鐘|鈡}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=金|as=09|sn=17|four=82114|canj=CHJG|ids=⿰釒重}}
===={{section|drv}}====
* {{charlist|sc=Hani|籦𡓯𥗦𦇮𬬐}}
===={{section|ref}}====
* {{Han ref|kx=1316.050|dkj=40672|dj=1816.020|hdz=64232.030|uh=937E}}
=={{langname|zh}}==
{{zh-forms|s=钟|s2=锺|alt=*鐘,鈡,螤,𦉂|note={{zh-l|*锺}} - only used as a surname or in a given name}}
{{wp|zh:鍾 (容器)}}
{{wp|zh:鍾姓,en:Chung (surname)}}
==={{section|glyph origin}}===
{{Han etym}}
==={{section|pron}}===
{{zh-pron
|m=zhōng
|c=zung1
|c-t=zuung1
|h=pfs=chûng;hrs=h:zhungˋ;gd=zung1
|md=cṳ̆ng
|mn=cheng/chiong
|mn_note=cheng - ngôn ngữ bản địa (bao gồm tên họ ở Đài Loan); chiong - ngôn ngữ văn chương (inbao gồm tên họ ở Đài Loan và Trung Quốc đại lục)
|mn-t=zêng1
|px=pt,jk,nr,yy:zoeng1/xy:zyoeng1/ft:zieng1
|w=
|mc=y
|oc=y
|cat=n,v,cls,pn
}}
==={{section|dfn}}===
{{head|zh|Hanzi}}
# [[bình|Bình]] [[rượu]].
# [[đơn vị đo|Đơn vị đo]] [[thể tích]] hoặc [[dung tích]].
# {{alt form|zh|鐘}}
# {{lb|zh|obsolete|chiefly|{{w|Nanzhao}}}} [[em trai|Em trai]].
# {{surname|zh}}
==={{section|com}}===
{{col3|zh|情有獨鍾|情之所鍾|圜鍾|一見鍾情|千鍾粟|漢鍾離|氣殺鍾馗|畝鍾|萬鍾|獨鍾|洪鍾|攔門鍾|鍾期|鍾愛|鼎鍾|茶鍾|老邁龍鍾|龍鍾潦倒|龍鍾|鼓鍾|鍾靈毓秀|鍾儀楚奏|鍾情|鍾溺|鍾馗嫁妹|鍾馗|鍾離|鍾釜|鍾山|鍾王|老態龍鍾|賞鍾|鍾祥<t:[[Zhongxiang]]>|鍾虡|鍾簴|鍾意}}
==={{section|ref}}===
* {{R:zh:cbgycdxdb|8163}}
* {{R:twedu|A04326}}
* {{R:yue:Hanzi}}
* {{R:cpx:PHDB|entry=鍾|pp=287}}
529jerjbq73kcy9eaom4dsiy338ldqg
凡
0
236394
2349040
2021165
2026-04-28T08:52:11Z
Hiyuune
50834
2349040
wikitext
text/x-wiki
{{also|几|凢|𠁽|丸|𠔼}}
{{character info}}
=={{langname|mul}}==
{{stroke order}}
==={{section|han}}===
{{Han char|rn=16|rad=几|as=01|sn=3|four=77210|canj=HNI|ids=⿵几丶}}
===={{section|drv}}====
* {{l|mul|[[𠆩]], [[𪞖]], [[㕨]], [[𪢵]], [[𫰉]], [[𭒺]], [[帆]], [[𫶿]], [[忛]], [[汎]], [[䏎]], [[杋]], [[𬂢]], [[𤆘]], [[𤖫]], [[𤜦]], [[㺬]], [[𤬨]], [[𡴉]], [[𥃵]], [[矾]], [[𬗄]], [[舤]], [[舧]], [[䖠]], [[訉]], [[𨈔]], [[軓]], [[𨟱]], [[釩]]([[钒]]), [[𨥵]], [[𠙜]], [[𩖛]], [[𩚑]], [[䭵]], [[𣔗]], [[𢔫]], [[骪]], [[𠔮]], [[𠥷]], [[𬹐]], [[𣋰]], [[𨙮]], [[𩾨]]}}
* {{l|mul|[[𪜠]], [[㞩]], [[竼]], [[芃]], [[𠘻]], [[𭴄]], [[𭃓]], [[𠫨]], [[梵]], [[𤈺]], [[𫷵]], [[𪎒]], [[𩬰]], [[䴟]], [[𠙩]], [[𠙮]], [[𠙱]], [[𮚝]]}}
* {{l|mul|[[風]], [[鳳]]}} ''(originally contain 凡)''
===={{section|ref}}====
{{Han ref|kx=0134.020|dkj=01739|dj=0299.100|hdz=10276.030|uh=51E1}}
14whxobl9xe4ugrk0z2q0u89u2rmvpk
biến thái
0
242803
2348990
2093384
2026-04-28T01:43:21Z
.nhals8
60584
2348990
wikitext
text/x-wiki
{{-vie-}}
{{-pron-}}
{{vie-pron}}
{{-noun-}}
{{pn}}
# [[sự biến|Sự biến]] [[đổi]] [[rõ rệt]] về [[hình dạng]] và [[cấu tạo]] của [[một số]] [[động vật]] qua từng [[giai đoạn]], từ [[ấu trùng]] tới [[lúc]] [[trưởng thành]].
#:{{ux|vi|'''biến thái''' của sâu bọ}}
# (xúc phạm) Người dâm dục, [[đồi truỵ]], thường tới người có hành vi tình dụng không bình thường.
{{-trans-}}
<!-- === DỊCH === -->
* {{eng}}: [[pervert]]
*
*
{{-ref-}}
{{R:Tratu|vi|vi}}
{{catname|Danh từ|tiếng Việt}}
brtt3yqwkz0vzh47ugim50uuhbd7me9
2348991
2348990
2026-04-28T01:43:46Z
.nhals8
60584
2348991
wikitext
text/x-wiki
{{-vie-}}
{{-pron-}}
{{vie-pron}}
{{-noun-}}
{{pn}}
# [[sự biến|Sự biến]] [[đổi]] [[rõ rệt]] về [[hình dạng]] và [[cấu tạo]] của [[một số]] [[động vật]] qua từng [[giai đoạn]], từ [[ấu trùng]] tới [[lúc]] [[trưởng thành]].
#:{{ux|vi|'''biến thái''' của sâu bọ}}
# (xúc phạm) Người dâm dục, [[đồi truỵ]], thường tới người có hành vi tình dục bất thường.
{{-trans-}}
<!-- === DỊCH === -->
* {{eng}}: [[pervert]]
*
*
{{-ref-}}
{{R:Tratu|vi|vi}}
{{catname|Danh từ|tiếng Việt}}
4r0hy2rc11rzs9f6tgx7ezm0ycodfch
2348994
2348991
2026-04-28T01:46:07Z
.nhals8
60584
2348994
wikitext
text/x-wiki
{{-vie-}}
{{-pron-}}
{{vie-pron}}
{{-noun-}}
{{pn}}
# [[sự biến|Sự biến]] [[đổi]] [[rõ rệt]] về [[hình dạng]] và [[cấu tạo]] của [[một số]] [[động vật]] qua từng [[giai đoạn]], từ [[ấu trùng]] tới [[lúc]] [[trưởng thành]].
#:{{ux|vi|'''biến thái''' của sâu bọ}}
# (xúc phạm) Người dâm dục, [[đồi truỵ]], có hành vi tình dục bất thường.
# (xúc phạm) Người [[LGBT]]
{{-trans-}}
<!-- === DỊCH === -->
* {{eng}}: [[pervert]]
*
*
{{-ref-}}
{{R:Tratu|vi|vi}}
{{catname|Danh từ|tiếng Việt}}
dna6w3sqedcv5lazf4b0goiqywbbkho
microaneurysms
0
247184
2349049
1874423
2026-04-28T10:56:12Z
Kelly zhrm
58416
2349049
wikitext
text/x-wiki
=={{langname|en}}==
==={{ĐM|n}}===
{{head|en|Biến thể hình thái danh từ}}
# {{plural of|en|microaneurysm}}
4y1ti7fzfsf19ajd8ud0d33ugswruy1
moesten
0
251354
2349046
2001251
2026-04-28T10:50:40Z
Kelly zhrm
58416
2349046
wikitext
text/x-wiki
=={{langname|nl}}==
==={{ĐM|pron}}===
* {{audio|nl|Nl-moesten.ogg}}
==={{ĐM|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|moeten||past-pl}}
fs932hgqi7at9u7j3ugfl23y90xk988
zouden
0
251585
2349048
2001288
2026-04-28T10:54:05Z
Kelly zhrm
58416
2349048
wikitext
text/x-wiki
=={{langname|nl}}==
==={{ĐM|pron}}===
* {{audio|nl|Nl-zouden.ogg}}
* {{rhymes|nl|ɑu̯dən|s=2}}
* {{IPA4|nl|/ˈzɑu̯.də(n)/}}
==={{ĐM|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|zullen||past-pl}}
daui5451jhkgvos7fvi42d1vobxla0q
leefden
0
252176
2349047
2001531
2026-04-28T10:52:18Z
Kelly zhrm
58416
2349047
wikitext
text/x-wiki
=={{langname|nl}}==
==={{ĐM|pron}}===
* {{audio|nl|Nl-leefden.ogg}}
==={{ĐM|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|leven||past-pl}}
97v89eupjbi8fpcag830m2t30zbftz4
mochten
0
252963
2349045
2001588
2026-04-28T10:48:52Z
Kelly zhrm
58416
2349045
wikitext
text/x-wiki
{{also|möchten}}
=={{langname|de}}==
==={{ĐM|pron}}===
* {{audio|de|LL-Q188 (deu)-Sebastian Wallroth-mochten.wav}}
* {{audio|de|De-mochten.ogg|a=Berlin}}
==={{ĐM|v}}===
{{head|de|Biến thể hình thái động từ}}
# {{verb form of|de|mögen||1//3|p|pret}}
=={{langname|nl}}==
==={{ĐM|pron}}===
* {{audio|nl|Nl-mochten.ogg}}
* {{rhymes|nl|ɔxtən|s=2}}
==={{ĐM|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|mogen||past-pl}}
flw9jspqbab6e95oq6j3qhnsekwv0dc
wachtte
0
253018
2349051
2001610
2026-04-28T11:01:41Z
Kelly zhrm
58416
2349051
wikitext
text/x-wiki
=={{langname|nl}}==
==={{ĐM|pron}}===
* {{audio|nl|Nl-wachtte.ogg}}
==={{ĐM|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|wachten||past-sg}}
60o26n4lslp4lw3s8eqpa4wb2bl2ynh
wachtten
0
253019
2349050
2001611
2026-04-28T11:00:19Z
Kelly zhrm
58416
2349050
wikitext
text/x-wiki
=={{langname|nl}}==
==={{ĐM|pron}}===
* {{audio|nl|Nl-wachtten.ogg}}
==={{ĐM|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|wachten||past-pl}}
r4stw30n4w3xun1788anze4kktw6z8q
cheng
0
255776
2349003
2003819
2026-04-28T02:05:58Z
Hiyuune
50834
2349003
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "cheng"}}
=={{langname|vi}}==
==={{section|pron}}===
{{vi-pron}}
==={{section|adj}}===
{{vi-adj}}
# [[tiếng|Tiếng]] [[kim loại]].
=={{langname|en}}==
==={{section|n}}===
{{en-noun}}
# {{alternative form of|en|sheng}}
==={{section|see}}===
* {{l|en|cheng tng}}
* {{l|en|pa chew cheng}}
=={{langname|nan-hbl}}==
{{zh-see|鍾|poj}}
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin|notr=1}}
# {{nonstandard spelling of|cmn|chēng}}
# {{nonstandard spelling of|cmn|chéng}}
# {{nonstandard spelling of|cmn|chěng}}
# {{nonstandard spelling of|cmn|chèng}}
8ukg66xttel2oq1xv4gu3refih7bkra
filosofies
0
256866
2348886
2008997
2026-04-27T14:22:12Z
Kelly zhrm
58416
2348886
wikitext
text/x-wiki
{{also|filosofíes}}
=={{langname|ca}}==
==={{ĐM|n}}===
{{head|ca|Biến thể hình thái danh từ}}
# {{plural of|ca|filosofia}}
gvd396cmacl1te99fnkxz2i53mam743
double switches
0
256957
2348889
2009274
2026-04-27T14:23:26Z
Kelly zhrm
58416
2348889
wikitext
text/x-wiki
=={{langname|en}}==
==={{ĐM|n}}===
{{head|en|Biến thể hình thái danh từ|head=double switches}}
# {{plural of|en|double switch}}
af0gwmhbvnajjr5qxg8lt0rxmcgf3oe
fílum
0
258960
2349044
2016056
2026-04-28T10:40:56Z
Kelly zhrm
58416
2349044
wikitext
text/x-wiki
{{also|filum}}
=={{langname|non}}==
==={{ĐM|n}}===
{{head|non|Biến thể hình thái danh từ}}
# {{inflection of|non|fíll||dat|p}}
=={{langname|ca}}==
{{wp|ca:}}
==={{ĐM|pron}}===
* {{ca-IPA}}
* {{audio|ca|LL-Q7026 (cat)-Marvives-fílum.wav|a=Barcelona}}
==={{ĐM|n}}===
{{ca-noun|m}}
# [[ngành|Ngành]].
==={{ĐM|further}}===
* {{R:ca:IEC2}}
* {{R:ca:GDLC}}
* {{R:ca:DNV}}
{{C|ca|Sinh học|Phân loại học}}
=={{langname|fo}}==
==={{ĐM|pron}}===
* {{IPA4|fo|/ˈfʊiːlʊn/}}
* {{rhymes|fo|ʊiːlʊn}}
* {{homophones|fo|fýlum}}
==={{ĐM|etym}} 1===
===={{ĐM|n}}====
{{head|fo|Biến thể hình thái danh từ}}
# {{inflection of|fo|fílur||indef|dat|p}}
==={{ĐM|etym}} 2===
===={{ĐM|n}}====
{{head|fo|Biến thể hình thái danh từ}}
# {{inflection of|fo|fíl||indef|dat|p}}
==={{ĐM|etym}} 3===
===={{ĐM|n}}====
{{head|fo|Biến thể hình thái danh từ}}
# {{inflection of|fo|fíla||indef|dat|p}}
=={{langname|is}}==
==={{ĐM|n}}===
{{head|is|Biến thể hình thái danh từ}}
# {{inflection of|is|fíll||indef|dat|p}}
s3p83uz5v4nmbp5yr153xnxnvxbe6w5
prawdopodobieństwo
0
260812
2349042
2280498
2026-04-28T09:25:06Z
Hiyuune
50834
2349042
wikitext
text/x-wiki
=={{langname|pl}}==
{{wp|pl:}}
==={{section|etym}}===
Từ {{affix|pl|prawdopodobny|-stwo}}.
==={{section|pron}}===
{{pl-pr|a=LL-Q809 (pol)-Poemat-prawdopodobieństwo.wav}}
==={{section|n}}===
{{pl-noun|n}}
# [[xác suất|Xác suất]], [[khả năng]] [[xảy ra]].
#: {{syn|pl|szansa}}
# {{lb|pl|mathematics}} Xác suất.
===={{section|decl}}====
{{pl-decl-noun-n}}
===={{section|rel}}====
{{col|pl|title=pho từ|prawdopodobnie}}
==={{section|further}}===
* {{R:pl:WSJP}}
* {{R:pl:PWN}}
hn6yn45zkrpcmlca788ghm1ycjx227m
Mô đun:languages/data/3/g
828
272287
2348864
2348282
2026-04-27T12:27:46Z
Lcsnes
40261
2348864
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["gaa"] = {
"tiếng Ga",
33287,
"alv-gda",
"Latn",
"Tiếng Ga",
"Ga",
}
m["gab"] = {
"tiếng Gabri",
3441237,
"cdc-est",
"Latn",
"Tiếng Gabri",
"Gabri",
}
m["gac"] = {
"Mixed Great Andamanese",
nil,
"qfa-adn",
"Latn",
}
m["gad"] = { -- not to be confused with gdk, gdg
"tiếng Gaddang",
3438830,
"phi",
"Latn",
"Tiếng Gaddang",
"Gaddang",
}
m["gae"] = {
"tiếng Warekena",
1091095,
"awd-nwk",
"Latn",
"Tiếng Warekena",
"Warekena",
}
m["gaf"] = {
"Gende",
3100425,
"paa-kag",
"Latn",
}
m["gag"] = {
"tiếng Gagauz",
33457,
"trk-ogz",
"Latn, Cyrl",
"Tiếng Gagauz",
"Gagauz",
ancestors = "trk-oat",
dotted_dotless_i = true,
sort_key = {
Latn = {
from = {
"i", -- Ensure "i" comes after "ı".
"ä", "ç", "ê", "ı", "ö", "ş", "ţ", "ü"
},
to = {
"i" .. p[1],
"a" .. p[1], "c" .. p[1], "e" .. p[1], "i", "o" .. p[1], "s" .. p[1], "t" .. p[1], "u" .. p[1]
}
},
},
}
m["gah"] = {
"tiếng Alekano",
3441595,
"paa-kag",
"Latn",
"Tiếng Alekano",
"Alekano",
}
m["gai"] = {
"Borei",
6799756,
"paa",
"Latn",
}
m["gaj"] = {
"Gadsup",
5516467,
"paa-kag",
"Latn",
}
m["gak"] = {
"Gamkonora",
5520226,
"paa-nha",
"Latn",
}
m["gal"] = {
"Galoli",
35322,
"poz-tim",
"Latn",
}
m["gam"] = {
"Kandawo",
6361369,
"ngf",
"Latn",
}
m["gan"] = {
"tiếng Cám",
33475,
"zhx",
"Hants",
"Tiếng Cám",
"Cám",
ancestors = "ltc",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["gao"] = {
"Gants",
5521529,
"ngf-mad",
"Latn",
}
m["gap"] = {
"Gal",
5517742,
"ngf-mad",
"Latn",
}
m["gaq"] = {
"tiếng Gata'",
3501920,
"mun",
"Orya",
"Tiếng Gata'",
"Gata'",
}
m["gar"] = {
"Galeya",
5518509,
"poz-ocw",
"Latn",
}
m["gas"] = {
"tiếng Garasia Adiwasi",
12953522,
"inc-bhi",
"Gujr",
"Tiếng Garasia Adiwasi",
"Garasia Adiwasi",
ancestors = "bhb",
}
m["gat"] = {
"Kenati",
4219330,
"paa-kag",
"Latn",
}
m["gau"] = {
"tiếng Kondekor",
12952433,
"dra-pgd",
"Telu",
"Tiếng Kondekor",
"Kondekor",
translit = { Telu = "te-translit" },
}
m["gaw"] = {
"tiếng Nobonob",
11732205,
"paa",
"Latn",
"Tiếng Nobonob",
"Nobonob",
}
m["gax"] = {
"tiếng Oromo Nam",
2910610,
"cus-eas",
"Latn",
"Tiếng Oromo Nam",
"Oromo Nam",
}
m["gay"] = {
"Gayo",
33286,
"poz-nws",
"Latn",
}
m["gba"] = {
"Gbaya",
3099986,
"alv-gba",
"Latn",
}
m["gbb"] = {
"Kaytetye",
6380709,
"aus-rnd",
"Latn",
}
m["gbd"] = {
"Karadjeri",
3913837,
"aus-pam",
"Latn",
}
m["gbe"] = {
"Niksek",
56375,
"paa",
"Latn",
}
m["gbf"] = {
"Gaikundi",
5517032,
"paa-spk",
"Latn",
}
m["gbg"] = {
"Gbanziri",
35306,
"nic-nkg",
"Latn",
}
m["gbh"] = {
"Defi Gbe",
12952446,
"alv-gbe",
"Latn",
}
m["gbi"] = {
"Galela",
3094570,
"paa-nha",
"Latn",
}
m["gbj"] = {
"tiếng Gadaba Bodo",
3347070,
"mun",
"Orya",
"Tiếng Gadaba Bodo",
"Gadaba Bodo",
}
m["gbk"] = {
"tiếng Gaddi",
17455500,
"him",
"Deva, Takr",
"Tiếng Gaddi",
"Gaddi",
translit = {Deva = "hi-translit"},
}
m["gbl"] = {
"tiếng Gamit",
2731717,
"inc-bhi",
"Deva, Gujr",
"Tiếng Gamit",
"Gamit",
}
m["gbm"] = {
"tiếng Garhwal",
33459,
"inc-pah",
"Deva",
"Tiếng Garhwal",
"Garhwal",
translit = "hi-translit",
}
m["gbn"] = {
"Mo'da",
12755683,
"csu-bbk",
"Latn",
}
m["gbo"] = {
"Northern Grebo",
11157042,
"kro-grb",
"Latn",
ancestors = "grb",
}
m["gbp"] = {
"Gbaya-Bossangoa",
11011295,
"alv-gbw",
"Latn",
}
m["gbq"] = {
"Gbaya-Bozoum",
4952879,
"alv-gbw",
"Latn",
}
m["gbr"] = {
"Gbagyi",
11015105,
"alv-ngb",
"Latn",
}
m["gbs"] = {
"Gbesi Gbe",
12952448,
"alv-pph",
"Latn",
}
m["gbu"] = {
"Gagadu",
35677,
"aus-arn",
"Latn",
}
m["gbv"] = {
"Gbanu",
3914945,
"alv-gbf",
"Latn",
}
m["gbw"] = {
"Gabi",
5515391,
"aus-pam",
"Latn",
}
m["gbx"] = {
"Eastern Xwla Gbe",
18379975,
"alv-pph",
"Latn",
}
m["gby"] = {
"Gbari",
3915451,
"alv-ngb",
"Latn",
}
m["gcc"] = {
"Mali",
6743338,
"paa-bng",
"Latn",
}
m["gcd"] = {
"Ganggalida",
3913765,
"aus-tnk",
"Latn",
}
m["gce"] = {
"Galice",
20711,
"ath-pco",
"Latn",
}
m["gcf"] = {
"tiếng Creole Antilles",
3006280,
"crp",
"Latn",
"Tiếng Creole Antilles",
"Creole Antilles",
ancestors = "fr",
sort_key = s["roa-oil-sortkey"],
}
m["gcl"] = {
"Grenadian Creole English",
4252500,
"crp",
"Latn",
ancestors = "en",
}
m["gcn"] = {
"Gaina",
11732195,
"ngf",
"Latn",
}
m["gcr"] = {
"Guianese Creole",
1363072,
"crp",
"Latn",
ancestors = "fr",
sort_key = s["roa-oil-sortkey"],
}
m["gct"] = {
"Colonia Tovar German",
1138351,
"gmw-hgm",
"Latn",
ancestors = "gsw",
}
m["gdb"] = {
"Ollari",
33906,
"dra-pgd",
"Orya, Telu",
translit = {
Telu = "te-translit"
},
}
m["gdc"] = {
"Gugu Badhun",
10510360,
"aus-pam",
"Latn",
}
m["gdd"] = {
"Gedaged",
35292,
"poz-ocw",
"Latn",
}
m["gde"] = {
"Gude",
3441230,
"cdc-cbm",
"Latn",
}
m["gdf"] = {
"Guduf-Gava",
3441350,
"cdc-cbm",
"Latn",
}
m["gdg"] = { -- not to be confused with gad, gdk
"Ga'dang",
5515189,
"phi",
}
m["gdh"] = {
"Gadjerawang",
3913817,
"aus-jar",
"Latn",
}
m["gdi"] = {
"Gundi",
11137851,
"nic-nkb",
"Latn",
}
m["gdj"] = {
"Kurtjar",
5619931,
"aus-pmn",
"Latn",
}
m["gdk"] = { -- not to be confused with gad, gdg
"Gadang",
56256,
"cdc-est",
"Latn",
}
m["gdl"] = {
"tiếng Dirasha",
56809,
"cus-eas",
"Ethi",
"Tiếng Dirasha",
"Dirasha",
}
m["gdm"] = {
"Laal",
33436,
nil,
"Latn",
}
m["gdn"] = {
"Umanakaina",
7881084,
"ngf",
"Latn",
}
m["gdo"] = {
"tiếng Godoberi",
56515,
"cau-and",
"Cyrl",
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {Cyrl = s["cau-Cyrl-entryname"]},
"Tiếng Godoberi",
"Godoberi",
}
m["gdq"] = {
"tiếng Mehri",
13361,
"sem-sar",
"Arab, Latn",
"Tiếng Mehri",
"Mehri"
}
m["gdr"] = {
"Wipi",
8026711,
"paa",
"Latn",
}
m["gds"] = {
"Ghandruk Sign Language",
15971577,
"sgn",
}
m["gdt"] = {
"Kungardutyi",
6444517,
"aus-kar",
"Latn",
}
m["gdu"] = {
"Gudu",
3441172,
"cdc-cbm",
"Latn",
}
m["gdx"] = {
"Godwari",
3540922,
"inc-wes",
ancestors = "mwr",
}
m["gea"] = {
"Geruma",
3438789,
"cdc-wst",
"Latn",
}
m["geb"] = {
"Kire",
11129733,
"paa",
"Latn",
}
m["gec"] = {
"Gboloo Grebo",
11019342,
"kro-grb",
"Latn",
ancestors = "grb",
}
m["ged"] = {
"Gade",
3914459,
"alv-nup",
"Latn",
}
m["geg"] = {
"Gengle",
3438345,
"alv-mye",
"Latn",
ancestors = "kow",
}
m["geh"] = {
"Hutterisch",
33385,
"gmw-hgm",
"Latn",
ancestors = "bar",
}
m["gei"] = {
"Gebe",
3100032,
"poz-hce",
"Latn",
}
m["gej"] = {
"tiếng Gen",
33450,
"alv-gbe",
"Latn",
"Tiếng Gen",
"Gen",
}
m["gek"] = {
"tiếng Yiwom",
3441277,
"cdc-wst",
"Latn",
"Tiếng Yiwom",
"Yiwom",
}
m["gel"] = {
"Fakkanci",
36627,
"nic-knn",
"Latn",
}
m["geq"] = {
"Geme",
3915851,
"znd",
"Latn",
}
m["ges"] = {
"Geser-Gorom",
5553579,
"poz-cma",
"Latn",
}
m["gev"] = {
"Viya",
7937974,
"bnt-tso",
"Latn",
}
m["gew"] = {
"Gera",
3438725,
"cdc-wst",
"Latn",
}
m["gex"] = {
"tiếng Garre",
56618,
"cus-som",
"Latn",
"Tiếng Garre",
"Garre",
}
m["gey"] = {
"Enya",
5381452,
"bnt-mbe",
"Latn",
}
m["gez"] = {
"tiếng Geʽez",
35667,
"sem-eth",
"Ethi",
"Tiếng Geʽez",
"Geʽez",
translit = "Ethi-translit",
}
m["gfk"] = {
"Patpatar",
3368846,
"poz-ocw",
"Latn",
}
m["gft"] = {
"Gafat",
56910,
"sem-eth",
"Ethi, Latn",
}
m["gga"] = {
"Gao",
3095228,
"poz-ocw",
"Latn",
}
m["ggb"] = {
"Gbii",
3914390,
"kro-wkr",
"Latn",
}
m["ggd"] = {
"Gugadj",
5615186,
"aus-pmn",
"Latn",
}
m["gge"] = {
"Guragone",
5619801,
"aus-arn",
"Latn",
}
m["ggg"] = {
"Gurgula",
5620032,
"inc-wes",
"Arab",
ancestors = "mwr",
}
m["ggk"] = {
"Kungarakany",
6444516,
"aus-arn",
"Latn",
}
m["ggl"] = {
"Ganglau",
5521140,
"ngf-mad",
"Latn",
}
m["ggn"] = {
"Eastern Gurung",
12952472,
"sit-tam",
"Gukh, Deva",
}
m["ggt"] = {
"Gitua",
3107865,
"poz-ocw",
"Latn",
}
m["ggu"] = {
"Gban",
3913317,
"dmn-nbe",
"Latn",
}
m["ggw"] = {
"Gogodala",
3512161,
"paa-pag",
"Latn",
}
m["gha"] = {
"tiếng Ghadames",
56747,
"ber",
"Latn, Tfng", -- and other scripts?
"Tiếng Ghadames",
"Ghadames",
translit = {Tfng = "Tfng-translit"},
}
m["ghc"] = {
"Classical Gaelic",
5128278,
"cel-gae",
"Latn, Latg",
ancestors = "mga",
}
m["ghe"] = {
"Southern Ghale",
12952453,
"sit-tam",
"Deva",
}
m["ghh"] = {
"Northern Ghale",
22662104,
"sit-tam",
"Deva",
}
m["ghk"] = {
"tiếng Karen Geko",
5530317,
"kar",
"Mymr",
"Tiếng Karen Geko",
"Karen Geko",
}
m["ghl"] = {
"Ghulfan",
16885737,
"nub-hil",
"Latn", -- and others?
}
m["ghn"] = {
"Ghanongga",
3104772,
"poz-ocw",
"Latn",
}
m["gho"] = {
"tiếng Ghomara",
35315,
"ber",
"Tfng, Latn, Arab",
"Tiếng Ghomara",
"Ghomara",
translit = {Tfng = "Tfng-translit"},
}
m["ghr"] = {
"Ghera",
22808992,
"inc-hiw",
}
m["ghs"] = {
"Guhu-Samane",
11732219,
"ngf",
"Latn",
}
m["ght"] = {
"tiếng Kuke",
6448337,
"sit-tam",
"Tibt",
"Tiếng Kuke",
"Kuke",
translit = "Tibt-translit",
override_translit = true,
display_text = s["Tibt-displaytext"],
entry_name = s["Tibt-entryname"],
sort_key = "Tibt-sortkey",
}
m["gia"] = {
"Kitja",
1284877,
"aus-jar",
"Latn",
}
m["gib"] = {
"Gibanawa",
12953530,
"crp",
"Latn",
ancestors = "ha",
}
m["gid"] = {
"Gidar",
35265,
"cdc-cbm",
"Latn",
}
m["gie"] = {
"Guébie",
nil,
"kro-did",
"Latn",
}
m["gig"] = {
"Goaria",
33269,
"inc-wes",
"Arab",
ancestors = "mwr",
}
m["gih"] = {
"Githabul",
nil,
"aus-pam",
"Latn",
}
m["gii"] = {
"tiếng Girirra",
5564288,
"cus-som",
nil,
"Tiếng Girirra",
"Girirra",
}
m["gil"] = {
"tiếng Kiribati",
30898,
"poz-mic",
"Latn",
"Tiếng Kiribati",
"Kiribati",
}
m["gim"] = {
"tiếng Gimi (Goroka)",
11732209,
"paa",
"Latn",
"Tiếng Gimi (Goroka)",
"Gimi (Goroka)",
}
m["gin"] = {
"tiếng Hinukh",
33283,
"cau-wts",
"Cyrl",
"Tiếng Hinukh",
"Hinukh",
translit = "gin-translit",
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {Cyrl = s["cau-Cyrl-entryname"]},
}
m["gio"] = {
"Gelao",
56401,
"qfa-tak",
}
m["gip"] = {
"Gimi (Austronesian)",
12952457,
"poz-ocw",
}
m["giq"] = {
"Green Gelao",
12953525,
"qfa-gel",
}
m["gir"] = {
"Red Gelao",
3100264,
"qfa-gel",
}
m["gis"] = {
"North Giziga",
3515084,
"cdc-cbm",
}
m["git"] = {
"tiếng Gitxsan",
3107862,
"nai-tsi",
"Latn",
"Tiếng Gitxsan",
"Gitxsan",
}
m["giu"] = {
"Mulao",
11092831,
"qfa-gel",
}
m["giw"] = {
"tiếng Cờ Lao Trắng",
8843040,
"qfa-gel",
nil,
"Tiếng Cờ Lao Trắng",
"Cờ Lao Trắng",
}
m["gix"] = {
"Gilima",
10977716,
"nic-nkm",
"Latn",
}
m["giy"] = {
"Giyug",
5565906,
}
m["giz"] = {
"South Giziga",
3502232,
"cdc-cbm",
}
m["gji"] = {
"Geji",
3914890,
"cdc-wst",
"Latn",
}
m["gjk"] = {
"tiếng Koli Kachi",
12953646,
"inc-wes",
"Gujr",
"Tiếng Koli Kachi",
"Koli Kachi",
}
m["gjm"] = {
"Gunditjmara",
6448731,
"aus-pam",
}
m["gjn"] = {
"Gonja",
35267,
"alv-gng",
"Latn",
}
m["gju"] = {
"tiếng Gujar",
3241731,
"inc-wes",
"ur-Arab, Deva, Takr",
"Tiếng Gujar",
"Gujar",
ancestors = "raj",
entry_name = {
["ur-Arab"] = {
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.smallv,
from = {"ڵ", "ݩ"},
to = {"ل", "ن"}
},
},
}
m["gka"] = {
"Guya",
11732221,
"ngf-fin",
"Latn",
}
m["gkd"] = {
"Magɨ",
nil,
"ngf-mad",
"Latn",
}
m["gke"] = {
"Ndai",
6983667,
"alv-mbm",
}
m["gkn"] = {
"Gokana",
3075137,
"nic-ogo",
"Latn",
}
m["gko"] = {
"Kok-Nar",
6426526,
"aus-pmn",
"Latn",
}
m["gkp"] = {
"tiếng Kpelle Guinea",
11052867,
"dmn-msw",
"Latn, Kpel",
"Tiếng Kpelle Guinea",
"Kpelle Guinea",
ancestors = "kpe",
}
m["glb"] = {
"tiếng Belnəng",
48813291,
"cdc-wst",
nil,
"Tiếng Belnəng",
"Belnəng",
}
m["glc"] = {
"Bon Gula",
289816,
"alv-bua",
}
m["gld"] = {
"tiếng Nanai",
13303,
"tuw-nan",
"Cyrl",
"Tiếng Nanai",
"Nanai",
translit = "gld-translit",
entry_name = {remove_diacritics = c.macron},
sort_key = {
from = {"ё", "ӈ"},
to = {"е" .. p[1], "н" .. p[1]}
},
}
m["glh"] = {
"Northwest Pashayi",
23713532,
"inc-pas",
"fa-Arab",
}
m["glj"] = {
"Kulaal",
33360,
"alv-bua",
}
m["glk"] = {
"tiếng Gilak",
33657,
"ira-csp",
"fa-Arab",
"Tiếng Gilak",
"Gilak",
}
m["glo"] = {
"Galambu",
2598797,
"cdc-wst",
"Latn",
}
m["glr"] = {
"Glaro-Twabo",
3915313,
"kro-wee",
}
m["glu"] = {
"Gula",
5617176,
"csu-bgr",
}
m["glw"] = {
"Glavda",
3441285,
"cdc-cbm",
"Latn",
}
m["gly"] = {
"Gule",
3120736,
"ssa-kom",
}
m["gma"] = {
"Gambera",
10502327,
"aus-wor",
}
m["gmb"] = {
"Gula'alaa",
3120733,
"poz-sls",
"Latn",
}
m["gmd"] = {
"Mághdì",
3914475,
"alv-bwj",
}
m["gmg"] = {
"Magiyi",
16926155,
"ngf-mad",
"Latn",
}
m["gmh"] = {
"tiếng Đức cao địa trung đại",
837985,
"gmw-hgm",
"Latn",
"Tiếng Đức cao địa trung đại",
"Đức cao địa trung đại",
entry_name = {
remove_diacritics = c.circ .. c.macron,
from = {"Ë", "ë", "[ƷȤ]", "[ʒȥ]"},
to = {"E", "e", "Z", "z"}
},
}
m["gml"] = {
"tiếng Hạ Đức trung đại",
505674,
"gmw-lgm",
"Latn",
"Tiếng Hạ Đức trung đại",
"Hạ Đức trung đại",
entry_name = {remove_diacritics = c.circ .. c.macron .. c.diaer},
}
m["gmm"] = {
"Gbaya-Mbodomo",
6799713,
"alv-gbf",
"Latn",
}
m["gmn"] = {
"Gimnime",
11016905,
"alv-dur",
}
m["gmu"] = {
"Gumalu",
5618027,
"ngf-mad",
}
m["gmv"] = {
"tiếng Gamo",
16116386,
"omv-nom",
"Latn, Ethi",
"Tiếng Gamo",
"Gamo",
}
m["gmx"] = {
"Magoma",
16939552,
"bnt-bki",
}
m["gmy"] = {
"tiếng Hy Lạp Mycenae",
668366,
"grk",
"Linb",
"Tiếng Hy Lạp Mycenae",
"Hy Lạp Mycenae",
translit = "Linb-translit",
override_translit = true,
}
m["gmz"] = {
"Mgbo",
6826835,
"alv-igb",
ancestors = "izi",
}
m["gna"] = {
"Kaansa",
56802,
"nic-gur",
}
m["gnb"] = {
"Gangte",
12952442,
"tbq-kuk",
}
m["gnc"] = {
"tiếng Guanche",
35762,
"ber",
"Latn",
"Tiếng Guanche",
"Guanche",
}
m["gnd"] = {
"Zulgo-Gemzek",
56800,
"cdc-cbm",
"Latn",
}
m["gne"] = {
"Ganang",
nil,
"nic-plc",
ancestors = "izr",
}
m["gng"] = {
"Ngangam",
35888,
"nic-grm",
}
m["gnh"] = {
"Lere",
3915319,
"nic-jer",
}
m["gni"] = {
"tiếng Gooniyandi",
2669219,
"aus-bub",
"Latn",
"Tiếng Gooniyandi",
"Gooniyandi",
}
m["gnj"] = {
"Ngen",
nil,
"dmn-nbe",
"Latn",
}
m["gnk"] = {
"ǁGana",
1975199,
"khi-kal",
}
m["gnl"] = {
"Gangulu",
4916329,
"aus-pam",
}
m["gnm"] = {
"Ginuman",
11732210,
"ngf",
}
m["gnn"] = {
"Gumatj",
10510745,
"aus-yol",
"Latn",
}
m["gnq"] = {
"Gana",
5520523,
"poz-san",
}
m["gnr"] = {
"Gureng Gureng",
5619998,
"aus-pam",
}
m["gnt"] = {
"Guntai",
12952475,
"paa",
}
m["gnu"] = {
"Gnau",
3915810,
"qfa-tor",
}
m["gnw"] = {
"Western Bolivian Guaraní",
3775037,
"tup-gua",
"Latn",
ancestors = "gn",
}
m["gnz"] = {
"Ganzi",
11137942,
"nic-nkb",
"Latn",
}
m["goa"] = {
"Guro",
35251,
"dmn-mda",
"Latn",
}
m["gob"] = {
"Playero",
3027923,
"sai-guh",
}
m["goc"] = {
"Gorakor",
12952463,
"poz-ocw",
"Latn",
}
m["god"] = {
"Godié",
3914412,
"kro-bet",
}
m["goe"] = {
"Gongduk",
2669221,
"sit",
}
m["gof"] = {
"tiếng Gofa",
12631584,
"omv-nom",
"Latn, Ethi",
"Tiếng Gofa",
"Gofa",
}
m["gog"] = {
"Gogo",
3272630,
"bnt-ruv",
"Latn",
}
m["goh"] = {
"tiếng Đức cao địa cổ",
35218,
"gmw-hgm",
"Latn, Runr",
"Tiếng Đức cao địa cổ",
"Đức cao địa cổ",
entry_name = {
remove_diacritics = c.circ .. c.macron .. c.diaer,
from = {"[ƷȤ]", "[ʒȥ]"},
to = {"Z", "z"}
},
translit = {
Runr = "Runr-translit",
},
}
m["goi"] = {
"Gobasi",
5575414,
"ngf",
"Latn",
}
m["goj"] = {
"Gowlan",
12953532,
"inc-sou",
}
-- gok is a spurious language, see [[w:Spurious languages]]
m["gol"] = {
"Gola",
35482,
"alv",
}
m["gon"] = {
"Gondi",
1775361,
"dra-gon",
"Telu, Gonm, Gong",
translit = {
Telu = "te-translit",
Gong = "gon-Gong-translit",
Gonm = "gon-Gonm-translit",
},
}
m["goo"] = {
"tiếng Gone Dau",
3110470,
"poz-occ",
"Latn",
"Tiếng Gone Dau",
"Gone Dau",
}
m["gop"] = {
"Yeretuar",
8052565,
"poz-hce",
"Latn",
}
m["goq"] = {
"Gorap",
3110816,
"crp",
ancestors = "ms",
}
m["gor"] = {
"tiếng Gorontalo",
2501174,
"phi",
"Latn",
"Tiếng Gorontalo",
"Gorontalo",
}
m["got"] = {
"tiếng Goth",
35722,
"gme",
"Goth, Runr, Latn",
"Tiếng Goth",
"Goth",
translit = {Goth = "Goth-translit"},
link_tr = true,
entry_name = {Latn = {remove_diacritics = c.macron}},
}
m["gou"] = {
"Gavar",
3441180,
"cdc-cbm",
}
m["gov"] = {
"Goo",
16927208,
"dmn",
"Latn",
}
m["gow"] = {
"tiếng Gorowa",
3437626,
"cus-sou",
"Latn",
"Tiếng Gorowa",
"Gorowa",
}
m["gox"] = {
"Gobu",
7194986,
"bad-cnt",
}
m["goy"] = {
"Goundo",
317636,
"alv-kim",
}
m["goz"] = {
"Gozarkhani",
5590235,
"xme-ttc",
ancestors = "xme-ttc-eas",
}
m["gpa"] = {
"Gupa-Abawa",
3915352,
"alv-ngb",
}
m["gpn"] = {
"Taiap",
56237,
"paa",
}
m["gqa"] = {
"Ga'anda",
56245,
"cdc-cbm",
"Latn",
}
m["gqi"] = {
"Guiqiong",
3120647,
"sit-qia",
}
m["gqn"] = { -- a variety of 'ter'
"Kinikinao",
nil,
"awd",
}
m["gqr"] = {
"Gor",
759992,
"csu-sar",
}
m["gqu"] = {
"Qau",
17284874,
"qfa-gel",
}
m["gra"] = {
"tiếng Garasia Rajput",
21041529,
"inc-bhi",
"Deva, Gujr",
ancestors = "bhb",
"Tiếng Garasia Rajput",
"Garasia Rajput",
}
m["grb"] = {
"Grebo",
35257,
"kro-grb",
"Latn",
}
m["grc"] = {
"tiếng Hy Lạp cổ",
35497,
"grk",
"Polyt, Cprt",
"Tiếng Hy Lạp cổ",
"Hy Lạp cổ",
translit = {
Polyt = "grc-translit",
Cprt = "Cprt-translit",
},
override_translit = true,
entry_name = {
Polyt = s["Polyt-entryname"],
},
sort_key = {
Polyt = s["Grek-sortkey"],
},
standardChars = {
Polyt = "ΑΆἈἉἊἋἌἍἎἏᾈᾉᾊᾋᾌᾍᾎᾏᾸᾹᾺᾼΒΓΔΕΈἘἙἚἛἜἝῈΖΗΉἨἩἪἫἬἭἮἯᾘᾙᾚᾛᾜᾝᾞᾟῊῌΘΙΊΪἸἹἺἻἼἽἾἿῘῙῚΚΛΜΝΞΟΌὈὉὊὋὌὍΠΡῬΣΤΥΎΫὙὛὝὟῨῩῪΦΧΨΩΏὨὩὪὫὬὭὮὯᾨᾩᾪᾫᾬᾭᾮᾯῸῺῼαάἀἁἂἃἄἅἆἇὰᾀᾁᾂᾃᾄᾅᾆᾇᾰᾱᾲᾳᾴᾶᾷβγδεέἐἑἒἓἔἕὲζηήἠἡἢἣἤἥἦἧὴᾐᾑᾒᾓᾔᾕᾖᾗῂῃῄῆῇθιίϊΐἰἱἲἳἴἵἶἷὶῐῑῒῖῗκλμνξοόὀὁὂὃὄὅὸπρῤῥςστυύϋΰὐὑὒὓὔὕὖὗὺῠῡῢῦῧφχψωώὠὡὢὣὤὥὦὧὼᾠᾡᾢᾣᾤᾥᾦᾧῲῳῴῶῷ·ͺ΄΅᾽᾿῀῁῍῎῏῝῞῟῭`´῾",
Cprt = "𐠀𐠁𐠂𐠃𐠄𐠅𐠈𐠊𐠋𐠌𐠍𐠎𐠏𐠐𐠑𐠒𐠓𐠔𐠕𐠖𐠗𐠘𐠙𐠚𐠛𐠜𐠝𐠞𐠟𐠠𐠡𐠢𐠣𐠤𐠥𐠦𐠧𐠨𐠩𐠪𐠫𐠬𐠭𐠮𐠯𐠰𐠱𐠲𐠳𐠴𐠵𐠷𐠸𐠼𐠿",
c.punc
},
}
m["grd"] = {
"Guruntum",
3441272,
"cdc-wst",
"Latn",
}
m["grg"] = {
"Madi",
6727664,
"ngf-fin",
"Latn",
}
m["grh"] = {
"tiếng Gbiri-Niragu",
3913936,
"nic-kau",
"Latn",
"Tiếng Gbiri-Niragu",
"Gbiri-Niragu",
}
m["gri"] = {
"Ghari",
3104782,
"poz-sls",
"Latn",
}
m["grj"] = {
"Southern Grebo",
3914444,
"kro-grb",
"Latn",
ancestors = "grb",
}
m["grm"] = {
"Kota Marudu Talantang",
6433808,
"poz-san",
"Latn",
}
m["gro"] = {
"Groma",
56551,
"sit-tib",
}
m["grq"] = {
"Gorovu",
56355,
"paa",
"Latn",
}
m["grr"] = {
"tiếng Taznatit",
27926110,
"ber",
"Arab, Tfng",
"Tiếng Taznatit",
"Taznatit",
translit = {Tfng = "Tfng-translit"},
}
m["grs"] = {
"Gresi",
5607612,
"paa-nim",
"Latn",
}
m["grt"] = {
"tiếng Garo",
36137,
"tbq-bdg",
"Latn, Beng, Brai",
"Tiếng Garo",
"Garo",
}
m["gru"] = {
"tiếng Kistane",
13273,
"sem-eth",
"Latn, Ethi",
"Tiếng Kistane",
"Kistane",
}
m["grv"] = {
"Central Grebo",
18385114,
"kro-grb",
"Latn",
ancestors = "grb",
}
m["grw"] = {
"Gweda",
5623387,
"poz-ocw",
"Latn",
}
m["grx"] = {
"Guriaso",
12631954,
"paa-kwm",
"Latn",
}
m["gry"] = {
"Barclayville Grebo",
11157342,
"kro-grb",
"Latn",
ancestors = "grb",
}
m["grz"] = {
"Guramalum",
3120935,
"poz-ocw",
"Latn",
}
m["gse"] = {
"Ghanaian Sign Language",
35289,
"sgn",
"Latn", -- when documented
}
m["gsg"] = {
"German Sign Language",
33282,
"sgn-gsl",
"Sgnw",
}
m["gsl"] = {
"Gusilay",
35439,
"alv-jol",
"Latn",
}
m["gsm"] = {
"Guatemalan Sign Language",
2886781,
"sgn",
"Latn", -- when documented
}
m["gsn"] = {
"Gusan",
11732224,
"ngf-fin",
"Latn",
}
m["gso"] = {
"Southwest Gbaya",
4919322,
"alv-gbs",
"Latn",
}
m["gsp"] = {
"Wasembo",
7971402,
"ngf-mad",
"Latn",
}
m["gss"] = {
"Greek Sign Language",
3565084,
"sgn",
}
m["gsw"] = {
"tiếng Đức Alemanni",
131339,
"gmw-hgm",
"Latn",
"Tiếng Đức Alemanni",
"Đức Alemanni",
wikimedia_codes = "als",
ancestors = "gmh",
}
m["gta"] = {
"Guató",
3027940,
"qfa-iso",
"Latn",
}
m["gtu"] = {
"Aghu Tharrnggala",
16825981,
"aus-pmn",
"Latn",
}
m["gua"] = {
"Shiki",
3913946,
"nic-jrn",
"Latn",
}
m["gub"] = {
"tiếng Guajajára",
7699720,
"tup-gua",
"Latn",
"Tiếng Guajajára",
"Guajajára",
}
m["guc"] = {
"tiếng Wayuu",
891085,
"awd-taa",
"Latn",
"Tiếng Wayuu",
"Wayuu",
}
m["gud"] = {
"Yocoboué Dida",
21074781,
"kro-did",
"Latn",
}
m["gue"] = {
"Gurindji",
10511016,
"aus-pam",
"Latn",
}
m["guf"] = {
"Gupapuyngu",
10511004,
"aus-yol",
"Latn",
}
m["gug"] = {
"tiếng Guarani Paraguay",
17478066,
"tup-gua",
"Latn",
"Tiếng Guarani Paraguay",
"Guarani Paraguay",
ancestors = "gn",
}
m["guh"] = {
"Guahibo",
2669193,
"sai-guh",
"Latn",
}
m["gui"] = {
"Eastern Bolivian Guaraní",
2963912,
"tup-gua",
"Latn",
ancestors = "gn",
}
m["guk"] = {
"tiếng Gumuz",
2396970,
"ssa",
"Latn, Ethi",
"Tiếng Gumuz",
"Gumuz",
}
m["gul"] = {
"Gullah",
33395,
"crp",
"Latn",
ancestors = "en",
}
m["gum"] = {
"Guambiano",
2744745,
"sai-bar",
"Latn",
}
m["gun"] = {
"tiếng Guarani Mbya",
3915584,
"gn",
"Latn",
"Tiếng Guarani Mbya",
"Guarani Mbya",
}
m["guo"] = {
"Guayabero",
2980375,
"sai-guh",
"Latn",
}
m["gup"] = {
"Gunwinggu",
1406574,
"aus-gun",
"Latn",
}
m["guq"] = {
"Aché",
383701,
"tup",
"Latn",
}
m["gur"] = {
"tiếng Gurenne",
35331,
"nic-mre",
"Latn",
"Tiếng Gurenne",
"Gurenne",
}
m["gus"] = {
"Guinean Sign Language",
15983937,
"sgn",
"Latn", -- when documented
}
m["gut"] = {
"Maléku Jaíka",
3915782,
"cba",
"Latn",
}
m["guu"] = {
"Yanomamö",
8048928,
"sai-ynm",
"Latn",
}
m["guv"] = {
"Gey",
nil,
"alv-sav",
"Latn",
}
m["guw"] = {
"tiếng Gun",
3111668,
"alv-gbe",
"Latn",
"Tiếng Gun",
"Gun",
entry_name = {remove_diacritics = c.grave .. c.acute .. c.macron},
}
m["gux"] = {
"tiếng Gulimancema",
35474,
"nic-grm",
"Latn",
"Tiếng Gulimancema",
"Gulimancema"
}
m["guz"] = {
"Gusii",
33603,
"bnt-lok",
"Latn",
}
m["gva"] = {
"Kaskihá",
3033534,
"sai-mas",
"Latn",
}
m["gvc"] = {
"Guanano",
3566001,
"sai-tuc",
"Latn",
}
m["gve"] = {
"Duwet",
5317647,
"poz-ocw",
"Latn",
}
m["gvf"] = {
"Golin",
3110291,
"ngf",
"Latn",
}
m["gvj"] = {
"tiếng Guajá",
3915506,
"tup",
"Latn",
"Tiếng Guajá",
"Guajá",
}
m["gvl"] = {
"tiếng Gulay",
641737,
"csu-sar",
"Latn",
"Tiếng Gulay",
"Gulay",
}
m["gvm"] = {
"Gurmana",
3913363,
"nic-shi",
"Latn",
}
m["gvn"] = {
"Kuku-Yalanji",
5621973,
"aus-pam",
"Latn",
}
m["gvo"] = {
"Gavião do Jiparaná",
5528335,
"tup",
"Latn",
}
m["gvp"] = {
"Pará Gavião",
3365443,
"sai-nje",
"Latn",
}
m["gvr"] = {
"Western Gurung",
2392342,
"sit-tam",
"Gukh, Deva",
}
m["gvs"] = {
"Gumawana",
5618041,
"poz-ocw",
"Latn",
}
m["gvy"] = {
"Guyani",
10511230,
"aus-pam",
"Latn",
}
m["gwa"] = {
"Mbato",
3914941,
"alv-ptn",
"Latn",
}
m["gwb"] = {
"Gwa",
5623219,
"nic-jrn",
"Latn",
}
m["gwc"] = {
"tiếng Kalam",
1675961,
"inc-koh",
"Arab",
"Tiếng Kalam",
"Kalam",
}
m["gwd"] = {
"tiếng Gawwada",
3032135,
"cus-eas",
"Latn, Ethi",
"Tiếng Gawwada",
"Gawwada",
}
m["gwe"] = {
"Gweno",
3358211,
"bnt-chg",
"Latn",
}
m["gwf"] = {
"Gowro",
3812403,
"inc-koh",
}
m["gwg"] = {
"Moo",
6907057,
"alv-bwj",
"Latn",
}
m["gwi"] = {
"tiếng Gwichʼin",
21057,
"ath-nor",
"Latn",
"Tiếng Gwichʼin",
"Gwichʼin",
}
m["gwj"] = {
"Gcwi",
12631978,
"khi-kal",
"Latn",
}
m["gwm"] = {
"Awngthim",
4830109,
"aus-pmn",
"Latn",
}
m["gwn"] = {
"Gwandara",
56521,
"cdc-wst",
"Latn",
}
m["gwr"] = {
"Gwere",
5623559,
"bnt-nyg",
"Latn",
}
m["gwt"] = {
"tiếng Gawar-Bati",
33894,
"inc-kun",
"Arab",
"Tiếng Gawar-Bati",
"Gawar-Bati",
}
m["gwu"] = {
"Guwamu",
10511225,
"aus-pam",
"Latn",
}
m["gww"] = {
"Kwini",
10551249,
"aus-wor",
"Latn",
}
m["gwx"] = {
"Gua",
35422,
"alv-gng",
"Latn",
}
m["gxx"] = {
"Wè Southern",
19921582,
"kro-wee",
"Latn",
}
m["gya"] = {
"tiếng Tây Bắc Gbaya",
36594,
"alv-gbw",
"Latn",
"Tiếng Tây Bắc Gbaya",
"Tây Bắc Gbaya",
}
m["gyb"] = {
"Garus",
5524492,
"ngf-mad",
"Latn",
}
m["gyd"] = {
"Kayardild",
3913770,
"aus-tnk",
"Latn",
}
m["gye"] = {
"Gyem",
5624046,
"nic-jer",
"Latn",
}
m["gyf"] = {
"Gungabula",
10510783,
"aus-pam",
"Latn",
}
m["gyg"] = {
"Gbayi",
11137618,
"nic-ngd",
"Latn",
}
m["gyi"] = {
"Gyele",
35434,
"bnt-mnj",
"Latn",
}
m["gyl"] = {
"tiếng Gayil",
5528771,
"omv-aro",
"Latn, Ethi",
"Tiếng Gayil",
"Gayil",
}
m["gym"] = {
"Ngäbere",
3915581,
"cba",
"Latn",
}
m["gyn"] = {
"Guyanese Creole English",
3305477,
"crp",
"Latn",
ancestors = "en",
}
m["gyo"] = {
"Gyalsumdo",
53575940,
"sit-kyk",
}
m["gyr"] = {
"tiếng Guarayu",
3118779,
"tup",
"Latn",
"Tiếng Guarayu",
"Guarayu",
}
m["gyy"] = {
"Gunya",
10511001,
"aus-pam",
"Latn",
}
m["gza"] = {
"tiếng Ganza",
5521556,
"omv-mao",
"Latn",
"Tiếng Ganza",
"Ganza",
}
m["gzn"] = {
"Gane",
3095108,
"poz-hce",
"Latn",
}
return require("Module:languages").finalizeData(m, "language")
4smkafaukifi9o5vl1gtvz6c9dpkrw8
Thể loại:Mục từ tiếng Udihe
14
272603
2348948
2078698
2026-04-27T15:58:37Z
WhoAlone
40420
2348948
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Tiếng Udihe
14
272604
2348946
2083369
2026-04-27T15:57:27Z
WhoAlone
40420
2348946
wikitext
text/x-wiki
{{auto cat|Nga}}
1scojod7padrhlt78piyebx8m3jel0l
Thể loại:Số tiếng Udihe
14
279263
2348956
2095429
2026-04-27T16:12:43Z
WhoAlone
40420
2348956
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Mô đun:documentation2
828
282602
2348926
2339718
2026-04-27T15:28:08Z
Hiyuune
50834
2348926
Scribunto
text/plain
local export = {}
local array_module = "Module:array"
local debug_track_module = "Module:debug/track"
local frame_module = "Module:frame"
local fun_is_callable_module = "Module:fun/isCallable"
local languages_module = "Module:languages"
local links_module = "Module:links"
local load_module = "Module:load"
local module_categorization_module = "Module:module categorization"
local number_list_show_module = "Module:number list/show"
local chemical_element_list_show_module = "Module:chemical element list/show"
local pages_module = "Module:pages"
local parameters_module = "Module:parameters"
local scripts_module = "Module:scripts"
local string_endswith_module = "Module:string/endswith"
local string_gline_module = "Module:string/gline"
local string_insert_module = "Module:string/insert"
local string_startswith_module = "Module:string/startswith"
local string_utilities_module = "Module:string utilities"
local template_parser_module = "Module:template parser"
local title_exists_module = "Module:title/exists"
local title_new_title_module = "Module:title/newTitle"
local concat = table.concat
local error = error
local full_url = mw.uri.fullUrl
local get_current_title = mw.title.getCurrentTitle
local insert = table.insert
local ipairs = ipairs
local list_to_text = mw.text.listToText
local new_message = mw.message.new
local pcall = pcall
local require = require
local tonumber = tonumber
local tostring = tostring
local type = type
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local function Array(...)
Array = require(array_module)
return Array(...)
end
local function categorize_module(...)
categorize_module = require(module_categorization_module).categorize
return categorize_module(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function endswith(...)
endswith = require(string_endswith_module)
return endswith(...)
end
local function expand_template(...)
expand_template = require(frame_module).expandTemplate
return expand_template(...)
end
local function find_templates(...)
find_templates = require(template_parser_module).find_templates
return find_templates(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function get_pagetype(...)
get_pagetype = require(pages_module).get_pagetype
return get_pagetype(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function gline(...)
gline = require(string_gline_module)
return gline(...)
end
local function is_callable(...)
is_callable = require(fun_is_callable_module)
return is_callable(...)
end
local function is_documentation(...)
is_documentation = require(pages_module).is_documentation
return is_documentation(...)
end
local function is_sandbox(...)
is_sandbox = require(pages_module).is_sandbox
return is_sandbox(...)
end
local function new_title(...)
new_title = require(title_new_title_module)
return new_title(...)
end
local function number_list_show_table(...)
number_list_show_table = require(number_list_show_module).table
return number_list_show_table(...)
end
local function chemical_element_list_show_table(...)
chemical_element_list_show_table = require(chemical_element_list_show_module).table
return chemical_element_list_show_table(...)
end
local function preprocess(...)
preprocess = require(frame_module).preprocess
return preprocess(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function safe_load_data(...)
safe_load_data = require(load_module).safe_load_data
return safe_load_data(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function startswith(...)
startswith = require(string_startswith_module)
return startswith(...)
end
local function string_insert(...)
string_insert = require(string_insert_module)
return string_insert(...)
end
local function title_exists(...)
title_exists = require(title_exists_module)
return title_exists(...)
end
local function ugsub(...)
ugsub = require(string_utilities_module).gsub
return ugsub(...)
end
local function umatch(...)
umatch = require(string_utilities_module).match
return umatch(...)
end
local skins = {
["common" ] = "";
["vector" ] = "Vector";
["monobook" ] = "Monobook";
["cologneblue"] = "Cologne Blue";
["modern" ] = "Modern";
}
local function track(page)
debug_track("documentation/" .. page)
return true
end
local function compare_pages(page1, page2, text)
return "[" .. tostring(
full_url("Special:ComparePages", {page1 = page1, page2 = page2}))
.. " " .. text .. "]"
end
-- Avoid transcluding [[Module:languages/cache]] everywhere.
local lang_cache = setmetatable({}, { __index = function (self, k)
return require("Module:languages/cache")[k]
end })
local function zh_link(word)
return full_link{
lang = lang_cache.zh,
term = word
}
end
local function make_languages_data_documentation(title, cats, division)
local doc_template, module_cat
if endswith(division, "/extra") then
division = division:sub(1, -7)
doc_template = "language extradata documentation"
module_cat = "Mô đun dữ liệu ngôn ngữ bổ sung"
else
doc_template = "language data documentation"
module_cat = "Mô đun dữ liệu ngôn ngữ"
end
local sort_key
if division == "exceptional" then
sort_key = "x"
else
sort_key = division:gsub("/", "")
end
cats:insert(module_cat .. "|" .. sort_key)
return {
title = doc_template
}
end
local function make_Unicode_data_documentation(title, cats)
local subpage, first_three_of_code_point
= title.fullText:match("^Module:Unicode data/([^/]+)/(%x%x%x)$")
if subpage == "names" or subpage == "images" or subpage == "emoji images" then
local low, high =
tonumber(first_three_of_code_point .. "000", 16),
tonumber(first_three_of_code_point .. "FFF", 16)
local text, text_type
if subpage == "names" then
text_type = "dữ liệu hình ảnh"
elseif subpage == "images" then
text_type = "dữ liệu hình ảnh"
elseif subpage == "emoji images" then
text_type = "hình ảnh theo phong cách emoji"
end
text = string.format(
"Mô đun dữ liệu này chứa " .. text_type .. " của " ..
"các điểm mã [[Phụ lục:Unicode|Unicode]] trong phạm vi từ U+%04X đến U+%04X.",
low, high)
if subpage == "images" and safe_load_data("Module:Unicode data/emoji images/" .. first_three_of_code_point) then
text = text .. " Danh sách này bao gồm các biến thể văn bản của emoji. Để biết danh sách các biến thể biểu tượng cảm xúc của những emoji đó, xem [[Module:Unicode data/emoji images/" .. first_three_of_code_point .. "]]."
elseif subpage == "emoji images" then
text = text .. " Đối với hình ảnh theo phong cách văn bản, xem [[Module:Unicode data/images/" .. first_three_of_code_point .. "]]."
end
return text
end
end
local function insert_lang_data_module_cats(cats, langcode, overall_data_module_cat)
local lang = lang_cache[langcode]
if lang then
local langname
if lang._fullCode then
langname = lang_cache[lang._fullCode]:getCanonicalName()
else
langname = lang:getCanonicalName()
end
cats:insert(overall_data_module_cat .. "|" .. langname)
cats:insert("Mô đun " .. langname)
cats:insert("Mô đun dữ liệu " ..langname)
return lang, langname
end
end
--[=[
This provides categories and documentation for various data modules, so that [[Category:Uncategorized modules]] isn't
unnecessarily cluttered. It is a list of tables, each of which have the following possible fields:
`regex` (required): A Lua pattern to match the module's title. If it matches, the data in this entry will be used.
Any captures in the pattern can by referenced in the `cat` field using %1 for the first capture, %2 for the
second, etc. (often used for creating the sortkey for the category). In addition, the captures are passed to the
`process` function as the third and subsequent parameters.
`process` (optional): This may be a function or a string. If it is a function, it is called as follows:
`process(TITLE, CATS, CAPTURE1, CAPTURE2, ...)`
where:
* TITLE is a title object describing the module's title; see
[https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Title_objects].
* CATS is an array object (see [[Module:array]]) of categories that the module will be added to.
* CAPTURE1, CAPTURE2, ... contain any captures in the `regex` field.
The return value of `process` should either be a string (which will be used as the module's documentation), or a
table specifying the name of a template to expand to get the documentation, along with the arguments to that
template. In the latter format, the template name (bare, without the "Template:" prefix) should be in the `title`
field, and any arguments should be in `args; in this case, the template name will be listed above the generated
documentation as the source of the documentation, along with an edit button to edit the template's contents.
If, however, the return value of the `process` function is a string, any template invocations will be expanded
using frame:preprocess(), and [[Module:documentation]] will be listed as the source of the documentation.
If `process` itself is a string rather than a function, it should name a submodule under
[[Module:documentation/functions/]] which returns a function, of the same type as described above. This submodule
will be specified as the source of the documentation (unless it returns a table naming a template to expand to get
the documentation, as described above).
If `process` is omitted entirely, the module will have no documentation.
`cat` (optional): A string naming the category into which the module should be placed, or a list of such strings.
Captures specified in `regex` may be referenced in this string using %1 for the first capture, %2 for the second,
etc. It is also possible to add categories in the `process` function by inserting them into the passed-in CATS
array (the second parameter).
]=]
local module_regex = {
{
regex = "^Mô đun:languages/data/(3/%l/extra)$",
process = make_languages_data_documentation,
},
{
regex = "^Mô đun:languages/data/(3/%l)$",
process = make_languages_data_documentation,
},
{
regex = "^Mô đun:languages/data/(2/extra)$",
process = make_languages_data_documentation,
},
{
regex = "^Mô đun:languages/data/(2)$",
process = make_languages_data_documentation,
},
{
regex = "^Mô đun:languages/data/(exceptional/extra)$",
process = make_languages_data_documentation,
},
{
regex = "^Mô đun:languages/data/(exceptional)$",
process = make_languages_data_documentation,
},
{
regex = "^Mô đun:languages/.+$",
cat = "Mô đun ngôn ngữ và chữ viết",
},
{
regex = "^Mô đun:scripts/.+$",
cat = "Mô đun ngôn ngữ và chữ viết",
},
{
regex = "^Mô đun:data tables/data..?.?.?$",
cat = "Mô đun dữ liệu bảng tham chiếu phân mảnh",
},
{
regex = "^Module:zh/data/dial%-pron/.+$",
cat = "Mô đun dữ liệu phát âm phương ngữ tiếng Trung Quốc",
process = "zh dial or syn",
},
{
regex = "^Mô đun:zh/data/dial%-syn/.+$",
cat = "Mô đun dữ liệu từ đồng nghĩa phương ngữ tiếng Trung Quốc",
process = "zh dial or syn",
},
{
regex = "^Mô đun:zh/data/glyph%-data/.+$",
cat = "Mô đun dữ liệu biểu mẫu ký tự lịch sử tiếng Trung Quốc",
process = function(title, cats)
local character = title.fullText:match("^Module:zh/data/glyph%-data/(.+)")
if character then
return ("Mô đun này chứa dữ liệu về các hình thức lịch sử của chữ Hán %s.")
:format(zh_link(character))
end
end,
},
{
regex = "^Mô đun:zh/data/ltc%-pron/(.+)$",
cat = "Mô đun dữ liệu phát âm tiếng Trung Quốc trung đại|%1",
process = "zh data",
},
{
regex = "^Mô đun:zh/data/och%-pron%-BS/(.+)$",
cat = "Mô đun dữ liệu phát âm tiếng Trung Quốc cổ (Baxter-Sagart)|%1",
process = "zh data",
},
{
regex = "^Mô đun:zh/data/och%-pron%-ZS/(.+)$",
cat = "Mô đun dữ liệu phát âm tiếng Trung Quốc cổ (Trịnh Chương)|%1",
process = "zh data",
},
{
-- capture rest of zh/data submodules
regex = "^Mô đun:zh/data/(.+)$",
cat = "Mô đun dữ liệu tiếng Trung Quốc|%1",
},
{
regex = "^Mô đun:mul/guoxue%-data/cjk%-?(.*)$",
process = "guoxue-data",
},
{
regex = "^Mô đun:Unicode data/(.+)$",
cat = "Mô đun dữ liệu Unicode|%1",
process = make_Unicode_data_documentation,
},
{
regex = "^Mô đun:number list/data/(.+)$",
process = function(title, cats, lang_code)
local lang = insert_lang_data_module_cats(cats, lang_code, "Mô đun dữ liệu số")
if lang then
return ("Mô đun này chứa dữ liệu về nhiều loại số khác nhau trong %s.\n%s")
:format(lang:makeCategoryLink(), number_list_show_table() or "")
end
end,
},
{
regex = "^Mô đun:chemical element list/data/(.+)$",
process = function(title, cats, lang_code)
local lang = insert_lang_data_module_cats(cats, lang_code, "Mô đun dữ liệu nguyên tố hóa học")
if lang then
return ("Mô đun này chứa dữ liệu về nguyên tố hóa học trong %s.\n%s")
:format(lang:makeCategoryLink(), chemical_element_list_show_table() or "")
end
end,
},
{
regex = "^Mô đun:accel/(.+)$",
process = function(title, cats)
local lang_code = title.subpageText
local lang = lang_cache[lang_code]
if lang then
cats:insert("Mô đun " .. lang:getCanonicalName() .. "|accel")
cats:insert(("Mô đun con Accel|%s"):format(lang:getCanonicalName()))
return ("Mô đun này chứa các quy tắc tạo mục từ mới cho %s; xem [[WT:ACCEL]] để có cái nhìn tổng quan và [[Module:accel]] để biết thông tin về việc tạo các quy tắc mới.")
:format(lang:makeCategoryLink())
end
end,
},
{
regex = "^Mô đun:inc%-ash/dial/data/(.+)$",
cat = "Mô đun Ashokan Prakrit|%1",
process = function(title, cats)
local word = title.fullText:match("^Module:inc%-ash/dial/data/(.+)$")
if word then
local lang = lang_cache["inc-ash"]
return ("Mô đun này chứa dữ liệu về cách phát âm của %s trong các phương ngữ của %s.")
:format(full_link({ term = word, lang = lang }, "term"),
lang:makeCategoryLink())
end
end,
},
{
regex = "^.+%-translit$",
process = "translit",
},
{
regex = "^Mô đun:form of/lang%-data/(.+)$",
process = function(title, cats, lang_code)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Mô đun dạng từ theo ngôn ngữ cụ thể")
if lang then
-- FIXME, display more info.
return "Mô đun này chứa dữ liệu dạng ngôn ngữ cụ thể (thẻ, phím tắt, tham số lemma cơ sở, v.v.) cho " ..
langname .. "."
end
end
},
{
regex = "^Mô đun:labels/data/lang/(.+)$",
process = function(title, cats, lang_code)
local lang = insert_lang_data_module_cats(cats, lang_code, "Mô-đun dữ liệu nhãn theo ngôn ngữ cụ thể")
if lang then
return {
title = "label language-specific data documentation",
args = { [1] = lang_code },
}
end
end
},
{
regex = "^Mô đun:category tree/lang/(.+)$",
process = function(title, cats, lang_code)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Mô đun dữ liệu cây thể loại/lang")
if lang then
return "Mô đun này xử lý việc tạo ra các mô tả và phân loại cho các trang thể loại " .. langname .. " theo "
.. "định dạng \"LABEL " .. langname .. "\" trong đó LABEL có thể là bất kỳ văn bản nào. Ví dụ là "
.. "[[:Thể loại:Chia động từ 2.1 tiếng Bulgaria]] và [[:Thể loại:Danh từ trung tính gốc vòm mềm tiếng Nga]]. "
.. "Mô đun này là một phần của hệ thống cây thể loại, là một khuôn khổ chung để tạo ra "
.. "mô tả và phân loại các trang thể loại.\n\n"
.. "Để biết thêm thông tin, hãy xem [[Module:category tree/lang/tài liệu]].\n\n"
.. "'''LƯU Ý:''' Nếu bạn thêm một mô đun ngôn ngữ cụ thể mới, bạn phải thêm mã ngôn ngữ vào "
.. "danh sách ở đầu [[Module:category tree/lang]] để mô đun được nhận dạng."
end
end
},
{
regex = "^Mô đun:category tree/topic/(.+)$",
process = function(title, cats, submodule)
cats:insert("Mô đun dữ liệu cây thể loại/topic| ")
return {
title = "topic cat data submodule documentation"
}
end
},
{
regex = "^Mô đun:category tree/(.+)$",
process = function(title, cats, submodule)
cats:insert("Mô đun dữ liệu cây thể loại| ")
return {
title = "category tree data submodule documentation"
}
end
},
{
regex = "^Mô đun:ja/data/(.+)$",
cat = "Mô đun dữ liệu tiếng Nhật|%1",
},
{
regex = "^Mô đun:fi%-dialects/data/feature/Kettunen1940 ([0-9]+)$",
cat = "Mô đun atlas dữ liệu phương ngữ tiếng Phần Lan|%1",
process = function(title, cats, shard)
return "Mô-đun này chứa phân đoạn " .. shard .. " của phiên bản trực tuyến tác phẩm năm 1940 của Lauri Kettunen " ..
"''Suomen murteet III A. Murrekartasto'' (\"Finnish dialects III A: Dialect atlas\"). " ..
"Nó đã được nhập và chuyển đổi từ urn:nbn:fi:csc-kata20151130145346403821, được xuất bản bởi " ..
"''Kotimaisten kielten keskus'' theo giấy phép CC BY 4.0."
end
},
{
regex = "^Mô đun:fi%-dialects/data/feature/(.+)",
cat = "Mô đun dữ liệu phương ngữ tiếng Phần Lan|%1",
},
{
regex = "^Mô đun:fi%-dialects/data/word/(.+)",
cat = "Mô đun dữ liệu phương ngữ tiếng Phần Lan|%1",
},
{
regex = "^Mô đun:Swadesh/data/([%l-]+)$",
process = function(title, cats, lang_code)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Mô đun Swadesh")
if lang then
return "Mô đun này chứa [[danh sách Swadesh]] có các từ vựng cơ bản trong " .. langname .. "."
end
end
},
{
regex = "^Mô đun:Swadesh/data/([%l-]+)/([^/]*)$",
process = function(title, cats, lang_code, variety)
local lang, langname = insert_lang_data_module_cats(cats, lang_code, "Mô đun Swadesh")
if lang then
local prefix = "Mô đun này chứa [[danh sách Swadesh]] có các từ vựng cơ bản trong "
local etym_lang = get_lang(variety, nil, "allow etym")
if etym_lang then
return ("%s %s các kiểu khác nhau của %s."):format(prefix, etym_lang:getCanonicalName(), langname)
end
local script = get_script(variety)
if script then
return ("chữ viết %s %s %s."):format(prefix, langname, script:getCanonicalName())
end
return ("%s %s các kiểu khác nhau của %s."):format(prefix, variety, langname)
end
end
},
{
regex = "^Mô đun:typing%-aids",
process = function(title, cats)
local data_suffix = title.fullText:match("^Module:typing%-aids/data/(.+)$")
local sortkey
if data_suffix then
if data_suffix:find "^[%l-]+$" then
local lang = get_lang(data_suffix)
if lang then
sortkey = lang:getCanonicalName()
cats:insert("Mô đun dữ liệu " .. sortkey)
end
elseif data_suffix:find "^%u%l%l%l$" then
local script = get_script(data_suffix)
if script then
sortkey = script:getCanonicalName()
cats:insert(script:getCategoryName())
end
end
cats:insert("Mô-đun dữ liệu chèn ký tự|" .. (sortkey or data_suffix))
end
end,
},
{
regex = "^Mô đun:R:([%l-]+):(.+)$",
process = function(title, cats, lang_code, refname)
local lang = lang_cache[lang_code]
if lang then
cats:insert("Mô đun " .. lang:getCanonicalName() .. "|" .. refname)
cats:insert(("Mô đun tham khảo|%s"):format(lang:getCanonicalName()))
return "Mô đun này triển khai bản mẫu tham khảo {{temp|R:" .. lang_code .. ":" .. refname .. "}}."
end
end,
},
{
regex = "^Mô đun:Quotations/([%l-]+)/?(.*)",
process = "Quotation",
},
{
regex = "^Mô đun:affix/lang%-data/([%l-]+)",
process = "affix lang-data",
},
{
regex = "^Mô đun:dialect synonyms/([%l-]+)$",
process = function(title, cats, lang_code)
local lang = lang_cache[lang_code]
if lang then
local langname = lang:getCanonicalName()
cats:insert("Mô đun dữ liệu từ phương ngữ đồng nghĩa|" .. langname)
cats:insert("Mô đun dữ liệu từ phương ngữ đồng nghĩa " .. langname .. "| ")
return "Mô đun này chứa dữ liệu về các dạng cụ thể của " .. langname .. ", được sử dụng bởi " ..
"{{tl|dialect synonyms}}. Các từ đồng nghĩa thực tế được chứa trong các mô đun con.\n\n" ..
expand_template({ title = 'dial syn', args = { lang_code, ["demo mode"] = "y" } })
end
end,
},
{
regex = "^Mô đun:dialect synonyms/([%l-]+)/(.+)$",
process = function(title, cats, lang_code, term)
local lang = lang_cache[lang_code]
if lang then
local langname = lang:getCanonicalName()
cats:insert("Mô đun dữ liệu từ phương ngữ đồng nghĩa|" .. langname)
cats:insert("Mô đun dữ liệu từ phương ngữ đồng nghĩa " .. langname .. "|" .. term)
return ("Mô đun này chứa các từ phương ngữ đồng nghĩa %s cho {{mention|%s|%s}}.\n\n%s"):format(langname, lang_code, term, expand_template({ title = 'dial syn', args = { lang_code, term } }))
end
end,
},
{
regex = "^Mô đun:bibliography/data/([%l-]+)$",
process = function(title, cats, lang_code)
if lang_code == "preload" then
return 'Được sử dụng làm mô hình cơ sở cho các ngôn ngữ khác khi nhấn vào nút "tạo mô đun con ngôn ngữ mới".'
end
local page = require(title.fullText).bib_page
if not page then
page = lang_cache[lang_code]:getCanonicalName()
if page then
cats:insert("Mô đun " ..page)
end
end
cats:insert("Mô đun tham khảo")
return "Mô-đun này chứa dữ liệu thư mục cho "..page..". Đối với thư mục được định dạng, xem '''[[Phụ lục:Thư mục học/"..page.."]]'''."
end,
},
}
function export.show(frame)
local boolean_default_false = {type = "boolean", default = false}
local args = process_params(frame.args, {
["hr"] = true,
["for"] = true,
["from"] = true,
["allowondoc"] = boolean_default_false, -- Don't throw an error if used on a documentation subpage.
["notsubpage"] = boolean_default_false,
["nodoc"] = boolean_default_false,
["nolinks"] = boolean_default_false, -- suppress all "Useful links"
["nosandbox"] = boolean_default_false, -- supress sandbox
})
local output = Array('\n<div class="documentation" style="display:block; clear:both">\n')
local cats = Array()
local nodoc = args.nodoc
local title = args["for"] and new_title(args["for"]) or get_current_title()
local doc_title = args.from ~= "-" and new_title(args.from or title.fullText .. '/tài liệu') or nil
local contentModel = title.contentModel
local pagetype, is_script_or_stylesheet = get_pagetype(title)
local preload, fallback_docs, doc_content, old_doc_title, user_name, skin_name, needs_doc
local doc_content_source = "Module:documentation2"
local auto_generated_cat_source
local cats_auto_generated = false
if not args.allowondoc and is_documentation(title) then
-- TODO: merge with {{documentation subpage}}, and choose behaviour based on the page type.
error("Bản mẫu này không nên được sử dụng trên trang tài liệu. Vui lòng sử dụng [[Bản mẫu:documentation subpage]].")
elseif is_sandbox(title) then
local sandbox_ns = title.nsText
preload = ("Template:Tài liệu 2/preload%s%sSandbox"):format(
sandbox_ns == "Mô_đun" and sandbox_ns or "Bản_mẫu",
title.rootText:match("^[Tt]hành viên:(.+)") and "Thành viên" or ""
)
elseif pagetype:match("%f[%w]gadget%f[%W]") then
preload = "Template:Tài liệu 2/preloadGadget"
elseif pagetype:match("%f[%w]script%f[%W]") then -- .js
if title.nsText == "MediaWiki" then
preload = "Template:Tài liệu 2/preloadMediaWikiJavaScript"
else
preload = "Template:Tài liệu/preload" -- XXX
if title.nsText == "Thành_viên" then
user_name = title.rootText
end
end
is_script_or_stylesheet = true
elseif pagetype:match("%f[%w]stylesheet%f[%W]") then -- .css
preload = "Template:Tài liệu/preload" -- XXX
if title.nsText == "Thành_viên" then
user_name = title.rootText
end
is_script_or_stylesheet = true
elseif contentModel == "Scribunto" then -- Exclude pages in Module: which aren't Scribunto.
preload = "Template:Tài liệu 2/preloadModule"
elseif pagetype:match("%f[%w]bản_mẫu%f[%W]") or pagetype:match("%f[%w]project%f[%W]") then
preload = "Template:Tài liệu/preload"
end
if doc_title and doc_title.isRedirect then
old_doc_title = doc_title
doc_title = doc_title.redirectTarget
end
output:insert("<dl class=\"plainlinks\" style=\"font-size: smaller;\">")
local function get_module_doc_and_cats(categories_only)
cats_auto_generated = true
local automatic_cats = nil
if user_name then
fallback_docs = "documentation/fallback/user module"
automatic_cats = {"Mô đun chỗ thử thành viên"}
else
for _, data in ipairs(module_regex) do
local captures = {umatch(title.fullText, data.regex)}
if #captures > 0 then
local cat, process_function
if is_callable(data.process) then
process_function = data.process
elseif type(data.process) == "string" then
doc_content_source = "Mô đun:documentation2/functions/" .. data.process
process_function = require(doc_content_source)
end
if process_function then
doc_content = process_function(title, cats, unpack(captures))
end
if type(doc_content) == "table" then
doc_content_source = doc_content.title and "Bản_mẫu:" .. doc_content.title or doc_content_source
doc_content = expand_template(doc_content)
elseif doc_content ~= nil then
doc_content = preprocess(doc_content)
end
cat = data.cat
if cat then
if type(cat) == "string" then
cat = {cat}
end
for _, c in ipairs(cat) do
insert(cats, (ugsub(title.fullText, data.regex, c)))
end
end
break
end
end
end
if title.subpageText == "templates" then
cats:insert("Mô đun giao diện bản mẫu")
end
if automatic_cats then
for _, c in ipairs(automatic_cats) do
cats:insert(c)
end
end
if #cats == 0 then
local auto_cats = categorize_module(frame, "return raw", "noerror")
if #auto_cats > 0 then
auto_generated_cat_source = "Module:module categorization"
end
for _, category in ipairs(auto_cats) do
cats:insert(category)
end
end
-- meaning module is not in user’s sandbox or one of many datamodule boring series
needs_doc = not categories_only and not (automatic_cats or doc_content or fallback_docs)
end
-- Override automatic documentation, if present.
if doc_title and doc_title.exists then
local cats_auto_generated_text = ""
if contentModel == "Scribunto" then
local doc_page_content = doc_title.content
-- Track then do nothing if there are uses of includeonly. The
-- pattern is slightly too permissive, but any false-positives are
-- obvious typos that should be corrected.
if doc_page_content:lower():match("</?includeonly%f[%s/>][^>]*>") then
track("module-includeonly")
else
-- Check for uses of {{module cat}}. find_templates treats the
-- input as transcluded by default (i.e. it parses the wikitext
-- which will be transcluded through to the module page).
local module_cat
for template in find_templates(doc_page_content) do
if template:get_name() == "module cat" then
module_cat = true
break
end
end
if not module_cat then
get_module_doc_and_cats("categories only")
auto_generated_cat_source = auto_generated_cat_source or doc_content_source
cats_auto_generated_text = " Thể loại được tự động tạo bởi [[" .. auto_generated_cat_source .. "]]. <sup>[[" ..
new_title(auto_generated_cat_source):fullUrl{action = "edit"} .. " sửa]]</sup>"
end
end
end
output:insert(
"<dd><i style=\"font-size: larger;\">[[:en:Help:Documenting templates and modules|Tài liệu]] " ..
"bên dưới nằm tại [[" ..
doc_title.fullText .. "]]. " .. "<sup>[[" .. doc_title:fullUrl{action = "edit"} .. " sửa]]</sup>" ..
cats_auto_generated_text .. "</i></dd>")
else
if contentModel == "Scribunto" then
get_module_doc_and_cats(false)
elseif title.nsText == "Bản_mẫu" then
--cats:insert("Uncategorized templates")
needs_doc = not (fallback_docs or nodoc)
elseif user_name and is_script_or_stylesheet then
skin_name = skins[title.text:sub(#title.rootText + 1):match("^/(%l+)%.[jc]ss?$")]
if skin_name then
fallback_docs = "documentation/fallback/user " .. contentModel
end
end
if doc_content then
output:insert(
"<dd><i style=\"font-size: larger;\">[[:en:Help:Documenting templates and modules|Tài liệu]] " ..
"bên dưới được " ..
"tạo bởi [[" .. doc_content_source .. "]]. <sup>[[" ..
new_title(doc_content_source):fullUrl{action = "edit"} ..
" sửa]]</sup> </i></dd>")
elseif not nodoc then
if title.text:find("/sandbox%d*%f[/%z]") then
local sandbox_of = title.fullText:gsub("/sandbox%d*%f[/%z]", "")
output:insert(
"<dd><i style=\"font-size: larger;\">Chỗ thử của" ..
" [[" .. sandbox_of .. "|" .. sandbox_of .. "]]. <sup>[" .. compare_pages(title.fullText, sandbox_of, "khác") .. "]</sup></i></dd>\n")
elseif title.text:find("/testcases%d*%f[/%z]") then
local testcase_of = title.fullText:gsub("/testcases%d*%f[/%z]", "")
output:insert(
"<dd><i style=\"font-size: larger;\">Trường hợp kiểm thử của" ..
" [[" .. testcase_of .. "|" .. testcase_of .. "]]. <sup>[" .. compare_pages(title.fullText, testcase_of, "khác") .. "]</sup></i></dd>\n")
elseif doc_title then
output:insert(
"<dd><i style=\"font-size: larger;\">Trang " .. pagetype ..
" này thiếu [[:en:Help:Documenting templates and modules|trang con tài liệu]]. " ..
(fallback_docs and "Bạn có thể " or "Xin hãy ") ..
"[" .. doc_title:fullUrl{action = "edit", preload = preload}
.. " tạo trang tài liệu này].</i></dd>\n")
else
output:insert(
"<dd><i style=\"font-size: larger; color: var(--wikt-palette-red-9,#FF0000);\">Không thể tự động tạo " ..
"trang tài liệu cho " .. pagetype .." này.</i></dd>\n")
end
end
end
if startswith(title.fullText, "MediaWiki:Gadget-") then
local is_gadget = false
for line in gline(new_title("MediaWiki:Gadgets-definition").content) do
local gadget, items = line:match("^%*%s*(%a[%w_-]*)%[.-%]|(.+)$")
if not gadget then
gadget, items = line:match("^%*%s*(%a[%w_-]*)|(.+)$")
end
if gadget then
items = Array(split(items, "|"))
for i, item in ipairs(items) do
if title.fullText == ("MediaWiki:Gadget-" .. item) then
is_gadget = true
output:insert("<dd> ''Tập lệnh này là một phần của tiện ích <code>")
output:insert(gadget)
output:insert("</code> ([")
output:insert(tostring(full_url("MediaWiki:Gadgets-definition", {action = "edit"})))
output:insert(" sửa định nghĩa])'' <dl>")
output:insert("<dd> ''Mô tả ([")
output:insert(tostring(full_url("MediaWiki:Gadget-" .. gadget, {action = "edit"})))
output:insert(" sửa])'': ")
output:insert(preprocess(new_message('Gadget-' .. gadget):plain()))
output:insert(" </dd>")
items:remove(i)
if #items > 0 then
for j, item in ipairs(items) do
items[j] = '[[MediaWiki:Gadget-' .. item .. '|' .. item .. ']]'
end
output:insert("<dd> ''Phần khác'': ")
output:insert(list_to_text(items))
output:insert("</dd>")
end
output:insert("</dl></dd>")
break
end
end
end
end
if not is_gadget then
output:insert("<dd> ''Tập lệnh này không phải là một phần của bất kỳ [")
output:insert(tostring(full_url("Special:Gadgets", {uselang = "en"})))
output:insert(' tiện ích] nào ([')
output:insert(tostring(full_url("MediaWiki:Gadgets-definition", {action = "edit"})))
output:insert(' sửa định nghĩa]).</dd>')
-- else
-- cats:insert("Wiktionary gadgets")
end
end
if old_doc_title then
output:insert("<dd> ''Đổi hướng từ'' [")
output:insert(old_doc_title:fullUrl{redirect = "no"})
output:insert(" ")
output:insert(old_doc_title.fullText)
output:insert("] ([")
output:insert(old_doc_title:fullUrl{action = "edit"})
output:insert(" sửa]).</dd>\n")
end
if not args.nolinks then
local links = Array()
if title.isSubpage and not args.notsubpage then
links:insert("[[:" .. title.nsText .. ":" .. title.rootText .. "|trang gốc]]")
links:insert("[[Special:PrefixIndex/" .. title.nsText .. ":" .. title.rootText .. "/|trang con của trang gốc]]")
else
links:insert("[[Special:PrefixIndex/" .. title.fullText .. "/|danh sách trang con]]")
end
links:insert(
"[" .. tostring(full_url("Special:WhatLinksHere/" .. title.fullText, {hidetrans = true, hideredirs = true})) .. " liên kết]")
if contentModel ~= "Scribunto" then
links:insert(
"[" .. tostring(full_url("Special:WhatLinksHere/" .. title.fullText, {hidelinks = true, hidetrans = true})) .. " đổi hướng]")
end
if is_script_or_stylesheet then
if user_name then
links:insert("[[Special:MyPage" .. title.text:sub(#title.rootText + 1) .. "|của bạn]]")
end
else
links:insert(
"[" .. tostring(full_url("Special:WhatLinksHere/" .. title.fullText, {hidelinks = true, hideredirs = true})) .. " nhúng]")
end
if contentModel == "Scribunto" then
local is_testcases = title.isSubpage and title.subpageText == "testcases"
local without_subpage = title.nsText .. ":" .. title.baseText
if is_testcases then
links:insert("[[:" .. without_subpage .. "|trường hợp mô đun đã kiểm thử]]")
else
links:insert("[[" .. without_subpage .. "/testcases|trường hợp kiểm thử]]")
end
if user_name then
links:insert("[[User:" .. user_name .. "|trang thành viên]]")
links:insert("[[User talk:" .. user_name .. "|trang thảo luận thành viên]]")
links:insert("[[Special:PrefixIndex/User:" .. user_name .. "/|không gian thành viên]]")
-- If sandbox module, add a link to the module that this is a sandbox of.
-- Exclude user sandbox modules like [[User:Dine2016/sandbox]].
elseif title.text:find("/sandbox%d*%f[/%z]") then
cats:insert("Chỗ thử mô đun")
-- Sandbox modules don’t really need documentation.
needs_doc = false
-- Don't track user sandbox modules.
local text_title = new_title(title.text)
if not (text_title and text_title.namespace == 2) then
track("sandbox to be moved")
local sandbox_of, diff = title.baseText
if title_exists(sandbox_of) then
else
track("no sandbox of")
end
end
-- If not a sandbox module, add link to sandbox module.
-- Sometimes there are multiple sandboxes for a single module:
-- [[Module:sa-pronunc/sandbox]], [[Module:sa-pronunc/sandbox2]].
-- Occasionally sandbox modules have their own subpages that are also
-- sandboxes: [[Module:grc-decl/sandbox/decl]].
else
local sandbox_title
if title.rootText == "grc-decl" then
sandbox_title = string_insert(title.fullText, 16, "/sandbox")
elseif is_testcases then
sandbox_title = title.fullText:gsub("/testcases", "/sandbox")
else
sandbox_title = title.fullText .. "/sandbox"
end
local sandbox_link = "[[:" .. sandbox_title .. "|chỗ thử]]"
local diff
if title_exists(sandbox_title) then
diff = " (" .. compare_pages(title.fullText, sandbox_title, "khác") .. ")"
end
links:insert(sandbox_link .. (diff or ""))
end
end
if title.nsText == "Bản_mẫu" then
-- Error search: all(any namespace), hastemplate (show pages using the template), insource (show source code), incategory (any/specific error) -- [[mw:Help:CirrusSearch]], [[w:Help:Searching/Regex]]
-- apparently same with/without: &profile=advanced&fulltext=1
local errorq = 'searchengineselect=mediawiki&search=all: hastemplate:\"'..title.rootText..'\" insource:\"'..title.rootText..'\" incategory:'
local eincategory = "Pages_with_module_errors|ParserFunction_errors|DisplayTitle_errors|Pages_with_ISBN_errors|Pages_with_ISSN_errors|Pages_with_reference_errors|Pages_with_syntax_highlighting_errors|Pages_with_TemplateStyles_errors"
links:insert(
'[' .. tostring(full_url('Special:Search', errorq..eincategory )) .. ' lỗi]'
.. ' (' ..
'[' .. tostring(full_url('Special:Search', errorq..'ParserFunction_errors' )) .. ' phân tích cú pháp]'
.. '/' ..
'[' .. tostring(full_url('Special:Search', errorq..'Pages_with_module_errors' )) .. ' mô đun]'
.. ')'
)
if title.isSubpage and title.text:find("/sandbox%d*%f[/%z]") then -- This is a sandbox template.
-- At the moment there are no user sandbox templates with subpage
-- “/sandbox”.
cats:insert("Chỗ thử bản mẫu")
-- Sandbox templates don’t really need documentation.
needs_doc = false
-- Will behave badly if “/sandbox” occurs twice in title!
local sandbox_of = title.fullText:gsub("/sandbox%d*%f[/%z]", "")
if title_exists(sandbox_of) then
else
track("no sandbox of")
end
-- This is a template that can have a sandbox.
elseif not args.nosandbox then -- unless we tell it not to
local sandbox_title = title.fullText .. "/sandbox"
local diff
if title_exists(sandbox_title) then
diff = " (" .. compare_pages(title.fullText, sandbox_title, "khác") .. ")"
end
links:insert("[[:" .. sandbox_title .. "|chỗ thử]]" .. (diff or ""))
end
end
if #links > 0 then
output:insert("<dd> ''Liên kết hữu ích'': " .. links:concat(" • ") .. "</dd>")
end
end
output:insert("</dl>\n")
-- Show error from [[Module:category tree/topic cat/data]] on its submodules'
-- documentation to, for instance, warn about duplicate labels.
if startswith(title.fullText, "Mô đun:category tree/topic/") then
local ok, err = pcall(require, "Mô dun:category tree/topic/data")
if not ok then
output:insert('<span class="error">' .. err .. '</span>\n\n')
end
end
if doc_title and doc_title.exists then
-- Override automatic documentation, if present.
doc_content = expand_template{ title = doc_title.fullText }
elseif not doc_content and fallback_docs then
doc_content = expand_template{
title = fallback_docs,
args = {
['user'] = user_name,
['page'] = title.fullText,
['skin name'] = skin_name,
},
}
end
if doc_content then
output:insert(doc_content)
end
output:insert('\n<span style="clear: both;" />')
if cats_auto_generated and not cats[1] and (not doc_content or not doc_content:find("%[%[Category:")) then
if contentModel == "Scribunto" then
if not title.text:find("/testcases%d*%f[/%z]") then
cats:insert("Mô đun chưa phân loại")
end
-- elseif title.nsText == "Bản mẫu" then
-- cats:insert("Uncategorized templates")
end
end
if needs_doc then
if not title.text:find("/testcases%d*%f[/%z]") then
cats:insert("Bản mẫu và mô đun chưa có tài liệu")
end
end
for _, cat in ipairs(cats) do
output:insert("[[Category:" .. cat .. "]]")
end
output:insert("</div>\n")
return output:concat()
end
function export.module_auto_doc_table()
local parts = {}
local function ins(text)
insert(parts, text)
end
ins('{|class="wikitable"')
ins("! Regex !! Thể loại !! Mô đun xử lý")
for _, spec in ipairs(module_regex) do
local cat_text
local cats = spec.cat
if cats then
local cat_parts = {}
if type(cats) == "string" then
cats = {cats}
end
for _, cat in ipairs(cats) do
insert(cat_parts, ("<code>%s</code>"):format((cat:gsub("|", "|"))))
end
cat_text = concat(cat_parts, ", ")
else
cat_text = "''(không được chỉ định)''"
end
ins("|-")
ins(("| <code>%s</code> || %s || %s"):format(spec.regex, cat_text,
is_callable(spec.process) and "''(xử lý nội bộ)''" or
type(spec.process) == "string" and ("[[Module:documentation2/functions/%s]]"):format(spec.process) or
"''(không có trình tạo tài liệu)''"))
end
ins("|}")
return concat(parts, "\n")
end
-- Used by {{translit module documentation}}.
function export.translitModuleLangList(frame)
local pagename, subpage
if frame.args[1] then
pagename = frame.args[1]
else
local title = get_current_title()
subpage = title.subpageText
pagename = title.text
if subpage ~= pagename then
pagename = title.rootText
end
end
local translitModule = pagename
local languageObjects = require("Module:languages/byTranslitModule")(translitModule)
local codeInPagename = pagename:match("^([%l-]+)%-.*translit$")
local categories = Array()
local codeInPagenameInList = false
if codeInPagename then
if languageObjects[1] and subpage ~= "tài liệu" then
local agreement = languageObjects[2] and "" or ""
categories:insert("[[Thể loại:Mô đun chuyển tự được sử dụng bởi " ..
#languageObjects .. " ngôn ngữ" .. agreement .. "]]")
end
languageObjects = Array(languageObjects)
:filter(
function (lang)
local result = lang:getCode() ~= codeInPagename
codeInPagenameInList = codeInPagenameInList or result
return result
end)
end
if subpage ~= "tài liệu" then
for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do
local script = get_script(script_code)
if script then
categories:insert("[[Category:" .. script:getCategoryName() .. "]]")
end
end
end
if subpage ~= "tài liệu" and not title_exists("Mô_đun:" .. pagename .. "/testcases") then
categories:insert("[[Thể loại:Mô đun chuyển tự không có trang con trường hợp kiểm thử]]")
end
if not languageObjects[1] then
return categories:concat()
end
local langs = Array(languageObjects)
:sort(
function(lang1, lang2)
return lang1:getCode() < lang2:getCode()
end)
-- This will not error because languageObjects is not empty.
:map(languageObjects[1].makeCategoryLink)
:serialCommaJoin()
return "Nó " .. ( codeInPagenameInList and "cũng" or "" ) ..
" được sử dụng để phiên âm " .. langs .. "." .. categories:concat()
end
-- Used by {{entry name module documentation}}.
function export.entryNameModuleLangList(frame)
local pagename, subpage
if frame.args[1] then
pagename = frame.args[1]
else
local title = get_current_title()
subpage = title.subpageText
pagename = title.text
if subpage ~= pagename then
pagename = title.rootText
end
end
local entryNameModule = pagename
local languageObjects = require("Mô_đun:languages/byEntryNameModule")(entryNameModule)
local codeInPagename = pagename:match("^([%l-]+)%-.*entryname$")
local categories = Array()
local codeInPagenameInList = false
if codeInPagename then
if languageObjects[1] and subpage ~= "tài liệu" then
local agreement = languageObjects[2] and "s" or ""
categories:insert("[[Category:Mô đun tạo mục từ được sử dụng bởi " ..
#languageObjects .. " ngôn ngữ" .. agreement .. "]]")
end
languageObjects = Array(languageObjects)
:filter(
function (lang)
local result = lang:getCode() ~= codeInPagename
codeInPagenameInList = codeInPagenameInList or result
return result
end)
end
if subpage ~= "tài liệu" then
for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do
local script = get_script(script_code)
if script then
categories:insert("[[Category:" .. script:getCategoryName() .. "]]")
end
end
end
if subpage ~= "tài liệu" and not title_exists("Mô_đun:" .. pagename .. "/testcases") then
categories:insert("[[Category:Mô đun tạo tên mục từ không có trang con trường hợp kiểm thử]]")
end
if not languageObjects[1] then
return categories:concat()
end
local langs = Array(languageObjects)
:sort(
function(lang1, lang2)
return lang1:getCode() < lang2:getCode()
end)
-- This will not error because languageObjects is not empty.
:map(languageObjects[1].makeCategoryLink)
:serialCommaJoin()
return "Nó " .. ( codeInPagenameInList and "cũng" or "" ) ..
" được sử dụng để tạo tên mục từ cho " .. langs .. "." .. categories:concat()
end
-- Used by {{sortkey module documentation}}.
function export.sortkeyModuleLangList(frame)
local pagename, subpage
if frame.args[1] then
pagename = frame.args[1]
else
local title = get_current_title()
subpage = title.subpageText
pagename = title.text
if subpage ~= pagename then
pagename = title.rootText
end
end
local sortkeyModule = pagename
local languageObjects = require("Mô_đun:languages/bySortkeyModule")(sortkeyModule)
local codeInPagename = pagename:match("^([%l-]+)%-.*sortkey$")
local categories = Array()
local codeInPagenameInList = false
if codeInPagename then
if languageObjects[1] and subpage ~= "tài liệu" then
local agreement = languageObjects[2] and "s" or ""
categories:insert("[[Category:Mô đun tạo Sortkey được sử dụng bởi " ..
#languageObjects .. " ngôn ngữ" .. agreement .. "]]")
end
languageObjects = Array(languageObjects)
:filter(
function (lang)
local result = lang:getCode() ~= codeInPagename
codeInPagenameInList = codeInPagenameInList or result
return result
end)
end
if subpage ~= "tài liệu" then
for script_code in pagename:gmatch("%f[^-%z]%u%l%l%l%f[-]") do
local script = get_script(script_code)
if script then
categories:insert("[[Category:" .. script:getCategoryName() .. "]]")
end
end
end
if subpage ~= "tài liệu" and not title_exists("Mô_đun:" .. pagename .. "/testcases") then
categories:insert("[[Category:Mô đun tạo Sortkey không có trang con trường hợp kiểm thử]]")
end
if not languageObjects[1] then
return categories:concat()
end
local langs = Array(languageObjects)
:sort(
function(lang1, lang2)
return lang1:getCode() < lang2:getCode()
end)
-- This will not error because languageObjects is not empty.
:map(languageObjects[1].makeCategoryLink)
:serialCommaJoin()
return "Nó " .. ( codeInPagenameInList and "cũng" or "" ) ..
" được sử dụng để sắp xếp " .. langs .. "." .. categories:concat()
end
return export
rywrwkjnun1w4f0rpte7dht4ef6ibge
Thể loại:Chữ cái tiếng Udihe
14
305002
2348949
2159819
2026-04-27T15:59:28Z
WhoAlone
40420
2348949
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
cogdor
0
305181
2348876
2160201
2026-04-27T12:51:21Z
Hiyuune
50834
2348876
wikitext
text/x-wiki
=={{langname|yuy}}==
==={{section|alt}}===
* {{l|yuy|cügdur}}
==={{section|etym}}===
{{inh+|yuy|xgn-pro|*öčügedür}}.
==={{section|n}}===
{{head|yuy|Danh từ}}
# [[hôm qua|Hôm qua]].
6nbbycbvdgi5u8rlw4opq25dygcfelp
Thể loại:Danh từ tiếng Teressa
14
307189
2348985
2168183
2026-04-27T16:28:52Z
WhoAlone
40420
2348985
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Số tiếng Teressa
14
325651
2348982
2203907
2026-04-27T16:27:32Z
WhoAlone
40420
2348982
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Động từ tiếng Teressa
14
327135
2348987
2208382
2026-04-27T16:29:44Z
WhoAlone
40420
2348987
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Đại từ tiếng Teressa
14
332325
2348986
2217115
2026-04-27T16:29:24Z
WhoAlone
40420
2348986
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ tiếng Nicobar nguyên thủy
14
340134
2348976
2251499
2026-04-27T16:23:50Z
WhoAlone
40420
Thay cả nội dung bằng “{{auto cat}}”
2348976
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Bản mẫu tiếng Lyngngam
14
342105
2348937
2233649
2026-04-27T15:49:09Z
WhoAlone
40420
2348937
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Mô đun:category tree/topic/Nature
828
343314
2348939
2320970
2026-04-27T15:51:21Z
Hiyuune
50834
2348939
Scribunto
text/plain
local labels = {}
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
labels["Tự nhiên"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Tất cả chủ đề"},
wpcat = true,
}
labels["Môi trường"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Tự nhiên"},
wpcat = true,
}
labels["Acid"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất"},
}
labels["actinide series chemical elements"] = {
breadcrumb = "actinide series",
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for those chemical elements in the {{w|f-block}} of the [[periodic table]] with [[atomic number]]s from 89 to 103.",
parents = {"chemical elements", "Kim loại", "Phóng xạ"},
}
labels["air"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"atmosphere"},
}
labels["alkali metals"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for [[alkali metal]]s, chemical elements in [[w:Group (periodic table)|group]] 1 of the [[periodic table]], which all have one [[valence electron]].",
parents = {"chemical elements", "Kim loại"},
}
labels["alkaline earth metals"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for [[alkaline earth metal]]s, chemical elements in [[w:Group (periodic table)|group]] 2, which all have two [[valence electron]]s.",
parents = {"chemical elements", "Kim loại"},
}
labels["alkaloids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Hợp chất hữu cơ"},
}
labels["alloys"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Kim loại"},
}
labels["aluminium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"boron group elements"},
}
labels["amino acids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Acid carboxylic"},
}
labels["Âm thanh động vật"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Tiếng", "Tiếng kêu"},
}
labels["animal welfare"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "{{{langname}}} terms closely associated with [[animal welfare]].",
parents = {"ethics"},
}
labels["antimatter"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"matter"},
}
labels["antimony"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"pnictogens"},
}
labels["argon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"noble gases"},
}
labels["arsenic"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"pnictogens"},
}
labels["astatine"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"halogens"},
}
labels["asteroids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"celestial bodies"},
}
labels["khí quyển"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"tự nhiên"},
}
labels["hiện tượng khí quyển"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[hiện tượng]] [[khí quyển]]",
parents = {"khí quyển"},
}
labels["autumn"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"seasons"},
}
labels["barium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkaline earth metals"},
}
labels["baryons"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"hadrons"},
}
labels["beryllium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkaline earth metals"},
}
labels["birth"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"reproduction"},
}
labels["bismuth"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"pnictogens"},
}
labels["boron"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"boron group elements"},
}
labels["boron group elements"] = {
breadcrumb = "boron group",
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for chemical elements in [[w:Group (periodic table)|group]] 13 of the [[periodic table]], which all have three [[valence electron]]s.",
parents = {"chemical elements"},
}
labels["bosons"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"subatomic particles"},
}
labels["bromine"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"halogens"},
}
labels["cadmium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["calcium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkaline earth metals"},
}
labels["carbohydrates"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Hợp chất hữu cơ"},
}
labels["carbon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"carbon group elements"},
}
labels["carbon group elements"] = {
breadcrumb = "carbon group",
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for chemical elements in [[w:Group (periodic table)|group]] 14 of the [[periodic table]], which all have four [[valence electron]]s.",
parents = {"chemical elements"},
}
labels["Acid carboxylic"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Acid", "Hợp chất hữu cơ"},
}
labels["Thiên thể"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for varous [[celestial body|celestial bodies]]; things found in outer space.",
parents = {"Không gian"},
}
labels["cerium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["cesium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkali metals"},
}
labels["chalcogens"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for chemical elements in [[w:Group (periodic table)|group]] 16 of the [[periodic table]], which all have 6 [[valence electron]]s.",
parents = {"chemical elements"},
}
labels["nguyên tố hóa học"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất"},
}
for period = 1, 7 do
local key = ("Nguyên tố chu kì %d"):format(period)
if not labels[key] then
labels[key] = {
type = "chủ đề thuộc nhóm tập hợp",
description = ("{{{langname}}} terms for [[chemical element]]s in period %d of the [[periodic table]]."):format(period),
parents = {"nguyên tố hóa học"},
}
end
end
labels["chemical isomers"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"matter", "physical chemistry", "shapes"},
}
labels["Quá trình hóa học"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[quá trình]] [[hóa học]]",
parents = {"Tự nhiên"},
}
labels["chlorine"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"halogens"},
}
labels["chromium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["classical planets"] = {
type = "name",
description = "{{{langname}}} names for the [[classical planet]]s of our Solar System.",
parents = {"celestial bodies"},
}
labels["climate change"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "=[[anthropogenic]] [[climate change]]",
parents = {"tự nhiên"},
}
labels["clouds"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"hiện tượng khí quyển"},
}
labels["coal"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"fossil fuels"},
}
labels["cobalt"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["coenzymes"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"enzymes"},
}
labels["Màu sắc"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Ánh sáng", "Thị giác"},
}
for _, color_etc in ipairs {
{"Màu đen"},
{"blue"},
{"brown"},
{"green"},
{"grey", "[[grey]] ([[gray]])"},
{"orange"},
{"pink"},
{"purple"},
{"red"},
{"white"},
{"yellow"},
} do
local color, desc = unpack(color_etc)
desc = desc or ("[[%s]]"):format(color)
labels[color] = {
type = "chủ đề thuộc nhóm tập hợp",
description = ("=shades of the [[color]] %s"):format(desc),
parents = {"Màu sắc"},
}
end
labels["Màu sắc of the rainbow"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[color]]s of the [[rainbow]]",
parents = {"Màu sắc"},
}
labels["Cháy"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Quá trình hóa học"},
}
labels["điểm la bàn"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[điểm]] [[la bàn]]",
parents = {"phương hướng", "định hướng"},
}
labels["copper"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["crystal"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"matter", "physical chemistry"},
}
labels["darkness"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Ánh sáng"},
}
labels["deuterium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"hydrogen", "two", "isotopes"}
}
labels["phương hướng"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"tự nhiên"},
}
labels["distance"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"tự nhiên"},
}
labels["Chất gây nghiện"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất", "Dược lý học"},
}
labels["dryness"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"liquids"},
}
labels["dwarf planets of the Solar System"] = {
type = "name",
description = "=[[dwarf planet]]s of our [[Solar System]]",
parents = {"celestial bodies"},
}
labels["Nhuộm"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất", "Sắc tố"},
}
labels["Năng lượng"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Tự nhiên"},
}
labels["enzymes"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"proteins", "catalysis"},
}
labels["europium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["explosives"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"matter", "weapons"},
}
labels["eye Màu sắc"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[color]]s that are mostly or exclusively used of [[eye]]s",
parents = {"Màu sắc", "eyes"},
}
labels["Acid béo"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Acid carboxylic"},
}
labels["fermions"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"subatomic particles"},
}
labels["fictional materials"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"science fiction", "materials"},
}
labels["Lửa"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Cháy", "Nguồn ánh sáng"},
wp = "Lửa",
}
labels["fluorine"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"halogens"},
}
labels["fog"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"weather", "water"},
}
labels["fossil fuels"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"carbon", "Năng lượng", "natural resources"},
}
labels["francium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkali metals"},
}
labels["gadolinium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["galaxies"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"celestial bodies"},
}
labels["gallium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"boron group elements"},
}
labels["gases"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"matter"},
}
labels["germanium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"carbon group elements"},
}
labels["gold"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["hadrons"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"subatomic particles"},
}
labels["hair Màu sắc"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[color]]s that are mostly or exclusively used of [[hair]]",
parents = {"Màu sắc", "hair"},
}
labels["halogens"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[chemical element]]s in [[w:Group (periodic table)|group]] 17 of the [[periodic table]], which all have 7 [[valence electron]]s",
parents = {"chemical elements"},
}
labels["helium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"noble gases"},
}
labels["heroin"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"recreational drugs"},
}
labels["height"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"distance"},
}
labels["horse Màu sắc"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[color]]s that are mostly or exclusively used of [[horse]]s",
parents = {"Màu sắc", "horses"},
}
labels["hydrogen"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"chemical elements"},
}
labels["hypothetical chemical elements"] = {
breadcrumb = "hypothetical",
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for types or instances of [[chemical element]]s which have been hypothesized to exist, but not (yet) discovered.",
parents = {"chemical elements", "fictional materials"},
}
labels["ice"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"water"},
}
labels["indium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"boron group elements"},
}
labels["Hợp chất vô cơ"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất"},
}
labels["iodine"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"halogens"},
}
labels["ions"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"matter", "chemistry", "electricity"},
}
labels["iridium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["iron"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["isotopes"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"chemical elements"},
}
labels["krypton"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"noble gases"},
}
labels["lanthanide series chemical elements"] = {
breadcrumb = "lanthanide series",
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[chemical element]]s in the {{w|f-block}} of the [[periodic table]] with [[atomic number]]s from 57 to 71",
parents = {"chemical elements"},
}
labels["lanthanum"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["lead"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"carbon group elements"},
}
labels["length"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"distance"},
}
labels["leptons"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"fermions"},
}
labels["Sự sống"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Tự nhiên"},
}
labels["Ánh sáng"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Năng lượng"},
}
labels["Nguồn ánh sáng"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Ánh sáng"},
}
labels["Tia sét"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"hiện tượng khí quyển", "weather", "electricity", "Nguồn ánh sáng"},
}
labels["Chất lỏng"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default", -- At what temperature?
parents = {"Vật chất"},
}
labels["lithium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkali metals"},
}
labels["magnesium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkaline earth metals"},
}
labels["manganese"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["Mars (planet)"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "=the planet [[Mars]]",
parents = {"planets of the Solar System"},
}
labels["marijuana"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"hemp family plants", "recreational drugs"},
}
labels["Vật chất"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "=physical [[matter]]",
parents = {"Tự nhiên", "Hóa học"},
}
labels["mercury (element)"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["mesons"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"hadrons"},
}
labels["metalloids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"chemical elements"},
}
labels["Kim loại"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất", "Luyện kim"},
}
labels["Khoáng chất"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất", "Khoáng vật học"},
}
labels["molybdenum"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["moon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "=the [[Moon]], Earth's only natural satellite",
parents = {"tự nhiên", "Ánh sáng", "celestial bodies", "moons"},
}
labels["moons"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"celestial bodies"},
}
for _, planet in ipairs {"Mars", "Haumea", "Jupiter", "Saturn", "Neptune", "Uranus", "Pluto"} do
labels["moons of " .. planet] = {
type = "name",
description = ("=[[moon]]s that orbit [[%s]]"):format(planet),
parents = {"moons"},
}
end
labels["natural products (Chemistry)"] = {
type = "name",
description = "=[[organic compound]]s produced by living [[organism]]s",
parents = {"Hợp chất hữu cơ"},
}
labels["natural resources"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"matter"},
}
labels["neodymium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["neon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"noble gases"},
}
labels["neurotoxins"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"poisons", "neuroscience"},
}
labels["nickel"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["niobium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["nitrogen"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"pnictogens"},
}
labels["noble gases"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[chemical element]]s in [[w:Group (periodic table)|group]] 18 of the [[periodic table]], which all have a full chủ đề thuộc nhóm tập hợp of [[valence electron]]s: 2 for helium and 8 for the others",
parents = {"chemical elements", "gases"},
}
labels["Hợp chất hữu cơ"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Vật chất"},
}
labels["osmium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["oxygen"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"chalcogens"},
}
labels["palladium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["petroleum"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"fossil fuels", "liquids"},
}
labels["pharmaceutical drugs"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} names for [[pharmaceutical#Adjective|pharmaceutical]] [[drug#Noun|drugs]].",
parents = {"drugs"},
}
labels["pharmaceutical effects"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} names for [[pharmaceutical#Adjective|pharmaceutical]] [[effect#Noun|effects]].",
parents = {"pharmacology"},
}
labels["phosphorus"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"pnictogens"},
}
labels["Sắc tố"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Màu sắc"},
}
labels["planetoids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"celestial bodies"},
}
labels["Hành tinh"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Thiên thể"},
}
labels["Hành tinh trong hệ Mặt Trời"] = {
type = "chủ đề thuộc nhóm tên gọi",
description = "=hành tinh trong hệ Mặt Trời",
parents = {"Hành tinh"},
}
labels["platinum"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["Pluto"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "=the dwarf planet [[Pluto]]",
parents = {"dwarf planets of the Solar System"},
}
labels["pnictogens"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "=[[chemical element]]s in [[w:Group (periodic table)|group]] 15 of the [[periodic table]], which all have 5 [[valence electron]]s",
parents = {"chemical elements"},
}
labels["poisons"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"matter"},
}
labels["potassium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkali metals"},
}
labels["praseodymium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["promethium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["quarks"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"fermions"},
}
labels["Bức xạ"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Năng lượng"},
}
labels["Phóng xạ"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Bức xạ", "Vật lý hạt nhân"},
}
labels["radium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkaline earth metals"},
}
labels["radon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"noble gases"},
}
labels["rain"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"weather", "water"},
}
labels["Chất hướng thần"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Chất gây nghiện"},
}
labels["rhodium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["rubidium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkali metals"},
}
labels["ruthenium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["salt"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Khoáng chất", "condiments"},
}
labels["samarium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"lanthanide series chemical elements"},
}
labels["scandium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["selenium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"chalcogens"},
}
labels["shadow"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"darkness"},
}
labels["silence"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"sound"},
}
labels["silicon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"carbon group elements"},
}
labels["silver"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["Kích thước"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Tự nhiên"},
}
labels["snow"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"weather", "water"},
}
labels["sodium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkali metals"},
}
labels["Âm thanh"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Năng lượng"},
wpcat = true,
}
labels["Tiếng"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Âm thanh"},
}
labels["Không gian"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Tự nhiên"},
wpcat = true,
}
labels["spring"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"seasons"},
}
labels["squarks"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"fermions"},
}
labels["Sao"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} names of individual [[star]]s, not including the [[Sun]].",
parents = {"Thiên thể"},
}
labels["steel"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"iron", "alloys"},
}
labels["steroids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Hợp chất hữu cơ"},
}
labels["strength"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"tự nhiên", "health"},
}
labels["strontium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"alkaline earth metals"},
}
labels["subatomic particles"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"matter", "particle physics"},
}
labels["sugar acids"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Acid carboxylic", "carbohydrates"},
}
labels["sugars"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"carbohydrates"},
}
labels["sulfur"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"chalcogens"},
}
labels["summer"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"seasons"},
}
labels["sun"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "=the [[Sun]]",
parents = {"tự nhiên", "Ánh sáng", "celestial bodies"},
}
labels["supposed chemical elements"] = {
breadcrumb = "supposed",
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for types or instances of [[chemical element]]s which were erroneously identified.",
parents = {"chemical elements", "obsolete scientific theories"},
}
labels["tantalum"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["technetium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["tellurium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"chalcogens"},
}
labels["temperature"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"tự nhiên", "weather"},
}
labels["teratogens"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"poisons"},
}
labels["thalium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"boron group elements"},
}
labels["thorium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"actinide series chemical elements"},
}
labels["tin"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"carbon group elements"},
}
labels["titanium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["tobacco"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"nightshades", "recreational drugs", "smoking"},
}
labels["transition metals"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "{{{langname}}} terms for [[chemical element]]s in [[w:Group (periodic table)|group]]s 3 to 12 of the [[periodic table]], which are also in the {{w|d-block}} of the [[periodic table]] ",
parents = {"chemical elements", "Kim loại"},
}
labels["tritium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"hydrogen", "three", "isotopes"},
}
labels["tungsten"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["types of planets"] = {
type = "type",
topic = "planets",
description = "=[[planet]]s",
parents = {"planets"},
}
labels["uranium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"actinide series chemical elements"},
}
labels["vanadium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["Tiếng kêu"] = {
type = "chủ đề thuộc nhóm tập hợp",
description = "default",
parents = {"Tiếng", "Giao tiếp"},
}
labels["Nước"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Chất lỏng"},
}
labels["waterfalls"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"water"},
}
labels["Thời tiết"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Khí quyển"},
}
labels["weight"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"tự nhiên"},
}
labels["wetlands"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"bodies of water", "ecosystems"},
}
labels["wetness"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"liquids"},
}
labels["wind"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"weather"},
}
labels["Mùa đông"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"Mùa"},
}
labels["xenon"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"noble gases"},
}
labels["yttrium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["zinc"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["zirconium"] = {
type = "chủ đề thuộc nhóm liên quan",
description = "default",
parents = {"transition metals"},
}
labels["exoplanets"] = {
type = "name",
description = "default",
parents = {"planets"},
}
return labels
oodmotms9yoqws2kgxlj848fswfrfhv
鐘
0
355016
2349010
2341419
2026-04-28T02:14:28Z
Hiyuune
50834
2349010
wikitext
text/x-wiki
{{also|鍾|钟|鈡}}
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=167|rad=金|as=12|sn=20|four=80114|canj=CYTG|ids=⿰釒童}}
===={{ĐM|drv}}====
* {{charlist|sc=Hani|𢺚}}
===={{ĐM|ref}}====
* {{Han ref|kx=1323.020|dkj=40902|dj=1822.180|hdz=64258.060|uh=9418|ud=37912|bh=C4C1|bd=50369}}
=={{langname|zh}}==
{{zh-forms|s=钟|alt=*鍾,銿,鈡}}
{{wp|zh:鐘姓}}
==={{ĐM|pron}}===
{{zh-pron
|m=zhōng
|m-s=zong1
|dg=җун1
|c=zung1
|c-t=zuung1
|g=zung1
|h=pfs=chûng;gd=zung1
|j=zung1
|mb=cé̤ng
|md=cṳ̆ng
|mn=cheng/chiong
|mn_note=cheng - ngôn ngữ bản địa; chiong - ngôn ngữ văn chương
|mn-t=zêng1
|w=sh:1tson
|x=zhong1
|mc=y
|oc=y
|cat=n
}}
==={{ĐM|dfn}}===
{{head|zh|Hán tự}}
# [[chuông|Chuông]]. {{zh-mw|架|座}}
#: {{zh-x|那 個 鐘 每 小時 響 一次。|Chiếc '''chuông''' đó reo mỗi giờ một lần.}}
# [[đồng hồ|Đồng hồ]]. {{zh-mw|架|座}}
#: {{zh-x|這 個 鐘 快 了,所以 我 把 它 校{jiào}準 了。|'''Đồng hồ''' chạy nhanh nên tôi đã chỉnh lại.}}
# [[thời gian|Thời gian]] đo bằng giờ và phút.
#: {{zh-x|點鐘|giờ tròn}}
#: {{zh-x|分鐘|phút}}
#: {{zh-x|秒鐘|giây}}
# {{label|zh|Cantonese}} [[giờ|Giờ]]; [[tiếng]]. {{zh-mw|個|粒|句}}
#: {{zh-co|一 個 '''鐘''' 零 十五 分鐘|một '''giờ''' mười lăm phút|C}}
#: {{zh-co|斷 鐘 計|được tính bằng '''giờ'''|C}}
# {{label|zh|Cantonese|nói chung}} Thời gian; [[thì giờ]].
#: {{zh-co|夠鐘|đã đến '''lúc'''|C}}
#: {{zh-co|揼{dam6}波鐘|câu '''giờ'''|C}}
# {{label|zh|Cantonese|colloquial}} (Khoảng thời gian hoặc thời lượng của) các [[dịch vụ]] [[tình dục]], như [[mại dâm]].
#: {{zh-co|彈鐘|từ chối gái mại dâm|C}}
#: {{zh-co|落鐘|(của dịch vụ tình dục) chấm dứt|C}}
# {{label|zh|historical}} Chuông {{gloss|nhạc cụ gõ dùng cho nghi lễ, làm bằng kim loại, được treo trên giá và đánh bằng [[vồ]]}}.
# {{alt form|zh|鍾|t=đơn vị [[dung lượng]]}}.
# {{surname|zh}}.
===={{ĐM|usage}}====
* Không nên nhầm lẫn hai họ khác nhau là {{zh-l|鐘}} và {{zh-l|鍾/锺}}.
===={{ĐM|syn}}====
{{zh-dial|小時}}
==={{ĐM|compound}}===
{{col3|zh|鎛鐘|香鐘|時鐘|鬧鐘|警鐘|編鐘|掛鐘|原子鐘|老爺鐘|分鐘|秒鐘|鐘點|鐘頭|鐘樓|鐘擺|鐘點工|掩耳盜鐘|鐘琴|鐘片琴|管鐘|鐘乳石|鐘鼎文|棋鐘|鐘虡|鐘簴|過鐘|彈鐘|買鐘|揼波鐘|試鐘|私鐘|出鐘|打鐘|旺鐘|齋鐘|A鐘}}
==={{ĐM|desc}}===
{{CJKV||しょう|종}}
''Khác''
* {{desctree|mkh-mvi|chuâng|bor=1}}
==={{ĐM|ref}}===
* {{R:yue:Hanzi}}
c65be3zkamnnxe4anvzlv14e2vmhe6b
2349011
2349010
2026-04-28T02:14:58Z
Hiyuune
50834
/* {{langname|zh}} */
2349011
wikitext
text/x-wiki
{{also|鍾|钟|鈡}}
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=167|rad=金|as=12|sn=20|four=80114|canj=CYTG|ids=⿰釒童}}
===={{ĐM|drv}}====
* {{charlist|sc=Hani|𢺚}}
===={{ĐM|ref}}====
* {{Han ref|kx=1323.020|dkj=40902|dj=1822.180|hdz=64258.060|uh=9418|ud=37912|bh=C4C1|bd=50369}}
=={{langname|zh}}==
{{zh-forms|s=钟|alt=*鍾,銿,鈡}}
{{wp|zh:鐘姓}}
==={{ĐM|glyph origin}}===
{{Han etym}}
{{Han compound|金|童|ls=psc|c1=s|c2=p}}.
==={{ĐM|pron}}===
{{zh-pron
|m=zhōng
|m-s=zong1
|dg=җун1
|c=zung1
|c-t=zuung1
|g=zung1
|h=pfs=chûng;gd=zung1
|j=zung1
|mb=cé̤ng
|md=cṳ̆ng
|mn=cheng/chiong
|mn_note=cheng - ngôn ngữ bản địa; chiong - ngôn ngữ văn chương
|mn-t=zêng1
|w=sh:1tson
|x=zhong1
|mc=y
|oc=y
|cat=n
}}
==={{ĐM|dfn}}===
{{head|zh|Hán tự}}
# [[chuông|Chuông]]. {{zh-mw|架|座}}
#: {{zh-x|那 個 鐘 每 小時 響 一次。|Chiếc '''chuông''' đó reo mỗi giờ một lần.}}
# [[đồng hồ|Đồng hồ]]. {{zh-mw|架|座}}
#: {{zh-x|這 個 鐘 快 了,所以 我 把 它 校{jiào}準 了。|'''Đồng hồ''' chạy nhanh nên tôi đã chỉnh lại.}}
# [[thời gian|Thời gian]] đo bằng giờ và phút.
#: {{zh-x|點鐘|giờ tròn}}
#: {{zh-x|分鐘|phút}}
#: {{zh-x|秒鐘|giây}}
# {{label|zh|Cantonese}} [[giờ|Giờ]]; [[tiếng]]. {{zh-mw|個|粒|句}}
#: {{zh-co|一 個 '''鐘''' 零 十五 分鐘|một '''giờ''' mười lăm phút|C}}
#: {{zh-co|斷 鐘 計|được tính bằng '''giờ'''|C}}
# {{label|zh|Cantonese|nói chung}} Thời gian; [[thì giờ]].
#: {{zh-co|夠鐘|đã đến '''lúc'''|C}}
#: {{zh-co|揼{dam6}波鐘|câu '''giờ'''|C}}
# {{label|zh|Cantonese|colloquial}} (Khoảng thời gian hoặc thời lượng của) các [[dịch vụ]] [[tình dục]], như [[mại dâm]].
#: {{zh-co|彈鐘|từ chối gái mại dâm|C}}
#: {{zh-co|落鐘|(của dịch vụ tình dục) chấm dứt|C}}
# {{label|zh|historical}} Chuông {{gloss|nhạc cụ gõ dùng cho nghi lễ, làm bằng kim loại, được treo trên giá và đánh bằng [[vồ]]}}.
# {{alt form|zh|鍾|t=đơn vị [[dung lượng]]}}.
# {{surname|zh}}.
===={{ĐM|usage}}====
* Không nên nhầm lẫn hai họ khác nhau là {{zh-l|鐘}} và {{zh-l|鍾/锺}}.
===={{ĐM|syn}}====
{{zh-dial|小時}}
==={{ĐM|compound}}===
{{col3|zh|鎛鐘|香鐘|時鐘|鬧鐘|警鐘|編鐘|掛鐘|原子鐘|老爺鐘|分鐘|秒鐘|鐘點|鐘頭|鐘樓|鐘擺|鐘點工|掩耳盜鐘|鐘琴|鐘片琴|管鐘|鐘乳石|鐘鼎文|棋鐘|鐘虡|鐘簴|過鐘|彈鐘|買鐘|揼波鐘|試鐘|私鐘|出鐘|打鐘|旺鐘|齋鐘|A鐘}}
==={{ĐM|desc}}===
{{CJKV||しょう|종}}
''Khác''
* {{desctree|mkh-mvi|chuâng|bor=1}}
==={{ĐM|ref}}===
* {{R:yue:Hanzi}}
j9wjzv1pvo6d6vlpk9qmg5l7ulkrq7t
Thể loại:vi:Địa danh của Đồng Nai, Việt Nam
14
356851
2348895
2261913
2026-04-27T14:30:17Z
Hiyuune
50834
Hiyuune đã đổi [[Thể loại:Địa danh của Đồng Nai, Việt Nam/Tiếng Việt]] thành [[Thể loại:vi:Địa danh của Đồng Nai, Việt Nam]]
2261913
wikitext
text/x-wiki
[[Thể loại:Đồng Nai, Việt Nam/Tiếng Việt]]
[[Thể loại:Địa danh của 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 Đồng Nai, Việt Nam|V]]
a28gz56tmvulngrlbzmbk60fc4ajvc7
2348897
2348895
2026-04-27T14:30:37Z
Hiyuune
50834
2348897
wikitext
text/x-wiki
[[Thể loại:vi:Đồng Nai, Việt Nam]]
[[Thể loại:vi:Địa danh của 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 Đồng Nai, Việt Nam|V]]
7enxmi09k5hvtpvhme7fik088op85gp
chian
0
394978
2348866
2348859
2026-04-27T12:29:28Z
Hiyuune
50834
/* Tiếng Mân Tuyền Chương */
2348866
wikitext
text/x-wiki
=={{langname|nan-hbl}}==
{{zh-see|戔|poj}}
=={{langname|ja}}==
==={{section|rom}}===
{{ja-romaji}}
# {{ja-romanization of|ちあん}}
liltx21jfiknix5lm5a02md1qrgkt6u
Mô đun:ny-derivations
828
394979
2348862
2348860
2026-04-27T11:59:29Z
TheHighFighter2
42988
2348862
Scribunto
text/plain
local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("ny")
local match = mw.ustring.match
local gsub = mw.ustring.gsub
PAGENAME = mw.loadData("Module:headword/data").pagename or ''
local export = {}
local classes = {
"appl",
"caus",
"conv",
"inten",
"neg",
"pass",
"recip",
"redup",
"refl",
"repet",
"stat",
}
local classes_names = {
appl = "Ưng ý",
caus = "Gây khiến",
conv = "Conversive",
inten = "Intensive",
neg = "Phủ định",
pass = "Bị động",
recip = "Tương hỗ",
redup = "Láy",
refl = "Phản chỉ",
repet = "Lặp",
stat = "Tĩnh trạng",
}
local function join_E_suffix(stem, suffix)
if match(stem, "[aiu][^aeiou]*$") then
return stem .. gsub(suffix, "E", "i")
elseif match(stem, "[oe][^aeiou]*$") then
return stem .. gsub(suffix, "E", "e")
else -- Default to an 'e'. Perhaps throw an error instead?
return stem .. gsub(suffix, "E", "e")
end
end
local function join_O_suffix(stem, suffix)
if match(stem, "[aiu][^aeiou]*$") then
return stem .. gsub(suffix, "O", "u")
elseif match(stem, "[oe][^aeiou]*$") then
return stem .. gsub(suffix, "O", "o")
else -- Default to an 'o'. Perhaps throw an error instead?
return stem .. gsub(suffix, "O", "o")
end
end
local auto_deriv = {}
auto_deriv.appl = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Era")
end
auto_deriv.caus = function(lemma)
if match(lemma, "ka$") then
return gsub(lemma, "ka$", "tsa")
else
return join_E_suffix(gsub(lemma, "a$", ""), "Etsa")
end
return lemma
end
auto_deriv.conv = function(lemma)
return join_O_suffix(gsub(lemma, "a$", ""), "Ola")
end
auto_deriv.inten = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Etsetsa")
end
auto_deriv.neg = function(lemma)
return "sa" .. lemma
end
auto_deriv.pass = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Edwa")
end
auto_deriv.recip = function(lemma)
return lemma .. "na"
end
auto_deriv.redup = function(lemma)
return lemma .. lemma
end
auto_deriv.refl = function(lemma)
return "dzi" .. lemma
end
auto_deriv.repet = function(lemma)
return lemma .. "nso"
end
auto_deriv.stat = function(lemma)
if match(lemma, "la$") then
return gsub(lemma, "la$", "ka")
else
return join_E_suffix(gsub(lemma, "a$", ""), "Eka")
end
return lemmma
end
local function pop_contains(arr, val)
for i, v in pairs(arr) do
if val == v then
table.remove(arr, i)
return true
end
end
return false
end
local function get_remaining(arr)
local out = {}
for _, v in ipairs(arr) do
table.insert(out, v)
end
return out
end
local function make_verb_row(lemma, code, autogen, forms, gloss)
if autogen and auto_deriv[code] then
local autoval = auto_deriv[code](lemma)
table.insert(forms, 1, autoval)
end
local row = {}
for i, term in pairs(forms) do
table.insert(row, m_links.full_link({ lang = lang, term = term, alt = '-' .. term, gloss = gloss[i] }))
end
return table.concat{"** ''", classes_names[code], "'': ", table.concat(row, ", ")}
end
local function make_other_verb_row(forms, gloss)
local row = {}
for i, term in pairs(forms) do
table.insert(row, m_links.full_link({ lang = lang, term = term, alt = '-' .. term, gloss = gloss[i] }))
end
table.sort(row)
return table.concat{"** ''Other formations'': ", table.concat(row, ", ")}
end
local function make_noun_row(term, gloss)
return table.concat{
"** ",
m_links.full_link({ lang = lang, term = term, gloss = gloss })
}
end
local function make_output(args)
local output = {}
local autogen = nil
local verb_output = {}
for _, code in ipairs(classes) do
autogen = pop_contains(args[1], code)
if autogen or #args[code] > 0 then
table.insert(verb_output, make_verb_row(args.lemma, code, autogen, args[code], args[code .. "-g"]))
end
end
if #args.vrb > 0 then
table.insert(verb_output, make_other_verb_row(args.vrb, args["vrb-g"]))
end
if #args[1] > 0 then
error('Unrecognized Chichewa derivation type(s) "' .. table.concat(get_remaining(args[1]), '", "') .. '".')
end
if #verb_output > 0 then
table.insert(verb_output, 1, "* '''[[Appendix:Chichewa verbal derivation|Verbal derivations]]''':")
table.insert(output, table.concat(verb_output, "\n"))
end
local noun_output = {}
for i, noun in pairs(args.nom) do
table.insert(noun_output, make_noun_row(noun, args["nom-g"][i]))
end
if #noun_output > 0 then
table.sort(noun_output)
table.insert(noun_output, 1, "* '''[[Appendix:Chichewa verbal derivation#Nouns|Nominal derivations]]''':")
table.insert(output, table.concat(noun_output, "\n"))
end
return table.concat(output, "\n\n")
end
function export.show(frame)
local params = {
--verbal derivatives
[1] = {list = true},
["appl"] = {list = true},
["appl-g"] = {list = true, allow_holes=true},
["caus"] = {list = true},
["caus-g"] = {list = true, allow_holes=true},
["conv"] = {list = true},
["conv-g"] = {list = true, allow_holes=true},
["inten"] = {list = true},
["inten-g"] = {list = true, allow_holes=true},
["neg"] = {list = true},
["neg-g"] = {list = true, allow_holes=true},
["pass"] = {list = true},
["pass-g"] = {list = true, allow_holes=true},
["recip"] = {list = true},
["recip-g"] = {list = true, allow_holes=true},
["redup"] = {list = true},
["redup-g"] = {list = true, allow_holes=true},
["refl"] = {list = true},
["refl-g"] = {list = true, allow_holes=true},
["repet"] = {list = true},
["repet-g"] = {list = true, allow_holes=true},
["stat"] = {list = true},
["stat-g"] = {list = true, allow_holes=true},
-- other verbal formations
["vrb"] = {list = true},
["vrb-g"] = {list = true, allow_holes=true},
-- nominal derivatives
["nom"] = {list = true},
["nom-g"] = {list = true, allow_holes=true},
-- other
["lemma"] = {default = PAGENAME},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
return make_output(args)
end
return export
7eggsegs4d3b54dvgh062eo67dcgq56
2348877
2348862
2026-04-27T13:00:51Z
TheHighFighter2
42988
2348877
Scribunto
text/plain
local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("ny")
local match = mw.ustring.match
local gsub = mw.ustring.gsub
PAGENAME = mw.loadData("Module:headword/data").pagename or ''
local export = {}
local classes = {
"appl",
"caus",
"conv",
"inten",
"neg",
"pass",
"recip",
"redup",
"refl",
"repet",
"stat",
}
local classes_names = {
appl = "Ưng ý",
caus = "Gây khiến",
conv = "Conversive",
inten = "Intensive",
neg = "Phủ định",
pass = "Bị động",
recip = "Tương hỗ",
redup = "Láy",
refl = "Phản chỉ",
repet = "Lặp",
stat = "Tĩnh trạng",
}
local function join_E_suffix(stem, suffix)
if match(stem, "[aiu][^aeiou]*$") then
return stem .. gsub(suffix, "E", "i")
elseif match(stem, "[oe][^aeiou]*$") then
return stem .. gsub(suffix, "E", "e")
else -- Default to an 'e'. Perhaps throw an error instead?
return stem .. gsub(suffix, "E", "e")
end
end
local function join_O_suffix(stem, suffix)
if match(stem, "[aiu][^aeiou]*$") then
return stem .. gsub(suffix, "O", "u")
elseif match(stem, "[oe][^aeiou]*$") then
return stem .. gsub(suffix, "O", "o")
else -- Default to an 'o'. Perhaps throw an error instead?
return stem .. gsub(suffix, "O", "o")
end
end
local auto_deriv = {}
auto_deriv.appl = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Era")
end
auto_deriv.caus = function(lemma)
if match(lemma, "ka$") then
return gsub(lemma, "ka$", "tsa")
else
return join_E_suffix(gsub(lemma, "a$", ""), "Etsa")
end
return lemma
end
auto_deriv.conv = function(lemma)
return join_O_suffix(gsub(lemma, "a$", ""), "Ola")
end
auto_deriv.inten = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Etsetsa")
end
auto_deriv.neg = function(lemma)
return "sa" .. lemma
end
auto_deriv.pass = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Edwa")
end
auto_deriv.recip = function(lemma)
return lemma .. "na"
end
auto_deriv.redup = function(lemma)
return lemma .. lemma
end
auto_deriv.refl = function(lemma)
return "dzi" .. lemma
end
auto_deriv.repet = function(lemma)
return lemma .. "nso"
end
auto_deriv.stat = function(lemma)
if match(lemma, "la$") then
return gsub(lemma, "la$", "ka")
else
return join_E_suffix(gsub(lemma, "a$", ""), "Eka")
end
return lemmma
end
local function pop_contains(arr, val)
for i, v in pairs(arr) do
if val == v then
table.remove(arr, i)
return true
end
end
return false
end
local function get_remaining(arr)
local out = {}
for _, v in ipairs(arr) do
table.insert(out, v)
end
return out
end
local function make_verb_row(lemma, code, autogen, forms, gloss)
if autogen and auto_deriv[code] then
local autoval = auto_deriv[code](lemma)
table.insert(forms, 1, autoval)
end
local row = {}
for i, term in pairs(forms) do
table.insert(row, m_links.full_link({ lang = lang, term = term, alt = '-' .. term, gloss = gloss[i] }))
end
return table.concat{"** ''", classes_names[code], "'': ", table.concat(row, ", ")}
end
local function make_other_verb_row(forms, gloss)
local row = {}
for i, term in pairs(forms) do
table.insert(row, m_links.full_link({ lang = lang, term = term, alt = '-' .. term, gloss = gloss[i] }))
end
table.sort(row)
return table.concat{"** ''Other formations'': ", table.concat(row, ", ")}
end
local function make_noun_row(term, gloss)
return table.concat{
"** ",
m_links.full_link({ lang = lang, term = term, gloss = gloss })
}
end
local function make_output(args)
local output = {}
local autogen = nil
local verb_output = {}
for _, code in ipairs(classes) do
autogen = pop_contains(args[1], code)
if autogen or #args[code] > 0 then
table.insert(verb_output, make_verb_row(args.lemma, code, autogen, args[code], args[code .. "-g"]))
end
end
if #args.vrb > 0 then
table.insert(verb_output, make_other_verb_row(args.vrb, args["vrb-g"]))
end
if #args[1] > 0 then
error('Unrecognized Chichewa derivation type(s) "' .. table.concat(get_remaining(args[1]), '", "') .. '".')
end
if #verb_output > 0 then
table.insert(verb_output, 1, "* '''[[Phụ lục:Phái sinh động từ tiếng Chichewa|Phái sinh động từ]]''':")
table.insert(output, table.concat(verb_output, "\n"))
end
local noun_output = {}
for i, noun in pairs(args.nom) do
table.insert(noun_output, make_noun_row(noun, args["nom-g"][i]))
end
if #noun_output > 0 then
table.sort(noun_output)
table.insert(noun_output, 1, "* '''[[Phụ lục:Phái sinh động từ tiếng Chichewa#Danh từ|Phái sinh danh từ]]''':")
table.insert(output, table.concat(noun_output, "\n"))
end
return table.concat(output, "\n\n")
end
function export.show(frame)
local params = {
--verbal derivatives
[1] = {list = true},
["appl"] = {list = true},
["appl-g"] = {list = true, allow_holes=true},
["caus"] = {list = true},
["caus-g"] = {list = true, allow_holes=true},
["conv"] = {list = true},
["conv-g"] = {list = true, allow_holes=true},
["inten"] = {list = true},
["inten-g"] = {list = true, allow_holes=true},
["neg"] = {list = true},
["neg-g"] = {list = true, allow_holes=true},
["pass"] = {list = true},
["pass-g"] = {list = true, allow_holes=true},
["recip"] = {list = true},
["recip-g"] = {list = true, allow_holes=true},
["redup"] = {list = true},
["redup-g"] = {list = true, allow_holes=true},
["refl"] = {list = true},
["refl-g"] = {list = true, allow_holes=true},
["repet"] = {list = true},
["repet-g"] = {list = true, allow_holes=true},
["stat"] = {list = true},
["stat-g"] = {list = true, allow_holes=true},
-- other verbal formations
["vrb"] = {list = true},
["vrb-g"] = {list = true, allow_holes=true},
-- nominal derivatives
["nom"] = {list = true},
["nom-g"] = {list = true, allow_holes=true},
-- other
["lemma"] = {default = PAGENAME},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
return make_output(args)
end
return export
rypn6e7sv2i1vg7aqsduz61teixdm8k
2348907
2348877
2026-04-27T14:50:57Z
TheHighFighter2
42988
2348907
Scribunto
text/plain
local m_links = require("Module:links")
local lang = require("Module:languages").getByCode("ny")
local match = mw.ustring.match
local gsub = mw.ustring.gsub
PAGENAME = mw.loadData("Module:headword/data").pagename or ''
local export = {}
local classes = {
"appl",
"caus",
"conv",
"inten",
"neg",
"pass",
"recip",
"redup",
"refl",
"repet",
"stat",
}
local classes_names = {
appl = "Ưng ý",
caus = "Gây khiến",
conv = "Conversive",
inten = "Intensive",
neg = "Phủ định",
pass = "Bị động",
recip = "Tương hỗ",
redup = "Láy",
refl = "Phản chỉ",
repet = "Lặp",
stat = "Tĩnh trạng",
}
local function join_E_suffix(stem, suffix)
if match(stem, "[aiu][^aeiou]*$") then
return stem .. gsub(suffix, "E", "i")
elseif match(stem, "[oe][^aeiou]*$") then
return stem .. gsub(suffix, "E", "e")
else -- Default to an 'e'. Perhaps throw an error instead?
return stem .. gsub(suffix, "E", "e")
end
end
local function join_O_suffix(stem, suffix)
if match(stem, "[aiu][^aeiou]*$") then
return stem .. gsub(suffix, "O", "u")
elseif match(stem, "[oe][^aeiou]*$") then
return stem .. gsub(suffix, "O", "o")
else -- Default to an 'o'. Perhaps throw an error instead?
return stem .. gsub(suffix, "O", "o")
end
end
local auto_deriv = {}
auto_deriv.appl = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Era")
end
auto_deriv.caus = function(lemma)
if match(lemma, "ka$") then
return gsub(lemma, "ka$", "tsa")
else
return join_E_suffix(gsub(lemma, "a$", ""), "Etsa")
end
return lemma
end
auto_deriv.conv = function(lemma)
return join_O_suffix(gsub(lemma, "a$", ""), "Ola")
end
auto_deriv.inten = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Etsetsa")
end
auto_deriv.neg = function(lemma)
return "sa" .. lemma
end
auto_deriv.pass = function(lemma)
return join_E_suffix(gsub(lemma, "a$", ""), "Edwa")
end
auto_deriv.recip = function(lemma)
return lemma .. "na"
end
auto_deriv.redup = function(lemma)
return lemma .. lemma
end
auto_deriv.refl = function(lemma)
return "dzi" .. lemma
end
auto_deriv.repet = function(lemma)
return lemma .. "nso"
end
auto_deriv.stat = function(lemma)
if match(lemma, "la$") then
return gsub(lemma, "la$", "ka")
else
return join_E_suffix(gsub(lemma, "a$", ""), "Eka")
end
return lemmma
end
local function pop_contains(arr, val)
for i, v in pairs(arr) do
if val == v then
table.remove(arr, i)
return true
end
end
return false
end
local function get_remaining(arr)
local out = {}
for _, v in ipairs(arr) do
table.insert(out, v)
end
return out
end
local function make_verb_row(lemma, code, autogen, forms, gloss)
if autogen and auto_deriv[code] then
local autoval = auto_deriv[code](lemma)
table.insert(forms, 1, autoval)
end
local row = {}
for i, term in pairs(forms) do
table.insert(row, m_links.full_link({ lang = lang, term = term, alt = '-' .. term, gloss = gloss[i] }))
end
return table.concat{"** ''", classes_names[code], "'': ", table.concat(row, ", ")}
end
local function make_other_verb_row(forms, gloss)
local row = {}
for i, term in pairs(forms) do
table.insert(row, m_links.full_link({ lang = lang, term = term, alt = '-' .. term, gloss = gloss[i] }))
end
table.sort(row)
return table.concat{"** ''Sự hình thành khác'': ", table.concat(row, ", ")}
end
local function make_noun_row(term, gloss)
return table.concat{
"** ",
m_links.full_link({ lang = lang, term = term, gloss = gloss })
}
end
local function make_output(args)
local output = {}
local autogen = nil
local verb_output = {}
for _, code in ipairs(classes) do
autogen = pop_contains(args[1], code)
if autogen or #args[code] > 0 then
table.insert(verb_output, make_verb_row(args.lemma, code, autogen, args[code], args[code .. "-g"]))
end
end
if #args.vrb > 0 then
table.insert(verb_output, make_other_verb_row(args.vrb, args["vrb-g"]))
end
if #args[1] > 0 then
error('Unrecognized Chichewa derivation type(s) "' .. table.concat(get_remaining(args[1]), '", "') .. '".')
end
if #verb_output > 0 then
table.insert(verb_output, 1, "* '''[[Phụ lục:Phái sinh động từ tiếng Chichewa|Phái sinh động từ]]''':")
table.insert(output, table.concat(verb_output, "\n"))
end
local noun_output = {}
for i, noun in pairs(args.nom) do
table.insert(noun_output, make_noun_row(noun, args["nom-g"][i]))
end
if #noun_output > 0 then
table.sort(noun_output)
table.insert(noun_output, 1, "* '''[[Phụ lục:Phái sinh động từ tiếng Chichewa#Danh từ|Phái sinh danh từ]]''':")
table.insert(output, table.concat(noun_output, "\n"))
end
return table.concat(output, "\n\n")
end
function export.show(frame)
local params = {
--verbal derivatives
[1] = {list = true},
["appl"] = {list = true},
["appl-g"] = {list = true, allow_holes=true},
["caus"] = {list = true},
["caus-g"] = {list = true, allow_holes=true},
["conv"] = {list = true},
["conv-g"] = {list = true, allow_holes=true},
["inten"] = {list = true},
["inten-g"] = {list = true, allow_holes=true},
["neg"] = {list = true},
["neg-g"] = {list = true, allow_holes=true},
["pass"] = {list = true},
["pass-g"] = {list = true, allow_holes=true},
["recip"] = {list = true},
["recip-g"] = {list = true, allow_holes=true},
["redup"] = {list = true},
["redup-g"] = {list = true, allow_holes=true},
["refl"] = {list = true},
["refl-g"] = {list = true, allow_holes=true},
["repet"] = {list = true},
["repet-g"] = {list = true, allow_holes=true},
["stat"] = {list = true},
["stat-g"] = {list = true, allow_holes=true},
-- other verbal formations
["vrb"] = {list = true},
["vrb-g"] = {list = true, allow_holes=true},
-- nominal derivatives
["nom"] = {list = true},
["nom-g"] = {list = true, allow_holes=true},
-- other
["lemma"] = {default = PAGENAME},
}
local args = require("Module:parameters").process(frame:getParent().args, params)
return make_output(args)
end
return export
nipksza9ejlbh6b888f93a59v902tl3
Bản mẫu:ny-verb
10
394981
2348863
2026-04-27T12:24:08Z
TheHighFighter2
42988
Trang mới: “<includeonly>{{head|ny|Động từ|nguyên mẫu|ku{{#invoke:ny|acute_on_first_vowel|{{{1|{{pagename}}}}}}}|head=-{{#if:{{{1|}}}|{{{1}}}|{{pagename}}<sup title="thiếu thanh điệu">?</sup>{{categorize|ny|Yêu cầu thanh điệu mục từ tiếng Chichewa}}}}}}</includeonly><!-- --><noinclude>{{tcat|hw}}{{documentation}}</noinclude>”
2348863
wikitext
text/x-wiki
<includeonly>{{head|ny|Động từ|nguyên mẫu|ku{{#invoke:ny|acute_on_first_vowel|{{{1|{{pagename}}}}}}}|head=-{{#if:{{{1|}}}|{{{1}}}|{{pagename}}<sup title="thiếu thanh điệu">?</sup>{{categorize|ny|Yêu cầu thanh điệu mục từ tiếng Chichewa}}}}}}</includeonly><!--
--><noinclude>{{tcat|hw}}{{documentation}}</noinclude>
mm7o3brluv8fygl39l3bves87a79rhx
ⵣ
0
394982
2348865
2026-04-27T12:29:16Z
Lcsnes
40261
Trang mới: “{{-Tfng-}} {{character info}} ==={{ĐM|pron}}=== *{{sense|tên chữ cái}} {{IPA4|mul|/jaz/}} *{{sense|âm vị}} {{IPA4|mul|/z/}} ==={{ĐM|letter}}=== {{head|mul|Chữ cái|tr=z}} #{{n-g|Chữ cái thứ 32 trong bảng chữ cái Tân Tifinagh, gọi là chữ ''yaz''}} =={{langname|mul}}== ==={{ĐM|symbol}}=== [[Tập tin:Berber flag.svg|nhỏ|phải|Tộc kỳ, biểu tượng của {{w|người Berber}}]] {{head|mul|Ký tự}} #Biểu tượng nhận dạng Amazigh…”
2348865
wikitext
text/x-wiki
{{-Tfng-}}
{{character info}}
==={{ĐM|pron}}===
*{{sense|tên chữ cái}} {{IPA4|mul|/jaz/}}
*{{sense|âm vị}} {{IPA4|mul|/z/}}
==={{ĐM|letter}}===
{{head|mul|Chữ cái|tr=z}}
#{{n-g|Chữ cái thứ 32 trong bảng chữ cái Tân Tifinagh, gọi là chữ ''yaz''}}
=={{langname|mul}}==
==={{ĐM|symbol}}===
[[Tập tin:Berber flag.svg|nhỏ|phải|Tộc kỳ, biểu tượng của {{w|người Berber}}]]
{{head|mul|Ký tự}}
#Biểu tượng nhận dạng Amazigh của chủ nghĩa Berber.
=={{langname|auj}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|auj|Z}} {{l|auj|z}}
|-
! Ả Rập
| {{l|auj|ز}}
|-
! Tifinagh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|auj|/z/}}
==={{ĐM|letter}}===
{{head|auj|Chữ cái|tr=z}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Awjila.
#:{{ux|auj|ⴳⴻ'''ⵣⵣ'''ⴻⵍ|tr=gə́'''zz'''əl|[[ngắn]]|inline=1}}
=={{langname|mzb}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Ả Rập
| {{l|mzb|ز}}
|-
! Tifinagh
| {{pn}}
|-
! Latinh
| {{l|mzb|Z}} {{l|mzb|z}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|mzb|/z/}}
==={{ĐM|letter}}===
{{head|mzb|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Berber Bắc Sahara.
#:{{ux|mzb|'''ⵣ'''ⴰⵔ|tr='''z'''ar|[[vượt]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích sách|fr|page=[https://archive.org/details/dictmozabitefrancais/page/380 380]|title=Dictionnaire Mozabite-Français|author=Ahmed Nouh-Mefnoune & Brahim Abdessalam|year=2011|publisher=ENAG}}
=={{langname|gha}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|gha|Z}} {{l|gha|z}}
|-
! Tifinagh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|gha|/z/}}
==={{ĐM|letter}}===
{{head|gha|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Ghadames.
#:{{ux|gha|ⵉ'''ⵣ'''ⵉ|[[ruồi]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích sách|fr|url=https://www.temehu.com/imazighen/dictionaries/Amawals/Lanfry_Ghadames_Berber_Libya.pdf|title=Ghadamès|author=J. Lanfry|year=1968}}
=={{langname|gho}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Ả Rập
| {{l|gho|ز}}
|-
! Tifinagh
| {{pn}}
|-
! Latinh
| {{l|gho|Z}} {{l|gho|z}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|gho|/z/}}
==={{ĐM|letter}}===
{{head|gho|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Ghomara.
#:{{ux|gho|'''ⵣ'''ⵏⴻ'''ⵣ'''|[[bán]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích sách|en|url=https://www.temehu.com/imazighen/dictionaries/Amawals/Ghomara_Berber_A_Brief_Grammatical_Survey_by_J_el_Hannouche.pdf|page=240|title=GHOMARA BERBER: A BRIEF GRAMMATICAL SURVEY|author=J. el Hannouche|year=2008}}
=={{langname|kab}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|kab|Z}} {{l|kab|z}}
|-
! Tifinagh
| {{pn}}
|-
! Ả Rập
| {{l|kab|ز}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|kab|[z]}}
==={{ĐM|letter}}===
{{head|kab|Chữ cái|tr=z}}
#Chữ cái thứ 32 trong bảng chữ cái Tifinagh tiếng Kabyle.
#:{{ux|kab|ⴰ'''ⵣⵣ'''ⴻⵍ|tr={{l|kab|a'''zz'''el}}|[[chạy]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=kab|sc=Tfng|qual=Bảng chữ cái Tifinagh tiếng Kabyle|ⴰ|ⴱ|ⵛ|ⵞ|ⴷ|ⴹ|ⴻ|ⵄ|ⴼ|ⴳ|ⴵ|ⵖ|ⵁ|ⵃ|ⵉ|ⵊ|ⴽ|ⵍ|ⵎ|ⵏ|ⵇ|ⵔⵍ|ⵕ|ⵕ|ⵙ|ⵚ|ⵜ|ⵟ|ⵓ|ⵡ|ⵅ|ⵢ|ⵣ|ⵥ}}
=={{langname|sjs}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|sjs|Z}} {{l|sjs|z}}
|-
! Ả Rập
| {{l|sjs|ز}}
|-
! Tifinagh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|sjs|/w/}}
==={{ĐM|letter}}===
{{head|sjs|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Senhaja De Srair.
#:{{ux|sjs|'''ⵣⵣ'''ⴻⵏ'''ⵣ'''|[[bán]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích web|en|author=Evgeniya Gutova & Jonathan Byler|work=Senhaja de Srair - English Dictionary|entry=z|year=2025|entryurl=https://www.webonary.org/senhaja/browse/browse-vernacular-english/?key=sjs-Latn&letter=z&lang=en|publisher=SIL Global®}}
=={{langname|siz}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Tifinagh
| {{pn}}
|-
! Ả Rập
| {{l|siz|ز}}
|-
! Latinh
| {{l|siz|Z}} {{l|siz|z}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|siz|/z/}}
==={{ĐM|letter}}===
{{head|siz|Chữ cái|tr=z}}
#Chữ cái thứ 31 trong bảng chữ cái Tifinagh tiếng Siwi.
#:{{ux|siz|ⴰⴳ'''ⵣ'''ⴰⵍ|tr={{l|siz|ag'''z'''al}}|[[ngắn]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=siz|sc=Tfng|qual=Bảng chữ cái Tifinagh tiếng Siwi|ⴰ|ⴱ|ⴳ|ⴷ|ⴶ|ⴹ|ⴻ|ⴼ|ⴽ|ⵀ|ⵃ|ⵄ|ⵅ|ⵇ|ⵉ|ⵍ|ⵎ|ⵏ|ⵓ|ⵔ|ⵕ|ⵖ|ⵙ|ⵚ|ⵛ|ⵜ|ⵞ|ⵟ|ⵡ|ⵢ|ⵣ|ⵥ}}
=={{langname|shy}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|shy|Z}} {{l|shy|z}}
|-
! Tifinagh
| {{pn}}
|-
! Ả Rập
| {{l|shy|ز}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|shy|/z/}}
==={{ĐM|letter}}===
{{head|shy|Chữ cái}}
#Chữ cái thứ 32 trong bảng chữ cái Tifinagh tiếng Tachawit.
#:{{ux|shy|ⴰⵎⴻ'''ⵣ'''ⵡⴰⵔⵓ|[[đầu tiên]]|inline=1}}
==={{ĐM|see}}===
*{{list helper 2|title=Bảng chữ cái Tifinagh tiếng Tachiwit|list={{l-self|shy|ⴰ|tr=-}}, {{l-self|shy|ⴱ|tr=-}}, {{l-self|shy|ⴳ|tr=-}}, {{l-self|shy|ⴳⵯ|tr=-}}, {{l-self|shy|ⴷ|tr=-}}, {{l-self|shy|ⴹ|tr=-}}, {{l-self|shy|ⴻ|tr=-}}, {{l-self|shy|ⴼ|tr=-}}, {{l-self|shy|ⴽ|tr=-}}, {{l-self|shy|ⴽⵯ|tr=-}}, {{l-self|shy|ⵀ|tr=-}}, {{l-self|shy|ⵃ|tr=-}}, {{l-self|shy|ⵄ|tr=-}}, {{l-self|shy|ⵅ|tr=-}}, {{l-self|shy|ⵇ|tr=-}}, {{l-self|shy|ⵉ|tr=-}}, {{l-self|shy|ⵊ|tr=-}}, {{l-self|shy|ⵍ|tr=-}}, {{l-self|shy|ⵎ|tr=-}}, {{l-self|shy|ⵏ|tr=-}}, {{l-self|shy|ⵓ|tr=-}}, {{l-self|shy|ⵔ|tr=-}}, {{l-self|shy|ⵕ|tr=-}}, {{l-self|shy|ⵖ|tr=-}}, {{l-self|shy|ⵙ|tr=-}}, {{l-self|shy|ⵚ|tr=-}}, {{l-self|shy|ⵛ|tr=-}}, {{l-self|shy|ⵜ|tr=-}}, {{l-self|shy|ⵟ|tr=-}}, {{l-self|shy|ⵡ|tr=-}}, {{l-self|shy|ⵢ|tr=-}}, {{l-self|shy|ⵣ|tr=-}}, {{l-self|shy|ⵥ|tr=-}}}}
=={{langname|tda}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Tifinagh
| {{pn}}
|-
! Latinh
| {{l|tda|Z}} {{l|tda|z}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|tda|/z/}}
==={{ĐM|letter}}===
{{head|tda|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Tagdal.
#:{{ux|tda|ⴰ'''ⵣ'''ⴻ'''ⵣ'''ⴻⵜ|[[yếu]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích sách|en|page=22|title=[https://www.sil.org/system/files/reapdata/36/64/80/36648029545421741991120945854668087601/silesr1999_008.pdf Northern Songhay languages in Mali and Niger]|author=Michael J. Rueck & Niels Christiansen|year=1999}}
=={{langname|zgh}}==
==={{ĐM|pron}}===
*{{IPA4|zgh|/z/}}
==={{ĐM|letter}}===
{{head|zgh|Chữ cái}}
#Chữ cái thứ 30 trong bảng chữ cái Tân Tifinagh.
#:{{ux|zgh|[[w:zgh:ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵎⴰⵣⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ ⵜⴰⵎⵖⵔⵉⴱⵉⵜ|ⵜⵓⵜⵍⴰⵢⵜ ⵜⴰⵎⴰ'''ⵣ'''ⵉⵖⵜ ⵜⴰⵏⴰⵡⴰⵢⵜ ⵜⴰⵎⵖⵔⵉⴱⵉⵜ]]|{{w|tiếng Tamazight Maroc chuẩn}}|inline=1}}
===={{ĐM|see}}====
*{{list helper 2|title=Bảng chữ cái Tân Tifinagh|list={{l-self|zgh|ⴰ|tr=-}}, {{l-self|zgh|ⴱ|tr=-}}, {{l-self|zgh|ⴳ|tr=-}}, {{l-self|zgh|ⴳⵯ|tr=-}}, {{l-self|zgh|ⴷ|tr=-}}, {{l-self|zgh|ⴹ|tr=-}}, {{l-self|zgh|ⴻ|tr=-}}, {{l-self|zgh|ⴼ|tr=-}}, {{l-self|zgh|ⴽ|tr=-}}, {{l-self|zgh|ⴽⵯ|tr=-}}, {{l-self|zgh|ⵀ|tr=-}}, {{l-self|zgh|ⵃ|tr=-}}, {{l-self|zgh|ⵄ|tr=-}}, {{l-self|zgh|ⵅ|tr=-}}, {{l-self|zgh|ⵇ|tr=-}}, {{l-self|zgh|ⵉ|tr=-}}, {{l-self|zgh|ⵊ|tr=-}}, {{l-self|zgh|ⵍ|tr=-}}, {{l-self|zgh|ⵎ|tr=-}}, {{l-self|zgh|ⵏ|tr=-}}, {{l-self|zgh|ⵓ|tr=-}}, {{l-self|zgh|ⵔ|tr=-}}, {{l-self|zgh|ⵕ|tr=-}}, {{l-self|zgh|ⵖ|tr=-}}, {{l-self|zgh|ⵙ|tr=-}}, {{l-self|zgh|ⵚ|tr=-}}, {{l-self|zgh|ⵛ|tr=-}}, {{l-self|zgh|ⵜ|tr=-}}, {{l-self|zgh|ⵟ|tr=-}}, {{l-self|zgh|ⵡ|tr=-}}, {{l-self|zgh|ⵢ|tr=-}}, {{l-self|zgh|ⵣ|tr=-}}, {{l-self|zgh|ⵥ|tr=-}}}}
=={{langname|tzm}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Tifinagh
| {{pn}}
|-
! Latinh
| {{l|tzm|Z}} {{l|tzm|z}}
|-
! Ả Rập
| {{l|tzm|ز}}
|-
|}
==={{ĐM|pron}}===
*{{tzm-IPA}}
==={{ĐM|letter}}===
{{head|tzm|Chữ cái}}
#Chữ cái thứ 30 trong bảng chữ cái Tân Tifinagh.
#:{{ux|tzm|ⵜⴰⵎⴰ'''ⵣ'''ⵉⵖⵜ|[[:Thể loại:Tiếng Tamazight Trung Atlas|tiếng Tamazight Trung Atlas]]|inline=1}}
===={{ĐM|see}}====
*{{list helper 2|title=Bảng chữ cái Tân Tifinagh|list={{l-self|tzm|ⴰ|tr=-}}, {{l-self|tzm|ⴱ|tr=-}}, {{l-self|tzm|ⴳ|tr=-}}, {{l-self|tzm|ⴳⵯ|tr=-}}, {{l-self|tzm|ⴷ|tr=-}}, {{l-self|tzm|ⴹ|tr=-}}, {{l-self|tzm|ⴻ|tr=-}}, {{l-self|tzm|ⴼ|tr=-}}, {{l-self|tzm|ⴽ|tr=-}}, {{l-self|tzm|ⴽⵯ|tr=-}}, {{l-self|tzm|ⵀ|tr=-}}, {{l-self|tzm|ⵃ|tr=-}}, {{l-self|tzm|ⵄ|tr=-}}, {{l-self|tzm|ⵅ|tr=-}}, {{l-self|tzm|ⵇ|tr=-}}, {{l-self|tzm|ⵉ|tr=-}}, {{l-self|tzm|ⵊ|tr=-}}, {{l-self|tzm|ⵍ|tr=-}}, {{l-self|tzm|ⵎ|tr=-}}, {{l-self|tzm|ⵏ|tr=-}}, {{l-self|tzm|ⵓ|tr=-}}, {{l-self|tzm|ⵔ|tr=-}}, {{l-self|tzm|ⵕ|tr=-}}, {{l-self|tzm|ⵖ|tr=-}}, {{l-self|tzm|ⵙ|tr=-}}, {{l-self|tzm|ⵚ|tr=-}}, {{l-self|tzm|ⵛ|tr=-}}, {{l-self|tzm|ⵜ|tr=-}}, {{l-self|tzm|ⵟ|tr=-}}, {{l-self|tzm|ⵡ|tr=-}}, {{l-self|tzm|ⵢ|tr=-}}, {{l-self|tzm|ⵣ|tr=-}}, {{l-self|tzm|ⵥ|tr=-}}}}
=={{langname|rif}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|rif|Z}} {{l|rif|z}}
|-
! Tifinagh
| {{pn}}
|-
! Ả Rập
| {{l|rif|ز}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|rif|/z/}}
==={{ĐM|letter}}===
{{head|rif|Chữ cái}}
#Chữ cái thứ 33 trong bảng chữ cái Tifinagh tiếng Tarifit.
#:{{ux|rif|ⵜⵜⵍⴼⴰ'''ⵣ'''ⴰ|[[truyền hình]]|inline=1}}
==={{ĐM|see}}===
*{{list helper 2|title=Bảng chữ cái Tifinagh tiếng Tarifit|list={{l-self|rif|ⴰ|tr=-}}, {{l-self|rif|ⴱ|tr=-}}, {{l-self|rif|ⴳ|tr=-}}, {{l-self|rif|ⴳⵯ|tr=-}}, {{l-self|rif|ⴷ|tr=-}}, {{l-self|rif|ⴹ|tr=-}}, {{l-self|rif|ⴻ|tr=-}}, {{l-self|rif|ⴼ|tr=-}}, {{l-self|rif|ⴽ|tr=-}}, {{l-self|rif|ⴽⵯ|tr=-}}, {{l-self|rif|ⵀ|tr=-}}, {{l-self|rif|ⵃ|tr=-}}, {{l-self|rif|ⵄ|tr=-}}, {{l-self|rif|ⵅ|tr=-}}, {{l-self|rif|ⵇ|tr=-}}, {{l-self|rif|ⵉ|tr=-}}, {{l-self|rif|ⵊ|tr=-}}, {{l-self|rif|ⵍ|tr=-}}, {{l-self|rif|ⵎ|tr=-}}, {{l-self|rif|ⵏ|tr=-}}, {{l-self|rif|ⵓ|tr=-}}, {{l-self|rif|ⵔ|tr=-}}, {{l-self|rif|ⵕ|tr=-}}, {{l-self|rif|ⵖ|tr=-}}, {{l-self|rif|ⵙ|tr=-}}, {{l-self|rif|ⵚ|tr=-}}, {{l-self|rif|ⵛ|tr=-}}, {{l-self|rif|ⵞ|tr=-}}, {{l-self|rif|ⵜ|tr=-}}, {{l-self|rif|ⵟ|tr=-}}, {{l-self|rif|ⵡ|tr=-}}, {{l-self|rif|ⵢ|tr=-}}, {{l-self|rif|ⵣ|tr=-}}, {{l-self|rif|ⵥ|tr=-}}}}
==={{ĐM|ref}}===
*{{Chú thích web|rif|url=https://ebible.org/rift/|work=ⴰⴷⵍⵉⵙ ⵉⵇⴻⴷⴷⵙⴻⵏ|author=www.tarifit.info|year=2020}}
=={{langname|shi}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|shi|Z}} {{l|shi|z}}
|-
! Tifinagh
| {{pn}}
|-
! Ả Rập
| {{l|shi|ز}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|shi|[z]}}
==={{ĐM|letter}}===
{{head|shi|Chữ cái}}
#Chữ cái thứ 33 trong bảng chữ cái Tifinagh tiếng Tashelhit.
#:{{ux|shi|'''ⵣⵣ'''ⵉⴳ'''ⵣ'''|[[đi bộ]]|inline=1}}
===={{ĐM|see}}====
*{{list helper 2|title=Bảng chữ cái Tifinagh tiếng Tashelhit|list={{l-self|shi|ⴰ|tr=-}}, {{l-self|shi|ⴱ|tr=-}}, {{l-self|shi|ⴳ|tr=-}}, {{l-self|shi|ⴳⵯ|tr=-}}, {{l-self|shi|ⴷ|tr=-}}, {{l-self|shi|ⴹ|tr=-}}, {{l-self|shi|ⴼ|tr=-}}, {{l-self|shi|ⴽ|tr=-}}, {{l-self|shi|ⴽⵯ|tr=-}}, {{l-self|shi|ⵀ|tr=-}}, {{l-self|shi|ⵃ|tr=-}}, {{l-self|shi|ⵄ|tr=-}}, {{l-self|shi|ⵅ|tr=-}}, {{l-self|shi|ⵅⵯ|tr=-}}, {{l-self|shi|ⵇ|tr=-}}, {{l-self|shi|ⵉ|tr=-}}, {{l-self|shi|ⵊ|tr=-}}, {{l-self|shi|ⵍ|tr=-}}, {{l-self|shi|ⵎ|tr=-}}, {{l-self|shi|ⵏ|tr=-}}, {{l-self|shi|ⵓ|tr=-}}, {{l-self|shi|ⵔ|tr=-}}, {{l-self|shi|ⵕ|tr=-}}, {{l-self|shi|ⵖ|tr=-}}, {{l-self|shi|ⵖⵯ|tr=-}}, {{l-self|shi|ⵙ|tr=-}}, {{l-self|shi|ⵚ|tr=-}}, {{l-self|shi|ⵛ|tr=-}}, {{l-self|shi|ⵜ|tr=-}}, {{l-self|shi|ⵟ|tr=-}}, {{l-self|shi|ⵡ|tr=-}}, {{l-self|shi|ⵢ|tr=-}}, {{l-self|shi|ⵣ|tr=-}}, {{l-self|shi|ⵥ|tr=-}}}}
=={{langname|grr}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Ả Rập
| {{l|grr|ز}}
|-
! Latinh
| {{l|grr|Z}} {{l|grr|z}}
|-
! Tifinagh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|grr|/z/}}
==={{ĐM|letter}}===
{{head|grr|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Taznatit.
#:{{ux|grr|ⵜⴰ'''ⵣ'''ⵏⴰⵜⵉⵜ|tiếng Taznatit |inline=1}}
==={{ĐM|ref}}===
*{{Chú thích web|grr|work=Bible.is|entryurl=https://live.bible.is/bible/GRRWBT/MRK/1|entry=مرقس 1|year=2026}}
=={{langname|tez}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Tifinagh
| {{pn}}
|-
! Latinh
| {{l|tez|Z}} {{l|tez|z}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|tez|/z/}}
==={{ĐM|letter}}===
{{head|tez|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Tetserret.
#:{{ux|tez|ⵜⴰ'''ⵣ'''ⴰⵓ'''ⵣ'''ⵓⵜ|[[xanh lá cây]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích sách|en|page=8|title=[https://www.sil.org/system/files/reapdata/11/94/53/119453742458483302213161983674817195991/Tetserret_tez_Tin_Sert_Report_Isaac_2004_10_01.pdf Tamasaɣalel (Tʃinser): A Berber Language of Niger - Survey Report]|author=Kendall Isaac|year=1998}}
=={{langname|tmh}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|tmh|Z}} {{l|tmh|z}}
|-
! Tifinagh
| {{pn}}
|-
! Ả Rập
| {{l|tmh|ز}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|tmh|/z/}}
==={{ĐM|letter}}===
{{head|tmh|Chữ cái|tr=z}}
#Chữ cái thứ 30 trong bảng chữ cái Tamasheq.
#:{{ux|tmh|'''ⵣ'''ⴻⴱⴱⴻⴷⴻⵂ|tr='''z'''ebbedeh|chạy bở hơi tai|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=tmh|sc=Tfng|qual=Bảng chữ cái Tamasheq|ⴰ|ⴱ|ⴴ|ⴶ|ⴷ/ⴸ|ⴹ|ⴼ|ⴾ|ⵂ|ⵃ|ⵄ|ⵆ|ⵈ|ⵉ|ⵌ/ⵋ|ⵍ|ⵎ|ⵏ|ⵑ|ⵓ|ⵔ|ⵗ|ⵙ|ⵚ|ⵛ|ⵜ|ⵟ|ⵡ|ⵢ|ⵣ|ⵥ|ⵦ}}
==={{ĐM|ref}}===
*{{Chú thích web|fr|entry=z|entryurl=https://www.webonary.org/tamahaq/browse/browse-vernacular-french/?key=thv-Latn-DZ-x-ahaggar&letter=z&lang=en|editor=Ch. De Foucauld & Cid Kaoui|year=2023|work=Tamahaq - French Dictionary|publisher=SIL International}}
=={{langname|zen}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Latinh
| {{l|zen|Z}} {{l|zen|z}}
|-
! Tifinagh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|zen|/z/}}
==={{ĐM|letter}}===
{{head|zen|Chữ cái}}
#Chữ Tifinagh thể hiện phụ âm '''{{IPAchar|/z/}}''' trong tiếng Zenaga.
#:{{ux|zen|'''ⵣ'''ⴰⵔ|[[xem]]|inline=1}}
==={{ĐM|ref}}===
*{{Chú thích web|en|editor=Julia Bischoffberger|year=2000|work=[https://asjp.clld.org/languages/ZENAGA_2 Wordlist Zenaga 2]|publisher=The ASJP Database}}
[[Thể loại:Khối ký tự Tifinagh|63]]
fmqal59mdp3qnh99vivioh6hkue6cra
Mô đun:ny
828
394983
2348867
2026-04-27T12:35:22Z
TheHighFighter2
42988
Trang mới: “local gsub = mw.ustring.gsub local u = require("Module:string/char") local export = {} function export.new(frame) local title = mw.loadData("Module:headword/data").pagename local args = frame:getParent().args local pos = args[1] or "" local def = args[2] or "{{rfdef|ny}}" local pos2 = args[3] or (args[4] and "" or false) local def2 = args[4] or "{{rfdef|ny}}" local pos3 = args[5] or (args[6] and "" or false) local def3 = args[6] or "{{rfdef|ny}}" local etym = a…”
2348867
Scribunto
text/plain
local gsub = mw.ustring.gsub
local u = require("Module:string/char")
local export = {}
function export.new(frame)
local title = mw.loadData("Module:headword/data").pagename
local args = frame:getParent().args
local pos = args[1] or ""
local def = args[2] or "{{rfdef|ny}}"
local pos2 = args[3] or (args[4] and "" or false)
local def2 = args[4] or "{{rfdef|ny}}"
local pos3 = args[5] or (args[6] and "" or false)
local def3 = args[6] or "{{rfdef|ny}}"
local etym = args["e"] or false
local head = args["h"] or false
local cat = args["cat"] or false
local usage = args["un"] or false
local class = args["c"] or false
local plural = args["pl"] or false
local class2 = args["c2"] or false
local plural2 = args["pl2"] or false
local class3 = args["c3"] or false
local plural3 = args["pl3"] or false
local result = ""
local function genTitle(text)
local pos_title = {
[""] = "Noun", ["n"] = "Noun", ["pn"] = "Proper noun", ["propn"] = "Proper noun", ["pron"] = "Pronoun",
["v"] = "Verb", ["vf"] = "Verb", ["a"] = "Adjective", ["adj"] = "Adjective", ["adv"] = "Adverb",
["prep"] = "Preposition", ["postp"] = "Postposition", ["conj"] = "Conjunction",
["part"] = "Particle", ["suf"] = "Suffix",
["prov"] = "Proverb", ["id"] = "Idiom", ["ph"] = "Phrase", ["intj"] = "Interjection", ["interj"] = "Interjection",
["num"] = "Numeral", ["abb"] = "Abbreviation", ["deter"] = "Determiner"
};
return pos_title[text] or mw.ustring.upper(mw.ustring.sub(text, 1, 1)) .. mw.ustring.sub(text, 2, -1)
end
local function genHead(text)
local pos_head = {
[""] = "noun", ["n"] = "noun", ["pn"] = "proper noun", ["propn"] = "proper noun", ["v"] = "verb", ["vf"] = "verb form", ["a"] = "adj",
["prep"] = "preposition", ["conj"] = "con", ["part"] = "particle", ["pron"] = "pronoun",
["prov"] = "proverb", ["id"] = "idiom", ["ph"] = "phrase", ["intj"] = "interj",
["abb"] = "abbr", ["deter"] = "det"
};
return pos_head[text] or text
end
local function other(class, title, args)
local code = ""
if args[class] then
if (mw.ustring.gmatch(args[class], "^-")) then
code = code .. "\n\n===" .. title .. "===\n* {{l|ny|" .. gsub(args[class], "^-", "") .. "|" .. args[class] .. "}}"
else
code = code .. "\n\n===" .. title .. "===\n* {{l|ny|" .. args[class] .. "}}"
end
end
for i=1,6 do
if args[class .. i] then
if (mw.ustring.gmatch(args[class..i], "^-")) then
code = code .. "\n* {{l|ny|" .. gsub(args[class..i], "^-", "") .. "|" .. args[class..i] .. "}}"
else
code = code .. "\n* {{l|ny|" .. args[class..i] .. "}}"
end
end
end
return code
end
result = result .. "==Chichewa=="
if args["wp"] then result = result .. "\n{{wikipedia|lang=ny" ..
(args["wp"] == "y" and "" or "|" .. args["wp"]) .. "}}" end
result = result .. other("alt", "Alternative forms", args)
if etym then result = result .. "\n\n===Etymology===\n" .. etym end
result = result .. "\n\n===Pronunciation===\n* {{ny-IPA" .. (head and ("|" .. require("Module:links").remove_links(head)) or "") .. "}}"
result = result .. "\n\n===" .. genTitle(pos) .. "===\n{{ny-" .. genHead(pos) .. (head and ("|" .. gsub(head,"([bdmn])'","%1")) or "") .. (class and ("|" .. class) or "") .. (plural and ("|" .. plural) or "") .. "}}\n\n# " .. def
result = result .. other("syn", "=Synonyms=", args)
result = result .. other("ant", "=Antonyms=", args)
result = result .. other("rel", "=Related terms=", args)
result = result .. other("der", "=Derived terms=", args)
if vder then result = result .. "\n\n====Derived terms====\n" .. vder end
result = result .. other("also", "=See also=", args)
if usage then result = result .. "\n\n====Usage notes====\n" .. usage end
if pos2 then
result = result .. "\n\n===" .. genTitle(pos2) .. "===\n{{ny-" .. genHead(pos2) .. (head and ("|head=" .. gsub(head,"([bdmn])'","%1")) or "") .. (class2 and ("|" .. class2) or "") .. (plural2 and ("|" .. plural2) or "") .. "}}\n\n# " .. def2
end
if pos3 then
result = result .. "\n\n===" .. genTitle(pos3) .. "===\n{{ny-" .. genHead(pos3) .. (head and ("|head=" .. gsub(head,"([bdmn])'","%1")) or "") .. (class3 and ("|" .. class3) or "") .. (plural3 and ("|" .. plural3) or "") .. "}}\n\n# " .. def3
end
if cat then result = result .. "\n\n{{C|ny|" .. cat .. "}}" end
return result
end
function export.acute_on_first_vowel(frame)
local word = frame.args[1]
if not word then
return ""
end
-- Decompose word, find first vowel, add acute to it if it doesn't have one,
-- remove second return value.
-- Recomposing unnecessary.
local acute = u(0x0301)
return (gsub(
mw.ustring.toNFD(word),
"([AaEeIiOoUu])" .. acute .. "?",
"%1" .. acute,
1))
end
return export
t2gsehqog7wdjuqeuxtan2tsjr29oat
Bản mẫu:ny-der
10
394984
2348868
2026-04-27T12:38:51Z
TheHighFighter2
42988
Đổi hướng đến [[Bản mẫu:ny-derivations]]
2348868
wikitext
text/x-wiki
#đổi [[Bản mẫu:ny-derivations]]
4hjatrljy967ge6nrs6katzz7uwyyae
degredu
0
394985
2348869
2026-04-27T12:42:15Z
Hiyuune
50834
+ ast
2348869
wikitext
text/x-wiki
=={{langname|ast}}==
==={{section|pron}}===
{{ast-pr}}
==={{section|noun}}===
{{ast-noun|m|degredos}}
# {{lb|ast|archaic}} {{synonym of|ast|decretu}}
==={{section|further}}===
* {{R:ast:DALLA}}
* {{R:ast:DGLA}}
a7n0rley2bxx2t6twrdl43oi3xkku7b
𣞹
0
394986
2348870
2026-04-27T12:44:06Z
Hiyuune
50834
+ mul
2348870
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=75|rad=木|as=15|sn=19|four=|canj=|ids=⿰木䡞}}
===={{section|ref}}====
* {{Han ref|kx=0561.111|dkj=|dj=|hdz=80021.200|uh=237B9}}
880hag7x6jk4gwaqqjbb3ls5nz9gl3c
𤶹
0
394987
2348871
2026-04-27T12:46:23Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=104|rad=疒|as=7|sn=12|four=|canj=KSSR|ids=⿸疒局}} ===={{section|ref}}==== {{Han ref|kx=0774.251|uh=24DB9}} =={{langname|vi}}== ==={{section|glyph origin}}=== {{Han compound|lang=vi|疒|局|ls=psc|tr={{vi-l|guộc}}|c1=s|c2=p|tr2={{vi-l|cục}}}}. ==={{section|han}}=== {{vi-readings |rs=疒07 |nom=guộc-tdcndg;tdcntd;gdhn;takeuchi;btcn;bonet;genibrel;taberd }} # {{vi-Nom form of|guộc|…”
2348871
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=104|rad=疒|as=7|sn=12|four=|canj=KSSR|ids=⿸疒局}}
===={{section|ref}}====
{{Han ref|kx=0774.251|uh=24DB9}}
=={{langname|vi}}==
==={{section|glyph origin}}===
{{Han compound|lang=vi|疒|局|ls=psc|tr={{vi-l|guộc}}|c1=s|c2=p|tr2={{vi-l|cục}}}}.
==={{section|han}}===
{{vi-readings
|rs=疒07
|nom=guộc-tdcndg;tdcntd;gdhn;takeuchi;btcn;bonet;genibrel;taberd
}}
# {{vi-Nom form of|guộc|{{ng|dùng với {{mention|vi|gầy guộc}}}}}}
===={{section|com}}====
{{col3|vi|{{vi-l|𤷍𤶹|gầy guộc}}}}
==={{section|ref}}===
<references/>
ptg27iys5x7cit03o21bu1onbodt6lz
chidzikaka
0
394988
2348872
2026-04-27T12:46:27Z
TheHighFighter2
42988
Trang mới: “=={{langname|ny}}== ==={{ĐM|etym}}=== Từ {{mention|ny|chidzika|-chidzika|trả tiền cho cha mẹ cô gái mà mình muốn cưới}}. ==={{ĐM|pron}}=== * {{ny-IPA|chidzikaka}} ==={{ĐM|verb}}=== {{ny-verb|chidzikaka}} # Bị [[phù phép]] không [[kết hôn]]. ===={{ĐM|der}}==== {{ny-der|caus|appl|neg|repet|redup}} ==={{ĐM|ref}}=== * {{R:ny:Paas:2016|page=50}} {{C|ny|Thuật phù thủy|Hôn nhân}}”
2348872
wikitext
text/x-wiki
=={{langname|ny}}==
==={{ĐM|etym}}===
Từ {{mention|ny|chidzika|-chidzika|trả tiền cho cha mẹ cô gái mà mình muốn cưới}}.
==={{ĐM|pron}}===
* {{ny-IPA|chidzikaka}}
==={{ĐM|verb}}===
{{ny-verb|chidzikaka}}
# Bị [[phù phép]] không [[kết hôn]].
===={{ĐM|der}}====
{{ny-der|caus|appl|neg|repet|redup}}
==={{ĐM|ref}}===
* {{R:ny:Paas:2016|page=50}}
{{C|ny|Thuật phù thủy|Hôn nhân}}
78e1t7uojlzwrkm7i131e8y5jr346k9
Bản mẫu:R:ny:Paas:2016
10
394989
2348878
2026-04-27T13:03:51Z
TheHighFighter2
42988
Trang mới: “{{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{cite-book |title=Oxford Chichewa-English/English - Chichewa Dictionary |author=Steven Paas |authorlink=Steven Paas |year=2016 |publisher=Nhà xuất bản Đại học Oxford |url=https://translate.chichewadictionary.org/ |page={{{page|}}} |pages={{{pages|}}} }}<noinclude>{{refcat}}</noinclude>”
2348878
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{cite-book
|title=Oxford Chichewa-English/English - Chichewa Dictionary
|author=Steven Paas
|authorlink=Steven Paas
|year=2016
|publisher=Nhà xuất bản Đại học Oxford
|url=https://translate.chichewadictionary.org/
|page={{{page|}}}
|pages={{{pages|}}}
}}<noinclude>{{refcat}}</noinclude>
jielq2trzif7masluwtap70fo1kiout
Thể loại:Bản mẫu tham khảo tiếng Chichewa
14
394990
2348879
2026-04-27T13:04:09Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2348879
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
breech-block
0
394992
2348883
2026-04-27T14:19:45Z
Hiyuune
50834
Hiyuune đã đổi [[breech-block]] thành [[breechblock]]
2348883
wikitext
text/x-wiki
#đổi [[breechblock]]
i8eq62ya6c5fx69x29pynsap255l17f
æstuarierne
0
394993
2348885
2026-04-27T14:22:04Z
Hiyuune
50834
+ da
2348885
wikitext
text/x-wiki
=={{langname|da}}==
==={{section|noun}}===
{{head|da|Biến thể hình thái danh từ}}
# {{infl of|da|æstuarium||nom|def|p}}
25zu0yiljqzkr5tzapcdcwt3uy5w94q
æstuariums
0
394994
2348887
2026-04-27T14:22:41Z
Hiyuune
50834
+ da
2348887
wikitext
text/x-wiki
=={{langname|da}}==
==={{section|noun}}===
{{head|da|Biến thể hình thái danh từ}}
# {{infl of|da|æstuarium||gen|indef|s}}
aexeknhm42czypaz9iun1hd03vpbzh8
æstuariets
0
394995
2348888
2026-04-27T14:23:25Z
Hiyuune
50834
+ da
2348888
wikitext
text/x-wiki
=={{langname|da}}==
==={{section|n}}===
{{head|da|Biến thể hình thái danh từ}}
# {{infl of|da|æstuarium||gen|def|s}}
p3t1fjz03u8qcir3rjzod9o42xufvfq
æstuariers
0
394996
2348890
2026-04-27T14:24:05Z
Hiyuune
50834
+ da
2348890
wikitext
text/x-wiki
=={{langname|da}}==
==={{ĐM|n}}===
{{head|da|Biến thể hình thái danh từ}}
# {{infl of|da|æstuarium||gen|indef|p}}
36fjjc9jut6v8cnpa8lz5boy6bwfva9
æstuariernes
0
394997
2348891
2026-04-27T14:24:43Z
Hiyuune
50834
+ da
2348891
wikitext
text/x-wiki
=={{langname|da}}==
==={{ĐM|n}}===
{{head|da|Biến thể hình thái danh từ}}
# {{infl of|da|æstuarium||gen|def|p}}
knnd5xz3y4317kxpkft0td4h621r6b6
flodmunding
0
394998
2348892
2026-04-27T14:25:49Z
Hiyuune
50834
+ da
2348892
wikitext
text/x-wiki
=={{langname|da}}==
{{wp|da:}}
==={{section|etym}}===
Từ {{affix|da|flod|munding}}.
==={{section|n}}===
{{da-noun|en|er}}
# [[cửa sông|Cửa sông]].
#: {{syn|da|æstuarium}}
===={{section|decl}}====
{{da-decl|en|er}}
==={{section|ref}}===
* {{R:DDO}}
{{C|da|Địa mạo|Vùng nước}}
1q4s5kgazh19n8f576guov0ggvdcwyx
flodmundingen
0
394999
2348893
2026-04-27T14:26:31Z
Hiyuune
50834
+ da
2348893
wikitext
text/x-wiki
=={{langname|da}}==
==={{section|n}}===
{{head|da|Biến thể hình thái danh từ}}
# {{infl of|da|flodmunding||nom|def|s}}
nwjnv80pgv82dr4km3bn8fwrz5blupu
Thể loại:Địa danh của Đồng Nai, Việt Nam/Tiếng Việt
14
395000
2348896
2026-04-27T14:30:17Z
Hiyuune
50834
Hiyuune đã đổi [[Thể loại:Địa danh của Đồng Nai, Việt Nam/Tiếng Việt]] thành [[Thể loại:vi:Địa danh của Đồng Nai, Việt Nam]]
2348896
wikitext
text/x-wiki
{{Đổi hướng thể loại|Thể loại:vi:Địa danh của Đồng Nai, Việt Nam}}
tamv8wo8snavc3c0otv8q68ibdmk1lt
Thể loại:Động từ tiếng Chichewa
14
395001
2348902
2026-04-27T14:34:55Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2348902
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
chidzika
0
395002
2348906
2026-04-27T14:47:38Z
TheHighFighter2
42988
Trang mới: “=={{langname|ny}}== ==={{ĐM|pron}}=== * {{ny-IPA|chidzika}} ==={{ĐM|verb}}=== {{ny-verb|chidzika}} # Trả tiền cho cha mẹ cô gái mà mình muốn cưới. ===={{ĐM|der}}==== {{ny-der|neg|pass|repet|caus|appl|vrb=chidzikaka|vrb-g=bị phù phép không kết hôn}} ==={{ĐM|ref}}=== * {{R:ny:Paas:2016|page=50}} {{C|ny|Hôn nhân}}”
2348906
wikitext
text/x-wiki
=={{langname|ny}}==
==={{ĐM|pron}}===
* {{ny-IPA|chidzika}}
==={{ĐM|verb}}===
{{ny-verb|chidzika}}
# Trả tiền cho cha mẹ cô gái mà mình muốn cưới.
===={{ĐM|der}}====
{{ny-der|neg|pass|repet|caus|appl|vrb=chidzikaka|vrb-g=bị phù phép không kết hôn}}
==={{ĐM|ref}}===
* {{R:ny:Paas:2016|page=50}}
{{C|ny|Hôn nhân}}
197vad9n61kvrz0imqwu45nqo1dwrz8
Mô đun:chemical element list
828
395003
2348908
2026-04-27T14:51:43Z
Hiyuune
50834
Trang mới: “local export = {} local M = require("Module:module loader").init({ require = { links = "Module:links", string_utilities = "Module:string utilities", table = "Module:table", qualifier = "Module:qualifier", gender_and_number = "Module:gender and number", parameters = "Module:parameters", }, loadData = { common_elements_data = "Module:chemical element list/data/common", }, }) local concat = table.concat local insert = table.insert local lower = string.low…”
2348908
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Previous: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Next: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
5gjalwvy7cn8rh9wfgzh99ypceh36ru
2348911
2348908
2026-04-27T14:56:37Z
Hiyuune
50834
2348911
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Previous: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Next: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
ajgmbbcm7m0ijkrcq7ifdzjrls164vk
2348913
2348911
2026-04-27T14:59:44Z
Hiyuune
50834
2348913
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["Kim loại chuyển tiếp"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
9ta2wzifj6u1i0jn7innhoflguekkiz
2348914
2348913
2026-04-27T15:00:36Z
Hiyuune
50834
2348914
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
16xqzv9rke6wvkcuabsrbqkjwmemjsv
2348916
2348914
2026-04-27T15:02:10Z
Hiyuune
50834
Đã lùi lại sửa đổi [[Special:Diff/2348914|2348914]] của [[Special:Contributions/Hiyuune|Hiyuune]] ([[User talk:Hiyuune|thảo luận]])
2348916
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["Kim loại chuyển tiếp"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
9ta2wzifj6u1i0jn7innhoflguekkiz
2348917
2348916
2026-04-27T15:03:28Z
Hiyuune
50834
2348917
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
16xqzv9rke6wvkcuabsrbqkjwmemjsv
2348918
2348917
2026-04-27T15:04:42Z
Hiyuune
50834
2348918
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Noble gases",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("Chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("Nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("Phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
a1skemocf24n80lg4vn4y4b1iwjqhby
2348931
2348918
2026-04-27T15:35:13Z
Hiyuune
50834
2348931
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Khí hiếm",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Noble gases",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("Chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("Nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("Phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
o5q8fj386odt0dvdu7hl7tvwos3j4hk
2348933
2348931
2026-04-27T15:36:32Z
Hiyuune
50834
2348933
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Khí hiếm",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Khí hiếm",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("Chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("Nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("Phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="show" data-collapsetext="hide">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
cfzizbtvjb1m13q46wqnsn6fm8pucva
2348935
2348933
2026-04-27T15:48:43Z
TheHighFighter2
42988
2348935
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Khí hiếm",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Khí hiếm",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("Chu kỳ %d nguyên tố"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("Nhóm %d nguyên tố"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("Phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kì", full_label = "Chu kì" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="hiện" data-collapsetext="ẩn">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
mksflwll9i5r4f3iskmiqi6nttv6zsx
2348944
2348935
2026-04-27T15:56:58Z
Hiyuune
50834
2348944
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
links = "Module:links",
string_utilities = "Module:string utilities",
table = "Module:table",
qualifier = "Module:qualifier",
gender_and_number = "Module:gender and number",
parameters = "Module:parameters",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
})
local concat = table.concat
local insert = table.insert
local lower = string.lower
local upper = string.upper
local default_name_types = {
{key = "name", display = "Tên"},
}
function export.get_data_module_name(langcode)
return "Module:chemical element list/data/" .. langcode
end
local function normalize_atomic_number(value)
if not value then
return nil
end
value = tostring(value):gsub(",", "")
if not value:find("^%d+$") then
return nil
end
return tostring(tonumber(value))
end
local function normalize_symbol(value)
if not value or value == "" then
return nil
end
local symbol = tostring(value)
return upper(symbol:sub(1, 1)) .. lower(symbol:sub(2))
end
local UNIVERSAL_SYMBOLS = {
"H", "He", "Li", "Be", "B", "C", "N", "O", "F", "Ne",
"Na", "Mg", "Al", "Si", "P", "S", "Cl", "Ar",
"K", "Ca", "Sc", "Ti", "V", "Cr", "Mn", "Fe", "Co", "Ni", "Cu", "Zn",
"Ga", "Ge", "As", "Se", "Br", "Kr",
"Rb", "Sr", "Y", "Zr", "Nb", "Mo", "Tc", "Ru", "Rh", "Pd", "Ag", "Cd",
"In", "Sn", "Sb", "Te", "I", "Xe",
"Cs", "Ba", "La", "Ce", "Pr", "Nd", "Pm", "Sm", "Eu", "Gd", "Tb", "Dy", "Ho", "Er", "Tm", "Yb", "Lu",
"Hf", "Ta", "W", "Re", "Os", "Ir", "Pt", "Au", "Hg",
"Tl", "Pb", "Bi", "Po", "At", "Rn",
"Fr", "Ra", "Ac", "Th", "Pa", "U", "Np", "Pu", "Am", "Cm", "Bk", "Cf", "Es", "Fm", "Md", "No", "Lr",
"Rf", "Db", "Sg", "Bh", "Hs", "Mt", "Ds", "Rg", "Cn", "Nh", "Fl", "Mc", "Lv", "Ts", "Og",
}
local EXTENDED_DIGIT_DATA = {
["0"] = { symbol = "n", name = "nil" },
["1"] = { symbol = "u", name = "un" },
["2"] = { symbol = "b", name = "bi" },
["3"] = { symbol = "t", name = "tri" },
["4"] = { symbol = "q", name = "quad" },
["5"] = { symbol = "p", name = "pent" },
["6"] = { symbol = "h", name = "hex" },
["7"] = { symbol = "s", name = "sept" },
["8"] = { symbol = "o", name = "oct" },
["9"] = { symbol = "e", name = "enn" },
}
local DEFAULT_SYSTEMATIC_ELISIONS = {
{ "iium$", "ium" },
{ "nnil", "nil" },
}
local function build_systematic_maps(systematic_config)
local config = systematic_config or {}
local digit_data = config.digit_data
if type(digit_data) ~= "table" then
digit_data = {}
for digit, data in pairs(EXTENDED_DIGIT_DATA) do
digit_data[digit] = data
end
end
local symbol_digits = {}
local name_digits = {}
local symbol_reverse_digits = {}
for digit, data in pairs(digit_data) do
local symbol = data and data.symbol
local name = data and data.name
if symbol and name then
symbol_digits[digit] = symbol
name_digits[digit] = name
symbol_reverse_digits[symbol] = digit
end
end
return symbol_digits, name_digits, symbol_reverse_digits
end
local function build_systematic_symbol_from_number(atomic_number, systematic_config)
local symbol_digits = build_systematic_maps(systematic_config)
local symbol_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local symbol_part = symbol_digits[digit]
if not symbol_part then
return nil
end
insert(symbol_parts, symbol_part)
end
if #symbol_parts == 0 then
return nil
end
symbol_parts[1] = upper(symbol_parts[1])
return concat(symbol_parts)
end
local function get_extended_symbol(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_symbol_from_number(atomic_number, systematic_config)
end
local function build_systematic_name_from_number(atomic_number, systematic_config)
local _, name_digits = build_systematic_maps(systematic_config)
local name_parts = {}
for digit in tostring(atomic_number):gmatch("%d") do
local name_part = name_digits[digit]
if not name_part then
return nil
end
insert(name_parts, name_part)
end
if #name_parts == 0 then
return nil
end
local suffix = systematic_config and systematic_config.suffix or "ium"
local name = concat(name_parts) .. suffix
-- IUPAC elisions for temporary systematic names.
local elisions = systematic_config and systematic_config.elisions
if systematic_config and systematic_config.replace_default_elisions and type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
else
for _, rule in ipairs(DEFAULT_SYSTEMATIC_ELISIONS) do
local pattern = rule[1]
local repl = rule[2] or ""
name = name:gsub(pattern, repl)
end
if type(elisions) == "table" then
for _, rule in ipairs(elisions) do
local pattern = rule and rule[1]
local repl = rule and rule[2] or ""
if pattern then
name = name:gsub(pattern, repl)
end
end
end
end
return name
end
local function get_extended_name(atomic_number, systematic_config)
if atomic_number <= #UNIVERSAL_SYMBOLS then
return nil
end
return build_systematic_name_from_number(atomic_number, systematic_config)
end
local function parse_extended_symbol_to_number(symbol, systematic_config)
if type(symbol) ~= "string" or symbol == "" then
return nil
end
local _, _, symbol_reverse_digits = build_systematic_maps(systematic_config)
local digits = {}
for char in lower(symbol):gmatch(".") do
local digit = symbol_reverse_digits[char]
if not digit then
return nil
end
insert(digits, digit)
end
if #digits == 0 then
return nil
end
local normalized = normalize_atomic_number(concat(digits))
if not normalized then
return nil
end
local number = tonumber(normalized)
if not number or number <= #UNIVERSAL_SYMBOLS then
return nil
end
return normalized
end
local function parse_systematic_name_to_number(name, systematic_config)
if type(name) ~= "string" or name == "" then
return nil
end
local normalized_name = lower(name):gsub("[%s%-]", "")
for number = #UNIVERSAL_SYMBOLS + 1, 999 do
if get_extended_name(number, systematic_config) == normalized_name then
return tostring(number)
end
end
return nil
end
-- Legacy temporary IUPAC names/symbols (e.g. ununoctium/Uuo) should resolve
-- to official elements when those atomic numbers already exist in the dataset.
local function parse_legacy_systematic_alias_to_number(value, systematic_config)
if type(value) ~= "string" or value == "" then
return nil
end
local normalized_value = lower(value):gsub("[%s%-]", "")
for number = 100, #UNIVERSAL_SYMBOLS do
local name = build_systematic_name_from_number(number, systematic_config)
if name and lower(name) == normalized_value then
return tostring(number)
end
end
local normalized_symbol = normalize_symbol(value)
for number = 100, #UNIVERSAL_SYMBOLS do
local symbol = build_systematic_symbol_from_number(number, systematic_config)
if symbol and symbol == normalized_symbol then
return tostring(number)
end
end
return nil
end
local function get_systematic_config(m_data, langcode)
local systematic_naming = m_data and m_data.systematic_naming
if systematic_naming == true then
return {}
end
if type(systematic_naming) == "table" then
if systematic_naming.enabled == false then
return nil
end
return systematic_naming
end
return nil
end
function export.get_universal_symbol(atomic_number)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
local number = tonumber(normalized_number)
return UNIVERSAL_SYMBOLS[number] or get_extended_symbol(number, nil)
end
function export.get_systematic_element_name(atomic_number, systematic_naming)
local normalized_number = normalize_atomic_number(atomic_number)
if not normalized_number then
return nil
end
return get_extended_name(tonumber(normalized_number), systematic_naming)
end
local function get_element_symbol(element, atomic_number)
local symbol = type(element) == "table" and normalize_symbol(element.symbol) or nil
if symbol then
return symbol
end
return export.get_universal_symbol(atomic_number)
end
-- Parse a form with modifiers.
function export.parse_form_and_modifiers(form_with_modifiers)
local formobj = {}
local form = form_with_modifiers
while true do
local new_form, angle_bracketed = form:match("^(.-)(%b<>)$")
if not new_form then
break
end
local prefix, content = angle_bracketed:match("^<(%w+):(.+)>$")
if not prefix then
break
end
if prefix == "tag" then
formobj.tag = formobj.tag or {}
insert(formobj.tag, content)
elseif prefix == "q" or prefix == "qq" or prefix == "tr" or prefix == "link" or prefix == "id" or prefix == "g" or prefix == "alt" then
if formobj[prefix] then
error(("Duplicate modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
formobj[prefix] = content
else
error(("Unrecognized modifier '%s' in data module form: %s"):format(prefix, form_with_modifiers))
end
form = new_form
end
formobj.form = form
return formobj
end
local function split_form_variants(form)
if type(form) ~= "string" then
return {}
end
if not form:find("//", nil, true) then
return { form }
end
local forms = M.links.split_on_slashes(form)
if type(forms) ~= "table" or #forms == 0 then
return { form }
end
return forms
end
local function form_matches_pagename(form, pagename, lang)
for _, variant in ipairs(split_form_variants(form)) do
if lang:stripDiacritics(M.links.remove_links(variant)) == pagename then
return true
end
end
return false
end
local function form_equals_pagename(formobj, pagename, lang)
if formobj.link == pagename then
return true
end
if form_matches_pagename(formobj.form, pagename, lang) then
return true
end
if formobj.alt and form_matches_pagename(formobj.alt, pagename, lang) then
return true
end
return false
end
local function get_symbol_to_number_map(m_data)
if type(m_data._symbol_to_number_cache) == "table" then
return m_data._symbol_to_number_cache
end
local map = {}
local explicit_map = m_data.symbol_to_number or m_data.symbols
if type(explicit_map) == "table" then
for symbol, number in pairs(explicit_map) do
local normalized_symbol = normalize_symbol(symbol)
local normalized_number = normalize_atomic_number(number)
if normalized_symbol and normalized_number then
map[normalized_symbol] = normalized_number
end
end
end
-- Auto-derive any missing mappings from the elements table.
for atomic_number, element in pairs(m_data.elements or {}) do
local normalized_number = normalize_atomic_number(atomic_number)
local symbol = get_element_symbol(element, normalized_number)
if normalized_number and symbol and not map[symbol] then
map[symbol] = normalized_number
end
end
m_data._symbol_to_number_cache = map
return map
end
local function resolve_element_data(m_data, atomic_number_or_symbol, systematic_config)
if not m_data or type(m_data.elements) ~= "table" then
return nil, nil
end
local normalized_number = normalize_atomic_number(atomic_number_or_symbol)
if normalized_number then
local data = m_data.elements[normalized_number] or m_data.elements[tonumber(normalized_number)]
if systematic_config and not data then
local number = tonumber(normalized_number)
local systematic_name = number and get_extended_name(number, systematic_config) or nil
if systematic_name then
data = {
name = systematic_name,
symbol = export.get_universal_symbol(number),
}
end
end
return normalized_number, data
end
local symbol_to_number = get_symbol_to_number_map(m_data)
local symbol = normalize_symbol(atomic_number_or_symbol)
local mapped_number = symbol and symbol_to_number[symbol] or nil
if mapped_number then
local normalized_mapped = normalize_atomic_number(mapped_number)
local data = normalized_mapped and (m_data.elements[normalized_mapped] or m_data.elements[tonumber(normalized_mapped)]) or nil
return normalized_mapped, data
end
local extended_number = parse_extended_symbol_to_number(atomic_number_or_symbol, systematic_config)
if extended_number then
local data = m_data.elements[extended_number] or m_data.elements[tonumber(extended_number)]
if systematic_config and not data then
local number = tonumber(extended_number)
data = {
name = get_extended_name(number, systematic_config),
symbol = export.get_universal_symbol(number),
}
end
return extended_number, data
end
local legacy_number = parse_legacy_systematic_alias_to_number(atomic_number_or_symbol, systematic_config)
if legacy_number then
local data = m_data.elements[legacy_number] or m_data.elements[tonumber(legacy_number)]
return legacy_number, data
end
return nil, nil
end
local function merge_element_data(common_elements, atomic_number, element)
local common_entry = nil
local normalized_number = normalize_atomic_number(atomic_number)
if common_elements and normalized_number then
common_entry = common_elements[normalized_number] or common_elements[tonumber(normalized_number)]
end
if type(common_entry) ~= "table" then
return element
end
local merged = M.table.deepCopy(common_entry)
if type(element) == "table" then
for key, value in pairs(element) do
merged[key] = value
end
end
return merged
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number, _ in pairs(m_data.elements or {}) do
local normalized = normalize_atomic_number(number)
if normalized then
insert(numbers, tonumber(normalized))
end
end
table.sort(numbers)
return numbers
end
local function get_next_and_prev_keys(m_data, current_atomic_number)
local current = tonumber(current_atomic_number)
if not current then
return nil, nil
end
local element = m_data.elements[current_atomic_number] or m_data.elements[current]
local next_number = element and element.next and normalize_atomic_number(element.next) or nil
local prev_number = element and element.prev and normalize_atomic_number(element.prev) or nil
if next_number and prev_number then
return next_number, prev_number
end
local numbers = sorted_atomic_numbers(m_data)
for i, number in ipairs(numbers) do
if number == current then
next_number = next_number or (numbers[i + 1] and tostring(numbers[i + 1]) or nil)
prev_number = prev_number or (numbers[i - 1] and tostring(numbers[i - 1]) or nil)
break
end
end
if not next_number then
next_number = tostring(current + 1)
end
if not prev_number and current > 1 then
prev_number = tostring(current - 1)
end
return next_number, prev_number
end
local ELEMENT_CLASS_TO_CATEGORIES = {
["alkali metal"] = {
label = "Kim loại kiểm",
},
["alkaline earth metal"] = {
label = "Kim loại kiềm thổ",
},
["transition metal"] = {
label = "Kim loại chuyển tiếp",
},
["post-transition metal"] = {
label = "Post-transition metals",
},
["lanthanide"] = {
label = "Lanthanide series chemical elements",
},
["actinide"] = {
label = "Actinide series chemical elements",
},
["metalloid"] = {
label = "Metalloids",
},
["halogen"] = {
label = "Halogens",
},
["noble gas"] = {
label = "Khí hiếm",
},
["nonmetal"] = {
label = "Nonmetals",
},
}
local GROUP_TO_SUBCAT = {
[13] = "Boron group elements",
[14] = "Carbon group elements",
[15] = "Pnictogens",
[16] = "Chalcogens",
[17] = "Halogens",
[18] = "Khí hiếm",
}
local function get_auto_subcategories(langcode, atomic_number, m_data)
local n = tonumber(atomic_number)
if not n then
return {}
end
local subcats = {}
local seen_subcats = {}
local function add(cat_name)
if not cat_name or seen_subcats[cat_name] then
return
end
seen_subcats[cat_name] = true
insert(subcats, ("[[Thể loại:%s:%s]]"):format(langcode, cat_name))
end
-- Optional data-driven override, keyed by atomic number: { [8] = {"Chalcogens"} }.
local by_number = m_data and m_data.subcategories_by_atomic_number
if type(by_number) == "table" and type(by_number[n]) == "table" then
for _, cat_name in ipairs(by_number[n]) do
add(cat_name)
end
return subcats
end
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[n] or common_elements[tostring(n)]) or nil
local added_from_common = false
if type(common_entry) == "table" then
local class_key = common_entry.element_class and lower(tostring(common_entry.element_class)) or nil
local class_map = class_key and ELEMENT_CLASS_TO_CATEGORIES[class_key] or nil
local class_label = class_map and class_map.label or nil
if class_label then
add(class_label)
added_from_common = true
end
local period_number = tonumber(common_entry.period)
if period_number then
add(("Nguyên tố chu kỳ %d"):format(period_number))
added_from_common = true
end
local group_number = tonumber(common_entry.group)
if group_number then
add(("Nhóm nguyên tố %d"):format(group_number))
added_from_common = true
end
local group_cat = group_number and GROUP_TO_SUBCAT[group_number] or nil
if group_cat then
add(group_cat)
added_from_common = true
end
local block_name = common_entry.block and lower(tostring(common_entry.block)) or nil
if block_name and block_name:match("^[spdf]$") then
add("Phân tử khối " .. upper(block_name))
added_from_common = true
end
end
if added_from_common then
return subcats
end
return subcats
end
local function lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
local matches = {}
local seen_matches = {}
local function check_form(raw_form, atomic_number, name_type)
local formobj = export.parse_form_and_modifiers(raw_form)
if form_equals_pagename(formobj, pagename, lang) and (not requested_type or requested_type == name_type) then
local normalized_number = normalize_atomic_number(atomic_number)
if normalized_number then
local key = normalized_number .. "||" .. name_type
if not seen_matches[key] then
seen_matches[key] = true
insert(matches, {normalized_number, name_type})
end
end
end
end
for atomic_number, element in pairs(m_data.elements or {}) do
for _, name_type in ipairs(name_types) do
local key = name_type.key
local value = element[key]
if value then
if type(value) == "table" then
for _, form in ipairs(value) do
check_form(form, atomic_number, key)
end
else
check_form(value, atomic_number, key)
end
end
end
end
return matches
end
local function add_name_types(name_types, additional_types)
local types = M.table.deepCopy(name_types)
for _, additional_type in ipairs(additional_types) do
insert(types, additional_type)
end
return types
end
function export.get_name_types(m_data)
if m_data.additional_name_types then
return add_name_types(default_name_types, m_data.additional_name_types)
end
return default_name_types
end
function export.display_name_type(name_type)
if name_type.display then
return name_type.display
end
return name_type.key:gsub("^.", upper):gsub("_", " ")
end
function export.format_formobj(formobj, lang)
local left_q = formobj.q and M.qualifier.format_qualifier(formobj.q) .. " " or ""
local right_q = ((formobj.g and " " .. M.gender_and_number.format_genders(M.string_utilities.split(formobj.g, ",")) or "")
.. (formobj.qq and " " .. M.qualifier.format_qualifier(formobj.qq) or ""))
local term = formobj.link or formobj.form
local alt = formobj.alt
if not alt and formobj.link then
alt = formobj.form
end
return left_q .. M.links.full_link{
lang = lang,
term = term,
alt = alt,
tr = formobj.tr,
id = formobj.id,
} .. right_q
end
local function get_name_form_links(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local linked_forms = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(linked_forms, export.format_formobj(formobj, lang))
end
end
return linked_forms
end
local function get_name_form_displays(element, lang)
local forms = element and element.name
if not forms then
return {}
end
if type(forms) ~= "table" then
forms = {forms}
end
local displays = {}
for _, form in ipairs(forms) do
if type(form) == "string" then
local formobj = export.parse_form_and_modifiers(form)
insert(displays, {
formobj = formobj,
formatted = export.format_formobj(formobj, lang),
})
end
end
return displays
end
local function format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local symbol = get_element_symbol(element, atomic_number) or "?"
local name_displays = get_name_form_displays(element, lang)
local primary_idx = 1
if pagename then
for idx, item in ipairs(name_displays) do
if form_equals_pagename(item.formobj, pagename, lang) then
primary_idx = idx
break
end
end
end
local primary_name = #name_displays > 0 and name_displays[primary_idx].formatted or "—"
if primary_name_override and primary_name_override ~= "" then
primary_name = primary_name_override
end
local alternative_names = {}
for idx, item in ipairs(name_displays) do
if primary_name_override and primary_name_override ~= "" then
insert(alternative_names, item.formatted)
elseif idx ~= primary_idx then
insert(alternative_names, item.formatted)
end
end
return ("<span style=\"font-size: 260%%; line-height: 1; letter-spacing: 0.02em;\"><b>%s</b></span><br/>"
.. "<span style=\"font-size: 90%%; color: var(--wikt-palette-grey-50);\">Số nguyên tử %s</span><br/>"
.. "<span style=\"font-size: 115%%;\">%s</span>"):format(symbol, atomic_number, primary_name),
(#alternative_names > 0 and concat(alternative_names, ", ") or nil)
end
local function get_optional_science_fields(element)
local fields = {
{ key = "atomic_mass", label = "Khối lượng nguyên tử", full_label = "Khối lượng nguyên tử" },
{ key = "period", label = "Chu kỳ", full_label = "Chu kỳ" },
{ key = "group", label = "Nhóm", full_label = "Nhóm" },
{ key = "block", label = "Khối", full_label = "Khối" },
{ key = "element_class", label = "Lớp", full_label = "Lớp nguyên tố" },
{ key = "state_stp", label = "Trạng thái", full_label = "State at standard temperature and pressure" },
{ key = "density_g_cm3", label = "Khối lượng riêng (g/cm³)", full_label = "Khối lượng riêng (g/cm³)" },
{ key = "melting_point_k", label = "Nóng chảy (K)", full_label = "Điểm nóng chảy (K)" },
{ key = "boiling_point_k", label = "Sôi (K)", full_label = "Điểm sôi (K)" },
}
local out = {}
for _, field in ipairs(fields) do
local value = element and element[field.key]
if value ~= nil and value ~= "" then
if field.key == "block" then
local normalized = lower(tostring(value))
if normalized:match("^[spdfg]$") then
value = "khối " .. normalized
end
end
insert(out, { label = field.label, full_label = field.full_label or field.label, value = tostring(value) })
end
end
return out
end
local function render_classification_fields(classification_fields)
if not classification_fields or #classification_fields == 0 then
return nil
end
local lines = {
'<table style="width:100%; border-collapse:collapse; font-size:90%; line-height:1.2;">',
}
for _, field in ipairs(classification_fields) do
insert(lines, "<tr>")
insert(lines, ('<th title="%s" style="text-align:left; font-weight:600; padding:1px 6px 1px 0; white-space:nowrap; width:1%%;">%s</th>'):format(field.full_label, field.label))
insert(lines, ('<td style="text-align:right; padding:1px 0; word-break:break-word;">%s</td>'):format(field.value))
insert(lines, "</tr>")
end
insert(lines, "</table>")
return concat(lines, "\n")
end
local function format_adjacent_display(lang, element, atomic_number, direction)
if not element then
return "—"
end
local linked_forms = get_name_form_links(element, lang)
local linked_name = #linked_forms > 0 and concat(linked_forms, ", ") or (get_element_symbol(element, atomic_number) or "?")
local arrows = direction == "prev" and "← " or direction == "next" and " →" or ""
return ("<b>%s%s (%s)%s</b>"):format(
direction == "prev" and arrows or "",
linked_name,
get_element_symbol(element, atomic_number) or "?",
direction == "next" and arrows or ""
)
end
-- Implementation of {{chemical element box}}.
function export.show_box(frame)
local params = {
[1] = {required = true, type = "language", default = "und"},
[2] = true, -- atomic number or symbol
pagename = true,
type = true,
symbol = true,
}
local args = M.parameters.process(frame:getParent().args, params, nil, "Danh sách nguyên tó hóa học", "show_box")
local lang = args[1]
local langcode = lang:getCode()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local module_name = export.get_data_module_name(langcode)
local m_data = require(module_name)
if type(m_data.elements) ~= "table" then
error(("Module '%s' must export an `elements` table."):format(module_name))
end
local name_types = export.get_name_types(m_data)
local common_elements_data = M.common_elements_data and M.common_elements_data.elements or nil
local requested_type = args.type
local atomic_number = nil
local element = nil
local resolved_via_legacy_alias = false
local systematic_config = get_systematic_config(m_data, langcode)
if args[2] then
atomic_number, element = resolve_element_data(m_data, args[2], systematic_config)
elseif args.symbol then
atomic_number, element = resolve_element_data(m_data, args.symbol, systematic_config)
end
if element and requested_type and not element[requested_type] then
error(("The name type '%s' for element %s is not found in [[%s]]."):format(requested_type, atomic_number, module_name))
end
if not element then
local matches = lookup_element_by_form(lang, m_data, pagename, requested_type, name_types)
if #matches == 0 then
local title = mw.title.getCurrentTitle()
if langcode == "und" and title and title.nsText == "Bản_mẫu" then
local numbers = sorted_atomic_numbers(m_data)
if numbers[1] then
atomic_number = tostring(numbers[1])
element = m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]
end
end
if not element and systematic_config then
local systematic_number = parse_systematic_name_to_number(pagename, systematic_config)
if systematic_number then
atomic_number, element = resolve_element_data(m_data, systematic_number, systematic_config)
end
end
if not element then
local legacy_number = parse_legacy_systematic_alias_to_number(pagename, systematic_config)
if legacy_number then
atomic_number, element = resolve_element_data(m_data, legacy_number, systematic_config)
resolved_via_legacy_alias = element ~= nil
end
end
if not element then
error(("The page name '%s' does not match any known element in [[%s]]."):format(pagename, module_name))
end
else
local unique_numbers = {}
local number_list = {}
for _, match in ipairs(matches) do
local normalized_number = normalize_atomic_number(match[1])
if normalized_number and not unique_numbers[normalized_number] then
unique_numbers[normalized_number] = true
insert(number_list, normalized_number)
end
end
if #number_list > 1 then
error(("The page name '%s' matches multiple element entries in [[%s]] (atomic numbers: %s). Please specify 2= or symbol=."):format(
pagename, module_name, concat(number_list, ", ")))
end
local first_match = matches[1]
atomic_number = normalize_atomic_number(first_match[1])
element = atomic_number and (m_data.elements[atomic_number] or m_data.elements[tonumber(atomic_number)]) or nil
requested_type = requested_type or first_match[2]
end
end
if not atomic_number or not element then
error("Unable to resolve current element entry.")
end
element = merge_element_data(common_elements_data, atomic_number, element)
local formatted_forms = {}
for _, name_type in ipairs(name_types) do
local forms = element[name_type.key]
if forms then
local forms_list = type(forms) == "table" and forms or {forms}
local formatted = {}
local pagename_among_forms = false
for _, form in ipairs(forms_list) do
local formobj = export.parse_form_and_modifiers(form)
insert(formatted, export.format_formobj(formobj, lang))
if not pagename_among_forms and form_equals_pagename(formobj, pagename, lang) then
pagename_among_forms = true
requested_type = requested_type or name_type.key
end
end
local displayed_type = export.display_name_type(name_type)
if pagename_among_forms then
displayed_type = "'''" .. displayed_type .. "'''"
end
insert(formatted_forms, " ''" .. displayed_type .. "'': " .. concat(formatted, ", "))
end
end
local next_number, prev_number = get_next_and_prev_keys(m_data, atomic_number)
local next_element = nil
local prev_element = nil
if next_number then
_, next_element = resolve_element_data(m_data, next_number, systematic_config)
end
if prev_number then
_, prev_element = resolve_element_data(m_data, prev_number, systematic_config)
end
local prev_display = "Trước: " .. format_adjacent_display(lang, prev_element, prev_number, "prev")
local next_display = "Tiếp theo: " .. format_adjacent_display(lang, next_element, next_number, "next")
local primary_name_override = nil
if resolved_via_legacy_alias and type(pagename) == "string" and pagename ~= "" then
primary_name_override = export.format_formobj({ form = pagename }, lang)
end
local current_display, alternative_names_display = format_element_label(atomic_number, element, lang, pagename, primary_name_override)
local classification_fields = get_optional_science_fields(element)
local classification_fields_display = render_classification_fields(classification_fields)
local appendix_name = ("Nguyên tố hóa học của %s"):format(lang:getCanonicalName())
local appendix_title = mw.title.new(appendix_name, "Phụ_lục")
local header_link = appendix_title and appendix_title:getContent()
and ("[[Phụ lục:%s|Nguyên tố hóa học]]"):format(appendix_name)
or "[[nguyên tố hóa học]]"
local footer_line = nil
if element.wplink then
local langcode = lang:getCode()
footer_line = "| colspan=\"3\" style=\"text-align: center;\" | " ..
"[[w:" .. langcode .. ":|Wikipedia " .. lang:getCanonicalName() .. "]] có bài viết về " ..
M.links.full_link{
lang = lang,
term = "w:" .. langcode .. ":" .. element.wplink,
alt = element.wplink,
}
end
local edit_link = ' <sup>(<span class="plainlinks" style="text-transform: initial;">[' ..
tostring(mw.uri.fullUrl(module_name, { action = "edit" })) ..
" sửa]</span>)</sup>"
local lines = {
'{| class="floatright chemical-element-box" style="border:1px solid var(--border-color-base); border-collapse: collapse; min-width: 270px; background: var(--wikt-palette-white);color:inherit;"',
"|-",
'! style="font-size: 85%; letter-spacing: 0.03em; text-transform: uppercase; border-bottom: 1px solid var(--border-color-base,#AAA); padding: 6px 10px;" | ' .. header_link .. edit_link,
"|-",
'| style="text-align: center; padding: 10px 12px 8px 12px; vertical-align: middle;" | ' .. current_display,
}
if alternative_names_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.35;" | <b>Tên gọi khác</b>: ' .. alternative_names_display)
end
if classification_fields_display then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px; font-size: 90%; line-height: 1.4;" | '
.. '<div class="mw-collapsible mw-collapsed" data-expandtext="hiện" data-collapsetext="ẩn">'
.. '<div style="font-weight: 600;">Lớp phân loại</div>'
.. '<div class="mw-collapsible-content" style="margin-top: 4px;">'
.. classification_fields_display
.. "</div>"
.. "</div>")
end
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. prev_display)
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. next_display)
if footer_line then
insert(lines, "|-")
insert(lines, '| style="text-align: left; border-top: 1px solid var(--border-color-base); padding: 6px 10px;" | ' .. footer_line:gsub('^| colspan="3" style="text%-align: center;" | ', ""))
end
insert(lines, "|}")
local atomic_number_num = tonumber(atomic_number)
local data_entry = m_data.elements[atomic_number] or (atomic_number_num and m_data.elements[atomic_number_num] or nil)
local is_systematic_fallback_element = systematic_config
and atomic_number_num
and atomic_number_num > #UNIVERSAL_SYMBOLS
and not data_entry
local title_obj = mw.title.getCurrentTitle()
if langcode ~= "und" and title_obj and title_obj.nsText ~= "Bản_mẫu" then
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học]]"):format(langcode))
if is_systematic_fallback_element then
insert(lines, ("[[Thể loại:%s:Tên nguyên tố theo hệ thống]]"):format(langcode))
insert(lines, ("[[Thể loại:%s:Nguyên tố hóa học theo giả định]]"):format(langcode))
end
for _, subcat in ipairs(get_auto_subcategories(langcode, atomic_number, m_data)) do
insert(lines, subcat)
end
end
return concat(lines, "\n")
end
return export
mzuzn639eyjo5lsb643g33kh986okae
Mô đun:chemical element list/data/common
828
395004
2348909
2026-04-27T14:54:09Z
Hiyuune
50834
Trang mới: “local export = {} -- Source (primary dataset): -- PubChem [Internet]. Bethesda (MD): National Library of Medicine (US), -- National Center for Biotechnology Information; 2004-. -- Periodic Table of Elements; [cited 2026 Apr. 24]. -- Available from: https://pubchem.ncbi.nlm.nih.gov/periodic-table/ export.elements = { [1] = { period = 1, group = 1, block = "s", element_class = "nonmetal", }, [2] = { period = 1, group = 18, block = "p", element_class = "…”
2348909
Scribunto
text/plain
local export = {}
-- Source (primary dataset):
-- PubChem [Internet]. Bethesda (MD): National Library of Medicine (US),
-- National Center for Biotechnology Information; 2004-.
-- Periodic Table of Elements; [cited 2026 Apr. 24].
-- Available from: https://pubchem.ncbi.nlm.nih.gov/periodic-table/
export.elements = {
[1] = {
period = 1,
group = 1,
block = "s",
element_class = "nonmetal",
},
[2] = {
period = 1,
group = 18,
block = "p",
element_class = "noble gas",
},
[3] = {
period = 2,
group = 1,
block = "s",
element_class = "alkali metal",
},
[4] = {
period = 2,
group = 2,
block = "s",
element_class = "alkaline earth metal",
},
[5] = {
period = 2,
group = 13,
block = "p",
element_class = "metalloid",
},
[6] = {
period = 2,
group = 14,
block = "p",
element_class = "nonmetal",
},
[7] = {
period = 2,
group = 15,
block = "p",
element_class = "nonmetal",
},
[8] = {
period = 2,
group = 16,
block = "p",
element_class = "nonmetal",
},
[9] = {
period = 2,
group = 17,
block = "p",
element_class = "halogen",
},
[10] = {
period = 2,
group = 18,
block = "p",
element_class = "noble gas",
},
[11] = {
period = 3,
group = 1,
block = "s",
element_class = "alkali metal",
},
[12] = {
period = 3,
group = 2,
block = "s",
element_class = "alkaline earth metal",
},
[13] = {
period = 3,
group = 13,
block = "p",
element_class = "post-transition metal",
},
[14] = {
period = 3,
group = 14,
block = "p",
element_class = "metalloid",
},
[15] = {
period = 3,
group = 15,
block = "p",
element_class = "nonmetal",
},
[16] = {
period = 3,
group = 16,
block = "p",
element_class = "nonmetal",
},
[17] = {
period = 3,
group = 17,
block = "p",
element_class = "halogen",
},
[18] = {
period = 3,
group = 18,
block = "p",
element_class = "noble gas",
},
[19] = {
period = 4,
group = 1,
block = "s",
element_class = "alkali metal",
},
[20] = {
period = 4,
group = 2,
block = "s",
element_class = "alkaline earth metal",
},
[21] = {
period = 4,
group = 3,
block = "d",
element_class = "transition metal",
},
[22] = {
period = 4,
group = 4,
block = "d",
element_class = "transition metal",
},
[23] = {
period = 4,
group = 5,
block = "d",
element_class = "transition metal",
},
[24] = {
period = 4,
group = 6,
block = "d",
element_class = "transition metal",
},
[25] = {
period = 4,
group = 7,
block = "d",
element_class = "transition metal",
},
[26] = {
period = 4,
group = 8,
block = "d",
element_class = "transition metal",
},
[27] = {
period = 4,
group = 9,
block = "d",
element_class = "transition metal",
},
[28] = {
period = 4,
group = 10,
block = "d",
element_class = "transition metal",
},
[29] = {
period = 4,
group = 11,
block = "d",
element_class = "transition metal",
},
[30] = {
period = 4,
group = 12,
block = "d",
element_class = "transition metal",
},
[31] = {
period = 4,
group = 13,
block = "p",
element_class = "post-transition metal",
},
[32] = {
period = 4,
group = 14,
block = "p",
element_class = "metalloid",
},
[33] = {
period = 4,
group = 15,
block = "p",
element_class = "metalloid",
},
[34] = {
period = 4,
group = 16,
block = "p",
element_class = "nonmetal",
},
[35] = {
period = 4,
group = 17,
block = "p",
element_class = "halogen",
},
[36] = {
period = 4,
group = 18,
block = "p",
element_class = "noble gas",
},
[37] = {
period = 5,
group = 1,
block = "s",
element_class = "alkali metal",
},
[38] = {
period = 5,
group = 2,
block = "s",
element_class = "alkaline earth metal",
},
[39] = {
period = 5,
group = 3,
block = "d",
element_class = "transition metal",
},
[40] = {
period = 5,
group = 4,
block = "d",
element_class = "transition metal",
},
[41] = {
period = 5,
group = 5,
block = "d",
element_class = "transition metal",
},
[42] = {
period = 5,
group = 6,
block = "d",
element_class = "transition metal",
},
[43] = {
period = 5,
group = 7,
block = "d",
element_class = "transition metal",
natural_occurrence = "decay",
},
[44] = {
period = 5,
group = 8,
block = "d",
element_class = "transition metal",
},
[45] = {
period = 5,
group = 9,
block = "d",
element_class = "transition metal",
},
[46] = {
period = 5,
group = 10,
block = "d",
element_class = "transition metal",
},
[47] = {
period = 5,
group = 11,
block = "d",
element_class = "transition metal",
},
[48] = {
period = 5,
group = 12,
block = "d",
element_class = "transition metal",
},
[49] = {
period = 5,
group = 13,
block = "p",
element_class = "post-transition metal",
},
[50] = {
period = 5,
group = 14,
block = "p",
element_class = "post-transition metal",
},
[51] = {
period = 5,
group = 15,
block = "p",
element_class = "metalloid",
},
[52] = {
period = 5,
group = 16,
block = "p",
element_class = "metalloid",
},
[53] = {
period = 5,
group = 17,
block = "p",
element_class = "halogen",
},
[54] = {
period = 5,
group = 18,
block = "p",
element_class = "noble gas",
},
[55] = {
period = 6,
group = 1,
block = "s",
element_class = "alkali metal",
},
[56] = {
period = 6,
group = 2,
block = "s",
element_class = "alkaline earth metal",
},
[57] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[58] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[59] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[60] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[61] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
natural_occurrence = "decay",
},
[62] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[63] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[64] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[65] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[66] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[67] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[68] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[69] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[70] = {
period = 6,
group = 3,
block = "f",
element_class = "lanthanide",
},
[71] = {
period = 6,
group = 3,
block = "d",
element_class = "lanthanide",
},
[72] = {
period = 6,
group = 4,
block = "d",
element_class = "transition metal",
},
[73] = {
period = 6,
group = 5,
block = "d",
element_class = "transition metal",
},
[74] = {
period = 6,
group = 6,
block = "d",
element_class = "transition metal",
},
[75] = {
period = 6,
group = 7,
block = "d",
element_class = "transition metal",
},
[76] = {
period = 6,
group = 8,
block = "d",
element_class = "transition metal",
},
[77] = {
period = 6,
group = 9,
block = "d",
element_class = "transition metal",
},
[78] = {
period = 6,
group = 10,
block = "d",
element_class = "transition metal",
},
[79] = {
period = 6,
group = 11,
block = "d",
element_class = "transition metal",
},
[80] = {
period = 6,
group = 12,
block = "d",
element_class = "transition metal",
},
[81] = {
period = 6,
group = 13,
block = "p",
element_class = "post-transition metal",
},
[82] = {
period = 6,
group = 14,
block = "p",
element_class = "post-transition metal",
},
[83] = {
period = 6,
group = 15,
block = "p",
element_class = "post-transition metal",
},
[84] = {
period = 6,
group = 16,
block = "p",
element_class = "metalloid",
natural_occurrence = "decay",
},
[85] = {
period = 6,
group = 17,
block = "p",
element_class = "halogen",
natural_occurrence = "decay",
},
[86] = {
period = 6,
group = 18,
block = "p",
element_class = "noble gas",
natural_occurrence = "decay",
},
[87] = {
period = 7,
group = 1,
block = "s",
element_class = "alkali metal",
natural_occurrence = "decay",
},
[88] = {
period = 7,
group = 2,
block = "s",
element_class = "alkaline earth metal",
natural_occurrence = "decay",
},
[89] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "decay",
},
[90] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
},
[91] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "decay",
},
[92] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
},
[93] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "decay",
},
[94] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "decay",
},
[95] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[96] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[97] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[98] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[99] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[100] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[101] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[102] = {
period = 7,
group = 3,
block = "f",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[103] = {
period = 7,
group = 3,
block = "d",
element_class = "actinide",
natural_occurrence = "synthetic",
},
[104] = {
period = 7,
group = 4,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[105] = {
period = 7,
group = 5,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[106] = {
period = 7,
group = 6,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[107] = {
period = 7,
group = 7,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[108] = {
period = 7,
group = 8,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[109] = {
period = 7,
group = 9,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[110] = {
period = 7,
group = 10,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[111] = {
period = 7,
group = 11,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[112] = {
period = 7,
group = 12,
block = "d",
element_class = "transition metal",
natural_occurrence = "synthetic",
},
[113] = {
period = 7,
group = 13,
block = "p",
element_class = "post-transition metal",
natural_occurrence = "synthetic",
},
[114] = {
period = 7,
group = 14,
block = "p",
element_class = "post-transition metal",
natural_occurrence = "synthetic",
},
[115] = {
period = 7,
group = 15,
block = "p",
element_class = "post-transition metal",
natural_occurrence = "synthetic",
},
[116] = {
period = 7,
group = 16,
block = "p",
element_class = "post-transition metal",
natural_occurrence = "synthetic",
},
[117] = {
period = 7,
group = 17,
block = "p",
element_class = "halogen",
natural_occurrence = "synthetic",
},
[118] = {
period = 7,
group = 18,
block = "p",
element_class = "noble gas",
natural_occurrence = "synthetic",
},
}
return export
by0802nwu7zeaup3tjbwq4285hfjkqv
Mô đun:chemical element list/data/zh
828
395005
2348910
2026-04-27T14:55:29Z
Hiyuune
50834
Trang mới: “local export = {} export.elements = { [1] = { name = { "氫//", "水素//" } }, [2] = { name = "氦//" }, [3] = { name = "鋰//" }, [4] = { name = "鈹//" }, [5] = { name = "硼//" }, [6] = { name = { "碳//", "炭素//" } }, [7] = { name = { "氮//", "窒素//" } }, [8] = { name = { "氧//", "酸素//" } }, [9] = { name = "氟//" }, [10] = { name = "氖//" }, [11] = { name = "鈉//" }, [12] = { name = "鎂//" }, [13] = { name = "鋁//" }, [14] = { name = {…”
2348910
Scribunto
text/plain
local export = {}
export.elements = {
[1] = { name = { "氫//", "水素//" } },
[2] = { name = "氦//" },
[3] = { name = "鋰//" },
[4] = { name = "鈹//" },
[5] = { name = "硼//" },
[6] = { name = { "碳//", "炭素//" } },
[7] = { name = { "氮//", "窒素//" } },
[8] = { name = { "氧//", "酸素//" } },
[9] = { name = "氟//" },
[10] = { name = "氖//" },
[11] = { name = "鈉//" },
[12] = { name = "鎂//" },
[13] = { name = "鋁//" },
[14] = { name = { "矽//", "硅//" } },
[15] = { name = { "磷//", "燐//" } },
[16] = { name = { "硫//", "硫黃//", "磺//" } },
[17] = { name = { "氯//", "鹽素//" } },
[18] = { name = "氬//" },
[19] = { name = "鉀//" },
[20] = { name = "鈣//" },
[21] = { name = "鈧//" },
[22] = { name = "鈦//" },
[23] = { name = "釩//" },
[24] = { name = "鉻//" },
[25] = { name = "錳//" },
[26] = { name = { "鐵//", "鉄//", "銕//", "鐡//", "䥫//", "輕鐵//" } },
[27] = { name = "鈷//" },
[28] = { name = "鎳//" },
[29] = { name = "銅//" },
[30] = { name = "鋅//" },
[31] = { name = "鎵//" },
[32] = { name = "鍺//" },
[33] = { name = "砷//" },
[34] = { name = "硒//" },
[35] = { name = "溴//" },
[36] = { name = "氪//" },
[37] = { name = "銣//" },
[38] = { name = "鍶//" },
[39] = { name = "釔//" },
[40] = { name = "鋯//" },
[41] = { name = { "鈮//", "鈳//", "鎶//<qq:obsolete>" } },
[42] = { name = "鉬//" },
[43] = { name = { "鍀//", "鎝//" } },
[44] = { name = "釕//" },
[45] = { name = "銠//" },
[46] = { name = "鈀//" },
[47] = { name = { "銀//", "輕銀//" } },
[48] = { name = "鎘//" },
[49] = { name = "銦//" },
[50] = { name = { "錫//", "錫米//" } },
[51] = { name = "銻//" },
[52] = { name = "碲//" },
[53] = { name = "碘//" },
[54] = { name = { "氙//", "氥//" } },
[55] = { name = "銫//" },
[56] = { name = "鋇//" },
[57] = { name = "鑭//" },
[58] = { name = "鈰//" },
[59] = { name = "鐠//" },
[60] = { name = "釹//" },
[61] = { name = { "鉕//", "鐷//" } },
[62] = { name = "釤//" },
[63] = { name = "銪//" },
[64] = { name = "釓//" },
[65] = { name = "鋱//" },
[66] = { name = "鏑//" },
[67] = { name = { "鈥//", "錵//<qq:obsolete>" } },
[68] = { name = "鉺//" },
[69] = { name = "銩//" },
[70] = { name = "鐿//" },
[71] = { name = { "鑥//", "鎦//" } },
[72] = { name = "鉿//" },
[73] = { name = "鉭//" },
[74] = { name = "鎢//" },
[75] = { name = "錸//" },
[76] = { name = "鋨//" },
[77] = { name = "銥//" },
[78] = { name = "鉑//" },
[79] = { name = { "金//", "黃金//" } },
[80] = { name = "汞//" },
[81] = { name = "鉈//" },
[82] = { name = "鉛//" },
[83] = { name = "鉍//" },
[84] = { name = "釙//" },
[85] = { name = { "砹//", "砈//" } },
[86] = { name = "氡//" },
[87] = { name = { "鈁//", "鍅//" } },
[88] = { name = "鐳//" },
[89] = { name = "錒//" },
[90] = { name = "釷//" },
[91] = { name = "鏷//" },
[92] = { name = "鈾//" },
[93] = { name = { "鎿//", "錼//" } },
[94] = { name = { "鈈//", "鈽//" } },
[95] = { name = { "鎇//", "鋂//" } },
[96] = { name = "鋦//" },
[97] = { name = { "錇//", "鉳//" } },
[98] = { name = { "鐦//", "鉲//" } },
[99] = { name = { "鎄//", "鑀//" } },
[100] = { name = "鐨//" },
[101] = { name = "鍆//" },
[102] = { name = "鍩//" },
[103] = { name = "鐒//" },
[104] = { name = "鑪//" },
[105] = { name = "𨧀//" },
[106] = { name = "𨭎//" },
[107] = { name = { "𨨏//" } },
[108] = { name = "𨭆//" },
[109] = { name = { "䥑//" } },
[110] = { name = { "鐽//" } },
[111] = { name = { "錀//" } },
[112] = { name = { "鎶//" } },
[113] = { name = { "鉨//", "鿭//" } },
[114] = { name = { "鈇//", "𫓧//" } },
[115] = { name = { "鏌//", "𫟼//" } },
[116] = { name = "鉝//" },
[117] = { name = "鿬//" },
[118] = { name = "鿫//" },
}
return export
g0te8teeilpuvedf6kbmrdyjpvux1yf
2348927
2348910
2026-04-27T15:29:17Z
Hiyuune
50834
2348927
Scribunto
text/plain
local export = {}
export.elements = {
[1] = { name = { "氫//", "水素//" } },
[2] = { name = "氦//" },
[3] = { name = "鋰//" },
[4] = { name = "鈹//" },
[5] = { name = "硼//" },
[6] = { name = { "碳//", "炭素//" } },
[7] = { name = { "氮//", "窒素//" } },
[8] = { name = { "氧//", "酸素//" } },
[9] = { name = "氟//" },
[10] = { name = "氖//" },
[11] = { name = "鈉//" },
[12] = { name = "鎂//" },
[13] = { name = "鋁//" },
[14] = { name = { "矽//", "硅//" } },
[15] = { name = { "磷//", "燐//" } },
[16] = { name = { "硫//", "硫黃//", "磺//" } },
[17] = { name = { "氯//", "鹽素//" } },
[18] = { name = "氬//" },
[19] = { name = "鉀//" },
[20] = { name = "鈣//" },
[21] = { name = "鈧//" },
[22] = { name = "鈦//" },
[23] = { name = "釩//" },
[24] = { name = "鉻//" },
[25] = { name = "錳//" },
[26] = { name = { "鐵//", "鉄//", "銕//", "鐡//", "䥫//", "輕鐵//" } },
[27] = { name = "鈷//" },
[28] = { name = "鎳//" },
[29] = { name = "銅//" },
[30] = { name = "鋅//" },
[31] = { name = "鎵//" },
[32] = { name = "鍺//" },
[33] = { name = "砷//" },
[34] = { name = "硒//" },
[35] = { name = "溴//" },
[36] = { name = "氪//" },
[37] = { name = "銣//" },
[38] = { name = "鍶//" },
[39] = { name = "釔//" },
[40] = { name = "鋯//" },
[41] = { name = { "鈮//", "鈳//", "鎶//<qq:không còn dùng>" } },
[42] = { name = "鉬//" },
[43] = { name = { "鍀//", "鎝//" } },
[44] = { name = "釕//" },
[45] = { name = "銠//" },
[46] = { name = "鈀//" },
[47] = { name = { "銀//", "輕銀//" } },
[48] = { name = "鎘//" },
[49] = { name = "銦//" },
[50] = { name = { "錫//", "錫米//" } },
[51] = { name = "銻//" },
[52] = { name = "碲//" },
[53] = { name = "碘//" },
[54] = { name = { "氙//", "氥//" } },
[55] = { name = "銫//" },
[56] = { name = "鋇//" },
[57] = { name = "鑭//" },
[58] = { name = "鈰//" },
[59] = { name = "鐠//" },
[60] = { name = "釹//" },
[61] = { name = { "鉕//", "鐷//" } },
[62] = { name = "釤//" },
[63] = { name = "銪//" },
[64] = { name = "釓//" },
[65] = { name = "鋱//" },
[66] = { name = "鏑//" },
[67] = { name = { "鈥//", "錵//<qq:không còn dùng>" } },
[68] = { name = "鉺//" },
[69] = { name = "銩//" },
[70] = { name = "鐿//" },
[71] = { name = { "鑥//", "鎦//" } },
[72] = { name = "鉿//" },
[73] = { name = "鉭//" },
[74] = { name = "鎢//" },
[75] = { name = "錸//" },
[76] = { name = "鋨//" },
[77] = { name = "銥//" },
[78] = { name = "鉑//" },
[79] = { name = { "金//", "黃金//" } },
[80] = { name = "汞//" },
[81] = { name = "鉈//" },
[82] = { name = "鉛//" },
[83] = { name = "鉍//" },
[84] = { name = "釙//" },
[85] = { name = { "砹//", "砈//" } },
[86] = { name = "氡//" },
[87] = { name = { "鈁//", "鍅//" } },
[88] = { name = "鐳//" },
[89] = { name = "錒//" },
[90] = { name = "釷//" },
[91] = { name = "鏷//" },
[92] = { name = "鈾//" },
[93] = { name = { "鎿//", "錼//" } },
[94] = { name = { "鈈//", "鈽//" } },
[95] = { name = { "鎇//", "鋂//" } },
[96] = { name = "鋦//" },
[97] = { name = { "錇//", "鉳//" } },
[98] = { name = { "鐦//", "鉲//" } },
[99] = { name = { "鎄//", "鑀//" } },
[100] = { name = "鐨//" },
[101] = { name = "鍆//" },
[102] = { name = "鍩//" },
[103] = { name = "鐒//" },
[104] = { name = "鑪//" },
[105] = { name = "𨧀//" },
[106] = { name = "𨭎//" },
[107] = { name = { "𨨏//" } },
[108] = { name = "𨭆//" },
[109] = { name = { "䥑//" } },
[110] = { name = { "鐽//" } },
[111] = { name = { "錀//" } },
[112] = { name = { "鎶//" } },
[113] = { name = { "鉨//", "鿭//" } },
[114] = { name = { "鈇//", "𫓧//" } },
[115] = { name = { "鏌//", "𫟼//" } },
[116] = { name = "鉝//" },
[117] = { name = "鿬//" },
[118] = { name = "鿫//" },
}
return export
1bm01pzygzyr5etm1ks4j356vklfnfb
Mô đun:chemical element list/data/und
828
395006
2348912
2026-04-27T14:57:26Z
Hiyuune
50834
Trang mới: “local export = {} export.elements = { [1] = { symbol = "H", wplink = "Hydrogen", name = "hydrogen", }, } return export”
2348912
Scribunto
text/plain
local export = {}
export.elements = {
[1] = {
symbol = "H",
wplink = "Hydrogen",
name = "hydrogen",
},
}
return export
d9hsttpa3m020sx27onooqdj5toiuuj
Bản mẫu:chemical element box
10
395007
2348915
2026-04-27T15:00:48Z
Hiyuune
50834
Trang mới: “{{#invoke:chemical element list|show_box}}<noinclude>{{documentation}}</noinclude>”
2348915
wikitext
text/x-wiki
{{#invoke:chemical element list|show_box}}<noinclude>{{documentation}}</noinclude>
j0ykbtt4d76o2kojarvondbmyxzfxfk
thài
0
395008
2348921
2026-04-27T15:14:05Z
Hiyuune
50834
Trang mới: “=={{langname|nan-hbl}}== {{zh-see|鈦|poj}}”
2348921
wikitext
text/x-wiki
=={{langname|nan-hbl}}==
{{zh-see|鈦|poj}}
4aks3mtaiy93chnhps5ki3i3bkaktse
2348922
2348921
2026-04-27T15:14:23Z
Hiyuune
50834
/* Tiếng Mân Tuyền Chương */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2348922
wikitext
text/x-wiki
{{also|Thai|Thai.|Thaï|Thái|thai|thaï|thài|þai}}
=={{langname|nan-hbl}}==
{{zh-see|鈦|poj}}
tqswjwyih4nska9msn34tc3c30ek1mc
taai3
0
395009
2348923
2026-04-27T15:14:51Z
Hiyuune
50834
Trang mới: “=={{langname|yue}}== ==={{ĐM|pron}}=== {{Jyutping-IPA|taai3}} ==={{ĐM|rom}}=== {{yue-jyut}} # {{yue-jyutping of|太}} # {{yue-jyutping of|汰}} # {{yue-jyutping of|泰}} # {{yue-jyutping of|態}}”
2348923
wikitext
text/x-wiki
=={{langname|yue}}==
==={{ĐM|pron}}===
{{Jyutping-IPA|taai3}}
==={{ĐM|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|太}}
# {{yue-jyutping of|汰}}
# {{yue-jyutping of|泰}}
# {{yue-jyutping of|態}}
jr6yj9a3wo5f0dui0d3huzt2e8olcla
tai4
0
395010
2348924
2026-04-27T15:15:49Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|pron}}=== * {{audio|zh|Zh-tai4.ogg}} ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|tài}} =={{langname|yue}}== ==={{section|pron}}=== * {{IPA4|yue|/tʰɐi˩/}} ==={{section|rom}}=== {{yue-jyut}} # {{yue-jyutping of|㖒}} # {{yue-jyutping of|䔶}} # {{yue-jyutping of|䱱}} # {{yue-jyutping of|啼}} # {{yue-jyutping of|嗁}} # {{yue-jyutping of|堤}} # {{yue-jyutping of|崹}} # {{yue-jyutping of|提}} # {{yue-j…”
2348924
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|pron}}===
* {{audio|zh|Zh-tai4.ogg}}
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|tài}}
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA4|yue|/tʰɐi˩/}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|㖒}}
# {{yue-jyutping of|䔶}}
# {{yue-jyutping of|䱱}}
# {{yue-jyutping of|啼}}
# {{yue-jyutping of|嗁}}
# {{yue-jyutping of|堤}}
# {{yue-jyutping of|崹}}
# {{yue-jyutping of|提}}
# {{yue-jyutping of|緹}}
# {{yue-jyutping of|蹄}}
# {{yue-jyutping of|題}}
jcv9tnsw8p3s6gobp1rvkzwuqmtpm42
Mô đun:chemical element list/show
828
395011
2348925
2026-04-27T15:24:23Z
Hiyuune
50834
Trang mới: “local export = {} local M = require("Module:module loader").init({ require = { chemical_element_list = "Module:chemical element list", links = "Module:links", parameters = "Module:parameters", languages = "Module:languages", }, loadData = { common_elements_data = "Module:chemical element list/data/common", }, lazy = { array = function() return require("Module:array") end, }, }) local function format_plain_formobj(formobj, lang, options) if not fo…”
2348925
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
chemical_element_list = "Module:chemical element list",
links = "Module:links",
parameters = "Module:parameters",
languages = "Module:languages",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
lazy = {
array = function()
return require("Module:array")
end,
},
})
local function format_plain_formobj(formobj, lang, options)
if not formobj then
return " "
end
local term = formobj.link or formobj.form
local alt = options and options.alt
if not alt then
alt = formobj.alt
end
if not alt and formobj.link then
alt = formobj.form
end
return M.links.full_link {
lang = lang,
term = term,
alt = alt,
suppress_tr = true,
}
end
local function link_element_name(name_form, lang)
if not name_form then
return ""
end
local forms = type(name_form) == "table" and name_form or {name_form}
local formatted = {}
for _, form in ipairs(forms) do
local formobj = M.chemical_element_list.parse_form_and_modifiers(form)
table.insert(formatted, M.chemical_element_list.format_formobj(formobj, lang))
end
return table.concat(formatted, ", ")
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number in pairs(m_data.elements or {}) do
local numeric = tonumber(number)
if numeric then
table.insert(numbers, numeric)
end
end
table.sort(numbers)
return numbers
end
local function get_primary_term(name_form)
if type(name_form) == "table" then
return name_form[1]
end
return name_form
end
local function get_primary_formobj(name_form)
local primary_term = get_primary_term(name_form)
if type(primary_term) ~= "string" then
return nil
end
return M.chemical_element_list.parse_form_and_modifiers(primary_term)
end
local function get_primary_base_form(name_form)
local formobj = get_primary_formobj(name_form)
if formobj then
return formobj.form
end
local raw = get_primary_term(name_form)
return type(raw) == "string" and raw or ""
end
local function get_element_symbol(data, atomic_number)
return (type(data) == "table" and data.symbol) or M.chemical_element_list.get_universal_symbol(atomic_number) or "?"
end
local function merge_element_with_common(data, atomic_number)
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[atomic_number] or common_elements[tostring(atomic_number)]) or nil
if type(common_entry) ~= "table" then
return data
end
local merged = {}
for key, value in pairs(common_entry) do
merged[key] = value
end
if type(data) == "table" then
for key, value in pairs(data) do
merged[key] = value
end
end
return merged
end
local function block_style(block)
if block == "s" then
return "background-color: var(--wikt-palette-orange-2);color:inherit;"
elseif block == "p" then
return "background-color: var(--wikt-palette-yellow-3);color:inherit;"
elseif block == "d" then
return "background-color: var(--wikt-palette-cyan-2);color:inherit;"
else
return "background-color: var(--wikt-palette-green-4);color:inherit;"
end
end
local ASTERISK_ONE_MARKER = "[[File:Asterisks one.svg|class=skin-invert-image|14px|link=|alt=*]]"
local ASTERISK_TWO_MARKER = "[[File:Asterisks 2 (vertical).svg|class=skin-invert-image|14px|link=|alt=**]]"
local function border_style_for_element(data)
local occurrence = type(data) == "table" and data.natural_occurrence or nil
if occurrence == "decay" then
return "dashed"
end
if occurrence == "synthetic" then
return "dotted"
end
if occurrence == "primordial" then
return "solid"
end
return "solid"
end
local function get_element_with_fallback(elements, atomic_number)
local data = elements[atomic_number]
if data then
return merge_element_with_common(data, atomic_number), false
end
local fallback_data = merge_element_with_common(nil, atomic_number)
if fallback_data then
return fallback_data, true
end
return nil, true
end
local function render_periodic_element_cell(data, atomic_number, lang, is_missing)
if not data then
return " "
end
local block = data.block and tostring(data.block):lower() or nil
if not block or not block:match("^[spdf]$") then
return " "
end
local symbol = get_element_symbol(data, atomic_number)
local linked_symbol = symbol
local display_name = " "
local primary_term
if is_missing then
primary_term = get_primary_base_form(data.name)
else
local formobj = get_primary_formobj(data.name)
if formobj then
linked_symbol = format_plain_formobj(formobj, lang, { alt = symbol })
primary_term = formobj.form
display_name = format_plain_formobj(formobj, lang)
else
linked_symbol = symbol
primary_term = nil
end
end
local border = border_style_for_element(data)
return ('<span class="nounderlines"><span title="%s, %s" style="%s border-top: 2px %s var(--border-color-base); border-bottom: 2px %s var(--border-color-base); display: block; line-height: 1.1em; overflow: hidden; padding: 2px 0; text-align: center; vertical-align: bottom;">'
.. '<span style="display:block; color:var(--color-base); font-size:95%%; height:2.2em; line-height:1.1em; vertical-align:top;">%s</span>'
.. '<span style="color:var(--color-base); display:block;">%d</span>'
.. '<span style="display:block; font-size:112%%; font-weight:bold;">%s</span>'
.. '<span style="display:block; color:var(--color-base); font-size:95%%; height:1.1em; line-height:1.1em;">​</span>'
.. "</span></span>"):format(
symbol,
primary_term or "",
block_style(block),
border,
border,
display_name,
atomic_number,
linked_symbol
)
end
local function render_period_row(ins, label, segments, elements, lang)
ins("|-")
ins(("! style='text-align:center; white-space:nowrap;' | %s"):format(label))
for _, segment in ipairs(segments) do
if segment.type == "gap" then
ins(("| colspan=\"%d\" |"):format(segment.span))
elseif segment.type == "blank" then
ins("|")
elseif segment.type == "marker" then
ins('| style="text-align:center; vertical-align:middle; background:var(--wikt-palette-green-4);color:inherit;" | ' .. segment.text)
else
local n = segment.n
local data, is_missing = get_element_with_fallback(elements, n)
ins("| " .. render_periodic_element_cell(data, n, lang, is_missing))
end
end
end
local function print_periodic_table(lang, m_data)
local elements = {}
for number, data in pairs(m_data.elements or {}) do
local n = tonumber(number)
if n then
elements[n] = data
end
end
local parts = {}
local function ins(text)
table.insert(parts, text)
end
ins('<div style="background: var(--wikt-palette-white);color:inherit; font-size:90%; border:1px solid var(--border-color-base); width:100%; max-width:1800px; margin:0 auto; padding:2px; text-align:center; vertical-align:top; box-sizing: border-box; clear: both">')
ins('<div style="background:; padding:2px 1em;font-weight:bold;"><div class="navbar-ct-mini">[[periodic table|Periodic table]]</div></div>')
ins('<div class="mw-collapsible-content" style="display:block;">')
ins('{| style="border-spacing:1px;display:block;overflow:auto;width:100%;margin:0 !important"')
ins('|- style="line-height:125%; vertical-align:top;"')
ins('! style="text-align:center; width:5%" | Nhóm')
ins('! style="background:var(--wikt-palette-lightgrey);color:inherit; width:5%; text-align:center;" | 1')
ins('! style="background:var(--wikt-palette-lightergrey);color:inherit; width:5%; text-align:center;" | 2')
ins('! style="width:2%" | ')
for g = 3, 18 do
ins(('! style="background:%s; width:5%%; text-align:center;" | %d'):format(g % 2 == 1 and "var(--wikt-palette-lightgrey);color:inherit;" or "var(--wikt-palette-lightergrey);color:inherit;", g))
end
ins('|- style="line-height:125%; vertical-align:top;color:inherit;"')
ins("| ")
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Hydrogen &<br/>alkali metals')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Alkaline earth metals')
ins("|")
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" |')
for g = 4, 12 do
ins(('| style="background:%s;" |'):format(g % 2 == 1 and "var(--wikt-palette-lightgrey);color:inherit;" or "var(--wikt-palette-lightergrey);color:inherit;"))
end
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Triels')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Tetrels')
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Pnicto­gens')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Chal­co­gens')
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Halo­gens')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Noble<br/>gases')
render_period_row(ins, "Period<br/>1", {
{ n = 1 }, { type = "gap", span = 17 }, { n = 2 },
}, elements, lang)
render_period_row(ins, "2", {
{ n = 3 }, { n = 4 }, { type = "gap", span = 11 }, { n = 5 }, { n = 6 }, { n = 7 }, { n = 8 }, { n = 9 }, { n = 10 },
}, elements, lang)
render_period_row(ins, "3", {
{ n = 11 }, { n = 12 }, { type = "gap", span = 11 }, { n = 13 }, { n = 14 }, { n = 15 }, { n = 16 }, { n = 17 }, { n = 18 },
}, elements, lang)
render_period_row(ins, "4", {
{ n = 19 }, { n = 20 }, { type = "blank" }, { n = 21 }, { n = 22 }, { n = 23 }, { n = 24 }, { n = 25 }, { n = 26 }, { n = 27 }, { n = 28 },
{ n = 29 }, { n = 30 }, { n = 31 }, { n = 32 }, { n = 33 }, { n = 34 }, { n = 35 }, { n = 36 },
}, elements, lang)
render_period_row(ins, "5", {
{ n = 37 }, { n = 38 }, { type = "blank" }, { n = 39 }, { n = 40 }, { n = 41 }, { n = 42 }, { n = 43 }, { n = 44 }, { n = 45 }, { n = 46 },
{ n = 47 }, { n = 48 }, { n = 49 }, { n = 50 }, { n = 51 }, { n = 52 }, { n = 53 }, { n = 54 },
}, elements, lang)
render_period_row(ins, "6", {
{ n = 55 }, { n = 56 }, { type = "marker", text = ASTERISK_ONE_MARKER }, { n = 71 }, { n = 72 }, { n = 73 }, { n = 74 }, { n = 75 }, { n = 76 },
{ n = 77 }, { n = 78 }, { n = 79 }, { n = 80 }, { n = 81 }, { n = 82 }, { n = 83 }, { n = 84 }, { n = 85 }, { n = 86 },
}, elements, lang)
render_period_row(ins, "7", {
{ n = 87 }, { n = 88 }, { type = "marker", text = ASTERISK_TWO_MARKER }, { n = 103 }, { n = 104 }, { n = 105 }, { n = 106 }, { n = 107 }, { n = 108 },
{ n = 109 }, { n = 110 }, { n = 111 }, { n = 112 }, { n = 113 }, { n = 114 }, { n = 115 }, { n = 116 }, { n = 117 }, { n = 118 },
}, elements, lang)
ins("|-")
ins('| colspan="20" style="height:1.4em;" |')
ins("|-")
ins("|")
ins("|")
ins("|")
ins('| style="text-align:center; vertical-align:middle; background:var(--wikt-palette-green-4);color:inherit;" | ' .. ASTERISK_ONE_MARKER)
for n = 57, 70 do
local data, is_missing = get_element_with_fallback(elements, n)
ins("| " .. render_periodic_element_cell(data, n, lang, is_missing))
end
ins("|")
ins("| ")
ins("|-")
ins('| colspan="3" |')
ins('| style="text-align:center; vertical-align:middle; background:var(--wikt-palette-green-4);color:inherit;" | ' .. ASTERISK_TWO_MARKER)
for n = 89, 102 do
local data, is_missing = get_element_with_fallback(elements, n)
ins("| " .. render_periodic_element_cell(data, n, lang, is_missing))
end
ins("|")
ins("|}")
ins('<div id="Periodic_table_legend_for_category"></div>')
ins('<div role="presentation" id="periodic-table-legend" style="border: 1px solid var(--border-color-base); width:100%; line-height:120%; text-align:center; vertical-align:top; background:var(--wikt-palette-white); color:inherit; margin:0; font-size:100%;">')
ins('<div style="padding:0.3em;">')
ins('<span style="text-align:center;display:inline-block; width:8em; border-top:2px solid var(--border-color-base); border-bottom:2px solid var(--border-color-base); background:var(--wikt-palette-lightgrey);color:inherit;">Primordial</span> ')
ins('<span style="text-align:center;display:inline-block; width:8em; border-top:2px dashed var(--border-color-base); border-bottom:2px dashed var(--border-color-base); background:var(--wikt-palette-lightgrey);color:inherit;">From decay</span> ')
ins('<span style="text-align:center;display:inline-block; width:8em; border-top:2px dotted var(--border-color-base); border-bottom:2px dotted var(--border-color-base); background:var(--wikt-palette-lightgrey);color:inherit;">Synthetic</span> ')
ins('<span class="nowrap"><b>Border</b> shows natural occurrence of the element</span>')
ins('</div>')
ins('<div style="border-top: 1px solid var(--border-color-base);padding:0.3em;">')
ins('<table style="width:100%; line-height:1.2em; table-layout:fixed; overflow:hidden; text-align:center;"><tr>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-orange-2);color:inherit;">s-block</td>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-green-4);color:inherit;">f-block</td>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-cyan-2);color:inherit;">d-block</td>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-yellow-3);color:inherit;">p-block</td>')
ins('</tr></table></div></div>')
ins("</div></div>")
return table.concat(parts, "\n")
end
local function print_full_table(lang, m_data)
local output = M.array()
local function header(content)
output:insert(("! %s"):format(content))
end
local function cell(content)
output:insert(("| %s"):format(content or ""))
end
local function row()
output:insert("|-")
end
local data_module_name = M.chemical_element_list.get_data_module_name(lang:getCode())
if data_module_name then
output:insert('<div class="floatright"><sup>(<span class="plainlinks">[' ..
tostring(mw.uri.fullUrl(data_module_name, { action = "edit" })) ..
" sửa]</span>)</sup></div>")
end
output:insert('{| class="wikitable"')
header("Số nguyên tử")
header("Ký tự")
header("Tên")
header("Liên kết Wikipedia")
for _, atomic_number in ipairs(sorted_atomic_numbers(m_data)) do
local key = tostring(atomic_number)
local data = m_data.elements[key] or m_data.elements[atomic_number]
row()
cell(atomic_number)
cell(data and get_element_symbol(data, atomic_number) or "")
cell(data and link_element_name(data.name, lang) or "")
if data and data.wplink then
cell(("[[w:%s:%s|%s]]"):format(lang:getCode(), data.wplink, data.wplink))
else
cell("")
end
end
output:insert("|}")
return output:concat("\n")
end
local function get_appendix_categories(lang)
local title = mw.title.getCurrentTitle()
if not title or title.nsText ~= "Phụ_lục" then
return ""
end
local canonical_name = lang:getCanonicalName()
local expected_title = ("Nguyên tố hóa học của %s"):format(canonical_name)
if title.text ~= expected_title then
return ""
end
return table.concat({
("[[Thể loại:Phụ lục %s|Nguyên tố hóa học]]"):format(canonical_name),
("[[Thể loại:Phụ lục nguyên tố hóa học|%s]]"):format(canonical_name),
}, "")
end
function export.element_table(frame)
local params = {
[1] = { required = true, default = "und" },
[2] = { required = true, default = "periodic" },
}
local args = M.parameters.process(frame:getParent().args, params)
local langcode = args[1]
local mode = args[2]
local lang = M.languages.getByCode(langcode, 1, true)
local data_module_name = M.chemical_element_list.get_data_module_name(langcode)
local m_data = require(data_module_name)
if mode == "full" then
return print_full_table(lang, m_data) .. get_appendix_categories(lang)
end
return print_periodic_table(lang, m_data) .. get_appendix_categories(lang)
end
-- Called from [[Module:documentation/functions/chemical element list]].
function export.table(frame)
local language_code
local mode
if type(frame) == "table" and frame.args then
language_code = frame.args[1]
mode = frame.args[2]
end
local module_name
if language_code then
module_name = M.chemical_element_list.get_data_module_name(language_code)
else
module_name = mw.title.getCurrentTitle().fullText
local suffix = module_name:match("^Mô đun:chemical element list/data/(.+)$")
language_code = suffix and (suffix:match("^([^/]+)/sandbox$") or suffix) or nil
if not language_code then
error("No language code in title or in parameter 1.")
end
module_name = M.chemical_element_list.get_data_module_name(language_code)
if language_code == "und" then
return
end
end
local lang = M.languages.getByCode(language_code, true, true)
local m_data = require(module_name)
return print_full_table(lang, m_data)
end
return export
po8zepwvt8nd0nle7ipl72miz1bd0bl
2348934
2348925
2026-04-27T15:43:12Z
TheHighFighter2
42988
2348934
Scribunto
text/plain
local export = {}
local M = require("Module:module loader").init({
require = {
chemical_element_list = "Module:chemical element list",
links = "Module:links",
parameters = "Module:parameters",
languages = "Module:languages",
},
loadData = {
common_elements_data = "Module:chemical element list/data/common",
},
lazy = {
array = function()
return require("Module:array")
end,
},
})
local function format_plain_formobj(formobj, lang, options)
if not formobj then
return " "
end
local term = formobj.link or formobj.form
local alt = options and options.alt
if not alt then
alt = formobj.alt
end
if not alt and formobj.link then
alt = formobj.form
end
return M.links.full_link {
lang = lang,
term = term,
alt = alt,
suppress_tr = true,
}
end
local function link_element_name(name_form, lang)
if not name_form then
return ""
end
local forms = type(name_form) == "table" and name_form or {name_form}
local formatted = {}
for _, form in ipairs(forms) do
local formobj = M.chemical_element_list.parse_form_and_modifiers(form)
table.insert(formatted, M.chemical_element_list.format_formobj(formobj, lang))
end
return table.concat(formatted, ", ")
end
local function sorted_atomic_numbers(m_data)
local numbers = {}
for number in pairs(m_data.elements or {}) do
local numeric = tonumber(number)
if numeric then
table.insert(numbers, numeric)
end
end
table.sort(numbers)
return numbers
end
local function get_primary_term(name_form)
if type(name_form) == "table" then
return name_form[1]
end
return name_form
end
local function get_primary_formobj(name_form)
local primary_term = get_primary_term(name_form)
if type(primary_term) ~= "string" then
return nil
end
return M.chemical_element_list.parse_form_and_modifiers(primary_term)
end
local function get_primary_base_form(name_form)
local formobj = get_primary_formobj(name_form)
if formobj then
return formobj.form
end
local raw = get_primary_term(name_form)
return type(raw) == "string" and raw or ""
end
local function get_element_symbol(data, atomic_number)
return (type(data) == "table" and data.symbol) or M.chemical_element_list.get_universal_symbol(atomic_number) or "?"
end
local function merge_element_with_common(data, atomic_number)
local common_elements = M.common_elements_data and M.common_elements_data.elements or nil
local common_entry = common_elements and (common_elements[atomic_number] or common_elements[tostring(atomic_number)]) or nil
if type(common_entry) ~= "table" then
return data
end
local merged = {}
for key, value in pairs(common_entry) do
merged[key] = value
end
if type(data) == "table" then
for key, value in pairs(data) do
merged[key] = value
end
end
return merged
end
local function block_style(block)
if block == "s" then
return "background-color: var(--wikt-palette-orange-2);color:inherit;"
elseif block == "p" then
return "background-color: var(--wikt-palette-yellow-3);color:inherit;"
elseif block == "d" then
return "background-color: var(--wikt-palette-cyan-2);color:inherit;"
else
return "background-color: var(--wikt-palette-green-4);color:inherit;"
end
end
local ASTERISK_ONE_MARKER = "[[File:Asterisks one.svg|class=skin-invert-image|14px|link=|alt=*]]"
local ASTERISK_TWO_MARKER = "[[File:Asterisks 2 (vertical).svg|class=skin-invert-image|14px|link=|alt=**]]"
local function border_style_for_element(data)
local occurrence = type(data) == "table" and data.natural_occurrence or nil
if occurrence == "decay" then
return "dashed"
end
if occurrence == "synthetic" then
return "dotted"
end
if occurrence == "primordial" then
return "solid"
end
return "solid"
end
local function get_element_with_fallback(elements, atomic_number)
local data = elements[atomic_number]
if data then
return merge_element_with_common(data, atomic_number), false
end
local fallback_data = merge_element_with_common(nil, atomic_number)
if fallback_data then
return fallback_data, true
end
return nil, true
end
local function render_periodic_element_cell(data, atomic_number, lang, is_missing)
if not data then
return " "
end
local block = data.block and tostring(data.block):lower() or nil
if not block or not block:match("^[spdf]$") then
return " "
end
local symbol = get_element_symbol(data, atomic_number)
local linked_symbol = symbol
local display_name = " "
local primary_term
if is_missing then
primary_term = get_primary_base_form(data.name)
else
local formobj = get_primary_formobj(data.name)
if formobj then
linked_symbol = format_plain_formobj(formobj, lang, { alt = symbol })
primary_term = formobj.form
display_name = format_plain_formobj(formobj, lang)
else
linked_symbol = symbol
primary_term = nil
end
end
local border = border_style_for_element(data)
return ('<span class="nounderlines"><span title="%s, %s" style="%s border-top: 2px %s var(--border-color-base); border-bottom: 2px %s var(--border-color-base); display: block; line-height: 1.1em; overflow: hidden; padding: 2px 0; text-align: center; vertical-align: bottom;">'
.. '<span style="display:block; color:var(--color-base); font-size:95%%; height:2.2em; line-height:1.1em; vertical-align:top;">%s</span>'
.. '<span style="color:var(--color-base); display:block;">%d</span>'
.. '<span style="display:block; font-size:112%%; font-weight:bold;">%s</span>'
.. '<span style="display:block; color:var(--color-base); font-size:95%%; height:1.1em; line-height:1.1em;">​</span>'
.. "</span></span>"):format(
symbol,
primary_term or "",
block_style(block),
border,
border,
display_name,
atomic_number,
linked_symbol
)
end
local function render_period_row(ins, label, segments, elements, lang)
ins("|-")
ins(("! style='text-align:center; white-space:nowrap;' | %s"):format(label))
for _, segment in ipairs(segments) do
if segment.type == "gap" then
ins(("| colspan=\"%d\" |"):format(segment.span))
elseif segment.type == "blank" then
ins("|")
elseif segment.type == "marker" then
ins('| style="text-align:center; vertical-align:middle; background:var(--wikt-palette-green-4);color:inherit;" | ' .. segment.text)
else
local n = segment.n
local data, is_missing = get_element_with_fallback(elements, n)
ins("| " .. render_periodic_element_cell(data, n, lang, is_missing))
end
end
end
local function print_periodic_table(lang, m_data)
local elements = {}
for number, data in pairs(m_data.elements or {}) do
local n = tonumber(number)
if n then
elements[n] = data
end
end
local parts = {}
local function ins(text)
table.insert(parts, text)
end
ins('<div style="background: var(--wikt-palette-white);color:inherit; font-size:90%; border:1px solid var(--border-color-base); width:100%; max-width:1800px; margin:0 auto; padding:2px; text-align:center; vertical-align:top; box-sizing: border-box; clear: both">')
ins('<div style="background:; padding:2px 1em;font-weight:bold;"><div class="navbar-ct-mini">[[periodic table|Periodic table]]</div></div>')
ins('<div class="mw-collapsible-content" style="display:block;">')
ins('{| style="border-spacing:1px;display:block;overflow:auto;width:100%;margin:0 !important"')
ins('|- style="line-height:125%; vertical-align:top;"')
ins('! style="text-align:center; width:5%" | Nhóm')
ins('! style="background:var(--wikt-palette-lightgrey);color:inherit; width:5%; text-align:center;" | 1')
ins('! style="background:var(--wikt-palette-lightergrey);color:inherit; width:5%; text-align:center;" | 2')
ins('! style="width:2%" | ')
for g = 3, 18 do
ins(('! style="background:%s; width:5%%; text-align:center;" | %d'):format(g % 2 == 1 and "var(--wikt-palette-lightgrey);color:inherit;" or "var(--wikt-palette-lightergrey);color:inherit;", g))
end
ins('|- style="line-height:125%; vertical-align:top;color:inherit;"')
ins("| ")
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Hydrogen &<br/>alkali metals')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Alkaline earth metals')
ins("|")
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" |')
for g = 4, 12 do
ins(('| style="background:%s;" |'):format(g % 2 == 1 and "var(--wikt-palette-lightgrey);color:inherit;" or "var(--wikt-palette-lightergrey);color:inherit;"))
end
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Triels')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Tetrels')
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Pnicto­gens')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Chal­co­gens')
ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Halo­gens')
ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Noble<br/>gases')
render_period_row(ins, "Period<br/>1", {
{ n = 1 }, { type = "gap", span = 17 }, { n = 2 },
}, elements, lang)
render_period_row(ins, "2", {
{ n = 3 }, { n = 4 }, { type = "gap", span = 11 }, { n = 5 }, { n = 6 }, { n = 7 }, { n = 8 }, { n = 9 }, { n = 10 },
}, elements, lang)
render_period_row(ins, "3", {
{ n = 11 }, { n = 12 }, { type = "gap", span = 11 }, { n = 13 }, { n = 14 }, { n = 15 }, { n = 16 }, { n = 17 }, { n = 18 },
}, elements, lang)
render_period_row(ins, "4", {
{ n = 19 }, { n = 20 }, { type = "blank" }, { n = 21 }, { n = 22 }, { n = 23 }, { n = 24 }, { n = 25 }, { n = 26 }, { n = 27 }, { n = 28 },
{ n = 29 }, { n = 30 }, { n = 31 }, { n = 32 }, { n = 33 }, { n = 34 }, { n = 35 }, { n = 36 },
}, elements, lang)
render_period_row(ins, "5", {
{ n = 37 }, { n = 38 }, { type = "blank" }, { n = 39 }, { n = 40 }, { n = 41 }, { n = 42 }, { n = 43 }, { n = 44 }, { n = 45 }, { n = 46 },
{ n = 47 }, { n = 48 }, { n = 49 }, { n = 50 }, { n = 51 }, { n = 52 }, { n = 53 }, { n = 54 },
}, elements, lang)
render_period_row(ins, "6", {
{ n = 55 }, { n = 56 }, { type = "marker", text = ASTERISK_ONE_MARKER }, { n = 71 }, { n = 72 }, { n = 73 }, { n = 74 }, { n = 75 }, { n = 76 },
{ n = 77 }, { n = 78 }, { n = 79 }, { n = 80 }, { n = 81 }, { n = 82 }, { n = 83 }, { n = 84 }, { n = 85 }, { n = 86 },
}, elements, lang)
render_period_row(ins, "7", {
{ n = 87 }, { n = 88 }, { type = "marker", text = ASTERISK_TWO_MARKER }, { n = 103 }, { n = 104 }, { n = 105 }, { n = 106 }, { n = 107 }, { n = 108 },
{ n = 109 }, { n = 110 }, { n = 111 }, { n = 112 }, { n = 113 }, { n = 114 }, { n = 115 }, { n = 116 }, { n = 117 }, { n = 118 },
}, elements, lang)
ins("|-")
ins('| colspan="20" style="height:1.4em;" |')
ins("|-")
ins("|")
ins("|")
ins("|")
ins('| style="text-align:center; vertical-align:middle; background:var(--wikt-palette-green-4);color:inherit;" | ' .. ASTERISK_ONE_MARKER)
for n = 57, 70 do
local data, is_missing = get_element_with_fallback(elements, n)
ins("| " .. render_periodic_element_cell(data, n, lang, is_missing))
end
ins("|")
ins("| ")
ins("|-")
ins('| colspan="3" |')
ins('| style="text-align:center; vertical-align:middle; background:var(--wikt-palette-green-4);color:inherit;" | ' .. ASTERISK_TWO_MARKER)
for n = 89, 102 do
local data, is_missing = get_element_with_fallback(elements, n)
ins("| " .. render_periodic_element_cell(data, n, lang, is_missing))
end
ins("|")
ins("|}")
ins('<div id="Periodic_table_legend_for_category"></div>')
ins('<div role="presentation" id="periodic-table-legend" style="border: 1px solid var(--border-color-base); width:100%; line-height:120%; text-align:center; vertical-align:top; background:var(--wikt-palette-white); color:inherit; margin:0; font-size:100%;">')
ins('<div style="padding:0.3em;">')
ins('<span style="text-align:center;display:inline-block; width:8em; border-top:2px solid var(--border-color-base); border-bottom:2px solid var(--border-color-base); background:var(--wikt-palette-lightgrey);color:inherit;">Primordial</span> ')
ins('<span style="text-align:center;display:inline-block; width:8em; border-top:2px dashed var(--border-color-base); border-bottom:2px dashed var(--border-color-base); background:var(--wikt-palette-lightgrey);color:inherit;">From decay</span> ')
ins('<span style="text-align:center;display:inline-block; width:8em; border-top:2px dotted var(--border-color-base); border-bottom:2px dotted var(--border-color-base); background:var(--wikt-palette-lightgrey);color:inherit;">Synthetic</span> ')
ins('<span class="nowrap"><b>Border</b> shows natural occurrence of the element</span>')
ins('</div>')
ins('<div style="border-top: 1px solid var(--border-color-base);padding:0.3em;">')
ins('<table style="width:100%; line-height:1.2em; table-layout:fixed; overflow:hidden; text-align:center;"><tr>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-orange-2);color:inherit;">s-block</td>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-green-4);color:inherit;">f-block</td>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-cyan-2);color:inherit;">d-block</td>')
ins('<td style="padding:0 1px; background:var(--wikt-palette-yellow-3);color:inherit;">p-block</td>')
ins('</tr></table></div></div>')
ins("</div></div>")
return table.concat(parts, "\n")
end
local function print_full_table(lang, m_data)
local output = M.array()
local function header(content)
output:insert(("! %s"):format(content))
end
local function cell(content)
output:insert(("| %s"):format(content or ""))
end
local function row()
output:insert("|-")
end
local data_module_name = M.chemical_element_list.get_data_module_name(lang:getCode())
if data_module_name then
output:insert('<div class="floatright"><sup>(<span class="plainlinks">[' ..
tostring(mw.uri.fullUrl(data_module_name, { action = "edit" })) ..
" sửa]</span>)</sup></div>")
end
output:insert('{| class="wikitable"')
header("Số nguyên tử")
header("Ký hiệu")
header("Tên")
header("Liên kết Wikipedia")
for _, atomic_number in ipairs(sorted_atomic_numbers(m_data)) do
local key = tostring(atomic_number)
local data = m_data.elements[key] or m_data.elements[atomic_number]
row()
cell(atomic_number)
cell(data and get_element_symbol(data, atomic_number) or "")
cell(data and link_element_name(data.name, lang) or "")
if data and data.wplink then
cell(("[[w:%s:%s|%s]]"):format(lang:getCode(), data.wplink, data.wplink))
else
cell("")
end
end
output:insert("|}")
return output:concat("\n")
end
local function get_appendix_categories(lang)
local title = mw.title.getCurrentTitle()
if not title or title.nsText ~= "Phụ_lục" then
return ""
end
local canonical_name = lang:getCanonicalName()
local expected_title = ("Nguyên tố hóa học của %s"):format(canonical_name)
if title.text ~= expected_title then
return ""
end
return table.concat({
("[[Thể loại:Phụ lục %s|Nguyên tố hóa học]]"):format(canonical_name),
("[[Thể loại:Phụ lục nguyên tố hóa học|%s]]"):format(canonical_name),
}, "")
end
function export.element_table(frame)
local params = {
[1] = { required = true, default = "und" },
[2] = { required = true, default = "periodic" },
}
local args = M.parameters.process(frame:getParent().args, params)
local langcode = args[1]
local mode = args[2]
local lang = M.languages.getByCode(langcode, 1, true)
local data_module_name = M.chemical_element_list.get_data_module_name(langcode)
local m_data = require(data_module_name)
if mode == "full" then
return print_full_table(lang, m_data) .. get_appendix_categories(lang)
end
return print_periodic_table(lang, m_data) .. get_appendix_categories(lang)
end
-- Called from [[Module:documentation/functions/chemical element list]].
function export.table(frame)
local language_code
local mode
if type(frame) == "table" and frame.args then
language_code = frame.args[1]
mode = frame.args[2]
end
local module_name
if language_code then
module_name = M.chemical_element_list.get_data_module_name(language_code)
else
module_name = mw.title.getCurrentTitle().fullText
local suffix = module_name:match("^Mô đun:chemical element list/data/(.+)$")
language_code = suffix and (suffix:match("^([^/]+)/sandbox$") or suffix) or nil
if not language_code then
error("No language code in title or in parameter 1.")
end
module_name = M.chemical_element_list.get_data_module_name(language_code)
if language_code == "und" then
return
end
end
local lang = M.languages.getByCode(language_code, true, true)
local m_data = require(module_name)
return print_full_table(lang, m_data)
end
return export
cqml3gj4mavoghlf20rp77xr9ypq2hj
না ফেরার দেশ
0
395012
2348928
2026-04-27T15:30:40Z
TheHighFighter2
42988
Trang mới: “=={{langname|bn}}== ==={{ĐM|etym}}=== {{literally|vùng đất không có ngày về}}. ==={{ĐM|noun}}=== {{bn-noun}} # {{lb|bn|euphemism}} [[thế giới bên kia|Thế giới bên kia]].”
2348928
wikitext
text/x-wiki
=={{langname|bn}}==
==={{ĐM|etym}}===
{{literally|vùng đất không có ngày về}}.
==={{ĐM|noun}}===
{{bn-noun}}
# {{lb|bn|euphemism}} [[thế giới bên kia|Thế giới bên kia]].
1pvwgks68qwjtu2878iodris73kvzgc
Mô đun:chemical element list/data/ja
828
395013
2348929
2026-04-27T15:31:54Z
Hiyuune
50834
Trang mới: “local export = {} export.elements = { [1] = { name = "水素" }, [2] = { name = "ヘリウム" }, [3] = { name = "リチウム" }, [4] = { name = "ベリリウム" }, [5] = { name = "ホウ素" }, [6] = { name = "炭素" }, [7] = { name = "窒素" }, [8] = { name = "酸素" }, [9] = { name = "フッ素" }, [10] = { name = "ネオン" }, [11] = { name = "ナトリウム" }, [12] = { name = "マグネシウム" }, [13] = { name = "アルミニウム" }, [14]…”
2348929
Scribunto
text/plain
local export = {}
export.elements = {
[1] = { name = "水素" },
[2] = { name = "ヘリウム" },
[3] = { name = "リチウム" },
[4] = { name = "ベリリウム" },
[5] = { name = "ホウ素" },
[6] = { name = "炭素" },
[7] = { name = "窒素" },
[8] = { name = "酸素" },
[9] = { name = "フッ素" },
[10] = { name = "ネオン" },
[11] = { name = "ナトリウム" },
[12] = { name = "マグネシウム" },
[13] = { name = "アルミニウム" },
[14] = { name = "ケイ素" },
[15] = { name = "リン" },
[16] = { name = "硫黄" },
[17] = { name = "塩素" },
[18] = { name = "アルゴン" },
[19] = { name = "カリウム" },
[20] = { name = "カルシウム" },
[21] = { name = "スカンジウム" },
[22] = { name = "チタン" },
[23] = { name = "バナジウム" },
[24] = { name = "クロム" },
[25] = { name = "マンガン" },
[26] = { name = "鉄" },
[27] = { name = "コバルト" },
[28] = { name = "ニッケル" },
[29] = { name = "銅" },
[30] = { name = "亜鉛" },
[31] = { name = "ガリウム" },
[32] = { name = "ゲルマニウム" },
[33] = { name = "ヒ素" },
[34] = { name = "セレン" },
[35] = { name = "臭素" },
[36] = { name = "クリプトン" },
[37] = { name = "ルビジウム" },
[38] = { name = "ストロンチウム" },
[39] = { name = "イットリウム" },
[40] = { name = "ジルコニウム" },
[41] = { name = "ニオブ" },
[42] = { name = "モリブデン" },
[43] = { name = "テクネチウム" },
[44] = { name = "ルテニウム" },
[45] = { name = "ロジウム" },
[46] = { name = "パラジウム" },
[47] = { name = "銀" },
[48] = { name = "カドミウム" },
[49] = { name = "インジウム" },
[50] = { name = "錫" },
[51] = { name = "アンチモン" },
[52] = { name = "テルル" },
[53] = { name = "ヨウ素" },
[54] = { name = "キセノン" },
[55] = { name = "セシウム" },
[56] = { name = "バリウム" },
[57] = { name = "ランタン" },
[58] = { name = "セリウム" },
[59] = { name = "プラセオジム" },
[60] = { name = "ネオジム" },
[61] = { name = "プロメチウム" },
[62] = { name = "サマリウム" },
[63] = { name = "ユウロピウム" },
[64] = { name = "ガドリニウム" },
[65] = { name = "テルビウム" },
[66] = { name = "ジスプロシウム" },
[67] = { name = "ホルミウム" },
[68] = { name = "エルビウム" },
[69] = { name = "ツリウム" },
[70] = { name = "イッテルビウム" },
[71] = { name = "ルテチウム" },
[72] = { name = "ハフニウム" },
[73] = { name = "タンタル" },
[74] = { name = "タングステン" },
[75] = { name = "レニウム" },
[76] = { name = "オスミウム" },
[77] = { name = "イリジウム" },
[78] = { name = "白金" },
[79] = { name = "金" },
[80] = { name = "水銀" },
[81] = { name = "タリウム" },
[82] = { name = "鉛" },
[83] = { name = "ビスマス" },
[84] = { name = "ポロニウム" },
[85] = { name = "アスタチン" },
[86] = { name = "ラドン" },
[87] = { name = "フランシウム" },
[88] = { name = "ラジウム" },
[89] = { name = "アクチニウム" },
[90] = { name = "トリウム" },
[91] = { name = "プロトアクチニウム" },
[92] = { name = "ウラン" },
[93] = { name = "ネプツニウム" },
[94] = { name = "プルトニウム" },
[95] = { name = "アメリシウム" },
[96] = { name = "キュリウム" },
[97] = { name = "バークリウム" },
[98] = { name = "カリホルニウム" },
[99] = { name = "アインスタイニウム" },
[100] = { name = "フェルミウム" },
[101] = { name = "メンデレビウム" },
[102] = { name = "ノーベリウム" },
[103] = { name = "ローレンシウム" },
[104] = { name = "ラザホージウム" },
[105] = { name = "ドブニウム" },
[106] = { name = "シーボーギウム" },
[107] = { name = "ボーリウム" },
[108] = { name = "ハッシウム" },
[109] = { name = "マイトネリウム" },
[110] = { name = "ダームスタチウム" },
[111] = { name = "レントゲニウム" },
[112] = { name = "コペルニシウム" },
[113] = { name = "ニホニウム" },
[114] = { name = "フレロビウム" },
[115] = { name = "モスコビウム" },
[116] = { name = "リバモリウム" },
[117] = { name = "テネシン" },
[118] = { name = "オガネソン" },
}
export.systematic_naming = {
suffix = "ウム",
replace_default_elisions = true,
elisions = {},
digit_data = {
["0"] = { symbol = "n", name = "ニル" },
["1"] = { symbol = "u", name = "ウン" },
["2"] = { symbol = "b", name = "ビ" },
["3"] = { symbol = "t", name = "トリ" },
["4"] = { symbol = "q", name = "クアド" },
["5"] = { symbol = "p", name = "ペント" },
["6"] = { symbol = "h", name = "ヘキシ" },
["7"] = { symbol = "s", name = "セプト" },
["8"] = { symbol = "o", name = "オクト" },
["9"] = { symbol = "e", name = "エン" },
},
}
return export
464akvj578w875zarjbr3ezvheir8j2
ヘリウム
0
395014
2348930
2026-04-27T15:34:22Z
Hiyuune
50834
Trang mới: “=={{langname|ja}}== {{chemical element box|ja}} {{wp|ja:}} [[File:He-TableImage.svg|thumb|250px|{{lang|ja|ヘリウム}} (''heriumu''): nguyên tố '''[[heli]]'''.]] ==={{section|etym}}=== Được vay mượn từ {{bor|ja|en|helium}},<ref>{{R:Kokugo Dai Jiten}}</ref><ref name="DJR">{{R:Daijirin}}</ref><ref>{{R:Daijisen}}</ref> {{bor|ja|de|Helium}},<ref name="SMK5">{{R:Shinmeikai5}}</ref> từ {{der|ja|la-new|helium}}. ==={{section|pron}}=== {{ja-pron|acc=2|acc_ref=DJ…”
2348930
wikitext
text/x-wiki
=={{langname|ja}}==
{{chemical element box|ja}}
{{wp|ja:}}
[[File:He-TableImage.svg|thumb|250px|{{lang|ja|ヘリウム}} (''heriumu''): nguyên tố '''[[heli]]'''.]]
==={{section|etym}}===
Được vay mượn từ {{bor|ja|en|helium}},<ref>{{R:Kokugo Dai Jiten}}</ref><ref name="DJR">{{R:Daijirin}}</ref><ref>{{R:Daijisen}}</ref> {{bor|ja|de|Helium}},<ref name="SMK5">{{R:Shinmeikai5}}</ref> từ {{der|ja|la-new|helium}}.
==={{section|pron}}===
{{ja-pron|acc=2|acc_ref=DJR,SMK5,NHK}}
==={{section|n}}===
{{ja-noun}}
# [[heli|Heli]].
#: {{ja-usex|'''ヘリウム'''気%球|'''ヘリウム''' き%きゅう|Bóng bay khí '''heli'''.}}
==={{section|ref}}===
<references/>
{{topics|ja|Khí hiếm}}
me5wltaukyf4ncgxy0k0s2vj2xgkjet
2348932
2348930
2026-04-27T15:35:21Z
Hiyuune
50834
/* Tiếng Nhật */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2348932
wikitext
text/x-wiki
=={{langname|ja}}==
{{chemical element box|ja}}
{{wp|ja:}}
[[File:He-TableImage.svg|thumb|250px|{{lang|ja|ヘリウム}} (''heriumu''): nguyên tố '''[[heli]]'''.]]
==={{section|etym}}===
Được vay mượn từ {{bor|ja|en|helium}},<ref>{{R:Kokugo Dai Jiten}}</ref><ref name="DJR">{{R:Daijirin}}</ref><ref>{{R:Daijisen}}</ref> {{bor|ja|de|Helium}},<ref name="SMK5">{{R:Shinmeikai5}}</ref> từ {{der|ja|la-new|helium}}.
==={{section|pron}}===
{{ja-pron|acc=2|acc_ref=DJR,SMK5,NHK}}
==={{section|n}}===
{{ja-noun}}
# [[heli|Heli]].
#: {{ja-usex|'''ヘリウム'''気%球|'''ヘリウム''' き%きゅう|Bóng bay khí '''heli'''.}}
==={{section|ref}}===
<references/>
crrk79dh9m6amlkf7m0ibpra1py0zox
Thể loại:Bản mẫu liên kết tiếng Lyngngam
14
395015
2348936
2026-04-27T15:48:43Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348936
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Bảo trì mục từ tiếng Nicobar Trung
14
395016
2348938
2026-04-27T15:50:12Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348938
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Chữ cái tiếng Nicobar Trung
14
395017
2348940
2026-04-27T15:52:41Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348940
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Ký tự tiếng Nicobar Trung
14
395018
2348941
2026-04-27T15:52:59Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348941
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có ví dụ cách sử dụng tiếng Nicobar Nam
14
395019
2348942
2026-04-27T15:53:50Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348942
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ mang nghĩa không còn dùng tiếng Udihe
14
395020
2348943
2026-04-27T15:56:36Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348943
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ theo cách sử dụng tiếng Udihe
14
395021
2348945
2026-04-27T15:56:58Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348945
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Nhóm ngôn ngữ Udeghe
14
395022
2348947
2026-04-27T15:57:55Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348947
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Ký tự tiếng Udihe
14
395023
2348950
2026-04-27T15:59:46Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348950
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Chữ cái tiếng Nicobar Nam
14
395024
2348951
2026-04-27T16:00:25Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348951
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Ký tự tiếng Nicobar Nam
14
395025
2348952
2026-04-27T16:00:42Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348952
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có ví dụ cách sử dụng tiếng Nicobar Car
14
395026
2348953
2026-04-27T16:01:33Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348953
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Chữ cái tiếng Nicobar Car
14
395027
2348954
2026-04-27T16:01:53Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348954
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Ký tự tiếng Nicobar Car
14
395028
2348955
2026-04-27T16:02:09Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348955
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Chức năng ngữ nghĩa tiếng Udihe
14
395029
2348957
2026-04-27T16:12:59Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348957
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Danh từ tiếng Udihe
14
395030
2348958
2026-04-27T16:13:37Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348958
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Động vật khi nhỏ
14
395031
2348959
2026-04-27T16:14:11Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348959
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Danh sách chủ đề thuộc nhóm tập hợp
14
395032
2348960
2026-04-27T16:14:27Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348960
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Tất cả chủ đề
14
395033
2348961
2026-04-27T16:14:44Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348961
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Động vật
14
395034
2348962
2026-04-27T16:15:43Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348962
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Sinh vật
14
395035
2348963
2026-04-27T16:15:59Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348963
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Sự sống
14
395036
2348964
2026-04-27T16:16:16Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348964
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Tự nhiên
14
395037
2348965
2026-04-27T16:16:34Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348965
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Danh sách chủ đề thuộc nhóm liên quan
14
395038
2348966
2026-04-27T16:16:59Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348966
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Chó
14
395039
2348967
2026-04-27T16:17:35Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348967
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Họ Chó
14
395040
2348968
2026-04-27T16:17:52Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348968
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Bộ Ăn thịt
14
395041
2348969
2026-04-27T16:18:12Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348969
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Lớp Thú
14
395042
2348970
2026-04-27T16:18:22Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348970
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Phân ngành Có xương sống
14
395043
2348971
2026-04-27T16:18:42Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348971
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Ngành Dây sống
14
395044
2348972
2026-04-27T16:18:52Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348972
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Cây
14
395045
2348973
2026-04-27T16:19:32Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348973
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Thực vật
14
395046
2348974
2026-04-27T16:19:42Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348974
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ude:Danh sách chủ đề thuộc nhóm loại hình
14
395047
2348975
2026-04-27T16:19:59Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348975
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có cách phát âm IPA tiếng Teressa
14
395048
2348977
2026-04-27T16:25:24Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348977
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có ví dụ cách sử dụng tiếng Teressa
14
395049
2348978
2026-04-27T16:25:42Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348978
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Chữ cái tiếng Teressa
14
395050
2348979
2026-04-27T16:25:59Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348979
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Bảo trì mục từ tiếng Teressa
14
395051
2348980
2026-04-27T16:26:33Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348980
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Ký tự tiếng Teressa
14
395052
2348981
2026-04-27T16:27:02Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348981
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Chức năng ngữ nghĩa tiếng Teressa
14
395053
2348983
2026-04-27T16:27:48Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348983
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có chứa nhiều từ tiếng Teressa
14
395054
2348984
2026-04-27T16:28:12Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2348984
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
リチウム
0
395055
2348989
2026-04-28T01:04:38Z
Hiyuune
50834
Trang mới: “=={{langname|ja}}== {{chemical element box|ja}} {{wp|ja:}} {{wp|Lithium}} [[File:Li-TableImage.svg|thumb|250px|{{lang|ja|リチウム}} (''richiumu''): nguyên tố '''[[lithium]]'''.]] ==={{section|pron}}=== {{ja-pron|acc=2|acc_ref=SMK5,DJR}} ==={{section|noun}}=== {{ja-noun}} # [[lithium|Lithi]]. ===={{section|drv}}==== {{col|ja |{{ja-r|リチウム電%池|リチウム でん%ち}}: [[lithium battery|pin lithium]] |{{ja-r|リチウム爆%弾|リチウム ばく%だ…”
2348989
wikitext
text/x-wiki
=={{langname|ja}}==
{{chemical element box|ja}}
{{wp|ja:}}
{{wp|Lithium}}
[[File:Li-TableImage.svg|thumb|250px|{{lang|ja|リチウム}} (''richiumu''): nguyên tố '''[[lithium]]'''.]]
==={{section|pron}}===
{{ja-pron|acc=2|acc_ref=SMK5,DJR}}
==={{section|noun}}===
{{ja-noun}}
# [[lithium|Lithi]].
===={{section|drv}}====
{{col|ja
|{{ja-r|リチウム電%池|リチウム でん%ち}}: [[lithium battery|pin lithium]]
|{{ja-r|リチウム爆%弾|リチウム ばく%だん}}: bom lithium
|{{ja-r|リチウムイオン電%池|リチウム-イオン でん%ち}}, {{ja-r|リチウムイオンバッテリー|リチウム-イオン バッテリー}}: pin lithium-[[ion]]
|{{ja-r|リチウムポリマー電%池|リチウム ポリマー でん%ち}}, {{ja-r|リチウム ポリマー バッテリ}}: pin lithium [[polymer]]
}}
==={{section|ref}}===
<references/>
iusx6b2lyoqws0tfcl05ua39amn1sgv
二氧化鈦
0
395056
2348992
2026-04-28T01:44:12Z
Hiyuune
50834
Trang mới: “=={{langname|zh}}== {{zh-forms|s=二氧化钛}} {{wp|zh:}} ==={{section|pron}}=== {{zh-pron |m=èryǎnghuàtài |c=ji6 joeng5 faa3 taai3 |cat=n }} ==={{section|n}}=== {{head|zh|Danh từ}} # {{lb|zh|inorganic compound}} [[titanium dioxide]] ===={{section|syn}}==== * {{zh-l|鈦白}}”
2348992
wikitext
text/x-wiki
=={{langname|zh}}==
{{zh-forms|s=二氧化钛}}
{{wp|zh:}}
==={{section|pron}}===
{{zh-pron
|m=èryǎnghuàtài
|c=ji6 joeng5 faa3 taai3
|cat=n
}}
==={{section|n}}===
{{head|zh|Danh từ}}
# {{lb|zh|inorganic compound}} [[titanium dioxide]]
===={{section|syn}}====
* {{zh-l|鈦白}}
s4gqyl9ao3gkyvvk0hhzsg96tinjk3n
二氧化钛
0
395057
2348993
2026-04-28T01:44:31Z
Hiyuune
50834
Trang mới: “=={{langname|zh}}== {{zh-see|二氧化鈦}}”
2348993
wikitext
text/x-wiki
=={{langname|zh}}==
{{zh-see|二氧化鈦}}
t20umsd5p9uyo3vfbrg8cwlxsqbb7s6
釩
0
395058
2348995
2026-04-28T01:47:50Z
Hiyuune
50834
Trang mới: “{{also|钒}} {{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=167|rad=金|as=03|sn=11|four=87110|canj=CHNI|ids=⿰釒凡}} ===={{section|ref}}==== * {{Han ref|kx=1296.200|dkj=40179|dj=1800.060|hdz=64172.100|uh=91E9}} =={{langname|zh}}== {{zh-forms|s=钒}} ==={{section|glyph origin}}=== {{Han etym}} {{Han compound|金|凡|ls=psc|c1=s|c2=p|t1=kim loại}}. ==={{section|etym}} 1=== {{chemical element box|zh}} {{wp|zh:}} Từ {{bor|zh|la-new|v…”
2348995
wikitext
text/x-wiki
{{also|钒}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=金|as=03|sn=11|four=87110|canj=CHNI|ids=⿰釒凡}}
===={{section|ref}}====
* {{Han ref|kx=1296.200|dkj=40179|dj=1800.060|hdz=64172.100|uh=91E9}}
=={{langname|zh}}==
{{zh-forms|s=钒}}
==={{section|glyph origin}}===
{{Han etym}}
{{Han compound|金|凡|ls=psc|c1=s|c2=p|t1=kim loại}}.
==={{section|etym}} 1===
{{chemical element box|zh}}
{{wp|zh:}}
Từ {{bor|zh|la-new|vanadium|'''van'''adium}}.
===={{section|pron}}====
{{zh-pron
|m=fán
|c=faan4
|c-t=fan3
|h=gd=fan2
|mn=ml:hoân
|mn-t=huam5/huang5
|w=sh:6ve
|cat=n
}}
===={{section|dfn}}====
{{head|zh|Hanzi}}
# {{lb|zh|nguyên tố hóa học}} [[vanadium|Vanadi]].
===={{section|compound}}====
{{col3|zh|五氧化二釩|五氟化釩|四氯化釩}}
==={{section|etym}} 2===
===={{section|pron}}====
{{zh-pron
|m=fǎn
|mc=y
|oc=y
|cat=v,n
}}
===={{section|dfn}}====
{{head|zh|Hanzi}}
# {{lb|zh|hist-dict}} [[lướt qua|Lướt qua]]; [[chạm]] nhẹ; [[sờ]] nhẹ]].
# {{lb|zh|hist-dict}} [[bình|Bình]], [[chậu]], [[lọ]], [[thùng]].
==={{section|etym}} 3===
{{zh-see|䀀|v}}
bpfhru4uw51z0bhjft735kcf3pzp386
2349034
2348995
2026-04-28T05:17:25Z
TheHighFighter2
42988
/* Định nghĩa */
2349034
wikitext
text/x-wiki
{{also|钒}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=金|as=03|sn=11|four=87110|canj=CHNI|ids=⿰釒凡}}
===={{section|ref}}====
* {{Han ref|kx=1296.200|dkj=40179|dj=1800.060|hdz=64172.100|uh=91E9}}
=={{langname|zh}}==
{{zh-forms|s=钒}}
==={{section|glyph origin}}===
{{Han etym}}
{{Han compound|金|凡|ls=psc|c1=s|c2=p|t1=kim loại}}.
==={{section|etym}} 1===
{{chemical element box|zh}}
{{wp|zh:}}
Từ {{bor|zh|la-new|vanadium|'''van'''adium}}.
===={{section|pron}}====
{{zh-pron
|m=fán
|c=faan4
|c-t=fan3
|h=gd=fan2
|mn=ml:hoân
|mn-t=huam5/huang5
|w=sh:6ve
|cat=n
}}
===={{section|dfn}}====
{{head|zh|Hanzi}}
# {{lb|zh|nguyên tố hóa học}} [[vanadium|Vanadi]].
===={{section|compound}}====
{{col3|zh|五氧化二釩|五氟化釩|四氯化釩}}
==={{section|etym}} 2===
===={{section|pron}}====
{{zh-pron
|m=fǎn
|mc=y
|oc=y
|cat=v,n
}}
===={{section|dfn}}====
{{head|zh|Hanzi}}
# {{lb|zh|hist-dict}} [[lướt|Lướt]] qua; [[chạm]] nhẹ; [[sờ]] nhẹ.
# {{lb|zh|hist-dict}} [[bình|Bình]], [[chậu]], [[lọ]], [[thùng]].
==={{section|etym}} 3===
{{zh-see|䀀|v}}
m5osy59z2gbwg6hvcvvg9d5yk7cjt2u
hoân
0
395059
2348996
2026-04-28T01:48:22Z
Hiyuune
50834
Trang mới: “=={{langname|nan-hbl}}== {{zh-see|釩|poj}}”
2348996
wikitext
text/x-wiki
=={{langname|nan-hbl}}==
{{zh-see|釩|poj}}
olxtrqrcy4htykt8c701gejeommp2w0
a-lú-mih
0
395060
2348997
2026-04-28T01:50:38Z
Hiyuune
50834
Trang mới: “=={{langname|nan-hbl}}== ==={{section|etym}}=== Từ {{bor|nan-hbl|ja|-}} {{ja-r|アルミ}}. ==={{section|pron}}=== {{nan-hbl-pronunc|lk,sx,tp,yl,tn,kh,hc,tc:a-lú-mih}} ==={{section|n}}=== {{head|nan-hbl|Danh từ}} # {{lb|zh|Taiwan Hokkien}} [[nhôm|Nhôm]]. ===={{section|syn}}==== {{zh-dial|鋁}}”
2348997
wikitext
text/x-wiki
=={{langname|nan-hbl}}==
==={{section|etym}}===
Từ {{bor|nan-hbl|ja|-}} {{ja-r|アルミ}}.
==={{section|pron}}===
{{nan-hbl-pronunc|lk,sx,tp,yl,tn,kh,hc,tc:a-lú-mih}}
==={{section|n}}===
{{head|nan-hbl|Danh từ}}
# {{lb|zh|Taiwan Hokkien}} [[nhôm|Nhôm]].
===={{section|syn}}====
{{zh-dial|鋁}}
bmunptcwj8s11i2q8tm3fknqral9n7z
Mô đun:zh/data/dial-syn/鋁
828
395061
2348998
2026-04-28T01:51:28Z
Hiyuune
50834
Trang mới: “local export = {} export.list = { ["title"] = "", ["meaning"] = "nhôm", ["note"] = "", ["Classical"] = { "" }, ["Formal"] = { "鋁" }, ["Taxonomic"] = { "" }, ["Beijing"] = { "" }, ["Beijing-PG"] = { "" }, ["Beijing-MY"] = { "" }, ["Beijing-HR"] = { "" }, ["Beijing-YQ"] = { "" }, ["Beijing-CP"] = { "" }, ["Beijing-MTG"] = { "" }, ["Beijing-FS"] = { "" }, ["Taiwan"] = { "鋁" }, ["Tianjin-WQ"] = {…”
2348998
Scribunto
text/plain
local export = {}
export.list = {
["title"] = "",
["meaning"] = "nhôm",
["note"] = "",
["Classical"] = { "" },
["Formal"] = { "鋁" },
["Taxonomic"] = { "" },
["Beijing"] = { "" },
["Beijing-PG"] = { "" },
["Beijing-MY"] = { "" },
["Beijing-HR"] = { "" },
["Beijing-YQ"] = { "" },
["Beijing-CP"] = { "" },
["Beijing-MTG"] = { "" },
["Beijing-FS"] = { "" },
["Taiwan"] = { "鋁" },
["Tianjin-WQ"] = { "" },
["Langfang"] = { "" },
["Chengde"] = { "" },
["Ulan Hot"] = { "" },
["Tongliao"] = { "" },
["Chifeng"] = { "" },
["Hailar"] = { "" },
["Heihe"] = { "" },
["Nenjiang"] = { "" },
["Mohe"] = { "" },
["Qiqihar"] = { "" },
["Tailai"] = { "" },
["Jixian-HLJ"] = { "" },
["Lanxi-M"] = { "" },
["Boli"] = { "" },
["Jiayin"] = { "" },
["Muling"] = { "" },
["Dongning"] = { "" },
["Ning'an"] = { "" },
["Linkou"] = { "" },
["Zhaozhou"] = { "" },
["Zhaodong"] = { "" },
["Jixi-M"] = { "" },
["Mishan"] = { "" },
["Harbin"] = { "" },
["Shangzhi"] = { "" },
["Yingchengzi"] = { "" },
["Jiamusi"] = { "" },
["Tongjiang-M"] = { "" },
["Baicheng"] = { "" },
["Da'an"] = { "" },
["Songyuan"] = { "" },
["Changchun"] = { "" },
["Yushu"] = { "" },
["Jilin"] = { "" },
["Siping"] = { "" },
["Liaoyuan"] = { "" },
["Dunhua"] = { "" },
["Hunchun"] = { "" },
["Baishan"] = { "" },
["Tonghua"] = { "" },
["Shenyang"] = { "" },
["Anshan"] = { "" },
["Tieling"] = { "" },
["Jinzhou"] = { "" },
["Malaysia-M"] = { "" },
["Singapore-M"] = { "" },
["Taz"] = { "" },
["Tianjin"] = { "" },
["Tianjin-JZ"] = { "" },
["Tianjin-BD"] = { "" },
["Tianjin-NH"] = { "" },
["Tianjin-HG"] = { "" },
["Tianjin-TG"] = { "" },
["Tianjin-DG"] = { "" },
["Tianjin-JN"] = { "" },
["Tianjin-DL"] = { "" },
["Tianjin-JH"] = { "" },
["Tianjin-XQ"] = { "" },
["Tianjin-BC"] = { "" },
["Tangshan"] = { "" },
["Qinhuangdao"] = { "" },
["Cangzhou"] = { "" },
["Xianxian"] = { "" },
["Xianxian-XY"] = { "" },
["Baoding"] = { "" },
["Dingxing"] = { "" },
["Xiong'an"] = { "" },
["Shijiazhuang"] = { "" },
["Xingtai"] = { "" },
["Hengshui"] = { "" },
["Lijin"] = { "" },
["Binzhou"] = { "" },
["Wudi"] = { "" },
["Weicheng"] = { "" },
["Fangzi"] = { "" },
["Changle-WF"] = { "" },
["Shouguang"] = { "" },
["Rizhao"] = { "" },
["Wulian"] = { "" },
["Jinan"] = { "" },
["Zhangqiu"] = { "" },
["Liaocheng"] = { "" },
["Dezhou"] = { "" },
["Tai'an"] = { "" },
["Xintai"] = { "" },
["Zibo"] = { "" },
["Zichuan"] = { "" },
["Boshan"] = { "" },
["Yinan"] = { "" },
["Dalian"] = { "" },
["Dandong"] = { "" },
["Yantai"] = { "" },
["Muping"] = { "" },
["Laizhou"] = { "" },
["Weihai"] = { "" },
["Rongcheng"] = { "" },
["Qingdao"] = { "" },
["Hanting"] = { "" },
["Changyi"] = { "" },
["Gaomi"] = { "" },
["Zhucheng"] = { "" },
["Anqiu"] = { "" },
["Linqu"] = { "" },
["Qingzhou"] = { "" },
["Yishui"] = { "" },
["Hulin-XL"] = { "" },
["Linjiang"] = { "" },
["Ji'an-M"] = { "" },
["Luoyang"] = { "" },
["Luoning"] = { "" },
["Sanmenxia"] = { "" },
["Lingbao"] = { "" },
["Luohe"] = { "" },
["Zhumadian"] = { "" },
["Biyang"] = { "" },
["Zhoukou"] = { "" },
["Dancheng"] = { "" },
["Xuchang"] = { "" },
["Changge"] = { "" },
["Pingdingshan"] = { "" },
["Lushan-M"] = { "" },
["Nanyang"] = { "" },
["Xixia"] = { "" },
["Dengzhou"] = { "" },
["Zaozhuang"] = { "" },
["Ningyang"] = { "" },
["Jining-M"] = { "" },
["Linyi"] = { "" },
["Heze"] = { "" },
["Daming"] = { "" },
["Yuncheng"] = { "" },
["Wenxi"] = { "" },
["Longxing"] = { "" },
["Yongji"] = { "" },
["Wanrong"] = { "" },
["Ronghe"] = { "" },
["Linfen"] = { "" },
["Jixian"] = { "" },
["Huozhou"] = { "" },
["Hongtong"] = { "" },
["Shangqiu"] = { "" },
["Yongcheng"] = { "" },
["Yuanyang"] = { "" },
["Zhengzhou"] = { "" },
["Kaifeng"] = { "" },
["Lankao"] = { "" },
["Changyuan"] = { "" },
["Xunxian"] = { "" },
["Puyang"] = { "" },
["Fanxian"] = { "" },
["Xinyang"] = { "" },
["Gushi"] = { "" },
["Shangluo"] = { "" },
["Luonan"] = { "" },
["Danfeng"] = { "" },
["Shangnan"] = { "" },
["Shanyang"] = { "" },
["Zhen'an"] = { "" },
["Hanbin"] = { "" },
["Hanbin-XH"] = { "" },
["Baihe"] = { "" },
["Baihe-MP"] = { "" },
["Pingli"] = { "" },
["Xunyang"] = { "" },
["Lueyang"] = { "" },
["Mianxian"] = { "" },
["Yangxian"] = { "" },
["Xi'an"] = { "" },
["Weiyang"] = { "" },
["Baqiao"] = { "" },
["Yanliang"] = { "" },
["Lintong"] = { "" },
["Chang'an"] = { "" },
["Huyi"] = { "" },
["Gaoling"] = { "" },
["Zhouzhi"] = { "" },
["Lantian"] = { "" },
["Xianyang"] = { "" },
["Xingping"] = { "" },
["Wugong"] = { "" },
["Qianxian"] = { "" },
["Liquan"] = { "" },
["Jingyang"] = { "" },
["Sanyuan-M"] = { "" },
["Yongshou"] = { "" },
["Changwu"] = { "" },
["Tongchuan"] = { "" },
["Yaozhou"] = { "" },
["Yijun"] = { "" },
["Weinan"] = { "" },
["Weinan-HZ"] = { "" },
["Hancheng"] = { "" },
["Huayin"] = { "" },
["Tongguan"] = { "" },
["Dali-SX"] = { "" },
["Heyang"] = { "" },
["Chengcheng"] = { "" },
["Baishui"] = { "" },
["Pucheng-M"] = { "" },
["Fuping"] = { "" },
["Huanglong"] = { "" },
["Yichuan"] = { "" },
["Huangling"] = { "" },
["Luochuan"] = { "" },
["Fuxian"] = { "" },
["Dingbian"] = { "" },
["Baoji"] = { "" },
["Baoji-CC"] = { "" },
["Fengxiang"] = { "" },
["Qishan"] = { "" },
["Fufeng"] = { "" },
["Meixian-M"] = { "" },
["Taibai"] = { "" },
["Fengxian-SX"] = { "" },
["Qianyang"] = { "" },
["Longxian"] = { "" },
["Linyou"] = { "" },
["Tongxin"] = { "" },
["Yanchi"] = { "" },
["Guyuan"] = { "" },
["Xiji"] = { "" },
["Longde"] = { "" },
["Jingyuan"] = { "" },
["Tianshui"] = { "" },
["Xining"] = { "" },
["Menyuan"] = { "" },
["Yanqi"] = { "" },
["Xuzhou"] = { "" },
["Xuzhou-JW"] = { "" },
["Pizhou"] = { "" },
["Suining"] = { "" },
["Peixian"] = { "" },
["Xinyi-M"] = { "" },
["Fengxian-M"] = { "" },
["Suqian"] = { "" },
["Ganyu"] = { "" },
["Donghai"] = { "" },
["Fuyang"] = { "" },
["Bengbu"] = { "" },
["Suzhou-M"] = { "" },
["Huaibei"] = { "" },
["Bozhou"] = { "" },
["Guangde-QC"] = { "" },
["Qimen-AL-Jun"] = { "" },
["Anji-HN"] = { "" },
["Gansu-DG"] = { "" },
["Shaanxi-DG"] = { "" },
["Yinchuan"] = { "" },
["Wuzhong"] = { "" },
["Zhongwei"] = { "" },
["Bayanhot"] = { "" },
["Lanzhou"] = { "" },
["Jiuquan"] = { "" },
["Dunhuang"] = { "" },
["Shandan"] = { "" },
["Tianzhu"] = { "" },
["Hami"] = { "" },
["Changji"] = { "" },
["Ürümqi"] = { "" },
["Dabancheng-XG"] = { "" },
["Midong-CSZ"] = { "" },
["Ürümqi-BFG"] = { "" },
["Jimsar"] = { "" },
["Chengdu"] = { "" },
["Xindu"] = { "" },
["Xindu-XF"] = { "" },
["Huayang"] = { "" },
["Pidu"] = { "" },
["Wenjiang"] = { "" },
["Shuangliu"] = { "" },
["Xinjin"] = { "" },
["Jintang"] = { "" },
["Pengzhou"] = { "" },
["Dujiangyan"] = { "" },
["Chongzhou"] = { "" },
["Dayi"] = { "" },
["Pujiang-M"] = { "" },
["Qionglai"] = { "" },
["Jianyang-M"] = { "" },
["Xiaojin"] = { "" },
["Jinchuan"] = { "" },
["Songpan"] = { "" },
["Maoxian"] = { "" },
["Lixian"] = { "" },
["Wenchuan"] = { "" },
["Deyang"] = { "" },
["Luojiang"] = { "" },
["Mianzhu"] = { "" },
["Shifang"] = { "" },
["Guanghan"] = { "" },
["Zhongjiang"] = { "" },
["Ziyang-SC"] = { "" },
["Anyue"] = { "" },
["Lezhi"] = { "" },
["Mianyang"] = { "" },
["Anzhou"] = { "" },
["Zitong"] = { "" },
["Jiangyou"] = { "" },
["Jiangyou-ZM"] = { "" },
["Pingwu"] = { "" },
["Beichuan"] = { "" },
["Yanting"] = { "" },
["Santai"] = { "" },
["Guangyuan"] = { "" },
["Zhaohua"] = { "" },
["Cangxi"] = { "" },
["Jiange"] = { "" },
["Meishan"] = { "" },
["Pengshan"] = { "" },
["Danling"] = { "" },
["Hongya"] = { "" },
["Qingshen"] = { "" },
["Renshou"] = { "" },
["Luzhou"] = { "" },
["Naxi"] = { "" },
["Luxian"] = { "" },
["Xuyong"] = { "" },
["Gulin"] = { "" },
["Hejiang"] = { "" },
["Yibin"] = { "" },
["Nanxi"] = { "" },
["Pingshan-M"] = { "" },
["Gaoxian"] = { "" },
["Changning-M"] = { "" },
["Gongxian"] = { "" },
["Xingwen-GS"] = { "" },
["Xingwen-BWS"] = { "" },
["Jiang'an"] = { "" },
["Junlian"] = { "" },
["Leshan"] = { "" },
["Jiajiang"] = { "" },
["Emeishan"] = { "" },
["Ebian"] = { "" },
["Qianwei"] = { "" },
["Mabian"] = { "" },
["Jingyan"] = { "" },
["Neijiang"] = { "" },
["Zizhong"] = { "" },
["Weiyuan"] = { "" },
["Longchang"] = { "" },
["Suining-SC"] = { "" },
["Pengxi"] = { "" },
["Shehong"] = { "" },
["Guang'an"] = { "" },
["Yuechi"] = { "" },
["Wusheng"] = { "" },
["Linshui"] = { "" },
["Nanchong"] = { "" },
["Nanbu"] = { "" },
["Langzhong"] = { "" },
["Yilong"] = { "" },
["Yingshan"] = { "" },
["Peng'an"] = { "" },
["Dazhou"] = { "" },
["Dazhu"] = { "" },
["Kaijiang"] = { "" },
["Wanyuan"] = { "" },
["Xuanhan"] = { "" },
["Bazhong"] = { "" },
["Tongjiang"] = { "" },
["Nanjiang"] = { "" },
["Hanyuan"] = { "" },
["Xichang"] = { "" },
["Zigong"] = { "" },
["Fushun"] = { "" },
["Rongxian-M"] = { "" },
["Muli"] = { "" },
["Leibo"] = { "" },
["Chongqing"] = { "" },
["Chongqing-JB"] = { "" },
["Chongqing-JLP"] = { "" },
["Chongqing-DDK"] = { "" },
["Chongqing-SPB"] = { "" },
["Chongqing-BN"] = { "" },
["Chongqing-NA"] = { "" },
["Chongqing-QIJ"] = { "" },
["Chongqing-QJ-WS"] = { "" },
["Chongqing-YB"] = { "" },
["Chongqing-BB"] = { "" },
["Chongqing-NC"] = { "" },
["Chongqing-WL"] = { "" },
["Chongqing-DZ"] = { "" },
["Chongqing-RC"] = { "" },
["Chongqing-YC"] = { "" },
["Chongqing-BS"] = { "" },
["Chongqing-TL"] = { "" },
["Chongqing-TN"] = { "" },
["Chongqing-HC"] = { "" },
["Chongqing-CS"] = { "" },
["Chongqing-FL"] = { "" },
["Chongqing-JJ"] = { "" },
["Chongqing-WZ"] = { "" },
["Chongqing-SZ"] = { "" },
["Chongqing-KZ"] = { "" },
["Chongqing-CK"] = { "" },
["Chongqing-DJ"] = { "" },
["Chongqing-LP"] = { "" },
["Chongqing-FD"] = { "" },
["Chongqing-ZX"] = { "" },
["Chongqing-QJ"] = { "" },
["Chongqing-PS"] = { "" },
["Chongqing-YY"] = { "" },
["Chongqing-XS"] = { "" },
["Chongqing-YNY"] = { "" },
["Chongqing-WX"] = { "" },
["Chongqing-FJ"] = { "" },
["Chongqing-WS"] = { "" },
["Wuhan"] = { "" },
["Jiangxia"] = { "" },
["Caidian"] = { "" },
["Xinzhou-HB"] = { "" },
["Huangpi"] = { "" },
["Hanchuan"] = { "" },
["Suizhou"] = { "" },
["Suixian"] = { "" },
["Yichang"] = { "" },
["Dangyang"] = { "" },
["Zhijiang"] = { "" },
["Yidu"] = { "" },
["Changyang"] = { "" },
["Xingshan"] = { "" },
["Zigui"] = { "" },
["Wufeng"] = { "" },
["Enshi"] = { "" },
["Hefeng"] = { "" },
["Badong"] = { "" },
["Xuan'en"] = { "" },
["Laifeng"] = { "" },
["Lichuan-M"] = { "" },
["Jianshi"] = { "" },
["Xianfeng"] = { "" },
["Xiangyang"] = { "" },
["Laohekou"] = { "" },
["Baokang"] = { "" },
["Nanzhang"] = { "" },
["Zaoyang"] = { "" },
["Yicheng"] = { "" },
["Gucheng"] = { "" },
["Jingzhou"] = { "" },
["Jingzhou-SS"] = { "" },
["Jiangling"] = { "" },
["Shishou"] = { "" },
["Gong'an"] = { "" },
["Songzi"] = { "" },
["Jingmen"] = { "" },
["Zhongxiang"] = { "" },
["Jingshan"] = { "" },
["Tianmen"] = { "" },
["Xiantao"] = { "" },
["Qianjiang"] = { "" },
["Shennongjia"] = { "" },
["Shiyan"] = { "" },
["Zhuxi"] = { "" },
["Zhushan"] = { "" },
["Yunxi"] = { "" },
["Yunyang"] = { "" },
["Danjiangkou"] = { "" },
["Fangxian"] = { "" },
["Lhasa"] = { "" },
["Guiyang"] = { "" },
["Huaxi"] = { "" },
["Zunyi"] = { "" },
["Tongzi"] = { "" },
["Renhuai"] = { "" },
["Bijie"] = { "" },
["Jinsha-M"] = { "" },
["Dafang"] = { "" },
["Weining"] = { "" },
["Liupanshui"] = { "" },
["Liuzhi"] = { "" },
["Xingyi"] = { "" },
["Anshun"] = { "" },
["Duyun"] = { "" },
["Pingtang"] = { "" },
["Fuquan"] = { "" },
["Weng'an"] = { "" },
["Kaili"] = { "" },
["Liping-GZ"] = { "" },
["Zhenyuan"] = { "" },
["Tongren"] = { "" },
["Sinan"] = { "" },
["Yuping"] = { "" },
["Liping"] = { "" },
["Zhaotong"] = { "" },
["Baoshan-M"] = { "" },
["Dali"] = { "" },
["Kunming"] = { "" },
["Qujing"] = { "" },
["Wenshan"] = { "" },
["Mengzi"] = { "" },
["Lancang"] = { "" },
["Weixi"] = { "" },
["Pu'er"] = { "" },
["Lincang"] = { "" },
["Guilin"] = { "" },
["Lingui"] = { "" },
["Guanyang"] = { "" },
["Lipu"] = { "" },
["Pingle"] = { "" },
["Yangshuo"] = { "" },
["Liuzhou"] = { "" },
["Liuzhou-LR"] = { "" },
["Luzhai"] = { "" },
["Sanjiang-DZ"] = { "" },
["Nanning-M"] = { "" },
["Yongning-FJ"] = { "" },
["Wuming"] = { "" },
["Wuming-FC"] = { "" },
["Binyang-M"] = { "" },
["Shanglin"] = { "" },
["Yizhou"] = { "" },
["Jinchengjiang"] = { "" },
["Luocheng"] = { "" },
["Fengshan"] = { "" },
["Tianlin-LP"] = { "" },
["Tianlin-PT"] = { "" },
["Leye"] = { "" },
["Lingyun"] = { "" },
["Longlin"] = { "" },
["Xilin"] = { "" },
["Xiangzhou-NL"] = { "" },
["Qinzhou-M"] = { "" },
["Jishou"] = { "" },
["Changde"] = { "" },
["Zhangjiajie"] = { "" },
["Yongzhou"] = { "" },
["Chenzhou"] = { "" },
["Huaihua"] = { "" },
["Huitong"] = { "" },
["Xiangtan-JN"] = { "" },
["Ganzhou-M"] = { "" },
["Shiquan"] = { "" },
["Ziyang"] = { "" },
["Ningshan"] = { "" },
["Langao"] = { "" },
["Zhenping"] = { "" },
["Hanzhong"] = { "" },
["Nanzheng"] = { "" },
["Ningqiang"] = { "" },
["Liuba"] = { "" },
["Chenggu"] = { "" },
["Foping"] = { "" },
["Xixiang"] = { "" },
["Zhenba"] = { "" },
["Anji-HB"] = { "" },
["Kokang"] = { "" },
["Dagudi"] = { "" },
["Reshuitang"] = { "" },
["Mae Salong"] = { "" },
["Mae Sai"] = { "" },
["Oudomxay"] = { "" },
["Siantar"] = { "" },
["Nanjing"] = { "" },
["Pukou"] = { "" },
["Luhe-M"] = { "" },
["Lishui-M"] = { "" },
["Yangzhou"] = { "" },
["Jiangdu"] = { "" },
["Baoying"] = { "" },
["Gaoyou"] = { "" },
["Yizheng"] = { "" },
["Taizhou-M"] = { "" },
["Taixing"] = { "" },
["Jiangyan"] = { "" },
["Jingjiang-DX"] = { "" },
["Zhenjiang"] = { "" },
["Jurong"] = { "" },
["Yangzhong"] = { "" },
["Lianyungang"] = { "" },
["Haizhou"] = { "" },
["Guanyun"] = { "" },
["Guannan"] = { "" },
["Huai'an"] = { "" },
["Huai'an-HA"] = { "" },
["Huaiyin"] = { "" },
["Hongze"] = { "" },
["Lianshui"] = { "" },
["Xuyi"] = { "" },
["Jinhu"] = { "" },
["Xinghua"] = { "" },
["Nantong"] = { "" },
["Rugao"] = { "" },
["Rudong"] = { "" },
["Hai'an"] = { "" },
["Yancheng"] = { "" },
["Dongtai"] = { "" },
["Binhai"] = { "" },
["Sheyang"] = { "" },
["Dafeng"] = { "" },
["Funing"] = { "" },
["Jianhu"] = { "" },
["Xiangshui"] = { "" },
["Shuyang"] = { "" },
["Sihong"] = { "" },
["Siyang"] = { "" },
["Anqing"] = { "" },
["Tongcheng"] = { "" },
["Zongyang"] = { "" },
["Chizhou"] = { "" },
["Qingyang"] = { "" },
["Wuhu"] = { "" },
["Wuhu-QS"] = { "" },
["Wanzhi"] = { "" },
["Jinghu"] = { "" },
["Fanchang"] = { "" },
["Wuwei"] = { "" },
["Hanshan"] = { "" },
["Hexian"] = { "" },
["Ma'anshan"] = { "" },
["Dangtu"] = { "" },
["Xuancheng"] = { "" },
["Tongling"] = { "" },
["Hefei"] = { "" },
["Feidong"] = { "" },
["Feixi"] = { "" },
["Chaohu"] = { "" },
["Lujiang"] = { "" },
["Changfeng"] = { "" },
["Huainan"] = { "" },
["Lu'an"] = { "" },
["Jin'an-QSH"] = { "" },
["Shucheng"] = { "" },
["Huoshan"] = { "" },
["Chuzhou"] = { "" },
["Lai'an"] = { "" },
["Quanjiao"] = { "" },
["Mingguang"] = { "" },
["Tianchang"] = { "" },
["Echeng"] = { "" },
["Huangshi"] = { "" },
["Huanggang"] = { "" },
["Hong'an"] = { "" },
["Macheng"] = { "" },
["Luotian"] = { "" },
["Yingshan-HB"] = { "" },
["Xishui"] = { "" },
["Huangmei"] = { "" },
["Wuxue"] = { "" },
["Qichun"] = { "" },
["Xiaogan"] = { "" },
["Anlu"] = { "" },
["Yingcheng"] = { "" },
["Yunmeng"] = { "" },
["Dawu"] = { "" },
["Guangshui"] = { "" },
["Zhashui"] = { "" },
["Jiujiang"] = { "" },
["Ruichang"] = { "" },
["Anji-AQ"] = { "" },
["Najiahu"] = { "" },
["Dianbai-Jun"] = { "" },
["Ningguo-GK"] = { "" },
["Langxi"] = { "" },
["Changle-QJ"] = { "" },
["Yanping"] = { "" },
["Jiangshan-M-NBD"] = { "" },
["Kaihua-M-HB"] = { "" },
["Yushan-M-HY"] = { "" },
["Juexi"] = { "" },
["Taiyuan"] = { "" },
["Jiancaoping"] = { "" },
["Jinyuan"] = { "" },
["Qingxu"] = { "" },
["Loufan"] = { "" },
["Taigu"] = { "" },
["Pingyao"] = { "" },
["Heshun"] = { "" },
["Qixian"] = { "" },
["Yangyuan"] = { "" },
["Datong"] = { "" },
["Yunzhou"] = { "" },
["Yunzhou-XCT"] = { "" },
["Tianzhen"] = { "" },
["Guangling"] = { "" },
["Shuozhou"] = { "" },
["Shanyin"] = { "" },
["Pinglu"] = { "" },
["Pingding"] = { "" },
["Xinzhou"] = { "" },
["Wutai"] = { "" },
["Daixian"] = { "" },
["Wuzhai"] = { "" },
["Lishi"] = { "" },
["Shilou"] = { "" },
["Fenyang"] = { "" },
["Lanxian"] = { "" },
["Linxian"] = { "" },
["Wenshui"] = { "" },
["Xiaoyi"] = { "" },
["Fenxi"] = { "" },
["Xixian"] = { "" },
["Changzhi"] = { "" },
["Tunliu"] = { "" },
["Baochang"] = { "" },
["Linhe"] = { "" },
["Pingshun"] = { "" },
["Zhangzi"] = { "" },
["Qinxian"] = { "" },
["Jincheng"] = { "" },
["Lingchuan"] = { "" },
["Yangcheng"] = { "" },
["Gaoping"] = { "" },
["Jining"] = { "" },
["Liangcheng"] = { "" },
["Hohhot"] = { "" },
["Baotou"] = { "" },
["Dongsheng"] = { "" },
["Haibowan"] = { "" },
["Erenhot"] = { "" },
["Pingshan"] = { "" },
["Zhangjiakou"] = { "" },
["Chongli"] = { "" },
["Handan"] = { "" },
["Linzhang"] = { "" },
["Anyang"] = { "" },
["Linzhou"] = { "" },
["Hebi"] = { "" },
["Xinxiang"] = { "" },
["Jiaozuo"] = { "" },
["Qinyang"] = { "" },
["Wenxian"] = { "" },
["Wuzhi"] = { "" },
["Jiyuan"] = { "" },
["Suide"] = { "" },
["Zizhou"] = { "" },
["Mizhi"] = { "" },
["Jiaxian"] = { "" },
["Wubu"] = { "" },
["Shenmu"] = { "" },
["Fugu"] = { "" },
["Yulin-J"] = { "" },
["Hengshan-J"] = { "" },
["Jingbian"] = { "" },
["Yan'an"] = { "" },
["Ansai"] = { "" },
["Ganquan"] = { "" },
["Zhidan"] = { "" },
["Wuqi-J"] = { "" },
["Qingjian"] = { "" },
["Zichang"] = { "" },
["Yanchuan"] = { "" },
["Yanchang"] = { "" },
["Shanghai"] = { "鋁" },
["Yangpu"] = { "" },
["Xinzhuang"] = { "" },
["Zhenru"] = { "" },
["Songjiang"] = { "" },
["Chuansha"] = { "" },
["Nanhui"] = { "" },
["Zhoupu"] = { "" },
["Huinan"] = { "" },
["Fengxian"] = { "" },
["Jinshan"] = { "" },
["Qingpu"] = { "" },
["Jiading"] = { "" },
["Baoshan-SCD"] = { "" },
["Baoshan-LD"] = { "" },
["Baoshan-YP"] = { "" },
["Chongming"] = { "" },
["Suzhou"] = { "" },
["Shengpu"] = { "" },
["Xishan"] = { "" },
["Wujiang-SL"] = { "" },
["Wujiang-LL"] = { "" },
["Wujiang-SZ"] = { "" },
["Wuxi"] = { "" },
["Changshu"] = { "" },
["Kunshan"] = { "" },
["Taicang"] = { "" },
["Zhangjiagang"] = { "" },
["Tongzhou"] = { "" },
["Qidong"] = { "" },
["Qidong-LS"] = { "" },
["Haimen"] = { "" },
["Haimen-SJ"] = { "" },
["Rudong-W"] = { "" },
["Jiaxing"] = { "" },
["Jiashan"] = { "" },
["Pinghu"] = { "" },
["Haining-YG"] = { "" },
["Haining-XS"] = { "" },
["Tongxiang"] = { "" },
["Haiyan"] = { "" },
["Changzhou"] = { "" },
["Liyang"] = { "" },
["Jintan"] = { "" },
["Yixing"] = { "" },
["Danyang"] = { "" },
["Danyang-TJQ"] = { "" },
["Jingjiang"] = { "" },
["Jiangyin"] = { "" },
["Gaochun"] = { "" },
["Gaochun-ZB"] = { "" },
["Huzhou"] = { "" },
["Huzhou-SL"] = { "" },
["Changxing"] = { "" },
["Anji"] = { "" },
["Anji-XF"] = { "" },
["Deqing-W"] = { "" },
["Deqing-GT"] = { "" },
["Hangzhou"] = { "" },
["Yuhang"] = { "" },
["Lin'an"] = { "" },
["Lin'an-CH"] = { "" },
["Lin'an-YQ"] = { "" },
["Fuyang-W"] = { "" },
["Fuyang-XD"] = { "" },
["Xiaoshan"] = { "" },
["Tonglu"] = { "" },
["Fenshui-WS"] = { "" },
["Shaoxing"] = { "" },
["Shaoxing-KQ"] = { "" },
["Shangyu"] = { "" },
["Zhuji"] = { "" },
["Zhuji-WJJ"] = { "" },
["Shengzhou"] = { "" },
["Shengzhou-CR"] = { "" },
["Shengzhou-TP"] = { "" },
["Xinchang"] = { "" },
["Ningbo"] = { "" },
["Zhenhai"] = { "" },
["Fenghua"] = { "" },
["Beilun"] = { "" },
["Yinzhou"] = { "" },
["Yuyao"] = { "" },
["Cixi"] = { "" },
["Xiangshan"] = { "" },
["Ninghai"] = { "" },
["Zhoushan"] = { "" },
["Dinghai"] = { "" },
["Daishan"] = { "" },
["Shengsi"] = { "" },
["Jiaojiang"] = { "" },
["Huangyan"] = { "" },
["Tiantai"] = { "" },
["Xianju"] = { "" },
["Sanmen"] = { "" },
["Linhai"] = { "" },
["Wenling"] = { "" },
["Yuhuan"] = { "" },
["Yuhuan-DMY"] = { "" },
["Yuhuan-CM"] = { "" },
["Wenzhou"] = { "" },
["Yueqing"] = { "" },
["Yongjia"] = { "" },
["Yongjia-FL"] = { "" },
["Rui'an"] = { "" },
["Longgang"] = { "" },
["Dongtou"] = { "" },
["Cangnan-JX"] = { "" },
["Pingyang"] = { "" },
["Taishun"] = { "" },
["Wencheng"] = { "" },
["Lishui"] = { "" },
["Qingtian"] = { "" },
["Jinyun"] = { "" },
["Xuanping"] = { "" },
["Songyang-XP"] = { "" },
["Songyang-GS"] = { "" },
["Yunhe"] = { "" },
["Jingning"] = { "" },
["Qingyuan-W"] = { "" },
["Longquan"] = { "" },
["Quzhou"] = { "" },
["Qujiang-DZ"] = { "" },
["Suichang"] = { "" },
["Jiangshan"] = { "" },
["Changshan"] = { "" },
["Kaihua"] = { "" },
["Longyou"] = { "" },
["Jinhua"] = { "" },
["Tangxi"] = { "" },
["Yiwu"] = { "" },
["Yongkang"] = { "" },
["Pujiang"] = { "" },
["Dongyang"] = { "" },
["Pan'an"] = { "" },
["Wuyi"] = { "" },
["Lanxi"] = { "" },
["Shangrao"] = { "" },
["Shangrao-Rail"] = { "" },
["Guangfeng"] = { "" },
["Yushan"] = { "" },
["Xuancheng-YC"] = { "" },
["Xuancheng-JP"] = { "" },
["Wuhu-LL"] = { "" },
["Tongling-W"] = { "" },
["Nanling"] = { "" },
["Yi'an-WS"] = { "" },
["Huangshan"] = { "" },
["Jingxian"] = { "" },
["Jingxian-ZJ"] = { "" },
["Shitai-JZ"] = { "" },
["Pucheng"] = { "" },
["Changsha"] = { "輕飄", "鑌鐵" },
["Yiyang-X"] = { "" },
["Liuyang-YA"] = { "" },
["Xiangtan"] = { "" },
["Miluo-CL"] = { "" },
["Xiangxiang"] = { "" },
["Xiangxiang-MQ"] = { "" },
["Loudi"] = { "" },
["Shuangfeng"] = { "" },
["Xinhua"] = { "" },
["Lianyuan"] = { "" },
["Shaoyang"] = { "" },
["Lengshuitan"] = { "" },
["Zhuzhou"] = { "" },
["Longhui"] = { "" },
["Suining-X"] = { "" },
["Dongkou-HQ"] = { "" },
["Wugang"] = { "" },
["Hengyang"] = { "" },
["Hengshan"] = { "" },
["Hengshan-BG"] = { "" },
["Qiyang"] = { "" },
["Quanzhou-X"] = { "" },
["Guanyang-X"] = { "" },
["Qinglong-CL"] = { "" },
["Nanchong-CL"] = { "" },
["Nanchang"] = { "" },
["Xinjian-WC"] = { "" },
["Nanchang-TC"] = { "" },
["Anyi"] = { "" },
["Hukou"] = { "" },
["Lushan"] = { "" },
["Yongxiu"] = { "" },
["Gongqingcheng-JY"] = { "" },
["Xiushui"] = { "" },
["Pengze"] = { "" },
["Duchang"] = { "" },
["Duchang-TT"] = { "" },
["Duchang-YF"] = { "" },
["Wuning-QK"] = { "" },
["Poyang"] = { "" },
["Poyang-MT"] = { "" },
["Yugan"] = { "" },
["Wannian"] = { "" },
["Yiyang"] = { "" },
["Hengfeng"] = { "" },
["Yanshan-HK"] = { "" },
["Yanshan-YP"] = { "" },
["Shangrao-SX"] = { "" },
["Shangrao-HM"] = { "" },
["Jingdezhen"] = { "" },
["Leping"] = { "" },
["Yichun"] = { "" },
["Yifeng"] = { "" },
["Gao'an"] = { "" },
["Fengxin"] = { "" },
["Shanggao"] = { "" },
["Wanzai"] = { "" },
["Fengcheng"] = { "" },
["Fengcheng-ST"] = { "" },
["Xinyu"] = { "" },
["Fuzhou-G"] = { "" },
["Linchuan-SDD"] = { "" },
["Dongxiang"] = { "" },
["Nancheng"] = { "" },
["Nanfeng"] = { "" },
["Yihuang"] = { "" },
["Lichuan"] = { "" },
["Chongren"] = { "" },
["Pingxiang"] = { "" },
["Lianhua"] = { "" },
["Luxi"] = { "" },
["Ji'an"] = { "" },
["Jishui-LT"] = { "" },
["Yongfeng"] = { "" },
["Taihe"] = { "" },
["Xiajiang"] = { "" },
["Yongxin"] = { "" },
["Yingtan"] = { "" },
["Yujiang"] = { "" },
["Guixi"] = { "" },
["Susong"] = { "" },
["Susong-HT"] = { "" },
["Susong-GL"] = { "" },
["Wangjiang"] = { "" },
["Qianshan"] = { "" },
["Huaining"] = { "" },
["Huaining-SP"] = { "" },
["Yuexi"] = { "" },
["Taihu"] = { "" },
["Dongzhi"] = { "" },
["Shitai"] = { "" },
["Yangxin"] = { "" },
["Yangxin-GH"] = { "" },
["Daye"] = { "" },
["Xianning"] = { "" },
["Xianning-MQ"] = { "" },
["Jiayu"] = { "" },
["Chongyang"] = { "" },
["Chibi"] = { "" },
["Tongshan"] = { "" },
["Tongcheng-G"] = { "" },
["Jianli"] = { "" },
["Yueyang"] = { "" },
["Yueyang-BX"] = { "" },
["Linxiang"] = { "" },
["Pingjiang-XJ"] = { "" },
["Pingjiang-NJ"] = { "" },
["Liuyang"] = { "" },
["Liuyang-DY"] = { "" },
["Liuyang-FY"] = { "" },
["Liling-BTT"] = { "" },
["Liling-BS"] = { "" },
["Youxian"] = { "" },
["Chaling"] = { "" },
["Changning"] = { "" },
["Changning-TS"] = { "" },
["Leiyang"] = { "" },
["Anren"] = { "" },
["Zixing-XN"] = { "" },
["Longhui-LDZ"] = { "" },
["Dongkou"] = { "" },
["Dongkou-SJ"] = { "" },
["Jianning"] = { "" },
["Taining"] = { "" },
["Hanbin-NT"] = { "" },
["Jinxian"] = { "" },
["Jinxi"] = { "" },
["Le'an"] = { "" },
["Guangchang"] = { "" },
["Anfu"] = { "" },
["Suichuan"] = { "" },
["Wan'an"] = { "" },
["Jing'an"] = { "" },
["Zhangshu"] = { "" },
["Xingan"] = { "" },
["Fenyi"] = { "" },
["Meixian"] = { "" },
["Xingning"] = { "" },
["Dabu-XH"] = { "" },
["Dabu-GB"] = { "" },
["Fengshun-TK"] = { "" },
["Fengshun-LH"] = { "" },
["Fengshun-HJ"] = { "" },
["Fengshun-FL"] = { "" },
["Fengshun-PT"] = { "" },
["Huizhou"] = { "" },
["Huizhou-SK"] = { "" },
["Huizhou-HL"] = { "" },
["Huiyang"] = { "" },
["Huidong-PS"] = { "" },
["Huidong-DL"] = { "" },
["Dongguan-H"] = { "" },
["Longmen-PL"] = { "" },
["Longmen-LX"] = { "" },
["Boluo"] = { "" },
["Shenzhen-H"] = { "" },
["Shenzhen-H-LH"] = { "" },
["Zengcheng-ZG"] = { "" },
["Zhongshan-WGS"] = { "" },
["Zhongshan-NLHS"] = { "" },
["Wuhua-SZ"] = { "" },
["Wuhua-HC"] = { "" },
["Wuhua-CB"] = { "" },
["Wuhua-MY"] = { "" },
["Wuhua-ML"] = { "" },
["Heyuan"] = { "" },
["Zijin"] = { "" },
["Zijin-GZ"] = { "" },
["Longchuan-TC"] = { "" },
["Longchuan-SD"] = { "" },
["Heping-LZ"] = { "" },
["Lianping"] = { "" },
["Lianping-ZX"] = { "" },
["Lianping-LJ"] = { "" },
["Wengyuan"] = { "" },
["Nanxiong-ZJ"] = { "" },
["Qujiang"] = { "" },
["Xinfeng-MT"] = { "" },
["Xinfeng-DX"] = { "" },
["Xiaosanjiang"] = { "" },
["Liannan"] = { "" },
["Conghua-H"] = { "" },
["Jiexi"] = { "" },
["Luhe"] = { "" },
["Raoping-XF"] = { "" },
["Xiuzhuan"] = { "" },
["Pinghe-JF"] = { "" },
["Nanjing-ML"] = { "" },
["Nanjing-BL"] = { "" },
["Changting"] = { "" },
["Shanghang"] = { "" },
["Yongding"] = { "" },
["Yongding-XY"] = { "" },
["Yongding-GB"] = { "" },
["Yongding-HK"] = { "" },
["Wuping"] = { "" },
["Wuping-ZS"] = { "" },
["Wuping-Y"] = { "" },
["Wuping-WD"] = { "" },
["Pingyu"] = { "" },
["Liancheng"] = { "" },
["Liancheng-PT"] = { "" },
["Liancheng-JX"] = { "" },
["Liancheng-ZB"] = { "" },
["Liancheng-LY"] = { "" },
["Ninghua"] = { "" },
["Qingliu"] = { "" },
["Yudu"] = { "" },
["Ningdu"] = { "" },
["Ruijin"] = { "" },
["Shicheng"] = { "" },
["Shangyou"] = { "" },
["Sandu"] = { "" },
["Ganzhou-PL"] = { "" },
["Nankang"] = { "" },
["Dayu"] = { "" },
["Quannan"] = { "" },
["Dingnan"] = { "" },
["Longnan"] = { "" },
["Xunwu"] = { "" },
["Anyuan"] = { "" },
["Huichang"] = { "" },
["Chongyi"] = { "" },
["Xingguo"] = { "" },
["Yunhe-JST"] = { "" },
["Tonggu"] = { "" },
["Fengxin-ZX"] = { "" },
["Taoyuan"] = { "" },
["Miaoli"] = { "" },
["Zaoqiao"] = { "" },
["Touwu"] = { "" },
["Nanzhuang"] = { "" },
["Shitan"] = { "" },
["Sanwan"] = { "" },
["Toufen"] = { "" },
["Gongguan"] = { "" },
["Zhuolan-SX"] = { "" },
["Liudui"] = { "" },
["Wuluo"] = { "" },
["Meinong"] = { "" },
["Shanlin"] = { "" },
["Hsinchu"] = { "" },
["Dongshi"] = { "" },
["Raoping"] = { "" },
["Zhuolan-RP"] = { "" },
["Yunlin"] = { "" },
["Guoxing"] = { "" },
["Hong Kong-H"] = { "" },
["Tangkou"] = { "" },
["Sanjia"] = { "" },
["Sihe"] = { "" },
["Qianpai"] = { "" },
["Xindong"] = { "" },
["Shalang"] = { "" },
["Xin'an"] = { "" },
["Shijiao"] = { "" },
["Qingping"] = { "" },
["Xihe"] = { "" },
["Fumian-XS"] = { "" },
["Luchuan-LC"] = { "" },
["Luchuan-DQ"] = { "" },
["Luchuan-SH"] = { "" },
["Bobai-SH"] = { "" },
["Bobai-LT"] = { "" },
["Bobai-LP"] = { "" },
["Bobai-LJ"] = { "" },
["Bobai-CT"] = { "" },
["Tang'an"] = { "" },
["Beiliu-GH"] = { "" },
["Beiliu-MM"] = { "" },
["Xingye-GF"] = { "" },
["Rongxian-XD"] = { "" },
["Mashan-PL"] = { "" },
["Binyang-WL"] = { "" },
["Hengxian-XY"] = { "" },
["Lingui-H-XJ"] = { "" },
["Lipu-SDT"] = { "" },
["Lipu-DSG"] = { "" },
["Pingle-H"] = { "" },
["Yangshuo-JB"] = { "" },
["Tianlin-GL"] = { "" },
["Qinzhou-H"] = { "" },
["Guidong"] = { "" },
["Rongchang-PL"] = { "" },
["Chengdu-H-LT"] = { "" },
["Longquanyi-H-SL"] = { "" },
["Qingbaijiang-H-LW"] = { "" },
["Xindu-H-SBT"] = { "" },
["Xindu-H-HXC"] = { "" },
["Xindu-H-XD"] = { "" },
["Weiyuan-H"] = { "" },
["Yilong-H"] = { "" },
["Xichang-H"] = { "" },
["Sabah-B"] = { "" },
["Sabah-L"] = { "" },
["Sabah-HY"] = { "" },
["Sabah-HP"] = { "" },
["Kuala Lumpur-H-HY"] = { "" },
["Kuala Lumpur-H"] = { "" },
["Senai"] = { "" },
["Senai-JX"] = { "" },
["Kuching"] = { "" },
["Sungai Tapang"] = { "" },
["Singkawang"] = { "" },
["Pontianak-MX"] = { "" },
["Mempawah"] = { "" },
["Metal"] = { "" },
["Singapore-MX"] = { "" },
["Singapore-DB"] = { "" },
["Belait-H"] = { "" },
["Bangkok-MX"] = { "" },
["Bangkok-FS"] = { "" },
["Bangkok-JX"] = { "" },
["Yangon-H"] = { "" },
["Ho Chi Minh City-H"] = { "" },
["Jixi"] = { "" },
["Shexian"] = { "" },
["Shexian-XG"] = { "" },
["Shexian-DGY"] = { "" },
["Tunxi"] = { "" },
["Huizhou-HZ"] = { "" },
["Xiuning"] = { "" },
["Yixian"] = { "" },
["Qimen"] = { "" },
["Qimen-AL-Min"] = { "" },
["Wuyuan"] = { "" },
["Fuliang"] = { "" },
["Dexing"] = { "" },
["Jingde"] = { "" },
["Zhanda"] = { "" },
["Chun'an"] = { "" },
["Sui'an"] = { "" },
["Jiande"] = { "" },
["Shouchang"] = { "" },
["Guangzhou"] = { "" },
["Hong Kong"] = { "鋁" },
["HK Weitou"] = { "" },
["Kam Tin"] = { "" },
["Shek Pik"] = { "" },
["Ting Kok"] = { "" },
["Tung Ping Chau"] = { "" },
["Macau"] = { "" },
["Panyu"] = { "" },
["Huadu"] = { "" },
["Conghua"] = { "" },
["Zengcheng"] = { "" },
["Foshan"] = { "" },
["Nanhai"] = { "" },
["Shunde"] = { "" },
["Sanshui"] = { "" },
["Gaoming"] = { "" },
["Zhongshan"] = { "" },
["Zhongshan-HC"] = { "" },
["Zhongshan-NL"] = { "" },
["Zhongshan-CKM"] = { "" },
["Zhongshan-XL"] = { "" },
["Zhongshan-DS"] = { "" },
["Zhongshan-TB"] = { "" },
["Zhongshan-HL"] = { "" },
["Zhongshan-DF"] = { "" },
["Zhongshan-NT"] = { "" },
["Zhongshan-FS"] = { "" },
["Zhongshan-SL"] = { "" },
["Zhongshan-GK"] = { "" },
["Zhongshan-HP"] = { "" },
["Zhongshan-SJ"] = { "" },
["Zhongshan-LW"] = { "" },
["Zhongshan-MZ"] = { "" },
["Zhongshan-GZ"] = { "" },
["Zhongshan-BF"] = { "" },
["Zhongshan-TZ"] = { "" },
["Zhuhai"] = { "" },
["Doumen-T"] = { "" },
["Doumen-S"] = { "" },
["Jiangmen"] = { "" },
["Xinhui"] = { "" },
["Taishan"] = { "" },
["Taishan-GH"] = { "" },
["Kaiping"] = { "" },
["Enping"] = { "" },
["Heshan"] = { "" },
["Malan"] = { "" },
["Malan-BTQ"] = { "" },
["Malan-MHD"] = { "" },
["Malan-SZP"] = { "" },
["Malan-BLH"] = { "" },
["Dongguan"] = { "" },
["Shenzhen-C-LH"] = { "" },
["Bao'an"] = { "" },
["Dapeng"] = { "" },
["Shenzhen-PD"] = { "" },
["Pingshan-ZM"] = { "" },
["Ebu-ZM"] = { "" },
["Qingyuan"] = { "" },
["Fogang"] = { "" },
["Yingde"] = { "" },
["Yangshan"] = { "" },
["Lianshan"] = { "" },
["Lianshan-YH"] = { "" },
["Lianzhou"] = { "" },
["Shaoguan"] = { "" },
["Qujiang-C"] = { "" },
["Renhua"] = { "" },
["Lechang"] = { "" },
["Gaoyao"] = { "" },
["Sihui"] = { "" },
["Guangning"] = { "" },
["Deqing"] = { "" },
["Huaiji"] = { "" },
["Fengkai"] = { "" },
["Yunfu"] = { "" },
["Xinxing"] = { "" },
["Luoding"] = { "" },
["Yunan"] = { "" },
["Yangjiang"] = { "" },
["Yangdong"] = { "" },
["Yangdong-YS"] = { "" },
["Yangchun"] = { "" },
["Yangxi"] = { "" },
["Xinyi"] = { "" },
["Maoming"] = { "" },
["Maoming-YJ"] = { "" },
["Gaozhou"] = { "" },
["Huazhou"] = { "" },
["Huazhou-CQ"] = { "" },
["Zhanjiang"] = { "" },
["Lianjiang"] = { "" },
["Wuchuan"] = { "" },
["Nanning"] = { "" },
["Nanning-Tanka"] = { "" },
["Wuzhou"] = { "" },
["Cangwu-LB"] = { "" },
["Yulin"] = { "" },
["Rongxian"] = { "" },
["Hepu"] = { "" },
["Hepu-ST"] = { "" },
["Guiping"] = { "" },
["Guiping-JT"] = { "" },
["Guiping-JK"] = { "" },
["Guiping-MD"] = { "" },
["Guiping-ML"] = { "" },
["Pingnan-PN"] = { "" },
["Pingnan-DZ"] = { "" },
["Mengshan"] = { "" },
["Mengshan-XX"] = { "" },
["Mengshan-CT"] = { "" },
["Guigang-GC"] = { "" },
["Guigang-NJ"] = { "" },
["Guigang-PD"] = { "" },
["Beiliu"] = { "" },
["Beiliu-TL"] = { "" },
["Beiliu-XL"] = { "" },
["Baise"] = { "" },
["Tiandong"] = { "" },
["Tiandong-LF"] = { "" },
["Tianyang"] = { "" },
["Pingguo"] = { "" },
["Pingguo-SX"] = { "" },
["Bobai"] = { "" },
["Lingshan"] = { "" },
["Pubei"] = { "" },
["Qinzhou"] = { "" },
["Qinzhou-XD"] = { "" },
["Qinzhou-CT"] = { "" },
["Qinzhou-NS"] = { "" },
["Qinzhou-XNJ"] = { "" },
["Beihai"] = { "" },
["Beihai-NK"] = { "" },
["Beihai-YP"] = { "" },
["Beihai-QG"] = { "" },
["Beihai-QG-CB"] = { "" },
["Ningming"] = { "" },
["Hengxian"] = { "" },
["Pumen"] = { "" },
["Fangchenggang-FC"] = { "" },
["Dongxing"] = { "" },
["Chongzuo-LT"] = { "" },
["Fusui-QJ"] = { "" },
["Lingchuan-C-YJ"] = { "" },
["Pingle-C-MJ"] = { "" },
["Pingle-C-SS"] = { "" },
["Lipu-ZC"] = { "" },
["Danzhou"] = { "" },
["Sanya-YL"] = { "" },
["Kuala Lumpur"] = { "" },
["Penang-C"] = { "" },
["Ipoh"] = { "" },
["Sarikei-C"] = { "" },
["Singapore-C"] = { "" },
["Jakarta-C"] = { "" },
["Ho Chi Minh City"] = { "" },
["Mong Cai"] = { "" },
["Phnom Penh-C"] = { "" },
["Yangon-C"] = { "" },
["Mandalay-C"] = { "" },
["Bangkok-C"] = { "" },
["Betong"] = { "" },
["Manila-C"] = { "" },
["Nanning-P"] = { "" },
["Nanning-P-SJ"] = { "" },
["Nanning-P-GJY"] = { "" },
["Nanning-P-ZGL"] = { "" },
["Nanning-P-XXJD"] = { "" },
["Nanning-P-SL"] = { "" },
["Nanning-P-XX"] = { "" },
["Nanning-P-SC"] = { "" },
["Binyang"] = { "" },
["Binyang-XQ"] = { "" },
["Hengxian-P"] = { "" },
["Wuxuan-JJ"] = { "" },
["Chongzuo-P"] = { "" },
["Liucheng-P"] = { "" },
["Liucheng-P-GZ"] = { "" },
["Yizhou-P-DS"] = { "" },
["Luocheng-P"] = { "" },
["Guilin-P"] = { "" },
["Guilin-P-CY"] = { "" },
["Guilin-P-DBZ"] = { "" },
["Guilin-P-ZY"] = { "" },
["Guilin-P-DB"] = { "" },
["Guilin-P-YJ"] = { "" },
["Guilin-P-QJ"] = { "" },
["Lingui-P-WT"] = { "" },
["Lingui-P-HS"] = { "" },
["Lingui-P-LJ"] = { "" },
["Lingui-P-LT"] = { "" },
["Lingchuan-P"] = { "" },
["Lingchuan-P-GQ"] = { "" },
["Lingchuan-P-GD"] = { "" },
["Lingchuan-P-TX"] = { "" },
["Lingchuan-P-SZ"] = { "" },
["Lingchuan-P-GP"] = { "" },
["Lingchuan-P-LT"] = { "" },
["Guanyang-P"] = { "" },
["Quanzhou-P"] = { "" },
["Pingle-P"] = { "" },
["Pingle-P-XTM"] = { "" },
["Yangshuo-P"] = { "" },
["Yangshuo-P-PT"] = { "" },
["Yongfu-P-JX"] = { "" },
["Yongfu-P-CS"] = { "" },
["Zhongshan-GA"] = { "" },
["Xiamen"] = { "鋁" },
["Xiamen-HS"] = { "" },
["Tong'an"] = { "" },
["Quanzhou"] = { "鋁" },
["Jinjiang"] = { "" },
["Nan'an"] = { "" },
["Shishi"] = { "" },
["Hui'an"] = { "" },
["Anxi"] = { "" },
["Yongchun"] = { "" },
["Dehua"] = { "" },
["Zhangzhou"] = { "鋁" },
["Longhai"] = { "" },
["Changtai"] = { "" },
["Hua'an"] = { "" },
["Nanjing-MN"] = { "" },
["Pinghe"] = { "" },
["Zhangpu"] = { "" },
["Yunxiao"] = { "" },
["Zhao'an"] = { "" },
["Zhao'an-SD"] = { "" },
["Zhao'an-TY"] = { "" },
["Zhao'an-WS"] = { "" },
["Dongshan"] = { "" },
["Taipei"] = { "a-lú-mih" },
["Wanhua"] = { "" },
["Tamsui"] = { "" },
["Sanxia"] = { "a-lú-mih" },
["Pingxi"] = { "" },
["Kaohsiung"] = { "輕銀仔", "a-lú-mih" },
["Cijin"] = { "" },
["Hongmaogang"] = { "" },
["Dalinpu"] = { "" },
["Tianliao"] = { "" },
["Yilan"] = { "a-lú-mih" },
["Luodong"] = { "" },
["Toucheng"] = { "" },
["Lukang"] = { "a-lú-mih" },
["Yongjing-MN"] = { "" },
["Taichung"] = { "輕銀仔", "a-lú-mih" },
["Wuqi"] = { "" },
["Tainan"] = { "輕銀仔", "a-lú-mih" },
["Anping"] = { "" },
["Shanhua"] = { "" },
["Taitung"] = { "" },
["Green Island"] = { "" },
["Hsinchu-MN"] = { "a-lú-mih" },
["Miaoli-MN"] = { "" },
["Mailiao"] = { "" },
["Chiayi"] = { "" },
["Chiayi-DS"] = { "" },
["Baoli"] = { "" },
["Liuqiu"] = { "" },
["Kinmen"] = { "鋁" },
["Jinsha"] = { "" },
["Magong"] = { "輕銀", "a-lú-mih" },
["Pengnan"] = { "" },
["Xiyu"] = { "" },
["Huxi"] = { "" },
["Wangan"] = { "" },
["Cimei"] = { "" },
["Huayu"] = { "" },
["Zhongtun"] = { "" },
["Houliao"] = { "" },
["Tongliang"] = { "" },
["Jibei"] = { "" },
["Malaysia-MN"] = { "" },
["Melaka"] = { "" },
["Labuan"] = { "" },
["Singapore-MN"] = { "" },
["Philippine-MN"] = { "" },
["Medan"] = { "" },
["Seri Begawan"] = { "" },
["Ho Chi Minh City-MN"] = { "" },
["Yangon-MN"] = { "" },
["Longyan"] = { "" },
["Zhangping"] = { "" },
["Yongfu"] = { "" },
["Datian"] = { "" },
["Datian-GP"] = { "" },
["Youxi-JM"] = { "" },
["Youxi-XQ"] = { "" },
["Shunchang-PS"] = { "" },
["Pingnan"] = { "" },
["Pingnan-PT"] = { "" },
["Pingnan-SJ"] = { "" },
["Guiping-XW"] = { "" },
["Guiping-DS"] = { "" },
["Guilin-MN-BYG"] = { "" },
["Pingle-MN"] = { "" },
["Qinzhou-MN"] = { "" },
["Lechang-TT"] = { "" },
["Renhua-CSB"] = { "" },
["Yingde-YZ"] = { "" },
["Yunan-LT"] = { "" },
["Hangzhou-PF"] = { "" },
["Cangnan-MN"] = { "" },
["Yuhuan-KM"] = { "" },
["Wenling-RS"] = { "" },
["Yixing-SB"] = { "" },
["Langxi-FL"] = { "" },
["Chaozhou"] = { "" },
["Raoping-MN-T"] = { "" },
["Shantou"] = { "" },
["Chenghai"] = { "" },
["Chenghai-DX"] = { "" },
["Chaoyang"] = { "" },
["Nan'ao-HZ"] = { "" },
["Nan'ao-YA"] = { "" },
["Jieyang"] = { "" },
["Puning"] = { "" },
["Lufeng"] = { "" },
["Haifeng"] = { "" },
["Fengshun-MN-LH"] = { "" },
["Fengshun-MN-HJ"] = { "" },
["Yuen Chau Tsai-MN"] = { "" },
["Sha Tau Kok-MN"] = { "" },
["Thailand-MN-T"] = { "" },
["Chiang Mai-MN-T"] = { "" },
["Hat Yai-MN-T"] = { "" },
["Cambodia-MN-T"] = { "" },
["Ho Chi Minh City-MN-T"] = { "" },
["Vientiane-MN-T"] = { "" },
["Johor Bahru"] = { "" },
["Penang-MN-T"] = { "" },
["Singapore-MN-T"] = { "" },
["Batam-MN-T"] = { "" },
["Pontianak-MN-T"] = { "" },
["Leizhou"] = { "" },
["Dianbai-XD"] = { "" },
["Wenchang"] = { "" },
["Haikou"] = { "" },
["Chengmai"] = { "" },
["Qionghai"] = { "" },
["Wanning"] = { "" },
["Tunchang"] = { "" },
["Singapore-MN-H"] = { "" },
["Belait-MN-H"] = { "" },
["Putian"] = { "" },
["Putian-DH"] = { "" },
["Putian-JK"] = { "" },
["Putian-NR"] = { "" },
["Xianyou"] = { "" },
["Xianyou-FT"] = { "" },
["Xianyou-YY"] = { "" },
["Fuding-AY"] = { "" },
["Shaxi"] = { "" },
["Sanxiang"] = { "" },
["Fuzhou"] = { "" },
["Changle"] = { "" },
["Lianjiang-MD"] = { "" },
["Fuqing"] = { "" },
["Pingtan"] = { "" },
["Yongtai"] = { "" },
["Minqing"] = { "" },
["Gutian"] = { "" },
["Pingnan-MD"] = { "" },
["Luoyuan"] = { "" },
["Fu'an"] = { "" },
["Ningde"] = { "" },
["Xiapu"] = { "" },
["Zherong"] = { "" },
["Shouning"] = { "" },
["Zhouning"] = { "" },
["Fuding"] = { "" },
["Youxi"] = { "" },
["Youxi-XY"] = { "" },
["Youxi-YZ"] = { "" },
["Youxi-TC"] = { "" },
["Youxi-ZX"] = { "" },
["Matsu"] = { "" },
["Taishun-MD"] = { "" },
["Cangnan-MD"] = { "" },
["Guanhaiwei"] = { "" },
["Singapore-MD-FQ"] = { "" },
["Sitiawan-MD-GT"] = { "" },
["Sibu-MD-MQ"] = { "" },
["Jian'ou"] = { "" },
["Dikou"] = { "" },
["Yanping-XY"] = { "" },
["Songxi"] = { "" },
["Zhenghe"] = { "" },
["Zhenqian"] = { "" },
["Shunchang-YD"] = { "" },
["Jianyang"] = { "" },
["Huangkeng"] = { "" },
["Wuyishan"] = { "" },
["Shibei"] = { "" },
["Yong'an"] = { "" },
["Sanyuan"] = { "" },
["Shaxian"] = { "" },
["Yanping-WT"] = { "" },
["Shaowu"] = { "" },
["Guangze"] = { "" },
["Jiangle"] = { "" },
["Mingxi"] = { "" },
["Shunchang"] = { "" },
["Ningde-She"] = { "" },
["Fu'an-She"] = { "" },
["Fuding-She"] = { "" },
["Zhouning-She"] = { "" },
["Xiapu-She"] = { "" },
["Shouning-She"] = { "" },
["Gutian-She"] = { "" },
["Luoyuan-She"] = { "" },
["Sanming-She"] = { "" },
["Shunchang-She"] = { "" },
["Hua'an-She"] = { "" },
["Guixi-She"] = { "" },
["Yanshan-She"] = { "" },
["Cangnan-She"] = { "" },
["Jingning-She"] = { "" },
["Jingning-ZK-She"] = { "" },
["Lishui-She"] = { "" },
["Longyou-She"] = { "" },
["Lin'an-She"] = { "" },
["Jiande-She"] = { "" },
["Ningguo-She"] = { "" },
["Chaozhou-She"] = { "" },
["Fengshun-She"] = { "" },
["Guzhang-WX"] = { "" },
["Yuanling-WX"] = { "" },
["Luxi-WX"] = { "" },
["Luxi-WX-LJT"] = { "" },
["Luxi-WX-LJT-2"] = { "" },
["Chengbu-WX"] = { "" },
["Jiande-JXYM"] = { "" },
["Jinhua-JXYM"] = { "" },
["Lanxi-JXYM"] = { "" },
["Tunxi-JXYM"] = { "" },
["Jiangyong"] = { "" },
["Dong'an"] = { "" },
["Qujiang-DC"] = { "" },
["Wujiang-XY"] = { "" },
["Zhenjiang-SB"] = { "" },
["Renhua-ZT"] = { "" },
["Renhua-ST"] = { "" },
["Ruyuan-GT"] = { "" },
["Lechang-CL"] = { "" },
["Lechang-BX"] = { "" },
["Lechang-HP"] = { "" },
["Lechang-GT"] = { "" },
["Lechang-SX"] = { "" },
}
return export
durrnst8o2szurjzvb3hus1ebq9267f
钒
0
395062
2348999
2026-04-28T01:54:18Z
Hiyuune
50834
Trang mới: “{{also|釩}} {{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=167|rad=钅|as=03|sn=8|four=|canj=CHNI,OPHNI,XCHNI|ids=⿰钅凡}} ===={{section|ref}}==== * {{Han ref|kx=1328.061|hdz=64173.010|uh=9492}} =={{langname|zh}}== {{zh-see|釩}}”
2348999
wikitext
text/x-wiki
{{also|釩}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=167|rad=钅|as=03|sn=8|four=|canj=CHNI,OPHNI,XCHNI|ids=⿰钅凡}}
===={{section|ref}}====
* {{Han ref|kx=1328.061|hdz=64173.010|uh=9492}}
=={{langname|zh}}==
{{zh-see|釩}}
a4b6wjk2lzwk5y40hi0z9gdjsqj425a
Thể loại:Từ đánh vần với 钒 tiếng Trung Quốc
14
395063
2349000
2026-04-28T01:54:30Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2349000
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Từ đánh vần với 钒 theo ngôn ngữ
14
395064
2349001
2026-04-28T01:55:06Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2349001
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
chēng
0
395065
2349004
2026-04-28T02:06:56Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "cheng"}} =={{langname|cmn}}== ==={{ĐM|alt}}=== * {{alt|cmn|cheng||nonstandard}} * {{alt|cmn|ĉēŋ|ĉēng|chēŋ}} ==={{ĐM|rom}}=== {{cmn-pinyin}} # {{cmn-pinyin of|鐺}} # {{cmn-pinyin of|铛}} # {{cmn-pinyin of|偁}} # {{cmn-pinyin of|噌}} # {{cmn-pinyin of|埥}} # {{cmn-pinyin of|憆}} # {{cmn-pinyin of|抢}} # {{cmn-pinyin of|搴}} # {{cmn-pinyin of|撐}} # {{cmn-pinyin of|撑}} # {{cmn-pinyin of|枨}} # {{cmn-pinyin of|柼…”
2349004
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "cheng"}}
=={{langname|cmn}}==
==={{ĐM|alt}}===
* {{alt|cmn|cheng||nonstandard}}
* {{alt|cmn|ĉēŋ|ĉēng|chēŋ}}
==={{ĐM|rom}}===
{{cmn-pinyin}}
# {{cmn-pinyin of|鐺}}
# {{cmn-pinyin of|铛}}
# {{cmn-pinyin of|偁}}
# {{cmn-pinyin of|噌}}
# {{cmn-pinyin of|埥}}
# {{cmn-pinyin of|憆}}
# {{cmn-pinyin of|抢}}
# {{cmn-pinyin of|搴}}
# {{cmn-pinyin of|撐}}
# {{cmn-pinyin of|撑}}
# {{cmn-pinyin of|枨}}
# {{cmn-pinyin of|柼}}
# {{cmn-pinyin of|棦}}
# {{cmn-pinyin of|槍}}
# {{cmn-pinyin of|樕}}
# {{cmn-pinyin of|橕}}
# {{cmn-pinyin of|檉}}
# {{cmn-pinyin of|泟}}
# {{cmn-pinyin of|浾}}
# {{cmn-pinyin of|湜}}
# {{cmn-pinyin of|爯}}
# {{cmn-pinyin of|牚}}
# {{cmn-pinyin of|琤}}
# {{cmn-pinyin of|瞠}}
# {{cmn-pinyin of|秠}}
# {{cmn-pinyin of|稱}}
# {{cmn-pinyin of|穪}}
# {{cmn-pinyin of|竀}}
# {{cmn-pinyin of|緽}}
# {{cmn-pinyin of|蟶}}
# {{cmn-pinyin of|赪}}
# {{cmn-pinyin of|赬}}
# {{cmn-pinyin of|趚}}
# {{cmn-pinyin of|鎑}}
# {{cmn-pinyin of|鏿}}
# {{cmn-pinyin of|鐶}}
# {{cmn-pinyin of|铎}}
# {{cmn-pinyin of|阷}}
# {{cmn-pinyin of|頳}}
# {{cmn-pinyin of|饓}}
gh1upitto96oyza39wqpx52bmv7f1x6
ĉēŋ
0
395066
2349005
2026-04-28T02:07:32Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "cen"}} =={{langname|cmn}}== ==={{ĐM|rom}}=== {{cmn-pinyin|notr=1}} # {{rare sp|cmn|sc=Latn|chēng}}”
2349005
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "cen"}}
=={{langname|cmn}}==
==={{ĐM|rom}}===
{{cmn-pinyin|notr=1}}
# {{rare sp|cmn|sc=Latn|chēng}}
e8pa4kd71xhzsngxhqrugl6mizp1j38
ĉēng
0
395067
2349006
2026-04-28T02:08:45Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "ceng"}} =={{langname|cmn}}== ==={{ĐM|rom}}=== {{cmn-pinyin|notr=1}} # {{rare sp|cmn|sc=Latn|chēng}}”
2349006
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "ceng"}}
=={{langname|cmn}}==
==={{ĐM|rom}}===
{{cmn-pinyin|notr=1}}
# {{rare sp|cmn|sc=Latn|chēng}}
b1sch814ch9vgpo8gyvlhslcnr2hzyp
zung1
0
395068
2349007
2026-04-28T02:10:15Z
Hiyuune
50834
Trang mới: “=={{langname|yue}}== ==={{ĐM|pron}}=== {{Jyutping-IPA|zung1}} ==={{ĐM|rom}}=== {{yue-jyut}} # {{yue-jyutping of|中}} # {{yue-jyutping of|㐫}} # {{yue-jyutping of|伀}} # {{yue-jyutping of|倧}} # {{yue-jyutping of|𠊞}} # {{yue-jyutping of|㙡}} # {{yue-jyutping of|㙲}} # {{yue-jyutping of|㚇}} # {{yue-jyutping of|妐}} # {{yue-jyutping of|㜉}} # {{yue-jyutping of|宗}} # {{yue-jyutping of|尰}} # {{yue-jyutping of|嵕}} # {{yue-jyutping of|嵸}} # {{yue-jyutpi…”
2349007
wikitext
text/x-wiki
=={{langname|yue}}==
==={{ĐM|pron}}===
{{Jyutping-IPA|zung1}}
==={{ĐM|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|中}}
# {{yue-jyutping of|㐫}}
# {{yue-jyutping of|伀}}
# {{yue-jyutping of|倧}}
# {{yue-jyutping of|𠊞}}
# {{yue-jyutping of|㙡}}
# {{yue-jyutping of|㙲}}
# {{yue-jyutping of|㚇}}
# {{yue-jyutping of|妐}}
# {{yue-jyutping of|㜉}}
# {{yue-jyutping of|宗}}
# {{yue-jyutping of|尰}}
# {{yue-jyutping of|嵕}}
# {{yue-jyutping of|嵸}}
# {{yue-jyutping of|㢕}}
# {{yue-jyutping of|彸}}
# {{yue-jyutping of|㣭}}
# {{yue-jyutping of|忠}}
# {{yue-jyutping of|忪}}
# {{yue-jyutping of|悰}}
# {{yue-jyutping of|惾}}
# {{yue-jyutping of|憃}}
# {{yue-jyutping of|㨑}}
# {{yue-jyutping of|㫪}}
# {{yue-jyutping of|棕}}
# {{yue-jyutping of|椶}}
# {{yue-jyutping of|㮬}}
# {{yue-jyutping of|㯶}}
# {{yue-jyutping of|㳊}}
# {{yue-jyutping of|淙}}
# {{yue-jyutping of|𣽁}}
# {{yue-jyutping of|狆}}
# {{yue-jyutping of|㹣}}
# {{yue-jyutping of|㺋}}
# {{yue-jyutping of|㽫}}
# {{yue-jyutping of|㿈}}
# {{yue-jyutping of|盅}}
# {{yue-jyutping of|䁓}}
# {{yue-jyutping of|𥟡}}
# {{yue-jyutping of|稯}}
# {{yue-jyutping of|䇗}}
# {{yue-jyutping of|䈦}}
# {{yue-jyutping of|䈵}}
# {{yue-jyutping of|䈺}}
# {{yue-jyutping of|䉥}}
# {{yue-jyutping of|終}}
# {{yue-jyutping of|终}}
# {{yue-jyutping of|綜}}
# {{yue-jyutping of|緵}}
# {{yue-jyutping of|縱}}
# {{yue-jyutping of|繌}}
# {{yue-jyutping of|翪}}
# {{yue-jyutping of|腙}}
# {{yue-jyutping of|舂}}
# {{yue-jyutping of|舯}}
# {{yue-jyutping of|䑸}}
# {{yue-jyutping of|𦬕}}
# {{yue-jyutping of|蔠}}
# {{yue-jyutping of|䔏}}
# {{yue-jyutping of|䖲}}
# {{yue-jyutping of|螽}}
# {{yue-jyutping of|䗥}}
# {{yue-jyutping of|衷}}
# {{yue-jyutping of|䘴}}
# {{yue-jyutping of|䙂}}
# {{yue-jyutping of|豵}}
# {{yue-jyutping of|踨}}
# {{yue-jyutping of|踪}}
# {{yue-jyutping of|蹤}}
# {{yue-jyutping of|蹱}}
# {{yue-jyutping of|䡮}}
# {{yue-jyutping of|迚}}
# {{yue-jyutping of|鈡}}
# {{yue-jyutping of|钟}}
# {{yue-jyutping of|銿}}
# {{yue-jyutping of|𨨩}}
# {{yue-jyutping of|鍐}}
# {{yue-jyutping of|鍾}}
# {{yue-jyutping of|锺}}
# {{yue-jyutping of|鐘}}
# {{yue-jyutping of|𩅞}}
# {{yue-jyutping of|䩺}}
# {{yue-jyutping of|騌}}
# {{yue-jyutping of|騣}}
# {{yue-jyutping of|鬃}}
# {{yue-jyutping of|鬉}}
# {{yue-jyutping of|鬷}}
# {{yue-jyutping of|䱵}}
# {{yue-jyutping of|䴀}}
7cmzsz03543h1y4k11l7bl9d008nnsy
chiong
0
395069
2349008
2026-04-28T02:12:11Z
Hiyuune
50834
Trang mới: “=={{langname|nan-hbl}}== {{zh-see|鐘|poj}} {{zh-see|鐘|poj}}”
2349008
wikitext
text/x-wiki
=={{langname|nan-hbl}}==
{{zh-see|鐘|poj}}
{{zh-see|鐘|poj}}
m3h50bdnvzm7y3d53fl7wnyumtch2pn
2349009
2349008
2026-04-28T02:12:47Z
Hiyuune
50834
/* Tiếng Mân Tuyền Chương */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2349009
wikitext
text/x-wiki
=={{langname|nan-hbl}}==
==={{ĐM|etym}} 1===
{{zh-see|鐘|poj}}
==={{ĐM|etym}} 2===
{{zh-see|鐘|poj}}
4720n1eim4a47bl425gwa01965jnahg
钟
0
395070
2349012
2026-04-28T02:16:47Z
Hiyuune
50834
Trang mới: “{{also|鍾|鐘|鈡}} {{character info}} =={{langname|mul}}== {{stroke order|strokes=9}} ==={{section|han}}=== {{Han char|rn=167|rad=钅|as=04|sn=9|four=|canj=CL,OPL,XCL|ids=⿰钅中}} ===={{section|ref}}==== * {{Han ref|kx=1328.061|hdz=64176.070|uh=949F}} =={{langname|zh}}== ==={{section|etym}} 1=== {{zh-see|鐘}} ==={{section|etym}} 2=== {{zh-see|鍾}}”
2349012
wikitext
text/x-wiki
{{also|鍾|鐘|鈡}}
{{character info}}
=={{langname|mul}}==
{{stroke order|strokes=9}}
==={{section|han}}===
{{Han char|rn=167|rad=钅|as=04|sn=9|four=|canj=CL,OPL,XCL|ids=⿰钅中}}
===={{section|ref}}====
* {{Han ref|kx=1328.061|hdz=64176.070|uh=949F}}
=={{langname|zh}}==
==={{section|etym}} 1===
{{zh-see|鐘}}
==={{section|etym}} 2===
{{zh-see|鍾}}
3sqep3z5rlcy0nabyymxqd2rgrue22m
Mô đun:zh/data/och-pron-ZS/撞
828
395071
2349013
2026-04-28T02:19:23Z
Hiyuune
50834
Trang mới: “return { { "17421", "重", "東", "0", "幢", "rdoːŋ", "" }, { "17426", "重", "東", "0", "䡴", "rdoːŋs", "" }, }”
2349013
Scribunto
text/plain
return {
{ "17421", "重", "東", "0", "幢", "rdoːŋ", "" },
{ "17426", "重", "東", "0", "䡴", "rdoːŋs", "" },
}
dvco24oq1stoijdsn6trtzquvww5iys
tōng
0
395072
2349014
2026-04-28T02:21:03Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "tong"}} =={{langname|cmn}}== ==={{ĐM|alt}}=== * {{alt|cmn|tong||nonstandard}} * {{alt|cmn|tōŋ}} ==={{ĐM|pron}}=== * {{audio|cmn|Zh-tōng.ogg}} ==={{ĐM|rom}}=== {{cmn-pinyin}} # {{cmn-pinyin of|嗵}} # {{cmn-pinyin of|恫}} # {{cmn-pinyin of|樋}} # {{cmn-pinyin of|炵}} # {{cmn-pinyin of|熥}} # {{cmn-pinyin of|狪}} # {{cmn-pinyin of|痌}} # {{cmn-pinyin of|蓪}} # {{cmn-pinyin of|通}} # {{cmn-pinyin of|囲}}”
2349014
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "tong"}}
=={{langname|cmn}}==
==={{ĐM|alt}}===
* {{alt|cmn|tong||nonstandard}}
* {{alt|cmn|tōŋ}}
==={{ĐM|pron}}===
* {{audio|cmn|Zh-tōng.ogg}}
==={{ĐM|rom}}===
{{cmn-pinyin}}
# {{cmn-pinyin of|嗵}}
# {{cmn-pinyin of|恫}}
# {{cmn-pinyin of|樋}}
# {{cmn-pinyin of|炵}}
# {{cmn-pinyin of|熥}}
# {{cmn-pinyin of|狪}}
# {{cmn-pinyin of|痌}}
# {{cmn-pinyin of|蓪}}
# {{cmn-pinyin of|通}}
# {{cmn-pinyin of|囲}}
00q55mh1hejqytkctayyww7b2kg0k0b
tóng
0
395073
2349015
2026-04-28T02:22:24Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "tong"}} =={{langname|cmn}}== ==={{ĐM|alt}}=== * {{alt|cmn|tong||nonstandard}} * {{alt|cmn|tóŋ}} ==={{ĐM|pron}}=== * {{audio|cmn|Zh-tóng.ogg}} ==={{ĐM|rom}}=== {{cmn-pinyin}} # {{cmn-pinyin of|仝}} # {{cmn-pinyin of|佟}} # {{cmn-pinyin of|侗}} # {{cmn-pinyin of|僮}} # {{cmn-pinyin of|勭}} # {{cmn-pinyin of|同}} # {{cmn-pinyin of|哃}} # {{cmn-pinyin of|垉}} # {{cmn-pinyin of|峂}} # {{cmn-pinyin of|峒}} # {{cmn-pinyi…”
2349015
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "tong"}}
=={{langname|cmn}}==
==={{ĐM|alt}}===
* {{alt|cmn|tong||nonstandard}}
* {{alt|cmn|tóŋ}}
==={{ĐM|pron}}===
* {{audio|cmn|Zh-tóng.ogg}}
==={{ĐM|rom}}===
{{cmn-pinyin}}
# {{cmn-pinyin of|仝}}
# {{cmn-pinyin of|佟}}
# {{cmn-pinyin of|侗}}
# {{cmn-pinyin of|僮}}
# {{cmn-pinyin of|勭}}
# {{cmn-pinyin of|同}}
# {{cmn-pinyin of|哃}}
# {{cmn-pinyin of|垉}}
# {{cmn-pinyin of|峂}}
# {{cmn-pinyin of|峒}}
# {{cmn-pinyin of|峝}}
# {{cmn-pinyin of|庝}}
# {{cmn-pinyin of|彤}}
# {{cmn-pinyin of|晍}}
# {{cmn-pinyin of|曈}}
# {{cmn-pinyin of|朣}}
# {{cmn-pinyin of|桐}}
# {{cmn-pinyin of|橣}}
# {{cmn-pinyin of|氃}}
# {{cmn-pinyin of|洛}}
# {{cmn-pinyin of|浵}}
# {{cmn-pinyin of|潼}}
# {{cmn-pinyin of|烔}}
# {{cmn-pinyin of|燑}}
# {{cmn-pinyin of|爞}}
# {{cmn-pinyin of|犝}}
# {{cmn-pinyin of|獞}}
# {{cmn-pinyin of|瞳}}
# {{cmn-pinyin of|砼}}
# {{cmn-pinyin of|硐}}
# {{cmn-pinyin of|秱}}
# {{cmn-pinyin of|穜}}
# {{cmn-pinyin of|童}}
# {{cmn-pinyin of|筩}}
# {{cmn-pinyin of|粡}}
# {{cmn-pinyin of|絧}}
# {{cmn-pinyin of|罿}}
# {{cmn-pinyin of|膧}}
# {{cmn-pinyin of|艟}}
# {{cmn-pinyin of|茼}}
# {{cmn-pinyin of|蕫}}
# {{cmn-pinyin of|詷}}
# {{cmn-pinyin of|赧}}
# {{cmn-pinyin of|迵}}
# {{cmn-pinyin of|酮}}
# {{cmn-pinyin of|里}}
# {{cmn-pinyin of|鉖}}
# {{cmn-pinyin of|鉵}}
# {{cmn-pinyin of|銅}}
# {{cmn-pinyin of|铜}}
# {{cmn-pinyin of|餇}}
# {{cmn-pinyin of|鮦}}
# {{cmn-pinyin of|鲖}}
# {{cmn-pinyin of|鼒}}
# {{cmn-pinyin of|鼨}}
# {{cmn-pinyin of|㸗}}
# {{cmn-pinyin of|垌}}
# {{cmn-pinyin of|洞}}
srex1uczhm0p616rc1f1mltfd5qnovi
englobing
0
395074
2349033
2026-04-28T02:36:55Z
Hiyuune
50834
+ en
2349033
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|v}}===
{{head|en|Biến thể hình thái động từ}}
# {{infl of|en|englobe||ing-form}}
==={{section|ana}}===
* {{anagrams|en|a=beggilnno|belonging}}
l77d2gbowp5uvtd89yak92gs3rkee1i
Mô đun:zh/data/och-pron-ZS/嵐
828
395075
2349035
2026-04-28T06:47:35Z
Hiyuune
50834
Trang mới: “return { { "2910", "凡", "侵", "3", "婪", "b·ruːm", "" }, }”
2349035
Scribunto
text/plain
return {
{ "2910", "凡", "侵", "3", "婪", "b·ruːm", "" },
}
49nusi3qvruym3uvah69bpu2735g355
Mô đun:zh/data/och-pron-ZS/葻
828
395076
2349036
2026-04-28T08:38:04Z
Hiyuune
50834
Trang mới: “return { { "2911", "凡", "侵", "3", "婪", "b·uːm", "" }, }”
2349036
Scribunto
text/plain
return {
{ "2911", "凡", "侵", "3", "婪", "b·uːm", "" },
}
fz1c753bx2wn002c4wx2kyv09z50qri
Mô đun:zh/data/och-pron-ZS/釩
828
395077
2349037
2026-04-28T08:45:40Z
Hiyuune
50834
Trang mới: “return { { "2912", "凡", "談", "3", "釩", "pʰomʔ", "" }, }”
2349037
Scribunto
text/plain
return {
{ "2912", "凡", "談", "3", "釩", "pʰomʔ", "" },
}
fx59htrna4wim8ezpn2owh1dnrpxpfj
Mô đun:zh/data/och-pron-ZS/汎
828
395078
2349038
2026-04-28T08:48:50Z
Hiyuune
50834
Trang mới: “return { { "2913", "凡", "談", "3", "汎", "pʰoms", "" }, { "2930", "凡", "侵", "3", "馮", "bum", "" }, }”
2349038
Scribunto
text/plain
return {
{ "2913", "凡", "談", "3", "汎", "pʰoms", "" },
{ "2930", "凡", "侵", "3", "馮", "bum", "" },
}
a8rfm0kse5d9tirvbamr1s10xam93n7
汎
0
395079
2349039
2026-04-28T08:51:06Z
Hiyuune
50834
Trang mới: “{{also|泛}} {{resembles|汛}} {{character info}} {{character info|0x2F8FA}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=85|rad=水|as=03|sn=6|four=37110|canj=EHNI|ids=⿰氵凡}} ===={{section|drv}}==== * {{l|mul|[[𡋋]], [[𣑃]], [[盕]], [[𫇼]]}} ===={{section|ref}}==== {{Han ref|kx=0604.150|dkj=17120|dj=0998.100|hdz=31553.020|uh=6C4E}} {{Han ref|uh=2F8FA}} =={{langname|zh}}== ==={{section|glyph origin}}=== {{Han etym}} {{Han compound|水|alt1=氵…”
2349039
wikitext
text/x-wiki
{{also|泛}}
{{resembles|汛}}
{{character info}}
{{character info|0x2F8FA}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=85|rad=水|as=03|sn=6|four=37110|canj=EHNI|ids=⿰氵凡}}
===={{section|drv}}====
* {{l|mul|[[𡋋]], [[𣑃]], [[盕]], [[𫇼]]}}
===={{section|ref}}====
{{Han ref|kx=0604.150|dkj=17120|dj=0998.100|hdz=31553.020|uh=6C4E}}
{{Han ref|uh=2F8FA}}
=={{langname|zh}}==
==={{section|glyph origin}}===
{{Han etym}}
{{Han compound|水|alt1=氵|凡|ls=psc|c1=s|c2=p}}.
==={{section|etym}} 1===
{{zh-see|泛|v}}
==={{section|etym}} 2===
{{zh-forms}}
===={{section|pron}}====
{{zh-pron
|m=fàn
|cat=pn
}}
==={{section|dfn}}===
{{head|zh|Hanzi}}
# {{surname|zh}}
ge36bghz59fs40to71f04o3divj24k0
dhoora
0
395080
2349041
2026-04-28T08:55:32Z
Hiyuune
50834
Trang mới: “=={{langname|en}}== ==={{ĐM|noun}}=== {{en-noun|-}} # {{alt form|en|durra}}.”
2349041
wikitext
text/x-wiki
=={{langname|en}}==
==={{ĐM|noun}}===
{{en-noun|-}}
# {{alt form|en|durra}}.
hnip0br5bmcj1vfppbemupmteot7xfx
prawdopodobieństwa
0
395081
2349043
2026-04-28T09:25:55Z
Hiyuune
50834
+ pl
2349043
wikitext
text/x-wiki
=={{langname|pl}}==
==={{section|noun}}===
{{head|pl|Biến thể hình thái danh từ}}
# {{infl of|pl|prawdopodobieństwo||nom//acc//voc|p|;|gen|s}}
i03ftrkstyzvtw8y3y8pbdizcb4bsfg