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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/41|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W41"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:23, ngày 6 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29400897 --> == <span lang="en" dir="ltr">Have your say: vote for the 2025 Board of Trustees</span> == <div lang="en" dir="ltr"> <section begin="announcement-content" /> Hello all, The voting period for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025|2025 Board of Trustees election]] is now open. Candidates are running for two (2) seats on the Board. To check your voter eligibility, please visit the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Voter eligibility guidelines|voter eligibility page]]. Learn more about them by [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidates|reading their application statements and watch their candidacy videos]]. When you are ready, go to the [[m:Special:SecurePoll/vote/405|SecurePoll voting page to vote]]. '''The vote is open from October 8 at 00:00 UTC to October 22 at 23:59 UTC.''' Best regards, Abhishek Suryawanshi<br />Chair, Elections Committee<section end="announcement-content" /> </div> [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 04:49, ngày 9 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:RamzyM (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29360896 --> == Bản tin Kỹ thuật: Tuần 42-2025 == <section begin="technews-2025-W42"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/42|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Tuần trước, chúng tôi đã tiến hành triển khai những cải tiến về các tính năng bảo mật tài khoản và xác thực hai yếu tố (2FA) trên tất cả các wiki. Những thay đổi đó bao gồm cải tiến giao diện người dùng cho trang [https://auth.wikimedia.org/metawiki/wiki/Special:AccountSecurity Đặc biệt:Bảo mật tài khoản], hỗ trợ nhiều phương thức xác thực 2FA thông qua các ứng dụng xác thực và khóa bảo mật di động (trước đây người dùng chỉ có thể kích hoạt một phương thức xác thực), và mô đun Mã Khôi phục mới giúp giảm thiểu tình trạng khóa tài khoản do mất ứng dụng và thiết bị xác thực hai yếu tố. Là một phần của dự án [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]], quá trình này sẽ tiếp tục trong phần còn lại của năm 2025 để cải thiện nhiều hơn trải nghiệm người dùng, cùng việc thêm hỗ trợ cho mã khóa làm phương thức xác thực thứ hai thay thế. '''Cập nhật cho biên tập viên''' * Một phần khác của dự án Bảo mật tài khoản là cung cấp 2FA cho tất cả người dùng. Bên cạnh biên tập viên có quyền nâng cao, chẳng hạn như bảo quản viên và hành chính viên, 40% biên tập viên nay có quyền truy cập vào 2FA. Bạn có thể kiểm tra xem bạn có quyền truy cập đó không tại [https://auth.wikimedia.org/metawiki/wiki/Special:AccountSecurity Đặc biệt: Bảo mật tài khoản]. Hướng dẫn kích hoạt có trên trang được liên kết theo. Kế hoạch là tiếp tục tăng cường tính khả dụng nếu xác định rằng khả năng hỗ trợ người dùng có thể hỗ trợ việc sử dụng toàn cục của nó. [https://phabricator.wikimedia.org/T400579] * Tuần này, người dùng trên các wiki mà mặc định đã có sẵn tính năng [[mw:Special:MyLanguage/Talk pages project/Usability|Cải tiến Khả năng Sử dụng]] trên trang thảo luận (tất cả ''trừ'' 12 wiki được liệt kê trong tác vụ [[phab:T379264|T379264]]) sẽ có được khả năng gửi lời cảm ơn bình luận trực tiếp trên trang thảo luận mà nó xuất hiện. Trước thay đổi này, việc cảm ơn chỉ có thể được thực hiện bằng cách truy cập lịch sử sửa đổi của trang thảo luận. Bạn có thể [[diffblog:2025/10/13/revolutionizing-gratitude-a-new-era-of-thanking-comments/|tìm hiểu thêm về thay đổi này]]. [https://phabricator.wikimedia.org/T366095] * Người dùng chưa [[Special:Preferences#mw-prefsection-personal-email|xác thực địa chỉ email của mình]] sẽ sớm nhận thông báo hàng tháng nhắc họ làm điều này. Điều này là bởi vì người dùng đã xác thực email của họ có thể dễ dàng khôi phục tài khoản của mình hơn. Những lời nhắc này sẽ không được gửi nếu người dùng không hoạt động hoặc đã loại bỏ email chưa được xác thực khỏi tài khoản của mình. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Email_confirmation][https://phabricator.wikimedia.org/T58074] * [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, đã có một bản sửa lỗi nhằm giải quyết một lỗi thỉnh thoảng xảy ra khi lưu các đoạn đã được dịch trong công cụ Dịch Nội dung, cùng với đó các thông báo lỗi có liên quan giờ dễ nhìn hơn. [https://phabricator.wikimedia.org/T376531] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Nhóm Công cụ Không được Hỗ trợ đã chọn [[c:Special:MyLanguage/Commons:Video2commons|Video2Commons]] làm công cụ đầu tiên cho chu kỳ thí điểm của họ. Nhóm sẽ tìm hiểu cách để cải tiến và duy trì công cụ này trong những tháng tiếp theo. [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|Tìm hiểu thêm trên Meta]]. * [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.23|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/42|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W42"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:59, ngày 13 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29434481 --> == <span lang="en" dir="ltr">Help us decide the name of the new Abstract Wikipedia project</span> == <div lang="en" dir="ltr"> <section begin="function1"/> {{int:Hello}}. Please help pick a name for the new Abstract Wikipedia wiki project. This project will be a wiki that will enable users to combine functions from [[:f:|Wikifunctions]] and data from Wikidata in order to generate natural language sentences in any supported languages. These sentences can then be used by any Wikipedia (or elsewhere). There will be two rounds of voting, each followed by legal review of candidates, with votes beginning on 20 October and 17 November 2025. Our goal is to have a final project name selected on mid-December 2025. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki. {{Int:Feedback-thanks-title}} <section end="function1"/> </div> -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 11:44, ngày 20 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Sannita (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29432175 --> == Bản tin Kỹ thuật: Tuần 43-2025 == <section begin="technews-2025-W43"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/43|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Để tối ưu hóa cách dữ liệu người dùng được lưu trong cơ sở dữ liệu của chúng tôi, các tùy chọn được lưu của người dùng chưa đăng nhập trong vòng hơn 5 năm và có ít hơn 100 sửa đổi sẽ bị xóa. Khi những người dùng đó quay lại, tùy chọn mặc định sẽ được áp dụng. [https://phabricator.wikimedia.org/T406724] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:20}} {{PLURAL:20|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, đã có một liên kết hỏng từ thông điệp giao diện Đóng góp toàn cục đến trang Đóng góp toàn cục trên XTools mà hiện đã được giải quyết. [https://phabricator.wikimedia.org/T406415] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Việc định tuyến lại toàn bộ lưu lượng đến các điểm cuối API theo cổng <code dir=ltr><nowiki>rest.php</nowiki></code> thông qua một cổng API chung hiện đã hoàn tất. Nếu phát hiện bất kỳ vấn đề nào, vui lòng gửi tác vụ phabricator lên [[phab:tag/serviceops/|bảng tác vụ của nhóm Vận hành Dịch vụ]]. * Các sửa đổi đối với chú thích hoặc từ hạn định Wikidata nay sẽ ít hiển thị thường xuyên hơn trên các mục Thay đổi gần đây và Danh sách theo dõi trên các wiki khác, nhằm giảm bớt các thông báo không cần thiết. Thay đổi này sẽ giảm tổng số lượng các khoản mục 'gây nhiễu'. Bản thân các trang Wikidata sẽ không có sự thay đổi nào. [https://phabricator.wikimedia.org/T401290] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.24|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/43|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W43"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:36, ngày 20 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29478670 --> == Bản tin Kỹ thuật: Tuần 44-2025 == <section begin="technews-2025-W44"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/44|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Ứng dụng Wikipedia dành cho iOS đã ra mắt thử nghiệm A/B/C nhằm cải tiến tính năng duyệt theo thẻ cho một số khu vực và ngôn ngữ nhất định. Thử nghiệm mang tên “Nhiều thẻ động hơn” này sẽ khám phá trải nghiệm trên thẻ mới cùng với việc bổ sung đề xuất bài viết ở mục “Bạn có biết” và “Vì bạn đã đọc”. Bạn có thể [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/Tabbed Browsing (Tabs)/New Tab Experience and Recommendations Experiment|đọc thêm thông tin trên trang dự án này]]. * Thành viên tự xác nhận trên các wiki [[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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/44|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W44"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:31, ngày 27 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29513638 --> == <span lang="en" dir="ltr">Seeking volunteers to join several of the movement’s committees</span> == <div lang="en" dir="ltr"> <section begin="announcement-content" /> Each year, typically from October through December, several of the movement’s committees seek new volunteers. Read more about the committees on their Meta-wiki pages: * [[m:Special:MyLanguage/Affiliations Committee|Affiliations Committee (AffCom)]] * [[m:Special:MyLanguage/Ombuds commission|Ombuds commission (OC)]] * [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|Case Review Committee (CRC)]] Applications for the committees open on October 30, 2025. Applications for the Affiliations Committee, Ombuds commission and the Case Review Committee close on December 11, 2025. Learn how to apply by [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Committee appointments|visiting the appointment page on Meta-wiki]]. Post to the talk page or email cst[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org with any questions you may have. For the Committee Support team, <section end="announcement-content" /> </div> -[[m:User:MKaur (WMF)| MKaur (WMF)]] 14:14, ngày 30 tháng 10 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:MKaur (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29517125 --> == Bản tin Kỹ thuật: Tuần 45-2025 == <section begin="technews-2025-W45"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/45|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Các bảo quản viên giờ đây sẽ thấy rằng [[{{#special:MergeHistory}}]] đã trở nên linh hoạt hơn đáng kể trong việc hợp nhất. Nó có thể hợp nhất các phần được lấy từ giữa lịch sử của trang nguồn (thay vì chỉ từ phần đầu), và chèn các phiên bản vào bất kỳ vị trí nào trong lịch sử của trang đích (thay vì chỉ ở phần đầu). [https://phabricator.wikimedia.org/T382958] * Đối với những người dùng đã kích hoạt "{{int:discussiontools-preference-autotopicsub}}" [[Special:Preferences#mw-prefsection-editing|trong tùy chọn của họ]], việc bắt đầu một chủ đề mới hoặc thêm một phản hồi vào một chủ đề hiện có giờ đây sẽ tự động đăng ký họ theo dõi các phản hồi mới trong chủ đề đó. Trước đây, điều này chỉ xảy ra nếu người dùng sử dụng tiện ích "{{int:Skin-action-addsection}}" hoặc "{{int:Discussiontools-replybutton}}" của DiscussionTools. Khi DiscussionTools mới được ra mắt, các tài khoản hiện có không được tự động bật tính năng theo dõi chủ đề, vì vậy thay đổi này chủ yếu sẽ ảnh hưởng đến các tài khoản mới hơn và những người dùng đã chủ động thay đổi tùy chọn của mình kể từ thời điểm đó. [https://phabricator.wikimedia.org/T290778] * Các mô đun Scribunto giờ đây có thể được dùng để [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#SVG library|tạo ảnh SVG]]. Tính năng này cho phép tạo biểu đồ, đồ họa và các hình minh họa khác một cách linh hoạt thông qua Lua, giúp giảm nhu cầu phải tạo chúng bên ngoài rồi tải lên dưới dạng tập tin. [https://phabricator.wikimedia.org/T405861] * Các trang web của Wikimedia giờ đây sẽ cung cấp cho tất cả người dùng ẩn danh tùy chọn bật chế độ tối, với giao diện chữ sáng trên nền tối. Cải tiến này nhằm mang lại trải nghiệm đọc dễ chịu hơn, đặc biệt là trong môi trường thiếu sáng. [https://phabricator.wikimedia.org/T395628] * Những người dùng có danh sách theo dõi lớn từ lâu đã gặp lỗi quá thời gian khi chỉnh sửa [[Special:EditWatchlist|Special:EditWatchlist]]. Trang này nay sẽ tải các mục theo từng phần nhỏ thay vì tải toàn bộ cùng lúc nhờ bản cập nhật phân trang, giúp mọi người có thể chỉnh sửa danh sách theo dõi mượt mà hơn. Trong quá trình cập nhật cơ sở dữ liệu, tính năng sắp xếp theo thời hạn đã bị loại bỏ vì chậm hơn hơn 100 lần so với sắp xếp theo tên trang. Một [https://meta.wikimedia.org/wiki/Community_Wishlist/W454 yêu cầu từ cộng đồng] đã được tạo để tìm các cách thay thế nhằm khôi phục tính năng sắp xếp theo thời hạn. Nếu bạn thấy tính năng này quan trọng, hãy ủng hộ yêu cầu đó! [https://phabricator.wikimedia.org/T41510] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:31}} {{PLURAL:31|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, việc khắc phục lỗi tô sáng vẫn còn hiển thị sau khi sử dụng tính năng tìm và thay thế của VisualEditor trong quá trình tìm kiếm. [https://phabricator.wikimedia.org/T407318] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Từ năm 2019, [[m:Special:MyLanguage/Wikimedia URL Shortener|Trình rút gọn URL của Wikimedia]] tại https://w.wiki đã có sẵn cho tất cả các wiki của Wikimedia để tạo liên kết ngắn đến bài viết, liên kết cố định, bản so sánh, v.v. Tính năng này có trong thanh bên với tên "Lấy URL rút gọn". Hiện có 30 wiki vẫn đang sử dụng tiện ích mở rộng cũ "ShortUrl". Tiện ích cũ này sẽ sớm bị gỡ bỏ. Điều này có nghĩa là các URL dạng <code>/s/</code> sẽ không còn được hiển thị dưới tiêu đề bài viết thông qua thẻ HTML <code dir=ltr>class="title-shortlink"</code>. Tuy nhiên, các URL dạng <code>/s/</code> vẫn sẽ tiếp tục hoạt động. [https://phabricator.wikimedia.org/T107188] * Vào thứ Năm, ngày 30 tháng 10, các nhóm [[:mw:Special:MyLanguage/MediaWiki Interfaces Team|Giao diện MediaWiki]] và [[:mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|Vận hành Dịch vụ SRE]] đã bắt đầu chuyển hướng lưu lượng của Action API thông qua một cổng API chung. Các wiki riêng lẻ sẽ được cập nhật theo từng nhóm phát hành tiêu chuẩn, với tổng lưu lượng được tăng dần theo thời gian. Thay đổi này được kỳ vọng sẽ không gây ra lỗi hoặc gián đoạn. Nếu bạn phát hiện bất kỳ sự cố nào, vui lòng gửi báo cáo trên bảng [https://phabricator.wikimedia.org/tag/serviceops/ của nhóm Vận hành Dịch vụ]. * Việc triển khai MediaWiki Train sẽ tạm dừng trong hai tuần cuối cùng của năm 2025: ngày 22 và 29 tháng 12. Các khung thời gian backport cũng sẽ tạm ngưng từ thứ Hai, ngày 22 tháng 12 năm 2025 đến thứ Năm, ngày 2 tháng 1 năm 2026. "Backport window" là khoảng thời gian được lên lịch để bổ sung các nội dung như bản vá lỗi và thay đổi cấu hình. Hiện vẫn còn bảy đợt triển khai MediaWiki Train nữa trong năm 2025. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/SMWTEAES4SDLDUSK4HMWNBSKNCXZAWYN/] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.26|MediaWiki]] '''Chuyên sâu''' * Năm 2025, Quỹ Wikimedia báo cáo rằng các hệ thống AI và công cụ tìm kiếm ngày càng sử dụng nội dung từ Wikipedia mà không dẫn người dùng quay lại trang, góp phần khiến lượng lượt xem từ người dùng thực giảm 8% so với năm 2024. Sau khi phát hiện các bot giả dạng người dùng thật, Wikimedia đã cập nhật dữ liệu truy cập để phản ánh sự thay đổi này. Bạn có thể đọc thêm về xu hướng người dùng hiện nay trên Wikipedia trong [[diffblog:2025/10/17/new-user-trends-on-wikipedia/|bài viết trên blog Diff]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/45|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W45"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:34, ngày 3 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29552512 --> == Bản tin Kỹ thuật: Tuần 46-2025 == <section begin="technews-2025-W46"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/46|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' [[File:Talk pages default look (April 2023).jpg|thumb|alt=Hình chụp những thay đổi về mặt trực quan được thực hiện trên trang thảo luận|Ví dụ về trang thảo luận với thiết kế mới, bằng tiếng Pháp.]] * Kể từ ngày 12 tháng 11, người dùng sẽ nhận thấy sự thay đổi về [[m:Special:MyLanguage/Talk pages project/Feature summary#Usability improvements|giao diện của các trang thảo luận]] trên [[Phab:T379264|một số trang Wikipedia]]. Hầu hết [[phab:T392121|toàn bộ các wiki]] đã có được thay đổi về mặt thiết kế này; những thay đổi này sẽ được thực hiện sau trên [[phab:T409297|Wikipedia tiếng Anh]]. Bạn có thể đọc thêm [[diffblog:2024/05/02/making-talk-pages-better-for-everyone/|trên ''Diff'']]. Người dùng có thể chọn không thực hiện thay đổi này [[Special:Preferences#mw-prefsection-editing|trong tùy chọn người dùng của mình]] ở tùy chọn "{{int:discussiontools-preference-visualenhancements}}". [https://phabricator.wikimedia.org/T379264] * MediaWiki nay có thể hiển thị [[mw:Special:MyLanguage/Help:Protection indicators|chỉ báo trên trang]] tự động khi một trang bị khóa. Tính năng này được tắt theo mặc định. Nó có thể được bật theo [[m:Special:MyLanguage/Requesting wiki configuration changes|yêu cầu của cộng đồng]]. [https://phabricator.wikimedia.org/T12347] * Việc sử dụng các nút "{{int:showpreview}}" hoặc "{{int:showdiff}}" trong trình soạn thảo mã nguồn nay sẽ đi kèm một số tham số URL nhất định như '[[mw:Special:MyLanguage/Manual:Parameters to index.php#useskin|useskin]]', '[[mw:Special:MyLanguage/Manual:Parameters to index.php#uselang|uselang]]' và '[[mw:Special:MyLanguage/Help:Section#Editing sections|section]]'. Bản cập nhật này đồng thời cũng sửa một vấn đề mà, nếu trình duyệt bị sập khi đang xem trước sửa đổi một đề mục duy nhất, việc lưu sửa đổi này có thể ghi đè toàn bộ trang chỉ bằng nội dung của đề mục đó. [https://phabricator.wikimedia.org/T62744][https://phabricator.wikimedia.org/T24029][https://phabricator.wikimedia.org/T155097] * Các wiki Wikivoyage có thể dùng [[mw:Special:MyLanguage/Help:Extension:Kartographer#Markers and counters|điểm đánh dấu bản đồ bằng màu trong nội dung văn bản của bài viết]]. Nội dung văn bản của những điểm đánh dấu đó nay sẽ được hiển thị bằng màu đen hoặc trắng tương phản, thay vì luôn luôn là màu trắng. Cộng đồng có thể loại bỏ các phương pháp giải quyết cục bộ cho vấn đề này. [https://phabricator.wikimedia.org/T369454] * Tab Hoạt động trên ứng dụng Wikipedia dành cho Android nay có sẵn cho tất cả người dùng. Tab mới này cung cấp thông tin chuyên sâu được cá nhân hóa về hoạt động đọc, sửa đổi, và quyên góp, đồng thời đơn giản hóa việc điều hướng và giúp cho việc sử dụng ứng dụng trở nên hấp dẫn hơn. [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/Activity_Tab_Experiment] * Nhóm Phát triển Độc giả (Reader Growth) chuẩn bị khởi động thử nghiệm mang tên "Duyệt hình ảnh" để kiểm tra cách giúp người đọc dễ dàng duyệt và khám phá hình ảnh trên các bài viết Wikipedia hơn. Thử nghiệm này, một thử nghiệm A/B dành riêng cho thiết bị di động, sẽ bắt đầu được thực hiện vào tuần từ ngày 17 tháng 11 và sẽ kéo dài trong bốn tuần, ảnh hưởng đến 0,05% người dùng trên wiki tiếng Anh. Thử nghiệm này đã bắt đầu vào ngày 3 tháng 11 trên các wiki tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia và tiếng Việt, ảnh hưởng đến tối đa 10% người dùng trên những wiki này. [https://www.mediawiki.org/wiki/Readers/Reader_Growth/WE3.1.3_Image_Browsing] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:27}} {{PLURAL:27|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ như đã khắc phục việc không thể khóa tài khoản trên trang web dành cho di động. [https://phabricator.wikimedia.org/T256185] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[wikitech:Help talk:Toolforge/Toolforge standards committee#November 2025 committee nominations|Wikitech đang mở đề cử]] chọn thành viên mới của [[wikitech:Help:Toolforge/Toolforge standards committee|Ủy ban tiêu chuẩn của Toolforge]]. Ủy ban này giám sát [[wikitech:Help:Toolforge/Right to fork policy|Chính sách quyền sử dụng bản sao]] và [[wikitech:Help:Toolforge/Abandoned tool policy|Chính sách cho công cụ bị bỏ rơi]] của Toolforge cùng nhiều nhiệm vụ khác. Đề cử sẽ tiếp tục mở đến hết ngày 28 tháng 11 năm 2025. * [[w:JSON Web Token#Standard fields|Trường bên cung cấp JWT]] trong [[mw:Special:MyLanguage/OAuth/For Developers#OAuth 2|mã truy cập OAuth 2]] dành cho [[m:Special:MyLanguage/Help:Unified login|wiki SUL]] (đăng nhập trung ương) đã được thay đổi thành <code><nowiki>https://meta.wikimedia.org</nowiki></code>. Các mã truy cập cũ vẫn sẽ hoạt động. [https://phabricator.wikimedia.org/T399199] * [[w:JSON Web Token#Standard fields|Trường chủ đề JWT]] trong [[mw:Special:MyLanguage/OAuth/For Developers#OAuth 2|mã truy cập OAuth 2]] sẽ sớm thay đổi từ <code><user id></code> sang <code dir=ltr style="white-space:nowrap">mw:<identity type>:<user id></code>, trong đó <code><identity type></code> thường là <code dir=ltr>CentralAuth:</code><!-- not a typo --> (đối với [[m:Special:MyLanguage/Help:Unified login|wiki SUL]]) hoặc <code dir=ltr style="white-space:nowrap">local:<wiki id></code> (đối với các wiki khác). Điều này là nhằm tránh xung đột giữa các loại ID người dùng khác nhau, và để mã truy cập OAuth 2 và cookie <code>sessionJwt</code> trở nên giống nhau hơn. Các mã truy cập cũ vẫn sẽ hoạt động. [https://phabricator.wikimedia.org/T399199] * Các thông điệp cấm của MediaWiki ([[MediaWiki:Blockedtext|blockedtext]], [[MediaWiki:Blockedtext-partial|blockedtext-partial]], [[MediaWiki:Autoblockedtext|autoblockedtext]], [[MediaWiki:Systemblockedtext|systemblockedtext]], [[MediaWiki:Blockedtext-tempuser|blockedtext-tempuser]], [[MediaWiki:Autoblockedtext-tempuser|autoblockedtext-tempuser]]) nay hỗ trợ thêm các tham số bổ sung nhằm chỉ ra xem người dùng đó có bị cấm sửa đổi trang thảo luận của mình <code><nowiki>$9</nowiki></code> hoặc gửi thư điện tử cho người dùng khác <code><nowiki>$</nowiki><nowiki>10</nowiki></code> hay không. [https://phabricator.wikimedia.org/T285612] * Nhánh <code>REL1_45</code> cho lõi MediaWiki và từng phần mở rộng cùng giao diện trong git của Wikimedia đã được tạo. Đây là bước đầu tiên trong quá trình phát hành phiên bản MediaWiki 1.45.0, được lên kế hoạch triển khai vào cuối tháng 11 năm 2025. Nếu bạn đang thực hiện việc khắc phục lỗi nghiêm trọng hoặc thực hiện tính năng mới, bạn có thể cần phải lưu ý thay đổi này. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/ZUY7TY3Z6XPZWZVAZV63OPO5OW52Q6GE/] * Quy trình tạo bản dump CirrusSearch đã được cập nhật do hiệu suất bị chậm. Nếu bạn gặp bất kỳ sự cố nào khi chuyển sang bản dump thay thế, vui lòng liên hệ với Nhóm Nền tảng Tìm kiếm để được hỗ trợ. [https://phabricator.wikimedia.org/T366248][https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/3KQPOR6ACVN6OVLMLZPIBXQSWQKW4E3K/] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.2|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/46|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W46"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:38, ngày 10 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29606150 --> == Bản tin Kỹ thuật: Tuần 47-2025 == <section begin="technews-2025-W47"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/47|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] đang thử nghiệm tính năng [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4_Reading lists|danh sách đọc trên trang di động]], cho phép người đọc đã đăng nhập chưa thực hiện sửa đổi nào có thể lưu danh sách bài viết riêng tư để đọc sau. Thử nghiệm đang được thực hiện trên các Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia, và tiếng Việt kể từ tuần ngày 10 tháng 11, và sẽ bắt đầu trên Wikipedia tiếng Anh trong tuần ngày 17 tháng 11. * Người dùng không thể nhận được mã xác nhận qua thư điện tử khi đăng nhập nay có thể nhờ hỗ trợ bằng cách gửi biểu mẫu trên trang đặc biệt mới. Cập nhật này là một phần của sáng kiến [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. Nếu tài khoản của bạn có địa chỉ thư điện tử, hãy đảm bảo rằng bạn vẫn có quyền truy cập vào nó. Trong quá trình đăng nhập từ thiết bị hoặc địa điểm mới mà không có 2FA, bạn có thể được yêu cầu nhập mã 6 ký tự được gửi từ thư điện tử để hoàn tất đăng nhập. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Why are you requiring me to enter a code from my email to log in? Can I opt out of this?|Tìm hiểu thêm]]. * Một wiki mới đã được tạo ra: {{int:project-localized-name-group-wikisource}} tiếng [[d:Q13324|Minangkabau]] ([[s:min:|<code>s:min:</code>]]) [https://phabricator.wikimedia.org/T408317] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Là một phần của dự án [[mw:Special:MyLanguage/Parsoid/Parser Unification|Hợp nhất Trình Phân tích Cú pháp]], Nhóm Chuyển đổi Nội dung đã triển khai Parsoid làm trình phân tích cú pháp mặc định cho nhiều trang Wikipedia có lưu lượng truy cập thấp và đang chuẩn bị tiếp tục bước tiếp theo để triển khai đến những trang có lưu lượng truy cập cao. Tin nhắn này là lời mời cho bạn tham gia vào Parsoid, như được miêu tả trong tài liệu [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]], và tìm ra bất kỳ vấn đề nào mà bạn có thể gặp phải với quy trình làm việc của mình khi sử dụng bot, tiện ích hoặc đoạn mã người dùng. Hãy cho chúng tôi biết thông qua liên kết ''"Báo cáo lỗi hiển thị"'' trên thanh bên Công cụ hoặc tạo một tác vụ phab và gắn thẻ [[phab:project/view/5846|Nhóm Chuyển đổi Nội dung trên Phabricator]]. * Dự án Công cụ Không được Hỗ trợ: Một vài vấn đề với [[:c:Special:MyLanguage/Commons:Video2commons|Video2Commons]] đã được giải quyết, bao gồm lỗi tải lên liên quan đến tên tập tin, nhập video bị đen, và xử lý việc thử lại. Hỗ trợ cho AV1 cũng đã được thêm vào. Những công việc đang được tiến hành tập trung vào tính ổn định của backend, lỗi ffmpeg, nhập phụ đề, xử lý siêu dữ liệu, và tải lên danh sách phát. Để theo dõi các tác vụ cụ thể, hãy kiểm tra [[phab:tag/video2commons/|bảng tác vụ trên Phabricator]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.3|MediaWiki]] '''Các cuộc họp và sự kiện''' * Hãy lưu lịch ngay cho Hackathon Wikimedia tiếp theo sẽ diễn ra tại Milan, Ý từ ngày 1–3 tháng 5 năm 2026. Cổng đăng ký sẽ được mở vào tháng 1 năm 2026. [https://pretix.eu/wikimedia/Hackathon-2026/ Đơn đăng ký nhận học bổng hiện đang được mở], và sẽ đóng vào ngày 28 tháng 11 năm 2025. Nếu bạn có bất kỳ câu hỏi nào, vui lòng gửi thư đến <bdi lang="en" dir="ltr">hackathon@wikimedia.org</bdi>. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/47|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W47"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:26, ngày 17 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29627455 --> == <span lang="en" dir="ltr">Reminder: Help us decide the name of the new Abstract Wikipedia project</span> == <div lang="en" dir="ltr"> <section begin="function2"/> {{int:Hello}}. Reminder: Please help to choose name for the new Abstract Wikipedia wiki project. The finalist vote starts today. The finalists for the name are: <span lang="en" dir="ltr" class="mw-content-ltr">Abstract Wikipedia, Multilingual Wikipedia, Wikiabstracts, Wikigenerator, Proto-Wiki</span>. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki. {{Int:Feedback-thanks-title}} <section end="function2"/> </div> -- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 14:23, ngày 20 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:Sannita (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29583860 --> == Bản tin Kỹ thuật: Tuần 48-2025 == <section begin="technews-2025-W48"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/48|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Tuần trước, [[mw:Special:MyLanguage/Wikimedia Search Platform|Nhóm Tìm kiếm Wikimedia]] đã tạo lại chức năng của tiện ích "DWIM" (Do What I Mean - Làm những gì bạn muốn) trên máy chủ, cho Wikipedia tiếng Nga và tiếng Do Thái. Tính năng này bổ sung gợi ý đa bàn phím vào gợi ý trên hộp tìm kiếm tiêu chuẩn. Ví dụ, khi tìm kiếm ''<span lang="und" dir="ltr">cxfcnmt</span>'' trên Wikipedia tiếng Nga giờ đây sẽ bổ sung thêm gợi ý cho ''<span lang="ru" dir="ltr">счастье</span>'' ("sự hạnh phúc") mà người dùng có thể có ý định tìm tới. Họ dự kiến sẽ kích hoạt tính năng này trên các wiki khác bằng tiếng Nga và tiếng Do Thái trong tuần này. [https://phabricator.wikimedia.org/T408734] * Cuối tuần này, người dùng [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] "{{int:codemirror-beta-feature-title}}" sẽ có thể sử dụng tính năng tô màu cú pháp trong [[mw:Special:MyLanguage/Help:DiscussionTools|Công cụ Thảo luận]]. Điều này yêu cầu phải thiết lập tùy chọn "{{int:discussiontools-preference-sourcemodetoolbar}}". [https://phabricator.wikimedia.org/T407918] * [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|Phần mở rộng chiến dịch sự kiện]] – một bộ công cụ để phối hợp tổ chức sự kiện và các hoạt động cộng tác khác trên wiki nay đã được triển khai tới tất cả các wiki của Wikimedia. Một tính năng mới được gọi là [[m:Special:MyLanguage/CampaignEvents/Collaborative contributions|Đóng góp cộng tác]] cũng đã được thêm vào để giúp những người tổ chức và người tham gia thấy được tác động của những hoạt động đó. Hãy tham gia [[m:Special:MyLanguage/Event:Connection learning session 3|buổi học sắp tới]] để xem tính năng mới đó hoạt động thực tế như thế nào và chia sẻ phản hồi của bạn. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:24}} {{PLURAL:24|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho CodeReviewBot ngừng hoạt động hiện đã được giải quyết. [https://phabricator.wikimedia.org/T410417] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Người dùng API của Wikimedia có thể tham gia nghiên cứu khả năng sử dụng để giúp xác thực thiết kế mới dành cho chỗ thử REST API của Wikimedia. Những người có hứng thú tham gia cần điền vào [https://wikimediafoundation.limesurvey.net/487662 biểu mẫu khảo sát tham gia] này. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/IREJRRWTZTGCYWQHDMSNJFTQAEPOOAE3/] * Nhóm Giao diện MediaWiki đang trong quá trình ngừng hỗ trợ các bảng định dạng (stylesheet) kiểu XSLT trong Action API. Hỗ trợ cho <code dir=ltr>format=xml'''&xlst={stylesheet}'''</code> sẽ bị loại bỏ khỏi các dự án Wikimedia vào cuối tháng 11 năm 2025. Ngoài ra, nó sẽ sớm mặc định bị vô hiệu hóa trong các phiên bản phát hành của MediaWiki: v1.43 (LTS), v1.44, và v1.45. Hỗ trợ cho các bảng định dạng kiểu XSLT sẽ bị loại bỏ hoàn toàn khỏi MediaWiki v1.46 (dự kiến phát hành vào khoảng thời gian từ tháng 4 đến tháng 5 năm 2026). [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/5AX7UWAVVUNUSBOIRHMNOKWOZ5EZI3JX/] * Điểm cuối kế thừa của WDQS ([https://query-legacy-full.wikidata.org/ query-legacy-full.wikidata.org]) sẽ ngừng hoạt động vào cuối tháng 12 năm 2025, và sẽ chính thức bị vô hiệu hóa vào ngày 7 tháng 1 năm 2026. Sau ngày này, người dùng sẽ nhận thấy những yêu cầu đến query.wikidata.org mà yêu cầu toàn bộ biểu đồ bị lỗi hoặc trả về kết quả không hợp lệ nếu chúng không được viết lại để sử dụng liên kết SPARQL. Nhóm khuyên người dùng cần đảm bảo các công cụ và quy trình làm việc sử dụng các điểm cuối WDQS được hỗ trợ (<span dir=ltr><nowiki>https://query.wikidata.org/</nowiki></span> - Biểu đồ chính hoặc <span dir=ltr><nowiki>https://query-scholarly.wikidata.org/</nowiki></span> - Biểu đồ học thuật). Để được hỗ trợ chuyển đổi các trường hợp sử dụng (use case), vui lòng xem lại các trang [[d:Special:MyLanguage/Wikidata:Data_access|Truy cập Dữ liệu]] và [[d:Wikidata:Request_a_query|Yêu cầu Truy vấn]] để biết thêm thông tin và được hỗ trợ về các phương thức truy cập thay thế. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.4|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/48|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W48"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:56, ngày 24 tháng 11 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29702226 --> == Bản tin Kỹ thuật: Tuần 49-2025 == <section begin="technews-2025-W49"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/49|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Bảng Nhìn lại Một Năm Wikipedia 2025 sẽ có mặt vào ngày 2 tháng 12 dành cho người dùng ứng dụng Wikipedia trên iOS và Android, gồm thông tin chuyên sâu được cá nhân hóa, những điểm nổi bật để đọc được cập nhật, cùng thiết kế đã được làm mới. Tìm hiểu thêm trên [[mw:Special:MyLanguage/Wikimedia Apps/Team/Wikipedia Year in Review/Updates|trang dự án]] của tính năng nhìn lại này. * Nhóm Tăng trưởng đang nỗ lực cải thiện nội dung và cách trình bày của Email Xác minh được gửi tới người dùng mới để chúng trở nên thân thiện, hữu ích và có thêm nhiều thông tin hơn. Một số văn bản mới đã được soạn thảo cho thử nghiệm A/B và bạn có thể giúp đỡ bằng cách dịch chúng. Xem [[phab:T396155|Phabricator]]. * Tính năng [[mw:Special:MyLanguage/Help:Growth/Tools/Add a link|Thêm liên kết]] nay sẽ được triển khai tới Wikipedia tiếng Nhật, tiếng Urdu và tiếng Trung vào ngày 2 tháng 12. Thêm liên kết được dựa trên mô hình dự đoán nhằm gợi ý liên kết cần được thêm vào bài viết. Trong khi tính năng này đã có mặt trên hầu hết các trang Wikipedia, mô hình dự đoán đó không thể hỗ trợ một số ngôn ngữ nhất định. Một mô hình mới đã được phát triển để xử lý những ngôn ngữ này, và mô hình đó sẽ dần được triển khai sang các trang Wikipedia khác theo thời gian. Nếu bạn muốn được biết thêm thông tin, vui lòng liên hệ [[mw:user:Trizek (WMF)|Trizek (WMF)]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:34}} {{PLURAL:34|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà hộp tìm kiếm trên một số trang Commons không hiển thị kết quả nào do việc chuyển đổi từ SpecialSearch sang MediaSearch, hiện đã được giải quyết. [https://phabricator.wikimedia.org/T399476] * Hai wiki mới đã được tạo ra: ** {{int:project-localized-name-group-wikipedia}} tiếng [[d:Q36846|Toki Pona]] ([[w:tok:|<code>w:tok:</code>]]) [https://phabricator.wikimedia.org/T404457] ** {{int:project-localized-name-group-wikiquote}} tiếng [[d:Q33655|Pidgin Nigeria]] ([[q:pcm:|<code>q:pcm:</code>]]) [https://phabricator.wikimedia.org/T408318] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.5|MediaWiki]] '''Chuyên sâu''' * Quỹ Wikimedia đang trong giai đoạn đầu của việc khám phá các phương pháp tiếp cận cho '''Chỉ dẫn bài viết'''. Sáng kiến này nhằm mục đích xác định các phương pháp can thiệp có thể giúp các biên tập viên mới dễ dàng hiểu và áp dụng các quy tắc và chính sách hiện hành của Wikipedia khi tạo bài viết. Dự án đang trong giai đoạn khám phá và thiết kế thử nghiệm giai đoạn đầu. Tất cả các thành viên cộng đồng được khuyến khích [[mw:Special:MyLanguage/Article guidance|tìm hiểu thêm]] về dự án, và chia sẻ suy nghĩ của họ trên [[mw:Special:MyLanguage/Talk:Article guidance|trang thảo luận này]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/49|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W49"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:58, ngày 1 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29732328 --> == Bản tin Kỹ thuật: Tuần 50-2025 == <section begin="technews-2025-W50"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/50|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Bất kỳ ai muốn bảo mật tài khoản người dùng của mình nay có thể sử dụng tính năng [[m:Special:MyLanguage/Help:Two-factor authentication|xác thực hai yếu tố]] (2FA). Tính năng này có sẵn cho tất cả người dùng của toàn bộ các dự án Wikimedia. Đây là một phần của sáng kiến [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. Sau này, 2FA sẽ được yêu cầu đối với tất cả người dùng có thể thực hiện các hành động mang tính nhạy cảm về bảo mật hoặc quyền riêng tư. '''Cập nhật cho biên tập viên''' * Tiếp nối đợt triển khai lần trước, tính năng [[mw:Special:MyLanguage/Help:Growth/Tools/Add a link|Thêm liên kết]], một tính năng cho phép biên tập viên thêm liên kết được đề xuất trong quá trình sửa đổi, sẽ có mặt trên [[Phab:T410469|33 trang Wikipedia]] kể từ ngày 9 tháng 12. Việc mở rộng này có được nhờ mô hình dự đoán mới nay hỗ trợ tất cả các ngôn ngữ, kể cả những ngôn ngữ mà chưa được đề cập trước đây. Dù tính năng này đã có mặt trên hầu hết các trang Wikipedia được một thời gian, nhưng lần triển khai này sẽ giúp chúng tôi tiến gần hơn đến việc sử dụng mô hình được cải tiến này ở mọi nơi. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn được biết thêm thông tin chi tiết vui lòng liên hệ với [[mw:user:Trizek (WMF)|Trizek (WMF)]]. * Tuần trước, [[mw:Special:MyLanguage/Wikimedia Search Platform|nhóm Nền tảng Tìm kiếm]] đã thêm gợi ý tìm kiếm [[w:vi:Chuyển tự|được chuyển tự]] khi bạn nhập tới các wiki bằng tiếng Georgia. Nếu chỉ có một vài gợi ý tìm kiếm thông thường, thì các truy vấn bằng chữ Latinh hoặc Kirin [[phab:T127003|nay sẽ được viết lại thành chữ Georgia]] để có thể tìm kiếm được nhiều kết quả trùng khớp hơn. Ví dụ, tìm kiếm <bdi lang="ka-Latn" dir="ltr">''bedniereba''</bdi> hoặc <bdi lang="ka-Cyrl" dir="ltr">''бедниереба''</bdi> nay sẽ gợi ý bài viết hiện có về <bdi lang="ka" dir="ltr">ბედნიერება</bdi> ("sự hạnh phúc"). Bạn có thể đề xuất những ngôn ngữ khác mà việc gợi ý được chuyển tự có thể hữu ích [[phab:T375215|trên Phabricator]] để dùng cho quá trình phát triển sau này. * Cuối tuần này, một thử nghiệm có kiểm soát sẽ bắt đầu dành cho các biên tập viên trên 100 trang Wikipedia lớn nhất khi đang thực hiện sửa đổi một đề mục bằng trình soạn thảo trực quan trên trang web di động. 50% số biên tập viên đó sẽ nhận thấy nút "Sửa đổi toàn bộ trang" mới cho phép họ mở rộng phiên sửa đổi của mình lên toàn bộ trang đó. Tính năng này nhằm mục đích giúp người dùng trên trang web di động sửa đổi bất kỳ đề mục nào trong bài viết một cách dễ dàng hơn, bất kể việc họ chạm vào biểu tượng sửa đề mục nào để bắt đầu sửa đổi. Thử nghiệm này sẽ kéo dài khoảng 4 tuần. Bạn có thể tìm hiểu [[phab:T409112|thêm thông tin]] về dự án này. * Cuối tuần này, [[mw:Special:MyLanguage/Readers/Reader Growth|nhóm Tăng trưởng Độc giả]] sẽ khởi động [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.1.14 Expanded Mobile Sections|thử nghiệm trên trang web di động]] để mở rộng tất cả đề mục bài viết theo mặc định (hiện giờ chúng được mặc định thu gọn lại) và ghim tiêu đề của đề mục mà người dùng hiện đang đọc lên đầu trang. Thử nghiệm này sẽ ảnh hưởng tới 10% người dùng trên Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia và tiếng Việt. [https://phabricator.wikimedia.org/T409485] * [[mw:Special:MyLanguage/Wikimedia Apps/Team/Wikipedia Year in Review/2025 Year in Review|Tổng kết Một Năm Wikipedia 2025]], một tính năng trong ứng dụng Wikipedia dành cho thiết bị di động (iOS và Android) nhằm cung cấp cho người dùng bản tóm tắt được cá nhân hóa về mức độ tương tác của họ với Wikipedia xuyên suốt trong một năm, nay đã có mặt trên ứng dụng iOS và Android. Phiên bản này bao gồm những thông tin chuyên sâu được mở rộng và cá nhân hóa, cải thiện những điểm nổi bật trong quá trình đọc, thông điệp mới cho nhà quyên góp, cùng thiết kế được cập nhật. Hãy mở ứng dụng để xem chuyên mục Tổng kết Năm và khám phá hành trình đọc của bạn trong năm 2025 nhé. * Một lỗi phần mềm xảy ra gần đây khiến cho các sửa đổi được thực hiện bằng Trình Soạn thảo Trực quan thực hiện những thay đổi không mong muốn với mã nguồn wiki, trong đó có việc loại bỏ khoảng trắng và thay thế các dấu cách bằng dấu gạch dưới trong các liên kết wiki bên trong chú thích. Vấn đề này đã được giải quyết một phần vào tuần trước, và việc giải quyết vấn đề vẫn đang tiếp tục được thực hiện. Các biên tập viên sử dụng Trình Soạn thảo Trực quan trong các ngày từ 28 tháng 11 đến 2 tháng 12 nên kiểm tra lại sửa đổi của mình để tìm ra những thay đổi ngoài ý muốn. [https://phabricator.wikimedia.org/T411238] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề về việc xử lý không đúng các đường dẫn URL được sao chép từ thanh địa chỉ của người dùng Microsoft Edge đã được giải quyết. [https://phabricator.wikimedia.org/T341281] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Bắt đầu từ tuần này, người dùng [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] "{{int:codemirror-beta-feature-title}}" sẽ sử dụng [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] làm trình sửa đổi dành cho các kiểu nội dung Lua, JavaScript, CSS, JSON và Vue, thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]]. Với thay đổi này, [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|các linter]] sẽ được nâng cấp. Đây là một phần trong nỗ lực lớn hơn nhằm thay thế CodeEditor và mang tới trải nghiệm sửa đổi mã nguồn một cách nhất quán. [https://phabricator.wikimedia.org/T373711] * Các nhà phát triển được khuyến khích tham gia [https://wikimediafoundation.limesurvey.net/552643 Khảo sát Mức độ Hài lòng của Nhà phát triển năm 2025], hiện vẫn đang được mở đến hết ngày 5 tháng 1 năm 2026. Nếu bạn tham gia vào việc xây dựng phần mềm cho hệ sinh thái Wikimedia và muốn chia sẻ kinh nghiệm hoặc phản hồi của mình, thì chúng tôi sẽ rất trân trọng sự tham gia của bạn. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/W4WBKO6Q55UWWCCSFWQATKEXBEHP3QNR/] * Tuần này không có phiên bản MediaWiki mới nào. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/50|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W50"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:45, ngày 8 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29738112 --> == Bản tin Kỹ thuật: Tuần 51-2025 == <section begin="technews-2025-W51"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/51|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:18}} {{PLURAL:18|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một trong số đó là việc giải quyết vấn đề khi tài khoản tạm thời chèn liên kết URL ngoài, việc này kích hoạt yêu cầu hCaptcha trong nhiều trường hợp hơn so với dự định, và không hiển thị popup cần thiết trong lần thử xuất bản sửa đổi đầu tiên. [https://phabricator.wikimedia.org/T411927] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * <span class="mw-translate-fuzzy">Để cải thiện hiệu suất cho cơ sở dữ liệu và trang web, các liên kết ngoài tới các dự án Wikimedia sẽ không còn được lưu trữ trong cơ sở dữ liệu. Điều này có nghĩa là chúng sẽ không thể được tìm thấy trong [[{{#special:LinkSearch}}]], sẽ không được kiểm tra bởi Danh sách đen về spam hoặc Bộ lọc Sai phạm dưới dạng liên kết mới, và sẽ không có trong bảng <code dir=ltr>externallinks</code> trên các bản sao cơ sở dữ liệu. Trong tương lai nó có thể được mở rộng sang những trang web khác đáng tin cậy được liên kết nhiều trên cơ sở từng wiki, chẳng hạn như liên kết Creative Commons trên Wikimedia Commons.</span> [https://phabricator.wikimedia.org/T405005] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.7|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/51|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W51"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:03, ngày 15 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29796010 --> == Bản tin Kỹ thuật: Tuần 52-2025 == <section begin="technews-2025-W52"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/52|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Kể từ tháng 1, các bộ lọc sai phạm [[mw:Special:MyLanguage/Extension:AbuseFilter/Access flags|có thể được thiết lập]] để tự động loại bỏ chi tiết bộ lọc chẳng hạn như quy tắc và danh sách các sửa đổi và tác vụ thực hiện được ghi lại. Điều này sẽ giúp người giám sát sử dụng các bộ lọc sai phạm để ngăn chặn doxxing hoặc nội dung khác có thể bị loại bỏ. [https://phabricator.wikimedia.org/T290324] * Số tiếp theo của Bản tin Kỹ thuật sẽ được phát hành vào ngày 12 tháng 1 năm 2026 do trùng vào kỳ nghỉ cuối năm. Xin cảm ơn tất cả các biên dịch viên cùng những người đã gửi nội dung hoặc phản hồi trong năm nay. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:16}} {{PLURAL:16|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, sự cố xảy ra khiến cho ứng dụng bị sập khi chạm vào mục "Bước Đầu tiên" trong mục Nhìn lại Một năm trên ứng dụng Wikipedia dành cho Android nay đã được giải quyết, và tính năng này được mở như mong đợi. [https://phabricator.wikimedia.org/T411546] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Những thành phần giao diện như khác biệt giữa các phiên bản và thể loại được tạo bởi MediaWiki từng có thuộc tính <code dir=ltr>data-mw="interface"</code> để phân biệt với nội dung wiki. Thuộc tính này đã được thay thế bằng <code dir=ltr>data-mw-interface=""</code>, nhằm tránh khả năng gây xung đột với những thuộc tính <code dir=ltr>data-mw</code> khác được tạo bởi Parsoid. [https://phabricator.wikimedia.org/T409187] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Không có phiên bản MediaWiki mới nào trong tuần này hoặc tuần tới. '''Các cuộc họp và sự kiện''' * [[mw:Wikimedia Hackathon Northwestern Europe 2026|Wikimedia Hackathon Tây Bắc Âu năm 2026]] sẽ diễn ra vào các ngày 13-14 tháng 3 năm 2026 tại Arnhem, Hà Lan. Đơn đăng ký vừa được mở vào giữa tháng 12 và sẽ đóng vào giữa tháng 1 hoặc có thể đóng sớm hơn nếu hết chỗ. Do sự kiện giới hạn khoảng 100 người tham gia, chúng tôi khuyến khích bạn đăng ký thật sớm. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2025/52|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2025-W52"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:45, ngày 22 tháng 12 năm 2025 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29831856 --> == Bản tin Kỹ thuật: Tuần 03-2026 == <section begin="technews-2026-W03"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/03|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Quỹ Wikimedia đã chia sẻ một số câu hỏi định hướng cho Kế hoạch Thường niên giai đoạn tháng 7 năm 2026–tháng 6 năm 2027 trên [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] và ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Những câu hỏi này tập trung vào những xu hướng toàn cầu, những thử nghiệm nhanh và hiệu quả hơn, hỗ trợ tốt hơn cho người mới, tăng cường năng lực cho biên tập viên và người dùng có quyền nâng cao, cải thiện sự cộng tác giữa các dự án, cũng như phát triển và duy trì lượng người đọc. Mọi phản hồi và ý kiến đóng góp đều được hoan nghênh trên [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|trang thảo luận]]. '''Cập nhật cho biên tập viên''' * Là một phần của công việc hiện do nhóm Công nghệ Cộng đồng thực hênj xoay quanh dự án [[m:Special:MyLanguage/Community Wishlist/W372|Nhiều danh sách theo dõi]] (Multiple watchlists), việc hiển thị của tính năng [[Special:EditWatchlist|Sửa đổi Danh sách theo dõi]] (EditWatchlist) sẽ được cập nhật làm bước đầu tiên hướng tới việc có được nhiều danh sách theo dõi. Ngoài ra, việc phân trang của trang [[Special:Search|Tìm kiếm]] cũng sẽ được cập nhật như là một phần của công việc liên quan đến mong muốn [[m:Special:MyLanguage/Community Wishlist/W186|Cải tiến phân trang / điều hướng trang]]. [https://phabricator.wikimedia.org/T411596] * [[m:Special:GlobalWatchlist|Danh sách theo dõi toàn cục]] là [[mw:Special:MyLanguage/Extension:GlobalWatchlist|phần mở rộng]] của MediaWiki cho phép bạn xem danh sách theo dõi của bạn từ các wiki khác nhau trên cùng một trang. Danh sách này gần đây đã được cập nhật để trông giống như [[Special:Watchlist|Danh sách theo dõi]] thông thường hơn, chẳng hạn như tiền xử lý các tài khoản tạm thời để che giấu địa chỉ IP (trong đó có việc chuyển hướng liên kết người dùng đến các trang đóng góp), in đậm tiêu đề trang, và mở các liên kết trong phần tóm lược sửa đổi và thẻ trong tab trình duyệt mới. [https://phabricator.wikimedia.org/T398361][https://phabricator.wikimedia.org/T298919][https://phabricator.wikimedia.org/T273526][https://phabricator.wikimedia.org/T286309] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:28}} {{PLURAL:28|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề mà việc cấm tài khoản toàn cục không có tùy chọn cấm gửi thư điện tử, nay đã được giải quyết, và sẽ có thể sử dụng kể từ tuần ngày 13 tháng 1. [https://phabricator.wikimedia.org/T401293] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[mw:Special:MyLanguage/VisualEditor/Citation tool|Công cụ chú thích của Soạn thảo Trực quan]] và [[mw:Special:MyLanguage/Help:Reference Previews|Xem trước Chú thích]] nay hỗ trợ kiểu chú thích dạng "bản đồ". [https://phabricator.wikimedia.org/T411083] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.10|MediaWiki]]/[[mw:MediaWiki 1.46/wmf.11|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/03|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W03"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:33, ngày 12 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29907192 --> == Thank You for Last Year – Join Wiki Loves Ramadan 2026 == Dear Wikimedia communities, We hope you are doing well, and we wish you a happy New Year. ''Last year, we captured light. This year, we’ll capture legacy.'' In 2025, communities around the world shared the glow of Ramadan nights and the warmth of collective iftars. In 2026, ''Wiki Loves Ramadan'' is expanding, bringing more stories, more cultures, and deeper global connections across Wikimedia projects. We invite you to explore the ''Wiki Loves Ramadan 2026'' [[m:Special:MyLanguage/Wiki Loves Ramadan 2026|Meta page]] to learn how you can participate and [[m:Special:MyLanguage/Wiki Loves Ramadan 2026/Participating communities|sign up]] your community. 📷 ''Photo campaign on '' [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan 2026|Wikimedia Commons]] If you have questions about the project, please refer to the FAQs: * [[m:Special:MyLanguage/Wiki Loves Ramadan/FAQ/|Meta-Wiki]] * [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan/FAQ|Wikimedia Commons]] ''Early registration for updates is now open via the '''[[m:Special:RegisterForEvent/2710|Event page]]''''' ''Stay connected and receive updates:'' * [https://t.me/WikiLovesRamadan Telegram channel] * [https://lists.wikimedia.org/postorius/lists/wikilovesramadan.lists.wikimedia.org/ Mailing list] We look forward to collaborating with you and your community. '''The Wiki Loves Ramadan 2026 Organizing Team''' 19:45, ngày 16 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:ZI Jony@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549 --> == Bản tin Kỹ thuật: Tuần 04-2026 == <section begin="technews-2026-W04"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/04|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Khay được hiển thị trên [[Special:Diff|Đặc biệt:Khác]] trong chế độ xem di động đã được thiết kế lại. Giờ đây nó mặc định được thu gọn, đồng thời tích hợp một liên kết để lùi lại sửa đổi đang được hiển thị trên màn hình, giúp các biên tập viên và người duyệt bài trên điện thoại di động dễ dàng thực hiện tác vụ mà vẫn giữ giao diện thật gọn gàng. [https://phabricator.wikimedia.org/T402297] * [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi từ nhiều wiki khác nhau trên cùng một trang. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] này tiếp tục được cải thiện — nay nó có thể tự động xác định hướng văn bản (nhằm đảm bảo việc hiển thị chính xác các trang web mà có tên miền bất thường) và hiển thị chi tiết phần miêu tả cho các tác vụ được lưu trong nhật trình. Cuối tuần này, một liên kết thường trực mới cho các tác vụ tạo trang cùng các lớp CSS cho từng mục nhập sẽ được thêm vào. [https://phabricator.wikimedia.org/T412505][https://phabricator.wikimedia.org/T287929][https://phabricator.wikimedia.org/T262768][https://phabricator.wikimedia.org/T414135] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:32}} {{PLURAL:32|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà được ghi nhận trước đây trong giao diện Vector 2022 mà các liên kết anchor đích bị che khuất bởi tiêu đề cố định nay đã được giải quyết. [https://phabricator.wikimedia.org/T406114] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Như đã đề cập trong [[m:Special:MyLanguage/Tech/News/2025/44|thông báo ngừng hỗ trợ vào tháng 10 năm 2025]], nhóm Giao diện MediaWiki sẽ bắt đầu loại bỏ toàn bộ điểm cuối chuyển đổi có dấu gạch chéo ở cuối khỏi API REST của MediaWiki vào tuần từ ngày 26 tháng 1. Những thay đổi này dự kiến sẽ được triển khai tới tất cả các wiki chậm nhất vào ngày 30 tháng 1. Tất cả người dùng API đang gọi những điểm cuối này được khuyên chuyển đổi sang những phiên bản không có dấu gạch chéo ở cuối. Cả hai loại biến thể điểm cuối này đều có thể được tìm thấy, so sánh và kiểm tra sử dụng [https://test.wikipedia.org/wiki/Special:RestSandbox Chỗ thử REST]. Nếu bạn có thắc mắc hay gặp bất kỳ sự cố nào, hãy gửi yêu cầu bằng cách tạo một tác vụ trong Phabricator gửi tới [https://phabricator.wikimedia.org/project/view/6931/ bảng tin #MW-Interfaces-Team]. * Tài liệu tham khảo trực quan cho [[mw:Special:MyLanguage/Wikimedia REST API|API REST của Wikimedia]] đã được chuyển. Những yêu cầu đến các tài liệu API trước đây được lưu trữ thông qua [[mw:Special:MyLanguage/RESTBase|RESTBase]] (v.d.: <code dir=ltr>https://en.wikipedia.org/api/rest_v1/</code>) nay được chuyển hướng tới [[w:en:Special:RestSandbox|Chỗ thử REST]]. * [[mw:Special:MyLanguage/Wikidata Platform|Nhóm Nền tảng Wikidata của WMF]] (WDP) đã phát hành [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|bản tin tháng 1 năm 2026]]. Bản tin bao gồm những cập nhật về việc ngừng hoạt động điểm cuối biểu đồ đầy đủ (full-graph) cũ, thay đổi về chính sách User-Agent, thời gian làm việc hàng tháng của kế hoạch chuyển đổi sang Blazegraph, cùng những nỗ lực nhằm giảm thiểu những lỗi hồi quy gây ra bởi việc ngừng điểm cuối cũ. Xin nhắc lại rằng bạn có thể [[m:Special:MyLanguage/Global message delivery/Targets/WDP team updates|đăng ký nhận bản tin WDP đó]]! * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.12|MediaWiki]] '''Các cuộc họp và sự kiện''' * [[mw:Wikimedia Hackathon Northwestern Europe 2026|Cuộc thi Hackathon Wikimedia khu vực Tây Bắc Châu Âu năm 2026]] sẽ diễn ra vào ngày 13-14 tháng 3 năm 2026 tại Arnhem, Hà Lan. Cổng đăng ký đã được mở vào giữa tháng 12 và sẽ sớm đóng lại hoặc đóng ngay khi đã đủ số lượng người tham gia. Đây là cuộc thi hackathon kéo dài hai ngày, tập trung vào mảng kỹ thuật và quy tụ các thành viên Wikimedia từ khắp khu vực. Hy vọng sẽ gặp lại bạn tại đó! '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/04|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W04"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:29, ngày 19 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29943403 --> == Rà soát thường niên Bộ Quy tắc Ứng xử Chung và Hướng dẫn Thực thi == <section begin="announcement-content" /> Tôi viết thư này để thông báo với bạn rằng thời gian xem xét hàng năm đối với Bộ Quy tắc Ứng xử và Hướng dẫn Thực thi hiện đã bắt đầu. Bạn có thể đưa ra các đề xuất thay đổi đến hết ngày 9 tháng 2 năm 2026. Đây là bước đầu tiên trong nhiều bước cần thực hiện cho quá trình xem xét hàng năm. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Đọc thêm thông tin và tìm cuộc thảo luận để tham gia trên trang UCoC trên Meta]]. [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Ủy ban Điều phối Bộ Quy tắc Ứng xử Toàn cầu]] (U4C) là một nhóm toàn cầu chuyên trách việc thực hiện Bộ Quy tắc Ứng xử Toàn cầu một cách công bằng và nhất quán. Đánh giá thường niên này được lên kế hoạch và thực hiện bởi U4C. Để biết thêm thông tin và trách nhiệm của U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|bạn có thể xem Hiến chương U4C]]. Vui lòng chia sẻ thông tin này với các thành viên khác trong cộng đồng của bạn ở bất cứ nơi nào phù hợp. -- Hợp tác với U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" /> 21:02, ngày 19 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:Keegan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 --> == Bản tin Kỹ thuật: Tuần 05-2026 == <section begin="technews-2026-W05"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/05|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Quỹ Wikimedia mời mọi người đóng góp ý kiến cho [[m:Special:MyLanguage/Product and Technology Advisory Council/Year1 Reflections and Proposed Way Forward 2026 Update|đề xuất kế hoạch tương lai]] của [[:m:Special:MyLanguage/Product and Technology Advisory Council|Hội đồng Cố vấn Sản phẩm và Công nghệ]] chậm nhất ngày 28 tháng 2. * Tất cả người dùng đã đăng ký tài khoản nay có thể sử dụng passkey (mã xác thực) cho việc [[m:Special:MyLanguage/Help:Two-factor authentication|xác thực hai yếu tố]] (2FA). Passkey là một cách đơn giản để đăng nhập mà không cần phải sử dụng thiết bị thứ hai. Chúng sẽ xác thực danh tính của người dùng sử dụng vân tay, nhận diện khuôn mặt, hoặc dùng mã PIN. Để thiết lập một passkey, đầu tiên hãy thiết lập phương thức xác thực 2FA thông thường. Hiện tại, để đăng nhập bằng passkey, người dùng cũng phải sử dụng cả mật khẩu. Vào cuối quý này, tính năng đăng nhập không cần mật khẩu sẽ cho phép người dùng đăng nhập chỉ bằng một cú nhấn chuột và passkey. Người dùng có quyền nâng cao cũng sẽ bắt buộc phải kích hoạt xác thực 2FA. Đây là một phần của dự án [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. * Những người đóng góp chưa đăng ký tài khoản trên các IP hoặc dải IP bị cấm nay có thể tương tác trên wiki để chống lại quyết định cấm trên trang thảo luận thành viên, trừ khi tùy chọn "ngăn người dùng này sửa đổi trang thảo luận của họ" được bật. Điều này giúp giải quyết vấn đề rằng người dùng chưa đăng nhập không thể sử dụng quy trình bỏ cấm mặc định thông qua trang thảo luận thành viên. [https://phabricator.wikimedia.org/T398673] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:20}} {{PLURAL:20|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, phần miêu tả phương thức Xác thực hai yếu tố (2FA) trên trang quản lý đã được cập nhật. Giờ đây nó trở nên rõ ràng và dễ hiểu hơn, giúp người dùng dễ dàng sử dụng hơn. [https://phabricator.wikimedia.org/T332385] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Một biến Bộ lọc Sai phạm mới, <code>account_type</code>, đã được thêm vào để cung cấp một cách đáng tin cậy trong việc xác định loại tài khoản được tạo trong các tác vụ <code>createaccount</code> và <code>autocreateaccount</code>. Là một phần của thay đổi này, biến <code>accountname</code> đã được đổi tên thành <code>account_name</code>, và <code>accountname</code> nay đã lỗi thời. Những người quản lý bộ lọc sai phạm nên cập nhật bất kỳ bộ lọc nào đang sử dụng biến kiểm tra loại tài khoản mã hóa cứng hoặc đã lỗi thời nào nếu có. [https://phabricator.wikimedia.org/T414049] * Các hình thu nhỏ được yêu cầu với kích thước không chuẩn và sử dụng các phương thức không chuẩn như yêu cầu trực tiếp đến <code dir=ltr><nowiki>upload.wikimedia.org/…</nowiki></code> sẽ ngừng hoạt động trong thời gian tới. Thay đổi này nhằm ngăn chặn việc các trình thu thập dữ liệu web và bot từ bên ngoài lạm dụng. Một số người dùng có đoạn mã CSS/JS tùy chỉnh, các bảo quản viên giao diện có thể sửa tiện ích và giao diện cục bộ, cùng người viết công cụ sẽ cần cập nhật đoạn mã của mình để sử dụng kích thước hình thu nhỏ tiêu chuẩn. [[phab:T414805|Thông tin chi tiết, các liên kết tìm kiếm, cùng ví dụ về cách giải quyết chúng có sẵn trong tác vụ này]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.13|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/05|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W05"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:17, ngày 26 tháng 1 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29969530 --> == Bản tin Kỹ thuật: Tuần 06-2026 == <section begin="technews-2026-W06"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/06|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Tính năng "{{int:pageinfo-toolboxlink}}", một tính năng cung cấp thông tin xác thực về một trang ([{{fullurl:{{FULLPAGENAME}}|action=info}} ví dụ]), nay có thêm cả phần mục lục được tạo tự động. Nếu có trang [[MediaWiki:Pageinfo-header]] được người dùng tạo cục bộ, giờ nó có thể được xóa đi. [https://phabricator.wikimedia.org/T363726] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, Trình Soạn thảo Trực quan trước đây đã thêm chức năng in đậm hoặc nghiêng vào phần miêu tả liên kết, làm cho mã wiki trở nên phức tạp. Vấn đề này hiện đã được giải quyết. [https://phabricator.wikimedia.org/T409669] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Không có bản dump XML nào được tạo ra vào ngày 20 tháng 1. Ngoài ra, kể từ giờ, các bản dump sẽ chỉ được tạo một lần mỗi tháng. [https://phabricator.wikimedia.org/T414389] * Nhóm Giao diện MediaWiki đã ngừng hỗ trợ tất cả điểm cuối chuyển đổi có dấu gạch chéo ở cuối khỏi [https://www.mediawiki.org/wiki/Special:MyLanguage/API:REST%20API API REST của MediaWiki]. Tất cả người dùng API hiện đang gọi những điểm cuối đó được khuyến khích chuyển sang các bản không có dấu gạch chéo ở cuối. Nếu bạn có thắc mắc hoặc gặp bất kỳ sự cố nào, vui lòng gửi tác vụ phabricator tới [https://phabricator.wikimedia.org/project/view/6931/ bảng tin của #MW-Interfaces-Team]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.14|MediaWiki]] '''Nổi bật trong tuần''' * Xin nhắc tới người dùng rằng Quỹ Wikimedia đã chia sẻ một số câu hỏi định hướng cho Kế hoạch Hàng năm giai đoạn tháng 7 năm 2026–tháng 6 năm 2027 trên [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] và ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Những câu hỏi này tập trung vào những xu hướng toàn cầu, thử nghiệm nhanh hơn và hiệu quả hơn, hỗ trợ tốt hơn cho người mới, nâng cao năng lực cho biên tập viên và người dùng có quyền nâng cao, cải thiện việc cộng tác giữa các dự án, cũng như phát triển và giữ chân độc giả. Mọi phản hồi và ý kiến đóng góp đều được hoan nghênh trên [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|trang thảo luận]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/06|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W06"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:43, ngày 2 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30000986 --> == Bản tin Kỹ thuật: Tuần 07-2026 == <section begin="technews-2026-W07"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/07|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Mục Mong muốn cộng đồng]] <span lang="en" dir="ltr" class="mw-content-ltr">Logged-in contributors who manage large or complex watchlists can now organise and filter watched pages in ways that improve their workflows with the new [[mw:Special:MyLanguage/Help:Watchlist labels|Watchlist labels]] feature. By adding custom labels (for example: pages you created, pages being monitored for vandalism, or discussion pages) users can more quickly identify what needs attention, reduce cognitive load, and respond more efficiently. This improves watchlist usability, especially for highly active editors.</span> * <span lang="en" dir="ltr" class="mw-content-ltr">A new feature available on [[Special:Contributions|Special:Contributions]] shows [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|temporary accounts]] that are likely operated by the same person, and so makes patrolling less time-consuming. Upon checking contributions of a temporary account, users with access to temporary account IP addresses can now see a view of contributions from the related temporary accounts. The feature looks up all the IPs associated with a given temporary account within the data retention period and shows all the contributions of all temporary accounts that have used these IPs. [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts#February 2026: Improvements to the patroller tooling|Learn more]].</span> [https://phabricator.wikimedia.org/T415674] * <span lang="en" dir="ltr" class="mw-content-ltr">When editors preview a wikitext edit, the reminder box that they are only seeing a preview (which is shown at the top), now has a grey/neutral background instead of a yellow/warning background. This makes it easier to distinguish preview notes from actual warnings (for example, edit conflicts or problematic redirect targets), which will now be shown in separate warning or error boxes.</span> [https://phabricator.wikimedia.org/T414742] * <span lang="en" dir="ltr" class="mw-content-ltr">The [[m:Special:GlobalWatchlist|Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continues to improve — it now properly supports more than one Wikibase site, for example both [[d:|Wikidata]] and [[testwikidata:|testwikidata]]. In addition, issues regarding text direction have been fixed for users who prefer Wikidata or other Wikibase sites in right-to-left (RTL) languages.</span> [https://phabricator.wikimedia.org/T415440][https://phabricator.wikimedia.org/T415458] * <span lang="en" dir="ltr" class="mw-content-ltr">The automatic "magic links" for ISBN, RFC, and PMID numbers have been [[mw:Special:MyLanguage/Help:Magic links|deprecated in wikitext since 2021]] due to inflexibility and difficulties with localization. Several wikis have successfully replaced RFC and PMID magic links with equivalent external links, but a template was often required to replace the functionality of the ISBN magic link. There is now a new [[mw:Special:MyLanguage/Help:Magic words#isbn|built-in parser function]] <code dir=ltr><nowiki>{{#isbn}}</nowiki></code> available to replace the basic functionality of the ISBN magic link. This makes it easier for wikis who wish to migrate off of the deprecated magic link functionality to do so.</span> [https://phabricator.wikimedia.org/T145604] * <span lang="en" dir="ltr" class="mw-content-ltr">Two new wikis have been created:</span> ** <span lang="en" dir="ltr" class="mw-content-ltr">a {{int:project-localized-name-group-wikipedia}} in [[d:Q35401|Jju]]</span> ([[w:kaj:|<code>w:kaj:</code>]]) [https://phabricator.wikimedia.org/T413283] ** <span lang="en" dir="ltr" class="mw-content-ltr">a {{int:project-localized-name-group-wikipedia}} in [[d:Q1186896|Nawat]]</span> ([[w:ppl:|<code>w:ppl:</code>]]) [https://phabricator.wikimedia.org/T413273] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * <span lang="en" dir="ltr" class="mw-content-ltr">A new global user group has been created: [[{{int:grouppage-local-bot}}|{{int:group-local-bot}}]]. It will be used internally by the software to allow community bots to bypass rate limits that are applied to abusive [[w:en:Web scraping|web scrapers]]. Accounts that are approved as bots on at least one Wikimedia wiki will be automatically added to this group. It will not change what user permissions the bot has.</span> [https://phabricator.wikimedia.org/T415588] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.15|MediaWiki]] '''Các cuộc họp và sự kiện''' * <span lang="en" dir="ltr" class="mw-content-ltr">The [[mw:Special:MyLanguage/MediaWiki Users and Developers Conference Spring 2026|MediaWiki Users and Developers Conference, Spring 2026]] will be held March 25–27 in Salt Lake City, USA. This event is organized by and for the third-party MediaWiki community. You can propose sessions and register to attend.</span> [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/AZBWVI46SDEB65PGR5J6E4TYOQQEZXM7/] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/07|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W07"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 23:30, ngày 9 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30026671 --> == Bản tin Kỹ thuật: Tuần 08-2026 == <section begin="technews-2026-W08"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/08|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|Nhóm SRE]] sẽ tiến hành dọn dẹp phiên bản [[m:Special:MyLanguage/Etherpad|Etherpad]] của Wikimedia, một trình sửa đổi trên web dành cho việc sửa đổi tài liệu cộng tác theo thời gian thực. Tất cả pad sẽ bị xóa vĩnh viễn sau ngày 30 tháng 4 năm 2026 – trường hợp nếu còn dự án vẫn đang được tiến hành di chuyển vào thời điểm đó thì nhóm có thể xem xét lại thời gian đó tùy từng trường hợp. Vui lòng tạo bản sao lưu cục bộ cho bất kỳ nội dung nào mà bạn muốn giữ lại, vì dữ liệu đã bị xóa không thể khôi phục được nữa. Việc dọn dẹp này sẽ giúp giảm bớt kích thước cơ sở dữ liệu và giảm thiểu lãng phí (dấu ấn) cơ sở hạ tầng. Etherpad sẽ tiếp tục hỗ trợ cộng tác theo thời gian thực, nhưng không kỳ vọng vào khả năng lưu trữ lâu dài. Những đợt dọn dẹp khác có thể xảy ra trong tương lai mà không cần báo trước. [https://phabricator.wikimedia.org/T415237] '''Cập nhật cho biên tập viên''' * Nhóm Tìm kiếm Thông tin sẽ triển khai [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|thử nghiệm trên ứng dụng di động dùng Android]] nhằm kiểm tra khả năng tìm kiếm kết hợp, có thể xử lý cả các truy vấn tìm theo ngữ nghĩa và theo từ khóa. Việc cải thiện tìm kiếm trên nền tảng này sẽ giúp người đọc dễ dàng tìm thấy những gì mà họ đang tìm kiếm hơn ngay trên Wikipedia. Thử nghiệm này sẽ bắt đầu được triển khai trước tiên là trên Wikipedia tiếng Hy Lạp vào cuối tháng 2, sau đó là các wiki tiếng Anh, tiếng Pháp và tiếng Bồ Đào Nha vào tháng 3. [https://diff.wikimedia.org/2026/01/08/semantic-search-making-it-easier-to-find-the-information-readers-want/ Đọc thêm] trên blog Diff. [https://www.mediawiki.org/wiki/Readers/Information_Retrieval] * Nhóm Phát triển Độc giả sẽ tiến hành [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.10.2 Mobile Table of Contents|một thử nghiệm]] cho người dùng web trên thiết bị di động nhằm thêm mục lục và tự động mở rộng tất cả các đề mục trong bài viết, nhằm tìm hiểu thêm về những vấn đề về điều hướng mà họ gặp phải. Thử nghiệm này sẽ có mặt trên các Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Anh, tiếng Pháp, tiếng Indonesia và tiếng Việt. * Trước đây, các thông báo đầu trang ([[{{ns:8}}:Sitenotice]] và [[{{ns:8}}:Anonnotice]]) chỉ được hiển thị trên trang web dành cho máy tính để bàn. Giờ đây, chúng sẽ được hiển thị trên mọi nền tảng. Người dùng trên trang web di động nay sẽ thấy được những thông báo này và được thông báo. Các bảo quản viên trang web nên sẵn sàng kiểm tra và sửa các thông báo đầu trang trên các thiết bị di động để tránh xung đột với bài viết. Để từ chối, bảo quản viên giao diện có thể thêm <code dir="ltr">#siteNotice { display: none; }</code> vào [[{{ns:8}}:Minerva.css]]. [https://phabricator.wikimedia.org/T138572][https://phabricator.wikimedia.org/T416644] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:19}} {{PLURAL:19|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề trên [[Special:RecentChanges|Đặc biệt:Thay đổi gần đây]] đã được giải quyết. Trước đây, nhấn vào nút ẩn trên các bộ lọc đang được áp dụng khiến cho nút "xem những thay đổi mới từ…" biến mất, dù nó đáng lẽ phải được hiển thị. Nút này giờ đây sẽ hoạt động như mong đợi. [https://phabricator.wikimedia.org/T406339] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Hiện đã có tài liệu mới giúp biên tập viên gỡ lỗi các tính năng tìm kiếm trên trang. Nó hỗ trợ việc khắc phục sự cố khi các trang xuất hiện trong kết quả tìm kiếm, khi thứ hạng có vẻ không như mong đợi và khi bạn cần kiểm tra nội dung nào đang được lập chỉ mục, giúp việc tìm hiểu và phân tích hành vi tìm kiếm trở nên dễ dàng hơn. [[mw:Help:CirrusSearch/Debug|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T411169] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.16|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/08|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W08"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:17, ngày 16 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30086330 --> == Bản tin Kỹ thuật: Tuần 09-2026 == <section begin="technews-2026-W09"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/09|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Tính năng [[mw:Special:MyLanguage/Edit check/Reference Check|Kiểm tra Nguồn Tham khảo]] đã được triển khai tới Wikipedia tiếng Anh, điều này có nghĩa là việc triển khai tính năng trên tất cả các trang Wikipedia đã hoàn thành. Tính năng này nhắc những người mới thêm nguồn tham khảo trước khi đăng nội dung mới, giúp giảm thiểu việc lùi sửa liên quan đến các vấn đề nguồn tham khảo phổ biến và cải thiện khả năng kiểm chứng được. Trong quá trình thử nghiệm A/B, tính năng này mang lại hiệu quả rất đáng kể: những người mới có hiển thị Kiểm tra Nguồn Tham khảo có khả năng thêm nguồn tham khảo cao hơn khoảng 2,2 lần trên trang web dành cho máy tính và cao hơn khoảng 17,5 lần trên trang web dành cho di động. [https://analytics.wikimedia.org/published/reports/editing/reference_check_ab_test_report_final_2025.html] '''Cập nhật cho biên tập viên''' * [[mw:Special:MyLanguage/Extension:InterwikiSorting|Phần mở rộng InterwikiSorting]], một phần mở rộng cho phép [[m:Special:MyLanguage/Interwiki sorting order|sắp xếp các liên kết liên wiki]], đã bị gỡ bỏ khỏi Wikipedia. Do đó, những biên tập viên đã bật tính năng sắp xếp liên kết liên wiki ở chế độ không rút gọn (định dạng danh sách đầy đủ) sẽ thấy được rằng các liên kết được sắp xếp lại. Các liên kết từ nay trở đi sẽ được liệt kê theo thứ tự bảng chữ cái dựa trên mã ngôn ngữ. [https://phabricator.wikimedia.org/T253764] * Cuối tuần này, người dùng sửa đổi một đề mục của trang bằng cách sử dụng trình soạn thảo trực quan trên thiết bị di động, sẽ nhìn thấy một nút mới có tên "Sửa đổi toàn bộ trang". Khi chạm vào nút đó, bạn sẽ có thể sửa đổi toàn bộ bài viết. Điều này sẽ giúp ích khi thay đổi bạn muốn thực hiện nằm ngoài đề mục mà bạn mở ban đầu. [https://phabricator.wikimedia.org/T387175][https://phabricator.wikimedia.org/T409112] * [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] đang mời các biên tập viên đánh giá xem chế độ tối có nên tiếp tục được coi là ở giai đoạn "thử nghiệm" (beta) trên wiki của họ hay không, dựa trên kinh nghiệm của họ về mức độ hoạt động tốt hay không của chế độ này trên máy tính và thiết bị di động. Nếu tính năng này được đánh giá là hoàn thiện rồi, thì các biên tập viên có thể cập nhật các thông báo giao diện trong <code dir=ltr>MediaWiki:skin-theme-description</code> và <code dir=ltr>MediaWiki:Vector-night-mode-beta-tag</code> để cho biết rằng chế độ tối đã sẵn sàng và không còn được coi là trong giai đoạn thử nghiệm nữa. * [[mw:Wikimedia_Apps/Team/iOS/Activity_Tab|Tab Hoạt động]] được cải tiến mà hiển thị thông tin chuyên sâu về người dùng nay có sẵn cho tất cả người dùng ứng dụng Wikipedia trên (phiên bản 7.9.0 trở lên). Sau quá trình thử nghiệm A/B trước đây cho thấy tỷ lệ tạo tài khoản trong số những người dùng có quyền truy cập vào tính năng này cao hơn, tính năng này đã được triển khai cho 100% người dùng kèm vài cập nhật. Tab Hoạt động nay hiển thị các bài viết bạn đã sửa đổi trên dòng thời gian, cung cấp thông tin chi tiết về tác động của việc sửa đổi chẳng hạn như số lượng đóng góp và xu hướng xem bài viết, cùng những tùy chọn tùy chỉnh để cải thiện trải nghiệm dành cho người dùng trong ứng dụng. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho [[mw:Special:MyLanguage/Extension:DiscussionTools|Công cụ Thảo luận (DiscussionTools)]] không thể hoạt động trên thiết bị di động, từ đó khôi phục đầy đủ tất cả chức năng. [https://phabricator.wikimedia.org/T415303] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi từ nhiều wiki trên cùng một trang. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] giúp thực hiện được điều này tiếp tục được cải tiến. Cải tiến mới nhất là việc bổ sung [[mw:Extension:GlobalWatchlist#hook|hook mới]], <code dir=ltr>ext.globalwatchlist.rebuild</code>, được kích hoạt sau mỗi lần xây dựng lại danh sách theo dõi. Điều này cho phép bạn chạy các tiện ích và đoạn mã người dùng cho trang Đặc biệt. [https://phabricator.wikimedia.org/T275159] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.17|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/09|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W09"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:03, ngày 23 tháng 2 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30119102 --> == Bản tin Kỹ thuật: Tuần 10-2026 == <section begin="technews-2026-W10"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/10|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments|Chế độ Sinh nhật]] Wikipedia 25 nay đã có mặt trên các trang Wikipedia tiếng Betawi, tiếng Breton, tiếng Trung, tiếng Séc, tiếng Hà Lan, tiếng Anh, tiếng Pháp, tiếng Gorontalo, tiếng Indonesia, tiếng Ý, tiếng Luxembourg, tiếng Madura, tiếng Sicilia, tiếng Tây Ban Nha, tiếng Thái và tiếng Việt! Tính năng chiến dịch hữu hạn này kỷ niệm 25 năm thành lập Wikipedia cùng linh vật cho ngày sinh nhật, Quả cầu Nhỏ (Baby Globe). Khi được bật, Quả cầu Nhỏ được hiển thị trên [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments/article configuration|~2,500 bài viết]], chờ người đọc khám phá. Cộng đồng có thể chọn bật chế độ Sinh nhật bằng cách đạt đồng thuận từ cộng đồng của mình và yêu cầu một bảo quản viên bật tính năng đó cũng như tùy chỉnh nó thông qua [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments#Community Configuration Demo|cấu hình cộng đồng]] trên wiki cục bộ. '''Cập nhật cho biên tập viên''' * [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Tham chiếu phụ (sub-referencing)]], một tính năng mới để tái sử dụng nguồn tham khảo với những chi tiết khác đã được triển khai tới Wikipedia tiếng Thụy Điển, Wikipedia tiếng Ba Lan và [[:phab:T418209|một vài trang wiki khác]]. Bạn có thể [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#test|thử tính năng này]] trên những dự án đó hoặc trên testwiki và [https://en.wikipedia.beta.wmcloud.org/wiki/Sub-referencing betawiki]. Kinh nghiệm từ wiki thí điểm đầu tiên Wikipedia tiếng Đức đã được [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing/Learnings|công bố trong báo cáo]]. Hãy liên hệ với nhóm Wikimedia Deutschland nếu bạn [[:m:Talk:WMDE Technical Wishes/Sub-referencing#Pilot wikis|quan tâm đến việc trở thành một wiki thí điểm]]. * [[mw:Special:MyLanguage/Help:Edit check#Paste check|Kiểm tra Chép dán]] (Paste Check) sẽ có mặt trên mọi trang Wikipedia trong tuần này. Tính năng này nhắc những người mới dán các đoạn văn bản mà họ không chắc viết vào Trình Soạn thảo Trực quan cân nhắc xem làm như thế có nguy cơ vi phạm bản quyền hay không. Kiểm tra Chép dán [[mw:Special:MyLanguage/Edit check/Tags|gắn thẻ]] tất cả sửa đổi mà nó hiển thị để có thể xem xét tiếp. Các bảo quản viên cục bộ có thể thiết lập cấu hình cho các khía cạnh khác nhau của tính năng này thông qua [[{{#special:EditChecks}}]]. [[mw:Special:MyLanguage/Edit check/Paste Check#A/B Experiment|Nghiên cứu]] trên 22 wiki cho thấy Kiểm tra Chép dán giúp giảm 18% số lượng sửa đổi bị lùi lại wikis found that so với nhóm đối chứng. Các biên dịch viên có thể [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-visualeditor-ve-mw-editcheck&filter=&optional=1&action=translate giúp biên dịch] tính năng này cùng những tính năng có liên quan. * [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] sẽ chuẩn hóa menu người dùng ở góc trên bên phải cho tất cả người dùng di động nhằm giúp nó gần giống trải nghiệm trên máy tính hơn. Hiện tại menu người dùng này chỉ hiển thị cho những người đã bật Chế độ Điều khiển Di động Nâng cao (AMC). Thay đổi duy nhất là một vài nút trước đây ở menu bên trái sẽ chuyển sang góc trên bên phải cho người dùng không bật chế độ AMC. Thay đổi này dự kiến được triển khai vào ngày 9 tháng 3 và nhằm mục đích cải thiện giao diện người dùng. [https://phabricator.wikimedia.org/T413912] * Bắt đầu từ tuần ngày 2 tháng 3, các email được gửi khi thêm, xóa hoặc sửa địa chỉ email của tài khoản sẽ chuyển sang định dạng email HTML đẹp mắt và rõ ràng hơn nhiều so với định dạng email văn bản thuần túy trước đây. [https://phabricator.wikimedia.org/T410807] * Thông báo hiện chỉ giới hạn lưu 2.000 mục lịch sử cho mỗi người dùng, điều này kéo dài trở về năm 2013 khi tính năng này mới được phát hành. Giờ nó sẽ thay đổi thành việc lưu các Thông báo trong 5 năm trở lại đây, nhưng mở rộng lên tối đa 10.000 mục. Điều này sẽ giúp bảo vệ cơ sở hạ tầng và giúp ngăn việc những thông báo xuất hiện gần đây hơn biến mất quá sớm. [https://phabricator.wikimedia.org/T383948] * [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi của bạn từ nhiều wiki khác nhau trên cùng một trang tiếp tục được cải tiến. Lần cập nhật gần đây nhất cải thiện trải nghiệm sử dụng nhãn. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] nay cho phép kích hoạt [[mw:Special:MyLanguage/Manual:Language#Fallback languages|hệ thống ngôn ngữ dự phòng]] cho các khoản mục Wikidata không có nhãn bằng ngôn ngữ được xem, đồng thời hiển thị những nhãn đó trong ngôn ngữ Wikidata yêu thích của người dùng nếu không cung cấp tham số URL <code dir=ltr>uselang=</code>. [https://phabricator.wikimedia.org/T373686][https://phabricator.wikimedia.org/T416111] * Nhóm Wikipedia dành cho Android đã bắt đầu cuộc thử nghiệm beta cho tính năng [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|tìm kiếm kết hợp]] (hybrid search) trên Wikipedia tiếng Hy Lạp. Khả năng tìm kiếm kết hợp có thể xử lý cả truy vấn ngữ nghĩa và từ khóa giúp người đọc dễ dàng tìm kiếm những gì họ muốn tìm kiếm ngay trên Wikipedia hơn. * Vì lý do bảo mật, thành viên của một vài nhóm người dùng nhất định [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|bắt buộc phải bật tính năng xác thực hai yếu tố]] (2FA). Hiện tại, 2FA bắt buộc phải được bật để sử dụng nhóm người dùng, nhưng không cần phải là để trở thành thành viên nhóm đó. Do mô hình này vẫn còn một vài lỗ hổng, tình hình này sẽ [[phab:T418580|dần dần thay đổi vào tháng 3]]. Các thành viên thuộc những nhóm người dùng đó sẽ không thể tắt phương thức 2FA cuối cùng có trên tài khoản của họ, và sẽ không thể thêm người dùng không dùng 2FA vào những nhóm này. Người dùng vẫn sẽ có thể thêm phương thức xác thực mới hoặc loại bỏ chúng, miễn là còn ít nhất một phương thức được bật. Trong khoảng nửa sau của tháng 3, những người dùng mà không có 2FA sẽ bị loại bỏ khỏi những nhóm này. Điều này áp dụng cho: Bảo quản viên Thông báo Trung ương, kiểm định viên, bảo quản viên giao diện, giám sát viên, nhân viên Wikidata, nhân viên Wikifunctions, bộ phận CNTT của Văn phòng WMF và bộ phận Tin cậy & An toàn của and WMF. Sẽ không có gì thay đổi với những người dùng khác. Xem tác vụ được liên kết để biết khung thời gian triển khai. [https://phabricator.wikimedia.org/T418580] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:27}} {{PLURAL:27|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề ngăn người dùng tạo một phiên bản trong [https://www.wikibase.cloud/ Wikibase.cloud] hiện đã được giải quyết. [https://phabricator.wikimedia.org/T416807] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Để giúp đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng cơ sở hạ tầng một cách hợp lý]], trong tháng tới Quỹ Wikimedia sẽ triển khai giới hạn truy cập API toàn cục trên tất cả các API của chúng tôi. Vào đầu tháng 3, các giới hạn nghiêm ngặt hơn sẽ được áp dụng cho các yêu cầu không xác định từ bên ngoài Toolforge/WMCS và các yêu cầu API được thực hiện từ các trình duyệt web. Vào tháng 4, những giới hạn cao hơn sẽ được áp dụng cho lưu lượng truy cập được xác định. Những giới hạn này được cố ý đặt ở mức cao nhất có thể nhằm giảm thiểu tác động đến cộng đồng. Các bot chạy trong Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào sẽ không bị ảnh hưởng vào lúc này. Tuy vậy, mọi nhà phát triển được khuyến cáo làm theo những lời khuyên thực tiễn được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn truy cập]]. * Điểm cuối Truy vấn Dữ liệu được Liên kết (LDF) của Dịch vụ Truy vấn Wikidata sẽ ngừng hoạt động vào tháng 2. Điểm cuối này phục vụ lưu lượng truy cập hạn chế, lưu lượng này đã được chuyển đổi thành công sang các phương thức truy cập dữ liệu khác phù hợp hơn để hỗ trợ các trường hợp sử dụng (use case) hiện có. Phần cứng được sử dụng để hỗ trợ điểm cuối LDF sẽ được phân bổ lại để hỗ trợ những nỗ lực chuyển đổi hệ thống backend đang diễn ra. [https://phabricator.wikimedia.org/T415696] * Trình phân tích cú pháp Parsoid mới [[mw:Special:MyLanguage/Parsoid/Parser Unification/Updates|tiếp tục được triển khai đến nhiều wiki hơn]], nhằm cải thiện tính bền vững của nền tảng và giúp việc giới thiệu các tính năng đọc và sửa đổi mới trở nên dễ dàng hơn. Parsoid nay là trình phân tích cú pháp mặc định trên 488 trang wiki của WMF (268 trang Wikipedia), hiện chiếm hơn 10% tổng số lượt xem trang Wikipedia. * Quy trình và tiêu chí để [[Special:MyLanguage/Wikimedia Enterprise#Access|yêu cầu quyền truy cập đặc biệt]] vào nguồn cấp dữ liệu khối lượng lớn của API ''Wikimedia Enterprise'' (miễn phí cho các trường hợp sử dụng phù hợp với nhiệm vụ), [[m:Talk:Wikimedia Enterprise#Exceptional access criteria|hiện đã được công bố]]. Điều này nhằm cung cấp tài liệu đầy đủ và rõ ràng hơn cho người dùng. * [https://techblog.wikimedia.org/ Blog Kỹ thuật], một blog dành riêng cho cộng đồng kỹ thuật Wikimedia [https://techblog.wikimedia.org/2026/02/24/a-tech-blog-diff/ sẽ được chuyển] sang [[diffblog:|Diff]], blog tin tức và sự kiện cộng đồng. Việc chuyển đổi dự kiến sẽ được hoàn thành vào tháng 4 năm 2026, sau thời điểm này các bài viết mới sẽ được chấp nhận xuất bản. Người đọc sẽ có thể truy cập các bài đăng – cả bài cũ và mới – trên trang đích này tại https://diff.wikimedia.org/techblog. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.18|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/10|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W10"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:51, ngày 2 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30137798 --> == Bản tin Kỹ thuật: Tuần 11-2026 == <section begin="technews-2026-W11"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/11|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * [[m:Special:MyLanguage/Tech/Server switch|Tất cả các wiki sẽ chuyển sang chế độ chỉ đọc trong vòng vài phút]] vào thứ 4, ngày 25 tháng 3 năm 2026 lúc [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. Điều này là nhằm phục vụ cho việc thử nghiệm chuyển đổi máy chủ cơ sở dữ liệu dự phòng, [[wikitech:Deployments/Yearly calendar|diễn ra hai lần trong một năm]]. Trong quá trình chuyển đổi này, toàn bộ lưu lượng trên các trang web của Wikimedia được chuyển từ trung tâm dữ liệu chính sang trung tâm dữ liệu dự phòng nhằm kiểm tra tính khả dụng và ngăn ngừa việc gián đoạn dịch vụ ngay cả trong những trường hợp khẩn cấp. * Tuần trước, tất cả các wiki đều bị giới hạn ở chế độ chỉ đọc trong vòng 2 giờ đồng hồ, cùng với đó các đoạn mã người dùng và tiện ích cũng không khả dụng trong thời gian được kéo dài. Điều này là do một sự cố bảo mật mà đã được khắc phục sau đó. Chúng tôi đang tiếp tục cố gắng để ngăn điều này tái diễn. Để cập nhật thông tin vui lòng xem [[m:Steward's noticeboard#Statement on Meta about today's user script security incident|bài đăng trên bảng tin của Nhân viên]] ([[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Product Safety and Integrity/March 2026 User Script Incident|bản dịch]]). '''Cập nhật cho biên tập viên''' * Người dùng đang gặp phải nhiều lệnh cấm trên thiết bị di động nay sẽ thấy lý do cấm cho từng lần cấm riêng thay vì một thông báo chung chung. Điều này giúp họ hiểu tại sao mình bị cấm và cần thực hiện những bước nào để giải quyết vấn đề. Ví dụ, người dùng bị ảnh hưởng do sử dụng VPN phổ biến (chẳng hạn như [[Special:MyLanguage/Apple iCloud Private Relay|iCloud Private Relay]]) sẽ nhận được hướng dẫn rõ ràng hơn những việc cần làm để bắt đầu lại việc sửa đổi. [https://phabricator.wikimedia.org/T357118] * Cuối tuần này, [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Chế độ Đề xuất]] sẽ được cung cấp dưới dạng tính năng beta trong trình soạn thảo trực quan trên tất cả các trang Wikipedia. Tính năng này chủ động đề xuất nhiều loại hành động mà người dùng có thể cân nhắc thực hiện để cải thiện các bài viết trên Wikipedia, đồng thời tìm hiểu về các hướng dẫn có liên quan. Tính năng này có thể được cấu hình cục bộ và cũng có thể được mở rộng cục bộ với bằng việc tùy chỉnh Đề xuất. Cài đặt hiện tại có thể xem được tại trang [[Special:EditChecks]] và có [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators %E2%80%93 local customization|hướng dẫn cách bảo quản viên có thể tùy chỉnh]] các liên kết để chỉ tới những trang hướng dẫn cục bộ. Tính năng này được kết nối với tính năng [[mw:Special:MyLanguage/Help:Edit check|Kiểm tra sửa đổi]], một tính năng đưa ra đề xuất cải thiện trong khi người nào đó viết nội dung mới. Trong tương lai, nhóm Sửa đổi dự kiến đánh giá tác động của tính năng này đối với người dùng mới thông qua một thử nghiệm có kiểm soát. [https://phabricator.wikimedia.org/T404600] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố liên quan đến việc con trỏ bị lệch khi sử dụng tính năng tô sáng cú pháp của CodeMirror, một tính năng giúp mã wiki (wikitext) và mã code dễ đọc hơn, nay đã được giải quyết. Vấn đề này đặc biệt ảnh hưởng đến những người dùng đã định nghĩa quy tắc phông chữ trong stylesheet tùy chỉnh khi tạo chủ đề mới bằng Công cụ Thảo luận. [https://phabricator.wikimedia.org/T418793] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Cập nhật về giới hạn truy vấn API: Để giúp đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng hợp lý cơ sở hạ tầng]], giới hạn truy vấn API toàn cục sẽ được áp dụng trong tuần này cho các yêu cầu không có User-Agent hợp lệ bắt nguồn từ bên ngoài Toolforge/WMCS cùng các yêu cầu chưa được xác thực được thực hiện từ trình duyệt web. Trong tháng 4 tới sẽ thiết lập giới hạn cao hơn cho lưu lượng truy cập được xác định. Các bot chạy trên Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào hiện sẽ không bị ảnh hưởng vì điều này. Tuy vậy, mọi nhà phát triển được khuyến cáo nên tuân theo những hướng dẫn thực tiễn tốt nhất được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn truy vấn]]. * API GraphQL mới đã được phát hành. API này được phát triển như một giải pháp thay thế linh hoạt cho một số tính năng nhất định của Dịch vụ Truy vấn Wikidata (WDQS), nhằm cải thiện trải nghiệm và khả năng thích ứng của nhà phát triển, đồng thời giúp truy cập dữ liệu hiệu quả. Hãy dùng thử và [[d:Wikidata:Wikibase GraphQL#Feedback and development|gửi phản hồi]] của mình. Bạn cũng có thể [https://greatquestion.co/wikimediadeutschland/GraphQLAPI/apply đăng ký tham gia các bài kiểm tra về khả năng sẵn dùng]. * Vào tháng 2 [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|Nhóm Làm việc cho Công cụ Không được Hỗ trợ PTAC]] đã tiếp tục cải tiến [[commons:Special:MyLanguage/Commons:Video2commons#|Video2Commons]], trong đó sửa các lỗi liên quan đến lỗi xác thực, xử lý tệp lớn, khả năng hiển thị hàng đợi tác vụ và làm rõ hơn hành vi tải lên. Hiện một số lĩnh vực vẫn đang được tiến hành thực hiện, trong đó có những thay đổi liên quan đến việc tải lên từ phía máy chủ đã lỗi thời. Hãy đọc [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group#February 2026|phần cập nhật này]] để tìm hiểu thêm. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.19|MediaWiki]] '''Chuyên sâu''' * Nhóm Hướng dẫn Bài viết mời các biên tập viên Wikipedia có kinh nghiệm từ một số [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators#Collaborators|wiki thí điểm]] được chọn cùng những người đóng góp có quan tâm từ các trang Wikipedia khác điền vào bảng câu hỏi này, có sẵn bằng [https://docs.google.com/forms/d/e/1FAIpQLSfmLeVWnxmsCbPoI_UF2jyRcn73WRGWCVPHzerXb4Cz97X_Ag/viewform tiếng Anh], [https://docs.google.com/forms/d/e/1FAIpQLSd6rzr4XXQw8r4024fE3geTPFe13M_6w7Mitj-YJi0sOlWTAw/viewform?usp=header tiếng Ả Rập], [https://docs.google.com/forms/d/e/1FAIpQLSdok3-RfB18lcugYTUMGkpwmqG_8p760Wv4dCXitOXOszjUDw/viewform?usp=header tiếng Bengali], [https://docs.google.com/forms/d/e/1FAIpQLSfjTfYp4jEo0akA4B1e-Nfg3QZPCudUjhJzHzzDi6AHyAaMGA/viewform?usp=header tiếng Nhật], [https://docs.google.com/forms/d/e/1FAIpQLScteVoI29Aue4xc72dekk-6RYtvmMgQxzMI900UOawrFrSTWg/viewform?usp=header tiếng Bồ Đào Nha], [https://docs.google.com/forms/d/e/1FAIpQLSetdxnYwL3ub2vqA7awCg5hJZPMIYcDPaiTe12rY9h0GYnVlw/viewform?usp=header tiếng Ba Tư] và [https://docs.google.com/forms/d/e/1FAIpQLScNvfJF-Ot-4pzA4qAN771_0QDJ4Li19YcUsaTgSKW8Nc7U_Q/viewform?usp=header tiếng Thổ Nhĩ Kỳ]. Phản hồi của bạn sẽ giúp nhóm tùy chỉnh hướng dẫn cho các biên tập viên ít kinh nghiệm hơn và giúp họ tìm hiểu các chính sách và thực tiễn của cộng đồng khi tạo bài viết. Tìm hiểu thêm [[mw:Special:MyLanguage/Article guidance|trên trang dự án]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/11|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W11"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:53, ngày 9 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30213008 --> == Bản tin Kỹ thuật: Tuần 12-2026 == <section begin="technews-2026-W12"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/12|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * Tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], còn được biết đến với tên [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], được sử dụng để tô sáng cú pháp mã wiki kể từ tháng 11 năm 2024. Tính năng này sẽ chính thức kết thúc giai đoạn thử nghiệm beta vào tháng 5 năm 2026 nhằm đưa những cải tiến và [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Features|tính năng]] mới cho tất cả biên tập viên sử dụng trình tô sáng cú pháp tiêu chuẩn. Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào về việc kết thúc giai đoạn thử nghiệm beta cho tính năng này, [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|vui lòng chia sẻ với chúng tôi]]. [https://phabricator.wikimedia.org/T259059] * Một số thay đổi đối với quyền nhóm người dùng cục bộ được tiếp viên trên Meta-Wiki thực hiện và nhật trình về những thay đổi này chỉ được ghi lại trên đó. Giờ đây, thay đổi về quyền liên wiki sẽ được ghi lại trên cả Meta-Wiki và wiki của người dùng mục tiêu để giúp dễ dàng truy cập vào toàn bộ bản ghi thay đổi quyền người dùng trên wiki cục bộ hơn. Những mục nhật trình trước đây về những thay đổi này sẽ được cập nhật trong những tuần tiếp theo. [https://phabricator.wikimedia.org/T6055] * Trên các wiki sử dụng [[m:Special:MyLanguage/Flagged Revisions|Thay đổi Được gắn cờ (Flagged Revisions)]], số lượng thay đổi đang chờ được hiển thị trên [[{{#Special:PendingChanges}}]] trước đây tính cả những trang mà không còn ở trong trạng thái đang chờ xem xét, do chúng đã bị xóa khỏi hệ thống mà không được xem xét lại, v.d. do bị xóa, được di chuyển sang không gian tên khác, hoặc do thay đổi cấu hình wiki. Bộ đếm giờ sẽ được hiển thị chính xác. Trên một số wiki số lượng thay đổi được hiển thị sẽ nhỏ hơn nhiều so với trước đây. Bản thân danh sách các trang sẽ không có thay đổi gì. [https://phabricator.wikimedia.org/T413016] * Ngôn ngữ soạn thảo của Wikifunctions đã được viết lại, tạo ra một phiên bản mới của ngôn ngữ này. Thay đổi này nhằm mục đích tăng cường tính ổn định của dịch vụ bằng cách giảm mức tiêu thụ bộ nhớ của trình điều phối. Việc viết lại này cũng giúp cho phép giảm đáng kể độ trễ, đơn giản hóa mã nguồn và tạo ra các lớp trừu tượng tốt hơn, nhằm mở ra cơ hội bổ sung thêm các tính năng khác trong tương lai. Đọc thêm về [[f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-11|các thay đổi này]]. * Người dùng nay có thể sắp xếp kết quả tìm kiếm theo thứ tự bảng chữ cái dựa trên tiêu đề trang. Lần cập nhật này cung cấp thêm một tùy chọn giúp cho việc tìm kiếm trang trở nên dễ dàng và nhanh chóng hơn. Trước đây, kết quả có thể được sắp xếp theo Ngày sửa đổi, Ngày tạo, hoặc Mức độ liên quan. Để sử dụng tùy chọn mới này, hãy mở 'Tìm kiếm nâng cao' trên trang kết quả tìm kiếm và chọn 'Thứ tự bảng chữ cái' trong mục 'Thứ tự sắp xếp'. [https://phabricator.wikimedia.org/T403775] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:28}} {{PLURAL:28|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho Trình tải lên tập tin (UploadWizard) trên Wikimedia Commons không thể nhập tập tin từ Flickr nay đã được giải quyết. [https://phabricator.wikimedia.org/T419263] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Một trang đặc biệt mới, [[{{#special:LintTemplateErrors}}]], đã được tạo ra để liệt kê các trang nhúng được đánh dấu là chứa lỗi lint để giúp người dùng dễ dàng phát hiện chúng hơn. Danh sách được sắp xếp theo số lượng các trang được nhúng mà có lỗi. Ví dụ: [[{{#special:LintTemplateErrors}}/night-mode-unaware-background-color]]. [https://phabricator.wikimedia.org/T170874] * Người dùng tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] hiện đang sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] để tô sáng cú pháp khi sửa đổi các trang nội dung JavaScript, CSS, JSON, Vue và Lua, trong một khoảng thời gian. Cùng với việc kết thúc thử nghiệm beta cho CodeMirror 6, kế hoạch là thay thế CodeEditor để trở thành trình soạn thảo tiêu chuẩn cho những kiểu nội dung này vào tháng 5 năm 2026. [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|Mọi phản hồi hoặc ý kiến đóng góp đều được hoan nghênh]]. [https://phabricator.wikimedia.org/T419332] * Các mô đun JavaScript cho [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] JavaScript sẽ sớm được nâng cấp lên CodeMirror 6. Trước thời điểm nâng cấp này, việc tải các mô đun <code dir=ltr>ext.CodeMirror</code> hoặc <code dir=ltr>ext.CodeMirror.lib</code> từ các tiện ích và đoạn mã người dùng đã bị loại bỏ vào tháng 7 năm 2025. Việc sử dụng hook <code dir=ltr>ext.CodeMirror.switch</code> cũng đã bị loại bỏ vào tháng 3 năm 2025. Những người đóng góp nay có thể làm cho các đoạn mã hoặc tiện ích của mình tương thích với CodeMirror 6. Xem [[mw:Special:MyLanguage/Extension:CodeMirror#Gadgets and user scripts|hướng dẫn chuyển đổi]] để biết thêm thông tin. [https://phabricator.wikimedia.org/T373720] * Nhóm Giao diện MediaWiki đang mở rộng phạm vi định nghĩa mô đun API REST để bao gồm cả [[mw:Special:MyLanguage/API:REST API/Extensions|các API mở rộng]]. Mô đun API REST là nhóm các điểm cuối có liên quan mà có thể được quản lý và đánh phiên bản độc lập. Hiện đã có các mô đun cho API [https://phabricator.wikimedia.org/T414470 GrowthExperiments] và [https://phabricator.wikimedia.org/T419053 Wikifunctions]. Khi chúng tôi chuyển đổi các API mở rộng sang cấu trúc này, tài liệu sẽ được chuyển ra khỏi phần đặc tả chính cho OpenAPI của MediaWiki cùng chế độ xem REST Sandbox, và thay vào đó sẽ có thể truy cập được thông qua tùy chọn dành riêng cho mô đun trong menu thả xuống trên [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox] (nghĩa là, [[{{#Special:RestSandbox}}]], có sẵn trên tất cả các dự án wiki). * Phần mở rộng [[mw:Special:MyLanguage/Extension:Scribunto|Scribunto]] cung cấp nhiều thông tin khác nhau về wiki nơi mô đun đang được sử dụng thông qua thư viện [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual|mw.site]]. Kể từ tuần trước, thư viện này cũng cung cấp một [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#mw.site.wikiId|cách]] truy cập [[mw:Special:MyLanguage/Manual:Wiki ID|ID của wiki]] có thể được sử dụng để hỗ trợ bảo trì mô đun liên wiki. [https://phabricator.wikimedia.org/T146616] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.20|MediaWiki]] '''Chuyên sâu''' * [[m:Special:MyLanguage/Coolest Tool Award|Giải thưởng Công cụ Tuyệt vời nhất năm 2026]] nhằm tôn vinh những công cụ xuất sắc do cộng đồng tạo ra, nay đã mở nhận đề cử! Hãy đề cử công cụ yêu thích của bạn bằng cách sử dụng biểu mẫu [https://wikimediafoundation.limesurvey.net/435684?lang=en khảo sát đề cử] trước ngày 23 tháng 3 năm 2026. Để biết thêm thông tin về quyền riêng tư và xử lý dữ liệu, vui lòng xem [[foundation:Special:MyLanguage/Legal:Coolest_Tool_Award_2026_Survey_Privacy_Statement|tuyên bố về quyền riêng tư của khảo sát]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/12|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W12"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:35, ngày 16 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30260505 --> == Bản tin Kỹ thuật: Tuần 13-2026 == <section begin="technews-2026-W13"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/13|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Người dùng các trang Wikimedia nay có thể đăng nhập mà không cần mật khẩu bằng cách sử dụng khóa truy cập (passkey). Đây là một phương thức bảo mật sử dụng vân tay, nhận diện khuôn mặt hoặc mã PIN. Với thay đổi này, tất cả người dùng chọn đăng nhập không cần mật khẩu sẽ có thể đăng nhập vào tài khoản của mình một cách dễ dàng, nhanh chóng và an toàn hơn trên mọi thiết bị. Tùy chọn đăng nhập mới bằng khóa truy cập hiện hiển thị dưới dạng gợi ý tự động điền trong trường tên người dùng. [[phab:T417120|Nút "Đăng nhập bằng khóa truy cập"]] bổ sung sẽ sớm được cung cấp cho những người dùng đã bật tùy chọn sử dụng khóa truy cập. Lần cập nhật này sẽ cải thiện bảo mật cũng như trải nghiệm người dùng. [[c:File:Passwordless_login_screencast.webm|Bản ghi lại màn hình]] này sẽ minh họa từng bước quy trình đăng nhập không cần mật khẩu. * [[m:Special:MyLanguage/Tech/Server switch|Tất cả các wiki sẽ chuyển sang chế độ chỉ đọc trong vòng vài phút]] vào thứ 4, ngày 25 tháng 3 năm 2026 lúc [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. Điều này là nhằm phục vụ cho việc thử nghiệm chuyển đổi máy chủ cơ sở dữ liệu dự phòng, [[wikitech:Deployments/Yearly calendar|diễn ra hai lần trong một năm]]. Trong quá trình chuyển đổi này, toàn bộ lưu lượng trên các trang web của Wikimedia được chuyển từ trung tâm dữ liệu chính sang trung tâm dữ liệu dự phòng nhằm kiểm tra tính khả dụng và ngăn ngừa việc gián đoạn dịch vụ ngay cả trong những trường hợp khẩn cấp. '''Cập nhật cho biên tập viên''' * Người dùng các trang web của Wikimedia nay có thể xuất các thông báo cách đây hơn 5 năm của mình bằng cách sử dụng [[toolforge:echo-chamber|công cụ Toolforge mới]]. Điều này sẽ đảm bảo rằng người dùng có thể giữ lại được những thông báo quan trọng và tránh bị mất chúng do việc thay đổi theo kế hoạch nhằm xóa đi các thông báo cũ hơn 5 năm, như đã thông báo trước đó. [https://phabricator.wikimedia.org/T383948] * Các biên tập viên Wikipedia tiếng Indonesia, tiếng Thái, tiếng Thổ Nhĩ Kỳ, và tiếng Anh Đơn giản nay có thể truy cập vào Đặc biệt:Bảng điều khiển cá nhân. Đây là [[mw:Special:MyLanguage/Moderator Tools/Dashboard|phiên bản trải nghiệm sớm]] giúp các biên tập viên mới làm quen với quy trình tuần tra, giúp họ dễ dàng chuyển từ việc sửa đổi sang tham gia vào những công việc kiểm duyệt nâng cao hơn trên dự án của mình. [https://phabricator.wikimedia.org/T402647] * Trang [[vi:Special:Block|Đặc_biệt:Cấm]] nay có hai thay đổi nhỏ về mặt giao diện. Bảo quản viên nay có thể dễ dàng thực hiện lệnh cấm vô hạn thông qua nút chọn (nút radio) chuyên dụng trong mục thời hạn. Ngoài ra, việc chọn thời hạn là vô hạn sẽ cung cấp một bộ lý do phổ biến khác để lựa chọn, nó có thể được thay đổi tại: [[MediaWiki:Ipbreason-indef-dropdown]]. [https://phabricator.wikimedia.org/T401823] * Biên tập viên sử dụng thiết bị di động [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#Logged-out|tại một số wiki]] nay có thể nhìn thấy cải tiến về cảnh báo sửa đổi khi chưa đăng nhập, điều này là nhờ cập nhật gần đây từ nhóm Phát triển. Những thay đổi được phát hành vào tuần trước này là một phần trong những nỗ lực và thử nghiệm đang được thực hiện nhằm nâng cao [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|trải nghiệm trong việc tạo tài khoản trên thiết bị di động]] và từ đó giúp tăng cường sự tham gia của họ. [https://phabricator.wikimedia.org/T408484] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:36}} {{PLURAL:36|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến người dùng web trên thiết bị di động không thể nhìn thấy thông tin cấm khi có nhiều lệnh cấm đồng thời được áp dụng đã được giải quyết. Họ giờ có thể xem được tin nhắn cho tất cả các lệnh cấm hiện đang được áp dụng cho họ khi họ truy cập Wikipedia. '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Những image (ảnh) được dựng bằng Toolforge sẽ sớm được nâng cấp lên phiên bản buildpack mới, mang đến việc hỗ trợ các phiên bản ngôn ngữ mới hơn cùng những cải tiến và sửa lỗi khác tại thượng nguồn. Nếu bạn sử dụng Dịch vụ Dựng của Toolforge, hãy xem lại [https://lists.wikimedia.org/hyperkitty/list/cloud-announce@lists.wikimedia.org/thread/EMYTA32EV2V5SQ2JIEOD2CL66YFIZEKV/ email cloud-announce] gần đây và cập nhật cấu hình bản dựng của bạn nếu cần để đảm bảo các công cụ của bạn tương thích với phiên bản mới này. [https://wikitech.wikimedia.org/w/index.php?title=Help:Toolforge/Building_container_images&oldid=2392097#Buildpack_environment_upgrade_process][https://phabricator.wikimedia.org/T380127] * Wiki tài liệu [https://api.wikimedia.org/wiki/Main_Page Cổng API] sẽ ngừng hoạt động vào tháng 6 năm 2026. Các khóa API được tạo trên Cổng API sẽ tiếp tục hoạt động bình thường. Các điểm cuối của api.wikimedia.org sẽ dần bị loại bỏ bắt đầu từ tháng 7 năm 2026. Tài liệu trên Cổng API đang được chuyển sang [[mw:Wikimedia APIs|mediawiki.org]]. Tìm hiểu thêm trên [[wikitech:API Portal/Deprecation|trang dự án]]. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.21|MediaWiki]] '''Chuyên sâu''' * [[m:Special:MyLanguage/WMDE Technical Wishes|Nhóm Mong muốn – Kỹ thuật của WMDE]] đang xem xét cải tiến [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|tên chú thích được tạo tự động trong Trình Soạn thảo Trực quan (VisualEditor)]]. Vui lòng xem qua [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names#Proposed solutions|những giải pháp được đề xuất]] và tham gia vào [[m:Talk:WMDE Technical Wishes/References/VisualEditor automatic reference names#Request for comment|thảo luận này]]. '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/13|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W13"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:51, ngày 23 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30268305 --> == Bản tin Kỹ thuật: Tuần 14-2026 == <section begin="technews-2026-W14"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/14|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Phiên bản Beta của [[abstract:|Abstract Wikipedia]] một dự án Wikimedia mới không phụ thuộc ngôn ngữ, đã được khởi động vào tuần trước. Dự án cho phép các cộng đồng xây dựng các bài viết Wikipedia bằng ngôn ngữ mẹ đẻ của họ, và các thành viên khác có thể dễ dàng truy cập các bài viết đó bằng ngôn ngữ của riêng họ. Wiki này hoạt động dựa trên chỉ dẫn từ Wikifunctions và cũng dựa trên nội dung có cấu trúc từ Wikidata. [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-26|Đọc thêm]]. '''Cập nhật cho biên tập viên''' * Nhóm Phát triển đang tiến hành thử nghiệm A/B để đánh giá cho một thông điệp rõ ràng hơn, thân thiện hơn với người dùng nhằm khuyến khích việc tạo tài khoản trên wiki. Hiện tại, khi người dùng di động chưa đăng nhập bắt đầu sửa đổi, họ sẽ thấy một thông báo cảnh báo khó chịu, có thể khiến cho họ có cảm giác đột ngột và nản lòng. Điều này cũng làm cho việc sửa đổi bằng tài khoản tạm thời trở thành mặc định thay vì khuyến khích việc tạo tài khoản. Thử nghiệm đang được thực hiện trên mười trang Wikipedia, bao gồm tiếng Ả Rập, tiếng Pháp, tiếng Tây Ban Nha và tiếng Đức. [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#2. Improve logged-out warning message (T415160)|Đọc thêm]]. * Nhóm Ứng dụng Wikimedia đang mời mọi người đóng góp ý kiến về [[mw:Special:MyLanguage/Wikimedia Apps/Team/Future of Editing on the Mobile Apps|việc sửa đổi trên ứng dụng Wikipedia dành cho thiết bị di động nên hoạt động như thế nào]]. Thảo luận tập trung vào việc cải thiện cách người dùng truy cập công cụ sửa đổi khi họ nhấn vào nút "Sửa đổi". Đây là một phần trong nỗ lực rộng lớn hơn nhằm chuyển đổi những người đọc mà có hứng thú với việc sửa đổi sang một con đường thân thiện hơn với người dùng để có thể bắt đầu đóng góp. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:45}} {{PLURAL:45|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố khiến việc lấy chú thích từ kho lưu trữ báo chí lớn [https://www.newspapers.com Newspapers.com] không còn hoạt động, do bị chặn trong các yêu cầu của [[mw:Special:MyLanguage/Citoid|Citoid]], nay đã được khắc phục. [https://phabricator.wikimedia.org/T419903] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.22|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/14|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W14"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:25, ngày 30 tháng 3 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30329462 --> == Action Required: Update templates/modules for electoral maps (Migrating from P1846 to P14226) == Hello everyone, This is a notice regarding an ongoing data migration on Wikidata that may affect your election-related templates and Lua modules (such as <code>Module:Itemgroup/list</code>). '''The Change:'''<br /> Currently, many templates pull electoral maps from Wikidata using the property [[:d:Property:P1846|P1846]], combined with the qualifier [[:d:Property:P180|P180]]: [[:d:Q19571328|Q19571328]]. We are migrating this data (across roughly 4,000 items) to a newly created, dedicated property: '''[[:d:Property:P14226|P14226]]'''. '''What You Need To Do:'''<br /> To ensure your templates and infoboxes do not break or lose their maps, please update your local code to fetch data from [[:d:Property:P14226|P14226]] instead of the old [[:d:Property:P1846|P1846]] + [[:d:Property:P180|P180]] structure. A [[m:Wikidata/Property Migration: P1846 to P14226/List|list of pages]] was generated using Wikimedia Global Search. '''Deadline:'''<br /> We are temporarily retaining the old data on [[:d:Property:P1846|P1846]] to allow for a smooth transition. However, to complete the data cleanup on Wikidata, the old [[:d:Property:P1846|P1846]] statements will be removed after '''May 1, 2026'''. Please update your modules and templates before this date to prevent any disruption to your wiki's election articles. Let us know if you have any questions or need assistance with the query logic. Thank you for your help! [[User:ZI Jony|ZI Jony]] using [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 17:11, ngày 3 tháng 4 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:ZI Jony@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252 --> == Bản tin Kỹ thuật: Tuần 15-2026 == <section begin="technews-2026-W15"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/15|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Cập nhật cho biên tập viên''' * [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|Phần mở rộng CampaignEvents]] nay có thêm tính năng mới nhằm thiết lập mục tiêu nhóm, nhằm cho phép những người tổ chức thiết lập và theo dõi mục tiêu sự kiện chẳng hạn như số lượng bài viết được tạo và số lượng người tham gia đóng góp theo thời gian thực. Tương tự, những người tham gia có thể cùng nhau hướng tới các mục tiêu chung và chứng kiến ​​tác động tập thể của họ khi sự kiện diễn ra. Tính năng này hiện đã có trên tất cả các wiki của Wikimedia. Tìm hiểu thêm trong [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Collaborative contributions#Goal setting|trang tài liệu này]]. * [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Mục Mong muốn cộng đồng]] Tính năng [[mw:Special:MyLanguage/Help:Watchlist labels|gán nhãn danh sách theo dõi]] mới (được công bố trong [[m:Special:MyLanguage/Tech/News/2026/07|Bản tin Kỹ thuật 2026-07]]) nay có sẵn thông qua Trình Soạn thảo Trực quan, trình soạn thảo mã nguồn, và biểu tượng 'sao theo dõi' (hoặc liên kết theo dõi, đối với các giao diện không có biểu tượng hình sao). Trước đây việc gán nhãn như vậy chỉ có thể thực hiện được thông qua [[Special:EditWatchlist|EditWatchlist]]. Ở cả ba nơi đó, đây đều sẽ là trường mới ngay sau sau trường thời điểm hết hạn theo dõi. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà trang thảo luận trên thiết bị di động dùng Parsoid không thể sử dụng được sau đề mục không có tiêu đề, nay đã được giải quyết. [https://phabricator.wikimedia.org/T419171] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Tính năng chú thích phụ]], một tính năng cho phép biên tập viên thêm thông tin chi tiết vào nguồn tham khảo hiện có mà không cần nhân bản nó, sẽ được triển khai dần dần tới [[phab:T414094|nhiều trang wiki hơn]] vào cuối năm nay. Các wiki sử dụng tiện ích [[mw:Special:MyLanguage/Reference Tooltips|Chú thích nổi]] được khuyến khích cập nhật phiên bản của mình (thường là tại [[m:MediaWiki:Gadget-ReferenceTooltips.js|MediaWiki:Gadget-ReferenceTooltips.js]] như được hiển thị tại [https://en.wikipedia.org/w/index.php?diff=1344408362 đây]) để đảm bảo khả năng tương thích. Các tiện ích khác liên quan đến nguồn tham khảo khác cũng có thể bị ảnh hưởng. [https://phabricator.wikimedia.org/T416304] * Tất cả các phiên bản của Wikinews sẽ bị đóng và chuyển sang chế độ chỉ đọc vào ngày 4 tháng 5 năm 2026. Mọi nội dung vẫn sẽ có thể truy cập được, nhưng sẽ không thể thêm bất kỳ sửa đổi hoặc bài viết mới nào. Việc đóng này đã được Hội đồng Quản trị của Quỹ Wikimedia phê duyệt sau những cuộc thảo luận kéo dài. [[m:Wikimedia Foundation Board noticeboard#Board of Trustees Approves Closure of Wikinews|Đọc thêm]]. * [[:mw:Special:MyLanguage/API:Action API|API Tác vụ]] có một số kiểu định dạng đầu ra được yêu cầu. Một trong số chúng, <bdi lang="zxx" dir="ltr"><code><nowiki>format=php</nowiki></code></bdi>, sẽ sớm bị loại bỏ. Vui lòng đảm bảo rằng các tập lệnh hoặc bot của bạn sử dụng [[mw:Special:MyLanguage/API:Data formats#Output|kiểu định dạng JSON]]. Việc loại bỏ này sẽ chỉ ảnh hưởng đến một số lượng rất nhỏ các tập lệnh người dùng và bot. [https://phabricator.wikimedia.org/T118538] * Trang [[Special:NamespaceInfo|Đặc biệt:NamespaceInfo]] nay có chứa phần viết tắt không gian tên. Ví dụ "WP" cho không gian tên "Project" ("Wikipedia") trên Wikipedia tiếng Đức. [https://phabricator.wikimedia.org/T381455] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.23|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/15|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W15"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:19, ngày 6 tháng 4 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30362761 --> == Bản tin Kỹ thuật: Tuần 16-2026 == <section begin="technews-2026-W16"/><div class="plainlinks"> '''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/16|Các bản dịch]] của bản tin này cũng có sẵn cho bạn. '''Nổi bật trong tuần''' * Các biên tập viên có kinh nghiệm được mời tham gia [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Main_Page thử nghiệm] tính năng [[mw:Special:MyLanguage/Article guidance|Hướng dẫn bài viết]], được thiết kế để giúp các biên tập viên ít kinh nghiệm hơn tạo ra các bài viết Wikipedia có cấu trúc tốt và phù hợp với quy định. Hướng dẫn thử nghiệm [[mw:Special:MyLanguage/Article guidance/Test feature guide|có sẵn tại đây]]. Ngoài ra, sau khi xem xét [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance bản tóm tắt này], vui lòng cung cấp phản hồi trên [[mw:Talk:Article guidance|trang thảo luận của dự án]]. Dựa trên ý kiến đóng góp của bạn, tính năng này sẽ được tinh chỉnh và chuyển giao cho các trang Wikipedia thí điểm để biên dịch và điều chỉnh cho thích hợp. Hãy xem qua [[c:File:Article Guidance workflow demo - April 2026.webm|video]] giải thích về tính năng này. '''Cập nhật cho biên tập viên''' * Trên hầu hết các trang wiki, tất cả thành viên tự xác nhận nay có thể sử dụng trang [[Special:ChangeContentModel|Đặc biệt:ChangeContentModel]] để [[mw:Special:MyLanguage/Help:ChangeContentModel|tạo trang mới với kiểu nội dung tùy chỉnh]], chẳng hạn như danh sách gửi thông báo rộng rãi, giúp cho định dạng trang tùy chỉnh trở nên dễ tiếp cận hơn. Kiểm tra [[Special:ListGroupRights|Đặc biệt:Quyền nhóm người dùng]] để biết trạng thái trên wiki của bạn. [https://phabricator.wikimedia.org/T248294] * Nhóm Phát triển đã khởi động một [[mw:Special:MyLanguage/Contributors/Account_Creation_Experiments|thử nghiệm tạo tài khoản]] để đánh giá xem việc thêm nút tạo tài khoản vào phần đầu trang web trên thiết bị di động có làm tăng số lượng người đăng ký tài khoản mới và khuyến khích nhiều người dùng thiết bị di động đóng góp vào wiki hay không. Thử nghiệm hiện đang được thực hiện trên Wikipedia tiếng Hindi, tiếng Indonesia, tiếng Bengali, tiếng Thái và tiếng Do Thái, và nhắm mục tiêu vào 10% người dùng web trên di động chưa đăng nhập. * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:30}} {{PLURAL:30|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố có thể khiến Trình Soạn thảo Trực quan bị kẹt khi tải trên các thiết bị Windows đã tắt hiệu ứng hoạt ảnh, nay đã được giải quyết. [https://phabricator.wikimedia.org/T382856] '''Cập nhật cho những người đóng góp vào mảng kỹ thuật''' * Kể từ cuối tuần này, {{int:group-abusefilter}} đã bật tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] sẽ sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] làm trình soạn thảo tại [[Special:AbuseFilter|Đặc biệt:Bộ lọc sai phạm]]. Đây là một phần trong nỗ lực rộng lớn hơn nhằm mang lại trải nghiệm người dùng nhất quán hơn trên tất cả các trình soạn thảo. [https://phabricator.wikimedia.org/T399673][https://phabricator.wikimedia.org/T419332] * Các công cụ và bot truy cập vào [[mw:Special:MyLanguage/Notifications/API|API Thông báo]] (<bdi lang="zxx" dir="ltr"><code><nowiki>action=query&meta=notifications</nowiki></code></bdi>) sẽ cần phải cập nhật quyền OAuth hoặc BotPassword của mình để bao gồm cả quyền truy cập vào các thông báo riêng tư. [https://phabricator.wikimedia.org/T421991] * Do việc nâng cấp thư viện, việc liệt kê danh sách trên các trang thể loại có thể hiển thị không đúng theo thứ tự bắt đầu từ thứ Hai, ngày 20 tháng 4. Một kịch bản chuyển đổi sẽ được chạy để khắc phục điều này, và sẽ mất từ ​​vài giờ đến vài ngày tùy thuộc vào kích thước của wiki (tối đa một tuần đối với Wikipedia tiếng Anh). [https://phabricator.wikimedia.org/T422544] * [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.24|MediaWiki]] '''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/16|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-W16"/> <bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:19, ngày 13 tháng 4 năm 2026 (UTC) <!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30380527 --> == 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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/17|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-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]]&nbsp;• [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]]&nbsp;• [[m:Special:MyLanguage/Tech/News/2026/18|Biên dịch]]&nbsp;• [[m:Tech|Nhờ giúp đỡ]]&nbsp;• [[m:Talk:Tech/News|Phản hồi]]&nbsp;• [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].'' </div><section end="technews-2026-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("|", "&#124;")))) 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&mdash;" 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 "&#8592;&nbsp;" or direction == "next" and "&nbsp;&#8594;" 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, " &nbsp;&nbsp;&nbsp; ''" .. 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 "&nbsp;" 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 "&nbsp;" end local block = data.block and tostring(data.block):lower() or nil if not block or not block:match("^[spdf]$") then return "&nbsp;" end local symbol = get_element_symbol(data, atomic_number) local linked_symbol = symbol local display_name = "&nbsp;" 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;">&ZeroWidthSpace;</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%" | &nbsp;') 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&shy;gens') ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Chal&shy;co&shy;gens') ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Halo&shy;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("| &nbsp;") 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>&emsp;') 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>&emsp;') 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>&emsp;') 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 "&nbsp;" 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 "&nbsp;" end local block = data.block and tostring(data.block):lower() or nil if not block or not block:match("^[spdf]$") then return "&nbsp;" end local symbol = get_element_symbol(data, atomic_number) local linked_symbol = symbol local display_name = "&nbsp;" 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;">&ZeroWidthSpace;</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%" | &nbsp;') 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&shy;gens') ins('| style="background:var(--wikt-palette-lightergrey);color:inherit;" | Chal&shy;co&shy;gens') ins('| style="background:var(--wikt-palette-lightgrey);color:inherit;" | Halo&shy;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("| &nbsp;") 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>&emsp;') 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>&emsp;') 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>&emsp;') 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