Wiktionary
viwiktionary
https://vi.wiktionary.org/wiki/Wiktionary:Trang_Ch%C3%ADnh
MediaWiki 1.47.0-wmf.18
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
Wiktionary:Tin tức
4
644
2561567
2561070
2026-09-08T02:49:25Z
Hiyuune
50834
/* Tháng 9 năm 2026 */
2561567
wikitext
text/x-wiki
__NOTOC__
{{Lưu trữ|
{{*ym|year=2004–2009|month=no|base=Wiktionary:Tin tức}}
{{*ym|year=2010–2020|month=no|base=Wiktionary:Tin tức}}
{{*ym|year=2021–2023|month=no|base=Wiktionary:Tin tức}}
{{*ym|year=2024|month=no|base=Wiktionary:Tin tức}}
{{*ym|year=2025|month=no|base=Wiktionary:Tin tức}}
{{*ym|year=2026|month=no|base=Wiktionary:Tin tức}}
}}
Trang này dành cho '''tin tức về dự án''' [[Wiktionary]] tiếng Việt nói riêng hay về cộng đồng Wiktionary nói chung. Bạn có biết tin tức mới không? Mời bạn ghi ra đây!
Bạn có thể chọn nút theo dõi trang để cập nhật tin tức tại [[Đặc biệt:Danh sách theo dõi|Danh sách theo dõi]].<!-- Nếu bạn đang cộng thêm một ngày nữa, và nếu đã có năm ngày ở trang này rồi, xin bạn xoá mục cuối cùng và bỏ tin tức mới trên những mục đã có rồi. Rồi, xin bạn thêm tin tức mới vào trang lưu trữ cho tháng năm phù hợp. Cám ơn. -->
== Tháng 9 năm 2026 ==
=== Thứ ba, ngày 8 tháng 9 năm 2026 ===
* {{l|ine-ana-pro|*ʔésti}} trở thành mục từ tiếng Tiểu Á nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Chủ nhật, ngày 6 tháng 9 năm 2026 ===
* {{l|afa-pro|*waraḳ-}} trở thành mục từ tiếng Phi-Á nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Thứ tư, ngày 3 tháng 9 năm 2026 ===
* {{l|cau-drg-pro|*xin}} trở thành mục từ tiếng Dargwa nguyên thủy đầu tiên của Wiktionary tiếng Việt.
== Tháng 8 năm 2026 ==
=== Thứ hai, ngày 31 tháng 8 năm 2026 ===
* {{l|aoa|awa}} trở thành mục từ tiếng Angola đầu tiên của Wiktionary tiếng Việt.
* {{l|chm-pro|*ik}} trở thành mục từ tiếng Mari nguyên thủy đầu tiên của Wiktionary tiếng Việt.
* {{l|urj-mdv-pro|*tumə}} trở thành mục từ tiếng Mordvin nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Chủ nhật, ngày 30 tháng 8 năm 2026 ===
* {{l|ghc|adhaigh}} trở thành mục từ tiếng Gael cổ điển đầu tiên của Wiktionary tiếng Việt.
=== Thứ bảy, ngày 29 tháng 8 năm 2026 ===
* [[kani]] đồng thời trở thành mục từ đầu tiên của các ngôn ngữ: Culli và Maia.
* {{l|ngf-pro|*imbi}} trở thành mục từ tiếng Liên New Guinea nguyên thủy đầu tiên của Wiktionary tiếng Việt.
* {{l|agm|kaatɨ-́há}} trở thành mục từ tiếng Angaataha đầu tiên của Wiktionary tiếng Việt.
=== Thứ tư, ngày 26 tháng 8 năm 2026 ===
* {{l|vls|bieë}} trở thành mục từ tiếng Flemish Tây đầu tiên của Wiktionary tiếng Việt.
=== Thứ hai, ngày 24 tháng 8 năm 2026 ===
* {{l|sdc|rui}} trở thành mục từ tiếng Sassari đầu tiên của Wiktionary tiếng Việt.
=== Chủ nhật, ngày 23 tháng 8 năm 2026 ===
* {{l|mis-xbi|啊干|tr=*aqa(n)}} trở thành mục từ tiếng Tiên Ti đầu tiên của Wiktionary tiếng Việt.
=== Chủ nhật, ngày 2 tháng 8 năm 2026 ===
* {{l|iro-nor-pro|*-nõhs-}} trở thành mục từ tiếng Bắc Iroquois nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Thứ hai, ngày 3 tháng 8 năm 2026 ===
* {{l|sem-wes-pro|*baḥr-}} trở thành mục từ tiếng Semit Tây nguyên thủy đầu tiên của Wiktionary tiếng Việt.
* {{l|qfa-cka-pro|*'iməl}} trở thành mục từ tiếng Chukotka-Kamchatka nguyên thủy đầu tiên của Wiktionary tiếng Việt.
* {{l|aql-pro|*le·kʔawe}} trở thành mục từ tiếng Algic nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Thứ ba, ngày 4 tháng 8 năm 2026 ===
* {{l|owl|carrecc}} trở thành mục từ tiếng Wales cổ đầu tiên của Wiktionary tiếng Việt.
=== Thứ tư, ngày 5 tháng 8 năm 2026 ===
* {{l|grk-pro|*pʰernā́}} trở thành mục từ tiếng Hellen nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Thứ năm, ngày 6 tháng 8 năm 2026 ===
* {{l|tfn|esbay}} trở thành mục từ tiếng Dena'ina đầu tiên của Wiktionary tiếng Việt.
* {{l|gmq-mno|dammr}} trở thành mục từ tiếng Na Uy trung đại đầu tiên của Wiktionary tiếng Việt.
* {{l|tbq-lob-pro|*b-ləy²}} trở thành mục từ tiếng Lô Lô-Miến nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Thứ sáu, ngày 7 tháng 8 năm 2026 ===
* {{l|smw|asu}} đồng thời trở thành mục từ đầu tiên của các ngôn ngữ: Sumbawa và Alune.
=== Thứ ba, ngày 11 tháng 8 năm 2026 ===
* {{l|cau-nec-pro|*u̯aran}} trở thành mục từ tiếng Đông Bắc Kavkaz nguyên thủy đầu tiên của Wiktionary tiếng Việt.
=== Thứ năm, ngày 13 tháng 8 năm 2026 ===
* {{l|mge|Ɔ̰}} trở thành mục từ tiếng Mango đầu tiên của Wiktionary tiếng Việt.
== Xem thêm ==
*[[Thành viên:WikimediaNotifier/notifications|Thời sự Wikimedia]]
*[[m:Tin tức về Wikimedia|Tin tức Wikimedia]]
[[Thể loại:Tin tức Wiktionary| ]]
[[Thể loại:Cộng đồng Wiktionary|{{PAGENAME}}]]
3xnocedechu2gih9xkz318ug6vmu4xq
chọn
0
30742
2561555
2415580
2026-09-08T01:31:18Z
~2026-48600-66
61881
2561555
wikitext
text/x-wiki
{{-vie-}}
{{-pron-}}
{{vi-pron|chọn}}
{{-nôm-}}
{{đầu}}
*[[撰]]: [[soạn]], [[toán]], [[soảng]], [[dốn]], [[soạng]], [[chọn]], [[tuyển]], [[rộn]], [[dọn]], [[chộn]]
*[[掄]]: [[chọn]], [[luân]], [[luồn]], [[dọn]]
{{mid}}
*[[論]]: [[luận]], [[lấn]], [[gọn]], [[trọn]m
Mimiùn], [[lẩn]], [[lòn]], [[trộn]], [[lọn]], [[giọn]], [[chọn]], [[lốn]], [[luồn]], [[lộn]], [[lụn]], [[tròn]]
*[[𫾗]]: [[chọn]]
{{cuối}}
{{-paro-}}
:* [[chồn]]
:* [[chôn]]
:* [[chốn]]
{{-verb-}}
'''chọn'''
# [[xem xét|Xem xét]], [[so sánh]] để [ra[lấy]] [[cái]] [[hợp]] [[yêu cầu]] trong nhiều [[cái]] cùng [[loại]].
#: '''''Chọn''' nghề.''
#: '''''Chọn''' giống.''
#: '''''Chọn''' bạn mà chơi.''
{{-ref-}}
{{R:FVDP}}
{{R:WinVNKey:Lê Sơn Thanh}}
[[Thể loại:Động từ tiếng kiêuj ừ Việt]]
ieek31t4xafxhuqb86fcp2itqj1czze
2561558
2561555
2026-09-08T02:04:35Z
Higashizakura
36666
Đã lùi lại sửa đổi của [[Special:Contributions/~2026-48600-66|~2026-48600-66]] ([[User talk:~2026-48600-66|thảo luận]]) quay về phiên bản cuối của [[User:BlueShurikenNinjaBot|BlueShurikenNinjaBot]]
2415580
wikitext
text/x-wiki
{{-vie-}}
{{-pron-}}
{{vi-pron|chọn}}
{{-nôm-}}
{{đầu}}
*[[撰]]: [[soạn]], [[toán]], [[soảng]], [[dốn]], [[soạng]], [[chọn]], [[tuyển]], [[rộn]], [[dọn]], [[chộn]]
*[[掄]]: [[chọn]], [[luân]], [[luồn]], [[dọn]]
{{mid}}
*[[論]]: [[luận]], [[lấn]], [[gọn]], [[trọn]], [[lẩn]], [[lòn]], [[trộn]], [[lọn]], [[giọn]], [[chọn]], [[lốn]], [[luồn]], [[lộn]], [[lụn]], [[tròn]]
*[[𫾗]]: [[chọn]]
{{cuối}}
{{-paro-}}
:* [[chồn]]
:* [[chôn]]
:* [[chốn]]
{{-verb-}}
'''chọn'''
# [[xem xét|Xem xét]], [[so sánh]] để [[lấy]] [[cái]] [[hợp]] [[yêu cầu]] trong nhiều [[cái]] cùng [[loại]].
#: '''''Chọn''' nghề.''
#: '''''Chọn''' giống.''
#: '''''Chọn''' bạn mà chơi.''
{{-ref-}}
{{R:FVDP}}
{{R:WinVNKey:Lê Sơn Thanh}}
[[Thể loại:Động từ tiếng Việt]]
f6lcosthau5j6xly5px9mbh11p0w8yf
déréliction
0
43749
2561544
2518416
2026-09-08T01:05:00Z
Hiyuune
50834
2561544
wikitext
text/x-wiki
=={{langname|fr}}==
==={{section|etym}}===
{{ety|fr|:bor|la:dērelictiō<alt:dērelictiōnem>}}
{{bor+|fr|la|dērelictiō|dērelictiōnem}}.
==={{section|pron}}===
* {{fr-IPA}}
* {{audio|fr|LL-Q150 (fra)-WikiLucas00-déréliction.wav|a=<<Lyon>>}}
==={{section|n}}===
{{fr-noun|f|-,+}}
# {{lb|fr|literary}} Sự [[chơ vơ]] [[cô quạnh]] (về mặt tinh thần).
==={{section|ref}}===
* {{R:FVDP|db=ev}}
==={{section|further}}===
* {{R:fr:TLFi}}
3yasf6tf19q9yqzfkkd59bjrcurtv7v
bẩn
0
91888
2561574
2415341
2026-09-08T05:28:16Z
Hiyuune
50834
2561574
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "ban"}}
=={{langname|vi}}==
==={{ĐM|alt}}===
* {{alt|vi|bửn}}
==={{ĐM|etym}}===
{{rfe|vi}}
==={{ĐM|pron}}===
{{vi-IPA}}
* {{audio|vi|LL-Q9199 (vie)-Jessica Nguyen (Pamputt)-bẩn.wav|a=Ho Chi Minh City}}
==={{ĐM|adj}}===
{{vi-adj|[[𪷪]], [[𬇸]], [[𬉂]]}}
# {{lb|vi|northern Vietnam}} Có nhiều [[bụi bặm]], [[rác rưởi]], [[cáu ghét]] hoặc bị [[hoen ố]]; trái với [[sạch]].
#: {{ux|vi|Tay '''bẩn'''.}}
#: {{ux|vi|Dây mực làm '''bẩn''' vở.}}
#: {{ux|vi|Ở '''bẩn'''.}}
#: {{ux|vi|Nhà cửa ngổn ngang, trông '''bẩn''' mắt.}}
# {{lb|vi|northern Vietnam|colloquial}} [[xấu xa|Xấu xa]], [[tồi tệ]] đến mức đáng [[khinh]].
#: {{ux|vi|Người giàu tính '''bẩn'''.}}
#: {{ux|vi|Con người '''bẩn''' bụng.}}
# {{lb|vi|central Vietnam}} [[keo kiệt|Keo kiệt]]; [[bủn xỉn]], [[hà tiện]].
===={{ĐM|drv}}====
{{col|vi
|bẩn thỉu
|bẩn mình
|dơ bẩn
|nhơ bẩn
|xiên bẩn
|bẩn bựa
|ăn bẩn sống lâu
|bẩn tưởi
|tư bẩn
}}
==={{ĐM|nôm}}===
{{col|vi|title=chữ Nôm|鬂<t:mấn, bấn, bẩn>|泍<t:bẩn>|𠄯<t:bần, bẩn>|泮<t:bạn, bận, bợn, bẩn, phán>|𣵲<t:cạn, gạn, cợn, bợn, bẩn>|瀵<t:phấn, bẩn>}}
==={{ĐM|ref}}===
* {{R:FVDP}}
* {{R:WinVNKey:Lê Sơn Thanh}}
51srf8sdmvas3qf0gjhd502kke5wqbf
Thảo luận Wiktionary:Thảo luận
5
103987
2561532
2559895
2026-09-07T18:44:45Z
MediaWiki message delivery
19980
Mục mới: /* Bản tin Kỹ thuật: Tuần 37-2026 */
2561532
wikitext
text/x-wiki
<!-- Xin bắt đầu cuộc thảo luận mói ở CUỐI trang! Cám ơn. -->
{{Lưu trữ}}
== Upcoming Dark Mode user interface rollout for anonymous Wikimedia sites users ==
<div lang="en" dir="ltr">
{{int:Hello}} Wikimedians,
Apologies if this message is not in your language. {{int:please-translate}}.
The [[mw:Special:MyLanguage/Reading/Web|Reader Experience team]] will launch the Dark mode feature for anonymous users on all Wikimedia sites, including yours, on October 29, 2025.
[[:en:Special:MyLanguage/Light-on-dark color scheme|Dark mode]] is an option that allows users to view pages in light-coloured text, and icons on a dark background. Once it is available for anonymous users, they can enable it when using various devices. More information on ways to enable it can be found on [[:en:Special:MyLanguage/Wikipedia:Dark mode#Options for anyone|this page]].
Given many pages are still not compatible with dark mode this will be an opt-in feature and not automatically apply to pages.
Dark mode requires modifications to content pages and templates, and since our initial launch [https://diff.wikimedia.org/2024/07/17/dark-modes-bright-future-how-dark-mode-will-transform-wikipedias-accessibility/ in July 2024], we have been working with communities and helping them prepare for dark mode. Before the rollout, it is essential that template authors and technical contributors test dark mode and read [[mw:Special:MyLanguage/Reading/Web/Accessibility for reading/Updates/2024-04|this page]] to learn how to make pages Dark mode-ready and address any compatibility issues found in templates.
We will fix most color compatibility issues only on the most-viewed pages on projects with over 5 million monthly page views. Technical contributors with an account should opt into dark mode currently using preferences or settings and test pages and seek help before the release to ensure everything complies before the enablement.
If you have any questions or need help, please [[mw:Special:MyLanguage/Talk:Reading/Web/Accessibility for reading#|contact the Reader Experience team]] for support.
Thank you!
</div>
<bdi lang="en" dir="ltr">[[User:UOzurumba (WMF)|UOzurumba (WMF)]]</bdi> 02:08, ngày 30 tháng 9 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=User:UOzurumba_(WMF)/sandbox_Dark_mode_deployment_mass_message_list_(October_2025)&oldid=29358561 -->
== Bản tin Kỹ thuật: Tuần 41-2025 ==
<section begin="technews-2025-W41"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/41|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* [[mw:Special:MyLanguage/Help:Edit check#paste|Kiểm tra Nội dung Dán (Paste Check)]] là một tính năng Kiểm tra Sửa đổi mới để giúp phòng tránh và chống lại các hành vi vi phạm bản quyền. Khi biên tập viên dán văn bản vào bài viết, Kiểm tra Nội dung Dán sẽ nhắc họ xác nhận nguồn gốc và giấy phép của nội dung được dán đó. Bắt đầu từ thứ 4, ngày 8 tháng 10, [[phab:T403680|22 wiki sẽ thử nghiệm tính năng Kiểm tra Nội dung Dán]]. Kiểm tra Nội dung Dán sẽ giúp các tình nguyện viên mới hiểu và tuân theo các quy định và hướng dẫn cần thiết để thực hiện những đóng góp mang tính xây dựng cho các dự án Wikipedia.
'''Cập nhật cho biên tập viên'''
* Các thiết bị di động sẽ hiển thị các bài viết trên trang di động trực tiếp trên tên miền chuẩn (như <code>en.wikipedia.org</code>), thay vì thông qua việc đổi hướng tới tên miền "m" (như <code>en.m.wikipedia.org</code>). Thay đổi này nhằm cải thiện hiệu năng. Nó sẽ được kích hoạt trên các trang Wikipedia trong tuần này. Liên kết URL di động và tùy chọn "Phiên bản máy tính" vẫn sẽ tiếp tục khả dụng. [[mw:Requests for comment/Mobile domain sunsetting/2025 Announcement|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T214998]
* [[mw:Special:MyLanguage/Help:CirrusSearch#creationdate and lasteditdate|Bộ lọc ngày]] mới, <code dir=ltr>creationdate:</code> và <code dir=ltr>lasteditdate:</code>, nay có sẵn trong bộ máy tìm kiếm của wiki. Những bộ lọc này cho phép người dùng lọc kết quả tìm kiếm theo bản sửa đổi đầu tiên hoặc cuối cùng của trang. Bộ lọc hỗ trợ các toán tử so sánh (v.d. <code dir=ltr>>2024</code>) và ngày dạng tương đối (v.d. <code dir=ltr>today-1d</code>), giúp việc tìm nội dung hoặc trang được cập nhật gần đây trong khoảng năm cụ thể trở nên dễ dàng hơn. [https://phabricator.wikimedia.org/T403593]
* [[f:|Wikifunctions]] nay hỗ trợ văn bản giàu tính chất (rich text) trong lời gọi hàm nhúng trên 150 wiki đã kích hoạt nó. Để giới thiệu tính năng này, nhóm đã tạo [[f:Z26333|bảng biến cách tiếng Latin]] mà biên tập viên Wiktionary có thể sử dụng để tự động tạo ra các dạng danh từ, nhằm tạo ra những kết quả rõ ràng và được định dạng — xem một [[f:Wikifunctions:Embedded function calls/Wiktionary tables demonstration|ví dụ đầu ra]] cụ thể. Nếu bạn cần hỗ trợ hay có bất kỳ phản hồi nào, vui lòng [[f:Wikifunctions:Project chat|liên hệ nhóm Wikifunctions]]. [https://phabricator.wikimedia.org/T397402]
* Một liên kết sửa đổi nay sẽ hiển thị trong hộp thể loại trên các trang bài viết đối với người dùng đã đăng nhập, khi nhấn vào sẽ khởi động trực tiếp hộp thoại thể loại bằng Trình Soạn thảo Trực quan (VisualEditor). [https://phabricator.wikimedia.org/T291691]
* [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:34}} {{PLURAL:34|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, tuần trước đã có vấn đề khi tải các tập tin pdf và hiện nó đã được giải quyết. [https://phabricator.wikimedia.org/T405957]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Trường <code dir=ltr>rev_sha1</code> trong bảng cơ sở dữ liệu bản sửa đổi đang chuẩn bị được loại bỏ để thay thế bằng trường <code dir=ltr>content_sha1</code> trong bảng cơ sở dữ liệu nội dung. Xem [https://lists.wikimedia.org/hyperkitty/list/cloud@lists.wikimedia.org/thread/2D2M3SP4WHR6BXXKTZ2PBLZQYR3EGQVR/ thông báo này] để biết thêm thông tin.
* [[mw:Special:MyLanguage/Reading/Web|Nhóm Trải nghiệm Người đọc]] sẽ triển khai giao diện người dùng [[w:en:Light-on-dark color scheme|Chế độ Tối]] trên tất cả các trang Wikimedia vào ngày 29 tháng 10 năm 2025. Tất cả thành viên vô danh trên các trang Wikimedia sẽ có tùy chọn kích hoạt bảng màu có văn bản màu sáng trên nền tối. Chế độ này được thiết kế để cung cấp trải nghiệm đọc thoải mái hơn, đặc biệt trong những trường hợp thiếu sáng. Tác giả bản mẫu và biên tập viên kỹ thuật được khuyến khích [[mw:Special:MyLanguage/Reading/Web/Accessibility for reading/Updates/2024-04|tìm hiểu cách chuẩn bị các trang để tương thích với Chế độ tối]] và giải quyết bất kỳ vấn đề tương thích nào xuất hiện trong các bản mẫu trên wiki của họ trước thời điểm kích hoạt. Vui lòng liên hệ nhóm Web nếu có bất kỳ câu hỏi hay cần sự trợ giúp nào trên [[mw:Talk:Reading/Web/Accessibility for reading#|trang thảo luận này]] trước ngày kích hoạt. [https://phabricator.wikimedia.org/T395628]
* Bắt đầu từ thứ 2, ngày 6 tháng 10, các điểm cuối API theo đường dẫn <code>rest.php</code> sẽ được định tuyến lại qua Cổng API nội bộ mới. Mỗi wiki sẽ được cập nhật dựa trên các nhóm phát hành tiêu chuẩn, với tổng lưu lượng truy cập tăng dần theo thời gian. Thay đổi này dự kiến không gây ra bất kỳ sự gián đoạn gì. Nếu phát hiện thấy có bất kỳ vấn đề nào, vui lòng tạo tác vụ Phabricator gửi lên [[phab:tag/serviceops/|bảng của nhóm Vận hành Dịch vụ]]. [https://phabricator.wikimedia.org/T400130]
* [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.22|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/41|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W41"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:23, ngày 6 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29400897 -->
== <span lang="en" dir="ltr">Have your say: vote for the 2025 Board of Trustees</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Hello all,
The voting period for the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025|2025 Board of Trustees election]] is now open. Candidates are running for two (2) seats on the Board.
To check your voter eligibility, please visit the [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Voter eligibility guidelines|voter eligibility page]].
Learn more about them by [[m:Special:MyLanguage/Wikimedia Foundation elections/2025/Candidates|reading their application statements and watch their candidacy videos]].
When you are ready, go to the [[m:Special:SecurePoll/vote/405|SecurePoll voting page to vote]].
'''The vote is open from October 8 at 00:00 UTC to October 22 at 23:59 UTC.'''
Best regards,
Abhishek Suryawanshi<br />Chair, Elections Committee<section end="announcement-content" />
</div>
[[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 04:49, ngày 9 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:RamzyM (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29360896 -->
== Bản tin Kỹ thuật: Tuần 42-2025 ==
<section begin="technews-2025-W42"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/42|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Tuần trước, chúng tôi đã tiến hành triển khai những cải tiến về các tính năng bảo mật tài khoản và xác thực hai yếu tố (2FA) trên tất cả các wiki. Những thay đổi đó bao gồm cải tiến giao diện người dùng cho trang [https://auth.wikimedia.org/metawiki/wiki/Special:AccountSecurity Đặc biệt:Bảo mật tài khoản], hỗ trợ nhiều phương thức xác thực 2FA thông qua các ứng dụng xác thực và khóa bảo mật di động (trước đây người dùng chỉ có thể kích hoạt một phương thức xác thực), và mô đun Mã Khôi phục mới giúp giảm thiểu tình trạng khóa tài khoản do mất ứng dụng và thiết bị xác thực hai yếu tố. Là một phần của dự án [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]], quá trình này sẽ tiếp tục trong phần còn lại của năm 2025 để cải thiện nhiều hơn trải nghiệm người dùng, cùng việc thêm hỗ trợ cho mã khóa làm phương thức xác thực thứ hai thay thế.
'''Cập nhật cho biên tập viên'''
* Một phần khác của dự án Bảo mật tài khoản là cung cấp 2FA cho tất cả người dùng. Bên cạnh biên tập viên có quyền nâng cao, chẳng hạn như bảo quản viên và hành chính viên, 40% biên tập viên nay có quyền truy cập vào 2FA. Bạn có thể kiểm tra xem bạn có quyền truy cập đó không tại [https://auth.wikimedia.org/metawiki/wiki/Special:AccountSecurity Đặc biệt: Bảo mật tài khoản]. Hướng dẫn kích hoạt có trên trang được liên kết theo. Kế hoạch là tiếp tục tăng cường tính khả dụng nếu xác định rằng khả năng hỗ trợ người dùng có thể hỗ trợ việc sử dụng toàn cục của nó. [https://phabricator.wikimedia.org/T400579]
* Tuần này, người dùng trên các wiki mà mặc định đã có sẵn tính năng [[mw:Special:MyLanguage/Talk pages project/Usability|Cải tiến Khả năng Sử dụng]] trên trang thảo luận (tất cả ''trừ'' 12 wiki được liệt kê trong tác vụ [[phab:T379264|T379264]]) sẽ có được khả năng gửi lời cảm ơn bình luận trực tiếp trên trang thảo luận mà nó xuất hiện. Trước thay đổi này, việc cảm ơn chỉ có thể được thực hiện bằng cách truy cập lịch sử sửa đổi của trang thảo luận. Bạn có thể [[diffblog:2025/10/13/revolutionizing-gratitude-a-new-era-of-thanking-comments/|tìm hiểu thêm về thay đổi này]]. [https://phabricator.wikimedia.org/T366095]
* Người dùng chưa [[Special:Preferences#mw-prefsection-personal-email|xác thực địa chỉ email của mình]] sẽ sớm nhận thông báo hàng tháng nhắc họ làm điều này. Điều này là bởi vì người dùng đã xác thực email của họ có thể dễ dàng khôi phục tài khoản của mình hơn. Những lời nhắc này sẽ không được gửi nếu người dùng không hoạt động hoặc đã loại bỏ email chưa được xác thực khỏi tài khoản của mình. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Email_confirmation][https://phabricator.wikimedia.org/T58074]
* [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, đã có một bản sửa lỗi nhằm giải quyết một lỗi thỉnh thoảng xảy ra khi lưu các đoạn đã được dịch trong công cụ Dịch Nội dung, cùng với đó các thông báo lỗi có liên quan giờ dễ nhìn hơn. [https://phabricator.wikimedia.org/T376531]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Nhóm Công cụ Không được Hỗ trợ đã chọn [[c:Special:MyLanguage/Commons:Video2commons|Video2Commons]] làm công cụ đầu tiên cho chu kỳ thí điểm của họ. Nhóm sẽ tìm hiểu cách để cải tiến và duy trì công cụ này trong những tháng tiếp theo. [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|Tìm hiểu thêm trên Meta]].
* [[File:Octicons-sync.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.23|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/42|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W42"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:59, ngày 13 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29434481 -->
== <span lang="en" dir="ltr">Help us decide the name of the new Abstract Wikipedia project</span> ==
<div lang="en" dir="ltr">
<section begin="function1"/>
{{int:Hello}}. Please help pick a name for the new Abstract Wikipedia wiki project. This project will be a wiki that will enable users to combine functions from [[:f:|Wikifunctions]] and data from Wikidata in order to generate natural language sentences in any supported languages. These sentences can then be used by any Wikipedia (or elsewhere).
There will be two rounds of voting, each followed by legal review of candidates, with votes beginning on 20 October and 17 November 2025. Our goal is to have a final project name selected on mid-December 2025. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki.
{{Int:Feedback-thanks-title}}
<section end="function1"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 11:44, ngày 20 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:Sannita (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29432175 -->
== Bản tin Kỹ thuật: Tuần 43-2025 ==
<section begin="technews-2025-W43"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/43|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Để tối ưu hóa cách dữ liệu người dùng được lưu trong cơ sở dữ liệu của chúng tôi, các tùy chọn được lưu của người dùng chưa đăng nhập trong vòng hơn 5 năm và có ít hơn 100 sửa đổi sẽ bị xóa. Khi những người dùng đó quay lại, tùy chọn mặc định sẽ được áp dụng. [https://phabricator.wikimedia.org/T406724]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:20}} {{PLURAL:20|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, đã có một liên kết hỏng từ thông điệp giao diện Đóng góp toàn cục đến trang Đóng góp toàn cục trên XTools mà hiện đã được giải quyết. [https://phabricator.wikimedia.org/T406415]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Việc định tuyến lại toàn bộ lưu lượng đến các điểm cuối API theo cổng <code dir=ltr><nowiki>rest.php</nowiki></code> thông qua một cổng API chung hiện đã hoàn tất. Nếu phát hiện bất kỳ vấn đề nào, vui lòng gửi tác vụ phabricator lên [[phab:tag/serviceops/|bảng tác vụ của nhóm Vận hành Dịch vụ]].
* Các sửa đổi đối với chú thích hoặc từ hạn định Wikidata nay sẽ ít hiển thị thường xuyên hơn trên các mục Thay đổi gần đây và Danh sách theo dõi trên các wiki khác, nhằm giảm bớt các thông báo không cần thiết. Thay đổi này sẽ giảm tổng số lượng các khoản mục 'gây nhiễu'. Bản thân các trang Wikidata sẽ không có sự thay đổi nào. [https://phabricator.wikimedia.org/T401290]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.24|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/43|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W43"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:36, ngày 20 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29478670 -->
== Bản tin Kỹ thuật: Tuần 44-2025 ==
<section begin="technews-2025-W44"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/44|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Ứng dụng Wikipedia dành cho iOS đã ra mắt thử nghiệm A/B/C nhằm cải tiến tính năng duyệt theo thẻ cho một số khu vực và ngôn ngữ nhất định. Thử nghiệm mang tên “Nhiều thẻ động hơn” này sẽ khám phá trải nghiệm trên thẻ mới cùng với việc bổ sung đề xuất bài viết ở mục “Bạn có biết” và “Vì bạn đã đọc”. Bạn có thể [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/Tabbed Browsing (Tabs)/New Tab Experience and Recommendations Experiment|đọc thêm thông tin trên trang dự án này]].
* Thành viên tự xác nhận trên các wiki [[gitiles:operations/mediawiki-config/+/a2d2aaab9ace84280dd2f4c70a33bb69cd73850f/dblists/small.dblist|nhỏ]] và [[gitiles:operations/mediawiki-config/+/a2d2aaab9ace84280dd2f4c70a33bb69cd73850f/dblists/medium.dblist|vừa]] đã triển khai phần mở rộng CampaignEvents nay có thể sử dụng công cụ [[m:Special:MyLanguage/Event Center/Registration|Đăng ký Sự kiện]] mà không cần quyền Người tổ chức Sự kiện. Tính năng này cho phép người tổ chức kích hoạt việc đăng ký, quản lý người tham gia, và cho phép các thành viên đăng ký chỉ với một cú nhấp chuột thay vì phải ký vào trang sự kiện.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:31}} {{PLURAL:31|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề về màu sắc nhấp nháy khi giữ hoặc nhấn phím mũi tên trong phần cài đặt chế độ tối của giao diện Vector 2022 nay đã được giải quyết. [https://phabricator.wikimedia.org/T402285]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Phần mở rộng CampaignEvents sẽ được triển khai trên tất cả những wiki còn lại trong tuần từ ngày 17 tháng 11 năm 2025. Phần mở rộng này hiện bao gồm ba tính năng: Đăng ký Sự kiện, Danh sách Cộng tác, và Danh sách Mời. Trong đợt triển khai này, Danh sách Lời mời sẽ không được kích hoạt cho Wikifunctions và MediaWiki cho đến khi những cộng đồng này yêu cầu kích hoạt. [[m:Special:MyLanguage/CampaignEvents/Deployment status|Truy cập trang thông tin triển khai để biết thêm thông tin]].
* Trải nghiệm chỗ thử REST dựa trên SwaggerUI nay đã có mặt trên tất cả các dự án wiki. Chỗ thử này có thể truy cập được thông qua trang [[{{#special:RestSandbox}}]]. Vui lòng báo cáo bất kỳ vấn đề nào lên bảng tin của nhóm Giao diện MediaWiki, hoặc tham gia thảo luận trên trang [[mw:Special:MyLanguage/MediaWiki Interfaces Team/Feature Feedback/REST Sandbox|khởi động dự án]] này. [https://phabricator.wikimedia.org/project/board/6931/]
* Những điểm cuối chuyển đổi với đường dẫn kết thúc bằng dấu gạch chéo trong REST API của MediaWiki hiện đang được đánh dấu là lỗi thời. Chúng vẫn sẽ tiếp tục hoạt động trong thời gian này, tuy nhiên dự kiến chúng sẽ bị loại bỏ vào cuối tháng 1 năm 2026. Toàn bộ người dùng API đang gọi chúng được khuyến khích chuyển sang bản đường dẫn không kết thúc bằng dấu gạch chéo. Cả hai biến thể điểm cuối này đều có thể tìm thấy và thử được sử dụng [https://test.wikipedia.org/w/index.php?api=mw-extra&title=Special%3ARestSandbox Chỗ thử REST]. Xem trang [[mw:API/Deprecation|Ngừng hỗ trợ với REST API MediaWiki]] để biết thêm thông tin chi tiết về các chính sách và thủ tục trong việc ngừng hỗ trợ API.
* [[mw:API:REST API/Changelog|Nhật trình thay đổi chuyên biệt nay đã có sẵn cho REST API của MediaWiki]]. Nhật trình thay đổi này cung cấp tổng quan về những thay đổi này, giúp các nhà phát triển dễ dàng theo dõi những cải tiến và lần lặp lại của chúng. Mọi thông báo cũng sẽ tiếp tục được gửi thông qua các kênh truyền thông chính, bao gồm Bản tin Kỹ thuật và danh sách phân phối qua thư điện tử, nhưng nay có thể dễ dàng tham khảo hơn từ một vị trí trung tâm. Nếu bạn có bất kỳ phản hồi nào về định dạng, cấu trúc, hoặc nội dung về nhật trình thay đổi này, vui lòng [[mw:API talk:REST API/Changelog|tham gia thảo luận tại đây]].
* Bảo quản viên nay có thể xóa thể loại theo dõi mà trước đây được thêm bởi phần mở rộng JsonConfig, do nó không còn được sử dụng. Xem các thể loại được liên kết từ [[d:Q130635582#sitelinks-wikipedia|Q130635582]]. Việc vẫn còn trang được liệt kê trên thể loại này là bình thường vì nó chỉ là vấn đề về bộ nhớ đệm, và chúng sẽ tự động được xóa khi các trang đó được sửa đổi trong lần tiếp theo. [https://phabricator.wikimedia.org/T378352]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.25|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/44|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W44"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:31, ngày 27 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29513638 -->
== <span lang="en" dir="ltr">Seeking volunteers to join several of the movement’s committees</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Each year, typically from October through December, several of the movement’s committees seek new volunteers.
Read more about the committees on their Meta-wiki pages:
* [[m:Special:MyLanguage/Affiliations Committee|Affiliations Committee (AffCom)]]
* [[m:Special:MyLanguage/Ombuds commission|Ombuds commission (OC)]]
* [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Community Resilience and Sustainability/Trust and Safety/Case Review Committee|Case Review Committee (CRC)]]
Applications for the committees open on October 30, 2025. Applications for the Affiliations Committee, Ombuds commission and the Case Review Committee close on December 11, 2025. Learn how to apply by [[m:Special:MyLanguage/Wikimedia Foundation/Legal/Committee appointments|visiting the appointment page on Meta-wiki]]. Post to the talk page or email cst[[File:At sign.svg|16x16px|link=|(_AT_)]]wikimedia.org with any questions you may have.
For the Committee Support team,
<section end="announcement-content" />
</div>
-[[m:User:MKaur (WMF)| MKaur (WMF)]] 14:14, ngày 30 tháng 10 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:MKaur (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29517125 -->
== Bản tin Kỹ thuật: Tuần 45-2025 ==
<section begin="technews-2025-W45"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/45|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Các bảo quản viên giờ đây sẽ thấy rằng [[{{#special:MergeHistory}}]] đã trở nên linh hoạt hơn đáng kể trong việc hợp nhất. Nó có thể hợp nhất các phần được lấy từ giữa lịch sử của trang nguồn (thay vì chỉ từ phần đầu), và chèn các phiên bản vào bất kỳ vị trí nào trong lịch sử của trang đích (thay vì chỉ ở phần đầu). [https://phabricator.wikimedia.org/T382958]
* Đối với những người dùng đã kích hoạt "{{int:discussiontools-preference-autotopicsub}}" [[Special:Preferences#mw-prefsection-editing|trong tùy chọn của họ]], việc bắt đầu một chủ đề mới hoặc thêm một phản hồi vào một chủ đề hiện có giờ đây sẽ tự động đăng ký họ theo dõi các phản hồi mới trong chủ đề đó. Trước đây, điều này chỉ xảy ra nếu người dùng sử dụng tiện ích "{{int:Skin-action-addsection}}" hoặc "{{int:Discussiontools-replybutton}}" của DiscussionTools. Khi DiscussionTools mới được ra mắt, các tài khoản hiện có không được tự động bật tính năng theo dõi chủ đề, vì vậy thay đổi này chủ yếu sẽ ảnh hưởng đến các tài khoản mới hơn và những người dùng đã chủ động thay đổi tùy chọn của mình kể từ thời điểm đó. [https://phabricator.wikimedia.org/T290778]
* Các mô đun Scribunto giờ đây có thể được dùng để [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#SVG library|tạo ảnh SVG]]. Tính năng này cho phép tạo biểu đồ, đồ họa và các hình minh họa khác một cách linh hoạt thông qua Lua, giúp giảm nhu cầu phải tạo chúng bên ngoài rồi tải lên dưới dạng tập tin. [https://phabricator.wikimedia.org/T405861]
* Các trang web của Wikimedia giờ đây sẽ cung cấp cho tất cả người dùng ẩn danh tùy chọn bật chế độ tối, với giao diện chữ sáng trên nền tối. Cải tiến này nhằm mang lại trải nghiệm đọc dễ chịu hơn, đặc biệt là trong môi trường thiếu sáng. [https://phabricator.wikimedia.org/T395628]
* Những người dùng có danh sách theo dõi lớn từ lâu đã gặp lỗi quá thời gian khi chỉnh sửa [[Special:EditWatchlist|Special:EditWatchlist]]. Trang này nay sẽ tải các mục theo từng phần nhỏ thay vì tải toàn bộ cùng lúc nhờ bản cập nhật phân trang, giúp mọi người có thể chỉnh sửa danh sách theo dõi mượt mà hơn. Trong quá trình cập nhật cơ sở dữ liệu, tính năng sắp xếp theo thời hạn đã bị loại bỏ vì chậm hơn hơn 100 lần so với sắp xếp theo tên trang. Một [https://meta.wikimedia.org/wiki/Community_Wishlist/W454 yêu cầu từ cộng đồng] đã được tạo để tìm các cách thay thế nhằm khôi phục tính năng sắp xếp theo thời hạn. Nếu bạn thấy tính năng này quan trọng, hãy ủng hộ yêu cầu đó! [https://phabricator.wikimedia.org/T41510]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:31}} {{PLURAL:31|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, việc khắc phục lỗi tô sáng vẫn còn hiển thị sau khi sử dụng tính năng tìm và thay thế của VisualEditor trong quá trình tìm kiếm. [https://phabricator.wikimedia.org/T407318]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Từ năm 2019, [[m:Special:MyLanguage/Wikimedia URL Shortener|Trình rút gọn URL của Wikimedia]] tại https://w.wiki đã có sẵn cho tất cả các wiki của Wikimedia để tạo liên kết ngắn đến bài viết, liên kết cố định, bản so sánh, v.v. Tính năng này có trong thanh bên với tên "Lấy URL rút gọn". Hiện có 30 wiki vẫn đang sử dụng tiện ích mở rộng cũ "ShortUrl". Tiện ích cũ này sẽ sớm bị gỡ bỏ. Điều này có nghĩa là các URL dạng <code>/s/</code> sẽ không còn được hiển thị dưới tiêu đề bài viết thông qua thẻ HTML <code dir=ltr>class="title-shortlink"</code>. Tuy nhiên, các URL dạng <code>/s/</code> vẫn sẽ tiếp tục hoạt động. [https://phabricator.wikimedia.org/T107188]
* Vào thứ Năm, ngày 30 tháng 10, các nhóm [[:mw:Special:MyLanguage/MediaWiki Interfaces Team|Giao diện MediaWiki]] và [[:mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|Vận hành Dịch vụ SRE]] đã bắt đầu chuyển hướng lưu lượng của Action API thông qua một cổng API chung. Các wiki riêng lẻ sẽ được cập nhật theo từng nhóm phát hành tiêu chuẩn, với tổng lưu lượng được tăng dần theo thời gian. Thay đổi này được kỳ vọng sẽ không gây ra lỗi hoặc gián đoạn. Nếu bạn phát hiện bất kỳ sự cố nào, vui lòng gửi báo cáo trên bảng [https://phabricator.wikimedia.org/tag/serviceops/ của nhóm Vận hành Dịch vụ].
* Việc triển khai MediaWiki Train sẽ tạm dừng trong hai tuần cuối cùng của năm 2025: ngày 22 và 29 tháng 12. Các khung thời gian backport cũng sẽ tạm ngưng từ thứ Hai, ngày 22 tháng 12 năm 2025 đến thứ Năm, ngày 2 tháng 1 năm 2026. "Backport window" là khoảng thời gian được lên lịch để bổ sung các nội dung như bản vá lỗi và thay đổi cấu hình. Hiện vẫn còn bảy đợt triển khai MediaWiki Train nữa trong năm 2025. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/SMWTEAES4SDLDUSK4HMWNBSKNCXZAWYN/]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.45/wmf.26|MediaWiki]]
'''Chuyên sâu'''
* Năm 2025, Quỹ Wikimedia báo cáo rằng các hệ thống AI và công cụ tìm kiếm ngày càng sử dụng nội dung từ Wikipedia mà không dẫn người dùng quay lại trang, góp phần khiến lượng lượt xem từ người dùng thực giảm 8% so với năm 2024. Sau khi phát hiện các bot giả dạng người dùng thật, Wikimedia đã cập nhật dữ liệu truy cập để phản ánh sự thay đổi này. Bạn có thể đọc thêm về xu hướng người dùng hiện nay trên Wikipedia trong [[diffblog:2025/10/17/new-user-trends-on-wikipedia/|bài viết trên blog Diff]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/45|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W45"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:34, ngày 3 tháng 11 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29552512 -->
== Bản tin Kỹ thuật: Tuần 46-2025 ==
<section begin="technews-2025-W46"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/46|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
[[File:Talk pages default look (April 2023).jpg|thumb|alt=Hình chụp những thay đổi về mặt trực quan được thực hiện trên trang thảo luận|Ví dụ về trang thảo luận với thiết kế mới, bằng tiếng Pháp.]]
* Kể từ ngày 12 tháng 11, người dùng sẽ nhận thấy sự thay đổi về [[m:Special:MyLanguage/Talk pages project/Feature summary#Usability improvements|giao diện của các trang thảo luận]] trên [[Phab:T379264|một số trang Wikipedia]]. Hầu hết [[phab:T392121|toàn bộ các wiki]] đã có được thay đổi về mặt thiết kế này; những thay đổi này sẽ được thực hiện sau trên [[phab:T409297|Wikipedia tiếng Anh]]. Bạn có thể đọc thêm [[diffblog:2024/05/02/making-talk-pages-better-for-everyone/|trên ''Diff'']]. Người dùng có thể chọn không thực hiện thay đổi này [[Special:Preferences#mw-prefsection-editing|trong tùy chọn người dùng của mình]] ở tùy chọn "{{int:discussiontools-preference-visualenhancements}}". [https://phabricator.wikimedia.org/T379264]
* MediaWiki nay có thể hiển thị [[mw:Special:MyLanguage/Help:Protection indicators|chỉ báo trên trang]] tự động khi một trang bị khóa. Tính năng này được tắt theo mặc định. Nó có thể được bật theo [[m:Special:MyLanguage/Requesting wiki configuration changes|yêu cầu của cộng đồng]]. [https://phabricator.wikimedia.org/T12347]
* Việc sử dụng các nút "{{int:showpreview}}" hoặc "{{int:showdiff}}" trong trình soạn thảo mã nguồn nay sẽ đi kèm một số tham số URL nhất định như '[[mw:Special:MyLanguage/Manual:Parameters to index.php#useskin|useskin]]', '[[mw:Special:MyLanguage/Manual:Parameters to index.php#uselang|uselang]]' và '[[mw:Special:MyLanguage/Help:Section#Editing sections|section]]'. Bản cập nhật này đồng thời cũng sửa một vấn đề mà, nếu trình duyệt bị sập khi đang xem trước sửa đổi một đề mục duy nhất, việc lưu sửa đổi này có thể ghi đè toàn bộ trang chỉ bằng nội dung của đề mục đó. [https://phabricator.wikimedia.org/T62744][https://phabricator.wikimedia.org/T24029][https://phabricator.wikimedia.org/T155097]
* Các wiki Wikivoyage có thể dùng [[mw:Special:MyLanguage/Help:Extension:Kartographer#Markers and counters|điểm đánh dấu bản đồ bằng màu trong nội dung văn bản của bài viết]]. Nội dung văn bản của những điểm đánh dấu đó nay sẽ được hiển thị bằng màu đen hoặc trắng tương phản, thay vì luôn luôn là màu trắng. Cộng đồng có thể loại bỏ các phương pháp giải quyết cục bộ cho vấn đề này. [https://phabricator.wikimedia.org/T369454]
* Tab Hoạt động trên ứng dụng Wikipedia dành cho Android nay có sẵn cho tất cả người dùng. Tab mới này cung cấp thông tin chuyên sâu được cá nhân hóa về hoạt động đọc, sửa đổi, và quyên góp, đồng thời đơn giản hóa việc điều hướng và giúp cho việc sử dụng ứng dụng trở nên hấp dẫn hơn. [https://www.mediawiki.org/wiki/Wikimedia_Apps/Team/Android/Activity_Tab_Experiment]
* Nhóm Phát triển Độc giả (Reader Growth) chuẩn bị khởi động thử nghiệm mang tên "Duyệt hình ảnh" để kiểm tra cách giúp người đọc dễ dàng duyệt và khám phá hình ảnh trên các bài viết Wikipedia hơn. Thử nghiệm này, một thử nghiệm A/B dành riêng cho thiết bị di động, sẽ bắt đầu được thực hiện vào tuần từ ngày 17 tháng 11 và sẽ kéo dài trong bốn tuần, ảnh hưởng đến 0,05% người dùng trên wiki tiếng Anh. Thử nghiệm này đã bắt đầu vào ngày 3 tháng 11 trên các wiki tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia và tiếng Việt, ảnh hưởng đến tối đa 10% người dùng trên những wiki này. [https://www.mediawiki.org/wiki/Readers/Reader_Growth/WE3.1.3_Image_Browsing]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:27}} {{PLURAL:27|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ như đã khắc phục việc không thể khóa tài khoản trên trang web dành cho di động. [https://phabricator.wikimedia.org/T256185]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[wikitech:Help talk:Toolforge/Toolforge standards committee#November 2025 committee nominations|Wikitech đang mở đề cử]] chọn thành viên mới của [[wikitech:Help:Toolforge/Toolforge standards committee|Ủy ban tiêu chuẩn của Toolforge]]. Ủy ban này giám sát [[wikitech:Help:Toolforge/Right to fork policy|Chính sách quyền sử dụng bản sao]] và [[wikitech:Help:Toolforge/Abandoned tool policy|Chính sách cho công cụ bị bỏ rơi]] của Toolforge cùng nhiều nhiệm vụ khác. Đề cử sẽ tiếp tục mở đến hết ngày 28 tháng 11 năm 2025.
* [[w:JSON Web Token#Standard fields|Trường bên cung cấp JWT]] trong [[mw:Special:MyLanguage/OAuth/For Developers#OAuth 2|mã truy cập OAuth 2]] dành cho [[m:Special:MyLanguage/Help:Unified login|wiki SUL]] (đăng nhập trung ương) đã được thay đổi thành <code><nowiki>https://meta.wikimedia.org</nowiki></code>. Các mã truy cập cũ vẫn sẽ hoạt động. [https://phabricator.wikimedia.org/T399199]
* [[w:JSON Web Token#Standard fields|Trường chủ đề JWT]] trong [[mw:Special:MyLanguage/OAuth/For Developers#OAuth 2|mã truy cập OAuth 2]] sẽ sớm thay đổi từ <code><user id></code> sang <code dir=ltr style="white-space:nowrap">mw:<identity type>:<user id></code>, trong đó <code><identity type></code> thường là <code dir=ltr>CentralAuth:</code><!-- not a typo --> (đối với [[m:Special:MyLanguage/Help:Unified login|wiki SUL]]) hoặc <code dir=ltr style="white-space:nowrap">local:<wiki id></code> (đối với các wiki khác). Điều này là nhằm tránh xung đột giữa các loại ID người dùng khác nhau, và để mã truy cập OAuth 2 và cookie <code>sessionJwt</code> trở nên giống nhau hơn. Các mã truy cập cũ vẫn sẽ hoạt động. [https://phabricator.wikimedia.org/T399199]
* Các thông điệp cấm của MediaWiki ([[MediaWiki:Blockedtext|blockedtext]], [[MediaWiki:Blockedtext-partial|blockedtext-partial]], [[MediaWiki:Autoblockedtext|autoblockedtext]], [[MediaWiki:Systemblockedtext|systemblockedtext]], [[MediaWiki:Blockedtext-tempuser|blockedtext-tempuser]], [[MediaWiki:Autoblockedtext-tempuser|autoblockedtext-tempuser]]) nay hỗ trợ thêm các tham số bổ sung nhằm chỉ ra xem người dùng đó có bị cấm sửa đổi trang thảo luận của mình <code><nowiki>$9</nowiki></code> hoặc gửi thư điện tử cho người dùng khác <code><nowiki>$</nowiki><nowiki>10</nowiki></code> hay không. [https://phabricator.wikimedia.org/T285612]
* Nhánh <code>REL1_45</code> cho lõi MediaWiki và từng phần mở rộng cùng giao diện trong git của Wikimedia đã được tạo. Đây là bước đầu tiên trong quá trình phát hành phiên bản MediaWiki 1.45.0, được lên kế hoạch triển khai vào cuối tháng 11 năm 2025. Nếu bạn đang thực hiện việc khắc phục lỗi nghiêm trọng hoặc thực hiện tính năng mới, bạn có thể cần phải lưu ý thay đổi này. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/ZUY7TY3Z6XPZWZVAZV63OPO5OW52Q6GE/]
* Quy trình tạo bản dump CirrusSearch đã được cập nhật do hiệu suất bị chậm. Nếu bạn gặp bất kỳ sự cố nào khi chuyển sang bản dump thay thế, vui lòng liên hệ với Nhóm Nền tảng Tìm kiếm để được hỗ trợ. [https://phabricator.wikimedia.org/T366248][https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/3KQPOR6ACVN6OVLMLZPIBXQSWQKW4E3K/]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.2|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/46|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W46"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:38, ngày 10 tháng 11 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29606150 -->
== Bản tin Kỹ thuật: Tuần 47-2025 ==
<section begin="technews-2025-W47"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/47|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] đang thử nghiệm tính năng [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4_Reading lists|danh sách đọc trên trang di động]], cho phép người đọc đã đăng nhập chưa thực hiện sửa đổi nào có thể lưu danh sách bài viết riêng tư để đọc sau. Thử nghiệm đang được thực hiện trên các Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia, và tiếng Việt kể từ tuần ngày 10 tháng 11, và sẽ bắt đầu trên Wikipedia tiếng Anh trong tuần ngày 17 tháng 11.
* Người dùng không thể nhận được mã xác nhận qua thư điện tử khi đăng nhập nay có thể nhờ hỗ trợ bằng cách gửi biểu mẫu trên trang đặc biệt mới. Cập nhật này là một phần của sáng kiến [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. Nếu tài khoản của bạn có địa chỉ thư điện tử, hãy đảm bảo rằng bạn vẫn có quyền truy cập vào nó. Trong quá trình đăng nhập từ thiết bị hoặc địa điểm mới mà không có 2FA, bạn có thể được yêu cầu nhập mã 6 ký tự được gửi từ thư điện tử để hoàn tất đăng nhập. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Why are you requiring me to enter a code from my email to log in? Can I opt out of this?|Tìm hiểu thêm]].
* Một wiki mới đã được tạo ra: {{int:project-localized-name-group-wikisource}} tiếng [[d:Q13324|Minangkabau]] ([[s:min:|<code>s:min:</code>]]) [https://phabricator.wikimedia.org/T408317]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]].
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Là một phần của dự án [[mw:Special:MyLanguage/Parsoid/Parser Unification|Hợp nhất Trình Phân tích Cú pháp]], Nhóm Chuyển đổi Nội dung đã triển khai Parsoid làm trình phân tích cú pháp mặc định cho nhiều trang Wikipedia có lưu lượng truy cập thấp và đang chuẩn bị tiếp tục bước tiếp theo để triển khai đến những trang có lưu lượng truy cập cao. Tin nhắn này là lời mời cho bạn tham gia vào Parsoid, như được miêu tả trong tài liệu [[mw:Special:MyLanguage/Help:Extension:ParserMigration|Extension:ParserMigration]], và tìm ra bất kỳ vấn đề nào mà bạn có thể gặp phải với quy trình làm việc của mình khi sử dụng bot, tiện ích hoặc đoạn mã người dùng. Hãy cho chúng tôi biết thông qua liên kết ''"Báo cáo lỗi hiển thị"'' trên thanh bên Công cụ hoặc tạo một tác vụ phab và gắn thẻ [[phab:project/view/5846|Nhóm Chuyển đổi Nội dung trên Phabricator]].
* Dự án Công cụ Không được Hỗ trợ: Một vài vấn đề với [[:c:Special:MyLanguage/Commons:Video2commons|Video2Commons]] đã được giải quyết, bao gồm lỗi tải lên liên quan đến tên tập tin, nhập video bị đen, và xử lý việc thử lại. Hỗ trợ cho AV1 cũng đã được thêm vào. Những công việc đang được tiến hành tập trung vào tính ổn định của backend, lỗi ffmpeg, nhập phụ đề, xử lý siêu dữ liệu, và tải lên danh sách phát. Để theo dõi các tác vụ cụ thể, hãy kiểm tra [[phab:tag/video2commons/|bảng tác vụ trên Phabricator]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.3|MediaWiki]]
'''Các cuộc họp và sự kiện'''
* Hãy lưu lịch ngay cho Hackathon Wikimedia tiếp theo sẽ diễn ra tại Milan, Ý từ ngày 1–3 tháng 5 năm 2026. Cổng đăng ký sẽ được mở vào tháng 1 năm 2026. [https://pretix.eu/wikimedia/Hackathon-2026/ Đơn đăng ký nhận học bổng hiện đang được mở], và sẽ đóng vào ngày 28 tháng 11 năm 2025. Nếu bạn có bất kỳ câu hỏi nào, vui lòng gửi thư đến <bdi lang="en" dir="ltr">hackathon@wikimedia.org</bdi>.
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/47|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W47"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:26, ngày 17 tháng 11 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29627455 -->
== <span lang="en" dir="ltr">Reminder: Help us decide the name of the new Abstract Wikipedia project</span> ==
<div lang="en" dir="ltr">
<section begin="function2"/>
{{int:Hello}}. Reminder: Please help to choose name for the new Abstract Wikipedia wiki project. The finalist vote starts today. The finalists for the name are: <span lang="en" dir="ltr" class="mw-content-ltr">Abstract Wikipedia, Multilingual Wikipedia, Wikiabstracts, Wikigenerator, Proto-Wiki</span>. If you would like to participate, then '''[[m:Special:MyLanguage/Abstract Wikipedia/Abstract Wikipedia naming contest|please learn more and vote now]]''' at meta-wiki.
{{Int:Feedback-thanks-title}}
<section end="function2"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 14:23, ngày 20 tháng 11 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:Sannita (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29583860 -->
== Bản tin Kỹ thuật: Tuần 48-2025 ==
<section begin="technews-2025-W48"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/48|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Tuần trước, [[mw:Special:MyLanguage/Wikimedia Search Platform|Nhóm Tìm kiếm Wikimedia]] đã tạo lại chức năng của tiện ích "DWIM" (Do What I Mean - Làm những gì bạn muốn) trên máy chủ, cho Wikipedia tiếng Nga và tiếng Do Thái. Tính năng này bổ sung gợi ý đa bàn phím vào gợi ý trên hộp tìm kiếm tiêu chuẩn. Ví dụ, khi tìm kiếm ''<span lang="und" dir="ltr">cxfcnmt</span>'' trên Wikipedia tiếng Nga giờ đây sẽ bổ sung thêm gợi ý cho ''<span lang="ru" dir="ltr">счастье</span>'' ("sự hạnh phúc") mà người dùng có thể có ý định tìm tới. Họ dự kiến sẽ kích hoạt tính năng này trên các wiki khác bằng tiếng Nga và tiếng Do Thái trong tuần này. [https://phabricator.wikimedia.org/T408734]
* Cuối tuần này, người dùng [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] "{{int:codemirror-beta-feature-title}}" sẽ có thể sử dụng tính năng tô màu cú pháp trong [[mw:Special:MyLanguage/Help:DiscussionTools|Công cụ Thảo luận]]. Điều này yêu cầu phải thiết lập tùy chọn "{{int:discussiontools-preference-sourcemodetoolbar}}". [https://phabricator.wikimedia.org/T407918]
* [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|Phần mở rộng chiến dịch sự kiện]] – một bộ công cụ để phối hợp tổ chức sự kiện và các hoạt động cộng tác khác trên wiki nay đã được triển khai tới tất cả các wiki của Wikimedia. Một tính năng mới được gọi là [[m:Special:MyLanguage/CampaignEvents/Collaborative contributions|Đóng góp cộng tác]] cũng đã được thêm vào để giúp những người tổ chức và người tham gia thấy được tác động của những hoạt động đó. Hãy tham gia [[m:Special:MyLanguage/Event:Connection learning session 3|buổi học sắp tới]] để xem tính năng mới đó hoạt động thực tế như thế nào và chia sẻ phản hồi của bạn.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:24}} {{PLURAL:24|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho CodeReviewBot ngừng hoạt động hiện đã được giải quyết. [https://phabricator.wikimedia.org/T410417]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Người dùng API của Wikimedia có thể tham gia nghiên cứu khả năng sử dụng để giúp xác thực thiết kế mới dành cho chỗ thử REST API của Wikimedia. Những người có hứng thú tham gia cần điền vào [https://wikimediafoundation.limesurvey.net/487662 biểu mẫu khảo sát tham gia] này. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/IREJRRWTZTGCYWQHDMSNJFTQAEPOOAE3/]
* Nhóm Giao diện MediaWiki đang trong quá trình ngừng hỗ trợ các bảng định dạng (stylesheet) kiểu XSLT trong Action API. Hỗ trợ cho <code dir=ltr>format=xml'''&xlst={stylesheet}'''</code> sẽ bị loại bỏ khỏi các dự án Wikimedia vào cuối tháng 11 năm 2025. Ngoài ra, nó sẽ sớm mặc định bị vô hiệu hóa trong các phiên bản phát hành của MediaWiki: v1.43 (LTS), v1.44, và v1.45. Hỗ trợ cho các bảng định dạng kiểu XSLT sẽ bị loại bỏ hoàn toàn khỏi MediaWiki v1.46 (dự kiến phát hành vào khoảng thời gian từ tháng 4 đến tháng 5 năm 2026). [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/5AX7UWAVVUNUSBOIRHMNOKWOZ5EZI3JX/]
* Điểm cuối kế thừa của WDQS ([https://query-legacy-full.wikidata.org/ query-legacy-full.wikidata.org]) sẽ ngừng hoạt động vào cuối tháng 12 năm 2025, và sẽ chính thức bị vô hiệu hóa vào ngày 7 tháng 1 năm 2026. Sau ngày này, người dùng sẽ nhận thấy những yêu cầu đến query.wikidata.org mà yêu cầu toàn bộ biểu đồ bị lỗi hoặc trả về kết quả không hợp lệ nếu chúng không được viết lại để sử dụng liên kết SPARQL. Nhóm khuyên người dùng cần đảm bảo các công cụ và quy trình làm việc sử dụng các điểm cuối WDQS được hỗ trợ (<span dir=ltr><nowiki>https://query.wikidata.org/</nowiki></span> - Biểu đồ chính hoặc <span dir=ltr><nowiki>https://query-scholarly.wikidata.org/</nowiki></span> - Biểu đồ học thuật). Để được hỗ trợ chuyển đổi các trường hợp sử dụng (use case), vui lòng xem lại các trang [[d:Special:MyLanguage/Wikidata:Data_access|Truy cập Dữ liệu]] và [[d:Wikidata:Request_a_query|Yêu cầu Truy vấn]] để biết thêm thông tin và được hỗ trợ về các phương thức truy cập thay thế.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.4|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/48|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W48"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:56, ngày 24 tháng 11 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29702226 -->
== Bản tin Kỹ thuật: Tuần 49-2025 ==
<section begin="technews-2025-W49"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/49|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Bảng Nhìn lại Một Năm Wikipedia 2025 sẽ có mặt vào ngày 2 tháng 12 dành cho người dùng ứng dụng Wikipedia trên iOS và Android, gồm thông tin chuyên sâu được cá nhân hóa, những điểm nổi bật để đọc được cập nhật, cùng thiết kế đã được làm mới. Tìm hiểu thêm trên [[mw:Special:MyLanguage/Wikimedia Apps/Team/Wikipedia Year in Review/Updates|trang dự án]] của tính năng nhìn lại này.
* Nhóm Tăng trưởng đang nỗ lực cải thiện nội dung và cách trình bày của Email Xác minh được gửi tới người dùng mới để chúng trở nên thân thiện, hữu ích và có thêm nhiều thông tin hơn. Một số văn bản mới đã được soạn thảo cho thử nghiệm A/B và bạn có thể giúp đỡ bằng cách dịch chúng. Xem [[phab:T396155|Phabricator]].
* Tính năng [[mw:Special:MyLanguage/Help:Growth/Tools/Add a link|Thêm liên kết]] nay sẽ được triển khai tới Wikipedia tiếng Nhật, tiếng Urdu và tiếng Trung vào ngày 2 tháng 12. Thêm liên kết được dựa trên mô hình dự đoán nhằm gợi ý liên kết cần được thêm vào bài viết. Trong khi tính năng này đã có mặt trên hầu hết các trang Wikipedia, mô hình dự đoán đó không thể hỗ trợ một số ngôn ngữ nhất định. Một mô hình mới đã được phát triển để xử lý những ngôn ngữ này, và mô hình đó sẽ dần được triển khai sang các trang Wikipedia khác theo thời gian. Nếu bạn muốn được biết thêm thông tin, vui lòng liên hệ [[mw:user:Trizek (WMF)|Trizek (WMF)]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:34}} {{PLURAL:34|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà hộp tìm kiếm trên một số trang Commons không hiển thị kết quả nào do việc chuyển đổi từ SpecialSearch sang MediaSearch, hiện đã được giải quyết. [https://phabricator.wikimedia.org/T399476]
* Hai wiki mới đã được tạo ra:
** {{int:project-localized-name-group-wikipedia}} tiếng [[d:Q36846|Toki Pona]] ([[w:tok:|<code>w:tok:</code>]]) [https://phabricator.wikimedia.org/T404457]
** {{int:project-localized-name-group-wikiquote}} tiếng [[d:Q33655|Pidgin Nigeria]] ([[q:pcm:|<code>q:pcm:</code>]]) [https://phabricator.wikimedia.org/T408318]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.5|MediaWiki]]
'''Chuyên sâu'''
* Quỹ Wikimedia đang trong giai đoạn đầu của việc khám phá các phương pháp tiếp cận cho '''Chỉ dẫn bài viết'''. Sáng kiến này nhằm mục đích xác định các phương pháp can thiệp có thể giúp các biên tập viên mới dễ dàng hiểu và áp dụng các quy tắc và chính sách hiện hành của Wikipedia khi tạo bài viết. Dự án đang trong giai đoạn khám phá và thiết kế thử nghiệm giai đoạn đầu. Tất cả các thành viên cộng đồng được khuyến khích [[mw:Special:MyLanguage/Article guidance|tìm hiểu thêm]] về dự án, và chia sẻ suy nghĩ của họ trên [[mw:Special:MyLanguage/Talk:Article guidance|trang thảo luận này]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/49|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W49"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:58, ngày 1 tháng 12 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29732328 -->
== Bản tin Kỹ thuật: Tuần 50-2025 ==
<section begin="technews-2025-W50"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/50|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Bất kỳ ai muốn bảo mật tài khoản người dùng của mình nay có thể sử dụng tính năng [[m:Special:MyLanguage/Help:Two-factor authentication|xác thực hai yếu tố]] (2FA). Tính năng này có sẵn cho tất cả người dùng của toàn bộ các dự án Wikimedia. Đây là một phần của sáng kiến [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]]. Sau này, 2FA sẽ được yêu cầu đối với tất cả người dùng có thể thực hiện các hành động mang tính nhạy cảm về bảo mật hoặc quyền riêng tư.
'''Cập nhật cho biên tập viên'''
* Tiếp nối đợt triển khai lần trước, tính năng [[mw:Special:MyLanguage/Help:Growth/Tools/Add a link|Thêm liên kết]], một tính năng cho phép biên tập viên thêm liên kết được đề xuất trong quá trình sửa đổi, sẽ có mặt trên [[Phab:T410469|33 trang Wikipedia]] kể từ ngày 9 tháng 12. Việc mở rộng này có được nhờ mô hình dự đoán mới nay hỗ trợ tất cả các ngôn ngữ, kể cả những ngôn ngữ mà chưa được đề cập trước đây. Dù tính năng này đã có mặt trên hầu hết các trang Wikipedia được một thời gian, nhưng lần triển khai này sẽ giúp chúng tôi tiến gần hơn đến việc sử dụng mô hình được cải tiến này ở mọi nơi. Nếu bạn có bất kỳ câu hỏi nào hoặc muốn được biết thêm thông tin chi tiết vui lòng liên hệ với [[mw:user:Trizek (WMF)|Trizek (WMF)]].
* Tuần trước, [[mw:Special:MyLanguage/Wikimedia Search Platform|nhóm Nền tảng Tìm kiếm]] đã thêm gợi ý tìm kiếm [[w:vi:Chuyển tự|được chuyển tự]] khi bạn nhập tới các wiki bằng tiếng Georgia. Nếu chỉ có một vài gợi ý tìm kiếm thông thường, thì các truy vấn bằng chữ Latinh hoặc Kirin [[phab:T127003|nay sẽ được viết lại thành chữ Georgia]] để có thể tìm kiếm được nhiều kết quả trùng khớp hơn. Ví dụ, tìm kiếm <bdi lang="ka-Latn" dir="ltr">''bedniereba''</bdi> hoặc <bdi lang="ka-Cyrl" dir="ltr">''бедниереба''</bdi> nay sẽ gợi ý bài viết hiện có về <bdi lang="ka" dir="ltr">ბედნიერება</bdi> ("sự hạnh phúc"). Bạn có thể đề xuất những ngôn ngữ khác mà việc gợi ý được chuyển tự có thể hữu ích [[phab:T375215|trên Phabricator]] để dùng cho quá trình phát triển sau này.
* Cuối tuần này, một thử nghiệm có kiểm soát sẽ bắt đầu dành cho các biên tập viên trên 100 trang Wikipedia lớn nhất khi đang thực hiện sửa đổi một đề mục bằng trình soạn thảo trực quan trên trang web di động. 50% số biên tập viên đó sẽ nhận thấy nút "Sửa đổi toàn bộ trang" mới cho phép họ mở rộng phiên sửa đổi của mình lên toàn bộ trang đó. Tính năng này nhằm mục đích giúp người dùng trên trang web di động sửa đổi bất kỳ đề mục nào trong bài viết một cách dễ dàng hơn, bất kể việc họ chạm vào biểu tượng sửa đề mục nào để bắt đầu sửa đổi. Thử nghiệm này sẽ kéo dài khoảng 4 tuần. Bạn có thể tìm hiểu [[phab:T409112|thêm thông tin]] về dự án này.
* Cuối tuần này, [[mw:Special:MyLanguage/Readers/Reader Growth|nhóm Tăng trưởng Độc giả]] sẽ khởi động [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.1.14 Expanded Mobile Sections|thử nghiệm trên trang web di động]] để mở rộng tất cả đề mục bài viết theo mặc định (hiện giờ chúng được mặc định thu gọn lại) và ghim tiêu đề của đề mục mà người dùng hiện đang đọc lên đầu trang. Thử nghiệm này sẽ ảnh hưởng tới 10% người dùng trên Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Indonesia và tiếng Việt. [https://phabricator.wikimedia.org/T409485]
* [[mw:Special:MyLanguage/Wikimedia Apps/Team/Wikipedia Year in Review/2025 Year in Review|Tổng kết Một Năm Wikipedia 2025]], một tính năng trong ứng dụng Wikipedia dành cho thiết bị di động (iOS và Android) nhằm cung cấp cho người dùng bản tóm tắt được cá nhân hóa về mức độ tương tác của họ với Wikipedia xuyên suốt trong một năm, nay đã có mặt trên ứng dụng iOS và Android. Phiên bản này bao gồm những thông tin chuyên sâu được mở rộng và cá nhân hóa, cải thiện những điểm nổi bật trong quá trình đọc, thông điệp mới cho nhà quyên góp, cùng thiết kế được cập nhật. Hãy mở ứng dụng để xem chuyên mục Tổng kết Năm và khám phá hành trình đọc của bạn trong năm 2025 nhé.
* Một lỗi phần mềm xảy ra gần đây khiến cho các sửa đổi được thực hiện bằng Trình Soạn thảo Trực quan thực hiện những thay đổi không mong muốn với mã nguồn wiki, trong đó có việc loại bỏ khoảng trắng và thay thế các dấu cách bằng dấu gạch dưới trong các liên kết wiki bên trong chú thích. Vấn đề này đã được giải quyết một phần vào tuần trước, và việc giải quyết vấn đề vẫn đang tiếp tục được thực hiện. Các biên tập viên sử dụng Trình Soạn thảo Trực quan trong các ngày từ 28 tháng 11 đến 2 tháng 12 nên kiểm tra lại sửa đổi của mình để tìm ra những thay đổi ngoài ý muốn. [https://phabricator.wikimedia.org/T411238]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề về việc xử lý không đúng các đường dẫn URL được sao chép từ thanh địa chỉ của người dùng Microsoft Edge đã được giải quyết. [https://phabricator.wikimedia.org/T341281]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Bắt đầu từ tuần này, người dùng [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] "{{int:codemirror-beta-feature-title}}" sẽ sử dụng [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] làm trình sửa đổi dành cho các kiểu nội dung Lua, JavaScript, CSS, JSON và Vue, thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]]. Với thay đổi này, [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|các linter]] sẽ được nâng cấp. Đây là một phần trong nỗ lực lớn hơn nhằm thay thế CodeEditor và mang tới trải nghiệm sửa đổi mã nguồn một cách nhất quán. [https://phabricator.wikimedia.org/T373711]
* Các nhà phát triển được khuyến khích tham gia [https://wikimediafoundation.limesurvey.net/552643 Khảo sát Mức độ Hài lòng của Nhà phát triển năm 2025], hiện vẫn đang được mở đến hết ngày 5 tháng 1 năm 2026. Nếu bạn tham gia vào việc xây dựng phần mềm cho hệ sinh thái Wikimedia và muốn chia sẻ kinh nghiệm hoặc phản hồi của mình, thì chúng tôi sẽ rất trân trọng sự tham gia của bạn. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/W4WBKO6Q55UWWCCSFWQATKEXBEHP3QNR/]
* Tuần này không có phiên bản MediaWiki mới nào.
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/50|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W50"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:45, ngày 8 tháng 12 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29738112 -->
== Bản tin Kỹ thuật: Tuần 51-2025 ==
<section begin="technews-2025-W51"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/51|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:18}} {{PLURAL:18|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một trong số đó là việc giải quyết vấn đề khi tài khoản tạm thời chèn liên kết URL ngoài, việc này kích hoạt yêu cầu hCaptcha trong nhiều trường hợp hơn so với dự định, và không hiển thị popup cần thiết trong lần thử xuất bản sửa đổi đầu tiên. [https://phabricator.wikimedia.org/T411927]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* <span class="mw-translate-fuzzy">Để cải thiện hiệu suất cho cơ sở dữ liệu và trang web, các liên kết ngoài tới các dự án Wikimedia sẽ không còn được lưu trữ trong cơ sở dữ liệu. Điều này có nghĩa là chúng sẽ không thể được tìm thấy trong [[{{#special:LinkSearch}}]], sẽ không được kiểm tra bởi Danh sách đen về spam hoặc Bộ lọc Sai phạm dưới dạng liên kết mới, và sẽ không có trong bảng <code dir=ltr>externallinks</code> trên các bản sao cơ sở dữ liệu. Trong tương lai nó có thể được mở rộng sang những trang web khác đáng tin cậy được liên kết nhiều trên cơ sở từng wiki, chẳng hạn như liên kết Creative Commons trên Wikimedia Commons.</span> [https://phabricator.wikimedia.org/T405005]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.7|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/51|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W51"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:03, ngày 15 tháng 12 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29796010 -->
== Bản tin Kỹ thuật: Tuần 52-2025 ==
<section begin="technews-2025-W52"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2025/52|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Kể từ tháng 1, các bộ lọc sai phạm [[mw:Special:MyLanguage/Extension:AbuseFilter/Access flags|có thể được thiết lập]] để tự động loại bỏ chi tiết bộ lọc chẳng hạn như quy tắc và danh sách các sửa đổi và tác vụ thực hiện được ghi lại. Điều này sẽ giúp người giám sát sử dụng các bộ lọc sai phạm để ngăn chặn doxxing hoặc nội dung khác có thể bị loại bỏ. [https://phabricator.wikimedia.org/T290324]
* Số tiếp theo của Bản tin Kỹ thuật sẽ được phát hành vào ngày 12 tháng 1 năm 2026 do trùng vào kỳ nghỉ cuối năm. Xin cảm ơn tất cả các biên dịch viên cùng những người đã gửi nội dung hoặc phản hồi trong năm nay.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:16}} {{PLURAL:16|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, sự cố xảy ra khiến cho ứng dụng bị sập khi chạm vào mục "Bước Đầu tiên" trong mục Nhìn lại Một năm trên ứng dụng Wikipedia dành cho Android nay đã được giải quyết, và tính năng này được mở như mong đợi. [https://phabricator.wikimedia.org/T411546]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Những thành phần giao diện như khác biệt giữa các phiên bản và thể loại được tạo bởi MediaWiki từng có thuộc tính <code dir=ltr>data-mw="interface"</code> để phân biệt với nội dung wiki. Thuộc tính này đã được thay thế bằng <code dir=ltr>data-mw-interface=""</code>, nhằm tránh khả năng gây xung đột với những thuộc tính <code dir=ltr>data-mw</code> khác được tạo bởi Parsoid. [https://phabricator.wikimedia.org/T409187]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Không có phiên bản MediaWiki mới nào trong tuần này hoặc tuần tới.
'''Các cuộc họp và sự kiện'''
* [[mw:Wikimedia Hackathon Northwestern Europe 2026|Wikimedia Hackathon Tây Bắc Âu năm 2026]] sẽ diễn ra vào các ngày 13-14 tháng 3 năm 2026 tại Arnhem, Hà Lan. Đơn đăng ký vừa được mở vào giữa tháng 12 và sẽ đóng vào giữa tháng 1 hoặc có thể đóng sớm hơn nếu hết chỗ. Do sự kiện giới hạn khoảng 100 người tham gia, chúng tôi khuyến khích bạn đăng ký thật sớm.
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2025/52|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2025-W52"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:45, ngày 22 tháng 12 năm 2025 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29831856 -->
== Bản tin Kỹ thuật: Tuần 03-2026 ==
<section begin="technews-2026-W03"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/03|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Quỹ Wikimedia đã chia sẻ một số câu hỏi định hướng cho Kế hoạch Thường niên giai đoạn tháng 7 năm 2026–tháng 6 năm 2027 trên [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] và ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Những câu hỏi này tập trung vào những xu hướng toàn cầu, những thử nghiệm nhanh và hiệu quả hơn, hỗ trợ tốt hơn cho người mới, tăng cường năng lực cho biên tập viên và người dùng có quyền nâng cao, cải thiện sự cộng tác giữa các dự án, cũng như phát triển và duy trì lượng người đọc. Mọi phản hồi và ý kiến đóng góp đều được hoan nghênh trên [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|trang thảo luận]].
'''Cập nhật cho biên tập viên'''
* Là một phần của công việc hiện do nhóm Công nghệ Cộng đồng thực hênj xoay quanh dự án [[m:Special:MyLanguage/Community Wishlist/W372|Nhiều danh sách theo dõi]] (Multiple watchlists), việc hiển thị của tính năng [[Special:EditWatchlist|Sửa đổi Danh sách theo dõi]] (EditWatchlist) sẽ được cập nhật làm bước đầu tiên hướng tới việc có được nhiều danh sách theo dõi. Ngoài ra, việc phân trang của trang [[Special:Search|Tìm kiếm]] cũng sẽ được cập nhật như là một phần của công việc liên quan đến mong muốn [[m:Special:MyLanguage/Community Wishlist/W186|Cải tiến phân trang / điều hướng trang]]. [https://phabricator.wikimedia.org/T411596]
* [[m:Special:GlobalWatchlist|Danh sách theo dõi toàn cục]] là [[mw:Special:MyLanguage/Extension:GlobalWatchlist|phần mở rộng]] của MediaWiki cho phép bạn xem danh sách theo dõi của bạn từ các wiki khác nhau trên cùng một trang. Danh sách này gần đây đã được cập nhật để trông giống như [[Special:Watchlist|Danh sách theo dõi]] thông thường hơn, chẳng hạn như tiền xử lý các tài khoản tạm thời để che giấu địa chỉ IP (trong đó có việc chuyển hướng liên kết người dùng đến các trang đóng góp), in đậm tiêu đề trang, và mở các liên kết trong phần tóm lược sửa đổi và thẻ trong tab trình duyệt mới. [https://phabricator.wikimedia.org/T398361][https://phabricator.wikimedia.org/T298919][https://phabricator.wikimedia.org/T273526][https://phabricator.wikimedia.org/T286309]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:28}} {{PLURAL:28|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, vấn đề mà việc cấm tài khoản toàn cục không có tùy chọn cấm gửi thư điện tử, nay đã được giải quyết, và sẽ có thể sử dụng kể từ tuần ngày 13 tháng 1. [https://phabricator.wikimedia.org/T401293]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[mw:Special:MyLanguage/VisualEditor/Citation tool|Công cụ chú thích của Soạn thảo Trực quan]] và [[mw:Special:MyLanguage/Help:Reference Previews|Xem trước Chú thích]] nay hỗ trợ kiểu chú thích dạng "bản đồ". [https://phabricator.wikimedia.org/T411083]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.10|MediaWiki]]/[[mw:MediaWiki 1.46/wmf.11|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/03|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W03"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:33, ngày 12 tháng 1 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29907192 -->
== Thank You for Last Year – Join Wiki Loves Ramadan 2026 ==
Dear Wikimedia communities,
We hope you are doing well, and we wish you a happy New Year.
''Last year, we captured light. This year, we’ll capture legacy.''
In 2025, communities around the world shared the glow of Ramadan nights and the warmth of collective iftars. In 2026, ''Wiki Loves Ramadan'' is expanding, bringing more stories, more cultures, and deeper global connections across Wikimedia projects.
We invite you to explore the ''Wiki Loves Ramadan 2026'' [[m:Special:MyLanguage/Wiki Loves Ramadan 2026|Meta page]] to learn how you can participate and [[m:Special:MyLanguage/Wiki Loves Ramadan 2026/Participating communities|sign up]] your community.
📷 ''Photo campaign on '' [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan 2026|Wikimedia Commons]]
If you have questions about the project, please refer to the FAQs:
* [[m:Special:MyLanguage/Wiki Loves Ramadan/FAQ/|Meta-Wiki]]
* [[c:Special:MyLanguage/Commons:Wiki Loves Ramadan/FAQ|Wikimedia Commons]]
''Early registration for updates is now open via the '''[[m:Special:RegisterForEvent/2710|Event page]]'''''
''Stay connected and receive updates:''
* [https://t.me/WikiLovesRamadan Telegram channel]
* [https://lists.wikimedia.org/postorius/lists/wikilovesramadan.lists.wikimedia.org/ Mailing list]
We look forward to collaborating with you and your community.
'''The Wiki Loves Ramadan 2026 Organizing Team''' 19:45, ngày 16 tháng 1 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:ZI Jony@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29879549 -->
== Bản tin Kỹ thuật: Tuần 04-2026 ==
<section begin="technews-2026-W04"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/04|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Khay được hiển thị trên [[Special:Diff|Đặc biệt:Khác]] trong chế độ xem di động đã được thiết kế lại. Giờ đây nó mặc định được thu gọn, đồng thời tích hợp một liên kết để lùi lại sửa đổi đang được hiển thị trên màn hình, giúp các biên tập viên và người duyệt bài trên điện thoại di động dễ dàng thực hiện tác vụ mà vẫn giữ giao diện thật gọn gàng. [https://phabricator.wikimedia.org/T402297]
* [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi từ nhiều wiki khác nhau trên cùng một trang. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] này tiếp tục được cải thiện — nay nó có thể tự động xác định hướng văn bản (nhằm đảm bảo việc hiển thị chính xác các trang web mà có tên miền bất thường) và hiển thị chi tiết phần miêu tả cho các tác vụ được lưu trong nhật trình. Cuối tuần này, một liên kết thường trực mới cho các tác vụ tạo trang cùng các lớp CSS cho từng mục nhập sẽ được thêm vào. [https://phabricator.wikimedia.org/T412505][https://phabricator.wikimedia.org/T287929][https://phabricator.wikimedia.org/T262768][https://phabricator.wikimedia.org/T414135]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:32}} {{PLURAL:32|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà được ghi nhận trước đây trong giao diện Vector 2022 mà các liên kết anchor đích bị che khuất bởi tiêu đề cố định nay đã được giải quyết. [https://phabricator.wikimedia.org/T406114]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Như đã đề cập trong [[m:Special:MyLanguage/Tech/News/2025/44|thông báo ngừng hỗ trợ vào tháng 10 năm 2025]], nhóm Giao diện MediaWiki sẽ bắt đầu loại bỏ toàn bộ điểm cuối chuyển đổi có dấu gạch chéo ở cuối khỏi API REST của MediaWiki vào tuần từ ngày 26 tháng 1. Những thay đổi này dự kiến sẽ được triển khai tới tất cả các wiki chậm nhất vào ngày 30 tháng 1. Tất cả người dùng API đang gọi những điểm cuối này được khuyên chuyển đổi sang những phiên bản không có dấu gạch chéo ở cuối. Cả hai loại biến thể điểm cuối này đều có thể được tìm thấy, so sánh và kiểm tra sử dụng [https://test.wikipedia.org/wiki/Special:RestSandbox Chỗ thử REST]. Nếu bạn có thắc mắc hay gặp bất kỳ sự cố nào, hãy gửi yêu cầu bằng cách tạo một tác vụ trong Phabricator gửi tới [https://phabricator.wikimedia.org/project/view/6931/ bảng tin #MW-Interfaces-Team].
* Tài liệu tham khảo trực quan cho [[mw:Special:MyLanguage/Wikimedia REST API|API REST của Wikimedia]] đã được chuyển. Những yêu cầu đến các tài liệu API trước đây được lưu trữ thông qua [[mw:Special:MyLanguage/RESTBase|RESTBase]] (v.d.: <code dir=ltr>https://en.wikipedia.org/api/rest_v1/</code>) nay được chuyển hướng tới [[w:en:Special:RestSandbox|Chỗ thử REST]].
* [[mw:Special:MyLanguage/Wikidata Platform|Nhóm Nền tảng Wikidata của WMF]] (WDP) đã phát hành [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|bản tin tháng 1 năm 2026]]. Bản tin bao gồm những cập nhật về việc ngừng hoạt động điểm cuối biểu đồ đầy đủ (full-graph) cũ, thay đổi về chính sách User-Agent, thời gian làm việc hàng tháng của kế hoạch chuyển đổi sang Blazegraph, cùng những nỗ lực nhằm giảm thiểu những lỗi hồi quy gây ra bởi việc ngừng điểm cuối cũ. Xin nhắc lại rằng bạn có thể [[m:Special:MyLanguage/Global message delivery/Targets/WDP team updates|đăng ký nhận bản tin WDP đó]]!
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.12|MediaWiki]]
'''Các cuộc họp và sự kiện'''
* [[mw:Wikimedia Hackathon Northwestern Europe 2026|Cuộc thi Hackathon Wikimedia khu vực Tây Bắc Châu Âu năm 2026]] sẽ diễn ra vào ngày 13-14 tháng 3 năm 2026 tại Arnhem, Hà Lan. Cổng đăng ký đã được mở vào giữa tháng 12 và sẽ sớm đóng lại hoặc đóng ngay khi đã đủ số lượng người tham gia. Đây là cuộc thi hackathon kéo dài hai ngày, tập trung vào mảng kỹ thuật và quy tụ các thành viên Wikimedia từ khắp khu vực. Hy vọng sẽ gặp lại bạn tại đó!
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/04|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W04"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:29, ngày 19 tháng 1 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29943403 -->
== Rà soát thường niên Bộ Quy tắc Ứng xử Chung và Hướng dẫn Thực thi ==
<section begin="announcement-content" />
Tôi viết thư này để thông báo với bạn rằng thời gian xem xét hàng năm đối với Bộ Quy tắc Ứng xử và Hướng dẫn Thực thi hiện đã bắt đầu. Bạn có thể đưa ra các đề xuất thay đổi đến hết ngày 9 tháng 2 năm 2026. Đây là bước đầu tiên trong nhiều bước cần thực hiện cho quá trình xem xét hàng năm. [[m:Special:MyLanguage/Universal Code of Conduct/Annual review/2026|Đọc thêm thông tin và tìm cuộc thảo luận để tham gia trên trang UCoC trên Meta]].
[[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee|Ủy ban Điều phối Bộ Quy tắc Ứng xử Toàn cầu]] (U4C) là một nhóm toàn cầu chuyên trách việc thực hiện Bộ Quy tắc Ứng xử Toàn cầu một cách công bằng và nhất quán. Đánh giá thường niên này được lên kế hoạch và thực hiện bởi U4C. Để biết thêm thông tin và trách nhiệm của U4C, [[m:Special:MyLanguage/Universal Code of Conduct/Coordinating Committee/Charter|bạn có thể xem Hiến chương U4C]].
Vui lòng chia sẻ thông tin này với các thành viên khác trong cộng đồng của bạn ở bất cứ nơi nào phù hợp.
-- Hợp tác với U4C, [[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]])<section end="announcement-content" />
21:02, ngày 19 tháng 1 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:Keegan (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=29905753 -->
== Bản tin Kỹ thuật: Tuần 05-2026 ==
<section begin="technews-2026-W05"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/05|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Quỹ Wikimedia mời mọi người đóng góp ý kiến cho [[m:Special:MyLanguage/Product and Technology Advisory Council/Year1 Reflections and Proposed Way Forward 2026 Update|đề xuất kế hoạch tương lai]] của [[:m:Special:MyLanguage/Product and Technology Advisory Council|Hội đồng Cố vấn Sản phẩm và Công nghệ]] chậm nhất ngày 28 tháng 2.
* Tất cả người dùng đã đăng ký tài khoản nay có thể sử dụng passkey (mã xác thực) cho việc [[m:Special:MyLanguage/Help:Two-factor authentication|xác thực hai yếu tố]] (2FA). Passkey là một cách đơn giản để đăng nhập mà không cần phải sử dụng thiết bị thứ hai. Chúng sẽ xác thực danh tính của người dùng sử dụng vân tay, nhận diện khuôn mặt, hoặc dùng mã PIN. Để thiết lập một passkey, đầu tiên hãy thiết lập phương thức xác thực 2FA thông thường. Hiện tại, để đăng nhập bằng passkey, người dùng cũng phải sử dụng cả mật khẩu. Vào cuối quý này, tính năng đăng nhập không cần mật khẩu sẽ cho phép người dùng đăng nhập chỉ bằng một cú nhấn chuột và passkey. Người dùng có quyền nâng cao cũng sẽ bắt buộc phải kích hoạt xác thực 2FA. Đây là một phần của dự án [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security|Bảo mật Tài khoản]].
* Những người đóng góp chưa đăng ký tài khoản trên các IP hoặc dải IP bị cấm nay có thể tương tác trên wiki để chống lại quyết định cấm trên trang thảo luận thành viên, trừ khi tùy chọn "ngăn người dùng này sửa đổi trang thảo luận của họ" được bật. Điều này giúp giải quyết vấn đề rằng người dùng chưa đăng nhập không thể sử dụng quy trình bỏ cấm mặc định thông qua trang thảo luận thành viên. [https://phabricator.wikimedia.org/T398673]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:20}} {{PLURAL:20|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, phần miêu tả phương thức Xác thực hai yếu tố (2FA) trên trang quản lý đã được cập nhật. Giờ đây nó trở nên rõ ràng và dễ hiểu hơn, giúp người dùng dễ dàng sử dụng hơn. [https://phabricator.wikimedia.org/T332385]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Một biến Bộ lọc Sai phạm mới, <code>account_type</code>, đã được thêm vào để cung cấp một cách đáng tin cậy trong việc xác định loại tài khoản được tạo trong các tác vụ <code>createaccount</code> và <code>autocreateaccount</code>. Là một phần của thay đổi này, biến <code>accountname</code> đã được đổi tên thành <code>account_name</code>, và <code>accountname</code> nay đã lỗi thời. Những người quản lý bộ lọc sai phạm nên cập nhật bất kỳ bộ lọc nào đang sử dụng biến kiểm tra loại tài khoản mã hóa cứng hoặc đã lỗi thời nào nếu có. [https://phabricator.wikimedia.org/T414049]
* Các hình thu nhỏ được yêu cầu với kích thước không chuẩn và sử dụng các phương thức không chuẩn như yêu cầu trực tiếp đến <code dir=ltr><nowiki>upload.wikimedia.org/…</nowiki></code> sẽ ngừng hoạt động trong thời gian tới. Thay đổi này nhằm ngăn chặn việc các trình thu thập dữ liệu web và bot từ bên ngoài lạm dụng. Một số người dùng có đoạn mã CSS/JS tùy chỉnh, các bảo quản viên giao diện có thể sửa tiện ích và giao diện cục bộ, cùng người viết công cụ sẽ cần cập nhật đoạn mã của mình để sử dụng kích thước hình thu nhỏ tiêu chuẩn. [[phab:T414805|Thông tin chi tiết, các liên kết tìm kiếm, cùng ví dụ về cách giải quyết chúng có sẵn trong tác vụ này]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.13|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/05|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W05"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:17, ngày 26 tháng 1 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=29969530 -->
== Bản tin Kỹ thuật: Tuần 06-2026 ==
<section begin="technews-2026-W06"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/06|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Tính năng "{{int:pageinfo-toolboxlink}}", một tính năng cung cấp thông tin xác thực về một trang ([{{fullurl:{{FULLPAGENAME}}|action=info}} ví dụ]), nay có thêm cả phần mục lục được tạo tự động. Nếu có trang [[MediaWiki:Pageinfo-header]] được người dùng tạo cục bộ, giờ nó có thể được xóa đi. [https://phabricator.wikimedia.org/T363726]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, Trình Soạn thảo Trực quan trước đây đã thêm chức năng in đậm hoặc nghiêng vào phần miêu tả liên kết, làm cho mã wiki trở nên phức tạp. Vấn đề này hiện đã được giải quyết. [https://phabricator.wikimedia.org/T409669]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Không có bản dump XML nào được tạo ra vào ngày 20 tháng 1. Ngoài ra, kể từ giờ, các bản dump sẽ chỉ được tạo một lần mỗi tháng. [https://phabricator.wikimedia.org/T414389]
* Nhóm Giao diện MediaWiki đã ngừng hỗ trợ tất cả điểm cuối chuyển đổi có dấu gạch chéo ở cuối khỏi [https://www.mediawiki.org/wiki/Special:MyLanguage/API:REST%20API API REST của MediaWiki]. Tất cả người dùng API hiện đang gọi những điểm cuối đó được khuyến khích chuyển sang các bản không có dấu gạch chéo ở cuối. Nếu bạn có thắc mắc hoặc gặp bất kỳ sự cố nào, vui lòng gửi tác vụ phabricator tới [https://phabricator.wikimedia.org/project/view/6931/ bảng tin của #MW-Interfaces-Team].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.14|MediaWiki]]
'''Nổi bật trong tuần'''
* Xin nhắc tới người dùng rằng Quỹ Wikimedia đã chia sẻ một số câu hỏi định hướng cho Kế hoạch Hàng năm giai đoạn tháng 7 năm 2026–tháng 6 năm 2027 trên [[m:Special:MyLanguage/Wikimedia Foundation Annual Plan/2026-2027/Product & Technology OKRs|Meta]] và ''[[diffblog:2025/12/10/shaping-wikimedia-foundations-2026-2027-annual-goals-key-questions-for-the-wikimedia-movement/|Diff]]''. Những câu hỏi này tập trung vào những xu hướng toàn cầu, thử nghiệm nhanh hơn và hiệu quả hơn, hỗ trợ tốt hơn cho người mới, nâng cao năng lực cho biên tập viên và người dùng có quyền nâng cao, cải thiện việc cộng tác giữa các dự án, cũng như phát triển và giữ chân độc giả. Mọi phản hồi và ý kiến đóng góp đều được hoan nghênh trên [[m:Talk:Wikimedia Foundation Annual Plan/2026-2027|trang thảo luận]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/06|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W06"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:43, ngày 2 tháng 2 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30000986 -->
== Bản tin Kỹ thuật: Tuần 07-2026 ==
<section begin="technews-2026-W07"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/07|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Mục Mong muốn cộng đồng]] <span lang="en" dir="ltr" class="mw-content-ltr">Logged-in contributors who manage large or complex watchlists can now organise and filter watched pages in ways that improve their workflows with the new [[mw:Special:MyLanguage/Help:Watchlist labels|Watchlist labels]] feature. By adding custom labels (for example: pages you created, pages being monitored for vandalism, or discussion pages) users can more quickly identify what needs attention, reduce cognitive load, and respond more efficiently. This improves watchlist usability, especially for highly active editors.</span>
* <span lang="en" dir="ltr" class="mw-content-ltr">A new feature available on [[Special:Contributions|Special:Contributions]] shows [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts|temporary accounts]] that are likely operated by the same person, and so makes patrolling less time-consuming. Upon checking contributions of a temporary account, users with access to temporary account IP addresses can now see a view of contributions from the related temporary accounts. The feature looks up all the IPs associated with a given temporary account within the data retention period and shows all the contributions of all temporary accounts that have used these IPs. [[mw:Special:MyLanguage/Trust and Safety Product/Temporary Accounts#February 2026: Improvements to the patroller tooling|Learn more]].</span> [https://phabricator.wikimedia.org/T415674]
* <span lang="en" dir="ltr" class="mw-content-ltr">When editors preview a wikitext edit, the reminder box that they are only seeing a preview (which is shown at the top), now has a grey/neutral background instead of a yellow/warning background. This makes it easier to distinguish preview notes from actual warnings (for example, edit conflicts or problematic redirect targets), which will now be shown in separate warning or error boxes.</span> [https://phabricator.wikimedia.org/T414742]
* <span lang="en" dir="ltr" class="mw-content-ltr">The [[m:Special:GlobalWatchlist|Global Watchlist]] lets you view your watchlists from multiple wikis on one page. The [[mw:Special:MyLanguage/Extension:GlobalWatchlist|extension]] continues to improve — it now properly supports more than one Wikibase site, for example both [[d:|Wikidata]] and [[testwikidata:|testwikidata]]. In addition, issues regarding text direction have been fixed for users who prefer Wikidata or other Wikibase sites in right-to-left (RTL) languages.</span> [https://phabricator.wikimedia.org/T415440][https://phabricator.wikimedia.org/T415458]
* <span lang="en" dir="ltr" class="mw-content-ltr">The automatic "magic links" for ISBN, RFC, and PMID numbers have been [[mw:Special:MyLanguage/Help:Magic links|deprecated in wikitext since 2021]] due to inflexibility and difficulties with localization. Several wikis have successfully replaced RFC and PMID magic links with equivalent external links, but a template was often required to replace the functionality of the ISBN magic link. There is now a new [[mw:Special:MyLanguage/Help:Magic words#isbn|built-in parser function]] <code dir=ltr><nowiki>{{#isbn}}</nowiki></code> available to replace the basic functionality of the ISBN magic link. This makes it easier for wikis who wish to migrate off of the deprecated magic link functionality to do so.</span> [https://phabricator.wikimedia.org/T145604]
* <span lang="en" dir="ltr" class="mw-content-ltr">Two new wikis have been created:</span>
** <span lang="en" dir="ltr" class="mw-content-ltr">a {{int:project-localized-name-group-wikipedia}} in [[d:Q35401|Jju]]</span> ([[w:kaj:|<code>w:kaj:</code>]]) [https://phabricator.wikimedia.org/T413283]
** <span lang="en" dir="ltr" class="mw-content-ltr">a {{int:project-localized-name-group-wikipedia}} in [[d:Q1186896|Nawat]]</span> ([[w:ppl:|<code>w:ppl:</code>]]) [https://phabricator.wikimedia.org/T413273]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]].
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* <span lang="en" dir="ltr" class="mw-content-ltr">A new global user group has been created: [[{{int:grouppage-local-bot}}|{{int:group-local-bot}}]]. It will be used internally by the software to allow community bots to bypass rate limits that are applied to abusive [[w:en:Web scraping|web scrapers]]. Accounts that are approved as bots on at least one Wikimedia wiki will be automatically added to this group. It will not change what user permissions the bot has.</span> [https://phabricator.wikimedia.org/T415588]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.15|MediaWiki]]
'''Các cuộc họp và sự kiện'''
* <span lang="en" dir="ltr" class="mw-content-ltr">The [[mw:Special:MyLanguage/MediaWiki Users and Developers Conference Spring 2026|MediaWiki Users and Developers Conference, Spring 2026]] will be held March 25–27 in Salt Lake City, USA. This event is organized by and for the third-party MediaWiki community. You can propose sessions and register to attend.</span> [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/AZBWVI46SDEB65PGR5J6E4TYOQQEZXM7/]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/07|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W07"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 23:30, ngày 9 tháng 2 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:Quiddity (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30026671 -->
== Bản tin Kỹ thuật: Tuần 08-2026 ==
<section begin="technews-2026-W08"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/08|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* [[mw:Special:MyLanguage/Wikimedia Site Reliability Engineering|Nhóm SRE]] sẽ tiến hành dọn dẹp phiên bản [[m:Special:MyLanguage/Etherpad|Etherpad]] của Wikimedia, một trình sửa đổi trên web dành cho việc sửa đổi tài liệu cộng tác theo thời gian thực. Tất cả pad sẽ bị xóa vĩnh viễn sau ngày 30 tháng 4 năm 2026 – trường hợp nếu còn dự án vẫn đang được tiến hành di chuyển vào thời điểm đó thì nhóm có thể xem xét lại thời gian đó tùy từng trường hợp. Vui lòng tạo bản sao lưu cục bộ cho bất kỳ nội dung nào mà bạn muốn giữ lại, vì dữ liệu đã bị xóa không thể khôi phục được nữa. Việc dọn dẹp này sẽ giúp giảm bớt kích thước cơ sở dữ liệu và giảm thiểu lãng phí (dấu ấn) cơ sở hạ tầng. Etherpad sẽ tiếp tục hỗ trợ cộng tác theo thời gian thực, nhưng không kỳ vọng vào khả năng lưu trữ lâu dài. Những đợt dọn dẹp khác có thể xảy ra trong tương lai mà không cần báo trước. [https://phabricator.wikimedia.org/T415237]
'''Cập nhật cho biên tập viên'''
* Nhóm Tìm kiếm Thông tin sẽ triển khai [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|thử nghiệm trên ứng dụng di động dùng Android]] nhằm kiểm tra khả năng tìm kiếm kết hợp, có thể xử lý cả các truy vấn tìm theo ngữ nghĩa và theo từ khóa. Việc cải thiện tìm kiếm trên nền tảng này sẽ giúp người đọc dễ dàng tìm thấy những gì mà họ đang tìm kiếm hơn ngay trên Wikipedia. Thử nghiệm này sẽ bắt đầu được triển khai trước tiên là trên Wikipedia tiếng Hy Lạp vào cuối tháng 2, sau đó là các wiki tiếng Anh, tiếng Pháp và tiếng Bồ Đào Nha vào tháng 3. [https://diff.wikimedia.org/2026/01/08/semantic-search-making-it-easier-to-find-the-information-readers-want/ Đọc thêm] trên blog Diff. [https://www.mediawiki.org/wiki/Readers/Information_Retrieval]
* Nhóm Phát triển Độc giả sẽ tiến hành [[mw:Special:MyLanguage/Readers/Reader Growth/WE3.10.2 Mobile Table of Contents|một thử nghiệm]] cho người dùng web trên thiết bị di động nhằm thêm mục lục và tự động mở rộng tất cả các đề mục trong bài viết, nhằm tìm hiểu thêm về những vấn đề về điều hướng mà họ gặp phải. Thử nghiệm này sẽ có mặt trên các Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Anh, tiếng Pháp, tiếng Indonesia và tiếng Việt.
* Trước đây, các thông báo đầu trang ([[{{ns:8}}:Sitenotice]] và [[{{ns:8}}:Anonnotice]]) chỉ được hiển thị trên trang web dành cho máy tính để bàn. Giờ đây, chúng sẽ được hiển thị trên mọi nền tảng. Người dùng trên trang web di động nay sẽ thấy được những thông báo này và được thông báo. Các bảo quản viên trang web nên sẵn sàng kiểm tra và sửa các thông báo đầu trang trên các thiết bị di động để tránh xung đột với bài viết. Để từ chối, bảo quản viên giao diện có thể thêm <code dir="ltr">#siteNotice { display: none; }</code> vào [[{{ns:8}}:Minerva.css]]. [https://phabricator.wikimedia.org/T138572][https://phabricator.wikimedia.org/T416644]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:19}} {{PLURAL:19|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề trên [[Special:RecentChanges|Đặc biệt:Thay đổi gần đây]] đã được giải quyết. Trước đây, nhấn vào nút ẩn trên các bộ lọc đang được áp dụng khiến cho nút "xem những thay đổi mới từ…" biến mất, dù nó đáng lẽ phải được hiển thị. Nút này giờ đây sẽ hoạt động như mong đợi. [https://phabricator.wikimedia.org/T406339]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Hiện đã có tài liệu mới giúp biên tập viên gỡ lỗi các tính năng tìm kiếm trên trang. Nó hỗ trợ việc khắc phục sự cố khi các trang xuất hiện trong kết quả tìm kiếm, khi thứ hạng có vẻ không như mong đợi và khi bạn cần kiểm tra nội dung nào đang được lập chỉ mục, giúp việc tìm hiểu và phân tích hành vi tìm kiếm trở nên dễ dàng hơn. [[mw:Help:CirrusSearch/Debug|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T411169]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/08|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W08"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:17, ngày 16 tháng 2 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30086330 -->
== Bản tin Kỹ thuật: Tuần 09-2026 ==
<section begin="technews-2026-W09"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/09|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Tính năng [[mw:Special:MyLanguage/Edit check/Reference Check|Kiểm tra Nguồn Tham khảo]] đã được triển khai tới Wikipedia tiếng Anh, điều này có nghĩa là việc triển khai tính năng trên tất cả các trang Wikipedia đã hoàn thành. Tính năng này nhắc những người mới thêm nguồn tham khảo trước khi đăng nội dung mới, giúp giảm thiểu việc lùi sửa liên quan đến các vấn đề nguồn tham khảo phổ biến và cải thiện khả năng kiểm chứng được. Trong quá trình thử nghiệm A/B, tính năng này mang lại hiệu quả rất đáng kể: những người mới có hiển thị Kiểm tra Nguồn Tham khảo có khả năng thêm nguồn tham khảo cao hơn khoảng 2,2 lần trên trang web dành cho máy tính và cao hơn khoảng 17,5 lần trên trang web dành cho di động. [https://analytics.wikimedia.org/published/reports/editing/reference_check_ab_test_report_final_2025.html]
'''Cập nhật cho biên tập viên'''
* [[mw:Special:MyLanguage/Extension:InterwikiSorting|Phần mở rộng InterwikiSorting]], một phần mở rộng cho phép [[m:Special:MyLanguage/Interwiki sorting order|sắp xếp các liên kết liên wiki]], đã bị gỡ bỏ khỏi Wikipedia. Do đó, những biên tập viên đã bật tính năng sắp xếp liên kết liên wiki ở chế độ không rút gọn (định dạng danh sách đầy đủ) sẽ thấy được rằng các liên kết được sắp xếp lại. Các liên kết từ nay trở đi sẽ được liệt kê theo thứ tự bảng chữ cái dựa trên mã ngôn ngữ. [https://phabricator.wikimedia.org/T253764]
* Cuối tuần này, người dùng sửa đổi một đề mục của trang bằng cách sử dụng trình soạn thảo trực quan trên thiết bị di động, sẽ nhìn thấy một nút mới có tên "Sửa đổi toàn bộ trang". Khi chạm vào nút đó, bạn sẽ có thể sửa đổi toàn bộ bài viết. Điều này sẽ giúp ích khi thay đổi bạn muốn thực hiện nằm ngoài đề mục mà bạn mở ban đầu. [https://phabricator.wikimedia.org/T387175][https://phabricator.wikimedia.org/T409112]
* [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] đang mời các biên tập viên đánh giá xem chế độ tối có nên tiếp tục được coi là ở giai đoạn "thử nghiệm" (beta) trên wiki của họ hay không, dựa trên kinh nghiệm của họ về mức độ hoạt động tốt hay không của chế độ này trên máy tính và thiết bị di động. Nếu tính năng này được đánh giá là hoàn thiện rồi, thì các biên tập viên có thể cập nhật các thông báo giao diện trong <code dir=ltr>MediaWiki:skin-theme-description</code> và <code dir=ltr>MediaWiki:Vector-night-mode-beta-tag</code> để cho biết rằng chế độ tối đã sẵn sàng và không còn được coi là trong giai đoạn thử nghiệm nữa.
* [[mw:Wikimedia_Apps/Team/iOS/Activity_Tab|Tab Hoạt động]] được cải tiến mà hiển thị thông tin chuyên sâu về người dùng nay có sẵn cho tất cả người dùng ứng dụng Wikipedia trên (phiên bản 7.9.0 trở lên). Sau quá trình thử nghiệm A/B trước đây cho thấy tỷ lệ tạo tài khoản trong số những người dùng có quyền truy cập vào tính năng này cao hơn, tính năng này đã được triển khai cho 100% người dùng kèm vài cập nhật. Tab Hoạt động nay hiển thị các bài viết bạn đã sửa đổi trên dòng thời gian, cung cấp thông tin chi tiết về tác động của việc sửa đổi chẳng hạn như số lượng đóng góp và xu hướng xem bài viết, cùng những tùy chọn tùy chỉnh để cải thiện trải nghiệm dành cho người dùng trong ứng dụng.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:21}} {{PLURAL:21|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho [[mw:Special:MyLanguage/Extension:DiscussionTools|Công cụ Thảo luận (DiscussionTools)]] không thể hoạt động trên thiết bị di động, từ đó khôi phục đầy đủ tất cả chức năng. [https://phabricator.wikimedia.org/T415303]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi từ nhiều wiki trên cùng một trang. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] giúp thực hiện được điều này tiếp tục được cải tiến. Cải tiến mới nhất là việc bổ sung [[mw:Extension:GlobalWatchlist#hook|hook mới]], <code dir=ltr>ext.globalwatchlist.rebuild</code>, được kích hoạt sau mỗi lần xây dựng lại danh sách theo dõi. Điều này cho phép bạn chạy các tiện ích và đoạn mã người dùng cho trang Đặc biệt. [https://phabricator.wikimedia.org/T275159]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.17|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/09|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W09"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:03, ngày 23 tháng 2 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30119102 -->
== Bản tin Kỹ thuật: Tuần 10-2026 ==
<section begin="technews-2026-W10"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/10|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments|Chế độ Sinh nhật]] Wikipedia 25 nay đã có mặt trên các trang Wikipedia tiếng Betawi, tiếng Breton, tiếng Trung, tiếng Séc, tiếng Hà Lan, tiếng Anh, tiếng Pháp, tiếng Gorontalo, tiếng Indonesia, tiếng Ý, tiếng Luxembourg, tiếng Madura, tiếng Sicilia, tiếng Tây Ban Nha, tiếng Thái và tiếng Việt! Tính năng chiến dịch hữu hạn này kỷ niệm 25 năm thành lập Wikipedia cùng linh vật cho ngày sinh nhật, Quả cầu Nhỏ (Baby Globe). Khi được bật, Quả cầu Nhỏ được hiển thị trên [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments/article configuration|~2,500 bài viết]], chờ người đọc khám phá. Cộng đồng có thể chọn bật chế độ Sinh nhật bằng cách đạt đồng thuận từ cộng đồng của mình và yêu cầu một bảo quản viên bật tính năng đó cũng như tùy chỉnh nó thông qua [[m:Special:MyLanguage/Wikipedia 25/Easter egg experiments#Community Configuration Demo|cấu hình cộng đồng]] trên wiki cục bộ.
'''Cập nhật cho biên tập viên'''
* [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Tham chiếu phụ (sub-referencing)]], một tính năng mới để tái sử dụng nguồn tham khảo với những chi tiết khác đã được triển khai tới Wikipedia tiếng Thụy Điển, Wikipedia tiếng Ba Lan và [[:phab:T418209|một vài trang wiki khác]]. Bạn có thể [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#test|thử tính năng này]] trên những dự án đó hoặc trên testwiki và [https://en.wikipedia.beta.wmcloud.org/wiki/Sub-referencing betawiki]. Kinh nghiệm từ wiki thí điểm đầu tiên Wikipedia tiếng Đức đã được [[:m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing/Learnings|công bố trong báo cáo]]. Hãy liên hệ với nhóm Wikimedia Deutschland nếu bạn [[:m:Talk:WMDE Technical Wishes/Sub-referencing#Pilot wikis|quan tâm đến việc trở thành một wiki thí điểm]].
* [[mw:Special:MyLanguage/Help:Edit check#Paste check|Kiểm tra Chép dán]] (Paste Check) sẽ có mặt trên mọi trang Wikipedia trong tuần này. Tính năng này nhắc những người mới dán các đoạn văn bản mà họ không chắc viết vào Trình Soạn thảo Trực quan cân nhắc xem làm như thế có nguy cơ vi phạm bản quyền hay không. Kiểm tra Chép dán [[mw:Special:MyLanguage/Edit check/Tags|gắn thẻ]] tất cả sửa đổi mà nó hiển thị để có thể xem xét tiếp. Các bảo quản viên cục bộ có thể thiết lập cấu hình cho các khía cạnh khác nhau của tính năng này thông qua [[{{#special:EditChecks}}]]. [[mw:Special:MyLanguage/Edit check/Paste Check#A/B Experiment|Nghiên cứu]] trên 22 wiki cho thấy Kiểm tra Chép dán giúp giảm 18% số lượng sửa đổi bị lùi lại wikis found that so với nhóm đối chứng. Các biên dịch viên có thể [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-visualeditor-ve-mw-editcheck&filter=&optional=1&action=translate giúp biên dịch] tính năng này cùng những tính năng có liên quan.
* [[mw:Special:MyLanguage/Readers/Reader Experience|Nhóm Trải nghiệm Người đọc]] sẽ chuẩn hóa menu người dùng ở góc trên bên phải cho tất cả người dùng di động nhằm giúp nó gần giống trải nghiệm trên máy tính hơn. Hiện tại menu người dùng này chỉ hiển thị cho những người đã bật Chế độ Điều khiển Di động Nâng cao (AMC). Thay đổi duy nhất là một vài nút trước đây ở menu bên trái sẽ chuyển sang góc trên bên phải cho người dùng không bật chế độ AMC. Thay đổi này dự kiến được triển khai vào ngày 9 tháng 3 và nhằm mục đích cải thiện giao diện người dùng. [https://phabricator.wikimedia.org/T413912]
* Bắt đầu từ tuần ngày 2 tháng 3, các email được gửi khi thêm, xóa hoặc sửa địa chỉ email của tài khoản sẽ chuyển sang định dạng email HTML đẹp mắt và rõ ràng hơn nhiều so với định dạng email văn bản thuần túy trước đây. [https://phabricator.wikimedia.org/T410807]
* Thông báo hiện chỉ giới hạn lưu 2.000 mục lịch sử cho mỗi người dùng, điều này kéo dài trở về năm 2013 khi tính năng này mới được phát hành. Giờ nó sẽ thay đổi thành việc lưu các Thông báo trong 5 năm trở lại đây, nhưng mở rộng lên tối đa 10.000 mục. Điều này sẽ giúp bảo vệ cơ sở hạ tầng và giúp ngăn việc những thông báo xuất hiện gần đây hơn biến mất quá sớm. [https://phabricator.wikimedia.org/T383948]
* [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]] cho phép bạn xem các danh sách theo dõi của bạn từ nhiều wiki khác nhau trên cùng một trang tiếp tục được cải tiến. Lần cập nhật gần đây nhất cải thiện trải nghiệm sử dụng nhãn. [[mw:Special:MyLanguage/Extension:GlobalWatchlist|Phần mở rộng]] nay cho phép kích hoạt [[mw:Special:MyLanguage/Manual:Language#Fallback languages|hệ thống ngôn ngữ dự phòng]] cho các khoản mục Wikidata không có nhãn bằng ngôn ngữ được xem, đồng thời hiển thị những nhãn đó trong ngôn ngữ Wikidata yêu thích của người dùng nếu không cung cấp tham số URL <code dir=ltr>uselang=</code>. [https://phabricator.wikimedia.org/T373686][https://phabricator.wikimedia.org/T416111]
* Nhóm Wikipedia dành cho Android đã bắt đầu cuộc thử nghiệm beta cho tính năng [[mw:Special:MyLanguage/Readers/Information Retrieval/Phase 1|tìm kiếm kết hợp]] (hybrid search) trên Wikipedia tiếng Hy Lạp. Khả năng tìm kiếm kết hợp có thể xử lý cả truy vấn ngữ nghĩa và từ khóa giúp người đọc dễ dàng tìm kiếm những gì họ muốn tìm kiếm ngay trên Wikipedia hơn.
* Vì lý do bảo mật, thành viên của một vài nhóm người dùng nhất định [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|bắt buộc phải bật tính năng xác thực hai yếu tố]] (2FA). Hiện tại, 2FA bắt buộc phải được bật để sử dụng nhóm người dùng, nhưng không cần phải là để trở thành thành viên nhóm đó. Do mô hình này vẫn còn một vài lỗ hổng, tình hình này sẽ [[phab:T418580|dần dần thay đổi vào tháng 3]]. Các thành viên thuộc những nhóm người dùng đó sẽ không thể tắt phương thức 2FA cuối cùng có trên tài khoản của họ, và sẽ không thể thêm người dùng không dùng 2FA vào những nhóm này. Người dùng vẫn sẽ có thể thêm phương thức xác thực mới hoặc loại bỏ chúng, miễn là còn ít nhất một phương thức được bật. Trong khoảng nửa sau của tháng 3, những người dùng mà không có 2FA sẽ bị loại bỏ khỏi những nhóm này. Điều này áp dụng cho: Bảo quản viên Thông báo Trung ương, kiểm định viên, bảo quản viên giao diện, giám sát viên, nhân viên Wikidata, nhân viên Wikifunctions, bộ phận CNTT của Văn phòng WMF và bộ phận Tin cậy & An toàn của and WMF. Sẽ không có gì thay đổi với những người dùng khác. Xem tác vụ được liên kết để biết khung thời gian triển khai. [https://phabricator.wikimedia.org/T418580]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:27}} {{PLURAL:27|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề ngăn người dùng tạo một phiên bản trong [https://www.wikibase.cloud/ Wikibase.cloud] hiện đã được giải quyết. [https://phabricator.wikimedia.org/T416807]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Để giúp đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng cơ sở hạ tầng một cách hợp lý]], trong tháng tới Quỹ Wikimedia sẽ triển khai giới hạn truy cập API toàn cục trên tất cả các API của chúng tôi. Vào đầu tháng 3, các giới hạn nghiêm ngặt hơn sẽ được áp dụng cho các yêu cầu không xác định từ bên ngoài Toolforge/WMCS và các yêu cầu API được thực hiện từ các trình duyệt web. Vào tháng 4, những giới hạn cao hơn sẽ được áp dụng cho lưu lượng truy cập được xác định. Những giới hạn này được cố ý đặt ở mức cao nhất có thể nhằm giảm thiểu tác động đến cộng đồng. Các bot chạy trong Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào sẽ không bị ảnh hưởng vào lúc này. Tuy vậy, mọi nhà phát triển được khuyến cáo làm theo những lời khuyên thực tiễn được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn truy cập]].
* Điểm cuối Truy vấn Dữ liệu được Liên kết (LDF) của Dịch vụ Truy vấn Wikidata sẽ ngừng hoạt động vào tháng 2. Điểm cuối này phục vụ lưu lượng truy cập hạn chế, lưu lượng này đã được chuyển đổi thành công sang các phương thức truy cập dữ liệu khác phù hợp hơn để hỗ trợ các trường hợp sử dụng (use case) hiện có. Phần cứng được sử dụng để hỗ trợ điểm cuối LDF sẽ được phân bổ lại để hỗ trợ những nỗ lực chuyển đổi hệ thống backend đang diễn ra. [https://phabricator.wikimedia.org/T415696]
* Trình phân tích cú pháp Parsoid mới [[mw:Special:MyLanguage/Parsoid/Parser Unification/Updates|tiếp tục được triển khai đến nhiều wiki hơn]], nhằm cải thiện tính bền vững của nền tảng và giúp việc giới thiệu các tính năng đọc và sửa đổi mới trở nên dễ dàng hơn. Parsoid nay là trình phân tích cú pháp mặc định trên 488 trang wiki của WMF (268 trang Wikipedia), hiện chiếm hơn 10% tổng số lượt xem trang Wikipedia.
* Quy trình và tiêu chí để [[Special:MyLanguage/Wikimedia Enterprise#Access|yêu cầu quyền truy cập đặc biệt]] vào nguồn cấp dữ liệu khối lượng lớn của API ''Wikimedia Enterprise'' (miễn phí cho các trường hợp sử dụng phù hợp với nhiệm vụ), [[m:Talk:Wikimedia Enterprise#Exceptional access criteria|hiện đã được công bố]]. Điều này nhằm cung cấp tài liệu đầy đủ và rõ ràng hơn cho người dùng.
* [https://techblog.wikimedia.org/ Blog Kỹ thuật], một blog dành riêng cho cộng đồng kỹ thuật Wikimedia [https://techblog.wikimedia.org/2026/02/24/a-tech-blog-diff/ sẽ được chuyển] sang [[diffblog:|Diff]], blog tin tức và sự kiện cộng đồng. Việc chuyển đổi dự kiến sẽ được hoàn thành vào tháng 4 năm 2026, sau thời điểm này các bài viết mới sẽ được chấp nhận xuất bản. Người đọc sẽ có thể truy cập các bài đăng – cả bài cũ và mới – trên trang đích này tại https://diff.wikimedia.org/techblog.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.18|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/10|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W10"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 17:51, ngày 2 tháng 3 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30137798 -->
== Bản tin Kỹ thuật: Tuần 11-2026 ==
<section begin="technews-2026-W11"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/11|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* [[m:Special:MyLanguage/Tech/Server switch|Tất cả các wiki sẽ chuyển sang chế độ chỉ đọc trong vòng vài phút]] vào thứ 4, ngày 25 tháng 3 năm 2026 lúc [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. Điều này là nhằm phục vụ cho việc thử nghiệm chuyển đổi máy chủ cơ sở dữ liệu dự phòng, [[wikitech:Deployments/Yearly calendar|diễn ra hai lần trong một năm]]. Trong quá trình chuyển đổi này, toàn bộ lưu lượng trên các trang web của Wikimedia được chuyển từ trung tâm dữ liệu chính sang trung tâm dữ liệu dự phòng nhằm kiểm tra tính khả dụng và ngăn ngừa việc gián đoạn dịch vụ ngay cả trong những trường hợp khẩn cấp.
* Tuần trước, tất cả các wiki đều bị giới hạn ở chế độ chỉ đọc trong vòng 2 giờ đồng hồ, cùng với đó các đoạn mã người dùng và tiện ích cũng không khả dụng trong thời gian được kéo dài. Điều này là do một sự cố bảo mật mà đã được khắc phục sau đó. Chúng tôi đang tiếp tục cố gắng để ngăn điều này tái diễn. Để cập nhật thông tin vui lòng xem [[m:Steward's noticeboard#Statement on Meta about today's user script security incident|bài đăng trên bảng tin của Nhân viên]] ([[m:Special:MyLanguage/Wikimedia Foundation/Product and Technology/Product Safety and Integrity/March 2026 User Script Incident|bản dịch]]).
'''Cập nhật cho biên tập viên'''
* Người dùng đang gặp phải nhiều lệnh cấm trên thiết bị di động nay sẽ thấy lý do cấm cho từng lần cấm riêng thay vì một thông báo chung chung. Điều này giúp họ hiểu tại sao mình bị cấm và cần thực hiện những bước nào để giải quyết vấn đề. Ví dụ, người dùng bị ảnh hưởng do sử dụng VPN phổ biến (chẳng hạn như [[Special:MyLanguage/Apple iCloud Private Relay|iCloud Private Relay]]) sẽ nhận được hướng dẫn rõ ràng hơn những việc cần làm để bắt đầu lại việc sửa đổi. [https://phabricator.wikimedia.org/T357118]
* Cuối tuần này, [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Chế độ Đề xuất]] sẽ được cung cấp dưới dạng tính năng beta trong trình soạn thảo trực quan trên tất cả các trang Wikipedia. Tính năng này chủ động đề xuất nhiều loại hành động mà người dùng có thể cân nhắc thực hiện để cải thiện các bài viết trên Wikipedia, đồng thời tìm hiểu về các hướng dẫn có liên quan. Tính năng này có thể được cấu hình cục bộ và cũng có thể được mở rộng cục bộ với bằng việc tùy chỉnh Đề xuất. Cài đặt hiện tại có thể xem được tại trang [[Special:EditChecks]] và có [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators %E2%80%93 local customization|hướng dẫn cách bảo quản viên có thể tùy chỉnh]] các liên kết để chỉ tới những trang hướng dẫn cục bộ. Tính năng này được kết nối với tính năng [[mw:Special:MyLanguage/Help:Edit check|Kiểm tra sửa đổi]], một tính năng đưa ra đề xuất cải thiện trong khi người nào đó viết nội dung mới. Trong tương lai, nhóm Sửa đổi dự kiến đánh giá tác động của tính năng này đối với người dùng mới thông qua một thử nghiệm có kiểm soát. [https://phabricator.wikimedia.org/T404600]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố liên quan đến việc con trỏ bị lệch khi sử dụng tính năng tô sáng cú pháp của CodeMirror, một tính năng giúp mã wiki (wikitext) và mã code dễ đọc hơn, nay đã được giải quyết. Vấn đề này đặc biệt ảnh hưởng đến những người dùng đã định nghĩa quy tắc phông chữ trong stylesheet tùy chỉnh khi tạo chủ đề mới bằng Công cụ Thảo luận. [https://phabricator.wikimedia.org/T418793]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Cập nhật về giới hạn truy vấn API: Để giúp đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng hợp lý cơ sở hạ tầng]], giới hạn truy vấn API toàn cục sẽ được áp dụng trong tuần này cho các yêu cầu không có User-Agent hợp lệ bắt nguồn từ bên ngoài Toolforge/WMCS cùng các yêu cầu chưa được xác thực được thực hiện từ trình duyệt web. Trong tháng 4 tới sẽ thiết lập giới hạn cao hơn cho lưu lượng truy cập được xác định. Các bot chạy trên Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào hiện sẽ không bị ảnh hưởng vì điều này. Tuy vậy, mọi nhà phát triển được khuyến cáo nên tuân theo những hướng dẫn thực tiễn tốt nhất được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn truy vấn]].
* API GraphQL mới đã được phát hành. API này được phát triển như một giải pháp thay thế linh hoạt cho một số tính năng nhất định của Dịch vụ Truy vấn Wikidata (WDQS), nhằm cải thiện trải nghiệm và khả năng thích ứng của nhà phát triển, đồng thời giúp truy cập dữ liệu hiệu quả. Hãy dùng thử và [[d:Wikidata:Wikibase GraphQL#Feedback and development|gửi phản hồi]] của mình. Bạn cũng có thể [https://greatquestion.co/wikimediadeutschland/GraphQLAPI/apply đăng ký tham gia các bài kiểm tra về khả năng sẵn dùng].
* Vào tháng 2 [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group|Nhóm Làm việc cho Công cụ Không được Hỗ trợ PTAC]] đã tiếp tục cải tiến [[commons:Special:MyLanguage/Commons:Video2commons#|Video2Commons]], trong đó sửa các lỗi liên quan đến lỗi xác thực, xử lý tệp lớn, khả năng hiển thị hàng đợi tác vụ và làm rõ hơn hành vi tải lên. Hiện một số lĩnh vực vẫn đang được tiến hành thực hiện, trong đó có những thay đổi liên quan đến việc tải lên từ phía máy chủ đã lỗi thời. Hãy đọc [[m:Special:MyLanguage/Product and Technology Advisory Council/Unsupported Tools Working Group#February 2026|phần cập nhật này]] để tìm hiểu thêm.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.19|MediaWiki]]
'''Chuyên sâu'''
* Nhóm Hướng dẫn Bài viết mời các biên tập viên Wikipedia có kinh nghiệm từ một số [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators#Collaborators|wiki thí điểm]] được chọn cùng những người đóng góp có quan tâm từ các trang Wikipedia khác điền vào bảng câu hỏi này, có sẵn bằng [https://docs.google.com/forms/d/e/1FAIpQLSfmLeVWnxmsCbPoI_UF2jyRcn73WRGWCVPHzerXb4Cz97X_Ag/viewform tiếng Anh], [https://docs.google.com/forms/d/e/1FAIpQLSd6rzr4XXQw8r4024fE3geTPFe13M_6w7Mitj-YJi0sOlWTAw/viewform?usp=header tiếng Ả Rập], [https://docs.google.com/forms/d/e/1FAIpQLSdok3-RfB18lcugYTUMGkpwmqG_8p760Wv4dCXitOXOszjUDw/viewform?usp=header tiếng Bengali], [https://docs.google.com/forms/d/e/1FAIpQLSfjTfYp4jEo0akA4B1e-Nfg3QZPCudUjhJzHzzDi6AHyAaMGA/viewform?usp=header tiếng Nhật], [https://docs.google.com/forms/d/e/1FAIpQLScteVoI29Aue4xc72dekk-6RYtvmMgQxzMI900UOawrFrSTWg/viewform?usp=header tiếng Bồ Đào Nha], [https://docs.google.com/forms/d/e/1FAIpQLSetdxnYwL3ub2vqA7awCg5hJZPMIYcDPaiTe12rY9h0GYnVlw/viewform?usp=header tiếng Ba Tư] và [https://docs.google.com/forms/d/e/1FAIpQLScNvfJF-Ot-4pzA4qAN771_0QDJ4Li19YcUsaTgSKW8Nc7U_Q/viewform?usp=header tiếng Thổ Nhĩ Kỳ]. Phản hồi của bạn sẽ giúp nhóm tùy chỉnh hướng dẫn cho các biên tập viên ít kinh nghiệm hơn và giúp họ tìm hiểu các chính sách và thực tiễn của cộng đồng khi tạo bài viết. Tìm hiểu thêm [[mw:Special:MyLanguage/Article guidance|trên trang dự án]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/11|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W11"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:53, ngày 9 tháng 3 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30213008 -->
== Bản tin Kỹ thuật: Tuần 12-2026 ==
<section begin="technews-2026-W12"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/12|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], còn được biết đến với tên [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], được sử dụng để tô sáng cú pháp mã wiki kể từ tháng 11 năm 2024. Tính năng này sẽ chính thức kết thúc giai đoạn thử nghiệm beta vào tháng 5 năm 2026 nhằm đưa những cải tiến và [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Features|tính năng]] mới cho tất cả biên tập viên sử dụng trình tô sáng cú pháp tiêu chuẩn. Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào về việc kết thúc giai đoạn thử nghiệm beta cho tính năng này, [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|vui lòng chia sẻ với chúng tôi]]. [https://phabricator.wikimedia.org/T259059]
* Một số thay đổi đối với quyền nhóm người dùng cục bộ được tiếp viên trên Meta-Wiki thực hiện và nhật trình về những thay đổi này chỉ được ghi lại trên đó. Giờ đây, thay đổi về quyền liên wiki sẽ được ghi lại trên cả Meta-Wiki và wiki của người dùng mục tiêu để giúp dễ dàng truy cập vào toàn bộ bản ghi thay đổi quyền người dùng trên wiki cục bộ hơn. Những mục nhật trình trước đây về những thay đổi này sẽ được cập nhật trong những tuần tiếp theo. [https://phabricator.wikimedia.org/T6055]
* Trên các wiki sử dụng [[m:Special:MyLanguage/Flagged Revisions|Thay đổi Được gắn cờ (Flagged Revisions)]], số lượng thay đổi đang chờ được hiển thị trên [[{{#Special:PendingChanges}}]] trước đây tính cả những trang mà không còn ở trong trạng thái đang chờ xem xét, do chúng đã bị xóa khỏi hệ thống mà không được xem xét lại, v.d. do bị xóa, được di chuyển sang không gian tên khác, hoặc do thay đổi cấu hình wiki. Bộ đếm giờ sẽ được hiển thị chính xác. Trên một số wiki số lượng thay đổi được hiển thị sẽ nhỏ hơn nhiều so với trước đây. Bản thân danh sách các trang sẽ không có thay đổi gì. [https://phabricator.wikimedia.org/T413016]
* Ngôn ngữ soạn thảo của Wikifunctions đã được viết lại, tạo ra một phiên bản mới của ngôn ngữ này. Thay đổi này nhằm mục đích tăng cường tính ổn định của dịch vụ bằng cách giảm mức tiêu thụ bộ nhớ của trình điều phối. Việc viết lại này cũng giúp cho phép giảm đáng kể độ trễ, đơn giản hóa mã nguồn và tạo ra các lớp trừu tượng tốt hơn, nhằm mở ra cơ hội bổ sung thêm các tính năng khác trong tương lai. Đọc thêm về [[f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-11|các thay đổi này]].
* Người dùng nay có thể sắp xếp kết quả tìm kiếm theo thứ tự bảng chữ cái dựa trên tiêu đề trang. Lần cập nhật này cung cấp thêm một tùy chọn giúp cho việc tìm kiếm trang trở nên dễ dàng và nhanh chóng hơn. Trước đây, kết quả có thể được sắp xếp theo Ngày sửa đổi, Ngày tạo, hoặc Mức độ liên quan. Để sử dụng tùy chọn mới này, hãy mở 'Tìm kiếm nâng cao' trên trang kết quả tìm kiếm và chọn 'Thứ tự bảng chữ cái' trong mục 'Thứ tự sắp xếp'. [https://phabricator.wikimedia.org/T403775]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:28}} {{PLURAL:28|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến cho Trình tải lên tập tin (UploadWizard) trên Wikimedia Commons không thể nhập tập tin từ Flickr nay đã được giải quyết. [https://phabricator.wikimedia.org/T419263]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Một trang đặc biệt mới, [[{{#special:LintTemplateErrors}}]], đã được tạo ra để liệt kê các trang nhúng được đánh dấu là chứa lỗi lint để giúp người dùng dễ dàng phát hiện chúng hơn. Danh sách được sắp xếp theo số lượng các trang được nhúng mà có lỗi. Ví dụ: [[{{#special:LintTemplateErrors}}/night-mode-unaware-background-color]]. [https://phabricator.wikimedia.org/T170874]
* Người dùng tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] hiện đang sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] để tô sáng cú pháp khi sửa đổi các trang nội dung JavaScript, CSS, JSON, Vue và Lua, trong một khoảng thời gian. Cùng với việc kết thúc thử nghiệm beta cho CodeMirror 6, kế hoạch là thay thế CodeEditor để trở thành trình soạn thảo tiêu chuẩn cho những kiểu nội dung này vào tháng 5 năm 2026. [[mw:Special:MyLanguage/Help talk:Extension:CodeMirror|Mọi phản hồi hoặc ý kiến đóng góp đều được hoan nghênh]]. [https://phabricator.wikimedia.org/T419332]
* Các mô đun JavaScript cho [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] JavaScript sẽ sớm được nâng cấp lên CodeMirror 6. Trước thời điểm nâng cấp này, việc tải các mô đun <code dir=ltr>ext.CodeMirror</code> hoặc <code dir=ltr>ext.CodeMirror.lib</code> từ các tiện ích và đoạn mã người dùng đã bị loại bỏ vào tháng 7 năm 2025. Việc sử dụng hook <code dir=ltr>ext.CodeMirror.switch</code> cũng đã bị loại bỏ vào tháng 3 năm 2025. Những người đóng góp nay có thể làm cho các đoạn mã hoặc tiện ích của mình tương thích với CodeMirror 6. Xem [[mw:Special:MyLanguage/Extension:CodeMirror#Gadgets and user scripts|hướng dẫn chuyển đổi]] để biết thêm thông tin. [https://phabricator.wikimedia.org/T373720]
* Nhóm Giao diện MediaWiki đang mở rộng phạm vi định nghĩa mô đun API REST để bao gồm cả [[mw:Special:MyLanguage/API:REST API/Extensions|các API mở rộng]]. Mô đun API REST là nhóm các điểm cuối có liên quan mà có thể được quản lý và đánh phiên bản độc lập. Hiện đã có các mô đun cho API [https://phabricator.wikimedia.org/T414470 GrowthExperiments] và [https://phabricator.wikimedia.org/T419053 Wikifunctions]. Khi chúng tôi chuyển đổi các API mở rộng sang cấu trúc này, tài liệu sẽ được chuyển ra khỏi phần đặc tả chính cho OpenAPI của MediaWiki cùng chế độ xem REST Sandbox, và thay vào đó sẽ có thể truy cập được thông qua tùy chọn dành riêng cho mô đun trong menu thả xuống trên [https://test.wikipedia.org/wiki/Special:RestSandbox REST Sandbox] (nghĩa là, [[{{#Special:RestSandbox}}]], có sẵn trên tất cả các dự án wiki).
* Phần mở rộng [[mw:Special:MyLanguage/Extension:Scribunto|Scribunto]] cung cấp nhiều thông tin khác nhau về wiki nơi mô đun đang được sử dụng thông qua thư viện [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual|mw.site]]. Kể từ tuần trước, thư viện này cũng cung cấp một [[mw:Special:MyLanguage/Extension:Scribunto/Lua reference manual#mw.site.wikiId|cách]] truy cập [[mw:Special:MyLanguage/Manual:Wiki ID|ID của wiki]] có thể được sử dụng để hỗ trợ bảo trì mô đun liên wiki. [https://phabricator.wikimedia.org/T146616]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.20|MediaWiki]]
'''Chuyên sâu'''
* [[m:Special:MyLanguage/Coolest Tool Award|Giải thưởng Công cụ Tuyệt vời nhất năm 2026]] nhằm tôn vinh những công cụ xuất sắc do cộng đồng tạo ra, nay đã mở nhận đề cử! Hãy đề cử công cụ yêu thích của bạn bằng cách sử dụng biểu mẫu [https://wikimediafoundation.limesurvey.net/435684?lang=en khảo sát đề cử] trước ngày 23 tháng 3 năm 2026. Để biết thêm thông tin về quyền riêng tư và xử lý dữ liệu, vui lòng xem [[foundation:Special:MyLanguage/Legal:Coolest_Tool_Award_2026_Survey_Privacy_Statement|tuyên bố về quyền riêng tư của khảo sát]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/12|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W12"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:35, ngày 16 tháng 3 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30260505 -->
== Bản tin Kỹ thuật: Tuần 13-2026 ==
<section begin="technews-2026-W13"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/13|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Người dùng các trang Wikimedia nay có thể đăng nhập mà không cần mật khẩu bằng cách sử dụng khóa truy cập (passkey). Đây là một phương thức bảo mật sử dụng vân tay, nhận diện khuôn mặt hoặc mã PIN. Với thay đổi này, tất cả người dùng chọn đăng nhập không cần mật khẩu sẽ có thể đăng nhập vào tài khoản của mình một cách dễ dàng, nhanh chóng và an toàn hơn trên mọi thiết bị. Tùy chọn đăng nhập mới bằng khóa truy cập hiện hiển thị dưới dạng gợi ý tự động điền trong trường tên người dùng. [[phab:T417120|Nút "Đăng nhập bằng khóa truy cập"]] bổ sung sẽ sớm được cung cấp cho những người dùng đã bật tùy chọn sử dụng khóa truy cập. Lần cập nhật này sẽ cải thiện bảo mật cũng như trải nghiệm người dùng. [[c:File:Passwordless_login_screencast.webm|Bản ghi lại màn hình]] này sẽ minh họa từng bước quy trình đăng nhập không cần mật khẩu.
* [[m:Special:MyLanguage/Tech/Server switch|Tất cả các wiki sẽ chuyển sang chế độ chỉ đọc trong vòng vài phút]] vào thứ 4, ngày 25 tháng 3 năm 2026 lúc [https://zonestamp.toolforge.org/1774450800 15:00 UTC]. Điều này là nhằm phục vụ cho việc thử nghiệm chuyển đổi máy chủ cơ sở dữ liệu dự phòng, [[wikitech:Deployments/Yearly calendar|diễn ra hai lần trong một năm]]. Trong quá trình chuyển đổi này, toàn bộ lưu lượng trên các trang web của Wikimedia được chuyển từ trung tâm dữ liệu chính sang trung tâm dữ liệu dự phòng nhằm kiểm tra tính khả dụng và ngăn ngừa việc gián đoạn dịch vụ ngay cả trong những trường hợp khẩn cấp.
'''Cập nhật cho biên tập viên'''
* Người dùng các trang web của Wikimedia nay có thể xuất các thông báo cách đây hơn 5 năm của mình bằng cách sử dụng [[toolforge:echo-chamber|công cụ Toolforge mới]]. Điều này sẽ đảm bảo rằng người dùng có thể giữ lại được những thông báo quan trọng và tránh bị mất chúng do việc thay đổi theo kế hoạch nhằm xóa đi các thông báo cũ hơn 5 năm, như đã thông báo trước đó. [https://phabricator.wikimedia.org/T383948]
* Các biên tập viên Wikipedia tiếng Indonesia, tiếng Thái, tiếng Thổ Nhĩ Kỳ, và tiếng Anh Đơn giản nay có thể truy cập vào Đặc biệt:Bảng điều khiển cá nhân. Đây là [[mw:Special:MyLanguage/Moderator Tools/Dashboard|phiên bản trải nghiệm sớm]] giúp các biên tập viên mới làm quen với quy trình tuần tra, giúp họ dễ dàng chuyển từ việc sửa đổi sang tham gia vào những công việc kiểm duyệt nâng cao hơn trên dự án của mình. [https://phabricator.wikimedia.org/T402647]
* Trang [[vi:Special:Block|Đặc_biệt:Cấm]] nay có hai thay đổi nhỏ về mặt giao diện. Bảo quản viên nay có thể dễ dàng thực hiện lệnh cấm vô hạn thông qua nút chọn (nút radio) chuyên dụng trong mục thời hạn. Ngoài ra, việc chọn thời hạn là vô hạn sẽ cung cấp một bộ lý do phổ biến khác để lựa chọn, nó có thể được thay đổi tại: [[MediaWiki:Ipbreason-indef-dropdown]]. [https://phabricator.wikimedia.org/T401823]
* Biên tập viên sử dụng thiết bị di động [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#Logged-out|tại một số wiki]] nay có thể nhìn thấy cải tiến về cảnh báo sửa đổi khi chưa đăng nhập, điều này là nhờ cập nhật gần đây từ nhóm Phát triển. Những thay đổi được phát hành vào tuần trước này là một phần trong những nỗ lực và thử nghiệm đang được thực hiện nhằm nâng cao [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|trải nghiệm trong việc tạo tài khoản trên thiết bị di động]] và từ đó giúp tăng cường sự tham gia của họ. [https://phabricator.wikimedia.org/T408484]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:36}} {{PLURAL:36|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một lỗi khiến người dùng web trên thiết bị di động không thể nhìn thấy thông tin cấm khi có nhiều lệnh cấm đồng thời được áp dụng đã được giải quyết. Họ giờ có thể xem được tin nhắn cho tất cả các lệnh cấm hiện đang được áp dụng cho họ khi họ truy cập Wikipedia.
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Những image (ảnh) được dựng bằng Toolforge sẽ sớm được nâng cấp lên phiên bản buildpack mới, mang đến việc hỗ trợ các phiên bản ngôn ngữ mới hơn cùng những cải tiến và sửa lỗi khác tại thượng nguồn. Nếu bạn sử dụng Dịch vụ Dựng của Toolforge, hãy xem lại [https://lists.wikimedia.org/hyperkitty/list/cloud-announce@lists.wikimedia.org/thread/EMYTA32EV2V5SQ2JIEOD2CL66YFIZEKV/ email cloud-announce] gần đây và cập nhật cấu hình bản dựng của bạn nếu cần để đảm bảo các công cụ của bạn tương thích với phiên bản mới này. [https://wikitech.wikimedia.org/w/index.php?title=Help:Toolforge/Building_container_images&oldid=2392097#Buildpack_environment_upgrade_process][https://phabricator.wikimedia.org/T380127]
* Wiki tài liệu [https://api.wikimedia.org/wiki/Main_Page Cổng API] sẽ ngừng hoạt động vào tháng 6 năm 2026. Các khóa API được tạo trên Cổng API sẽ tiếp tục hoạt động bình thường. Các điểm cuối của api.wikimedia.org sẽ dần bị loại bỏ bắt đầu từ tháng 7 năm 2026. Tài liệu trên Cổng API đang được chuyển sang [[mw:Wikimedia APIs|mediawiki.org]]. Tìm hiểu thêm trên [[wikitech:API Portal/Deprecation|trang dự án]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.21|MediaWiki]]
'''Chuyên sâu'''
* [[m:Special:MyLanguage/WMDE Technical Wishes|Nhóm Mong muốn – Kỹ thuật của WMDE]] đang xem xét cải tiến [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|tên chú thích được tạo tự động trong Trình Soạn thảo Trực quan (VisualEditor)]]. Vui lòng xem qua [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names#Proposed solutions|những giải pháp được đề xuất]] và tham gia vào [[m:Talk:WMDE Technical Wishes/References/VisualEditor automatic reference names#Request for comment|thảo luận này]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/13|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W13"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:51, ngày 23 tháng 3 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30268305 -->
== Bản tin Kỹ thuật: Tuần 14-2026 ==
<section begin="technews-2026-W14"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/14|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Phiên bản Beta của [[abstract:|Abstract Wikipedia]] một dự án Wikimedia mới không phụ thuộc ngôn ngữ, đã được khởi động vào tuần trước. Dự án cho phép các cộng đồng xây dựng các bài viết Wikipedia bằng ngôn ngữ mẹ đẻ của họ, và các thành viên khác có thể dễ dàng truy cập các bài viết đó bằng ngôn ngữ của riêng họ. Wiki này hoạt động dựa trên chỉ dẫn từ Wikifunctions và cũng dựa trên nội dung có cấu trúc từ Wikidata. [[:f:Special:MyLanguage/Wikifunctions:Status updates/2026-03-26|Đọc thêm]].
'''Cập nhật cho biên tập viên'''
* Nhóm Phát triển đang tiến hành thử nghiệm A/B để đánh giá cho một thông điệp rõ ràng hơn, thân thiện hơn với người dùng nhằm khuyến khích việc tạo tài khoản trên wiki. Hiện tại, khi người dùng di động chưa đăng nhập bắt đầu sửa đổi, họ sẽ thấy một thông báo cảnh báo khó chịu, có thể khiến cho họ có cảm giác đột ngột và nản lòng. Điều này cũng làm cho việc sửa đổi bằng tài khoản tạm thời trở thành mặc định thay vì khuyến khích việc tạo tài khoản. Thử nghiệm đang được thực hiện trên mười trang Wikipedia, bao gồm tiếng Ả Rập, tiếng Pháp, tiếng Tây Ban Nha và tiếng Đức. [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#2. Improve logged-out warning message (T415160)|Đọc thêm]].
* Nhóm Ứng dụng Wikimedia đang mời mọi người đóng góp ý kiến về [[mw:Special:MyLanguage/Wikimedia Apps/Team/Future of Editing on the Mobile Apps|việc sửa đổi trên ứng dụng Wikipedia dành cho thiết bị di động nên hoạt động như thế nào]]. Thảo luận tập trung vào việc cải thiện cách người dùng truy cập công cụ sửa đổi khi họ nhấn vào nút "Sửa đổi". Đây là một phần trong nỗ lực rộng lớn hơn nhằm chuyển đổi những người đọc mà có hứng thú với việc sửa đổi sang một con đường thân thiện hơn với người dùng để có thể bắt đầu đóng góp.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:45}} {{PLURAL:45|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố khiến việc lấy chú thích từ kho lưu trữ báo chí lớn [https://www.newspapers.com Newspapers.com] không còn hoạt động, do bị chặn trong các yêu cầu của [[mw:Special:MyLanguage/Citoid|Citoid]], nay đã được khắc phục. [https://phabricator.wikimedia.org/T419903]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.22|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/14|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W14"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:25, ngày 30 tháng 3 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30329462 -->
== Action Required: Update templates/modules for electoral maps (Migrating from P1846 to P14226) ==
Hello everyone,
This is a notice regarding an ongoing data migration on Wikidata that may affect your election-related templates and Lua modules (such as <code>Module:Itemgroup/list</code>).
'''The Change:'''<br />
Currently, many templates pull electoral maps from Wikidata using the property [[:d:Property:P1846|P1846]], combined with the qualifier [[:d:Property:P180|P180]]: [[:d:Q19571328|Q19571328]].
We are migrating this data (across roughly 4,000 items) to a newly created, dedicated property: '''[[:d:Property:P14226|P14226]]'''.
'''What You Need To Do:'''<br />
To ensure your templates and infoboxes do not break or lose their maps, please update your local code to fetch data from [[:d:Property:P14226|P14226]] instead of the old [[:d:Property:P1846|P1846]] + [[:d:Property:P180|P180]] structure. A [[m:Wikidata/Property Migration: P1846 to P14226/List|list of pages]] was generated using Wikimedia Global Search.
'''Deadline:'''<br />
We are temporarily retaining the old data on [[:d:Property:P1846|P1846]] to allow for a smooth transition. However, to complete the data cleanup on Wikidata, the old [[:d:Property:P1846|P1846]] statements will be removed after '''May 1, 2026'''. Please update your modules and templates before this date to prevent any disruption to your wiki's election articles.
Let us know if you have any questions or need assistance with the query logic. Thank you for your help! [[User:ZI Jony|ZI Jony]] using [[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 17:11, ngày 3 tháng 4 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:ZI Jony@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Non-Technical_Village_Pumps_distribution_list&oldid=29941252 -->
== Bản tin Kỹ thuật: Tuần 15-2026 ==
<section begin="technews-2026-W15"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/15|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* [[mw:Special:MyLanguage/Help:Extension:CampaignEvents|Phần mở rộng CampaignEvents]] nay có thêm tính năng mới nhằm thiết lập mục tiêu nhóm, nhằm cho phép những người tổ chức thiết lập và theo dõi mục tiêu sự kiện chẳng hạn như số lượng bài viết được tạo và số lượng người tham gia đóng góp theo thời gian thực. Tương tự, những người tham gia có thể cùng nhau hướng tới các mục tiêu chung và chứng kiến tác động tập thể của họ khi sự kiện diễn ra. Tính năng này hiện đã có trên tất cả các wiki của Wikimedia. Tìm hiểu thêm trong [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Collaborative contributions#Goal setting|trang tài liệu này]].
* [[File:Maki-gift-15.svg|12px|link=|class=skin-invert|Mục Mong muốn cộng đồng]] Tính năng [[mw:Special:MyLanguage/Help:Watchlist labels|gán nhãn danh sách theo dõi]] mới (được công bố trong [[m:Special:MyLanguage/Tech/News/2026/07|Bản tin Kỹ thuật 2026-07]]) nay có sẵn thông qua Trình Soạn thảo Trực quan, trình soạn thảo mã nguồn, và biểu tượng 'sao theo dõi' (hoặc liên kết theo dõi, đối với các giao diện không có biểu tượng hình sao). Trước đây việc gán nhãn như vậy chỉ có thể thực hiện được thông qua [[Special:EditWatchlist|EditWatchlist]]. Ở cả ba nơi đó, đây đều sẽ là trường mới ngay sau sau trường thời điểm hết hạn theo dõi.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:23}} {{PLURAL:23|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà trang thảo luận trên thiết bị di động dùng Parsoid không thể sử dụng được sau đề mục không có tiêu đề, nay đã được giải quyết. [https://phabricator.wikimedia.org/T419171]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Tính năng chú thích phụ]], một tính năng cho phép biên tập viên thêm thông tin chi tiết vào nguồn tham khảo hiện có mà không cần nhân bản nó, sẽ được triển khai dần dần tới [[phab:T414094|nhiều trang wiki hơn]] vào cuối năm nay. Các wiki sử dụng tiện ích [[mw:Special:MyLanguage/Reference Tooltips|Chú thích nổi]] được khuyến khích cập nhật phiên bản của mình (thường là tại [[m:MediaWiki:Gadget-ReferenceTooltips.js|MediaWiki:Gadget-ReferenceTooltips.js]] như được hiển thị tại [https://en.wikipedia.org/w/index.php?diff=1344408362 đây]) để đảm bảo khả năng tương thích. Các tiện ích khác liên quan đến nguồn tham khảo khác cũng có thể bị ảnh hưởng. [https://phabricator.wikimedia.org/T416304]
* Tất cả các phiên bản của Wikinews sẽ bị đóng và chuyển sang chế độ chỉ đọc vào ngày 4 tháng 5 năm 2026. Mọi nội dung vẫn sẽ có thể truy cập được, nhưng sẽ không thể thêm bất kỳ sửa đổi hoặc bài viết mới nào. Việc đóng này đã được Hội đồng Quản trị của Quỹ Wikimedia phê duyệt sau những cuộc thảo luận kéo dài. [[m:Wikimedia Foundation Board noticeboard#Board of Trustees Approves Closure of Wikinews|Đọc thêm]].
* [[:mw:Special:MyLanguage/API:Action API|API Tác vụ]] có một số kiểu định dạng đầu ra được yêu cầu. Một trong số chúng, <bdi lang="zxx" dir="ltr"><code><nowiki>format=php</nowiki></code></bdi>, sẽ sớm bị loại bỏ. Vui lòng đảm bảo rằng các tập lệnh hoặc bot của bạn sử dụng [[mw:Special:MyLanguage/API:Data formats#Output|kiểu định dạng JSON]]. Việc loại bỏ này sẽ chỉ ảnh hưởng đến một số lượng rất nhỏ các tập lệnh người dùng và bot. [https://phabricator.wikimedia.org/T118538]
* Trang [[Special:NamespaceInfo|Đặc biệt:NamespaceInfo]] nay có chứa phần viết tắt không gian tên. Ví dụ "WP" cho không gian tên "Project" ("Wikipedia") trên Wikipedia tiếng Đức. [https://phabricator.wikimedia.org/T381455]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.23|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/15|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W15"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:19, ngày 6 tháng 4 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30362761 -->
== Bản tin Kỹ thuật: Tuần 16-2026 ==
<section begin="technews-2026-W16"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/16|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Các biên tập viên có kinh nghiệm được mời tham gia [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Main_Page thử nghiệm] tính năng [[mw:Special:MyLanguage/Article guidance|Hướng dẫn bài viết]], được thiết kế để giúp các biên tập viên ít kinh nghiệm hơn tạo ra các bài viết Wikipedia có cấu trúc tốt và phù hợp với quy định. Hướng dẫn thử nghiệm [[mw:Special:MyLanguage/Article guidance/Test feature guide|có sẵn tại đây]]. Ngoài ra, sau khi xem xét [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance bản tóm tắt này], vui lòng cung cấp phản hồi trên [[mw:Talk:Article guidance|trang thảo luận của dự án]]. Dựa trên ý kiến đóng góp của bạn, tính năng này sẽ được tinh chỉnh và chuyển giao cho các trang Wikipedia thí điểm để biên dịch và điều chỉnh cho thích hợp. Hãy xem qua [[c:File:Article Guidance workflow demo - April 2026.webm|video]] giải thích về tính năng này.
'''Cập nhật cho biên tập viên'''
* Trên hầu hết các trang wiki, tất cả thành viên tự xác nhận nay có thể sử dụng trang [[Special:ChangeContentModel|Đặc biệt:ChangeContentModel]] để [[mw:Special:MyLanguage/Help:ChangeContentModel|tạo trang mới với kiểu nội dung tùy chỉnh]], chẳng hạn như danh sách gửi thông báo rộng rãi, giúp cho định dạng trang tùy chỉnh trở nên dễ tiếp cận hơn. Kiểm tra [[Special:ListGroupRights|Đặc biệt:Quyền nhóm người dùng]] để biết trạng thái trên wiki của bạn. [https://phabricator.wikimedia.org/T248294]
* Nhóm Phát triển đã khởi động một [[mw:Special:MyLanguage/Contributors/Account_Creation_Experiments|thử nghiệm tạo tài khoản]] để đánh giá xem việc thêm nút tạo tài khoản vào phần đầu trang web trên thiết bị di động có làm tăng số lượng người đăng ký tài khoản mới và khuyến khích nhiều người dùng thiết bị di động đóng góp vào wiki hay không. Thử nghiệm hiện đang được thực hiện trên Wikipedia tiếng Hindi, tiếng Indonesia, tiếng Bengali, tiếng Thái và tiếng Do Thái, và nhắm mục tiêu vào 10% người dùng web trên di động chưa đăng nhập.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:30}} {{PLURAL:30|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một sự cố có thể khiến Trình Soạn thảo Trực quan bị kẹt khi tải trên các thiết bị Windows đã tắt hiệu ứng hoạt ảnh, nay đã được giải quyết. [https://phabricator.wikimedia.org/T382856]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Kể từ cuối tuần này, {{int:group-abusefilter}} đã bật tính năng beta [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]] sẽ sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] làm trình soạn thảo tại [[Special:AbuseFilter|Đặc biệt:Bộ lọc sai phạm]]. Đây là một phần trong nỗ lực rộng lớn hơn nhằm mang lại trải nghiệm người dùng nhất quán hơn trên tất cả các trình soạn thảo. [https://phabricator.wikimedia.org/T399673][https://phabricator.wikimedia.org/T419332]
* Các công cụ và bot truy cập vào [[mw:Special:MyLanguage/Notifications/API|API Thông báo]] (<bdi lang="zxx" dir="ltr"><code><nowiki>action=query&meta=notifications</nowiki></code></bdi>) sẽ cần phải cập nhật quyền OAuth hoặc BotPassword của mình để bao gồm cả quyền truy cập vào các thông báo riêng tư. [https://phabricator.wikimedia.org/T421991]
* Do việc nâng cấp thư viện, việc liệt kê danh sách trên các trang thể loại có thể hiển thị không đúng theo thứ tự bắt đầu từ thứ Hai, ngày 20 tháng 4. Một kịch bản chuyển đổi sẽ được chạy để khắc phục điều này, và sẽ mất từ vài giờ đến vài ngày tùy thuộc vào kích thước của wiki (tối đa một tuần đối với Wikipedia tiếng Anh). [https://phabricator.wikimedia.org/T422544]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.24|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/16|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W16"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:19, ngày 13 tháng 4 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30380527 -->
== Bản tin Kỹ thuật: Tuần 17-2026 ==
<section begin="technews-2026-W17"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/17|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Nổi bật trong tuần'''
* Sau hai năm phát triển, [[mw:Special:MyLanguage/Help:Extension:CodeMirror|{{int:codemirror-beta-feature-title}}]], hay còn được biết đến với tên [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror 6]], sẽ được chính thức đưa ra khỏi giai đoạn beta vào thứ 3, ngày 21 tháng 4. Nó mang lại khả năng đọc mã nguồn và mã wiki tốt hơn, giảm thiểu lỗi đánh máy cùng những [[mw:Special:MyLanguage/Help:Extension:CodeMirror|lợi ích]] khác cho tất cả người dùng sử dụng trình tô sáng cú pháp tiêu chuẩn. Xin gửi lời cảm ơn chân thành đến tình nguyện viên [https://phabricator.wikimedia.org/p/Bhsd/ Bhsd] vì đã phát triển nhiều tính năng mới, bao gồm [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Code folding|gấp mã nguồn]], [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Autocompletion|tự động điền]], và [[mw:Special:MyLanguage/Help:Extension:CodeMirror#Linting|kiểm tra lỗi]]. [https://phabricator.wikimedia.org/T259059]
* Một bản cập nhật lớn dành cho ứng dụng Wikipedia trên iOS hiện đang được triển khai, nhằm thiết kế lại giao diện để phù hợp với thiết kế trực quan "Liquid Glass" mới nhất của Apple. [https://apps.apple.com/us/app/wikipedia/id324715238 Hãy tải phiên bản mới nhất] và khám phá bản cập nhật này.
'''Cập nhật cho biên tập viên'''
* [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|Danh sách đọc]] là một tính năng cho phép người đọc lưu các bài viết vào danh sách để đọc sau. Tính năng này hiện đang trong giai đoạn thử nghiệm beta trên Wikipedia tiếng Ả Rập, tiếng Pháp, tiếng Indonesia, tiếng Việt và tiếng Trung, và được bật mặc định cho tất cả các tài khoản mới trên tất cả các trang Wikipedia.
* Một thử nghiệm khám phá việc mở rộng [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|tính năng Xem trước Trang cho trang web di động]] sẽ được triển khai trong tuần ngày 20 tháng 4 trên các trang Wikipedia tiếng Ả Rập, tiếng Anh, tiếng Pháp, tiếng Ý, tiếng Ba Lan và tiếng Việt. Tính năng Xem trước Trang là pop-up hiển thị hình thu nhỏ kèm liên kết mở toàn bộ bài viết từ liên kết xanh, từ đó cải thiện khả năng tìm kiếm nội dung. Tính năng này hiện đã có sẵn trên máy tính để bàn và trong ứng dụng. [[m:Special:MyLanguage/List of experiments in Product and Technology#Template|Đọc thêm về thử nghiệm này cùng những thử nghiệm khác]].
* Trên một số trang wiki, những biên tập viên đã đăng nhập nhưng chưa [[mw:Special:MyLanguage/Help:Email confirmation|xác nhận địa chỉ thư điện tử (email) của mình]] nay có thể nhìn thấy một biểu ngữ khuyến khích họ làm vậy. Việc xác nhận địa chỉ email cho phép người dùng khôi phục quyền truy cập vào tài khoản nếu họ bị mất quyền truy cập đó. [[mw:Special:MyLanguage/Product Safety and Integrity/Account Security#Encouraging users to confirm their email addresses|Tìm hiểu thêm]]. [https://phabricator.wikimedia.org/T421366]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:15}} {{PLURAL:15|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề mà việc sửa đổi các trang wiki rất lớn trong trình soạn thảo mã wiki 2017 gây ra hiện tượng tải chậm, bị trễ khi xem trước và cuộn, cũng như các vấn đề về hiệu suất khi chọn, cắt hay dán nội dung, nay đã được giải quyết. [https://phabricator.wikimedia.org/T184857]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Là một phần của việc nâng cấp [[mw:Special:MyLanguage/Help:Extension:CodeMirror|CodeMirror]] từ tính năng beta lên làm tính năng chính thức, tất cả người dùng sẽ sử dụng [[mw:Special:MyLanguage/Extension:CodeMirror|CodeMirror]] thay vì [[mw:Special:MyLanguage/Extension:CodeEditor|CodeEditor]] làm trình tô sáng cú pháp khi sửa đổi các trang nội dung bằng JavaScript, CSS, JSON, Vue và Lua. [https://phabricator.wikimedia.org/T419332]
* Dịch vụ <code>mirrors.wikimedia.org</code> dành cho người dùng Debian và Ubuntu sẽ kết thúc hỗ trợ và ngừng hoạt động vào ngày 15 tháng 5. Tài nguyên dịch vụ này sẽ được thay thế bằng những tùy chọn mới và tốt hơn. Một số người dùng có thể cần phải chuyển sang máy chủ khác, quá trình này sẽ mất khoảng một phút. [https://lists.wikimedia.org/hyperkitty/list/wikitech-l@lists.wikimedia.org/thread/LJYRIS4WB66HIRCAO4GIDTXCMDVZRBMA/ Bạn có thể đọc thêm]. [https://phabricator.wikimedia.org/T416707]
* Bảng <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi> sẽ bị loại bỏ khỏi [[wikitech:Help:Wiki Replicas|wikireplicas]]. Nếu công cụ hoặc truy vấn của bạn truy cập trực tiếp vào <bdi lang="zxx" dir="ltr"><code><nowiki>image</nowiki></code></bdi> hoặc <bdi lang="zxx" dir="ltr"><code><nowiki>oldimage</nowiki></code></bdi>, vui lòng cập nhật chúng để sử dụng bảng <bdi lang="zxx" dir="ltr"><code><nowiki>file</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>filerevision</nowiki></code></bdi> trước ngày 28 tháng 5. [https://phabricator.wikimedia.org/T28741]
* Sau việc triển khai những giới hạn tần suất truy cập API toàn cục gần đây đối với lưu lượng truy cập không xác định, Quỹ Wikimedia sẽ tiếp tục nỗ lực đảm bảo việc [[mw:Special:MyLanguage/MediaWiki Product Insights/Responsible Reuse|sử dụng hợp lý cơ sở hạ tầng]] bằng cách áp dụng giới hạn toàn cục đối với lưu lượng truy cập API xác định kể từ tuần cuối cùng của tháng 4. Những giới hạn này được cố ý đặt ở mức cao nhất có thể để giảm thiểu tác động đến cộng đồng. Các bot chạy trong Toolforge/WMCS hoặc có quyền thành viên bot trên bất kỳ wiki nào hiện sẽ không bị ảnh hưởng. Dù vậy, tất cả các nhà phát triển được khuyến cáo nên tuân theo những thực tiễn tốt nhất đã được cập nhật. Để biết thêm thông tin, hãy xem [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn tần suất]] và [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits/FAQ|Câu hỏi Thường gặp]].
* [[mw:Special:MyLanguage/Attribution API|API Ghi công]] hiện có sẵn dưới dạng [[mw:Special:MyLanguage/Wikimedia APIs/Stability policy|tính năng beta]]. API này lấy thông tin nhằm ghi công các bài viết và tập tin phương tiện của Wikimedia bất kỳ chỗ nào mà chúng được sử dụng. Trang tài liệu tham khảo có sẵn thông qua trang đặc biệt Chỗ thử REST có mặt trên tất cả các trang wiki của Wikimedia (chẳng hạn như [https://en.wikipedia.org/w/index.php?api=attribution.v0-beta&title=Special%3ARestSandbox chỗ thử REST trên Wikipedia tiếng Anh]). Hãy chia sẻ phản hồi của bạn trên [[mw:Talk:Attribution API|trang thảo luận dự án]].
* Tuần này không có phiên bản MediaWiki mới nào.
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/17|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W17"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 15:00, ngày 20 tháng 4 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:STei (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30432763 -->
== Request for comment (global AI policy) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies for writing in English. {{int:Please-translate}}
A [[:m:Requests for comment/Artificial intelligence policy|request for comment]] is currently being held to decide on a global AI policy. {{int:Feedback-thanks-title}}
[[Thành viên:MediaWiki message delivery|MediaWiki message delivery]] ([[Thảo luận Thành viên:MediaWiki message delivery|thảo luận]]) 00:58, ngày 26 tháng 4 năm 2026 (UTC)
</bdi>
<!-- Tin nhắn của Thành viên:Codename Noreste@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Distribution_list/Global_message_delivery&oldid=30424282 -->
== Bản tin Kỹ thuật: Tuần 18-2026 ==
<section begin="technews-2026-W18"/><div class="plainlinks">
'''[[m:Special:MyLanguage/Tech/News|Tin tức kỹ thuật]]''' mới nhất từ cộng đồng kỹ thuật Wikimedia. Vui lòng chia sẻ với các thành viên khác về những thay đổi này. Không phải mọi thay đổi đều sẽ ảnh hưởng đến bạn. [[m:Special:MyLanguage/Tech/News/2026/18|Các bản dịch]] của bản tin này cũng có sẵn cho bạn.
'''Cập nhật cho biên tập viên'''
* Sẽ có một thay đổi về cách người dùng mới được tự động xác nhận nhằm cải thiện khả năng bảo vệ chống phá hoại. Hiện tại, người dùng đã mở tài khoản được vài ngày và thực hiện được một vài sửa đổi được tự động thêm vào nhóm [[{{int:grouppage-autoconfirmed/{{CONTENTLANGUAGE}}}}|{{int:group-autoconfirmed}}]]. Cấu hình này thường bị một số thành viên phá hoại lợi dụng bằng cách tạo tài khoản và chỉ bắt đầu sử dụng nó sau một khoảng thời gian. Để giảm thiểu điều này, trong tuần tới cấu hình này sẽ được cập nhật sao cho – nhằm mục đích được tự động xác nhận – tuổi của tài khoản sẽ được tính từ sửa đổi đầu tiên của họ, thay vì ngày tạo tài khoản. Giá trị số của ngưỡng tuổi vẫn sẽ được giữ nguyên. Thay đổi này sẽ chỉ được triển khai đến các wiki yêu cầu ít nhất một sửa đổi là một phần trong điều kiện để có thể được tự động xác nhận. [https://phabricator.wikimedia.org/T418484]
* Tất cả người dùng Wikipedia đã tạo tài khoản mới và những người đã kích hoạt tùy chọn "tự động bật hầu hết các tính năng beta" trong tùy chọn của mình giờ đây có thể sử dụng tính năng beta [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|danh sách đọc]] để lưu bài viết để đọc sau. Điều này giúp người dùng có thể sắp xếp mọi sở thích đọc ở một nơi để có thể dễ dàng truy cập.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:30}} {{PLURAL:30|tác vụ}} được tạo bởi cộng đồng đã được [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|giải quyết vào tuần trước]]. Ví dụ, một vấn đề khiến cho hình ảnh trong hộp thông tin có khoảng đệm quá lớn trên Firefox đã được giải quyết. [https://phabricator.wikimedia.org/T423676]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Nhắc lại, trong tuần này giới hạn tần suất truy cập API toàn cục sẽ được áp dụng cho lưu lượng truy cập API đã được xác định. Điều này giúp đảm bảo việc [[mw:MediaWiki Product Insights/Responsible Reuse|sử dụng cơ sở hạ tầng một cách hợp lý]]. Các bot chạy trong Toolforge/WMCS hoặc có quyền người dùng bot trên bất kỳ wiki nào hiện tại sẽ không bị ảnh hưởng. Dù vậy, tất cả các nhà phát triển được khuyến cáo tuân theo cách sử dụng thực tiễn được cập nhật. Để biết thêm thông tin, bao gồm giới hạn tần suất truy cập thực tế, xem [[mw:Wikimedia APIs/Rate limits|API Wikimedia/Giới hạn tần suất truy cập]] và [[mw:Wikimedia APIs/Rate limits/FAQ|Câu hỏi Thường gặp]].
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Chi tiết cập nhật mã nguồn sắp tới trong tuần này: [[mw:MediaWiki 1.46/wmf.26|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/18|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W18"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:06, ngày 27 tháng 4 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:UOzurumba (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30458046 -->
== Bản tin Kỹ thuật: Tuần 19-2026 ==
<section begin="technews-2026-W19"/><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/19|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'''
* Nhóm [[mw:Special:MyLanguage/Article guidance|Chỉ dẫn bài viết]] mời các biên tập viên có kinh nghiệm từ [[mw:Special:MyLanguage/Article guidance/Pilot wikis and collaborators|các trang Wikipedia thí điểm]]—tiếng Ả Rập, tiếng Bengal, tiếng Nhật, tiếng Bồ Đào Nha, tiếng Ba Tư, tiếng Thổ Nhĩ Kỳ, tiếng Anh đơn giản, tiếng Tây Ban Nha và tiếng Pháp—hỗ trợ biên dịch và điều chỉnh [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Category:Pages_using_article_guidance các mẫu dàn ý này]. Những dàn ý này sẽ giúp hướng dẫn các biên tập viên tạo ra các bài viết có cấu trúc tốt, rõ ràng và tuân theo quy định khi sử dụng [https://b24e11a4f1.catalyst.wmcloud.org/wiki/Special:NewArticle tính năng này] dự kiến ra mắt vào tháng 5 năm 2026. Hiện có [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|hướng dẫn đơn giản]] về cách dịch và điều chỉnh những dàn ý này.
'''Cập nhật cho biên tập viên'''
* [[:m:Special:MyLanguage/Product and Technology Advisory Council|Hội đồng Cố vấn Sản phẩm và Công nghệ]] đã công bố [[:m:Special:MyLanguage/Product and Technology Advisory Council/May 2026 draft PTAC recommendation for feedback|bản thảo đề xuất]] về một mô hình mà các chi nhánh có thể thực hiện theo khi đóng góp vào lĩnh vực kỹ thuật. Mời các thành viên cộng đồng để lại phản hồi về đề xuất này trước ngày 8 tháng 5 [[:m:Talk:Product and Technology Advisory Council/May 2026 draft PTAC recommendation for feedback|trên trang thảo luận]].
* Số lượng tùy chọn về kích thước hình thu nhỏ có sẵn trong MediaWiki sẽ được giảm xuống còn ba tùy chọn tiêu chuẩn—Nhỏ (180px), Trung bình (250px), và Lớn (400px), là một phần của nỗ lực không ngừng nhằm cải thiện hiệu suất và giảm tải cho các dịch vụ hình thu nhỏ. Do đó, các tùy chọn hiện có sẽ được ánh xạ về kích thước mới gần nhất (ví dụ, những lựa chọn kích thước nhỏ hơn như 120px hoặc 150px sẽ hiển thị dưới kích thước 180px, trong khi những lựa chọn lớn hơn như 300px hoặc 360px sẽ hiển thị dưới kích thước 400px). Giao diện tùy chọn sẽ sớm được cập nhật để áp dụng những thay đổi này và người dùng không muốn áp dụng hoặc để lại phản hồi có thể thực hiện điều đó. [https://phabricator.wikimedia.org/T424909]
* Từ giờ trở đi, ngay cả khi một quyền tự động hết hạn, người dùng sẽ nhận được thông báo Echo tương tự như thông báo tiêu chuẩn về thay đổi quyền. Có một điểm khác biệt giữa thông báo này và [[m:Special:MyLanguage/Global reminder bot|Global reminder bot]] ở chỗ bot sẽ nhắc người dùng một tuần ''trước khi'' quyền đó hết hạn, để họ có thể gia hạn quyền.
* [[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 đề khiến bộ chọn ngôn ngữ ULS trong [[m:Special:Translate|Đặc biệt:Dịch]] cuộn dọc khi không cần thiết, đã được giải quyết. Trước đây, khi người dùng mở menu thả xuống "Dịch sang tiếng Anh" và nhập một số từ nhất định, hộp thoại sẽ cuộn dọc xuống vài pixel ngay cả khi có đủ không gian để hiển thị tất cả kết quả. Menu thả xuống giờ không còn dịch chuyển một cách không cần thiết khi lọc ngôn ngữ nữa. [https://phabricator.wikimedia.org/T358864]
* [[m:Special:GlobalWatchlist|Danh sách Theo dõi Toàn cục]], tính năng cho phép bạn xem các danh sách theo dõi của bạn từ nhiều trang wiki trên cùng một trang, tiếp tục được cải thiện. Ví dụ, danh sách theo dõi cho các trang Wikibase chẳng hạn như [[:d:|Wikidata]] nay hỗ trợ phần tử [[mw:Special:MyLanguage/Extension:EntitySchema|EntitySchema]] để có thể theo dõi tốt hơn. Chế độ Cập nhật Trực tiếp nay làm mới trang đặc biệt sau mỗi 60 giây để tuân theo [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|giới hạn tần suất truy vấn API toàn cục]] được cập nhật để cải thiện khả năng phản hồi theo thời gian thực. Ngoài ra, một lỗi về hướng khiến liên kết hiển thị là "thay đổi 3" thay vì "3 thay đổi" trong danh sách có hướng hỗn hợp đã được giải quyết. [https://phabricator.wikimedia.org/T415450][https://phabricator.wikimedia.org/T424422][https://phabricator.wikimedia.org/T418091]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Giai đoạn thứ hai của [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits|giới hạn tần suất truy vấn API toàn cục]] đã được triển khai để giảm [[diffblog:2026/03/26/quo-vadis-crawlers-progress-and-whats-next-on-safeguarding-our-infrastructure/|tác động của việc thu thập dữ liệu sử dụng AI]] và đảm bảo quyền truy cập hợp lý, bền vững vào các tài nguyên của Wikimedia, ưu tiên lưu lượng truy cập của con người và lưu lượng phù hợp với sứ mệnh. [[mw:Special:MyLanguage/Wikimedia APIs/Rate limits#Limits|Giới hạn]] được chuyển từ mỗi giờ sang mỗi phút, tạo ra những mô hình lưu lượng truy cập mượt mà hơn và tải API dễ đoán hơn. Người dùng cộng đồng dự kiến không bị ảnh hưởng, và không cần phải thực hiện bất kỳ hành động gì. Các dấu hiệu ban đầu cho thấy một số người yêu cầu dựa trên User-Agent đang điều chỉnh hành vi vi, và khoảng 64% lưu lượng truy vấn API tự động đã được xác định. Việc giám sát vẫn tiếp tục, và Wikimedia Enterprise vẫn sẵn sàng để hỗ trợ thương mại.
* [[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.27|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/19|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W19"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:43, ngày 4 tháng 5 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=30498077 -->
== Bản tin Kỹ thuật: Tuần 20-2026 ==
<section begin="technews-2026-W20"/><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/20|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ộng đồng Kỹ thuật đã xuất bản một [[m:Special:MyLanguage/Community Wishlist/How to write a good wish|bộ hướng dẫn mới]] giải thích cách những mong muốn trên Danh sách Mong muốn Cộng đồng được phân loại và xếp ưu tiên. Tài liệu này được tạo ra nhằm mục đích giúp những người đóng góp viết những đề xuất mang tính mạnh mẽ hơn bằng cách làm rõ những yếu tố ảnh hưởng đến việc quyết định ưu tiên. Ngoài yếu tố số phiếu, hướng dẫn này còn nêu bật những yếu tố khác cần xem xét chẳng hạn như tác động tiềm tàng đến cộng đồng khi quyết định nên ưu tiên mong muốn nào.
'''Cập nhật cho biên tập viên'''
* Nhóm Phát triển Người đọc đang khởi động một thử nghiệm để thử [[mw:Special:MyLanguage/Readers/Reader_Growth/Share_Card|tính năng Chia sẻ Thẻ]] mới cho phép người đọc tạo những thẻ mang tính hấp dẫn về mặt trực quan từ các bài viết hoặc các đề mục bài viết và chia sẻ chúng theo cách trực tuyến, mỗi thẻ liên kết ngược lại về bài viết gốc để giúp mở rộng lượng người đọc và khả năng tìm kiếm bài viết. Thử nghiệm A/B dành riêng cho thiết bị di động này sẽ được cung cấp cho một phần người đọc trên Wikipedia tiếng Ả Rập, tiếng Trung, tiếng Pháp, tiếng Việt và tiếng Anh để có thể hiểu rõ hơn về thói quen đọc và chia sẻ, và dự kiến bắt đầu từ tuần ngày 18 tháng 5 và kéo dài trong bốn tuần.
* Ứng dụng Wikipedia trên Android và iOS gần đây đã phát hành [[mw:Special:MyLanguage/Wikimedia_Apps/Team/25th_Birthday_Reading_Challenge|thử thách đọc trong 25 ngày]] lên phiên bản Beta, là một phần của nỗ lực thúc đẩy người đọc tham gia bằng cách khuyến khích người dùng hoàn thành các mốc đọc. Để theo dõi chuỗi đọc của mình trong suốt quá trình thử thách, người dùng Ứng dụng có thể thêm tiện ích Em bé Globe vào màn hình chính của mình. Thử thách sẽ chính thức bắt đầu vào ngày 11 tháng 5.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:17}} {{PLURAL:17|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 tùy chọn toàn cục bật tính năng nổi bật cú pháp trong mã wiki có thể bất ngờ tự tắt ngay sau khi được bật lên, nay đã được giải quyết. [https://phabricator.wikimedia.org/T425286]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[File:Octicons-tools.svg|12px|link=|alt=|Đề mục nâng cao]] Mô đun ResourceLoader <bdi lang="zxx" dir="ltr"><code><nowiki>mediawiki.ui.input</nowiki></code></bdi>, mô đun lỗi thời từ [[m:Special:MyLanguage/Tech/News/2023/39|tháng 9 năm 2023]], sẽ bị loại bỏ trong tuần này. Hiện có [[mw:Special:MyLanguage/Codex/Migrating_from_MediaWiki_UI|hướng dẫn về cách chuyển từ UI MediaWiki sang Codex]] cho bất kỳ công cụ nào sử dụng nó. [https://phabricator.wikimedia.org/T420125]
* [[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.47/wmf.2|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/20|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W20"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:20, ngày 11 tháng 5 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=30524429 -->
== Bản tin Kỹ thuật: Tuần 21-2026 ==
<section begin="technews-2026-W21"/><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/21|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'''
* Nhóm Abstract Wikipedia đã xác định năm wiki thí điểm tiềm năng để đánh giá mức độ quan tâm của họ đối với việc áp dụng tóm tắt bài viết trên wiki của mình. Các wiki thí điểm là Wikipedia tiếng Malayalam, tiếng Bengali, tiếng Dagbani, tiếng Ả Rập và tiếng Indonesia. Thời gian nhận phản hồi sẽ kéo dài đến hết ngày 22 tháng 5. Nếu cộng đồng của bạn quan tâm đến việc trở thành wiki thí điểm, [[m:Talk:Abstract Wikipedia|hãy cho chúng tôi biết trên Meta]].
'''Cập nhật cho biên tập viên'''
* Một thử nghiệm nhằm hiển thị [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Danh sách Đọc]] cho người đọc chưa đăng nhập trên trang web dành cho thiết bị di động sẽ được triển khai vào ngày 18 tháng 5 trên Wikipedia tiếng Đức, tiếng Tây Ban Nha, tiếng Ý, tiếng Bồ Đào Nha, tiếng Ba Lan, tiếng Hà Lan, tiếng Thổ Nhĩ Kỳ và tiếng Urdu Wikipedias, và sẽ kéo dài trong vòng một tháng. Nỗ lực này nhằm hỗ trợ những mục tiêu rộng hơn giúp người đọc lưu và sắp xếp các bài viết để đọc sau, đồng thời khuyến khích những thói quen có thể giúp dẫn đến việc đóng góp cho Wikipedia trong tương lai.
* Để hỗ trợ cho nút đánh dấu trong tính năng beta Danh sách Đọc, menu "Công cụ > Tác vụ" đã được cập nhật để hiển thị các biểu tượng, bao gồm cả chỉ báo ngôi sao theo dõi giúp biên tập viên xác định những bài viết được theo dõi tạm thời. Các biểu tượng nay cũng khớp với các biểu tượng được sử dụng trên thiết bị di động, cải thiện tính nhất quán trên các nền tảng. Thay đổi này hiện chỉ giới hạn ở menu tác vụ và chủ yếu ảnh hưởng đến các biên tập viên có quyền thành viên nâng cao. [https://phabricator.wikimedia.org/T426008]
* [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Chế độ Đề xuất]] đã được phát hành dưới dạng [[w:en:A/B test|thử nghiệm A/B]] dành cho biên tập viên mới trên trang web dành cho di động tại [[phab:T421189|~15 trang Wikipedia]]. Thử nghiệm này sẽ đo lường tác động của Chế độ Đề xuất đến tỷ lệ những phiên sửa đổi trên trang web dành cho di động của người mới tạo ra những sửa đổi mang tính xây dựng (không bị lùi lại) trên bài viết. Thử nghiệm này cũng sẽ đánh giá tác động của tính năng này đến việc giữ chân người dùng, đồng thời theo dõi những thay đổi về tỷ lệ lùi sửa và cấm.
* [[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 đề trong ứng dụng Wikipedia dành cho Android khi hình ảnh đôi lúc không thể tải được sau khi mở thông báo danh sách đọc đề xuất, nay đã được giải quyết. [https://phabricator.wikimedia.org/T418231]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* [[mw:Special:MyLanguage/Wikidata Platform|Nhóm Nền tảng Wikidata]] đã công bố [[d:Special:MyLanguage/Wikidata:SPARQL query service/WDQS backend update/Backend Replacement|đề xuất thay thế backend]] và [[wikitech:Wikidata Query Service/WDQS Architecture re-design|kiến trúc kỹ thuật]] kèm theo cho việc di chuyển Dịch vụ Truy vấn Wikidata (WDQS) khỏi Blazegraph. Chúng tôi hoan nghênh mọi phản hồi về đề xuất này cho đến hết ngày 25 tháng 5 năm 2026, đặc biệt là về những thiếu sót tiềm tàng và tác động đến những trường hợp sử dụng (use case) nâng cao. Các thành viên trong cộng đồng Wikidata và người dùng WDQS cũng được khuyến khích giúp xác định những công cụ và quy trình làm việc có tác động lớn cần được chú ý trên [[d:Wikidata:SPARQL query service/WDQS backend update/High-Impact Use Cases|trang này]]. Bạn có thể chia sẻ những phản hồi của mình trên [[d:Wikidata talk:SPARQL query service/WDQS backend update|trang thảo luận về Di chuyển]] hoặc trong [[d:Special:MyLanguage/Wikidata:Blazegraph Migration Office Hours|giờ làm việc tiếp theo]]. Xem [[d:Special:MyLanguage/Wikidata:Wikidata Platform team/Newsletter|bản tin của nhóm WDP]] để biết thêm chi tiế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.47/wmf.3|MediaWiki]]
'''Chuyên sâu'''
* Trên Wikipedia tiếng Anh, tiếng Pháp, tiếng Nhật và một số trang Wikipedia khác, một [[diffblog:2025/09/02/better-detecting-bots-and-replacing-our-captcha/|thử nghiệm hCaptcha]], một dịch vụ phát hiện bot từ bên thứ ba, đã được thực hiện. Thử nghiệm này cho thấy hCaptcha phát hiện và ngăn chặn hiệu quả một số hoạt động tự động không thiện ý, bằng cách tự hoạt động lẫn bằng cách cung cấp tín hiệu cho [[w:en:Wikipedia:Village pump (technical)/Archive 225#Introducing SuggestedInvestigations|kiểm định viên và tiếp viên]] để kiểm tra. Vì kết quả thử nghiệm cho kết quả tích cực, hCaptcha sẽ được triển khai trên tất cả các wiki trong một vài tuần tới đây. [[mw:Special:MyLanguage/Product Safety and Integrity/Anti-abuse signals/hCaptcha|Xem trang dự án hCaptcha]] để biết thông tin kỹ thuật về việc triển khai và bảo vệ quyền riêng tư. [[diffblog:2026/05/04/better-detecting-bots-and-replacing-our-captcha-part-2/|Tìm hiểu thêm]].
* Bản cập nhật Công nghệ Cộng đồng số mới nhất hiện đã có sẵn, trong đó có những tiến bộ trong một số sáng kiến thuộc Danh sách Mong muốn Cộng đồng, bao gồm việc mở rộng Danh sách Đọc từ ứng dụng di động lên trang web, hỗ trợ thêm ngôn ngữ mới cho "Ai đã viết nó" (Who Wrote That) và Bảng điều khiển Cá nhân, cải thiện khả năng hiển thị 3D và Biểu đồ, cũng như những công việc sắp tới về việc sắp xếp trang thảo luận, khả năng phát âm thanh và quy trình sửa đổi. Bản cập nhật cũng chia sẻ những ưu tiên hiện tại, xu hướng trạng thái danh sách mong muốn và cơ hội để cộng đồng phản hồi về các lĩnh vực trọng tâm trong tương lai cũng như Kế hoạch Hàng năm 2026–2027 của Quỹ Wikimedia. [[m:Special:MyLanguage/Community Wishlist/Updates#May 13, 2026: Latest updates from the Community Tech team|Đọc toàn bộ nội dung bản tin để biết thông tin chi tiết]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/21|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W21"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:21, ngày 18 tháng 5 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=30539262 -->
== Bản tin Kỹ thuật: Tuần 22-2026 ==
<section begin="technews-2026-W22"/><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/22|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 [[mw:Special:MyLanguage/Contributors/Account Creation Experiments#LOWM|thử nghiệm tạo tài khoản thành công]], tin nhắn được cải tiến dành cho những sửa đổi của thành viên chưa đăng nhập sẽ được triển khai đến tất cả các wiki của Wikimedia vào tuần đầu tiên của tháng 6. Thay đổi này sẽ chỉ ảnh hưởng đến các thành viên chưa đăng nhập trên trang web di động khi mở một phiên sửa đổi. Việc cập nhật trải nghiệm này được thiết kế để làm rõ hơn việc khuyến khích tạo tài khoản mà vẫn cho phép người dùng sửa đổi bằng tài khoản tạm thời. Kết quả từ thử nghiệm cho thấy tỷ lệ tạo tài khoản tăng lên đáng kể, trong đó tỷ lệ này đối với người dùng nhìn thấy thông báo được cập nhật này đạt mức tăng khoảng 27%. Như dự đoán, khi càng nhiều người tạo tài khoản, số tài khoản tạm thời cũng giảm đi khoảng 16%. Thử nghiệm không cho thấy bất kỳ thay đổi nào đáng kể về tỷ lệ sửa đổi mang tính xây dựng hay bất cứ số liệu đóng góp nào khác được theo dõi. [https://phabricator.wikimedia.org/T424595]
'''Cập nhật cho biên tập viên'''
* Vì lý do bảo mật, thành viên của một số nhóm người dùng [[m:Special:MyLanguage/Mandatory two-factor authentication for users with some extended rights|bắt buộc phải bật xác thực hai yếu tố]] (2FA). Những thành viên thuộc những nhóm này sẽ không thể tắt đi yếu tố 2FA cuối cùng trên tài khoản của mình, và sẽ không thể thêm người dùng không có 2FA vào những nhóm này. Người dùng vẫn sẽ có thể thêm yếu tố xác thực mới hoặc loại bỏ chúng đi, miễn là có ít nhất một yếu tố được bật liên tục. Trong vòng vài tuần tới đây, người dùng không có 2FA sẽ bị loại bỏ khỏi những nhóm này. Đặc biệt, nó sẽ được áp dụng cho các hành chính viên. Xem tác vụ được liên kết để biết lịch triển khai. [https://phabricator.wikimedia.org/T423119][https://phabricator.wikimedia.org/T423120]
* [[m:Special:MyLanguage/WMDE Technical Wishes|Nhóm Mong muốn Kỹ thuật của WMDE]] sẽ chạy một [[w:vi:Thử nghiệm A/B|thử nghiệm A/B]] trên [[:phab:T415904|10 wiki]], nhằm thử nghiệm [[m:WMDE Technical Wishes/References/Reference Previews|những khả năng cải tiến cho tính năng Xem trước Chú thích]]. Thử nghiệm sẽ kéo dài ~2 tuần vào cuối tháng 5 / đầu tháng 6 và sẽ ảnh hưởng tới 10% người đọc trên máy tính đối với các wiki tham gia.
* Sau hai thử nghiệm thành công, nhóm Phát triển Người đọc sẽ cho ra mắt tính năng beta [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Duyệt Hình ảnh]] trên tất cả các trang Wikipedia trên di động vào ngày 25 tháng 5. Điều này có nghĩa là bất kỳ ai đã bật mặc định tất cả các tính năng beta sẽ bắt đầu nhìn thấy tính năng này, và những người khác có thể đánh dấu hộp kiểm để bật tính năng này lên trong tùy chọn của họ. Tính năng beta này sẽ bao gồm một băng chuyền hiển thị tất cả hình ảnh của bài viết ở đầu bài viết, The beta feature will include a carousel of all an article's images at the top of the article, cùng khả năng điều khiển cho phép biên tập viên có thể [[mw:Readers/Reader_Growth/Image_Browsing#Phase_2.1_beta_feature|loại trừ hình ảnh khỏi băng chuyền của bài viết hoặc loại trừ hoàn toàn một bài viết khỏi tính năng này]].
* [[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ụ, các tệp STL ba chiều bị hiển thị sai bởi phần mở rộng trình xem phương tiện 3D nay đã được giải quyết. [https://phabricator.wikimedia.org/T416723]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Các class CSS <bdi lang="zxx" dir="ltr"><code><nowiki>tleft</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>tright</nowiki></code></bdi> cũ đã được thay thế bằng <bdi lang="zxx" dir="ltr"><code><nowiki>floatleft</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>floatright</nowiki></code></bdi> do hai class cũ đó không hoạt động một cách nhất quán trên tất cả các nền tảng MediaWiki, đặc biệt là giao diện web di động và ứng dụng di động. Những dự án dựa vào những lớp này được khuyến khích xem xét lại những chỗ sử dụng có liên quan và lên kế hoạch chuyển đổi. Xin lưu ý rằng <bdi lang="zxx" dir="ltr"><code><nowiki>floatleft</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>floatright</nowiki></code></bdi> cũng có thể bị loại bỏ trong tương lai, dù hiện chưa có kế hoạch thực hiện điều này. [[phab:T426452|Đọc 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.47/wmf.4|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/22|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W22"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:52, ngày 25 tháng 5 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=30584502 -->
== <span lang="en" dir="ltr">Vote now in the 2026 U4C election</span> ==
<div lang="en" dir="ltr">
<section begin="announcement-content" />
Eligible voters are asked to participate in the 2026 [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee|Universal Code of Conduct Coordinating Committee]] election. More information–including an eligibility check, voting process information, candidate information, and a link to the vote–are available on Meta at the [[m:Special:MyLanguage/Universal_Code_of_Conduct/Coordinating_Committee/Election/2026|2026 Election information page]]. The vote closes on 2 June 2026 at [https://zonestamp.toolforge.org/1780358400 00:00 UTC].
Please vote if your account is eligible. Results will be available by 14 June 2026. -- In cooperation with the U4C,<section end="announcement-content" />
</div>
[[m:User:Keegan (WMF)|Keegan (WMF)]] ([[m:User talk:Keegan (WMF)|talk]]) 17:15, ngày 27 tháng 5 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=30513860 -->
== Bản tin Kỹ thuật: Tuần 23-2026 ==
<section begin="technews-2026-W23"/><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/23|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 tiến hành một cuộc thử nghiệm nhằm giới thiệu tính năng [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|danh sách đọc]], hiện vẫn đang trong quá trình phát triển, dành cho những người đọc chưa đăng nhập trên thiết bị di động để kiểm tra xem tính năng này có khuyến khích việc tạo tài khoản với tỷ lệ cao hơn so với nút sao theo dõi hay không. [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists#Experiment timeline|Thử nghiệm]] này đã được khởi động vào ngày 18 tháng 5 trên các wiki tiếng Đức, Tây Ban Nha, Ý, Bồ Đào Nha, Ba Lan, Hà Lan, Thổ Nhĩ Kỳ và Urdu, và sẽ kéo dài trong một tháng.
* Nhóm Ứng dụng Wikimedia đã phát hành [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh/Phase 1|Giai đoạn 1]] của giao diện Trang chủ được thiết kế lại cho ứng dụng Android bản Beta. Giao diện Trang chủ mới bao gồm tab "Cộng đồng" được làm mới và tab "Dành cho Bạn" được cá nhân hóa với những đề xuất đọc được cập nhật hàng ngày. Việc thiết kế lại này là một phần trong nỗ lực rộng lớn hơn nhằm cải thiện khả năng tìm kiếm nội dung và tạo ra trải nghiệm học tập hấp dẫn hơn trong các ứng dụng Wikipedia.
* [[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 vấn đề khiến các hình ảnh không thể tải được đối với một số đề xuất sửa đổi trên [[w:Special:Homepage|Đặc biệt:Trang nhà]], làm cho hình thu nhỏ bị kẹt ở trạng thái đang tải, nay đã được giải quyết. [https://phabricator.wikimedia.org/T424048]
'''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.47/wmf.5|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/23|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W23"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:08, ngày 1 tháng 6 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=30613639 -->
== Bản tin Kỹ thuật: Tuần 24-2026 ==
<section begin="technews-2026-W24"/><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/24|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'''
* Wikimedia Enterprise đã tăng giới hạn sử dụng miễn phí cho các dịch vụ API của mình. Giới hạn yêu cầu hàng tháng dành cho API Theo yêu cầu đã tăng từ 5.000 lên 50.000 yêu cầu, trong khi giới hạn đối với API Hình chụp nhanh đã tăng từ 15 lên 30 yêu cầu mỗi tháng. Ngoài ra, Nội dung Có cấu trúc của ảnh chụp nhanh hiện đã có sẵn cho các tài khoản miễn phí. Những thay đổi này sẽ mở rộng quyền truy cập vào dữ liệu Wikimedia Enterprise cho các nhà phát triển, nhà nghiên cứu và các tổ chức sử dụng nội dụng Wikimedia. [https://enterprise.wikimedia.com/blog/enhanced-free-api]
'''Cập nhật cho biên tập viên'''
* [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Explore Feed Refresh/Phase 1|Bảng tin Khám phá được làm mới]], nay với tên gọi là Bảng tin Trang chủ, đang được triển khai tới 50% người dùng ứng dụng Wikipedia dành cho Android. Bảng tin Trang chủ giúp người đọc khám phá nội dung liên quan thông qua hai tab mới: ''Cộng đồng'' và ''Dành cho Bạn''. Tab Cộng đồng cung cấp một bảng tin cuộn được chứa những nội dung được chọn lọc cùng những cập nhật từ không gian rộng lớn hơn của cộng đồng và phong trào Wikimedia, trong khi tab ''Dành cho Bạn'' cung cấp trải nghiệm toàn màn hình, có thể vuốt được để hiển thị nội dung được điều chỉnh theo sở thích của người dùng. Việc thiết kế lại này là một phần trong nỗ lực lớn hơn nhằm cải thiện khả năng tìm kiếm và nâng cao trải nghiệm học trong ứng dụng Wikipedia.
* Trò chơi giải đố hàng ngày [[mw:Special:MyLanguage/Wikimedia Apps/Team/iOS/"Which came first?" Game|Sự kiện nào diễn ra trước nhỉ?]] nay đã có sẵn trong phiên bản beta của ứng dụng Wikipedia dành cho iOS bằng tiếng Anh, tiếng Đức, tiếng Pháp, tiếng Bồ Đào Nha, tiếng Nga, tiếng Tây Ban Nha, tiếng Ả Rập, tiếng Trung và tiếng Thổ Nhĩ Kỳ. Trò chơi này sử dụng các sự kiện lịch sử từ nội dung trong mục "Ngày này năm xưa" của Wikipedia và thử thách người đọc đoán xem sự kiện nào trong hai sự kiện đã xảy ra trước. Trò chơi này đã được phát hành trên Android trước đây. Những cộng đồng quan tâm đến việc cung cấp trò chơi này bằng ngôn ngữ của mình có thể [[mw:Special:MyLanguage/Wikimedia_Apps/Team/Games#Game availability by language|đọc qua hướng dẫn và yêu cầu]].
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Chú thích phụ]], một tính năng MediaWiki mới cho phép biên tập viên tái sử dụng nguồn tham khảo với nhiều chi tiết khác nhau, sẽ bắt đầu được triển khai đến các wiki của Wikimedia sau giải đoạn thí điểm thành công. Việc triển khai sẽ bắt đầu vào ngày 8 tháng 6 đối với hầu hết các [[wikitech:Deployments/Train#Wednesday|wiki Nhóm 1]] và Wikipedia tiếng Pháp, trong khi các phiên bản ngôn ngữ khác của Wikipedia sẽ nhận được tính năng này trong những tháng tới. Các cộng đồng được khuyến khích chuẩn bị bằng cách kiểm tra [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-cite&language=en&action_source=search&filter=%21translated&optional=1&action=translate các thông báo chưa được dịch của phần mở rộng Cite] bằng ngôn ngữ của họ và xem xét bất kỳ việc sử dụng [[mw:Special:MyLanguage/Reference Tooltips|Chú thích nổi]] nào, chúng có thể cần phải được [[:phab:T416304#11668731|cập nhật]] để hỗ trợ chức năng mới này. Những wiki sử dụng [[mw:Special:MyLanguage/Help:Reference Previews|Xem trước Chú thích]] không cần phải thực hiện bất kỳ hành động nào. Các cộng đồng cũng có thể mong muốn tạo [[Special:TrackingCategories|thể loại theo dõi]] ''cite-tracking-category-ref-details'' dưới dạng thể loại ẩn sử dụng <code><nowiki>__HIDDENCAT__</nowiki></code> (hoặc một bản mẫu chuyên dụng), và kết nối nó với khoản mục Wikidata [[d:Q129764848]] tương ứng. [https://phabricator.wikimedia.org/T425662]
* [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews#Experimentation|Thử nghiệm Xem trước Trang]] trên giao diện web di động đã kết thúc. Nhóm đã quyết định không triển khai tính năng này sau khi kết quả cho thấy rằng không có tác động đáng kể nào về mặt thống kê lên tỷ lệ giữ chân người đọc, vì chỉ số thành công chính là việc cải thiện tỷ lệ giữ chân người đọc. Tính năng Xem trước Trang, vốn đã có sẵn trên máy tính để bàn và trong ứng dụng, hiển thị hình thu nhỏ, đoạn mở đầu và liên kết đến bài viết đầy đủ khi người đọc nhấn vào liên kết xanh. Thử nghiệm này đã thử trải nghiệm này trên giao diện web di động trên sáu trang Wikipedia.
* [[mw:Special:MyLanguage/Codex/Design/Icons|Thư viện biểu tượng giao diện người dùng]] sẽ được [[phab:T399175|cập nhật vào cuối tuần này hoặc đầu tuần sau]]. Hầu hết trong số ~300 biểu tượng đã được điều chỉnh một chút và ~30 biểu tượng mới đã được thêm vào. Những thay đổi này cải thiện các biểu tượng để làm cho chúng thêm nhất quán và dễ hiểu hơn, đồng thời mang lại sự cân bằng trực quan hơn khi chúng được sử dụng theo nhóm.
* Giao diện [[mw:Special:MyLanguage/Universal Language Selector|Bộ chọn Ngôn ngữ Toàn cục]] (ULS) trong MediaWiki, công cụ giúp người dùng chọn nội dung bằng các ngôn ngữ khác, đã được cập nhật. Phiên bản mới cải thiện tốc độ và khả năng truy cập, đồng thời giờ đây người dùng trên các dự án Wikimedia có thể ghim các ngôn ngữ để chuyển đổi ngôn ngữ một cách nhanh chóng hơn. Việc triển khai lên các trang web của Wikimedia sẽ diễn ra dần dần trong những tuần tới. Bạn có thể thử nghiệm tính năng này ngay bây giờ bằng cách chọn [[Special:Preferences#mw-prefsection-betafeatures|tính năng beta]] trong tùy chọn hồ sơ của mình và chia sẻ phản hồi của bạn trên [[mw:Special:MyLanguage/Universal Language Selector/New ULS|trang dự án]].
* [[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 vấn đề khiến bảng điều khiển Phân tích Lượt xem Trang trên pageviews.wmcloud.org ngừng cập nhật dữ liệu đồ thị vào tháng 5 năm 2026, ảnh hưởng đến tất cả người dùng, đã được giải quyết. [https://phabricator.wikimedia.org/T427171]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Chữ ký hàm cho <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink()</nowiki></code></bdi> đã được đơn giản hóa. Các nhà phát triển nay có thể truyền một đối tượng cấu hình thay vì một danh sách các tham số vị trí khi tạo liên kết portlet. Chữ ký hàm trước đây vẫn được hỗ trợ để đảm bảo khả năng tương thích ngược. Ví dụ, thay vì: <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', '#', 'Stub', 'ca-stubtag', 'Add a stub tag to this page');</nowiki></code></bdi> sử dụng <bdi lang="zxx" dir="ltr"><code><nowiki>mw.util.addPortletLink('p-cactions', { href: '#', text: 'Stub', id: 'ca-stubtag', tooltip: 'Add a stub tag to this page' });</nowiki></code></bdi>. Những người bảo trì đoạn mã được khuyến khích xem chỗ nào hiện đang sử dụng <bdi lang="zxx" dir="ltr"><code><nowiki>addPortletLink()</nowiki></code></bdi> và cập nhật chúng nếu thích hợp. Thay đổi này sẽ có mặt trên tất cả các wiki từ ngày 11 tháng 6. Xin cảm ơn tình nguyện viên cộng đồng Gerges đã đóng góp cải tiến này. [https://phabricator.wikimedia.org/T427945]
* '''Thảo luận về Danh sách Mong muốn của Cộng đồng''': Nhóm Sản phẩm & Công nghệ [[m:Special:MyLanguage/Community Wishlist/Updates#May 20, 2026: Community Tech becomes a program|đã đưa ra những thay đổi]] nhằm mục đích tăng số lượng và độ phức tạp của những mong muốn được đáp ứng, bao gồm cả việc giải thể nhóm Công nghệ Cộng đồng. Họ đang [[m:Special:MyLanguage/Community Wishlist/Updates|tham gia thảo luận]] về một [[m:Talk:Community Wishlist#Proposed direction for Wishlist|đề xuất hướng đi cho danh sách mong muốn]] từ các thành viên cộng đồng. Bao gồm những cách để cấu trúc việc bỏ phiếu hàng năm, theo dõi mong muốn một cách tốt hơn, loại bỏ các lĩnh vực trọng tâm, và [[m:Special:MyLanguage/Community Wishlist/Updates|điều chỉnh việc quản lý nhân sự]].
* [[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.47/wmf.6|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/24|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W24"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:30, ngày 8 tháng 6 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=30650573 -->
== Bản tin Kỹ thuật: Tuần 25-2026 ==
<section begin="technews-2026-W25"/><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/25|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/Readers/Reader Growth|Nhóm Tăng trưởng Độc giả]] đã cho ra mắt tính năng beta [[mw:Special:MyLanguage/Readers/Reader Growth/Image Browsing|Duyệt Hình ảnh]] trên phiên bản web của thiết bị di động tại tất cả các phiên bản Wikipedia. Tính năng này hiển thị ở đầu bài viết một băng chuyền hình ảnh gồm 3 hình ảnh trở lên. Biên tập viên có thể cấu hình cho tính năng này với những thao tác sau: để ẩn một hình ảnh cụ thể khỏi một trang, hãy sử dụng <code>class=notpageimage</code> để loại trừ nó khỏi bản xem trước, hay dùng <code>class=noviewer</code> để loại trừ nó khỏi MediaViewer. Băng chuyền Hình ảnh còn có thể được tắt hoàn toàn ở một trang, với magic word <code><nowiki>__NOMEDIAVIEWERCAROUSEL__</nowiki></code>. Để gửi phản hồi hoặc báo cáo lỗi, hãy truy cập [[mw:Talk:Readers/Reader Growth/Image Browsing|trang dự án]].
* [[mw:Special:MyLanguage/Help:Tables#class="wikitable"|Wikitables]] nay đã có thể được [[mw:Special:MyLanguage/Help:Sortable tables#Forcing the initial sort direction|sắp xếp theo thứ tự giảm dần]] ngay lần nhấp chuột đầu tiên bằng cách thêm <code dir=ltr>data-sort-order="desc"</code> cho ô tiêu đề. Trước đây, theo mặc định, lần nhấp chuột đầu tiên vào tiêu đề cột sẽ sắp xếp cột theo thứ tự tăng dần. Sự bổ sung này cho Wikitable mang lại khả năng kiểm soát và tính linh hoạt cao hơn, trong khi hành vi mặc định cho những lần nhấp chuột tiếp theo vẫn được giữ nguyên. [https://phabricator.wikimedia.org/T398416]
'''Cập nhật cho biên tập viên'''
* Tính năng [[mw:Special:MyLanguage/Article guidance|Hướng dẫn bài viết]] hiện đang được thử nghiệm đối với một số biên tập viên tạo các bài viết mới trên các trang Wikipedia tiếng Anh đơn giản, tiếng Pháp và tiếng Thổ Nhĩ Kỳ. Thử nghiệm cũng sẽ sẽ sớm bắt đầu trên Wikipedia tiếng Ả Rập và tiếng Bengali. [[w:simple:Special:NewArticle|Tính năng này]] cung cấp cho các biên tập viên hướng dẫn do cộng đồng biên soạn để giúp họ tạo ra những bài viết tuân thủ tiêu chuẩn cộng đồng. Các biên tập viên có kinh nghiệm có thể tiếp tục tạo hoặc điều chỉnh dàn ý cho những loại bài viết cụ thể thường được tạo bởi những người đóng góp ít kinh nghiệm hơn. Những dàn ý này hướng dẫn các biên tập viên ít kinh nghiệm hơn trong việc tạo những bài viết chất lượng cao. Hướng dẫn nhanh về các ký hiệu được sử dụng trong dàn ý có thể được tìm thấy trên [[mw:Special:MyLanguage/Article guidance/Test feature guide#Markups in outlines|trang này]]. [[w:simple:Wikipedia:Article Guidance|Ví dụ về dàn ý]] có thể được điều chỉnh và hướng dẫn cách điều chỉnh chúng nằm trên [[mw:Special:MyLanguage/Article guidance#Adapting a sample outline in a Wikipedia|phần này]] của trang dự án.
* Wiki mong muốn thay thế nút "vô thời hạn" trong Đặc biệt:Cấm dành cho tài khoản tạm thời (ví dụ, wiki chỉ cấm tài khoản tạm thời đến khi tài khoản đó hết hạn) sẽ có thể thực hiện điều đó bằng cách tạo [[MediaWiki:ipb-indefinite-expiry-temporary-account]] với khoảng thời gian cấm mà họ muốn. [https://phabricator.wikimedia.org/T427125]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:41}} {{PLURAL:41|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'''
* Đến cuối tháng 6, việc sử dụng một chuỗi user-agent hợp lệ là bắt buộc để tải xuống tự động các dump từ trang web dumps.wikimedia.org. Những yêu cầu tự động cung cấp user-agent trống hoặc chung chung sẽ bị chặn. Điều này [[phab:T400119|sẽ mở rộng việc thực thi]] [[foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|quy định về user-agent]] đã có từ lâu. Quyền truy cập tới Dịch vụ Đám mây của Wikimedia sẽ không thay đổi.
* Quá trình triển khai [[mw:Wikimedia APIs/Rate limits|giới hạn truy cập API]] toàn cục đã hoàn tất, các giới hạn được áp dụng trên tất cả các API và ở tất cả các mức độ được ghi nhận cho tất cả các nhóm. 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 vẫn được miễn trừ. Tất cả các bot nên tiếp tục theo những thực tiễn tốt nhất được ghi nhận để tránh bị vượt giới hạn truy cập.
* [https://api.wikimedia.org/wiki/Main_Page Wiki Cổng API] sẽ ở chế độ chỉ đọc kể từ tuần này (15-18 tháng 6). Vào tuần tới (22-25 tháng 6), tất cả các URL của wiki Cổng API sẽ chuyển hướng đến [[mw:Wikimedia APIs|API Wikimedia trên 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.47/wmf.7|MediaWiki]]
'''Các cuộc họp và sự kiện'''
* Vào ngày 17 tháng 6 lúc 18:00 giờ UTC WMF sẽ tổ chức một cuộc gọi Discord tập trung vào việc đánh giá code. Chúng tôi đã lắng nghe thông qua [[mw:Special:MyLanguage/Developer Satisfaction Survey/2026|Khảo sát Sự hài lòng của Nhà phát triển]] rằng các tình nguyện viên đang gặp khó khăn trong việc đánh giá code và chúng tôi muốn thảo luận về những trải nghiệm này với mục tiêu tìm ra những giải pháp khả thi. Bạn có thể tham gia cuộc gọi [https://discord.gg/wikipedia?event=1514727511102062664 thông qua máy chủ Discord Cộng đồng Wikimedia].
* [[m:Special:MyLanguage/Conferencia Wikimedia de América Latina 2026|Hội nghị Wikimedia Mỹ La-tinh]] sẽ tổ chức cuộc thi hackathon khu vực quy tụ cộng đồng kỹ thuật của phong trào Wikimedia, gồm những nhà phát triển, quản trị viên hệ thống, nhà khoa học dữ liệu và các thành viên có quyền mở rộng. Những người đóng góp kỹ thuật quan tâm có thể [https://docs.google.com/forms/d/e/1FAIpQLSf4osJzTHBJjQbYJk7TMVEJjTEQv7IgtsUDfP-o-qTgeRQQxw/viewform đăng ký học bổng] tham gia cho đến nửa đêm ngày 21 tháng 6 (giờ Bolivia, UTC-4).
* Hãy đăng ký tham gia Thử thách Nhóm của Wikimania để góp mặt tại sự kiện đặc biệt này. Thử thách nhóm sẽ diễn ra trực tuyến và trực tiếp từ ngày 21 đến 22 tháng 7, trước hội nghị Wikimania. Mọi người đều có thể tham gia, bất kể kỹ năng hay việc đăng ký Wikimania trước đó như thế nào. Các nhóm sẽ cùng nhau giải quyết 10 thử thách quan trọng trong việc hỗ trợ cộng đồng Wikimedia. Để biết thêm chi tiết, hãy truy cập [[wmania:Special:MyLanguage/2026:Team challenges|trang Thử thách Nhóm]] và [https://wikimedia.eventyay.com/wm/teamchallenges/ đăng ký tại đó]. Cổng đăng ký sẽ đóng vào ngày 20 tháng 6 lúc 23:00 UTC.
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/25|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W25"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:48, ngày 15 tháng 6 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=30689604 -->
== Bản tin Kỹ thuật: Tuần 26-2026 ==
<section begin="technews-2026-W26"/><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/26|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/Growth/Feature summary|Các tính năng Phát triển (Growth)]] [[phab:T418115|nay đã có mặt trên Wikidata]]. Bản cập nhật này cho phép truy cập vào chức năng Cố vấn ([[mw:Special:MyLanguage/Help:Growth/Mentorship|nếu được cấu hình]]), mô đun Tác động, Bảng Trợ giúp và Trang chủ dành cho Người mới được đơn giản hóa (không có Đề xuất sửa đổi). Các bảo quản viên Wikidata vẫn đang cấu hình các tính năng thông qua Cấu hình Cộng đồng.
'''Cập nhật cho biên tập viên'''
* Trang đặc biệt [[{{#special:RangeCalculator}}]] đã được tạo. Trang này cho phép người dùng tìm một dải IP mà không cần phải dựa vào các công cụ bên ngoài. Cho đến hiện tại, công cụ này chỉ có sẵn cho các kiểm định viên. [https://phabricator.wikimedia.org/T268429]
* [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing|Chú thích phụ]] là một tính năng mới của MediaWiki cho phép biên tập viên tái sử dụng các nguồn tham khảo với những chi tiết khác nhau. Tính năng này sẽ được triển khai đến hầu hết các phiên bản ngôn ngữ Wikipedia quy mô nhỏ và trung bình vào ngày 23 tháng 6. Trang [[m:Special:MyLanguage/WMDE Technical Wishes/Sub-referencing#deployment|Câu hỏi thường gặp]] liệt kê những hành động có thể thực hiện trên wiki của bạn để hỗ trợ việc triển khai này. Hãy kiểm tra [[:phab:T414094|kế hoạch triển khai]] để biết các bước triển khai tiếp theo. [https://phabricator.wikimedia.org/T428902]
* Bắt đầu từ tuần sau, người dùng sẽ nhận được một thông báo khi họ bị cấm sửa đổi hoặc được bỏ cấm sửa đổi, hoặc khi lệnh cấm thay đổi. [https://phabricator.wikimedia.org/T100974]
* [[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]].
'''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 tới, các bộ lọc sai phạm được đặt ở mức "yêu cầu xác minh CAPTCHA" sẽ bắt đầu ảnh hưởng đến cả những người dùng có quyền <code>skipcaptcha</code>, bao gồm hầu hết những người dùng có quyền tự động xác nhận. Các bot sẽ được miễn trừ. Thay đổi này sẽ chỉ ảnh hưởng đến những sửa đổi kích hoạt bộ lọc sai phạm. Quyền <code>skipcaptcha</code> vẫn sẽ tiếp tục giúp người dùng được miễn yêu cầu xác minh CAPTCHA trong quá trình sử dụng wiki thông thường. [https://phabricator.wikimedia.org/T402595]
* Tài liệu tham khảo cho [[wikitech:Machine_Learning/LiftWing/API|API Lift Wing]] đã được chuyển từ Cổng API sang [https://wikitech.wikimedia.org/w/index.php?api=lift-wing&title=Special%3ARestSandbox Chỗ thử REST] mang tính tương tác.
* Wiki Cổng API hiện đã đóng. Để xem tài liệu API, hãy xem [[mw:Special:MyLanguage/Wikimedia_APIs|API Wikimedia trên mediawiki.org]]. Tất cả các URL của wiki Cổng API (https://api.wikimedia.org/wiki/) sẽ đổi hướng tới trang mediawiki.org bắt đầu từ ngày 22 tháng 6. [https://phabricator.wikimedia.org/T427537]
* [[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.47/wmf.8|MediaWiki]]
'''Các cuộc họp và sự kiện'''
* Hãy tham gia cuộc gọi trực tuyến vào ngày 25 tháng 6 lúc 2:30 chiều giờ UTC để gặp gỡ các thực tập sinh hiện tại của Wikimedia cho [[mw:Google_Summer_of_Code/2026|Google Summer of Code]] và [[mw:Outreachy/Round_32|Outreachy]]. Các thực tập sinh sẽ giới thiệu tổng quan về các dự án của họ và demo ngắn gọn công việc mà họ đã thực hiện cho đến nay. Người tham dự được khuyến khích [[mw:event:Google_Summer_of_Code/Summer_2026_June_Internship_open_session|chia sẻ ý tưởng và kết nối trong cộng đồng của họ]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/26|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W26"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13:05, ngày 23 tháng 6 năm 2026 (UTC)
<!-- Tin nhắn của Thành viên:Trizek (WMF)@metawiki gửi cho mọi người trong danh sách tại https://meta.wikimedia.org/w/index.php?title=Global_message_delivery/Targets/Tech_ambassadors&oldid=30722494 -->
== RFC about AI-generated content in Wikimedia Commons ==
<bdi lang="en" dir="ltr">Apologies for writing in English, please help translate this message to your language. You are invited to participate in a [[c:Commons:Requests for comment/Policy update for AI content|request for comment on Wikimedia Commons about a policy update for AI content]]. This may affect files that are uploaded to Wikimedia Commons for use on this project. Thank you. [[m:User:Codename Noreste|Codename Noreste]] ([[m:User talk:Codename Noreste|thảo luận]])</bdi> 17:12, ngày 23 tháng 6 năm 2026 (UTC)
<!-- 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=30513860 -->
== <span lang="en" dir="ltr">Deployment of Legal and Safety Contacts Link in the Footer of Your Wiki</span> ==
<div lang="en" dir="ltr">
<section begin="Message"/>
'''Legal & Safety Contacts'''
Hello community, the Wikimedia Foundation has provided a [[wmf:Special:MyLanguage/Legal:Wikimedia Foundation Legal and Safety Contact Information|single legal and safety contact page]], to be linked in the footer of your wiki, to ensure access to accurate legal information. This is a regulatory requirement. We have already rolled out links to English, German, Italian, Spanish and other wikis and we will deploy to your wiki soon. [[m:Special:MyLanguage/Wikimedia_Foundation_Legal_and_Safety_Contacts_FAQ|Please read more on the project page]] and leave any comments in this thread or on the [[m:Special:MyLanguage/Talk:Wikimedia Foundation Legal and Safety Contacts FAQ|talk page]].
<section end="Message"/>
</div>
-- [[User:Sannita (WMF)|User:Sannita (WMF)]] ([[User talk:Sannita (WMF)|talk]]) 13:31, ngày 25 tháng 6 năm 2026 (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=User:Sannita_(WMF)/Mass_sending_test&oldid=30731267 -->
== Bản tin Kỹ thuật: Tuần 27-2026 ==
<section begin="technews-2026-W27"/><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/27|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'''
* Là một phần của [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|Thử nghiệm Tạo Tài khoản]], nhóm Phát triển đã thử nghiệm việc thêm biểu tượng tài khoản người dùng vào tiêu đề trang web trên di động dành cho người dùng chưa đăng nhập, cung cấp quyền truy cập trực tiếp vào các tác vụ "Tạo tài khoản" và "Đăng nhập". Thử nghiệm đã tăng số tài khoản được tạo lên khoảng 20% mà không ảnh hưởng tiêu cực đến chất lượng sửa đổi hoặc tỷ lệ sửa đổi mang tính xây dựng. Tính năng này giờ sẽ được triển khai đến tất cả các trang wiki của Quỹ Wikimedia trên giao diện web di động trong tuần đầu tiên của tháng 7. [https://phabricator.wikimedia.org/T428220]
* Sau một [[phab:T426248|thử nghiệm thành công]], người dùng đã đăng nhập nhưng chưa [[mw:Special:MyLanguage/Help:Email_confirmation|xác nhận địa chỉ email của mình]] khi tạo tài khoản sẽ nhìn thấy một biểu ngữ mới yêu cầu họ hoàn tất quy trình đó. Điều này giúp giảm nguy cơ người dùng bị mất quyền truy cập vào tài khoản của họ, và làm cho địa chỉ email của tài khoản nói chung trở nên đáng tin cậy hơn. Đâ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]]. [https://phabricator.wikimedia.org/T428292]
* Một bản cập nhật cho tính năng [[Special:Search|Tìm kiếm]] sẽ tinh chỉnh cách <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> hoạt động khi được sử dụng để loại trừ kết quả. Trước đây, việc sử dụng <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> với phủ định có thể vô tình mở rộng kết quả tìm kiếm bằng cách thêm các không gian tên nằm trong phạm vi tìm kiếm, dẫn đến hành vi gây khó hiểu đối với những người dùng mong đợi một bộ lọc loại trừ đơn giản. Với lần cập nhật này, <bdi lang="zxx" dir="ltr"><code><nowiki>-prefix:</nowiki></code></bdi> nay sẽ loại trừ chặt những tiêu đề trang trùng khớp như mong đợi và có thể hiển thị cảnh báo nếu không gian tên có liên quan không được chọn một cách rõ ràng. Mặc dù vậy, hành vi của <bdi lang="zxx" dir="ltr"><code><nowiki>prefix:</nowiki></code></bdi> khi không có phủ định vẫn sẽ không thay đổi. [https://phabricator.wikimedia.org/T427443]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:33}} {{PLURAL:33|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 người đánh giá sử dụng thanh công cụ Quản lý Trang (Page Curation) không tự động được đăng ký theo dõi các cuộc thảo luận mà họ bắt đầu bình luận trên trang nay đã được giải quyết. Người đánh giá giờ sẽ nhận được thông báo khi có người nào đó trả lời những cuộc thảo luận này. [https://phabricator.wikimedia.org/T329346]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Kể từ ngày 29 tháng 6, các lượt tải xuống tự động từ trang dumps.wikimedia.org sẽ phải tuân theo [[Foundation:Special:MyLanguage/Policy:Wikimedia Foundation User-Agent Policy|quy định về user-agent]]. Các yêu cầu tự động mà cung cấp user-agent trống hoặc chung chung sẽ bị chặn. Việc truy cập vào các bản sao lưu (dump) thông qua Dịch vụ Đám mây Wikimedia sẽ không bị ảnh hưởng. Đây là thông báo tiếp theo sau thông báo được đưa ra trong [[m:Special:MyLanguage/Tech/News/2026/25|Bản tin Kỹ thuật số 25-2026]].
* [[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.47/wmf.9|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/27|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W27"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 11:48, ngày 29 tháng 6 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=30744833 -->
== <span lang="en" dir="ltr">Tech News: 2026-28</span> ==
<div lang="en" dir="ltr">
<section begin="technews-2026-W28"/><div class="plainlinks">
Latest '''[[m:Special:MyLanguage/Tech/News|tech news]]''' from the Wikimedia technical community. Please tell other users about these changes. Not all changes will affect you. [[m:Special:MyLanguage/Tech/News/2026/28|Translations]] are available.
'''Updates for editors'''
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] View all {{formatnum:34}} community-submitted {{PLURAL:34|task|tasks}} that were [[m:Special:MyLanguage/Tech/News/Recently resolved community tasks|resolved last week]]. For example, an issue where the search bar results on Wikidata, showed English results instead of using the correct language fallback for users of language variants, has now been fixed. Search suggestions will now follow the expected language fallback chain. [https://phabricator.wikimedia.org/T429769]
'''Updates for technical contributors'''
* In preparation for [[m:Special:MyLanguage/Event:Celebrate Women|Celebrate Women campaign]] planned for March 2027, the Wikimedia Foundation’s [[m:Special:MyLanguage/Wikimedia Foundation/Advancement/Community Growth/Content Enablement|Content Enablement team]] has launched a 22-question survey to better understand technical contributions by women+ (anyone who identifies as a woman) across Wikimedia projects. The survey takes approximately 15–20 minutes to complete and will remain open until 20 July 2026. The [[m:Special:MyLanguage/Celebrate Women/Technical contributions survey|questions]] are also available on-wiki for review in advance.
* The [[mw:Special:MyLanguage/Extension:Score|Score extension]] now supports rendering music scores as SVG images in addition to PNG, addressing a long-standing [[:phab:T49578|feature request]] and resolving historical image quality issues. Both formats are now provided to clients, with PNG in the <bdi lang="zxx" dir="ltr"><code><nowiki>src</nowiki></code></bdi> attribute and SVG in the <bdi lang="zxx" dir="ltr"><code><nowiki>srcset</nowiki></code></bdi> attribute.
* The new [[wikitech:Parsoid|Parsoid]] parser [[mw:Special:MyLanguage/Parsoid/Parser_Unification/Updates|continues to be deployed to additional wikis]], making it easier to introduce new reading and editing features. It was enabled on French Wikipedia, bringing total progress to covering 78.9% of Wikipedia page views. Rollout to English Wikipedia desktop will progress through this week.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Recurrent item]] Detailed code updates later this week: [[mw:MediaWiki 1.47/wmf.10|MediaWiki]]
'''In depth'''
* The Wikimedia Hackathon 2026 [[diffblog:2026/06/29/wikimedia-hackathon-2026-building-collaborating-and-shaping-the-future-together/|recap blog post]] is now live. It highlights the projects, sessions, and social activities from this year’s event, and shares initial plans for the 2027 Wikimedia Hackathon.
'''''[[m:Special:MyLanguage/Tech/News|Tech news]]''' prepared by [[m:Special:MyLanguage/Tech/News/Writers|Tech News writers]] and posted by [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Contribute]] • [[m:Special:MyLanguage/Tech/News/2026/28|Translate]] • [[m:Tech|Get help]] • [[m:Talk:Tech/News|Give feedback]] • [[m:Global message delivery/Targets/Tech ambassadors|Subscribe or unsubscribe]].''
</div><section end="technews-2026-W28"/>
</div>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 13:57, ngày 6 tháng 7 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=30773578 -->
== Bản tin Kỹ thuật: Tuần 29-2026 ==
<section begin="technews-2026-W29"/><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/29|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 [[mw:Special:MyLanguage/Growth/Revise_Tone|Xem lại Giọng văn]] giúp người mới xác định những đoạn văn trong bài viết Wikipedia mà có thể chứa ngôn ngữ không bách khoa và khuyến khích họ xem xét lại giọng văn đó. Tính năng này đã được [[w:en:A/B_testing|thử nghiệm A/B]] trên các Wikipedia tiếng Ả Rập, tiếng Anh, tiếng Pháp và tiếng Bồ Đào Nha, tại đó tỷ lệ hoàn thành nhiệm vụ của người mới [[mw:Special:MyLanguage/Growth/Revise_Tone#Experiment_Results|tăng 38.7%]] so với nhiệm vụ Hiệu đính mặc định, mà không làm giảm chất lượng sửa đổi. Cuộc thử nghiệm đã kết thúc vào ngày 9 tháng 7 và tính năng này nay đã có sẵn cho tất cả mọi người trên các wiki này, đồng thời có thể cấu hình được thông qua Cấu hình Cộng đồng. [[phab:T426364|Kế hoạch]] dự kiến là sẽ phát hành Xem lại Giọng văn đến nhiều trang wiki hơn.
* Cấu hình cộng đồng cho phép [[mw:Special:MyLanguage/Help:Growth/Mentorship#Automated mentor list cleanup|tự động loại bỏ cố vấn không hoạt động]] dựa trên các tiêu chí có thể cấu hình được sẽ được kích hoạt vào thứ 5, ngày 16, [[mw:Special:MyLanguage/Growth/Deployment|trên một số wiki]] để đảm bảo danh sách cố vấn được cập nhật. Cố vấn là những người đóng góp có kinh nghiệm, tự nguyện tham gia giúp đỡ người dùng mới trên wiki thông qua [[mw:Special:MyLanguage/Growth/Feature summary|Tính năng Phát triển (Growth)]]. Bảo quản viên nay có thể chuẩn bị các cài đặt thông qua [[w:Special:CommunityConfiguration/Mentorship|Đặc biệt:Cấu hình Cộng đồng/Cố vấn]]; những cài đặt này sẽ có hiệu lực kể từ thứ 5.
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:38}} {{PLURAL:38|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 một số người dùng ứng dụng Wikipedia trên thiết bị Android bị đăng xuất ngay sau khi đăng nhập, khiến họ không thể duy trì trạng thái đăng nhập và sửa đổi trang, nay đã được giải quyết. [https://phabricator.wikimedia.org/T316916]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Việc sửa đổi trang thông qua đoạn mã người dùng hoặc tiện ích khiến cho nhãn danh sách theo dõi mà người dùng gán cho trang đó bị đặt lại. Vấn đề này nay đã được giải quyết. [https://phabricator.wikimedia.org/T423778]
* Để khắc phục lỗi Safari (xem [[phab:T425211]]), trên các wiki đã kích hoạt Parsoid, các liên kết wiki href nay sử dụng urls tuyệt đối thay vì url tương đối theo giao thức. Đầu ra API REST vẫn sẽ không thay đổi và sẽ tiếp tục sử dụng url tương đối theo giao thức. Các tiện ích, đoạn mã người dùng, bot và CSS có thể cần được điều chỉnh nếu chúng dựa vào sự hiện diện của url tương đối theo giao thức trong các liên kết wiki href. [https://phabricator.wikimedia.org/T431358]
* [[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.47/wmf.11|MediaWiki]]
'''Chuyên sâu'''
* Nhóm Nền tảng Thử nghiệm của Quỹ Wikimedia đã đăng bài viết trên blog phản ánh về năm đầu tiên thực hiện thử nghiệm có cấu trúc của họ. Bài viết nêu bật những thử nghiệm thành công như Kiểm tra Chép dán, Kiểm tra Nguồn tham khảo và Kiểm tra Giọng văn, những thử nghiệm đã cải thiện kết quả sửa đổi và được triển khai cho nhiều người dùng hơn, cũng như những thử nghiệm không dẫn đến việc thay đổi sản phẩm. [[diffblog:2026/07/07/moving-the-needle-how-we-test-new-ideas-across-wikimedia-projects|Đọc thêm]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/29|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W29"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 16:11, ngày 13 tháng 7 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=30804401 -->
== Bản tin Kỹ thuật: Tuần 30-2026 ==
<section begin="technews-2026-W30"/><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/30|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/Reader/Reader Experience|Nhóm Trải nghiệm Người đọc]] đã kết hợp phản hồi của cộng đồng xoay quanh vị trí của các nút sao theo dõi và nút danh sách theo dõi đối với [[mw:Special:MyLanguage/Readers/Reader Experience/WE3.3.4 Reading lists|tính năng beta Danh sách Đọc]], nhằm cho phép lưu lại các bài viết để đọc sau – một [[m:Special:MyLanguage/Community Wishlist/W102|mục danh sách mong muốn]] để đưa chức năng này lên web. Các biên tập viên được mời kích hoạt tính năng beta để thử nghiệm tính năng này và [[phab:T426453|chia sẻ suy nghĩ của mình]].
* [[mw:Special:MyLanguage/VisualEditor/Suggestion Mode|Chế độ Đề xuất]] cung cấp những đề xuất sửa đổi trong Trình Soạn thảo Trực quan để cải thiện các bài viết trên Wikipedia. [[Special:EditChecks|Mọi đề xuất]] đều [[mw:Special:MyLanguage/Help:Suggestion mode#For administrators – local customization|có thể được cộng đồng cấu hình]]. Tính năng [[mw:Special:MyLanguage/Edit check/TextMatch|Văn bản Khớp chính xác]] (TextMatch) là một cách giúp cho các tình nguyện viên có thể tạo đề xuất tùy chỉnh cục bộ. Tính năng này tìm kiếm các chuỗi văn bản trong bài viết, và nay cũng bao gồm việc hỗ trợ cho các biểu thức chính quy. Điều này mang lại cho các tình nguyện viên độ chính xác và tính linh hoạt cao hơn đối với những loại đề xuất mà họ có thể tạo ra cục bộ. Lưu ý: Đề xuất [[mw:Special:MyLanguage/Edit check/Configuration#:~:text=maximumEditcount|có thể được nhắm tới]] dựa trên số lần sửa đổi của người thực hiện sửa đổi cũng như các khía cạnh khác của trang. Bạn có thể [[mw:Special:MyLanguage/Help:Suggestion mode#Create custom local types of Suggestions|tìm ví dụ từ các cộng đồng khác]] để lấy cảm hứng, kể cả việc sử dụng Văn bản Khớp chính xác nhằm phát hiện: lỗi chính tả, lỗi ngữ pháp, có khả năng quảng cáo, lời sáo rỗng, cách sử dụng dấu gạch ngang hoặc dấu gạch nối không chính xác, từ khóa thời gian không cụ thể, tên lỗi thời, v.v. Bất kỳ [[mw:Special:MyLanguage/Talk:VisualEditor/Suggestion Mode|phản hồi]] nào đều được chúng tôi hoan nghênh.
* [[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ụ, sự cố về công cụ SVG Translate khiến cho nó có thể sử dụng phiên bản tập tin lỗi thời, khiến các bản dịch hiện có bị ghi đè khi các bản dịch mới được tải lên, nay đã được [[phab:T430577|giải quyết]]. Nhìn chung, trong quý cuối cùng từ tháng 4 đến tháng 6 năm 2026, Quỹ Wikimedia đã giải quyết khoảng 337 tác vụ cộng đồng.
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Trên các wiki có hỗ trợ Parsoid, Parsoid nay hiển thị tối đa 1.250 hình ảnh mỗi trang. Một danh mục theo dõi mới, "media-limit-reached", sẽ sớm được cung cấp để xác định các trang đã đạt đến giới hạn này, giúp dễ dàng tìm thấy nội dung có thể bị hạn chế đầu ra phương tiện trong quá trình hiển thị. Xem [[phab:T430854]] để biết thêm thông tin và cung cấp phản hồi.
* [[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.47/wmf.12|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/30|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W30"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 05:46, ngày 21 tháng 7 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=30836091 -->
== Request for comment (the future of Abstract Wikipedia) ==
<bdi lang="en" dir="ltr" class="mw-content-ltr">
Apologies if this has not yet been translated into your wiki's language. {{int:Please-translate}}
You are invited to voice your opinions in a [[:m:Requests for comment/The future of Abstract Wikipedia|request for comment about the future of Abstract Wikipedia]]. {{Int:Feedback-thanks-title}}
[[:m:User:Kowal2701|Kowal2701]] ([[:m:User talk:Kowal2701|talk]]) 12:25, ngày 24 tháng 7 năm 2026 (UTC)
</bdi>
<!-- Tin nhắn của Thành viên:DreamRimmer@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=30513860 -->
== Bản tin Kỹ thuật: Tuần 31-2026 ==
<section begin="technews-2026-W31"/><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/31|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|Wishlist item]] Công cụ [[mw:Special:MyLanguage/ContentTranslation|Dịch Nội dung]] nay hỗ trợ chế độ tối, nhằm đáp ứng [[m:Community Wishlist/W544|yêu cầu từ Mong muốn Cộng đồng]]. Điều này giúp công cụ tương thích với các tính năng hỗ trợ khả năng tiếp cận có sẵn trong các giao diện Vector 2022 và Minerva, giúp giảm việc gây mỏi mắt cho người dùng khi dịch nội dung. [https://phabricator.wikimedia.org/T367077]
* Chế độ soạn thảo mã nguồn của Công cụ Thảo luận (DiscussionTools) và Trình soạn thảo mã nguồn 2017 nay sẽ cung cấp tính năng tự động điền cho các liên kết (<bdi lang="zxx" dir="ltr"><code><nowiki>[[</nowiki></code></bdi>), bản mẫu (<bdi lang="zxx" dir="ltr"><code><nowiki>{{</nowiki></code></bdi>), thẻ HTML và phân tích cú pháp (<bdi lang="zxx" dir="ltr"><code><nowiki><</nowiki></code></bdi>), cũng như các từ ma thuật (<bdi lang="zxx" dir="ltr"><code><nowiki>__</nowiki></code></bdi>), giúp việc chèn các liên kết, bản mẫu và mã đánh dấu wiki khác trong quá trình sửa đổi trở nên nhanh chóng và dễ dàng hơn. [https://phabricator.wikimedia.org/T432400]
* [[mw:Special:MyLanguage/Readers/Reader Growth/Mobile page previews|Nhóm Phát triển Người đọc]] đã kết thúc việc thử nghiệm với tính năng xem trước trang trên thiết bị di động và sẽ không triển khai tính năng này nữa. Tính năng Xem trước Trang là một cửa sổ bật lên ở cuối trang xuất hiện khi người đọc nhấn vào liên kết xanh, hiển thị hình thu nhỏ, đoạn mở đầu và tùy chọn mở bài viết. Thử ngiệm cho thấy tỷ lệ giữ chân người dùng không thay đổi nhưng các chỉ số khác đều mang tính tiêu cực, điều này có nghĩa là người đọc trên trang web dành cho thiết bị di động thích truy cập trực tiếp vào các bài viết được liên kết hơn là sử dụng tính năng xem trước trang.
* Nhóm Trải nghiệm Người đọc đã bước đầu ghi nhận những kết quả khả quan từ [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|tính năng Danh sách Đọc]], trong đó 93% người dùng tham gia báo cáo rằng tính năng này hữu ích. Danh sách Đọc giúp người đọc hoạt động tích cực lưu lại các bài viết để đọc sau này và hỗ trợ mục tiêu học tập của họ trên các dự án Wikimedia. Nhóm dự định sẽ tiếp tục cải tiến trước khi mở rộng tính năng này cho nhiều người dùng hơn.
* Sáng kiến [[mw:Special:MyLanguage/Wikimedia Apps/Team/Explore Feed Refresh|Làm mới Nguồn cấp dữ liệu Khám phá]] đã được thử nghiệm với những người đọc mới và không thường xuyên sử dụng ứng dụng Wikipedia. Nguồn cấp dữ liệu được làm mới giúp người đọc khám phá những nội dung mới và phù hợp với mình. Với kết quả mức độ tương tác với nguồn cấp dữ liệu tăng 10,5%, nhóm Ứng dụng Wikimedia đã quyết định mở rộng việc thiết kế lại Nguồn cấp dữ liệu Trang chủ sang iOS, áp dụng những kinh nghiệm thu được từ phiên bản dành cho Android.
* [[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ố khiến cho tên chủ đề trong tính năng Hướng dẫn Bài viết hiển thị sai cách viết hoa trên Wikipedia tiếng Pháp nay đã được giải quyết. Tên chủ đề nay sẽ tuân theo đúng quy tắc viết hoa của ngôn ngữ đó. [https://phabricator.wikimedia.org/T427201]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Sau khi thực hiện một số [[mw:Special:MyLanguage/Contributors/Account Creation Experiments|Thử nghiệm Tạo Tài khoản]] để cải thiện tỷ lệ hoàn tất việc đăng ký, một phiên bản mới của trường tên người dùng trên trang [[Special:CreateAccount|Tạo Tài khoản]] đã được triển khai. Phiên bản này bao gồm [[:c:File:Create account - July 2026 updates.png|một cửa sổ bật lên nhằm tóm tắt quy định về tên người dùng]] để cung cấp hướng dẫn rõ ràng hơn trong quá trình tạo tài khoản. Là một phần của thay đổi này, các thông báo <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-helpusername</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-help</nowiki></code></bdi> mà một số cộng đồng đã cấu hình sẽ không còn được sử dụng nữa. Nếu cộng đồng muốn tùy chỉnh hướng dẫn hiển thị trong cửa sổ bật lên mới, cộng đồng có thể sửa đổi các thông báo sau: <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet1</nowiki></code></bdi>, <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet2</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>createacct-username-policy-popover-bullet3</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T430604]
* Cuối tuần này, [[mw:Special:MyLanguage/Help:Extension:CodeMirror|trình làm nổi bật cú pháp CodeMirror]] sẽ cung cấp [[w:en:Theme (computing)|các chủ đề]]. Các chủ đề có thể được chọn từ menu thả xuống trong hộp thoại [[mw:Special:MyLanguage/Help:Extension:CodeMirror#CodeMirror preferences|tùy chọn CodeMirror]] hoàn chỉnh. Đối với mã wiki, các chủ đề có sẵn là mặc định, thân thiện với người mù màu (trước đây là tùy chọn dễ phân biệt cho người mù màu trong [[Special:Preferences#mw-prefsection-editing]]) và không làm nổi bật. Đối với các ngôn ngữ lập trình (ví dụ: CSS/JavaScript/JSON/Vue/Lua), hiện có sẵn một vài chủ đề. Các chủ đề tương tự này sau này cũng sẽ có sẵn cho mã wiki. [https://phabricator.wikimedia.org/T163533]
* Kể từ giờ trở đi, các wiki có thể giới hạn sửa đổi trong không gian tên "Thành viên" chỉ cho chính thành viên đó và một số nhóm người dùng nhất định. [[mw:Special:MyLanguage/Manual:$wgRestrictUserPageEditing|Đọc tài liệu hướng dẫn cấu hình]] để 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.47/wmf.14|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/31|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W31"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:49, ngày 27 tháng 7 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=30856308 -->
== Bản tin Kỹ thuật: Tuần 32-2026 ==
<section begin="technews-2026-W32"/><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/32|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]] đã phát triển một [https://82db7c8d4b.catalyst.wmcloud.org/w/index.php?title=Regent%27s_Park&uselang=de bản vá demo] nhằm bọc thanh công cụ trang thành hai dòng nếu không có đủ không gian bề ngang cho tất cả các nút. Điều này nhằm mục đích giảm tình trạng quá tải trên thanh công cụ trong giao diện Vector 2022, có thể xảy ra trên một số trang ngôn ngữ Wikipedia trên một số độ rộng màn hình nhất định. [https://phabricator.wikimedia.org/T429518]
* Nhóm Trải nghiệm Người đọc dự kiến sẽ phát hành [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Danh sách Đọc]], một [[m:Special:MyLanguage/Community Wishlist Survey 2021/Mobile and apps/Have Apps reading lists available on Destop/Mobile|mục trong Danh sách Mong muốn Cộng đồng]], hiện đang có sẵn để dùng thử dưới dạng tính năng beta, dưới dạng tính năng đầy đủ vào tháng 9. Trước thời điểm đó, chúng tôi cần các tình nguyện viên biên dịch giúp [https://translatewiki.net/w/i.php?title=Special%3ATranslate&group=ext-readinglists&filter=&action=translate dịch các chuỗi này] sang những ngôn ngữ khác. Tính năng này giúp hỗ trợ các mục tiêu đọc và học tập trên Wikipedia.
* Vào tuần tới, mục lục trên các trang tập tin Wikimedia Commons sẽ được cải thiện bằng cách hợp nhất mục lục trang tập tin với mục lục của trang. Điều này sẽ giúp việc hiểu cấu trúc trang tập tin, điều hướng đến những đề mục cụ thể, và chia sẻ liên kết đến các đề mục riêng biệt trở nên dễ dàng hơn. [https://phabricator.wikimedia.org/T332644]
* [[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 một số hình [[w:TIFF|TIFF]] không thể tải được sau khi nhấn vào hình thu nhỏ của nó, khiến cho hình bị hỏng được hiển thị thay vì hình có kích thước đầy đủ, nay đã được giải quyết. [https://phabricator.wikimedia.org/T429326]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Bộ chọn biến và hàm trong Bộ lọc Sai phạm (AbuseFilter) đã được cập nhật để hỗ trợ tìm kiếm và tự động điền. Điều này sẽ giúp những người quản lý bộ lọc tìm kiếm biến hoặc hàm mong muốn nhanh hơn. [https://phabricator.wikimedia.org/T323698]
* Các định dạng MJPEG và VP8 đã bị loại bỏ khỏi trình phát video. Thay vào đó, định dạng MP4 (MPEG-4 Phần 2) được thêm vào, nhằm cung cấp video chất lượng cao hơn cho các thiết bị iPhone đời cũ. Việc cập nhật lại tất cả các video hiện có sẽ có thể mất vài tuần. Định dạng mặc định cho các thiết bị hiện đại vẫn sẽ được giữ nguyên (VP9/WebM). [https://phabricator.wikimedia.org/T358266]
* [[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.47/wmf.15|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/32|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W32"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 19:46, ngày 3 tháng 8 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=30872536 -->
== Bản tin Kỹ thuật: Tuần 33-2026 ==
<section begin="technews-2026-W33"/><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/33|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]] Công cụ mới Trình tạo Biểu đồ (ChartWizard) [[c:Special:ChartWizard/Data:Example.Pie.chart|nay đã có mặt trên Wikimedia Commons]] dành cho các thành viên có mong muốn tạo các biểu đồ từ dữ liệu của riêng mình. Trình hướng dẫn này giúp [[mw:Special:MyLanguage/Extension:Chart|phần mở rộng Chart]] trở nên thân thiện hơn với người mới bắt đầu bằng cách cho phép các biên tập viên tạo biểu đồ, chẳng hạn như biểu đồ cột và biểu đồ tròn, mà không cần phải sử dụng JSON. Các thành viên vẫn có thể chuyển sang trình soạn thảo mã JSON nếu họ muốn. Mọi ý kiến đóng góp về công cụ mới này đều được hoan nghênh trên [[m:Talk:Community Wishlist/W414|trang thảo luận của mong muốn này]].
* [[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 đề khiến cho tiện ích Hình ảnh của Ngày của ứng dụng Wikipedia dành cho iOS hiển thị cùng một hình ảnh mỗi ngày thay vì cập nhật hàng ngày, nay đã được giải quyết. [https://phabricator.wikimedia.org/T430692]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Hình ảnh SVG cho [[mw:Special:MyLanguage/Extension:Math|công thức toán học]] sẽ sớm được tạo trong trình duyệt thay vì trên máy chủ. MathML vẫn sẽ tiếp tục được tạo trên máy chủ và hiển thị trong trình duyệt mà không cần JavaScript. Wikibooks sẽ áp dụng thay đổi này vào ngày 12 tháng 8, Wikisource vào ngày 19 tháng 8 và Wikipedia từ ngày 20-27 tháng 8. Bạn có thể thử thay đổi này bằng cách chọn "{{int:Mw-math-mathjax}}" trong phần tùy chọn của bạn. Thay đổi này là một phần trong lộ trình [[mw:Special:MyLanguage/RESTBase/deprecation|ngừng sử dụng RESTBase]] và [[phab:T431372|ngừng sử dụng Mathoid]]. [https://phabricator.wikimedia.org/T271001]
* <span class="mw-translate-fuzzy">Các trang thể loại sẽ sớm hỗ trợ việc sắp xếp các mục theo thời gian chúng được thêm vào thể loại. Điều này sẽ giúp việc tìm kiếm các trang được xếp thể loại gần đây hoặc đã xếp từ lâu trở nên dễ dàng hơn. Tính năng này cũng sẽ cải thiện quy trình làm việc đối với các thể loại bảo trì chẳng hạn như danh sách trang chờ xóa và các tác vụ rà soát theo thời gian khác. Bạn có thể sử dụng tham số URL <bdi lang="zxx" dir="ltr"><code><nowiki>cldsort=timestamp</nowiki></code></bdi> trong chế độ xem thể loại để sắp xếp các mục này.</span> [https://phabricator.wikimedia.org/T433768]
* Các [[mw:Special:MyLanguage/Extension:Gadgets|tiện ích]] và đoạn mã người dùng trên các wiki của Wikimedia nay có thể sử dụng [[phab:T395347|các tính năng theo chuẩn ES2018]] và [[phab:T419142|các tính năng theo chuẩn ES2019]] trong đoạn mã JavaScript. Trước đây, nền tảng chỉ cho phép sử dụng tối đa đến chuẩn ES2017. MediaWiki kiểm tra mã nguồn để bảo vệ chức năng khỏi các lỗi cú pháp và đảm bảo các đoạn mã đều hợp lệ trên tất cả [[mw:Special:MyLanguage/Compatibility#Browser_support_matrix|các trình duyệt được hỗ trợ]]. [https://phabricator.wikimedia.org/T419142]
* [[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.47/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/33|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W33"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:45, ngày 10 tháng 8 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=30901051 -->
== Bản tin Kỹ thuật: Tuần 34-2026 ==
<section begin="technews-2026-W34"/><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/34|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:Extension:CampaignEvents/Registration/Worklist|Tính năng Danh sách Công việc (Worklist)]] dành cho công cụ Đăng ký Sự kiện nay đã có mặt trên tất cả các dự án wiki của Wikimedia. Với Danh sách Công việc, ban tổ chức sự kiện có thể thêm trực tiếp các bài viết mà sẽ là trọng tâm của sự kiện vào trang sự kiện. Danh sách Công việc cũng hỗ trợ tính năng [[mw:Special:MyLanguage/Help:Extension:CampaignEvents/Registration/Worklist#How Event Pathways uses the worklist|Lộ trình Sự kiện (Event Pathways)]] giúp thông báo cho các biên tập viên khác về sự kiện sắp hoặc đang diễn ra khi họ sửa đổi một bài viết có trong Danh sách Công việc của sự kiện đó. Đây là phiên bản khả thi tối thiểu (MVP), và chúng tôi hoan nghênh mọi ý kiến đóng góp. Các ban tổ chức được khuyến khích thử tính năng này. Buổi [[m:Special:MyLanguage/Event:Worklist Setup Workshop: Get Your Event Ready|Hội thảo Thực hành Danh sách Công việc]] sẽ diễn ra vào ngày 18 tháng 6 lúc 16:00 UTC và ngày 19 tháng 6 lúc 11:00 UTC.
'''Cập nhật cho biên tập viên'''
* [[Special:ShortPages]] hiển thị các trang ngắn dựa trên kích thước của chúng, nhưng trong nhiều trường hợp danh sách này bị lấp đầy bởi các trang định hướng và đổi hướng mềm, khiến việc tìm kiếm chính các bài viết ngắn đó trở nên khó khăn hơn. Kể từ cuối tuần này, bạn sẽ có thể loại bỏ một bài viết khỏi trang đặc biệt này bằng cách thêm từ ma thuật <bdi lang="zxx" dir="ltr"><code><nowiki>__EXPECTSHORTPAGE__</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T433203]
* Một wiki mới đã được tạo ra: {{int:project-localized-name-group-wikipedia/vi}} tiếng [[d:Q3436680|Bole]] ([[w:bol:|<bdi lang="zxx" dir="ltr"><code><nowiki>w:bol:</nowiki></code></bdi>]]) [https://phabricator.wikimedia.org/T429921]
* Kể từ tuần ngày 17 tháng 8, thanh công cụ trang sẽ tự động xuống thành hai hàng khi không còn đủ không gian theo chiều ngang để hiển thị tất cả các nút. Đây là một [[phab:T429518|bản vá đã được hợp nhất hoàn toàn từ nhóm Trải nghiệm Người đọc]] nhằm giảm bớt tình trạng chật không gian trên thanh công cụ của giao diện Vector 2022, một vấn đề mà có thể xảy ra trên một số phiên bản ngôn ngữ Wikipedia ở một số độ rộng màn hình nhất định.
* [[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ụ, việc tải các tập tin có dung lượng lớn lên Wikimedia Commons đã trở nên ổn định hơn và ít gặp lỗi hơn sau một số bản sửa lỗi liên quan đến lỗi tải lên "Không thể lấy khóa". [https://phabricator.wikimedia.org/T386640]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Debian Bullseye sẽ kết thúc Hỗ trợ Dài hạn vào ngày 31 tháng 8 năm 2026. [[phab:T434103|Một số dự án Cloud VPS]] vẫn còn instance đang chạy Debian Bullseye. Bảo trì viên của những dự án này được khuyến khích chuyển sang Debian Bookworm hoặc Debian Trixie. Hiện đã có trang [[wikitech:Help:Cloud VPS instance operating system migration|hướng dẫn di chuyển]] nhằm giúp thực hiện quy trình này, đồng thời các thành viên cũng có thể muốn xem xem liệu khối lượng công việc của họ có phù hợp hơn với Toolforge hay không. Nếu bạn cần trợ giúp hoặc không thể hoàn tất quá trình chuyển đổi trước ngày 31 tháng 8, vui lòng liên hệ với quản trị viên Cloud VPS càng sớm càng tốt. [[listarchive:list/cloud-announce@lists.wikimedia.org/thread/RVIPQSYLKMSL5M46JP6NEJVGVE6I2RXQ/|Đọc 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.47/wmf.16|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/34|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W34"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 21:03, ngày 17 tháng 8 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=30922806 -->
== Bản tin Kỹ thuật: Tuần 35-2026 ==
<section begin="technews-2026-W35"/><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/35|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'''
* Trang [[Special:CreateAccount|Đặc biệt:Tạo tài khoản]] đã được đơn giản hóa như là một phần của nỗ lực nhằm hiện đại hóa trải nghiệm tạo tài khoản. Khung hiển thị số liệu thống kê về dự án sẽ không còn xuất hiện bên cạnh biểu mẫu trên giao diện trang web máy tính và di động. Nhiều thử nghiệm tạo tài khoản cho thấy việc sử dụng biểu mẫu đơn giản hơn giúp người dùng mới hoàn tất quy trình đăng ký dễ dàng hơn. [https://phabricator.wikimedia.org/T433783]
* Để cải thiện hiệu suất trang, các hình ảnh nay sẽ chỉ được tải khi người dùng xem chúng. Điều này có nghĩa là những hình ảnh nằm ở phần dưới của bài viết sẽ không được tải nếu người đọc không bao giờ cuộn trang xuống phần đó của bài viết, điều này có thể ảnh hưởng đến một vài số liệu liên quan đến hình ảnh. [https://phabricator.wikimedia.org/T148047]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:42}} {{PLURAL:42|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 các hình thu nhỏ trên Abstract Wikipedia có thể không hiển thị được sau khi tập tin tương ứng được di chuyển trên Wikimedia Commons, nay đã được giải quyết. Các hình thu nhỏ nay sẽ được cập nhật chính xác khi tập tin được di chuyển. [https://phabricator.wikimedia.org/T433448]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Thẻ Thông tin Thành viên là một tính năng giúp các tuần tra viên xem thông tin về các tài khoản người dùng. Trước đây, tính năng này chỉ xuất hiện ở những nơi chẳng hạn như lịch sử trang, nhật trình và thay đổi gần đây. Giờ đây, các thành viên cũng có thể [[mw:Special:MyLanguage/Help:Extension:CheckUser#User_Info_card_in_page_content|đặt thẻ này vào nội dung trang]], bằng cách sử dụng hàm phân tích cú pháp <bdi lang="zxx" dir="ltr"><code><nowiki>{{#uic:}}</nowiki></code></bdi>. Điều này đặc biệt hữu ích trong các bản mẫu như [[:en:Template:Userlinks|<bdi lang="zxx" dir="ltr"><code><nowiki>{{Userlinks}}</nowiki></code></bdi>]] (hoặc các biến thể chuyên biệt của chúng), vì nó sẽ giúp việc xem thông tin về thành viên trên nhiều trang bảng tin nhắn trở nên dễ dàng hơn. Thẻ này sẽ chỉ được hiển thị với những người dùng đã kích hoạt tính năng này trong phần [[Special:Preferences#mw-input-wpcheckuser-userinfocard-enable|tùy chọn]] của mình. [https://phabricator.wikimedia.org/T424466]
* Do những rủi ro về bảo mật và quyền riêng tư của người dùng, chúng tôi đã vô hiệu hóa quyền truy cập vào các URL dẫn đến trang <bdi lang="zxx" dir="ltr"><code><nowiki>Special:MyPage</nowiki></code></bdi> khi sử dụng <bdi lang="zxx" dir="ltr"><code><nowiki>action=raw</nowiki></code></bdi>. Nếu điều này ảnh hưởng tới bạn, hãy cân nhắc xem bạn có thể sử dụng một phương thức nào đó thay thế hay không. Các URL dẫn đến trang <bdi lang="zxx" dir="ltr"><code><nowiki>Special:MyPage</nowiki></code></bdi> vẫn có thể truy cập và sử dụng được mà không cần sử dụng <bdi lang="zxx" dir="ltr"><code><nowiki>action=raw</nowiki></code></bdi>. Các URL cụ thể cho trang thành viên (v.d. <bdi lang="zxx" dir="ltr"><code><nowiki>User:Myusername</nowiki></code></bdi>) vẫn có thể được sử dụng với <bdi lang="zxx" dir="ltr"><code><nowiki>action=raw</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T120386]
* Nhờ một bản cập nhật, phần mềm tạo hình thu nhỏ đã được cải tiến. Nó bao gồm việc nâng cấp <bdi lang="zxx" dir="ltr"><code><nowiki>librsvg</nowiki></code></bdi> lên phiên bản 2.60 và <bdi lang="zxx" dir="ltr"><code><nowiki>ImageMagick</nowiki></code></bdi> lên 7, cũng như việc khắc phục một số lỗi tạo hình thu nhỏ đã tồn tại từ lâu chẳng hạn như lỗi hiển thị. [https://phabricator.wikimedia.org/T419815#12222841]
* [[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.47/wmf.17|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/35|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W35"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:45, ngày 24 tháng 8 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=30961208 -->
== Bản tin Kỹ thuật: Tuần 36-2026 ==
<section begin="technews-2026-W36"/><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/36|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ột hình thức mới cho Danh sách Mong muốn Cộng đồng hiện đang được lấy ý kiến đóng góp. Bạn có thể [[m:Special:MyLanguage/Community Wishlist/Community Wishlist 2027|đọc các ý tưởng đề xuất trên Meta]]. Quy trình mới này nhằm nâng cao hiệu quả sàng lọc, bỏ phiếu và ưu tiên cho các mong muốn nhằm đảm bảo tính minh bạch và sự cân bằng giữa các nhóm dự án và phiên bản ngôn ngữ. Đợt tham vấn này sẽ kéo dài trong vòng hai tuần.
'''Cập nhật cho biên tập viên'''
* Bản phát hành mới nhất của ứng dụng Wikipedia dành cho Android bao gồm các cập nhật đối với tính năng Đã lưu (Saved), giúp trải nghiệm lưu bài viết trên ứng dụng trở nên đồng bộ hơn với phiên bản iOS và Web. Bản cập nhật này thiết kế lại tab Đã lưu với giao diện “Tất cả bài viết”, xóa bỏ danh sách đọc mặc định “Đã lưu”, đổi tên các danh sách đọc thành “Bộ sưu tập” (Collections) và hiện đại hóa trải nghiệm lưu bài viết. [https://phabricator.wikimedia.org/T420788]
* Tính năng [[mw:Special:MyLanguage/Readers/Reader Experience/Reading lists|Danh sách Đọc]] đã được kích hoạt cho tất cả người dùng đã đăng nhập trên Wikipedia tiếng Bengali, tiếng Trung, tiếng Séc và tiếng Việt vào ngày 25 tháng 8, sau vài tháng hoạt động dưới dạng tính năng thử nghiệm (beta). Danh sách Đọc sẽ được triển khai đến tất cả người dùng đã đăng nhập trên Wikipedia tiếng Ả Rập, tiếng Pháp và tiếng Indonesia vào ngày 1 tháng 9, sau đó là Wikipedia tiếng Anh vào ngày 14 tháng 9, và trên tất cả các wiki Wikipedia còn lại vào ngày 28 tháng 9.
* Vào cuối tháng này, một số độc giả chưa đăng nhập trên Wikipedia tiếng Bengali, tiếng Séc, tiếng Ba Tư, tiếng Anh và tiếng Ba Lan sử dụng giao diện Minerva trên thiết bị di động sẽ nhìn thấy một [[mw:Special:MyLanguage/Readers/Reader_Growth/Minimal_Minerva|thanh điều hướng được cập nhật]] trong [[:w:vi:Thử nghiệm A/B|thử nghiệm A/B]]. Thử nghiệm này sẽ so sánh thanh điều hướng hiện tại với phiên bản mới được thiết kế nhằm giúp người dùng tìm kiếm thông tin một cách nhanh chóng và dễ dàng hơn. Mục tiêu là xác định xem những thay đổi này có khuyến khích độc giả quay lại thường xuyên hơn hay không. Thử nghiệm này sẽ không làm thay đổi trải nghiệm của người dùng và/hoặc biên tập viên đã đăng nhập.
* Các biên tập viên chuyên bảo trì các trang đổi hướng, bản mẫu và thể loại được sử dụng trên các trang đổi hướng nay có thêm các phương thức cải tiến để tìm kiếm và quản lý trang đổi hướng. Trước đây, các trang đổi hướng không thể tìm kiếm được. Hai từ khóa tìm kiếm mới, <bdi lang="zxx" dir="ltr"><code><nowiki>onlyredirects:</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>withredirects:</nowiki></code></bdi>, giờ đây cho phép tìm kiếm trực tiếp các trang đổi hướng và có thể kết hợp với các từ khóa hiện có như <bdi lang="zxx" dir="ltr"><code><nowiki>incategory:</nowiki></code></bdi>, <bdi lang="zxx" dir="ltr"><code><nowiki>intitle:</nowiki></code></bdi> và <bdi lang="zxx" dir="ltr"><code><nowiki>insource:</nowiki></code></bdi>. [https://phabricator.wikimedia.org/T204089]
* Các công cụ tìm kiếm ISBN để tạo các nguồn trích dẫn gần đây đã không hoạt động do các vấn đề liên quan đến dịch vụ bên ngoài. Các nhà phát triển đang nỗ lực để tìm giải pháp khắc phục. [https://phabricator.wikimedia.org/T435179]
* [[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 việc tìm kiếm trang theo thể loại sử dụng <bdi lang="zxx" dir="ltr"><code><nowiki>deepcat</nowiki></code></bdi> có thể không trả về kết quả hoặc trả về kết quả không liên quan nay đã được giải quyết. [https://phabricator.wikimedia.org/T414859]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Tên miền của URL cho hình thu nhỏ đang được thay đổi từ $1 sang thumb.wikimedia.org. Các URL cũ sẽ tiếp tục hoạt động trong tương lai gần, nhưng MediaWiki sẽ chuyển sang sử dụng tên miền mới. Các URL trỏ đến các loại tập tin đa phương tiện khác như tập tin gốc, video và tập tin chuyển mã vẫn sẽ được phục vụ từ upload.wikimedia.org. [https://phabricator.wikimedia.org/T427465]
* [https://www.mediawiki.org/w/index.php?api=wmf-math%2Fv1&title=Special%3ARestSandbox API Toán học (Math API)] của Wikimedia hiện đã lỗi thời và không còn được hỗ trợ. Các điểm cuối (endpoints) này sẽ chính thức ngừng hoạt động hoàn toàn vào cuối tháng 9 năm 2026. Các nhà phát triển gọi các điểm cuối này nên chuyển sang các giải pháp hiển thị toán học thay thế, chẳng hạn như [https://developer.mozilla.org/en-US/docs/Web/MathML MathML] tích hợp sẵn hoặc [https://www.mathjax.org/ MathJax]. Các hệ thống MediaWiki được cài đặt bởi bên thứ ba sử dụng phần mở rộng Math để hiển thị công thức bắt buộc phải nâng cấp lên phiên bản v1.43 trở lên để tránh gián đoạn dịch vụ.
* [[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.47/wmf.18|MediaWiki]]
'''Chuyên sâu'''
* Đọc thêm về [[mw:Special:MyLanguage/Edit_check/TextMatch|TextMatch]] trong một bài viết trên Diff có tiêu đề: [[diffblog:2026/08/28/custom-edit-suggestions-for-every-wiki-how-communities-are-shaping-suggestion-mode-with-textmatch/|Đề xuất sửa đổi tùy chỉnh cho mọi wiki: Cộng đồng đang định hình Chế độ Gợi ý với TextMatch như thế nào]].
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/36|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W36"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 20:53, ngày 31 tháng 8 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=30990659 -->
== Bản tin Kỹ thuật: Tuần 37-2026 ==
<section begin="technews-2026-W37"/><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/37|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 [[mw:Special:MyLanguage/Help:Growth/Tools/Add_a_link|Thêm Liên kết]] đã được nâng cấp cho người dùng trên Wikipedia tiếng Anh với khả năng phát hiện tốt hơn các liên kết có sự khác biệt về cách viết hoa. Cải tiến này sẽ giúp giảm bớt những gợi ý mơ hồ gây ra do sự khác biệt về cách viết viết hoa trong tiêu đề bài viết, bao gồm cả những bài viết về các sản phẩm văn hóa. Hiện kế hoạch cải tiến giai đoạn 2 đã được lên lịch, kế hoạch cũng sẽ nhằm mục đích chuẩn bị phát hành tính năng này ở các ngôn ngữ khác. [https://phabricator.wikimedia.org/T435526#12240876] [https://phabricator.wikimedia.org/T434259]
* Tính năng [[mw:Special:MyLanguage/Article_guidance|Chỉ dẫn bài viết]] sẽ được bật theo mặc định cho các biên tập viên mới trên Wikipedia tiếng Anh Đơn giản và Wikipedia tiếng Thổ Nhĩ Kỳ kể từ ngày 10 tháng 9 năm 2026 sau khi đã trải qua [[mw:Special:MyLanguage/Article_guidance/Updates#Summary_of_experiment_result|một cuộc thử nghiệm]]. Các biên tập viên mới có từ 0 đến 99 sửa đổi sẽ tự động nhìn thấy tính năng này khi họ nhấn vào liên kết đỏ hoặc sử dụng tùy chọn "[[tr:Vikipedi:Madde_sihirbazı|Madde oluşturto]]" (tạo bài viết) trên Wikipedia tiếng Thổ Nhĩ Kỳ để tạo bài viết mới. Thay đổi này nhằm mục đích giúp các biên tập viên mới tạo các bài viết có chất lượng cao hơn và đáp ứng các tiêu chuẩn của từng dự án Wikipedia. [[phab:maniphest/query/z3tcTjmLMxk5/#R|Các cải tiến bổ sung]] sẽ tiếp tục được thực hiện dựa trên kết quả thử nghiệm và phản hồi từ cộng đồng.
* Công cụ [https://pageviews.wmcloud.org Phân tích Lượt xem Trang] nhằm cho phép người dùng so sánh lượt xem giữa nhiều trang, năm nay đã tròn 10 tuổi và được bổ sung thêm một số tính năng mới. Chúng bao gồm [[toolforge:wikinav|WikiNav]] nhằm cung cấp thông tin chuyên sâu vào cách độc giả Wikipedia khám phá nội dung, thống kê sửa đổi trong mục [https://pageviews.wmcloud.org/siteviews?range=latest-30&sites=en.wikipedia.org Siteviews], khả năng [https://pageviews.wmcloud.org/massviews?source=wikiproject&project=en.wikipedia.org tra cứu bài viết thuộc Dự án Wiki], cũng như hỗ trợ chế độ tối. [https://phabricator.wikimedia.org/T378549]
* Một thanh điều hướng [[mw:Special:MyLanguage/Readers/Reader_Growth/Minimal_Minerva|Minerva được đơn giản hóa về mặt trực quan]] đang được thử nghiệm dành cho các độc giả chưa đăng nhập sử dụng giao diện web di động trên các dự án Wikipedia tiếng Bengal, tiếng Séc, tiếng Anh, tiếng Ba Tư và tiếng Ba Lan. Thử nghiệm này nhằm xác định xem việc đơn giản hóa thanh điều hướng có cải thiện việc giữ chân độc giả hay không. Thử nghiệm sẽ diễn ra từ ngày 31 tháng 8 đến ngày 28 tháng 9, và người dùng không cần phải thực hiện bất kỳ thao tác nào.
* [[m:Special:MyLanguage/WMDE Technical Wishes|Nhóm Mong muốn Kỹ thuật của WMDE]] đang thực hiện việc cải tiến [[en:Wikipedia:VisualEditor/Named references|tên nguồn tham khảo được tạo tự động trong Trình Soạn thảo Trực quan]]. Các biên tập viên sẽ chỉ nhận thấy một thay đổi nhỏ kể từ tuần này. Khi thêm tên nguồn tham khảo tự động việc đánh số sẽ bắt đầu tại <bdi lang="zxx" dir="ltr"><code><nowiki>:1</nowiki></code></bdi> thay vì <bdi lang="zxx" dir="ltr"><code><nowiki>:0</nowiki></code></bdi>. Đọc thêm trên [[m:WMDE Technical Wishes/References/VisualEditor automatic reference names|trang dự án]]. [https://gerrit.wikimedia.org/r/c/VisualEditor/VisualEditor/+/1332704]
* Tất cả các wiki sẽ [[m:Special:MyLanguage/Tech/Server switch|chuyển sang chế độ chỉ đọc trong vài phút]] vào ngày 23 tháng 9. Kế hoạch dự kiến diễn ra lúc 14:00 UTC. Thông tin thêm về kế hoạch này sẽ được xuất bản trong Bản tin Kỹ thuật và cũng sẽ được đăng lên trên từng wiki trong các tuần tiếp theo. [https://phabricator.wikimedia.org/T433363]
* [[File:Reload icon with two arrows.svg|12px|link=|class=skin-invert|Đề mục định kỳ]] Xem tất cả {{formatnum:25}} {{PLURAL:25|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 [[mw:Special:MyLanguage/Parsoid|Parsoid]] có thể xử lý sai các thẻ nowiki được lồng nhau, khiến nội dung bị mất và hiển thị nội dung không mong muốn nay đã được giải quyết. [https://phabricator.wikimedia.org/T435116]
'''Cập nhật cho những người đóng góp vào mảng kỹ thuật'''
* Bảo quản viên giao diện có thể cấu hình các tiện ích từ [[MediaWiki:Gadgets-definition]]. Định dạng của định nghĩa tiện ích đã được cập nhật và không còn yêu cầu tùy chọn <bdi lang="zxx" dir="ltr"><code><nowiki>ResourceLoader</nowiki></code></bdi> nữa, vì các tiện ích luôn được tải thông qua <bdi lang="zxx" dir="ltr"><code><nowiki>ResourceLoader</nowiki></code></bdi>. Điều này giúp đơn giản hóa cấu hình tiện ích bằng cách loại bỏ một tùy chọn không còn cần thiết nữa, giúp việc định nghĩa tiện ích trở nên dễ dàng hơn cho các bảo quản viên. [https://phabricator.wikimedia.org/T298199]
* [[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.47/wmf.19|MediaWiki]]
'''''[[m:Special:MyLanguage/Tech/News|Tin tức Kỹ thuật]]''' do [[m:Special:MyLanguage/Tech/News/Writers|các biên tập viên Bản tin Kỹ thuật]] chuẩn bị và được đăng bởi [[m:Special:MyLanguage/User:MediaWiki message delivery|bot]] • [[m:Special:MyLanguage/Tech/News#contribute|Đóng góp]] • [[m:Special:MyLanguage/Tech/News/2026/37|Biên dịch]] • [[m:Tech|Nhờ giúp đỡ]] • [[m:Talk:Tech/News|Phản hồi]] • [[m:Global message delivery/Targets/Tech ambassadors|Đăng ký hoặc huỷ đăng ký]].''
</div><section end="technews-2026-W37"/>
<bdi lang="en" dir="ltr">[[User:MediaWiki message delivery|MediaWiki message delivery]]</bdi> 18:44, ngày 7 tháng 9 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=31008437 -->
ckkb72bl5awndzl0eyr23gjs4p6wfcu
oesophagus
0
154475
2561466
2534663
2026-09-07T13:52:19Z
Kelly zhrm
58416
2561466
wikitext
text/x-wiki
{{also|opsophagos|œsophagus}}
=={{langname|en}}==
[[Image:Illu01 head neck.jpg|thumb|The (o)esophagus is at the bottom right]]
==={{ĐM|alt}}===
* {{alt|en|esophagus||US}}
* {{alt|en|œsophagus||dated}}
==={{ĐM|etym}}===
Từ {{der|en|grc|οἰσοφάγος|}}, từ {{m|grc|οἴσω|}}, dạng tương lai của {{m|grc|φέρω||mang, vác}} + {{m|grc|ἔφαγον||ăn}}.
==={{ĐM|pron}}===
* {{IPA4|en|/iːˈsɒfəɡəs/|/ɪˈsɒfəɡəs/|a=UK}}
* {{audio|en|LL-Q1860 (eng)-Vealhurl-oesophagus.wav|a=Southern England}}
* {{enPR|ĭ-säfʹə-gəs|a=US}}, {{IPA|en|/ɪˈsɑfəɡəs/}}
==={{ĐM|n}}===
{{en-noun|oesophagi|+}}
# {{lb|en|anatomy}} [[thực quản|Thực quản]].
#: {{syn|en|food pipe|gullet|weasand}}
===={{ĐM|drv}}====
{{col|en|megaoesophagus|oesophagean|oesophagic|oesophagismus
|Barrett's oesophagus
|oesophageal
|oesophagectomy
|oesophagitis
}}
===={{ĐM|see}}====
* {{pedia|lang=en|oesophagus}}
==={{ĐM|ref}}===
{{R:FVDP|db=ev}}
{{cln|en|Danh từ có số nhiều bất quy tắc}}
=={{langname|la}}==
==={{ĐM|etym}}===
Từ {{der|la|grc|οἰσοφάγος|}}, từ {{m|grc|οἴσω|}}, dạng tương lai của {{m|grc|φέρω||mang, vác}} + {{m|grc|ἔφαγον||ăn}}.
==={{ĐM|pron}}===
* {{la-IPA|oesophāgus|eccl=1}}
==={{ĐM|n}}===
{{la-noun|oesophāgus|g=m}} {{tlb|la|Medieval Latin}}
# {{lb|la|anatomy}} [[thực quản|Thực quản]].
#: {{syn|la|fistula cibālis}}
===={{ĐM|decl}}====
{{la-ndecl|oesophāgus<2>}}
===={{ĐM|desc}}====
{{col-top|3|desc}}
* {{desc|sq|ezofag|bor=1}}
* {{desc|ast|esófagu|lbor=1}}
* {{desc|ca|esòfag|lbor=1}}
* {{desc|nl|oesophagus|bor=1}}
* {{desc|bor=1|en|oesophagus}}
* {{desc|eo|ezofago|bor=1}}
* {{desc|fr|œsophage|lbor=1}}
* {{desc|fur|esofac|lbor=1}}
* {{desc|gl|esófago|lbor=1}}
* {{desc|de|Ösophagus|bor=1}}
* {{desc|id|esofagus|bor=1}}
* {{desc|ga|éasafagas|bor=1}}
* {{desc|it|esofago|bor=l1}}
* {{desc|ms|esofagus|bor=1}}
* {{desc|nb|øsofagus|bor=1}}
* {{desc|pt|esôfago|esófago|lbor=1}}
* {{desc|ro|esofag|lbor=1}}
* {{desc|es|esófago|lbor=1}}
* {{desc|tl|esopago|bor=1}}
* {{desc|cy|oesoffagws|bor=1}}
{{col-bottom}}
3jewkt0662i72m2eu0c5ldkyija6lp3
Thể loại:Tiếng Anh Ấn Độ
14
240995
2561564
2293432
2026-09-08T02:39:16Z
Hiyuune
50834
2561564
wikitext
text/x-wiki
{{auto cat|lect=1|lang=en|cat=Tiếng Anh Nam Á|Ấn Độ}}
etxn8zwb8ddshchq73sbt576y04q1ta
đồ cứu
0
250603
2561464
2559527
2026-09-07T13:06:36Z
TheHighFighter2
42988
/* Danh từ */
2561464
wikitext
text/x-wiki
=={{langname|vi}}==
==={{ĐM|pron}}===
{{vi-pron}}
==={{ĐM|noun}}===
{{vi-noun}}
# [[trò chơi|Trò chơi]] [[đuổi bắt]] nhiều người chơi. Khi người đuổi đến gần, người chạy hô "đồ" và đứng yên. Nếu người đuổi chạm vào ai, mà người đó không kịp hô thì bị bắt và thế chỗ đi đuổi. Những người còn lại giải vây bằng cách chạm vào người đã "đồ" và hô "cứu".
{{C|vi|Trò chơi}}
csaic2evrgi5cqi3epvvnx71ak156e6
Mô đun:scripts/data
828
256184
2561534
2559953
2026-09-08T00:44:51Z
Hiyuune
50834
2561534
Scribunto
text/plain
--[=[
When adding new scripts to this file, please don't forget to add
style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]].
]=]
local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local next = next
local remove = table.remove
local select = select
local sort = table.sort
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string/char")
return u(...)
end
-- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded
-- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the
-- character tables, which the second mw.loadData() will choke on.
local m_chars = require("Module:languages/chars")
local c = m_chars.chars
local p = m_chars.puaChars
local cs = m_chars.chars_substitutions
------------------------------------------------------------------------------------
--
-- Helper functions
--
------------------------------------------------------------------------------------
-- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal.
local function sort_ranges(a, b)
return a[1] < b[1] or a[1] == b[1] and a[2] > b[2]
end
-- Returns the union of two or more range tables.
local function union(...)
local ranges = {}
for i = 1, select("#", ...) do
local argt = select(i, ...)
for j, v in ipairs(argt) do
insert(ranges, {v, j % 2 == 1 and 1 or -1})
end
end
sort(ranges, sort_ranges)
local ret, i = {}, 0
for _, range in ipairs(ranges) do
i = i + range[2]
if i == 0 and range[2] == -1 then -- close
insert(ret, range[1])
elseif i == 1 and range[2] == 1 then -- open
if ret[#ret] and range[1] <= ret[#ret] + 1 then
remove(ret) -- merge adjacent ranges
else
insert(ret, range[1])
end
end
end
return ret
end
-- Adds the `characters` key, which is determined by a script's `ranges` table.
local function process_ranges(sc)
local ranges, chars = sc.ranges, {}
for i = 2, #ranges, 2 do
if ranges[i] == ranges[i - 1] then
insert(chars, u(ranges[i]))
else
insert(chars, u(ranges[i - 1]))
if ranges[i] > ranges[i - 1] + 1 then
insert(chars, "-")
end
insert(chars, u(ranges[i]))
end
end
sc.characters = concat(chars)
ranges.n = #ranges
return sc
end
local function handle_normalization_fixes(fixes)
local combiningClasses = fixes.combiningClasses
if combiningClasses then
local chars, i = {}, 0
for char in next, combiningClasses do
i = i + 1
chars[i] = char
end
fixes.combiningClassCharacters = concat(chars)
end
return fixes
end
------------------------------------------------------------------------------------
--
-- Data
--
------------------------------------------------------------------------------------
local m = {}
m["Adlm"] = process_ranges{
"Adlam",
19606346,
"alphabet",
ranges = {
0x061F, 0x061F,
0x0640, 0x0640,
0x1E900, 0x1E94B,
0x1E950, 0x1E959,
0x1E95E, 0x1E95F,
},
capitalized = true,
direction = "rtl",
}
m["Afak"] = {
"Afaka",
382019,
"syllabary",
-- Not in Unicode
}
m["Aghb"] = process_ranges{
"Caucasian Albanian",
2495716,
"alphabet",
ranges = {
0x10530, 0x10563,
0x1056F, 0x1056F,
},
}
m["Ahom"] = process_ranges{
"Ahom",
2839633,
"abugida",
ranges = {
0x11700, 0x1171A,
0x1171D, 0x1172B,
0x11730, 0x11746,
},
}
m["Arab"] = process_ranges{
"Ả Rập",
1828555,
"Abjad", -- more precisely, impure abjad
varieties = {"Jawi", {"Nastaliq", "Nastaleeq"}},
ranges = {
0x0600, 0x06FF,
0x0750, 0x077F,
0x0870, 0x088E,
0x0890, 0x0891,
0x0897, 0x08E1,
0x08E3, 0x08FF,
0xFB50, 0xFBC2,
0xFBD3, 0xFD8F,
0xFD92, 0xFDC7,
0xFDCF, 0xFDCF,
0xFDF0, 0xFDFF,
0xFE70, 0xFE74,
0xFE76, 0xFEFC,
0x102E0, 0x102FB,
0x10E60, 0x10E7E,
0x10EC2, 0x10EC4,
0x10EFC, 0x10EFF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
direction = "rtl",
normalizationFixes = handle_normalization_fixes{
from = {"ٳ"},
to = {"اٟ"}
},
}
m["fa-Arab"] = {
"Ả Rập",
744068,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
otherNames = {"Perso-Arabic"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["kk-Arab"] = {
"Ả Rập",
90681452,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["ks-Arab"] = m["fa-Arab"]
m["ku-Arab"] = m["fa-Arab"]
m["ms-Arab"] = m["kk-Arab"]
m["mzn-Arab"] = m["fa-Arab"]
m["ota-Arab"] = m["fa-Arab"]
m["pa-Arab"] = {
"Shahmukhi",
133800,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
otherNames = {"Ả Rập"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["ps-Arab"] = m["fa-Arab"]
m["sd-Arab"] = m["fa-Arab"]
m["tt-Arab"] = m["fa-Arab"]
m["ug-Arab"] = m["fa-Arab"]
m["ur-Arab"] = m["fa-Arab"]
-- Aran (Nastaliq) is subsumed into Arab
m["Armi"] = process_ranges{
"Imperial Aramaic",
26978,
"abjad",
ranges = {
0x10840, 0x10855,
0x10857, 0x1085F,
},
direction = "rtl",
}
m["Armn"] = process_ranges{
"Armenia",
11932,
"alphabet",
ranges = {
0x0531, 0x0556,
0x0559, 0x058A,
0x058D, 0x058F,
0xFB13, 0xFB17,
},
capitalized = true,
translit = "Armn-translit",
}
m["Avst"] = process_ranges{
"Avestan",
790681,
"alphabet",
ranges = {
0x10B00, 0x10B35,
0x10B39, 0x10B3F,
},
direction = "rtl",
}
m["pal-Avst"] = {
"Pazend",
4925073,
m["Avst"][3],
ranges = m["Avst"].ranges,
characters = m["Avst"].characters,
direction = "rtl",
parent = "Avst",
}
m["Bali"] = process_ranges{
"Bali",
804984,
"abugida",
ranges = {
0x1B00, 0x1B4C,
0x1B4E, 0x1B7F,
},
}
m["Bamu"] = process_ranges{
"Bamum",
806024,
"syllabary",
ranges = {
0xA6A0, 0xA6F7,
0x16800, 0x16A38,
},
}
m["Bass"] = process_ranges{
"Bassa",
810458,
"alphabet",
aliases = {"Bassa Vah", "Vah"},
ranges = {
0x16AD0, 0x16AED,
0x16AF0, 0x16AF5,
},
}
m["Batk"] = process_ranges{
"Batak",
51592,
"abugida",
ranges = {
0x1BC0, 0x1BF3,
0x1BFC, 0x1BFF,
},
}
m["Beng"] = process_ranges{
"Bengal",
756802,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09B0,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09EF,
0x09F2, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = handle_normalization_fixes{
from = {"অা", "ঋৃ", "ঌৢ"},
to = {"আ", "ৠ", "ৡ"}
},
}
m["as-Beng"] = process_ranges{
"Assam",
191272,
m["Beng"][3],
otherNames = {"Đông Nagari"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09AF,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = m["Beng"].normalizationFixes,
}
m["Bhks"] = process_ranges{
"Bhaiksuki",
17017839,
"abugida",
ranges = {
0x11C00, 0x11C08,
0x11C0A, 0x11C36,
0x11C38, 0x11C45,
0x11C50, 0x11C6C,
},
}
m["Blis"] = {
"Blissymbolic",
609817,
"logography",
aliases = {"Blissymbols"},
-- Not in Unicode
}
m["Bopo"] = process_ranges{
"Zhuyin",
198269,
"semisyllabary",
aliases = {"Zhuyin Fuhao", "Bopomofo"},
ranges = {
0x02EA, 0x02EB,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302A, 0x302D,
0x3030, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3105, 0x312F,
0x31A0, 0x31BF,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
},
}
m["Brah"] = process_ranges{
"Brahmi",
185083,
"abugida",
ranges = {
0x11000, 0x1104D,
0x11052, 0x11075,
0x1107F, 0x1107F,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"},
to = {"𑀆", "𑀌", "𑀐"}
},
translit = "Brah-translit",
}
m["Brai"] = process_ranges{
"Braille",
79894,
"alphabet",
ranges = {
0x2800, 0x28FF,
},
}
m["Bugi"] = process_ranges{
"Lontara",
1074947,
"abugida",
aliases = {"Buginese"},
ranges = {
0x1A00, 0x1A1B,
0x1A1E, 0x1A1F,
0xA9CF, 0xA9CF,
},
}
m["Buhd"] = process_ranges{
"Buhid",
1002969,
"abugida",
ranges = {
0x1735, 0x1736,
0x1740, 0x1751,
0x1752, 0x1753,
},
}
m["Cakm"] = process_ranges{
"Chakma",
1059328,
"abugida",
ranges = {
0x09E6, 0x09EF,
0x1040, 0x1049,
0x11100, 0x11134,
0x11136, 0x11147,
},
}
m["Cans"] = process_ranges{
"Canadian syllabic",
2479183,
"abugida",
ranges = {
0x1400, 0x167F,
0x18B0, 0x18F5,
0x11AB0, 0x11ABF,
},
}
m["Cari"] = process_ranges{
"Carian",
1094567,
"alphabet",
ranges = {
0x102A0, 0x102D0,
},
}
m["Cham"] = process_ranges{
"Chăm",
1060381,
"abugida",
ranges = {
0xAA00, 0xAA36,
0xAA40, 0xAA4D,
0xAA50, 0xAA59,
0xAA5C, 0xAA5F,
},
}
m["Cher"] = process_ranges{
"Cherokee",
26549,
"syllabary",
ranges = {
0x13A0, 0x13F5,
0x13F8, 0x13FD,
0xAB70, 0xABBF,
},
}
m["Chis"] = {
"Chisoi",
123173777,
"abugida",
-- Not in Unicode
}
m["Chrs"] = process_ranges{
"Khwarezmian",
72386710,
"abjad",
aliases = {"Chorasmian"},
ranges = {
0x10FB0, 0x10FCB,
},
direction = "rtl",
}
m["Copt"] = process_ranges{
"Coptic",
321083,
"alphabet",
ranges = {
0x03E2, 0x03EF,
0x2C80, 0x2CF3,
0x2CF9, 0x2CFF,
0x102E0, 0x102FB,
},
capitalized = true,
}
m["Cpmn"] = process_ranges{
"Cypro-Minoan",
1751985,
"syllabary",
aliases = {"Cypro Minoan"},
ranges = {
0x10100, 0x10101,
0x12F90, 0x12FF2,
},
}
m["Cprt"] = process_ranges{
"Cypriot",
1757689,
"syllabary",
ranges = {
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080A, 0x10835,
0x10837, 0x10838,
0x1083C, 0x1083C,
0x1083F, 0x1083F,
},
direction = "rtl",
}
m["Cyrl"] = process_ranges{
"Kirin",
8209,
"alphabet",
ranges = {
0x0400, 0x052F,
0x1C80, 0x1C8A,
0x1D2B, 0x1D2B,
0x1D78, 0x1D78,
0x1DF8, 0x1DF8,
0x2DE0, 0x2DFF,
0x2E43, 0x2E43,
0xA640, 0xA69F,
0xFE2E, 0xFE2F,
0x1E030, 0x1E06D,
0x1E08F, 0x1E08F,
},
capitalized = true,
}
m["Cyrs"] = {
"Kirin cổ",
442244,
m["Cyrl"][3],
ranges = m["Cyrl"].ranges,
characters = m["Cyrl"].characters,
capitalized = m["Cyrl"].capitalized,
normalizationFixes = handle_normalization_fixes{
from = {"Ѹ", "ѹ"},
to = {"Ꙋ", "ꙋ"}
},
strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics},
sort_key = {
remove_diacritics = cs.Cyrs_remove_diacritics,
from = {
"ї", "оу", -- 2 chars
"[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]"
},
to = {
"и" .. p[1], "у", {
["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1],
["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2],
["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о",
["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1],
["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1],
["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я",
["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4],
["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9],
}
},
}
}
m["Deva"] = process_ranges{
"Devanagari",
38592,
"abugida",
ranges = {
0x0900, 0x097F,
0x1CD0, 0x1CF6,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0xA830, 0xA839,
0xA8E0, 0xA8FF,
0x11B00, 0x11B09,
},
normalizationFixes = handle_normalization_fixes{
from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्?ा"},
to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"}
},
}
m["Diak"] = process_ranges{
"Dhives Akuru",
3307073,
"abugida",
aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"},
ranges = {
0x11900, 0x11906,
0x11909, 0x11909,
0x1190C, 0x11913,
0x11915, 0x11916,
0x11918, 0x11935,
0x11937, 0x11938,
0x1193B, 0x11946,
0x11950, 0x11959,
},
}
m["Dogr"] = process_ranges{
"Dogra",
72402987,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11800, 0x1183B,
},
}
m["Dsrt"] = process_ranges{
"Deseret",
1200582,
"alphabet",
ranges = {
0x10400, 0x1044F,
},
capitalized = true,
}
m["Dupl"] = process_ranges{
"Duployan",
5316025,
"alphabet",
ranges = {
0x1BC00, 0x1BC6A,
0x1BC70, 0x1BC7C,
0x1BC80, 0x1BC88,
0x1BC90, 0x1BC99,
0x1BC9C, 0x1BCA3,
},
}
m["Egyd"] = {
"Demotic",
188519,
"abjad, logography",
-- Not in Unicode
}
m["Egyh"] = {
"Hieratic",
208111,
"abjad, logography",
-- Unified with Egyptian hieroglyphic in Unicode
}
m["Egyp"] = process_ranges{
"Egyptian hieroglyphic",
132659,
"abjad, logography",
ranges = {
0x13000, 0x13455,
0x13460, 0x143FA,
},
varieties = {"Hieratic"},
wikipedia_article = "Egyptian hieroglyphs",
normalizationFixes = handle_normalization_fixes{
from = {"𓃁", "𓆖"},
to = {"𓃀𓂝", "𓆓𓏏𓇿"}
},
}
m["Elba"] = process_ranges{
"Elbasan",
1036714,
"alphabet",
ranges = {
0x10500, 0x10527,
},
}
m["Elym"] = process_ranges{
"Elymaic",
60744423,
"abjad",
ranges = {
0x10FE0, 0x10FF6,
},
direction = "rtl",
}
m["Ethi"] = process_ranges{
"Ethiopic",
257634,
"abugida",
aliases = {"Ge'ez", "Geʽez"},
ranges = {
0x1200, 0x1248,
0x124A, 0x124D,
0x1250, 0x1256,
0x1258, 0x1258,
0x125A, 0x125D,
0x1260, 0x1288,
0x128A, 0x128D,
0x1290, 0x12B0,
0x12B2, 0x12B5,
0x12B8, 0x12BE,
0x12C0, 0x12C0,
0x12C2, 0x12C5,
0x12C8, 0x12D6,
0x12D8, 0x1310,
0x1312, 0x1315,
0x1318, 0x135A,
0x135D, 0x137C,
0x1380, 0x1399,
0x2D80, 0x2D96,
0x2DA0, 0x2DA6,
0x2DA8, 0x2DAE,
0x2DB0, 0x2DB6,
0x2DB8, 0x2DBE,
0x2DC0, 0x2DC6,
0x2DC8, 0x2DCE,
0x2DD0, 0x2DD6,
0x2DD8, 0x2DDE,
0xAB01, 0xAB06,
0xAB09, 0xAB0E,
0xAB11, 0xAB16,
0xAB20, 0xAB26,
0xAB28, 0xAB2E,
0x1E7E0, 0x1E7E6,
0x1E7E8, 0x1E7EB,
0x1E7ED, 0x1E7EE,
0x1E7F0, 0x1E7FE,
},
}
m["Gara"] = process_ranges{
"Garay",
3095302,
"alphabet",
capitalized = true,
direction = "rtl",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x10D40, 0x10D65,
0x10D69, 0x10D85,
0x10D8E, 0x10D8F,
},
}
m["Geok"] = process_ranges{
"Khutsuri",
1090055,
"alphabet",
ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri
0x10A0, 0x10C5,
0x10C7, 0x10C7,
0x10CD, 0x10CD,
0x10FB, 0x10FB,
0x2D00, 0x2D25,
0x2D27, 0x2D27,
0x2D2D, 0x2D2D,
},
varieties = {"Nuskhuri", "Asomtavruli"},
capitalized = true,
}
m["Geor"] = process_ranges{
"Gruzia",
3317411,
"alphabet",
ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli)
0x0589, 0x0589,
0x10D0, 0x10FF,
0x1C90, 0x1CBA,
0x1CBD, 0x1CBF,
},
varieties = {"Mkhedruli", "Mtavruli"},
capitalized = true,
translit = "Geor-translit",
}
m["Glag"] = process_ranges{
"Glagolitic",
145625,
"alphabet",
ranges = {
0x0484, 0x0484,
0x0487, 0x0487,
0x0589, 0x0589,
0x10FB, 0x10FB,
0x2C00, 0x2C5F,
0x2E43, 0x2E43,
0xA66F, 0xA66F,
0x1E000, 0x1E006,
0x1E008, 0x1E018,
0x1E01B, 0x1E021,
0x1E023, 0x1E024,
0x1E026, 0x1E02A,
},
capitalized = true,
}
m["Gong"] = process_ranges{
"Gunjala Gondi",
18125340,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D60, 0x11D65,
0x11D67, 0x11D68,
0x11D6A, 0x11D8E,
0x11D90, 0x11D91,
0x11D93, 0x11D98,
0x11DA0, 0x11DA9,
},
}
m["Gonm"] = process_ranges{
"Masaram Gondi",
16977603,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D00, 0x11D06,
0x11D08, 0x11D09,
0x11D0B, 0x11D36,
0x11D3A, 0x11D3A,
0x11D3C, 0x11D3D,
0x11D3F, 0x11D47,
0x11D50, 0x11D59,
},
}
m["Goth"] = process_ranges{
"Gothic",
467784,
"alphabet",
ranges = {
0x10330, 0x1034A,
},
wikipedia_article = "Gothic alphabet",
}
m["Gran"] = process_ranges{
"Grantha",
1119274,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0BE6, 0x0BF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CF2, 0x1CF4,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0x11300, 0x11303,
0x11305, 0x1130C,
0x1130F, 0x11310,
0x11313, 0x11328,
0x1132A, 0x11330,
0x11332, 0x11333,
0x11335, 0x11339,
0x1133B, 0x11344,
0x11347, 0x11348,
0x1134B, 0x1134D,
0x11350, 0x11350,
0x11357, 0x11357,
0x1135D, 0x11363,
0x11366, 0x1136C,
0x11370, 0x11374,
0x11FD0, 0x11FD1,
0x11FD3, 0x11FD3,
},
}
m["Grek"] = process_ranges{
"Hy Lạp",
8216,
"alphabet",
ranges = {
0x0342, 0x0342,
0x0345, 0x0345,
0x0370, 0x0377,
0x037A, 0x037F,
0x0384, 0x038A,
0x038C, 0x038C,
0x038E, 0x03A1,
0x03A3, 0x03E1,
0x03F0, 0x03FF,
0x1D26, 0x1D2A,
0x1D5D, 0x1D61,
0x1D66, 0x1D6A,
0x1DBF, 0x1DBF,
0x2126, 0x2127,
0x2129, 0x2129,
0x213C, 0x2140,
0xAB65, 0xAB65,
0x10140, 0x1018E,
0x101A0, 0x101A0,
0x1D200, 0x1D245,
},
capitalized = true,
display_text = "Grek-common",
strip_diacritics = "Grek-common",
sort_key = {
remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia,
from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"},
to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"},
},
}
m["Polyt"] = process_ranges{
"Hy Lạp",
1475332,
m["Grek"][3],
ranges = union(m["Grek"].ranges, {
0x1F00, 0x1F15,
0x1F18, 0x1F1D,
0x1F20, 0x1F45,
0x1F48, 0x1F4D,
0x1F50, 0x1F57,
0x1F59, 0x1F59,
0x1F5B, 0x1F5B,
0x1F5D, 0x1F5D,
0x1F5F, 0x1F7D,
0x1F80, 0x1FB4,
0x1FB6, 0x1FC4,
0x1FC6, 0x1FD3,
0x1FD6, 0x1FDB,
0x1FDD, 0x1FEF,
0x1FF2, 0x1FF4,
0x1FF6, 0x1FFE,
}),
ietf_subtag = "Grek",
capitalized = m["Grek"].capitalized,
parent = "Grek",
display_text = m["Grek"].display_text,
strip_diacritics = "Polyt-stripdiacritics",
sort_key = m["Grek"].sort_key,
translit = "grc-translit",
}
m["Gujr"] = process_ranges{
"Gujarati",
733944,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A81, 0x0A83,
0x0A85, 0x0A8D,
0x0A8F, 0x0A91,
0x0A93, 0x0AA8,
0x0AAA, 0x0AB0,
0x0AB2, 0x0AB3,
0x0AB5, 0x0AB9,
0x0ABC, 0x0AC5,
0x0AC7, 0x0AC9,
0x0ACB, 0x0ACD,
0x0AD0, 0x0AD0,
0x0AE0, 0x0AE3,
0x0AE6, 0x0AF1,
0x0AF9, 0x0AFF,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"},
to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"}
},
}
m["Gukh"] = process_ranges{
"Khema",
110064239,
"abugida",
aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"},
ranges = {
0x0965, 0x0965,
0x16100, 0x16139,
},
}
m["Guru"] = process_ranges{
"Gurmukhi",
689894,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A01, 0x0A03,
0x0A05, 0x0A0A,
0x0A0F, 0x0A10,
0x0A13, 0x0A28,
0x0A2A, 0x0A30,
0x0A32, 0x0A33,
0x0A35, 0x0A36,
0x0A38, 0x0A39,
0x0A3C, 0x0A3C,
0x0A3E, 0x0A42,
0x0A47, 0x0A48,
0x0A4B, 0x0A4D,
0x0A51, 0x0A51,
0x0A59, 0x0A5C,
0x0A5E, 0x0A5E,
0x0A66, 0x0A76,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"},
to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"}
},
}
m["Hang"] = process_ranges{
"Hangul",
8222,
"chữ tượng thanh âm tiết",
aliases = {"Hangeul"},
ranges = {
0x1100, 0x11FF,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302E, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3131, 0x318E,
0x3200, 0x321E,
0x3260, 0x327E,
0xA960, 0xA97C,
0xAC00, 0xD7A3,
0xD7B0, 0xD7C6,
0xD7CB, 0xD7FB,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFFA0, 0xFFBE,
0xFFC2, 0xFFC7,
0xFFCA, 0xFFCF,
0xFFD2, 0xFFD7,
0xFFDA, 0xFFDC,
},
}
m["Hani"] = process_ranges{
"Hán",
8201,
"logography",
ranges = {
0x2E80, 0x2E99,
0x2E9B, 0x2EF3,
0x2F00, 0x2FD5,
0x2FF0, 0x2FFF,
0x3001, 0x3003,
0x3005, 0x3011,
0x3013, 0x301F,
0x3021, 0x302D,
0x3030, 0x3030,
0x3037, 0x303F,
0x3190, 0x319F,
0x31C0, 0x31E5,
0x31EF, 0x31EF,
0x3220, 0x3247,
0x3280, 0x32B0,
0x32C0, 0x32CB,
0x30FB, 0x30FB,
0x32FF, 0x32FF,
0x3358, 0x3370,
0x337B, 0x337F,
0x33E0, 0x33FE,
0x3400, 0x4DBF,
0x4E00, 0x9FFF,
0xA700, 0xA707,
0xF900, 0xFA6D,
0xFA70, 0xFAD9,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0x16FE2, 0x16FE3,
0x16FF0, 0x16FF1,
0x1D360, 0x1D371,
0x1F250, 0x1F251,
0x20000, 0x2A6DF,
0x2A700, 0x2B739,
0x2B740, 0x2B81D,
0x2B820, 0x2CEA1,
0x2CEB0, 0x2EBE0,
0x2EBF0, 0x2EE5D,
0x2F800, 0x2FA1D,
0x30000, 0x3134A,
0x31350, 0x323AF,
},
varieties = {"Hanzi", "Kanji", "Hanja", "chữ Nôm"},
spaces = false,
}
m["Hans"] = {
"Simplified Han",
185614,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hant"] = {
"Hán phồn thể",
178528,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hano"] = process_ranges{
"Hanunoo",
1584045,
"abugida",
aliases = {"Hanunó'o", "Hanuno'o"},
ranges = {
0x1720, 0x1736,
},
}
m["Hatr"] = process_ranges{
"Hatran",
20813038,
"abjad",
ranges = {
0x108E0, 0x108F2,
0x108F4, 0x108F5,
0x108FB, 0x108FF,
},
direction = "rtl",
}
m["Hebr"] = process_ranges{
"Do Thái",
33513,
"abjad", -- more precisely, impure abjad
ranges = {
0x0591, 0x05C7,
0x05D0, 0x05EA,
0x05EF, 0x05F4,
0x2135, 0x2138,
0xFB1D, 0xFB36,
0xFB38, 0xFB3C,
0xFB3E, 0xFB3E,
0xFB40, 0xFB41,
0xFB43, 0xFB44,
0xFB46, 0xFB4F,
},
direction = "rtl",
display_text = "Hebr-common",
sort_key = "Hebr-common",
strip_diacritics = "Hebr-common",
}
m["Hira"] = process_ranges{
"Hiragana",
48332,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3041, 0x3096,
0x3099, 0x30A0,
0x30FB, 0x30FC,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFF70, 0xFF70,
0xFF9E, 0xFF9F,
0x1B001, 0x1B11F,
0x1B132, 0x1B132,
0x1B150, 0x1B152,
0x1F200, 0x1F200,
},
varieties = {"Hentaigana"},
spaces = false,
}
m["Hluw"] = process_ranges{
"Anatolian hieroglyphic",
521323,
"logography, syllabary",
ranges = {
0x14400, 0x14646,
},
wikipedia_article = "Anatolian hieroglyphs",
}
m["Hmng"] = process_ranges{
"Pahawh Hmong",
365954,
"semisyllabary",
aliases = {"Hmong"},
ranges = {
0x16B00, 0x16B45,
0x16B50, 0x16B59,
0x16B5B, 0x16B61,
0x16B63, 0x16B77,
0x16B7D, 0x16B8F,
},
}
m["Hmnp"] = process_ranges{
"Nyiakeng Puachue Hmong",
33712499,
"alphabet",
ranges = {
0x1E100, 0x1E12C,
0x1E130, 0x1E13D,
0x1E140, 0x1E149,
0x1E14E, 0x1E14F,
},
}
m["Hung"] = process_ranges{
"Old Hungarian",
446224,
"alphabet",
aliases = {"Hungarian runic"},
ranges = {
0x10C80, 0x10CB2,
0x10CC0, 0x10CF2,
0x10CFA, 0x10CFF,
},
capitalized = true,
direction = "rtl",
}
m["Ibrnn"] = {
"Northeastern Iberian",
1113155,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Ibrns"] = {
"Southeastern Iberian",
2305351,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Image"] = {
-- To be used to avoid any formatting or link processing
"Image-rendered",
478798,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Inds"] = {
"Indus",
601388,
aliases = {"Harappan", "Indus Valley"},
}
m["Ipach"] = {
"International Phonetic Alphabet",
21204,
aliases = {"IPA"},
ietf_subtag = "Latn",
}
m["Ital"] = process_ranges{
"Old Italic",
4891256,
"alphabet",
ranges = {
0x10300, 0x10323,
0x1032D, 0x1032F,
},
}
m["Java"] = process_ranges{
"Java",
879704,
"abugida",
ranges = {
0xA980, 0xA9CD,
0xA9CF, 0xA9D9,
0xA9DE, 0xA9DF,
},
}
m["Jurc"] = {
"Jurchen",
912240,
"logography",
spaces = false,
}
m["Kali"] = process_ranges{
"Kayah Li",
4919239,
"abugida",
ranges = {
0xA900, 0xA92F,
},
}
m["Kana"] = process_ranges{
"Katakana",
82946,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3099, 0x309C,
0x30A0, 0x30FF,
0x31F0, 0x31FF,
0x32D0, 0x32FE,
0x3300, 0x3357,
0xFE45, 0xFE46,
0xFF61, 0xFF9F,
0x1AFF0, 0x1AFF3,
0x1AFF5, 0x1AFFB,
0x1AFFD, 0x1AFFE,
0x1B000, 0x1B000,
0x1B120, 0x1B122,
0x1B155, 0x1B155,
0x1B164, 0x1B167,
},
spaces = false,
}
m["Kawi"] = process_ranges{
"Kawi",
975802,
"abugida",
ranges = {
0x11F00, 0x11F10,
0x11F12, 0x11F3A,
0x11F3E, 0x11F5A,
},
}
m["Khar"] = process_ranges{
"Kharoshthi",
1161266,
"abugida",
ranges = {
0x10A00, 0x10A03,
0x10A05, 0x10A06,
0x10A0C, 0x10A13,
0x10A15, 0x10A17,
0x10A19, 0x10A35,
0x10A38, 0x10A3A,
0x10A3F, 0x10A48,
0x10A50, 0x10A58,
},
direction = "rtl",
}
m["Khmr"] = process_ranges{
"Khmer",
1054190,
"abugida",
ranges = {
0x1780, 0x17DD,
0x17E0, 0x17E9,
0x17F0, 0x17F9,
0x19E0, 0x19FF,
},
spaces = false,
normalizationFixes = handle_normalization_fixes{
from = {"ឣ", "ឤ"},
to = {"អ", "អា"}
},
}
m["Khoj"] = process_ranges{
"Khojki",
1740656,
"abugida",
ranges = {
0x0AE6, 0x0AEF,
0xA830, 0xA839,
0x11200, 0x11211,
0x11213, 0x11241,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"},
to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"}
},
}
m["Khomt"] = {
"Khom Thai",
13023788,
"abugida",
-- Not in Unicode
}
m["Kitl"] = {
"Khitan large",
6401797,
"logography",
spaces = false,
}
m["Kits"] = process_ranges{
"Khitan small",
6401800,
"logography, syllabary",
ranges = {
0x16FE4, 0x16FE4,
0x18B00, 0x18CD5,
0x18CFF, 0x18CFF,
},
spaces = false,
}
m["Knda"] = process_ranges{
"Kannada",
839666,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C80, 0x0C8C,
0x0C8E, 0x0C90,
0x0C92, 0x0CA8,
0x0CAA, 0x0CB3,
0x0CB5, 0x0CB9,
0x0CBC, 0x0CC4,
0x0CC6, 0x0CC8,
0x0CCA, 0x0CCD,
0x0CD5, 0x0CD6,
0x0CDD, 0x0CDE,
0x0CE0, 0x0CE3,
0x0CE6, 0x0CEF,
0x0CF1, 0x0CF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA830, 0xA835,
},
normalizationFixes = handle_normalization_fixes{
from = {"ಉಾ", "ಋಾ", "ಒೌ"},
to = {"ಊ", "ೠ", "ಔ"}
},
}
m["Kpel"] = {
"Kpelle",
1586299,
"syllabary",
-- Not in Unicode
}
m["Krai"] = process_ranges{
"Kirat Rai",
123173834,
"abugida",
aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"},
ranges = {
0x16D40, 0x16D79,
},
}
m["Kthi"] = process_ranges{
"Kaithi",
1253814,
"abugida",
ranges = {
0x0966, 0x096F,
0xA830, 0xA839,
0x11080, 0x110C2,
0x110CD, 0x110CD,
},
}
m["Kulit"] = {
"Kulitan",
6443044,
"abugida",
-- Not in Unicode
}
m["Lana"] = process_ranges{
"Tai Tham",
1314503,
"abugida",
aliases = {"Tham", "Tua Mueang", "Lanna"},
ranges = {
0x1A20, 0x1A5E,
0x1A60, 0x1A7C,
0x1A7F, 0x1A89,
0x1A90, 0x1A99,
0x1AA0, 0x1AAD,
},
spaces = false,
}
m["Laoo"] = process_ranges{
"Lao",
1815229,
"abugida",
ranges = {
0x0E81, 0x0E82,
0x0E84, 0x0E84,
0x0E86, 0x0E8A,
0x0E8C, 0x0EA3,
0x0EA5, 0x0EA5,
0x0EA7, 0x0EBD,
0x0EC0, 0x0EC4,
0x0EC6, 0x0EC6,
0x0EC8, 0x0ECE,
0x0ED0, 0x0ED9,
0x0EDC, 0x0EDF,
},
spaces = false,
}
m["Latn"] = process_ranges{
"Latinh",
8229,
"alphabet",
aliases = {"Roman"},
ranges = {
0x0041, 0x005A,
0x0061, 0x007A,
0x00AA, 0x00AA,
0x00BA, 0x00BA,
0x00C0, 0x00D6,
0x00D8, 0x00F6,
0x00F8, 0x02B8,
0x02C0, 0x02C1,
0x02E0, 0x02E4,
0x0363, 0x036F,
0x0485, 0x0486,
0x0951, 0x0952,
0x10FB, 0x10FB,
0x1D00, 0x1D25,
0x1D2C, 0x1D5C,
0x1D62, 0x1D65,
0x1D6B, 0x1D77,
0x1D79, 0x1DBE,
0x1DF8, 0x1DF8,
0x1E00, 0x1EFF,
0x202F, 0x202F,
0x2071, 0x2071,
0x207F, 0x207F,
0x2090, 0x209C,
0x20F0, 0x20F0,
0x2100, 0x2125,
0x2128, 0x2128,
0x212A, 0x2134,
0x2139, 0x213B,
0x2141, 0x214E,
0x2160, 0x2188,
0x2C60, 0x2C7F,
0xA700, 0xA707,
0xA722, 0xA787,
0xA78B, 0xA7CD,
0xA7D0, 0xA7D1,
0xA7D3, 0xA7D3,
0xA7D5, 0xA7DC,
0xA7F2, 0xA7FF,
0xA92E, 0xA92E,
0xAB30, 0xAB5A,
0xAB5C, 0xAB64,
0xAB66, 0xAB69,
0xFB00, 0xFB06,
0xFF21, 0xFF3A,
0xFF41, 0xFF5A,
0x10780, 0x10785,
0x10787, 0x107B0,
0x107B2, 0x107BA,
0x1DF00, 0x1DF1E,
0x1DF25, 0x1DF2A,
},
varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"},
capitalized = true,
translit = false,
}
m["Latf"] = {
"Fraktur",
148443,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
otherNames = {"Blackletter"}, -- Blackletter is actually the parent "script"
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Latg"] = {
"Gaelic",
1432616,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
otherNames = {"Irish"},
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["pjt-Latn"] = {
"Latin",
nil,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Leke"] = {
"Leke",
19572613,
"abugida",
-- Not in Unicode
}
m["Lepc"] = process_ranges{
"Lepcha",
1481626,
"abugida",
aliases = {"Róng"},
ranges = {
0x1C00, 0x1C37,
0x1C3B, 0x1C49,
0x1C4D, 0x1C4F,
},
}
m["Limb"] = process_ranges{
"Limbu",
933796,
"abugida",
ranges = {
0x0965, 0x0965,
0x1900, 0x191E,
0x1920, 0x192B,
0x1930, 0x193B,
0x1940, 0x1940,
0x1944, 0x194F,
},
}
m["Lina"] = process_ranges{
"Linear A",
30972,
ranges = {
0x10107, 0x10133,
0x10600, 0x10736,
0x10740, 0x10755,
0x10760, 0x10767,
},
}
m["Linb"] = process_ranges{
"Linear B",
190102,
ranges = {
0x10000, 0x1000B,
0x1000D, 0x10026,
0x10028, 0x1003A,
0x1003C, 0x1003D,
0x1003F, 0x1004D,
0x10050, 0x1005D,
0x10080, 0x100FA,
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
},
}
m["Lisu"] = process_ranges{
"Fraser",
1194621,
"alphabet",
aliases = {"Old Lisu", "Lisu"},
ranges = {
0x300A, 0x300B,
0xA4D0, 0xA4FF,
0x11FB0, 0x11FB0,
},
normalizationFixes = handle_normalization_fixes{
from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"},
to = {"ʼ", "ꓺ", "ꓻ"}
},
}
m["Loma"] = {
"Loma",
13023816,
"syllabary",
-- Not in Unicode
}
m["Lyci"] = process_ranges{
"Lycian",
913587,
"alphabet",
ranges = {
0x10280, 0x1029C,
},
}
m["Lydi"] = process_ranges{
"Lydian",
4261300,
"alphabet",
ranges = {
0x10920, 0x10939,
0x1093F, 0x1093F,
},
direction = "rtl",
}
m["Mahj"] = process_ranges{
"Mahajani",
6732850,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11150, 0x11176,
},
}
m["Maka"] = process_ranges{
"Makasar",
72947229,
"abugida",
aliases = {"Old Makasar"},
ranges = {
0x11EE0, 0x11EF8,
},
}
m["Mand"] = process_ranges{
"Mandaic",
1812130,
aliases = {"Mandaean"},
ranges = {
0x0640, 0x0640,
0x0840, 0x085B,
0x085E, 0x085E,
},
direction = "rtl",
}
m["Mani"] = process_ranges{
"Manichaean",
3544702,
"abjad",
ranges = {
0x0640, 0x0640,
0x10AC0, 0x10AE6,
0x10AEB, 0x10AF6,
},
direction = "rtl",
}
m["Marc"] = process_ranges{
"Marchen",
72403709,
"abugida",
ranges = {
0x11C70, 0x11C8F,
0x11C92, 0x11CA7,
0x11CA9, 0x11CB6,
},
}
m["Maya"] = process_ranges{
"Maya",
211248,
aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"},
ranges = {
0x1D2E0, 0x1D2F3,
},
}
m["Medf"] = process_ranges{
"Medefaidrin",
1519764,
aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"},
ranges = {
0x16E40, 0x16E9A,
},
capitalized = true,
}
m["Mend"] = process_ranges{
"Mende",
951069,
aliases = {"Mende Kikakui"},
ranges = {
0x1E800, 0x1E8C4,
0x1E8C7, 0x1E8D6,
},
direction = "rtl",
}
m["Merc"] = process_ranges{
"Meroitic cursive",
73028124,
"abugida",
ranges = {
0x109A0, 0x109B7,
0x109BC, 0x109CF,
0x109D2, 0x109FF,
},
direction = "rtl",
}
m["Mero"] = process_ranges{
"Meroitic hieroglyphic",
73028623,
"abugida",
ranges = {
0x10980, 0x1099F,
},
direction = "rtl",
wikipedia_article = "Meroitic hieroglyphs",
}
m["Mlym"] = process_ranges{
"Malayalam",
1164129,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0D00, 0x0D0C,
0x0D0E, 0x0D10,
0x0D12, 0x0D44,
0x0D46, 0x0D48,
0x0D4A, 0x0D4F,
0x0D54, 0x0D63,
0x0D66, 0x0D7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0xA830, 0xA832,
},
normalizationFixes = handle_normalization_fixes{
from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്", "ണ്", "ന്റ", "ന്", "മ്", "യ്", "ര്", "ല്", "ള്", "ഴ്", "െെ", "ൻ്റ"},
to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"}
},
}
m["Modi"] = process_ranges{
"Modi",
1703713,
"abugida",
ranges = {
0xA830, 0xA839,
0x11600, 0x11644,
0x11650, 0x11659,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"},
to = {"𑘊", "𑘋", "𑘌", "𑘍"}
},
}
m["Mong"] = process_ranges{
"Mongolian",
1055705,
"alphabet",
aliases = {"Mongol bichig", "Hudum Mongol bichig"},
ranges = {
0x1800, 0x1805,
0x180A, 0x1819,
0x1820, 0x1842,
0x1878, 0x1878,
0x1880, 0x1897,
0x18A6, 0x18A6,
0x18A9, 0x18A9,
0x200C, 0x200D,
0x202F, 0x202F,
0x3001, 0x3002,
0x3008, 0x300B,
0x11660, 0x11668,
},
direction = "vertical-ltr",
}
m["mnc-Mong"] = process_ranges{
"Manchu",
122888,
m["Mong"][3],
ranges = {
0x1801, 0x1801,
0x1804, 0x1804,
0x1808, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x185D,
0x185F, 0x1861,
0x1864, 0x1869,
0x186C, 0x1871,
0x1873, 0x1877,
0x1880, 0x1888,
0x188F, 0x188F,
0x189A, 0x18A5,
0x18A8, 0x18A8,
0x18AA, 0x18AA,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "Mong",
}
m["sjo-Mong"] = process_ranges{
"Xibe",
113624153,
m["Mong"][3],
aliases = {"Sibe"},
ranges = {
0x1804, 0x1804,
0x1807, 0x1807,
0x180A, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x1828,
0x182A, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x1872,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "mnc-Mong",
}
m["xwo-Mong"] = process_ranges{
"Clear Script",
529085,
m["Mong"][3],
aliases = {"Todo", "Todo bichig"},
ranges = {
0x1800, 0x1801,
0x1804, 0x1806,
0x180A, 0x1820,
0x1828, 0x1828,
0x182F, 0x1831,
0x1834, 0x1834,
0x1837, 0x1838,
0x183A, 0x183B,
0x1840, 0x1840,
0x1843, 0x185C,
0x1880, 0x1887,
0x1889, 0x188F,
0x1894, 0x1894,
0x1896, 0x1899,
0x18A7, 0x18A7,
0x200C, 0x200D,
0x202F, 0x202F,
0x11669, 0x1166C,
},
direction = "vertical-ltr",
parent = "Mong",
}
m["Moon"] = {
"Moon",
918391,
"alphabet",
aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"},
-- Not in Unicode
}
m["Morse"] = {
"Morse code",
79897,
ietf_subtag = "Zsym",
}
m["Mroo"] = process_ranges{
"Mru",
75919253,
aliases = {"Mro", "Mrung"},
ranges = {
0x16A40, 0x16A5E,
0x16A60, 0x16A69,
0x16A6E, 0x16A6F,
},
}
m["Mtei"] = process_ranges{
"Meitei Mayek",
2981413,
"abugida",
aliases = {"Meetei Mayek", "Manipuri"},
ranges = {
0xAAE0, 0xAAF6,
0xABC0, 0xABED,
0xABF0, 0xABF9,
},
}
m["Mult"] = process_ranges{
"Multani",
17047906,
"abugida",
ranges = {
0x0A66, 0x0A6F,
0x11280, 0x11286,
0x11288, 0x11288,
0x1128A, 0x1128D,
0x1128F, 0x1129D,
0x1129F, 0x112A9,
},
}
m["Music"] = process_ranges{
"musical notation",
233861,
"pictography",
ranges = {
0x2669, 0x266F,
0x1D100, 0x1D126,
0x1D129, 0x1D1EA,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Mymr"] = process_ranges{
"Miến Điện",
43887939,
"abugida",
aliases = {"Myanmar"},
ranges = {
0x1000, 0x109F,
0xA92E, 0xA92E,
0xA9E0, 0xA9FE,
0xAA60, 0xAA7F,
0x116D0, 0x116E3,
},
spaces = false,
}
m["Nagm"] = process_ranges{
"Mundari Bani",
106917274,
"alphabet",
aliases = {"Nag Mundari"},
ranges = {
0x1E4D0, 0x1E4F9,
},
}
m["Nand"] = process_ranges{
"Nandinagari",
6963324,
"abugida",
ranges = {
0x0964, 0x0965,
0x0CE6, 0x0CEF,
0x1CE9, 0x1CE9,
0x1CF2, 0x1CF2,
0x1CFA, 0x1CFA,
0xA830, 0xA835,
0x119A0, 0x119A7,
0x119AA, 0x119D7,
0x119DA, 0x119E4,
},
}
m["Narb"] = process_ranges{
"Ancient North Arabian",
1472213,
"abjad",
aliases = {"Old North Arabian"},
ranges = {
0x10A80, 0x10A9F,
},
direction = "rtl",
}
m["Nbat"] = process_ranges{
"Nabataean",
855624,
"abjad",
aliases = {"Nabatean"},
ranges = {
0x10880, 0x1089E,
0x108A7, 0x108AF,
},
direction = "rtl",
}
m["Newa"] = process_ranges{
"Newa",
7237292,
"abugida",
aliases = {"Newar", "Newari", "Prachalit Nepal"},
ranges = {
0x11400, 0x1145B,
0x1145D, 0x11461,
},
}
m["Nkdb"] = {
"Dongba",
1190953,
"pictography",
aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"},
spaces = false,
-- Not in Unicode
}
m["Nkgb"] = {
"Geba",
731189,
"syllabary",
aliases = {"Nakhi Geba", "Naxi Geba"},
spaces = false,
-- Not in Unicode
}
m["Nkoo"] = process_ranges{
"N'Ko",
1062587,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x07C0, 0x07FA,
0x07FD, 0x07FF,
0xFD3E, 0xFD3F,
},
direction = "rtl",
}
m["None"] = {
"unspecified",
nil,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Nshu"] = process_ranges{
"Nüshu",
56436,
"syllabary",
aliases = {"Nushu"},
ranges = {
0x16FE1, 0x16FE1,
0x1B170, 0x1B2FB,
},
spaces = false,
}
m["Ogam"] = process_ranges{
"Ogham",
184661,
ranges = {
0x1680, 0x169C,
},
}
m["Olck"] = process_ranges{
"Ol Chiki",
201688,
aliases = {"Ol Chemetʼ", "Ol", "Santali"},
ranges = {
0x1C50, 0x1C7F,
},
}
m["Onao"] = process_ranges{
"Ol Onal",
108607084,
"alphabet",
ranges = {
0x0964, 0x0965,
0x1E5D0, 0x1E5FA,
0x1E5FF, 0x1E5FF,
},
}
m["Orkh"] = process_ranges{
"Old Turkic",
5058305,
aliases = {"Orkhon runic"},
ranges = {
0x10C00, 0x10C48,
},
direction = "rtl",
}
m["Orya"] = process_ranges{
"Odia",
1760127,
"abugida",
aliases = {"Oriya"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B01, 0x0B03,
0x0B05, 0x0B0C,
0x0B0F, 0x0B10,
0x0B13, 0x0B28,
0x0B2A, 0x0B30,
0x0B32, 0x0B33,
0x0B35, 0x0B39,
0x0B3C, 0x0B44,
0x0B47, 0x0B48,
0x0B4B, 0x0B4D,
0x0B55, 0x0B57,
0x0B5C, 0x0B5D,
0x0B5F, 0x0B63,
0x0B66, 0x0B77,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ଅା", "ଏୗ", "ଓୗ"},
to = {"ଆ", "ଐ", "ଔ"}
},
}
m["Osge"] = process_ranges{
"Osage",
7105529,
ranges = {
0x104B0, 0x104D3,
0x104D8, 0x104FB,
},
capitalized = true,
}
m["Osma"] = process_ranges{
"Osmanya",
1377866,
ranges = {
0x10480, 0x1049D,
0x104A0, 0x104A9,
},
}
m["Ougr"] = process_ranges{
"Duy Ngô Nhĩ cổ",
1998938,
"abjad, alphabet",
ranges = {
0x0640, 0x0640,
0x10AF2, 0x10AF2,
0x10F70, 0x10F89,
},
-- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top.
direction = "rtl",
}
m["Palm"] = process_ranges{
"Palmyrene",
17538100,
ranges = {
0x10860, 0x1087F,
},
direction = "rtl",
}
m["Pauc"] = process_ranges{
"Pau Cin Hau",
25339852,
ranges = {
0x11AC0, 0x11AF8,
},
}
m["Pcun"] = {
"Proto-Cuneiform",
1650699,
"pictography",
-- Not in Unicode
}
m["Pelm"] = {
"Proto-Elamite",
56305763,
"pictography",
-- Not in Unicode
}
m["Perm"] = process_ranges{
"Old Permic",
147899,
ranges = {
0x0483, 0x0483,
0x10350, 0x1037A,
},
}
m["Phag"] = process_ranges{
"Phags-pa",
822836,
"abugida",
ranges = {
0x1802, 0x1803,
0x1805, 0x1805,
0x200C, 0x200D,
0x202F, 0x202F,
0x3002, 0x3002,
0xA840, 0xA877,
},
direction = "vertical-ltr",
}
m["Phli"] = process_ranges{
"Inscriptional Pahlavi",
24089793,
"abjad",
ranges = {
0x10B60, 0x10B72,
0x10B78, 0x10B7F,
},
direction = "rtl",
}
m["Phlp"] = process_ranges{
"Psalter Pahlavi",
7253954,
"abjad",
ranges = {
0x0640, 0x0640,
0x10B80, 0x10B91,
0x10B99, 0x10B9C,
0x10BA9, 0x10BAF,
},
direction = "rtl",
}
m["Phlv"] = {
"Book Pahlavi",
72403118,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Phnx"] = process_ranges{
"Phoenician",
26752,
"abjad",
ranges = {
0x10900, 0x1091B,
0x1091F, 0x1091F,
},
direction = "rtl",
}
m["Plrd"] = process_ranges{
"Pollard",
601734,
"abugida",
aliases = {"Miao"},
ranges = {
0x16F00, 0x16F4A,
0x16F4F, 0x16F87,
0x16F8F, 0x16F9F,
},
}
m["Prti"] = process_ranges{
"Inscriptional Parthian",
13023804,
ranges = {
0x10B40, 0x10B55,
0x10B58, 0x10B5F,
},
direction = "rtl",
}
m["Psin"] = {
"Proto-Sinaitic",
1065250,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Ranj"] = {
"Ranjana",
2385276,
"abugida",
-- Not in Unicode
}
m["Rjng"] = process_ranges{
"Rejang",
2007960,
"abugida",
ranges = {
0xA930, 0xA953,
0xA95F, 0xA95F,
},
}
m["Rohg"] = process_ranges{
"Hanifi Rohingya",
21028705,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0640, 0x0640,
0x06D4, 0x06D4,
0x10D00, 0x10D27,
0x10D30, 0x10D39,
},
direction = "rtl",
}
m["Roro"] = {
"Rongorongo",
209764,
-- Not in Unicode
}
m["Rumin"] = process_ranges{
"Rumi numerals",
nil,
ranges = {
0x10E60, 0x10E7E,
},
ietf_subtag = "Arab",
}
m["Runr"] = process_ranges{
"Runic",
82996,
"alphabet",
ranges = {
0x16A0, 0x16EA,
0x16EE, 0x16F8,
},
}
m["Samr"] = process_ranges{
"Samaritan",
1550930,
"abjad",
ranges = {
0x0800, 0x082D,
0x0830, 0x083E,
},
direction = "rtl",
}
m["Sarb"] = process_ranges{
"Ancient South Arabian",
446074,
"abjad",
aliases = {"Old South Arabian"},
ranges = {
0x10A60, 0x10A7F,
},
direction = "rtl",
}
m["Saur"] = process_ranges{
"Saurashtra",
3535165,
"abugida",
ranges = {
0xA880, 0xA8C5,
0xA8CE, 0xA8D9,
},
}
m["Semap"] = {
"flag semaphore",
250796,
"pictography",
ietf_subtag = "Zsym",
}
m["Sgnw"] = process_ranges{
"SignWriting",
1497335,
"pictography",
aliases = {"Sutton SignWriting"},
ranges = {
0x1D800, 0x1DA8B,
0x1DA9B, 0x1DA9F,
0x1DAA1, 0x1DAAF,
},
translit = false,
}
m["Shaw"] = process_ranges{
"Shavian",
1970098,
aliases = {"Shaw"},
ranges = {
0x10450, 0x1047F,
},
}
m["Shrd"] = process_ranges{
"Sharada",
2047117,
"abugida",
ranges = {
0x0951, 0x0951,
0x1CD7, 0x1CD7,
0x1CD9, 0x1CD9,
0x1CDC, 0x1CDD,
0x1CE0, 0x1CE0,
0xA830, 0xA835,
0xA838, 0xA838,
0x11180, 0x111DF,
},
}
m["Shui"] = {
"Sui",
752854,
"logography",
spaces = false,
-- Not in Unicode
}
m["Sidd"] = process_ranges{
"Siddham",
250379,
"abugida",
ranges = {
0x11580, 0x115B5,
0x115B8, 0x115DD,
},
}
m["Sidt"] = {
"Sidetic",
36659,
"alphabet",
direction = "rtl",
-- Not in Unicode
}
m["Sind"] = process_ranges{
"Khudabadi",
6402810,
"abugida",
aliases = {"Khudawadi"},
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x112B0, 0x112EA,
0x112F0, 0x112F9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"},
to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"}
},
}
m["Sinh"] = process_ranges{
"Sinhalese",
1574992,
"abugida",
aliases = {"Sinhala"},
ranges = {
0x0964, 0x0965,
0x0D81, 0x0D83,
0x0D85, 0x0D96,
0x0D9A, 0x0DB1,
0x0DB3, 0x0DBB,
0x0DBD, 0x0DBD,
0x0DC0, 0x0DC6,
0x0DCA, 0x0DCA,
0x0DCF, 0x0DD4,
0x0DD6, 0x0DD6,
0x0DD8, 0x0DDF,
0x0DE6, 0x0DEF,
0x0DF2, 0x0DF4,
0x1CF2, 0x1CF2,
0x111E1, 0x111F4,
},
normalizationFixes = handle_normalization_fixes{
from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"},
to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"}
},
}
m["Sogd"] = process_ranges{
"Sogdian",
578359,
"abjad",
ranges = {
0x0640, 0x0640,
0x10F30, 0x10F59,
},
direction = "rtl",
}
m["Sogo"] = process_ranges{
"Old Sogdian",
72403254,
"abjad",
ranges = {
0x10F00, 0x10F27,
},
direction = "rtl",
}
m["Sora"] = process_ranges{
"Sorang Sompeng",
7563292,
aliases = {"Sora Sompeng"},
ranges = {
0x110D0, 0x110E8,
0x110F0, 0x110F9,
},
}
m["Soyo"] = process_ranges{
"Soyombo",
8009382,
"abugida",
ranges = {
0x11A50, 0x11AA2,
},
}
m["Sund"] = process_ranges{
"Sundanese",
51589,
"abugida",
ranges = {
0x1B80, 0x1BBF,
0x1CC0, 0x1CC7,
},
}
m["Sunu"] = process_ranges{
"Sunuwar",
109984965,
"alphabet",
ranges = {
0x11BC0, 0x11BE1,
0x11BF0, 0x11BF9,
},
}
m["Sylo"] = process_ranges{
"Sylheti Nagri",
144128,
"abugida",
aliases = {"Sylheti Nāgarī", "Syloti Nagri"},
ranges = {
0x0964, 0x0965,
0x09E6, 0x09EF,
0xA800, 0xA82C,
},
}
m["Syrc"] = process_ranges{
"Syriac",
26567,
"abjad", -- more precisely, impure abjad
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0640, 0x0640,
0x064B, 0x0655,
0x0670, 0x0670,
0x0700, 0x070D,
0x070F, 0x074A,
0x074D, 0x074F,
0x0860, 0x086A,
0x1DF8, 0x1DF8,
0x1DFA, 0x1DFA,
},
direction = "rtl",
}
-- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues
m["Tagb"] = process_ranges{
"Tagbanwa",
977444,
"abugida",
ranges = {
0x1735, 0x1736,
0x1760, 0x176C,
0x176E, 0x1770,
0x1772, 0x1773,
},
}
m["Takr"] = process_ranges{
"Takri",
759202,
"abugida",
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x11680, 0x116B9,
0x116C0, 0x116C9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"},
to = {"𑚁", "𑚈", "𑚉", "𑚇"}
},
}
m["Tale"] = process_ranges{
"Tai Nüa",
2566326,
"abugida",
aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"},
ranges = {
0x1040, 0x1049,
0x1950, 0x196D,
0x1970, 0x1974,
},
spaces = false,
}
m["Talu"] = process_ranges{
"Tày Lự mới",
3498863,
"abugida",
ranges = {
0x1980, 0x19AB,
0x19B0, 0x19C9,
0x19D0, 0x19DA,
0x19DE, 0x19DF,
},
spaces = false,
}
m["Taml"] = process_ranges{
"Tamil",
26803,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B82, 0x0B83,
0x0B85, 0x0B8A,
0x0B8E, 0x0B90,
0x0B92, 0x0B95,
0x0B99, 0x0B9A,
0x0B9C, 0x0B9C,
0x0B9E, 0x0B9F,
0x0BA3, 0x0BA4,
0x0BA8, 0x0BAA,
0x0BAE, 0x0BB9,
0x0BBE, 0x0BC2,
0x0BC6, 0x0BC8,
0x0BCA, 0x0BCD,
0x0BD0, 0x0BD0,
0x0BD7, 0x0BD7,
0x0BE6, 0x0BFA,
0x1CDA, 0x1CDA,
0xA8F3, 0xA8F3,
0x11301, 0x11301,
0x11303, 0x11303,
0x1133B, 0x1133C,
0x11FC0, 0x11FF1,
0x11FFF, 0x11FFF,
},
normalizationFixes = handle_normalization_fixes{
from = {"அூ", "ஸ்ரீ"},
to = {"ஆ", "ஶ்ரீ"}
},
}
m["Tang"] = process_ranges{
"Tangut",
1373610,
"logography, syllabary",
ranges = {
0x31EF, 0x31EF,
0x16FE0, 0x16FE0,
0x17000, 0x187F7,
0x18800, 0x18AFF,
0x18D00, 0x18D08,
},
spaces = false,
}
m["Tavt"] = process_ranges{
"Tai Viet",
11818517,
"abugida",
ranges = {
0xAA80, 0xAAC2,
0xAADB, 0xAADF,
},
spaces = false,
}
m["Tayo"] = {
"Lai Tay",
16306701,
"abugida",
aliases = {"Tai Yo"},
direction = "vertical-rtl",
-- Not in Unicode
}
m["Telu"] = process_ranges{
"Telugu",
570450,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C00, 0x0C0C,
0x0C0E, 0x0C10,
0x0C12, 0x0C28,
0x0C2A, 0x0C39,
0x0C3C, 0x0C44,
0x0C46, 0x0C48,
0x0C4A, 0x0C4D,
0x0C55, 0x0C56,
0x0C58, 0x0C5A,
0x0C5D, 0x0C5D,
0x0C60, 0x0C63,
0x0C66, 0x0C6F,
0x0C77, 0x0C7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"},
to = {"ఔ", "ఓ", "ీ", "ే", "ో"}
},
}
m["Teng"] = {
"Tengwar",
473725,
}
m["Tfng"] = process_ranges{
"Tifinagh",
208503,
"abjad, alphabet",
ranges = {
0x2D30, 0x2D67,
0x2D6F, 0x2D70,
0x2D7F, 0x2D7F,
},
otherNames = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent
}
m["Tglg"] = process_ranges{
"Baybayin",
812124,
"abugida",
aliases = {"Tagalog"},
ranges = {
0x1700, 0x1715,
0x171F, 0x171F,
0x1735, 0x1736,
},
}
m["Thaa"] = process_ranges{
"Thaana",
877906,
"abugida",
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0660, 0x0669,
0x0780, 0x07B1,
0xFDF2, 0xFDF2,
0xFDFD, 0xFDFD,
},
direction = "rtl",
}
m["Thai"] = process_ranges{
"Thai",
236376,
"abugida",
ranges = {
0x0E01, 0x0E3A,
0x0E40, 0x0E5B,
},
spaces = false,
}
m["Tibt"] = process_ranges{
"Tạng",
46861,
"abugida",
ranges = {
0x0F00, 0x0F47,
0x0F49, 0x0F6C,
0x0F71, 0x0F97,
0x0F99, 0x0FBC,
0x0FBE, 0x0FCC,
0x0FCE, 0x0FD4,
0x0FD9, 0x0FDA,
0x3008, 0x300B,
},
normalizationFixes = handle_normalization_fixes{
combiningClasses = {["༹"] = 1},
from = {"ཷ", "ཹ"},
to = {"ྲཱྀ", "ླཱྀ"}
},
}
m["sit-tam-Tibt"] = {
"Tamyig",
109875213,
m["Tibt"][3],
ranges = m["Tibt"].ranges,
characters = m["Tibt"].characters,
parent = "Tibt",
normalizationFixes = m["Tibt"].normalizationFixes,
}
m["Tirh"] = process_ranges{
"Tirhuta",
1765752,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x1CF2, 0x1CF2,
0xA830, 0xA839,
0x11480, 0x114C7,
0x114D0, 0x114D9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"},
to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"}
},
}
m["Tnsa"] = process_ranges{
"Tangsa",
105576311,
"alphabet",
ranges = {
0x16A70, 0x16ABE,
0x16AC0, 0x16AC9,
},
}
m["Todr"] = process_ranges{
"Todhri",
10274731,
"alphabet",
direction = "rtl",
ranges = {
0x105C0, 0x105F3,
},
}
m["Tols"] = {
"Tolong Siki",
4459822,
"alphabet",
-- Not in Unicode
}
m["Toto"] = process_ranges{
"Toto",
104837516,
"abugida",
ranges = {
0x1E290, 0x1E2AE,
},
}
m["Tutg"] = process_ranges{
"Tigalari",
2604990,
"abugida",
aliases = {"Tulu"},
ranges = {
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA8F1, 0xA8F1,
0x11380, 0x11389,
0x1138B, 0x1138B,
0x1138E, 0x1138E,
0x11390, 0x113B5,
0x113B7, 0x113C0,
0x113C2, 0x113C2,
0x113C5, 0x113C5,
0x113C7, 0x113CA,
0x113CC, 0x113D5,
0x113D7, 0x113D8,
0x113E1, 0x113E2,
},
}
m["Ugar"] = process_ranges{
"Ugaritic",
332652,
"abjad",
ranges = {
0x10380, 0x1039D,
0x1039F, 0x1039F,
},
}
m["Vaii"] = process_ranges{
"Vai",
523078,
"syllabary",
ranges = {
0xA500, 0xA62B,
},
}
m["Visp"] = {
"Visible Speech",
1303365,
"alphabet",
-- Not in Unicode
}
m["Vith"] = process_ranges{
"Vithkuqi",
3301993,
"alphabet",
ranges = {
0x10570, 0x1057A,
0x1057C, 0x1058A,
0x1058C, 0x10592,
0x10594, 0x10595,
0x10597, 0x105A1,
0x105A3, 0x105B1,
0x105B3, 0x105B9,
0x105BB, 0x105BC,
},
capitalized = true,
}
m["Wara"] = process_ranges{
"Varang Kshiti",
79199,
aliases = {"Warang Citi"},
ranges = {
0x118A0, 0x118F2,
0x118FF, 0x118FF,
},
capitalized = true,
}
m["Wcho"] = process_ranges{
"Wancho",
33713728,
"alphabet",
ranges = {
0x1E2C0, 0x1E2F9,
0x1E2FF, 0x1E2FF,
},
}
m["Wole"] = {
"Woleai",
6643710,
"syllabary",
-- Not in Unicode
}
m["Xpeo"] = process_ranges{
"Old Persian",
1471822,
ranges = {
0x103A0, 0x103C3,
0x103C8, 0x103D5,
},
}
m["Xsux"] = process_ranges{
"hình nêm",
401,
aliases = {"chữ hình nêm Sumer-Akkad"},
ranges = {
0x12000, 0x12399,
0x12400, 0x1246E,
0x12470, 0x12474,
0x12480, 0x12543,
},
}
m["Yezi"] = process_ranges{
"Yezidi",
13175481,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0660, 0x0669,
0x10E80, 0x10EA9,
0x10EAB, 0x10EAD,
0x10EB0, 0x10EB1,
},
direction = "rtl",
}
m["Yiii"] = process_ranges{
"Yi",
1197646,
"syllabary",
ranges = {
0x3001, 0x3002,
0x3008, 0x3011,
0x3014, 0x301B,
0x30FB, 0x30FB,
0xA000, 0xA48C,
0xA490, 0xA4C6,
0xFF61, 0xFF65,
},
}
m["Zanb"] = process_ranges{
"Zanabazar Square",
50809208,
"abugida",
ranges = {
0x11A00, 0x11A47,
},
}
m["Zmth"] = process_ranges{
"mathematical notation",
1140046,
ranges = {
0x00AC, 0x00AC,
0x00B1, 0x00B1,
0x00D7, 0x00D7,
0x00F7, 0x00F7,
0x03D0, 0x03D2,
0x03D5, 0x03D5,
0x03F0, 0x03F1,
0x03F4, 0x03F6,
0x0606, 0x0608,
0x2016, 0x2016,
0x2032, 0x2034,
0x2040, 0x2040,
0x2044, 0x2044,
0x2052, 0x2052,
0x205F, 0x205F,
0x2061, 0x2064,
0x207A, 0x207E,
0x208A, 0x208E,
0x20D0, 0x20DC,
0x20E1, 0x20E1,
0x20E5, 0x20E6,
0x20EB, 0x20EF,
0x2102, 0x2102,
0x2107, 0x2107,
0x210A, 0x2113,
0x2115, 0x2115,
0x2118, 0x211D,
0x2124, 0x2124,
0x2128, 0x2129,
0x212C, 0x212D,
0x212F, 0x2131,
0x2133, 0x2138,
0x213C, 0x2149,
0x214B, 0x214B,
0x2190, 0x21A7,
0x21A9, 0x21AE,
0x21B0, 0x21B1,
0x21B6, 0x21B7,
0x21BC, 0x21DB,
0x21DD, 0x21DD,
0x21E4, 0x21E5,
0x21F4, 0x22FF,
0x2308, 0x230B,
0x2320, 0x2321,
0x237C, 0x237C,
0x239B, 0x23B5,
0x23B7, 0x23B7,
0x23D0, 0x23D0,
0x23DC, 0x23E2,
0x25A0, 0x25A1,
0x25AE, 0x25B7,
0x25BC, 0x25C1,
0x25C6, 0x25C7,
0x25CA, 0x25CB,
0x25CF, 0x25D3,
0x25E2, 0x25E2,
0x25E4, 0x25E4,
0x25E7, 0x25EC,
0x25F8, 0x25FF,
0x2605, 0x2606,
0x2640, 0x2640,
0x2642, 0x2642,
0x2660, 0x2663,
0x266D, 0x266F,
0x27C0, 0x27FF,
0x2900, 0x2AFF,
0x2B30, 0x2B44,
0x2B47, 0x2B4C,
0xFB29, 0xFB29,
0xFE61, 0xFE66,
0xFE68, 0xFE68,
0xFF0B, 0xFF0B,
0xFF1C, 0xFF1E,
0xFF3C, 0xFF3C,
0xFF3E, 0xFF3E,
0xFF5C, 0xFF5C,
0xFF5E, 0xFF5E,
0xFFE2, 0xFFE2,
0xFFE9, 0xFFEC,
0x1D400, 0x1D454,
0x1D456, 0x1D49C,
0x1D49E, 0x1D49F,
0x1D4A2, 0x1D4A2,
0x1D4A5, 0x1D4A6,
0x1D4A9, 0x1D4AC,
0x1D4AE, 0x1D4B9,
0x1D4BB, 0x1D4BB,
0x1D4BD, 0x1D4C3,
0x1D4C5, 0x1D505,
0x1D507, 0x1D50A,
0x1D50D, 0x1D514,
0x1D516, 0x1D51C,
0x1D51E, 0x1D539,
0x1D53B, 0x1D53E,
0x1D540, 0x1D544,
0x1D546, 0x1D546,
0x1D54A, 0x1D550,
0x1D552, 0x1D6A5,
0x1D6A8, 0x1D7CB,
0x1D7CE, 0x1D7FF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
translit = false,
}
m["Zsym"] = process_ranges{
"symbolic",
80071,
"pictography",
ranges = {
0x20DD, 0x20E0,
0x20E2, 0x20E4,
0x20E7, 0x20EA,
0x20F0, 0x20F0,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
0x2114, 0x2114,
0x2116, 0x2117,
0x211E, 0x2123,
0x2125, 0x2127,
0x212A, 0x212B,
0x212E, 0x212E,
0x2132, 0x2132,
0x2139, 0x213B,
0x214A, 0x214A,
0x214C, 0x214F,
0x21A8, 0x21A8,
0x21AF, 0x21AF,
0x21B2, 0x21B5,
0x21B8, 0x21BB,
0x21DC, 0x21DC,
0x21DE, 0x21E3,
0x21E6, 0x21F3,
0x2300, 0x2307,
0x230C, 0x231F,
0x2322, 0x237B,
0x237D, 0x239A,
0x23B6, 0x23B6,
0x23B8, 0x23CF,
0x23D1, 0x23DB,
0x23E3, 0x23FF,
0x2500, 0x259F,
0x25A2, 0x25AD,
0x25B8, 0x25BB,
0x25C2, 0x25C5,
0x25C8, 0x25C9,
0x25CC, 0x25CE,
0x25D4, 0x25E1,
0x25E3, 0x25E3,
0x25E5, 0x25E6,
0x25ED, 0x25F7,
0x2600, 0x2604,
0x2607, 0x263F,
0x2641, 0x2641,
0x2643, 0x265F,
0x2664, 0x266C,
0x2670, 0x27BF,
0x2B00, 0x2B2F,
0x2B45, 0x2B46,
0x2B4D, 0x2B73,
0x2B76, 0x2B95,
0x2B97, 0x2BFF,
0x4DC0, 0x4DFF,
0x1F000, 0x1F02B,
0x1F030, 0x1F093,
0x1F0A0, 0x1F0AE,
0x1F0B1, 0x1F0BF,
0x1F0C1, 0x1F0CF,
0x1F0D1, 0x1F0F5,
0x1F300, 0x1F6D7,
0x1F6DC, 0x1F6EC,
0x1F6F0, 0x1F6FC,
0x1F700, 0x1F776,
0x1F77B, 0x1F7D9,
0x1F7E0, 0x1F7EB,
0x1F7F0, 0x1F7F0,
0x1F800, 0x1F80B,
0x1F810, 0x1F847,
0x1F850, 0x1F859,
0x1F860, 0x1F887,
0x1F890, 0x1F8AD,
0x1F8B0, 0x1F8B1,
0x1F900, 0x1FA53,
0x1FA60, 0x1FA6D,
0x1FA70, 0x1FA7C,
0x1FA80, 0x1FA88,
0x1FA90, 0x1FABD,
0x1FABF, 0x1FAC5,
0x1FACE, 0x1FADB,
0x1FAE0, 0x1FAE8,
0x1FAF0, 0x1FAF8,
0x1FB00, 0x1FB92,
0x1FB94, 0x1FBCA,
0x1FBF0, 0x1FBF9,
},
translit = false,
character_category = false, -- none
}
m["Zyyy"] = {
"undetermined",
104839687,
-- This should not have any characters listed, probably
translit = false,
character_category = false, -- none
}
m["Zzzz"] = {
"uncoded",
104839675,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
-- These should be defined after the scripts they are composed of.
m["Hrkt"] = process_ranges{
"Kana",
187659,
"syllabary",
aliases = {"Japanese syllabaries"},
ranges = union(
m["Hira"].ranges,
m["Kana"].ranges
),
spaces = false,
}
m["Jpan"] = process_ranges{
"Japanese",
190502,
"logography, syllabary",
ranges = union(
m["Hrkt"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
spaces = false,
sort_by_scraping = true,
}
m["Kore"] = process_ranges{
"Korean",
711797,
"logography, syllabary",
ranges = union(
m["Hang"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
}
return require("Module:languages").finalizeData(m, "script")
nqqxpjb1yg4kjcwdiavj8er3kl6phvb
2561535
2561534
2026-09-08T00:45:01Z
Hiyuune
50834
2561535
Scribunto
text/plain
--[=[
When adding new scripts to this file, please don't forget to add
style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]].
]=]
local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local next = next
local remove = table.remove
local select = select
local sort = table.sort
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string/char")
return u(...)
end
-- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded
-- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the
-- character tables, which the second mw.loadData() will choke on.
local m_chars = require("Module:languages/chars")
local c = m_chars.chars
local p = m_chars.puaChars
local cs = m_chars.chars_substitutions
------------------------------------------------------------------------------------
--
-- Helper functions
--
------------------------------------------------------------------------------------
-- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal.
local function sort_ranges(a, b)
return a[1] < b[1] or a[1] == b[1] and a[2] > b[2]
end
-- Returns the union of two or more range tables.
local function union(...)
local ranges = {}
for i = 1, select("#", ...) do
local argt = select(i, ...)
for j, v in ipairs(argt) do
insert(ranges, {v, j % 2 == 1 and 1 or -1})
end
end
sort(ranges, sort_ranges)
local ret, i = {}, 0
for _, range in ipairs(ranges) do
i = i + range[2]
if i == 0 and range[2] == -1 then -- close
insert(ret, range[1])
elseif i == 1 and range[2] == 1 then -- open
if ret[#ret] and range[1] <= ret[#ret] + 1 then
remove(ret) -- merge adjacent ranges
else
insert(ret, range[1])
end
end
end
return ret
end
-- Adds the `characters` key, which is determined by a script's `ranges` table.
local function process_ranges(sc)
local ranges, chars = sc.ranges, {}
for i = 2, #ranges, 2 do
if ranges[i] == ranges[i - 1] then
insert(chars, u(ranges[i]))
else
insert(chars, u(ranges[i - 1]))
if ranges[i] > ranges[i - 1] + 1 then
insert(chars, "-")
end
insert(chars, u(ranges[i]))
end
end
sc.characters = concat(chars)
ranges.n = #ranges
return sc
end
local function handle_normalization_fixes(fixes)
local combiningClasses = fixes.combiningClasses
if combiningClasses then
local chars, i = {}, 0
for char in next, combiningClasses do
i = i + 1
chars[i] = char
end
fixes.combiningClassCharacters = concat(chars)
end
return fixes
end
------------------------------------------------------------------------------------
--
-- Data
--
------------------------------------------------------------------------------------
local m = {}
m["Adlm"] = process_ranges{
"Adlam",
19606346,
"alphabet",
ranges = {
0x061F, 0x061F,
0x0640, 0x0640,
0x1E900, 0x1E94B,
0x1E950, 0x1E959,
0x1E95E, 0x1E95F,
},
capitalized = true,
direction = "rtl",
}
m["Afak"] = {
"Afaka",
382019,
"syllabary",
-- Not in Unicode
}
m["Aghb"] = process_ranges{
"Caucasian Albanian",
2495716,
"alphabet",
ranges = {
0x10530, 0x10563,
0x1056F, 0x1056F,
},
}
m["Ahom"] = process_ranges{
"Ahom",
2839633,
"abugida",
ranges = {
0x11700, 0x1171A,
0x1171D, 0x1172B,
0x11730, 0x11746,
},
}
m["Arab"] = process_ranges{
"Ả Rập",
1828555,
"Abjad", -- more precisely, impure abjad
varieties = {"Jawi", {"Nastaliq", "Nastaleeq"}},
ranges = {
0x0600, 0x06FF,
0x0750, 0x077F,
0x0870, 0x088E,
0x0890, 0x0891,
0x0897, 0x08E1,
0x08E3, 0x08FF,
0xFB50, 0xFBC2,
0xFBD3, 0xFD8F,
0xFD92, 0xFDC7,
0xFDCF, 0xFDCF,
0xFDF0, 0xFDFF,
0xFE70, 0xFE74,
0xFE76, 0xFEFC,
0x102E0, 0x102FB,
0x10E60, 0x10E7E,
0x10EC2, 0x10EC4,
0x10EFC, 0x10EFF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
direction = "rtl",
normalizationFixes = handle_normalization_fixes{
from = {"ٳ"},
to = {"اٟ"}
},
}
m["fa-Arab"] = {
"Ả Rập",
744068,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
otherNames = {"Perso-Arabic"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["kk-Arab"] = {
"Ả Rập",
90681452,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["ks-Arab"] = m["fa-Arab"]
m["ku-Arab"] = m["fa-Arab"]
m["ms-Arab"] = m["kk-Arab"]
m["mzn-Arab"] = m["fa-Arab"]
m["ota-Arab"] = m["fa-Arab"]
m["pa-Arab"] = {
"Shahmukhi",
133800,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
otherNames = {"Ả Rập"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["ps-Arab"] = m["fa-Arab"]
m["sd-Arab"] = m["fa-Arab"]
m["tt-Arab"] = m["fa-Arab"]
m["ug-Arab"] = m["fa-Arab"]
m["ur-Arab"] = m["fa-Arab"]
-- Aran (Nastaliq) is subsumed into Arab
m["Armi"] = process_ranges{
"Imperial Aramaic",
26978,
"abjad",
ranges = {
0x10840, 0x10855,
0x10857, 0x1085F,
},
direction = "rtl",
}
m["Armn"] = process_ranges{
"Armenia",
11932,
"alphabet",
ranges = {
0x0531, 0x0556,
0x0559, 0x058A,
0x058D, 0x058F,
0xFB13, 0xFB17,
},
capitalized = true,
translit = "Armn-translit",
}
m["Avst"] = process_ranges{
"Avestan",
790681,
"alphabet",
ranges = {
0x10B00, 0x10B35,
0x10B39, 0x10B3F,
},
direction = "rtl",
}
m["pal-Avst"] = {
"Pazend",
4925073,
m["Avst"][3],
ranges = m["Avst"].ranges,
characters = m["Avst"].characters,
direction = "rtl",
parent = "Avst",
}
m["Bali"] = process_ranges{
"Bali",
804984,
"abugida",
ranges = {
0x1B00, 0x1B4C,
0x1B4E, 0x1B7F,
},
}
m["Bamu"] = process_ranges{
"Bamum",
806024,
"syllabary",
ranges = {
0xA6A0, 0xA6F7,
0x16800, 0x16A38,
},
}
m["Bass"] = process_ranges{
"Bassa",
810458,
"alphabet",
aliases = {"Bassa Vah", "Vah"},
ranges = {
0x16AD0, 0x16AED,
0x16AF0, 0x16AF5,
},
}
m["Batk"] = process_ranges{
"Batak",
51592,
"abugida",
ranges = {
0x1BC0, 0x1BF3,
0x1BFC, 0x1BFF,
},
}
m["Beng"] = process_ranges{
"Bengal",
756802,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09B0,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09EF,
0x09F2, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = handle_normalization_fixes{
from = {"অা", "ঋৃ", "ঌৢ"},
to = {"আ", "ৠ", "ৡ"}
},
}
m["as-Beng"] = process_ranges{
"Assam",
191272,
m["Beng"][3],
otherNames = {"Đông Nagari"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09AF,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = m["Beng"].normalizationFixes,
}
m["Bhks"] = process_ranges{
"Bhaiksuki",
17017839,
"abugida",
ranges = {
0x11C00, 0x11C08,
0x11C0A, 0x11C36,
0x11C38, 0x11C45,
0x11C50, 0x11C6C,
},
}
m["Blis"] = {
"Blissymbolic",
609817,
"logography",
aliases = {"Blissymbols"},
-- Not in Unicode
}
m["Bopo"] = process_ranges{
"Zhuyin",
198269,
"semisyllabary",
aliases = {"Zhuyin Fuhao", "Bopomofo"},
ranges = {
0x02EA, 0x02EB,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302A, 0x302D,
0x3030, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3105, 0x312F,
0x31A0, 0x31BF,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
},
}
m["Brah"] = process_ranges{
"Brahmi",
185083,
"abugida",
ranges = {
0x11000, 0x1104D,
0x11052, 0x11075,
0x1107F, 0x1107F,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"},
to = {"𑀆", "𑀌", "𑀐"}
},
translit = "Brah-translit",
}
m["Brai"] = process_ranges{
"Braille",
79894,
"alphabet",
ranges = {
0x2800, 0x28FF,
},
}
m["Bugi"] = process_ranges{
"Lontara",
1074947,
"abugida",
aliases = {"Buginese"},
ranges = {
0x1A00, 0x1A1B,
0x1A1E, 0x1A1F,
0xA9CF, 0xA9CF,
},
}
m["Buhd"] = process_ranges{
"Buhid",
1002969,
"abugida",
ranges = {
0x1735, 0x1736,
0x1740, 0x1751,
0x1752, 0x1753,
},
}
m["Cakm"] = process_ranges{
"Chakma",
1059328,
"abugida",
ranges = {
0x09E6, 0x09EF,
0x1040, 0x1049,
0x11100, 0x11134,
0x11136, 0x11147,
},
}
m["Cans"] = process_ranges{
"Canadian syllabic",
2479183,
"abugida",
ranges = {
0x1400, 0x167F,
0x18B0, 0x18F5,
0x11AB0, 0x11ABF,
},
}
m["Cari"] = process_ranges{
"Carian",
1094567,
"alphabet",
ranges = {
0x102A0, 0x102D0,
},
}
m["Cham"] = process_ranges{
"Chăm",
1060381,
"abugida",
ranges = {
0xAA00, 0xAA36,
0xAA40, 0xAA4D,
0xAA50, 0xAA59,
0xAA5C, 0xAA5F,
},
}
m["Cher"] = process_ranges{
"Cherokee",
26549,
"syllabary",
ranges = {
0x13A0, 0x13F5,
0x13F8, 0x13FD,
0xAB70, 0xABBF,
},
}
m["Chis"] = {
"Chisoi",
123173777,
"abugida",
-- Not in Unicode
}
m["Chrs"] = process_ranges{
"Khwarezmian",
72386710,
"abjad",
aliases = {"Chorasmian"},
ranges = {
0x10FB0, 0x10FCB,
},
direction = "rtl",
}
m["Copt"] = process_ranges{
"Coptic",
321083,
"alphabet",
ranges = {
0x03E2, 0x03EF,
0x2C80, 0x2CF3,
0x2CF9, 0x2CFF,
0x102E0, 0x102FB,
},
capitalized = true,
}
m["Cpmn"] = process_ranges{
"Cypro-Minoan",
1751985,
"syllabary",
aliases = {"Cypro Minoan"},
ranges = {
0x10100, 0x10101,
0x12F90, 0x12FF2,
},
}
m["Cprt"] = process_ranges{
"Cypriot",
1757689,
"syllabary",
ranges = {
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080A, 0x10835,
0x10837, 0x10838,
0x1083C, 0x1083C,
0x1083F, 0x1083F,
},
direction = "rtl",
}
m["Cyrl"] = process_ranges{
"Kirin",
8209,
"alphabet",
ranges = {
0x0400, 0x052F,
0x1C80, 0x1C8A,
0x1D2B, 0x1D2B,
0x1D78, 0x1D78,
0x1DF8, 0x1DF8,
0x2DE0, 0x2DFF,
0x2E43, 0x2E43,
0xA640, 0xA69F,
0xFE2E, 0xFE2F,
0x1E030, 0x1E06D,
0x1E08F, 0x1E08F,
},
capitalized = true,
}
m["Cyrs"] = {
"Kirin cổ",
442244,
m["Cyrl"][3],
ranges = m["Cyrl"].ranges,
characters = m["Cyrl"].characters,
capitalized = m["Cyrl"].capitalized,
normalizationFixes = handle_normalization_fixes{
from = {"Ѹ", "ѹ"},
to = {"Ꙋ", "ꙋ"}
},
strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics},
sort_key = {
remove_diacritics = cs.Cyrs_remove_diacritics,
from = {
"ї", "оу", -- 2 chars
"[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]"
},
to = {
"и" .. p[1], "у", {
["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1],
["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2],
["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о",
["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1],
["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1],
["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я",
["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4],
["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9],
}
},
}
}
m["Deva"] = process_ranges{
"Devanagari",
38592,
"abugida",
ranges = {
0x0900, 0x097F,
0x1CD0, 0x1CF6,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0xA830, 0xA839,
0xA8E0, 0xA8FF,
0x11B00, 0x11B09,
},
normalizationFixes = handle_normalization_fixes{
from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्?ा"},
to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"}
},
}
m["Diak"] = process_ranges{
"Dhives Akuru",
3307073,
"abugida",
aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"},
ranges = {
0x11900, 0x11906,
0x11909, 0x11909,
0x1190C, 0x11913,
0x11915, 0x11916,
0x11918, 0x11935,
0x11937, 0x11938,
0x1193B, 0x11946,
0x11950, 0x11959,
},
}
m["Dogr"] = process_ranges{
"Dogra",
72402987,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11800, 0x1183B,
},
}
m["Dsrt"] = process_ranges{
"Deseret",
1200582,
"alphabet",
ranges = {
0x10400, 0x1044F,
},
capitalized = true,
}
m["Dupl"] = process_ranges{
"Duployan",
5316025,
"alphabet",
ranges = {
0x1BC00, 0x1BC6A,
0x1BC70, 0x1BC7C,
0x1BC80, 0x1BC88,
0x1BC90, 0x1BC99,
0x1BC9C, 0x1BCA3,
},
}
m["Egyd"] = {
"Demotic",
188519,
"abjad, logography",
-- Not in Unicode
}
m["Egyh"] = {
"Hieratic",
208111,
"abjad, logography",
-- Unified with Egyptian hieroglyphic in Unicode
}
m["Egyp"] = process_ranges{
"Egyptian hieroglyphic",
132659,
"abjad, logography",
ranges = {
0x13000, 0x13455,
0x13460, 0x143FA,
},
varieties = {"Hieratic"},
wikipedia_article = "Egyptian hieroglyphs",
normalizationFixes = handle_normalization_fixes{
from = {"𓃁", "𓆖"},
to = {"𓃀𓂝", "𓆓𓏏𓇿"}
},
}
m["Elba"] = process_ranges{
"Elbasan",
1036714,
"alphabet",
ranges = {
0x10500, 0x10527,
},
}
m["Elym"] = process_ranges{
"Elymaic",
60744423,
"abjad",
ranges = {
0x10FE0, 0x10FF6,
},
direction = "rtl",
}
m["Ethi"] = process_ranges{
"Ethiopic",
257634,
"abugida",
aliases = {"Ge'ez", "Geʽez"},
ranges = {
0x1200, 0x1248,
0x124A, 0x124D,
0x1250, 0x1256,
0x1258, 0x1258,
0x125A, 0x125D,
0x1260, 0x1288,
0x128A, 0x128D,
0x1290, 0x12B0,
0x12B2, 0x12B5,
0x12B8, 0x12BE,
0x12C0, 0x12C0,
0x12C2, 0x12C5,
0x12C8, 0x12D6,
0x12D8, 0x1310,
0x1312, 0x1315,
0x1318, 0x135A,
0x135D, 0x137C,
0x1380, 0x1399,
0x2D80, 0x2D96,
0x2DA0, 0x2DA6,
0x2DA8, 0x2DAE,
0x2DB0, 0x2DB6,
0x2DB8, 0x2DBE,
0x2DC0, 0x2DC6,
0x2DC8, 0x2DCE,
0x2DD0, 0x2DD6,
0x2DD8, 0x2DDE,
0xAB01, 0xAB06,
0xAB09, 0xAB0E,
0xAB11, 0xAB16,
0xAB20, 0xAB26,
0xAB28, 0xAB2E,
0x1E7E0, 0x1E7E6,
0x1E7E8, 0x1E7EB,
0x1E7ED, 0x1E7EE,
0x1E7F0, 0x1E7FE,
},
}
m["Gara"] = process_ranges{
"Garay",
3095302,
"alphabet",
capitalized = true,
direction = "rtl",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x10D40, 0x10D65,
0x10D69, 0x10D85,
0x10D8E, 0x10D8F,
},
}
m["Geok"] = process_ranges{
"Khutsuri",
1090055,
"alphabet",
ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri
0x10A0, 0x10C5,
0x10C7, 0x10C7,
0x10CD, 0x10CD,
0x10FB, 0x10FB,
0x2D00, 0x2D25,
0x2D27, 0x2D27,
0x2D2D, 0x2D2D,
},
varieties = {"Nuskhuri", "Asomtavruli"},
capitalized = true,
}
m["Geor"] = process_ranges{
"Gruzia",
3317411,
"alphabet",
ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli)
0x0589, 0x0589,
0x10D0, 0x10FF,
0x1C90, 0x1CBA,
0x1CBD, 0x1CBF,
},
varieties = {"Mkhedruli", "Mtavruli"},
capitalized = true,
translit = "Geor-translit",
}
m["Glag"] = process_ranges{
"Glagolitic",
145625,
"alphabet",
ranges = {
0x0484, 0x0484,
0x0487, 0x0487,
0x0589, 0x0589,
0x10FB, 0x10FB,
0x2C00, 0x2C5F,
0x2E43, 0x2E43,
0xA66F, 0xA66F,
0x1E000, 0x1E006,
0x1E008, 0x1E018,
0x1E01B, 0x1E021,
0x1E023, 0x1E024,
0x1E026, 0x1E02A,
},
capitalized = true,
}
m["Gong"] = process_ranges{
"Gunjala Gondi",
18125340,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D60, 0x11D65,
0x11D67, 0x11D68,
0x11D6A, 0x11D8E,
0x11D90, 0x11D91,
0x11D93, 0x11D98,
0x11DA0, 0x11DA9,
},
}
m["Gonm"] = process_ranges{
"Masaram Gondi",
16977603,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D00, 0x11D06,
0x11D08, 0x11D09,
0x11D0B, 0x11D36,
0x11D3A, 0x11D3A,
0x11D3C, 0x11D3D,
0x11D3F, 0x11D47,
0x11D50, 0x11D59,
},
}
m["Goth"] = process_ranges{
"Gothic",
467784,
"alphabet",
ranges = {
0x10330, 0x1034A,
},
wikipedia_article = "Gothic alphabet",
}
m["Gran"] = process_ranges{
"Grantha",
1119274,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0BE6, 0x0BF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CF2, 0x1CF4,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0x11300, 0x11303,
0x11305, 0x1130C,
0x1130F, 0x11310,
0x11313, 0x11328,
0x1132A, 0x11330,
0x11332, 0x11333,
0x11335, 0x11339,
0x1133B, 0x11344,
0x11347, 0x11348,
0x1134B, 0x1134D,
0x11350, 0x11350,
0x11357, 0x11357,
0x1135D, 0x11363,
0x11366, 0x1136C,
0x11370, 0x11374,
0x11FD0, 0x11FD1,
0x11FD3, 0x11FD3,
},
}
m["Grek"] = process_ranges{
"Hy Lạp",
8216,
"alphabet",
ranges = {
0x0342, 0x0342,
0x0345, 0x0345,
0x0370, 0x0377,
0x037A, 0x037F,
0x0384, 0x038A,
0x038C, 0x038C,
0x038E, 0x03A1,
0x03A3, 0x03E1,
0x03F0, 0x03FF,
0x1D26, 0x1D2A,
0x1D5D, 0x1D61,
0x1D66, 0x1D6A,
0x1DBF, 0x1DBF,
0x2126, 0x2127,
0x2129, 0x2129,
0x213C, 0x2140,
0xAB65, 0xAB65,
0x10140, 0x1018E,
0x101A0, 0x101A0,
0x1D200, 0x1D245,
},
capitalized = true,
display_text = "Grek-common",
strip_diacritics = "Grek-common",
sort_key = {
remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia,
from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"},
to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"},
},
}
m["Polyt"] = process_ranges{
"Hy Lạp",
1475332,
m["Grek"][3],
ranges = union(m["Grek"].ranges, {
0x1F00, 0x1F15,
0x1F18, 0x1F1D,
0x1F20, 0x1F45,
0x1F48, 0x1F4D,
0x1F50, 0x1F57,
0x1F59, 0x1F59,
0x1F5B, 0x1F5B,
0x1F5D, 0x1F5D,
0x1F5F, 0x1F7D,
0x1F80, 0x1FB4,
0x1FB6, 0x1FC4,
0x1FC6, 0x1FD3,
0x1FD6, 0x1FDB,
0x1FDD, 0x1FEF,
0x1FF2, 0x1FF4,
0x1FF6, 0x1FFE,
}),
ietf_subtag = "Grek",
capitalized = m["Grek"].capitalized,
parent = "Grek",
display_text = m["Grek"].display_text,
strip_diacritics = "Polyt-stripdiacritics",
sort_key = m["Grek"].sort_key,
translit = "grc-translit",
}
m["Gujr"] = process_ranges{
"Gujarati",
733944,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A81, 0x0A83,
0x0A85, 0x0A8D,
0x0A8F, 0x0A91,
0x0A93, 0x0AA8,
0x0AAA, 0x0AB0,
0x0AB2, 0x0AB3,
0x0AB5, 0x0AB9,
0x0ABC, 0x0AC5,
0x0AC7, 0x0AC9,
0x0ACB, 0x0ACD,
0x0AD0, 0x0AD0,
0x0AE0, 0x0AE3,
0x0AE6, 0x0AF1,
0x0AF9, 0x0AFF,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"},
to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"}
},
}
m["Gukh"] = process_ranges{
"Khema",
110064239,
"abugida",
aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"},
ranges = {
0x0965, 0x0965,
0x16100, 0x16139,
},
}
m["Guru"] = process_ranges{
"Gurmukhi",
689894,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A01, 0x0A03,
0x0A05, 0x0A0A,
0x0A0F, 0x0A10,
0x0A13, 0x0A28,
0x0A2A, 0x0A30,
0x0A32, 0x0A33,
0x0A35, 0x0A36,
0x0A38, 0x0A39,
0x0A3C, 0x0A3C,
0x0A3E, 0x0A42,
0x0A47, 0x0A48,
0x0A4B, 0x0A4D,
0x0A51, 0x0A51,
0x0A59, 0x0A5C,
0x0A5E, 0x0A5E,
0x0A66, 0x0A76,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"},
to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"}
},
}
m["Hang"] = process_ranges{
"Hangul",
8222,
"chữ tượng thanh âm tiết",
aliases = {"Hangeul"},
ranges = {
0x1100, 0x11FF,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302E, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3131, 0x318E,
0x3200, 0x321E,
0x3260, 0x327E,
0xA960, 0xA97C,
0xAC00, 0xD7A3,
0xD7B0, 0xD7C6,
0xD7CB, 0xD7FB,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFFA0, 0xFFBE,
0xFFC2, 0xFFC7,
0xFFCA, 0xFFCF,
0xFFD2, 0xFFD7,
0xFFDA, 0xFFDC,
},
}
m["Hani"] = process_ranges{
"Hán",
8201,
"logography",
ranges = {
0x2E80, 0x2E99,
0x2E9B, 0x2EF3,
0x2F00, 0x2FD5,
0x2FF0, 0x2FFF,
0x3001, 0x3003,
0x3005, 0x3011,
0x3013, 0x301F,
0x3021, 0x302D,
0x3030, 0x3030,
0x3037, 0x303F,
0x3190, 0x319F,
0x31C0, 0x31E5,
0x31EF, 0x31EF,
0x3220, 0x3247,
0x3280, 0x32B0,
0x32C0, 0x32CB,
0x30FB, 0x30FB,
0x32FF, 0x32FF,
0x3358, 0x3370,
0x337B, 0x337F,
0x33E0, 0x33FE,
0x3400, 0x4DBF,
0x4E00, 0x9FFF,
0xA700, 0xA707,
0xF900, 0xFA6D,
0xFA70, 0xFAD9,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0x16FE2, 0x16FE3,
0x16FF0, 0x16FF1,
0x1D360, 0x1D371,
0x1F250, 0x1F251,
0x20000, 0x2A6DF,
0x2A700, 0x2B739,
0x2B740, 0x2B81D,
0x2B820, 0x2CEA1,
0x2CEB0, 0x2EBE0,
0x2EBF0, 0x2EE5D,
0x2F800, 0x2FA1D,
0x30000, 0x3134A,
0x31350, 0x323AF,
},
varieties = {"Hanzi", "Kanji", "Hanja", "chữ Nôm"},
spaces = false,
}
m["Hans"] = {
"Hán giản thể",
185614,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hant"] = {
"Hán phồn thể",
178528,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hano"] = process_ranges{
"Hanunoo",
1584045,
"abugida",
aliases = {"Hanunó'o", "Hanuno'o"},
ranges = {
0x1720, 0x1736,
},
}
m["Hatr"] = process_ranges{
"Hatran",
20813038,
"abjad",
ranges = {
0x108E0, 0x108F2,
0x108F4, 0x108F5,
0x108FB, 0x108FF,
},
direction = "rtl",
}
m["Hebr"] = process_ranges{
"Do Thái",
33513,
"abjad", -- more precisely, impure abjad
ranges = {
0x0591, 0x05C7,
0x05D0, 0x05EA,
0x05EF, 0x05F4,
0x2135, 0x2138,
0xFB1D, 0xFB36,
0xFB38, 0xFB3C,
0xFB3E, 0xFB3E,
0xFB40, 0xFB41,
0xFB43, 0xFB44,
0xFB46, 0xFB4F,
},
direction = "rtl",
display_text = "Hebr-common",
sort_key = "Hebr-common",
strip_diacritics = "Hebr-common",
}
m["Hira"] = process_ranges{
"Hiragana",
48332,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3041, 0x3096,
0x3099, 0x30A0,
0x30FB, 0x30FC,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFF70, 0xFF70,
0xFF9E, 0xFF9F,
0x1B001, 0x1B11F,
0x1B132, 0x1B132,
0x1B150, 0x1B152,
0x1F200, 0x1F200,
},
varieties = {"Hentaigana"},
spaces = false,
}
m["Hluw"] = process_ranges{
"Anatolian hieroglyphic",
521323,
"logography, syllabary",
ranges = {
0x14400, 0x14646,
},
wikipedia_article = "Anatolian hieroglyphs",
}
m["Hmng"] = process_ranges{
"Pahawh Hmong",
365954,
"semisyllabary",
aliases = {"Hmong"},
ranges = {
0x16B00, 0x16B45,
0x16B50, 0x16B59,
0x16B5B, 0x16B61,
0x16B63, 0x16B77,
0x16B7D, 0x16B8F,
},
}
m["Hmnp"] = process_ranges{
"Nyiakeng Puachue Hmong",
33712499,
"alphabet",
ranges = {
0x1E100, 0x1E12C,
0x1E130, 0x1E13D,
0x1E140, 0x1E149,
0x1E14E, 0x1E14F,
},
}
m["Hung"] = process_ranges{
"Old Hungarian",
446224,
"alphabet",
aliases = {"Hungarian runic"},
ranges = {
0x10C80, 0x10CB2,
0x10CC0, 0x10CF2,
0x10CFA, 0x10CFF,
},
capitalized = true,
direction = "rtl",
}
m["Ibrnn"] = {
"Northeastern Iberian",
1113155,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Ibrns"] = {
"Southeastern Iberian",
2305351,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Image"] = {
-- To be used to avoid any formatting or link processing
"Image-rendered",
478798,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Inds"] = {
"Indus",
601388,
aliases = {"Harappan", "Indus Valley"},
}
m["Ipach"] = {
"International Phonetic Alphabet",
21204,
aliases = {"IPA"},
ietf_subtag = "Latn",
}
m["Ital"] = process_ranges{
"Old Italic",
4891256,
"alphabet",
ranges = {
0x10300, 0x10323,
0x1032D, 0x1032F,
},
}
m["Java"] = process_ranges{
"Java",
879704,
"abugida",
ranges = {
0xA980, 0xA9CD,
0xA9CF, 0xA9D9,
0xA9DE, 0xA9DF,
},
}
m["Jurc"] = {
"Jurchen",
912240,
"logography",
spaces = false,
}
m["Kali"] = process_ranges{
"Kayah Li",
4919239,
"abugida",
ranges = {
0xA900, 0xA92F,
},
}
m["Kana"] = process_ranges{
"Katakana",
82946,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3099, 0x309C,
0x30A0, 0x30FF,
0x31F0, 0x31FF,
0x32D0, 0x32FE,
0x3300, 0x3357,
0xFE45, 0xFE46,
0xFF61, 0xFF9F,
0x1AFF0, 0x1AFF3,
0x1AFF5, 0x1AFFB,
0x1AFFD, 0x1AFFE,
0x1B000, 0x1B000,
0x1B120, 0x1B122,
0x1B155, 0x1B155,
0x1B164, 0x1B167,
},
spaces = false,
}
m["Kawi"] = process_ranges{
"Kawi",
975802,
"abugida",
ranges = {
0x11F00, 0x11F10,
0x11F12, 0x11F3A,
0x11F3E, 0x11F5A,
},
}
m["Khar"] = process_ranges{
"Kharoshthi",
1161266,
"abugida",
ranges = {
0x10A00, 0x10A03,
0x10A05, 0x10A06,
0x10A0C, 0x10A13,
0x10A15, 0x10A17,
0x10A19, 0x10A35,
0x10A38, 0x10A3A,
0x10A3F, 0x10A48,
0x10A50, 0x10A58,
},
direction = "rtl",
}
m["Khmr"] = process_ranges{
"Khmer",
1054190,
"abugida",
ranges = {
0x1780, 0x17DD,
0x17E0, 0x17E9,
0x17F0, 0x17F9,
0x19E0, 0x19FF,
},
spaces = false,
normalizationFixes = handle_normalization_fixes{
from = {"ឣ", "ឤ"},
to = {"អ", "អា"}
},
}
m["Khoj"] = process_ranges{
"Khojki",
1740656,
"abugida",
ranges = {
0x0AE6, 0x0AEF,
0xA830, 0xA839,
0x11200, 0x11211,
0x11213, 0x11241,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"},
to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"}
},
}
m["Khomt"] = {
"Khom Thai",
13023788,
"abugida",
-- Not in Unicode
}
m["Kitl"] = {
"Khitan large",
6401797,
"logography",
spaces = false,
}
m["Kits"] = process_ranges{
"Khitan small",
6401800,
"logography, syllabary",
ranges = {
0x16FE4, 0x16FE4,
0x18B00, 0x18CD5,
0x18CFF, 0x18CFF,
},
spaces = false,
}
m["Knda"] = process_ranges{
"Kannada",
839666,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C80, 0x0C8C,
0x0C8E, 0x0C90,
0x0C92, 0x0CA8,
0x0CAA, 0x0CB3,
0x0CB5, 0x0CB9,
0x0CBC, 0x0CC4,
0x0CC6, 0x0CC8,
0x0CCA, 0x0CCD,
0x0CD5, 0x0CD6,
0x0CDD, 0x0CDE,
0x0CE0, 0x0CE3,
0x0CE6, 0x0CEF,
0x0CF1, 0x0CF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA830, 0xA835,
},
normalizationFixes = handle_normalization_fixes{
from = {"ಉಾ", "ಋಾ", "ಒೌ"},
to = {"ಊ", "ೠ", "ಔ"}
},
}
m["Kpel"] = {
"Kpelle",
1586299,
"syllabary",
-- Not in Unicode
}
m["Krai"] = process_ranges{
"Kirat Rai",
123173834,
"abugida",
aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"},
ranges = {
0x16D40, 0x16D79,
},
}
m["Kthi"] = process_ranges{
"Kaithi",
1253814,
"abugida",
ranges = {
0x0966, 0x096F,
0xA830, 0xA839,
0x11080, 0x110C2,
0x110CD, 0x110CD,
},
}
m["Kulit"] = {
"Kulitan",
6443044,
"abugida",
-- Not in Unicode
}
m["Lana"] = process_ranges{
"Tai Tham",
1314503,
"abugida",
aliases = {"Tham", "Tua Mueang", "Lanna"},
ranges = {
0x1A20, 0x1A5E,
0x1A60, 0x1A7C,
0x1A7F, 0x1A89,
0x1A90, 0x1A99,
0x1AA0, 0x1AAD,
},
spaces = false,
}
m["Laoo"] = process_ranges{
"Lao",
1815229,
"abugida",
ranges = {
0x0E81, 0x0E82,
0x0E84, 0x0E84,
0x0E86, 0x0E8A,
0x0E8C, 0x0EA3,
0x0EA5, 0x0EA5,
0x0EA7, 0x0EBD,
0x0EC0, 0x0EC4,
0x0EC6, 0x0EC6,
0x0EC8, 0x0ECE,
0x0ED0, 0x0ED9,
0x0EDC, 0x0EDF,
},
spaces = false,
}
m["Latn"] = process_ranges{
"Latinh",
8229,
"alphabet",
aliases = {"Roman"},
ranges = {
0x0041, 0x005A,
0x0061, 0x007A,
0x00AA, 0x00AA,
0x00BA, 0x00BA,
0x00C0, 0x00D6,
0x00D8, 0x00F6,
0x00F8, 0x02B8,
0x02C0, 0x02C1,
0x02E0, 0x02E4,
0x0363, 0x036F,
0x0485, 0x0486,
0x0951, 0x0952,
0x10FB, 0x10FB,
0x1D00, 0x1D25,
0x1D2C, 0x1D5C,
0x1D62, 0x1D65,
0x1D6B, 0x1D77,
0x1D79, 0x1DBE,
0x1DF8, 0x1DF8,
0x1E00, 0x1EFF,
0x202F, 0x202F,
0x2071, 0x2071,
0x207F, 0x207F,
0x2090, 0x209C,
0x20F0, 0x20F0,
0x2100, 0x2125,
0x2128, 0x2128,
0x212A, 0x2134,
0x2139, 0x213B,
0x2141, 0x214E,
0x2160, 0x2188,
0x2C60, 0x2C7F,
0xA700, 0xA707,
0xA722, 0xA787,
0xA78B, 0xA7CD,
0xA7D0, 0xA7D1,
0xA7D3, 0xA7D3,
0xA7D5, 0xA7DC,
0xA7F2, 0xA7FF,
0xA92E, 0xA92E,
0xAB30, 0xAB5A,
0xAB5C, 0xAB64,
0xAB66, 0xAB69,
0xFB00, 0xFB06,
0xFF21, 0xFF3A,
0xFF41, 0xFF5A,
0x10780, 0x10785,
0x10787, 0x107B0,
0x107B2, 0x107BA,
0x1DF00, 0x1DF1E,
0x1DF25, 0x1DF2A,
},
varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"},
capitalized = true,
translit = false,
}
m["Latf"] = {
"Fraktur",
148443,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
otherNames = {"Blackletter"}, -- Blackletter is actually the parent "script"
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Latg"] = {
"Gaelic",
1432616,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
otherNames = {"Irish"},
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["pjt-Latn"] = {
"Latin",
nil,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Leke"] = {
"Leke",
19572613,
"abugida",
-- Not in Unicode
}
m["Lepc"] = process_ranges{
"Lepcha",
1481626,
"abugida",
aliases = {"Róng"},
ranges = {
0x1C00, 0x1C37,
0x1C3B, 0x1C49,
0x1C4D, 0x1C4F,
},
}
m["Limb"] = process_ranges{
"Limbu",
933796,
"abugida",
ranges = {
0x0965, 0x0965,
0x1900, 0x191E,
0x1920, 0x192B,
0x1930, 0x193B,
0x1940, 0x1940,
0x1944, 0x194F,
},
}
m["Lina"] = process_ranges{
"Linear A",
30972,
ranges = {
0x10107, 0x10133,
0x10600, 0x10736,
0x10740, 0x10755,
0x10760, 0x10767,
},
}
m["Linb"] = process_ranges{
"Linear B",
190102,
ranges = {
0x10000, 0x1000B,
0x1000D, 0x10026,
0x10028, 0x1003A,
0x1003C, 0x1003D,
0x1003F, 0x1004D,
0x10050, 0x1005D,
0x10080, 0x100FA,
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
},
}
m["Lisu"] = process_ranges{
"Fraser",
1194621,
"alphabet",
aliases = {"Old Lisu", "Lisu"},
ranges = {
0x300A, 0x300B,
0xA4D0, 0xA4FF,
0x11FB0, 0x11FB0,
},
normalizationFixes = handle_normalization_fixes{
from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"},
to = {"ʼ", "ꓺ", "ꓻ"}
},
}
m["Loma"] = {
"Loma",
13023816,
"syllabary",
-- Not in Unicode
}
m["Lyci"] = process_ranges{
"Lycian",
913587,
"alphabet",
ranges = {
0x10280, 0x1029C,
},
}
m["Lydi"] = process_ranges{
"Lydian",
4261300,
"alphabet",
ranges = {
0x10920, 0x10939,
0x1093F, 0x1093F,
},
direction = "rtl",
}
m["Mahj"] = process_ranges{
"Mahajani",
6732850,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11150, 0x11176,
},
}
m["Maka"] = process_ranges{
"Makasar",
72947229,
"abugida",
aliases = {"Old Makasar"},
ranges = {
0x11EE0, 0x11EF8,
},
}
m["Mand"] = process_ranges{
"Mandaic",
1812130,
aliases = {"Mandaean"},
ranges = {
0x0640, 0x0640,
0x0840, 0x085B,
0x085E, 0x085E,
},
direction = "rtl",
}
m["Mani"] = process_ranges{
"Manichaean",
3544702,
"abjad",
ranges = {
0x0640, 0x0640,
0x10AC0, 0x10AE6,
0x10AEB, 0x10AF6,
},
direction = "rtl",
}
m["Marc"] = process_ranges{
"Marchen",
72403709,
"abugida",
ranges = {
0x11C70, 0x11C8F,
0x11C92, 0x11CA7,
0x11CA9, 0x11CB6,
},
}
m["Maya"] = process_ranges{
"Maya",
211248,
aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"},
ranges = {
0x1D2E0, 0x1D2F3,
},
}
m["Medf"] = process_ranges{
"Medefaidrin",
1519764,
aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"},
ranges = {
0x16E40, 0x16E9A,
},
capitalized = true,
}
m["Mend"] = process_ranges{
"Mende",
951069,
aliases = {"Mende Kikakui"},
ranges = {
0x1E800, 0x1E8C4,
0x1E8C7, 0x1E8D6,
},
direction = "rtl",
}
m["Merc"] = process_ranges{
"Meroitic cursive",
73028124,
"abugida",
ranges = {
0x109A0, 0x109B7,
0x109BC, 0x109CF,
0x109D2, 0x109FF,
},
direction = "rtl",
}
m["Mero"] = process_ranges{
"Meroitic hieroglyphic",
73028623,
"abugida",
ranges = {
0x10980, 0x1099F,
},
direction = "rtl",
wikipedia_article = "Meroitic hieroglyphs",
}
m["Mlym"] = process_ranges{
"Malayalam",
1164129,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0D00, 0x0D0C,
0x0D0E, 0x0D10,
0x0D12, 0x0D44,
0x0D46, 0x0D48,
0x0D4A, 0x0D4F,
0x0D54, 0x0D63,
0x0D66, 0x0D7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0xA830, 0xA832,
},
normalizationFixes = handle_normalization_fixes{
from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്", "ണ്", "ന്റ", "ന്", "മ്", "യ്", "ര്", "ല്", "ള്", "ഴ്", "െെ", "ൻ്റ"},
to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"}
},
}
m["Modi"] = process_ranges{
"Modi",
1703713,
"abugida",
ranges = {
0xA830, 0xA839,
0x11600, 0x11644,
0x11650, 0x11659,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"},
to = {"𑘊", "𑘋", "𑘌", "𑘍"}
},
}
m["Mong"] = process_ranges{
"Mongolian",
1055705,
"alphabet",
aliases = {"Mongol bichig", "Hudum Mongol bichig"},
ranges = {
0x1800, 0x1805,
0x180A, 0x1819,
0x1820, 0x1842,
0x1878, 0x1878,
0x1880, 0x1897,
0x18A6, 0x18A6,
0x18A9, 0x18A9,
0x200C, 0x200D,
0x202F, 0x202F,
0x3001, 0x3002,
0x3008, 0x300B,
0x11660, 0x11668,
},
direction = "vertical-ltr",
}
m["mnc-Mong"] = process_ranges{
"Manchu",
122888,
m["Mong"][3],
ranges = {
0x1801, 0x1801,
0x1804, 0x1804,
0x1808, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x185D,
0x185F, 0x1861,
0x1864, 0x1869,
0x186C, 0x1871,
0x1873, 0x1877,
0x1880, 0x1888,
0x188F, 0x188F,
0x189A, 0x18A5,
0x18A8, 0x18A8,
0x18AA, 0x18AA,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "Mong",
}
m["sjo-Mong"] = process_ranges{
"Xibe",
113624153,
m["Mong"][3],
aliases = {"Sibe"},
ranges = {
0x1804, 0x1804,
0x1807, 0x1807,
0x180A, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x1828,
0x182A, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x1872,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "mnc-Mong",
}
m["xwo-Mong"] = process_ranges{
"Clear Script",
529085,
m["Mong"][3],
aliases = {"Todo", "Todo bichig"},
ranges = {
0x1800, 0x1801,
0x1804, 0x1806,
0x180A, 0x1820,
0x1828, 0x1828,
0x182F, 0x1831,
0x1834, 0x1834,
0x1837, 0x1838,
0x183A, 0x183B,
0x1840, 0x1840,
0x1843, 0x185C,
0x1880, 0x1887,
0x1889, 0x188F,
0x1894, 0x1894,
0x1896, 0x1899,
0x18A7, 0x18A7,
0x200C, 0x200D,
0x202F, 0x202F,
0x11669, 0x1166C,
},
direction = "vertical-ltr",
parent = "Mong",
}
m["Moon"] = {
"Moon",
918391,
"alphabet",
aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"},
-- Not in Unicode
}
m["Morse"] = {
"Morse code",
79897,
ietf_subtag = "Zsym",
}
m["Mroo"] = process_ranges{
"Mru",
75919253,
aliases = {"Mro", "Mrung"},
ranges = {
0x16A40, 0x16A5E,
0x16A60, 0x16A69,
0x16A6E, 0x16A6F,
},
}
m["Mtei"] = process_ranges{
"Meitei Mayek",
2981413,
"abugida",
aliases = {"Meetei Mayek", "Manipuri"},
ranges = {
0xAAE0, 0xAAF6,
0xABC0, 0xABED,
0xABF0, 0xABF9,
},
}
m["Mult"] = process_ranges{
"Multani",
17047906,
"abugida",
ranges = {
0x0A66, 0x0A6F,
0x11280, 0x11286,
0x11288, 0x11288,
0x1128A, 0x1128D,
0x1128F, 0x1129D,
0x1129F, 0x112A9,
},
}
m["Music"] = process_ranges{
"musical notation",
233861,
"pictography",
ranges = {
0x2669, 0x266F,
0x1D100, 0x1D126,
0x1D129, 0x1D1EA,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Mymr"] = process_ranges{
"Miến Điện",
43887939,
"abugida",
aliases = {"Myanmar"},
ranges = {
0x1000, 0x109F,
0xA92E, 0xA92E,
0xA9E0, 0xA9FE,
0xAA60, 0xAA7F,
0x116D0, 0x116E3,
},
spaces = false,
}
m["Nagm"] = process_ranges{
"Mundari Bani",
106917274,
"alphabet",
aliases = {"Nag Mundari"},
ranges = {
0x1E4D0, 0x1E4F9,
},
}
m["Nand"] = process_ranges{
"Nandinagari",
6963324,
"abugida",
ranges = {
0x0964, 0x0965,
0x0CE6, 0x0CEF,
0x1CE9, 0x1CE9,
0x1CF2, 0x1CF2,
0x1CFA, 0x1CFA,
0xA830, 0xA835,
0x119A0, 0x119A7,
0x119AA, 0x119D7,
0x119DA, 0x119E4,
},
}
m["Narb"] = process_ranges{
"Ancient North Arabian",
1472213,
"abjad",
aliases = {"Old North Arabian"},
ranges = {
0x10A80, 0x10A9F,
},
direction = "rtl",
}
m["Nbat"] = process_ranges{
"Nabataean",
855624,
"abjad",
aliases = {"Nabatean"},
ranges = {
0x10880, 0x1089E,
0x108A7, 0x108AF,
},
direction = "rtl",
}
m["Newa"] = process_ranges{
"Newa",
7237292,
"abugida",
aliases = {"Newar", "Newari", "Prachalit Nepal"},
ranges = {
0x11400, 0x1145B,
0x1145D, 0x11461,
},
}
m["Nkdb"] = {
"Dongba",
1190953,
"pictography",
aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"},
spaces = false,
-- Not in Unicode
}
m["Nkgb"] = {
"Geba",
731189,
"syllabary",
aliases = {"Nakhi Geba", "Naxi Geba"},
spaces = false,
-- Not in Unicode
}
m["Nkoo"] = process_ranges{
"N'Ko",
1062587,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x07C0, 0x07FA,
0x07FD, 0x07FF,
0xFD3E, 0xFD3F,
},
direction = "rtl",
}
m["None"] = {
"unspecified",
nil,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Nshu"] = process_ranges{
"Nüshu",
56436,
"syllabary",
aliases = {"Nushu"},
ranges = {
0x16FE1, 0x16FE1,
0x1B170, 0x1B2FB,
},
spaces = false,
}
m["Ogam"] = process_ranges{
"Ogham",
184661,
ranges = {
0x1680, 0x169C,
},
}
m["Olck"] = process_ranges{
"Ol Chiki",
201688,
aliases = {"Ol Chemetʼ", "Ol", "Santali"},
ranges = {
0x1C50, 0x1C7F,
},
}
m["Onao"] = process_ranges{
"Ol Onal",
108607084,
"alphabet",
ranges = {
0x0964, 0x0965,
0x1E5D0, 0x1E5FA,
0x1E5FF, 0x1E5FF,
},
}
m["Orkh"] = process_ranges{
"Old Turkic",
5058305,
aliases = {"Orkhon runic"},
ranges = {
0x10C00, 0x10C48,
},
direction = "rtl",
}
m["Orya"] = process_ranges{
"Odia",
1760127,
"abugida",
aliases = {"Oriya"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B01, 0x0B03,
0x0B05, 0x0B0C,
0x0B0F, 0x0B10,
0x0B13, 0x0B28,
0x0B2A, 0x0B30,
0x0B32, 0x0B33,
0x0B35, 0x0B39,
0x0B3C, 0x0B44,
0x0B47, 0x0B48,
0x0B4B, 0x0B4D,
0x0B55, 0x0B57,
0x0B5C, 0x0B5D,
0x0B5F, 0x0B63,
0x0B66, 0x0B77,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ଅା", "ଏୗ", "ଓୗ"},
to = {"ଆ", "ଐ", "ଔ"}
},
}
m["Osge"] = process_ranges{
"Osage",
7105529,
ranges = {
0x104B0, 0x104D3,
0x104D8, 0x104FB,
},
capitalized = true,
}
m["Osma"] = process_ranges{
"Osmanya",
1377866,
ranges = {
0x10480, 0x1049D,
0x104A0, 0x104A9,
},
}
m["Ougr"] = process_ranges{
"Duy Ngô Nhĩ cổ",
1998938,
"abjad, alphabet",
ranges = {
0x0640, 0x0640,
0x10AF2, 0x10AF2,
0x10F70, 0x10F89,
},
-- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top.
direction = "rtl",
}
m["Palm"] = process_ranges{
"Palmyrene",
17538100,
ranges = {
0x10860, 0x1087F,
},
direction = "rtl",
}
m["Pauc"] = process_ranges{
"Pau Cin Hau",
25339852,
ranges = {
0x11AC0, 0x11AF8,
},
}
m["Pcun"] = {
"Proto-Cuneiform",
1650699,
"pictography",
-- Not in Unicode
}
m["Pelm"] = {
"Proto-Elamite",
56305763,
"pictography",
-- Not in Unicode
}
m["Perm"] = process_ranges{
"Old Permic",
147899,
ranges = {
0x0483, 0x0483,
0x10350, 0x1037A,
},
}
m["Phag"] = process_ranges{
"Phags-pa",
822836,
"abugida",
ranges = {
0x1802, 0x1803,
0x1805, 0x1805,
0x200C, 0x200D,
0x202F, 0x202F,
0x3002, 0x3002,
0xA840, 0xA877,
},
direction = "vertical-ltr",
}
m["Phli"] = process_ranges{
"Inscriptional Pahlavi",
24089793,
"abjad",
ranges = {
0x10B60, 0x10B72,
0x10B78, 0x10B7F,
},
direction = "rtl",
}
m["Phlp"] = process_ranges{
"Psalter Pahlavi",
7253954,
"abjad",
ranges = {
0x0640, 0x0640,
0x10B80, 0x10B91,
0x10B99, 0x10B9C,
0x10BA9, 0x10BAF,
},
direction = "rtl",
}
m["Phlv"] = {
"Book Pahlavi",
72403118,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Phnx"] = process_ranges{
"Phoenician",
26752,
"abjad",
ranges = {
0x10900, 0x1091B,
0x1091F, 0x1091F,
},
direction = "rtl",
}
m["Plrd"] = process_ranges{
"Pollard",
601734,
"abugida",
aliases = {"Miao"},
ranges = {
0x16F00, 0x16F4A,
0x16F4F, 0x16F87,
0x16F8F, 0x16F9F,
},
}
m["Prti"] = process_ranges{
"Inscriptional Parthian",
13023804,
ranges = {
0x10B40, 0x10B55,
0x10B58, 0x10B5F,
},
direction = "rtl",
}
m["Psin"] = {
"Proto-Sinaitic",
1065250,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Ranj"] = {
"Ranjana",
2385276,
"abugida",
-- Not in Unicode
}
m["Rjng"] = process_ranges{
"Rejang",
2007960,
"abugida",
ranges = {
0xA930, 0xA953,
0xA95F, 0xA95F,
},
}
m["Rohg"] = process_ranges{
"Hanifi Rohingya",
21028705,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0640, 0x0640,
0x06D4, 0x06D4,
0x10D00, 0x10D27,
0x10D30, 0x10D39,
},
direction = "rtl",
}
m["Roro"] = {
"Rongorongo",
209764,
-- Not in Unicode
}
m["Rumin"] = process_ranges{
"Rumi numerals",
nil,
ranges = {
0x10E60, 0x10E7E,
},
ietf_subtag = "Arab",
}
m["Runr"] = process_ranges{
"Runic",
82996,
"alphabet",
ranges = {
0x16A0, 0x16EA,
0x16EE, 0x16F8,
},
}
m["Samr"] = process_ranges{
"Samaritan",
1550930,
"abjad",
ranges = {
0x0800, 0x082D,
0x0830, 0x083E,
},
direction = "rtl",
}
m["Sarb"] = process_ranges{
"Ancient South Arabian",
446074,
"abjad",
aliases = {"Old South Arabian"},
ranges = {
0x10A60, 0x10A7F,
},
direction = "rtl",
}
m["Saur"] = process_ranges{
"Saurashtra",
3535165,
"abugida",
ranges = {
0xA880, 0xA8C5,
0xA8CE, 0xA8D9,
},
}
m["Semap"] = {
"flag semaphore",
250796,
"pictography",
ietf_subtag = "Zsym",
}
m["Sgnw"] = process_ranges{
"SignWriting",
1497335,
"pictography",
aliases = {"Sutton SignWriting"},
ranges = {
0x1D800, 0x1DA8B,
0x1DA9B, 0x1DA9F,
0x1DAA1, 0x1DAAF,
},
translit = false,
}
m["Shaw"] = process_ranges{
"Shavian",
1970098,
aliases = {"Shaw"},
ranges = {
0x10450, 0x1047F,
},
}
m["Shrd"] = process_ranges{
"Sharada",
2047117,
"abugida",
ranges = {
0x0951, 0x0951,
0x1CD7, 0x1CD7,
0x1CD9, 0x1CD9,
0x1CDC, 0x1CDD,
0x1CE0, 0x1CE0,
0xA830, 0xA835,
0xA838, 0xA838,
0x11180, 0x111DF,
},
}
m["Shui"] = {
"Sui",
752854,
"logography",
spaces = false,
-- Not in Unicode
}
m["Sidd"] = process_ranges{
"Siddham",
250379,
"abugida",
ranges = {
0x11580, 0x115B5,
0x115B8, 0x115DD,
},
}
m["Sidt"] = {
"Sidetic",
36659,
"alphabet",
direction = "rtl",
-- Not in Unicode
}
m["Sind"] = process_ranges{
"Khudabadi",
6402810,
"abugida",
aliases = {"Khudawadi"},
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x112B0, 0x112EA,
0x112F0, 0x112F9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"},
to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"}
},
}
m["Sinh"] = process_ranges{
"Sinhalese",
1574992,
"abugida",
aliases = {"Sinhala"},
ranges = {
0x0964, 0x0965,
0x0D81, 0x0D83,
0x0D85, 0x0D96,
0x0D9A, 0x0DB1,
0x0DB3, 0x0DBB,
0x0DBD, 0x0DBD,
0x0DC0, 0x0DC6,
0x0DCA, 0x0DCA,
0x0DCF, 0x0DD4,
0x0DD6, 0x0DD6,
0x0DD8, 0x0DDF,
0x0DE6, 0x0DEF,
0x0DF2, 0x0DF4,
0x1CF2, 0x1CF2,
0x111E1, 0x111F4,
},
normalizationFixes = handle_normalization_fixes{
from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"},
to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"}
},
}
m["Sogd"] = process_ranges{
"Sogdian",
578359,
"abjad",
ranges = {
0x0640, 0x0640,
0x10F30, 0x10F59,
},
direction = "rtl",
}
m["Sogo"] = process_ranges{
"Old Sogdian",
72403254,
"abjad",
ranges = {
0x10F00, 0x10F27,
},
direction = "rtl",
}
m["Sora"] = process_ranges{
"Sorang Sompeng",
7563292,
aliases = {"Sora Sompeng"},
ranges = {
0x110D0, 0x110E8,
0x110F0, 0x110F9,
},
}
m["Soyo"] = process_ranges{
"Soyombo",
8009382,
"abugida",
ranges = {
0x11A50, 0x11AA2,
},
}
m["Sund"] = process_ranges{
"Sundanese",
51589,
"abugida",
ranges = {
0x1B80, 0x1BBF,
0x1CC0, 0x1CC7,
},
}
m["Sunu"] = process_ranges{
"Sunuwar",
109984965,
"alphabet",
ranges = {
0x11BC0, 0x11BE1,
0x11BF0, 0x11BF9,
},
}
m["Sylo"] = process_ranges{
"Sylheti Nagri",
144128,
"abugida",
aliases = {"Sylheti Nāgarī", "Syloti Nagri"},
ranges = {
0x0964, 0x0965,
0x09E6, 0x09EF,
0xA800, 0xA82C,
},
}
m["Syrc"] = process_ranges{
"Syriac",
26567,
"abjad", -- more precisely, impure abjad
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0640, 0x0640,
0x064B, 0x0655,
0x0670, 0x0670,
0x0700, 0x070D,
0x070F, 0x074A,
0x074D, 0x074F,
0x0860, 0x086A,
0x1DF8, 0x1DF8,
0x1DFA, 0x1DFA,
},
direction = "rtl",
}
-- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues
m["Tagb"] = process_ranges{
"Tagbanwa",
977444,
"abugida",
ranges = {
0x1735, 0x1736,
0x1760, 0x176C,
0x176E, 0x1770,
0x1772, 0x1773,
},
}
m["Takr"] = process_ranges{
"Takri",
759202,
"abugida",
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x11680, 0x116B9,
0x116C0, 0x116C9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"},
to = {"𑚁", "𑚈", "𑚉", "𑚇"}
},
}
m["Tale"] = process_ranges{
"Tai Nüa",
2566326,
"abugida",
aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"},
ranges = {
0x1040, 0x1049,
0x1950, 0x196D,
0x1970, 0x1974,
},
spaces = false,
}
m["Talu"] = process_ranges{
"Tày Lự mới",
3498863,
"abugida",
ranges = {
0x1980, 0x19AB,
0x19B0, 0x19C9,
0x19D0, 0x19DA,
0x19DE, 0x19DF,
},
spaces = false,
}
m["Taml"] = process_ranges{
"Tamil",
26803,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B82, 0x0B83,
0x0B85, 0x0B8A,
0x0B8E, 0x0B90,
0x0B92, 0x0B95,
0x0B99, 0x0B9A,
0x0B9C, 0x0B9C,
0x0B9E, 0x0B9F,
0x0BA3, 0x0BA4,
0x0BA8, 0x0BAA,
0x0BAE, 0x0BB9,
0x0BBE, 0x0BC2,
0x0BC6, 0x0BC8,
0x0BCA, 0x0BCD,
0x0BD0, 0x0BD0,
0x0BD7, 0x0BD7,
0x0BE6, 0x0BFA,
0x1CDA, 0x1CDA,
0xA8F3, 0xA8F3,
0x11301, 0x11301,
0x11303, 0x11303,
0x1133B, 0x1133C,
0x11FC0, 0x11FF1,
0x11FFF, 0x11FFF,
},
normalizationFixes = handle_normalization_fixes{
from = {"அூ", "ஸ்ரீ"},
to = {"ஆ", "ஶ்ரீ"}
},
}
m["Tang"] = process_ranges{
"Tangut",
1373610,
"logography, syllabary",
ranges = {
0x31EF, 0x31EF,
0x16FE0, 0x16FE0,
0x17000, 0x187F7,
0x18800, 0x18AFF,
0x18D00, 0x18D08,
},
spaces = false,
}
m["Tavt"] = process_ranges{
"Tai Viet",
11818517,
"abugida",
ranges = {
0xAA80, 0xAAC2,
0xAADB, 0xAADF,
},
spaces = false,
}
m["Tayo"] = {
"Lai Tay",
16306701,
"abugida",
aliases = {"Tai Yo"},
direction = "vertical-rtl",
-- Not in Unicode
}
m["Telu"] = process_ranges{
"Telugu",
570450,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C00, 0x0C0C,
0x0C0E, 0x0C10,
0x0C12, 0x0C28,
0x0C2A, 0x0C39,
0x0C3C, 0x0C44,
0x0C46, 0x0C48,
0x0C4A, 0x0C4D,
0x0C55, 0x0C56,
0x0C58, 0x0C5A,
0x0C5D, 0x0C5D,
0x0C60, 0x0C63,
0x0C66, 0x0C6F,
0x0C77, 0x0C7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"},
to = {"ఔ", "ఓ", "ీ", "ే", "ో"}
},
}
m["Teng"] = {
"Tengwar",
473725,
}
m["Tfng"] = process_ranges{
"Tifinagh",
208503,
"abjad, alphabet",
ranges = {
0x2D30, 0x2D67,
0x2D6F, 0x2D70,
0x2D7F, 0x2D7F,
},
otherNames = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent
}
m["Tglg"] = process_ranges{
"Baybayin",
812124,
"abugida",
aliases = {"Tagalog"},
ranges = {
0x1700, 0x1715,
0x171F, 0x171F,
0x1735, 0x1736,
},
}
m["Thaa"] = process_ranges{
"Thaana",
877906,
"abugida",
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0660, 0x0669,
0x0780, 0x07B1,
0xFDF2, 0xFDF2,
0xFDFD, 0xFDFD,
},
direction = "rtl",
}
m["Thai"] = process_ranges{
"Thai",
236376,
"abugida",
ranges = {
0x0E01, 0x0E3A,
0x0E40, 0x0E5B,
},
spaces = false,
}
m["Tibt"] = process_ranges{
"Tạng",
46861,
"abugida",
ranges = {
0x0F00, 0x0F47,
0x0F49, 0x0F6C,
0x0F71, 0x0F97,
0x0F99, 0x0FBC,
0x0FBE, 0x0FCC,
0x0FCE, 0x0FD4,
0x0FD9, 0x0FDA,
0x3008, 0x300B,
},
normalizationFixes = handle_normalization_fixes{
combiningClasses = {["༹"] = 1},
from = {"ཷ", "ཹ"},
to = {"ྲཱྀ", "ླཱྀ"}
},
}
m["sit-tam-Tibt"] = {
"Tamyig",
109875213,
m["Tibt"][3],
ranges = m["Tibt"].ranges,
characters = m["Tibt"].characters,
parent = "Tibt",
normalizationFixes = m["Tibt"].normalizationFixes,
}
m["Tirh"] = process_ranges{
"Tirhuta",
1765752,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x1CF2, 0x1CF2,
0xA830, 0xA839,
0x11480, 0x114C7,
0x114D0, 0x114D9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"},
to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"}
},
}
m["Tnsa"] = process_ranges{
"Tangsa",
105576311,
"alphabet",
ranges = {
0x16A70, 0x16ABE,
0x16AC0, 0x16AC9,
},
}
m["Todr"] = process_ranges{
"Todhri",
10274731,
"alphabet",
direction = "rtl",
ranges = {
0x105C0, 0x105F3,
},
}
m["Tols"] = {
"Tolong Siki",
4459822,
"alphabet",
-- Not in Unicode
}
m["Toto"] = process_ranges{
"Toto",
104837516,
"abugida",
ranges = {
0x1E290, 0x1E2AE,
},
}
m["Tutg"] = process_ranges{
"Tigalari",
2604990,
"abugida",
aliases = {"Tulu"},
ranges = {
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA8F1, 0xA8F1,
0x11380, 0x11389,
0x1138B, 0x1138B,
0x1138E, 0x1138E,
0x11390, 0x113B5,
0x113B7, 0x113C0,
0x113C2, 0x113C2,
0x113C5, 0x113C5,
0x113C7, 0x113CA,
0x113CC, 0x113D5,
0x113D7, 0x113D8,
0x113E1, 0x113E2,
},
}
m["Ugar"] = process_ranges{
"Ugaritic",
332652,
"abjad",
ranges = {
0x10380, 0x1039D,
0x1039F, 0x1039F,
},
}
m["Vaii"] = process_ranges{
"Vai",
523078,
"syllabary",
ranges = {
0xA500, 0xA62B,
},
}
m["Visp"] = {
"Visible Speech",
1303365,
"alphabet",
-- Not in Unicode
}
m["Vith"] = process_ranges{
"Vithkuqi",
3301993,
"alphabet",
ranges = {
0x10570, 0x1057A,
0x1057C, 0x1058A,
0x1058C, 0x10592,
0x10594, 0x10595,
0x10597, 0x105A1,
0x105A3, 0x105B1,
0x105B3, 0x105B9,
0x105BB, 0x105BC,
},
capitalized = true,
}
m["Wara"] = process_ranges{
"Varang Kshiti",
79199,
aliases = {"Warang Citi"},
ranges = {
0x118A0, 0x118F2,
0x118FF, 0x118FF,
},
capitalized = true,
}
m["Wcho"] = process_ranges{
"Wancho",
33713728,
"alphabet",
ranges = {
0x1E2C0, 0x1E2F9,
0x1E2FF, 0x1E2FF,
},
}
m["Wole"] = {
"Woleai",
6643710,
"syllabary",
-- Not in Unicode
}
m["Xpeo"] = process_ranges{
"Old Persian",
1471822,
ranges = {
0x103A0, 0x103C3,
0x103C8, 0x103D5,
},
}
m["Xsux"] = process_ranges{
"hình nêm",
401,
aliases = {"chữ hình nêm Sumer-Akkad"},
ranges = {
0x12000, 0x12399,
0x12400, 0x1246E,
0x12470, 0x12474,
0x12480, 0x12543,
},
}
m["Yezi"] = process_ranges{
"Yezidi",
13175481,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0660, 0x0669,
0x10E80, 0x10EA9,
0x10EAB, 0x10EAD,
0x10EB0, 0x10EB1,
},
direction = "rtl",
}
m["Yiii"] = process_ranges{
"Yi",
1197646,
"syllabary",
ranges = {
0x3001, 0x3002,
0x3008, 0x3011,
0x3014, 0x301B,
0x30FB, 0x30FB,
0xA000, 0xA48C,
0xA490, 0xA4C6,
0xFF61, 0xFF65,
},
}
m["Zanb"] = process_ranges{
"Zanabazar Square",
50809208,
"abugida",
ranges = {
0x11A00, 0x11A47,
},
}
m["Zmth"] = process_ranges{
"mathematical notation",
1140046,
ranges = {
0x00AC, 0x00AC,
0x00B1, 0x00B1,
0x00D7, 0x00D7,
0x00F7, 0x00F7,
0x03D0, 0x03D2,
0x03D5, 0x03D5,
0x03F0, 0x03F1,
0x03F4, 0x03F6,
0x0606, 0x0608,
0x2016, 0x2016,
0x2032, 0x2034,
0x2040, 0x2040,
0x2044, 0x2044,
0x2052, 0x2052,
0x205F, 0x205F,
0x2061, 0x2064,
0x207A, 0x207E,
0x208A, 0x208E,
0x20D0, 0x20DC,
0x20E1, 0x20E1,
0x20E5, 0x20E6,
0x20EB, 0x20EF,
0x2102, 0x2102,
0x2107, 0x2107,
0x210A, 0x2113,
0x2115, 0x2115,
0x2118, 0x211D,
0x2124, 0x2124,
0x2128, 0x2129,
0x212C, 0x212D,
0x212F, 0x2131,
0x2133, 0x2138,
0x213C, 0x2149,
0x214B, 0x214B,
0x2190, 0x21A7,
0x21A9, 0x21AE,
0x21B0, 0x21B1,
0x21B6, 0x21B7,
0x21BC, 0x21DB,
0x21DD, 0x21DD,
0x21E4, 0x21E5,
0x21F4, 0x22FF,
0x2308, 0x230B,
0x2320, 0x2321,
0x237C, 0x237C,
0x239B, 0x23B5,
0x23B7, 0x23B7,
0x23D0, 0x23D0,
0x23DC, 0x23E2,
0x25A0, 0x25A1,
0x25AE, 0x25B7,
0x25BC, 0x25C1,
0x25C6, 0x25C7,
0x25CA, 0x25CB,
0x25CF, 0x25D3,
0x25E2, 0x25E2,
0x25E4, 0x25E4,
0x25E7, 0x25EC,
0x25F8, 0x25FF,
0x2605, 0x2606,
0x2640, 0x2640,
0x2642, 0x2642,
0x2660, 0x2663,
0x266D, 0x266F,
0x27C0, 0x27FF,
0x2900, 0x2AFF,
0x2B30, 0x2B44,
0x2B47, 0x2B4C,
0xFB29, 0xFB29,
0xFE61, 0xFE66,
0xFE68, 0xFE68,
0xFF0B, 0xFF0B,
0xFF1C, 0xFF1E,
0xFF3C, 0xFF3C,
0xFF3E, 0xFF3E,
0xFF5C, 0xFF5C,
0xFF5E, 0xFF5E,
0xFFE2, 0xFFE2,
0xFFE9, 0xFFEC,
0x1D400, 0x1D454,
0x1D456, 0x1D49C,
0x1D49E, 0x1D49F,
0x1D4A2, 0x1D4A2,
0x1D4A5, 0x1D4A6,
0x1D4A9, 0x1D4AC,
0x1D4AE, 0x1D4B9,
0x1D4BB, 0x1D4BB,
0x1D4BD, 0x1D4C3,
0x1D4C5, 0x1D505,
0x1D507, 0x1D50A,
0x1D50D, 0x1D514,
0x1D516, 0x1D51C,
0x1D51E, 0x1D539,
0x1D53B, 0x1D53E,
0x1D540, 0x1D544,
0x1D546, 0x1D546,
0x1D54A, 0x1D550,
0x1D552, 0x1D6A5,
0x1D6A8, 0x1D7CB,
0x1D7CE, 0x1D7FF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
translit = false,
}
m["Zsym"] = process_ranges{
"symbolic",
80071,
"pictography",
ranges = {
0x20DD, 0x20E0,
0x20E2, 0x20E4,
0x20E7, 0x20EA,
0x20F0, 0x20F0,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
0x2114, 0x2114,
0x2116, 0x2117,
0x211E, 0x2123,
0x2125, 0x2127,
0x212A, 0x212B,
0x212E, 0x212E,
0x2132, 0x2132,
0x2139, 0x213B,
0x214A, 0x214A,
0x214C, 0x214F,
0x21A8, 0x21A8,
0x21AF, 0x21AF,
0x21B2, 0x21B5,
0x21B8, 0x21BB,
0x21DC, 0x21DC,
0x21DE, 0x21E3,
0x21E6, 0x21F3,
0x2300, 0x2307,
0x230C, 0x231F,
0x2322, 0x237B,
0x237D, 0x239A,
0x23B6, 0x23B6,
0x23B8, 0x23CF,
0x23D1, 0x23DB,
0x23E3, 0x23FF,
0x2500, 0x259F,
0x25A2, 0x25AD,
0x25B8, 0x25BB,
0x25C2, 0x25C5,
0x25C8, 0x25C9,
0x25CC, 0x25CE,
0x25D4, 0x25E1,
0x25E3, 0x25E3,
0x25E5, 0x25E6,
0x25ED, 0x25F7,
0x2600, 0x2604,
0x2607, 0x263F,
0x2641, 0x2641,
0x2643, 0x265F,
0x2664, 0x266C,
0x2670, 0x27BF,
0x2B00, 0x2B2F,
0x2B45, 0x2B46,
0x2B4D, 0x2B73,
0x2B76, 0x2B95,
0x2B97, 0x2BFF,
0x4DC0, 0x4DFF,
0x1F000, 0x1F02B,
0x1F030, 0x1F093,
0x1F0A0, 0x1F0AE,
0x1F0B1, 0x1F0BF,
0x1F0C1, 0x1F0CF,
0x1F0D1, 0x1F0F5,
0x1F300, 0x1F6D7,
0x1F6DC, 0x1F6EC,
0x1F6F0, 0x1F6FC,
0x1F700, 0x1F776,
0x1F77B, 0x1F7D9,
0x1F7E0, 0x1F7EB,
0x1F7F0, 0x1F7F0,
0x1F800, 0x1F80B,
0x1F810, 0x1F847,
0x1F850, 0x1F859,
0x1F860, 0x1F887,
0x1F890, 0x1F8AD,
0x1F8B0, 0x1F8B1,
0x1F900, 0x1FA53,
0x1FA60, 0x1FA6D,
0x1FA70, 0x1FA7C,
0x1FA80, 0x1FA88,
0x1FA90, 0x1FABD,
0x1FABF, 0x1FAC5,
0x1FACE, 0x1FADB,
0x1FAE0, 0x1FAE8,
0x1FAF0, 0x1FAF8,
0x1FB00, 0x1FB92,
0x1FB94, 0x1FBCA,
0x1FBF0, 0x1FBF9,
},
translit = false,
character_category = false, -- none
}
m["Zyyy"] = {
"undetermined",
104839687,
-- This should not have any characters listed, probably
translit = false,
character_category = false, -- none
}
m["Zzzz"] = {
"uncoded",
104839675,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
-- These should be defined after the scripts they are composed of.
m["Hrkt"] = process_ranges{
"Kana",
187659,
"syllabary",
aliases = {"Japanese syllabaries"},
ranges = union(
m["Hira"].ranges,
m["Kana"].ranges
),
spaces = false,
}
m["Jpan"] = process_ranges{
"Japanese",
190502,
"logography, syllabary",
ranges = union(
m["Hrkt"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
spaces = false,
sort_by_scraping = true,
}
m["Kore"] = process_ranges{
"Korean",
711797,
"logography, syllabary",
ranges = union(
m["Hang"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
}
return require("Module:languages").finalizeData(m, "script")
6mdawzrf1qveaaou06qlh1k0g0n1akk
2561613
2561535
2026-09-08T08:57:18Z
Hiyuune
50834
2561613
Scribunto
text/plain
--[=[
When adding new scripts to this file, please don't forget to add
style definitons for the script in [[MediaWiki:Gadget-LanguagesAndScripts.css]].
]=]
local concat = table.concat
local insert = table.insert
local ipairs = ipairs
local next = next
local remove = table.remove
local select = select
local sort = table.sort
-- Loaded on demand, as it may not be needed (depending on the data).
local function u(...)
u = require("Module:string/char")
return u(...)
end
-- We can't use mw.loadData() on [[Module:languages/chars]] because [[Module:languages/data]] itself is sometimes loaded
-- using mw.loadData(), and calling mw.loadData() on [[Module:languages/chars]] will insert metatables into the
-- character tables, which the second mw.loadData() will choke on.
local m_chars = require("Module:languages/chars")
local c = m_chars.chars
local p = m_chars.puaChars
local cs = m_chars.chars_substitutions
------------------------------------------------------------------------------------
--
-- Helper functions
--
------------------------------------------------------------------------------------
-- Note: a[2] > b[2] means opens are sorted before closes if otherwise equal.
local function sort_ranges(a, b)
return a[1] < b[1] or a[1] == b[1] and a[2] > b[2]
end
-- Returns the union of two or more range tables.
local function union(...)
local ranges = {}
for i = 1, select("#", ...) do
local argt = select(i, ...)
for j, v in ipairs(argt) do
insert(ranges, {v, j % 2 == 1 and 1 or -1})
end
end
sort(ranges, sort_ranges)
local ret, i = {}, 0
for _, range in ipairs(ranges) do
i = i + range[2]
if i == 0 and range[2] == -1 then -- close
insert(ret, range[1])
elseif i == 1 and range[2] == 1 then -- open
if ret[#ret] and range[1] <= ret[#ret] + 1 then
remove(ret) -- merge adjacent ranges
else
insert(ret, range[1])
end
end
end
return ret
end
-- Adds the `characters` key, which is determined by a script's `ranges` table.
local function process_ranges(sc)
local ranges, chars = sc.ranges, {}
for i = 2, #ranges, 2 do
if ranges[i] == ranges[i - 1] then
insert(chars, u(ranges[i]))
else
insert(chars, u(ranges[i - 1]))
if ranges[i] > ranges[i - 1] + 1 then
insert(chars, "-")
end
insert(chars, u(ranges[i]))
end
end
sc.characters = concat(chars)
ranges.n = #ranges
return sc
end
local function handle_normalization_fixes(fixes)
local combiningClasses = fixes.combiningClasses
if combiningClasses then
local chars, i = {}, 0
for char in next, combiningClasses do
i = i + 1
chars[i] = char
end
fixes.combiningClassCharacters = concat(chars)
end
return fixes
end
------------------------------------------------------------------------------------
--
-- Data
--
------------------------------------------------------------------------------------
local m = {}
m["Adlm"] = process_ranges{
"Adlam",
19606346,
"alphabet",
ranges = {
0x061F, 0x061F,
0x0640, 0x0640,
0x1E900, 0x1E94B,
0x1E950, 0x1E959,
0x1E95E, 0x1E95F,
},
capitalized = true,
direction = "rtl",
}
m["Afak"] = {
"Afaka",
382019,
"syllabary",
-- Not in Unicode
}
m["Aghb"] = process_ranges{
"Caucasian Albanian",
2495716,
"alphabet",
ranges = {
0x10530, 0x10563,
0x1056F, 0x1056F,
},
}
m["Ahom"] = process_ranges{
"Ahom",
2839633,
"abugida",
ranges = {
0x11700, 0x1171A,
0x1171D, 0x1172B,
0x11730, 0x11746,
},
}
m["Arab"] = process_ranges{
"Ả Rập",
1828555,
"Abjad", -- more precisely, impure abjad
varieties = {"Jawi", {"Nastaliq", "Nastaleeq"}},
ranges = {
0x0600, 0x06FF,
0x0750, 0x077F,
0x0870, 0x088E,
0x0890, 0x0891,
0x0897, 0x08E1,
0x08E3, 0x08FF,
0xFB50, 0xFBC2,
0xFBD3, 0xFD8F,
0xFD92, 0xFDC7,
0xFDCF, 0xFDCF,
0xFDF0, 0xFDFF,
0xFE70, 0xFE74,
0xFE76, 0xFEFC,
0x102E0, 0x102FB,
0x10E60, 0x10E7E,
0x10EC2, 0x10EC4,
0x10EFC, 0x10EFF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
direction = "rtl",
normalizationFixes = handle_normalization_fixes{
from = {"ٳ"},
to = {"اٟ"}
},
}
m["fa-Arab"] = {
"Ả Rập",
744068,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
otherNames = {"Perso-Arabic"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["kk-Arab"] = {
"Ả Rập",
90681452,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["ks-Arab"] = m["fa-Arab"]
m["ku-Arab"] = m["fa-Arab"]
m["ms-Arab"] = m["kk-Arab"]
m["mzn-Arab"] = m["fa-Arab"]
m["ota-Arab"] = m["fa-Arab"]
m["pa-Arab"] = {
"Shahmukhi",
133800,
m["Arab"][3],
ranges = m["Arab"].ranges,
characters = m["Arab"].characters,
otherNames = {"Ả Rập"},
direction = "rtl",
parent = "Arab",
normalizationFixes = m["Arab"].normalizationFixes,
}
m["ps-Arab"] = m["fa-Arab"]
m["sd-Arab"] = m["fa-Arab"]
m["tt-Arab"] = m["fa-Arab"]
m["ug-Arab"] = m["fa-Arab"]
m["ur-Arab"] = m["fa-Arab"]
-- Aran (Nastaliq) is subsumed into Arab
m["Armi"] = process_ranges{
"Imperial Aramaic",
26978,
"abjad",
ranges = {
0x10840, 0x10855,
0x10857, 0x1085F,
},
direction = "rtl",
}
m["Armn"] = process_ranges{
"Armenia",
11932,
"alphabet",
ranges = {
0x0531, 0x0556,
0x0559, 0x058A,
0x058D, 0x058F,
0xFB13, 0xFB17,
},
capitalized = true,
translit = "Armn-translit",
}
m["Avst"] = process_ranges{
"Avestan",
790681,
"alphabet",
ranges = {
0x10B00, 0x10B35,
0x10B39, 0x10B3F,
},
direction = "rtl",
}
m["pal-Avst"] = {
"Pazend",
4925073,
m["Avst"][3],
ranges = m["Avst"].ranges,
characters = m["Avst"].characters,
direction = "rtl",
parent = "Avst",
}
m["Bali"] = process_ranges{
"Bali",
804984,
"abugida",
ranges = {
0x1B00, 0x1B4C,
0x1B4E, 0x1B7F,
},
}
m["Bamu"] = process_ranges{
"Bamum",
806024,
"syllabary",
ranges = {
0xA6A0, 0xA6F7,
0x16800, 0x16A38,
},
}
m["Bass"] = process_ranges{
"Bassa",
810458,
"alphabet",
aliases = {"Bassa Vah", "Vah"},
ranges = {
0x16AD0, 0x16AED,
0x16AF0, 0x16AF5,
},
}
m["Batk"] = process_ranges{
"Batak",
51592,
"abugida",
ranges = {
0x1BC0, 0x1BF3,
0x1BFC, 0x1BFF,
},
}
m["Beng"] = process_ranges{
"Bengal",
756802,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09B0,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09EF,
0x09F2, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = handle_normalization_fixes{
from = {"অা", "ঋৃ", "ঌৢ"},
to = {"আ", "ৠ", "ৡ"}
},
}
m["as-Beng"] = process_ranges{
"Assam",
191272,
m["Beng"][3],
otherNames = {"Đông Nagari"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0980, 0x0983,
0x0985, 0x098C,
0x098F, 0x0990,
0x0993, 0x09A8,
0x09AA, 0x09AF,
0x09B2, 0x09B2,
0x09B6, 0x09B9,
0x09BC, 0x09C4,
0x09C7, 0x09C8,
0x09CB, 0x09CE,
0x09D7, 0x09D7,
0x09DC, 0x09DD,
0x09DF, 0x09E3,
0x09E6, 0x09FE,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD2,
0x1CD5, 0x1CD6,
0x1CD8, 0x1CD8,
0x1CE1, 0x1CE1,
0x1CEA, 0x1CEA,
0x1CED, 0x1CED,
0x1CF2, 0x1CF2,
0x1CF5, 0x1CF7,
0xA8F1, 0xA8F1,
},
normalizationFixes = m["Beng"].normalizationFixes,
}
m["Bhks"] = process_ranges{
"Bhaiksuki",
17017839,
"abugida",
ranges = {
0x11C00, 0x11C08,
0x11C0A, 0x11C36,
0x11C38, 0x11C45,
0x11C50, 0x11C6C,
},
}
m["Blis"] = {
"Blissymbolic",
609817,
"logography",
aliases = {"Blissymbols"},
-- Not in Unicode
}
m["Bopo"] = process_ranges{
"Zhuyin",
198269,
"semisyllabary",
aliases = {"Zhuyin Fuhao", "Bopomofo"},
ranges = {
0x02EA, 0x02EB,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302A, 0x302D,
0x3030, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3105, 0x312F,
0x31A0, 0x31BF,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
},
}
m["Brah"] = process_ranges{
"Brahmi",
185083,
"abugida",
ranges = {
0x11000, 0x1104D,
0x11052, 0x11075,
0x1107F, 0x1107F,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑀅𑀸", "𑀋𑀾", "𑀏𑁂"},
to = {"𑀆", "𑀌", "𑀐"}
},
translit = "Brah-translit",
}
m["Brai"] = process_ranges{
"Braille",
79894,
"alphabet",
ranges = {
0x2800, 0x28FF,
},
}
m["Bugi"] = process_ranges{
"Lontara",
1074947,
"abugida",
aliases = {"Buginese"},
ranges = {
0x1A00, 0x1A1B,
0x1A1E, 0x1A1F,
0xA9CF, 0xA9CF,
},
}
m["Buhd"] = process_ranges{
"Buhid",
1002969,
"abugida",
ranges = {
0x1735, 0x1736,
0x1740, 0x1751,
0x1752, 0x1753,
},
}
m["Cakm"] = process_ranges{
"Chakma",
1059328,
"abugida",
ranges = {
0x09E6, 0x09EF,
0x1040, 0x1049,
0x11100, 0x11134,
0x11136, 0x11147,
},
}
m["Cans"] = process_ranges{
"Canadian syllabic",
2479183,
"abugida",
ranges = {
0x1400, 0x167F,
0x18B0, 0x18F5,
0x11AB0, 0x11ABF,
},
}
m["Cari"] = process_ranges{
"Carian",
1094567,
"alphabet",
ranges = {
0x102A0, 0x102D0,
},
}
m["Cham"] = process_ranges{
"Chăm",
1060381,
"abugida",
ranges = {
0xAA00, 0xAA36,
0xAA40, 0xAA4D,
0xAA50, 0xAA59,
0xAA5C, 0xAA5F,
},
}
m["Cher"] = process_ranges{
"Cherokee",
26549,
"syllabary",
ranges = {
0x13A0, 0x13F5,
0x13F8, 0x13FD,
0xAB70, 0xABBF,
},
}
m["Chis"] = {
"Chisoi",
123173777,
"abugida",
-- Not in Unicode
}
m["Chrs"] = process_ranges{
"Khwarezmian",
72386710,
"abjad",
aliases = {"Chorasmian"},
ranges = {
0x10FB0, 0x10FCB,
},
direction = "rtl",
}
m["Copt"] = process_ranges{
"Coptic",
321083,
"alphabet",
ranges = {
0x03E2, 0x03EF,
0x2C80, 0x2CF3,
0x2CF9, 0x2CFF,
0x102E0, 0x102FB,
},
capitalized = true,
}
m["Cpmn"] = process_ranges{
"Cypro-Minoan",
1751985,
"syllabary",
aliases = {"Cypro Minoan"},
ranges = {
0x10100, 0x10101,
0x12F90, 0x12FF2,
},
}
m["Cprt"] = process_ranges{
"Cypriot",
1757689,
"syllabary",
ranges = {
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080A, 0x10835,
0x10837, 0x10838,
0x1083C, 0x1083C,
0x1083F, 0x1083F,
},
direction = "rtl",
}
m["Cyrl"] = process_ranges{
"Kirin",
8209,
"alphabet",
ranges = {
0x0400, 0x052F,
0x1C80, 0x1C8A,
0x1D2B, 0x1D2B,
0x1D78, 0x1D78,
0x1DF8, 0x1DF8,
0x2DE0, 0x2DFF,
0x2E43, 0x2E43,
0xA640, 0xA69F,
0xFE2E, 0xFE2F,
0x1E030, 0x1E06D,
0x1E08F, 0x1E08F,
},
capitalized = true,
}
m["Cyrs"] = {
"Kirin cổ",
442244,
m["Cyrl"][3],
ranges = m["Cyrl"].ranges,
characters = m["Cyrl"].characters,
capitalized = m["Cyrl"].capitalized,
normalizationFixes = handle_normalization_fixes{
from = {"Ѹ", "ѹ"},
to = {"Ꙋ", "ꙋ"}
},
strip_diacritics = {remove_diacritics = cs.Cyrs_remove_diacritics},
sort_key = {
remove_diacritics = cs.Cyrs_remove_diacritics,
from = {
"ї", "оу", -- 2 chars
"[ґꙣєѕꙃꙅꙁіꙇђꙉѻꙩꙫꙭꙮꚙꚛꙋѡѿꙍѽꙑѣꙗѥꙕѧꙙѩꙝꙛѫѭѯѱѳѵҁ]"
},
to = {
"и" .. p[1], "у", {
["ґ"] = "г" .. p[1], ["ꙣ"] = "д" .. p[1], ["є"] = "е", ["ѕ"] = "ж" .. p[1], ["ꙃ"] = "ж" .. p[1],
["ꙅ"] = "ж" .. p[1], ["ꙁ"] = "з", ["і"] = "и" .. p[1], ["ꙇ"] = "и" .. p[1], ["ђ"] = "и" .. p[2],
["ꙉ"] = "и" .. p[2], ["ѻ"] = "о", ["ꙩ"] = "о", ["ꙫ"] = "о", ["ꙭ"] = "о",
["ꙮ"] = "о", ["ꚙ"] = "о", ["ꚛ"] = "о", ["ꙋ"] = "у", ["ѡ"] = "х" .. p[1],
["ѿ"] = "х" .. p[1], ["ꙍ"] = "х" .. p[1], ["ѽ"] = "х" .. p[1], ["ꙑ"] = "ы", ["ѣ"] = "ь" .. p[1],
["ꙗ"] = "ь" .. p[2], ["ѥ"] = "ь" .. p[3], ["ꙕ"] = "ю", ["ѧ"] = "я", ["ꙙ"] = "я",
["ѩ"] = "я" .. p[1], ["ꙝ"] = "я" .. p[1], ["ꙛ"] = "я" .. p[2], ["ѫ"] = "я" .. p[3], ["ѭ"] = "я" .. p[4],
["ѯ"] = "я" .. p[5], ["ѱ"] = "я" .. p[6], ["ѳ"] = "я" .. p[7], ["ѵ"] = "я" .. p[8], ["ҁ"] = "я" .. p[9],
}
},
}
}
m["Deva"] = process_ranges{
"Devanagari",
38592,
"abugida",
ranges = {
0x0900, 0x097F,
0x1CD0, 0x1CF6,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0xA830, 0xA839,
0xA8E0, 0xA8FF,
0x11B00, 0x11B09,
},
normalizationFixes = handle_normalization_fixes{
from = {"ॆॆ", "ेे", "ाॅ", "ाॆ", "ाꣿ", "ॊॆ", "ाे", "ाै", "ोे", "ाऺ", "ॖॖ", "अॅ", "अॆ", "अा", "एॅ", "एॆ", "एे", "एꣿ", "ऎॆ", "अॉ", "आॅ", "अॊ", "आॆ", "अो", "आे", "अौ", "आै", "ओे", "अऺ", "अऻ", "आऺ", "अाꣿ", "आꣿ", "ऒॆ", "अॖ", "अॗ", "ॶॖ", "्?ा"},
to = {"ꣿ", "ै", "ॉ", "ॊ", "ॏ", "ॏ", "ो", "ौ", "ौ", "ऻ", "ॗ", "ॲ", "ऄ", "आ", "ऍ", "ऎ", "ऐ", "ꣾ", "ꣾ", "ऑ", "ऑ", "ऒ", "ऒ", "ओ", "ओ", "औ", "औ", "औ", "ॳ", "ॴ", "ॴ", "ॵ", "ॵ", "ॵ", "ॶ", "ॷ", "ॷ"}
},
}
m["Diak"] = process_ranges{
"Dhives Akuru",
3307073,
"abugida",
aliases = {"Dhivehi Akuru", "Dives Akuru", "Divehi Akuru"},
ranges = {
0x11900, 0x11906,
0x11909, 0x11909,
0x1190C, 0x11913,
0x11915, 0x11916,
0x11918, 0x11935,
0x11937, 0x11938,
0x1193B, 0x11946,
0x11950, 0x11959,
},
}
m["Dogr"] = process_ranges{
"Dogra",
72402987,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11800, 0x1183B,
},
}
m["Dsrt"] = process_ranges{
"Deseret",
1200582,
"alphabet",
ranges = {
0x10400, 0x1044F,
},
capitalized = true,
}
m["Dupl"] = process_ranges{
"Duployan",
5316025,
"alphabet",
ranges = {
0x1BC00, 0x1BC6A,
0x1BC70, 0x1BC7C,
0x1BC80, 0x1BC88,
0x1BC90, 0x1BC99,
0x1BC9C, 0x1BCA3,
},
}
m["Egyd"] = {
"Demotic",
188519,
"abjad, logography",
-- Not in Unicode
}
m["Egyh"] = {
"Hieratic",
208111,
"abjad, logography",
-- Unified with Egyptian hieroglyphic in Unicode
}
m["Egyp"] = process_ranges{
"Egyptian hieroglyphic",
132659,
"abjad, logography",
ranges = {
0x13000, 0x13455,
0x13460, 0x143FA,
},
varieties = {"Hieratic"},
wikipedia_article = "Egyptian hieroglyphs",
normalizationFixes = handle_normalization_fixes{
from = {"𓃁", "𓆖"},
to = {"𓃀𓂝", "𓆓𓏏𓇿"}
},
}
m["Elba"] = process_ranges{
"Elbasan",
1036714,
"alphabet",
ranges = {
0x10500, 0x10527,
},
}
m["Elym"] = process_ranges{
"Elymaic",
60744423,
"abjad",
ranges = {
0x10FE0, 0x10FF6,
},
direction = "rtl",
}
m["Ethi"] = process_ranges{
"Ethiopic",
257634,
"abugida",
aliases = {"Ge'ez", "Geʽez"},
ranges = {
0x1200, 0x1248,
0x124A, 0x124D,
0x1250, 0x1256,
0x1258, 0x1258,
0x125A, 0x125D,
0x1260, 0x1288,
0x128A, 0x128D,
0x1290, 0x12B0,
0x12B2, 0x12B5,
0x12B8, 0x12BE,
0x12C0, 0x12C0,
0x12C2, 0x12C5,
0x12C8, 0x12D6,
0x12D8, 0x1310,
0x1312, 0x1315,
0x1318, 0x135A,
0x135D, 0x137C,
0x1380, 0x1399,
0x2D80, 0x2D96,
0x2DA0, 0x2DA6,
0x2DA8, 0x2DAE,
0x2DB0, 0x2DB6,
0x2DB8, 0x2DBE,
0x2DC0, 0x2DC6,
0x2DC8, 0x2DCE,
0x2DD0, 0x2DD6,
0x2DD8, 0x2DDE,
0xAB01, 0xAB06,
0xAB09, 0xAB0E,
0xAB11, 0xAB16,
0xAB20, 0xAB26,
0xAB28, 0xAB2E,
0x1E7E0, 0x1E7E6,
0x1E7E8, 0x1E7EB,
0x1E7ED, 0x1E7EE,
0x1E7F0, 0x1E7FE,
},
}
m["Gara"] = process_ranges{
"Garay",
3095302,
"alphabet",
capitalized = true,
direction = "rtl",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x10D40, 0x10D65,
0x10D69, 0x10D85,
0x10D8E, 0x10D8F,
},
}
m["Geok"] = process_ranges{
"Khutsuri",
1090055,
"alphabet",
ranges = { -- Ⴀ-Ⴭ is Asomtavruli, ⴀ-ⴭ is Nuskhuri
0x10A0, 0x10C5,
0x10C7, 0x10C7,
0x10CD, 0x10CD,
0x10FB, 0x10FB,
0x2D00, 0x2D25,
0x2D27, 0x2D27,
0x2D2D, 0x2D2D,
},
varieties = {"Nuskhuri", "Asomtavruli"},
capitalized = true,
}
m["Geor"] = process_ranges{
"Gruzia",
3317411,
"alphabet",
ranges = { -- ა-ჿ is lowercase Mkhedruli; Ა-Ჿ is uppercase Mkhedruli (Mtavruli)
0x0589, 0x0589,
0x10D0, 0x10FF,
0x1C90, 0x1CBA,
0x1CBD, 0x1CBF,
},
varieties = {"Mkhedruli", "Mtavruli"},
capitalized = true,
translit = "Geor-translit",
}
m["Glag"] = process_ranges{
"Glagolitic",
145625,
"alphabet",
ranges = {
0x0484, 0x0484,
0x0487, 0x0487,
0x0589, 0x0589,
0x10FB, 0x10FB,
0x2C00, 0x2C5F,
0x2E43, 0x2E43,
0xA66F, 0xA66F,
0x1E000, 0x1E006,
0x1E008, 0x1E018,
0x1E01B, 0x1E021,
0x1E023, 0x1E024,
0x1E026, 0x1E02A,
},
capitalized = true,
}
m["Gong"] = process_ranges{
"Gunjala Gondi",
18125340,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D60, 0x11D65,
0x11D67, 0x11D68,
0x11D6A, 0x11D8E,
0x11D90, 0x11D91,
0x11D93, 0x11D98,
0x11DA0, 0x11DA9,
},
}
m["Gonm"] = process_ranges{
"Masaram Gondi",
16977603,
"abugida",
ranges = {
0x0964, 0x0965,
0x11D00, 0x11D06,
0x11D08, 0x11D09,
0x11D0B, 0x11D36,
0x11D3A, 0x11D3A,
0x11D3C, 0x11D3D,
0x11D3F, 0x11D47,
0x11D50, 0x11D59,
},
}
m["Goth"] = process_ranges{
"Gothic",
467784,
"alphabet",
ranges = {
0x10330, 0x1034A,
},
wikipedia_article = "Gothic alphabet",
}
m["Gran"] = process_ranges{
"Grantha",
1119274,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0BE6, 0x0BF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CF2, 0x1CF4,
0x1CF8, 0x1CF9,
0x20F0, 0x20F0,
0x11300, 0x11303,
0x11305, 0x1130C,
0x1130F, 0x11310,
0x11313, 0x11328,
0x1132A, 0x11330,
0x11332, 0x11333,
0x11335, 0x11339,
0x1133B, 0x11344,
0x11347, 0x11348,
0x1134B, 0x1134D,
0x11350, 0x11350,
0x11357, 0x11357,
0x1135D, 0x11363,
0x11366, 0x1136C,
0x11370, 0x11374,
0x11FD0, 0x11FD1,
0x11FD3, 0x11FD3,
},
}
m["Grek"] = process_ranges{
"Hy Lạp",
8216,
"alphabet",
ranges = {
0x0342, 0x0342,
0x0345, 0x0345,
0x0370, 0x0377,
0x037A, 0x037F,
0x0384, 0x038A,
0x038C, 0x038C,
0x038E, 0x03A1,
0x03A3, 0x03E1,
0x03F0, 0x03FF,
0x1D26, 0x1D2A,
0x1D5D, 0x1D61,
0x1D66, 0x1D6A,
0x1DBF, 0x1DBF,
0x2126, 0x2127,
0x2129, 0x2129,
0x213C, 0x2140,
0xAB65, 0xAB65,
0x10140, 0x1018E,
0x101A0, 0x101A0,
0x1D200, 0x1D245,
},
capitalized = true,
display_text = "Grek-common",
strip_diacritics = "Grek-common",
sort_key = {
remove_diacritics = "'ʼ;·`¨´῀" .. c.grave .. c.acute .. c.diaer .. c.caron .. c.turnedcommaabove .. c.commaabove .. c.revcommaabove .. c.macron .. c.breve .. c.diaerbelow .. c.brevebelow .. c.perispomeni .. c.ypogegrammeni .. c.RSQuo .. c.prime .. c.keraia .. c.lowerkeraia .. c.tonos .. c.coronis .. c.psili .. c.dasia,
from = {"ϝ", "ͷ", "ϛ", "ͱ", "ͺ", "ϳ", "ϻ", "[ϟϙ]", "[ςϲ]", "ͳ"},
to = {"ε" .. p[1], "ε" .. p[2], "ε" .. p[3], "ζ" .. p[1], "ι", "ι" .. p[1], "π" .. p[1], "π" .. p[2], "σ", "ϡ"},
},
}
m["Polyt"] = process_ranges{
"Hy Lạp",
1475332,
m["Grek"][3],
ranges = union(m["Grek"].ranges, {
0x1F00, 0x1F15,
0x1F18, 0x1F1D,
0x1F20, 0x1F45,
0x1F48, 0x1F4D,
0x1F50, 0x1F57,
0x1F59, 0x1F59,
0x1F5B, 0x1F5B,
0x1F5D, 0x1F5D,
0x1F5F, 0x1F7D,
0x1F80, 0x1FB4,
0x1FB6, 0x1FC4,
0x1FC6, 0x1FD3,
0x1FD6, 0x1FDB,
0x1FDD, 0x1FEF,
0x1FF2, 0x1FF4,
0x1FF6, 0x1FFE,
}),
ietf_subtag = "Grek",
capitalized = m["Grek"].capitalized,
parent = "Grek",
display_text = m["Grek"].display_text,
strip_diacritics = "Polyt-stripdiacritics",
sort_key = m["Grek"].sort_key,
translit = "grc-translit",
}
m["Gujr"] = process_ranges{
"Gujarati",
733944,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A81, 0x0A83,
0x0A85, 0x0A8D,
0x0A8F, 0x0A91,
0x0A93, 0x0AA8,
0x0AAA, 0x0AB0,
0x0AB2, 0x0AB3,
0x0AB5, 0x0AB9,
0x0ABC, 0x0AC5,
0x0AC7, 0x0AC9,
0x0ACB, 0x0ACD,
0x0AD0, 0x0AD0,
0x0AE0, 0x0AE3,
0x0AE6, 0x0AF1,
0x0AF9, 0x0AFF,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ઓ", "અાૈ", "અા", "અૅ", "અે", "અૈ", "અૉ", "અો", "અૌ", "આૅ", "આૈ", "ૅા"},
to = {"અાૅ", "ઔ", "આ", "ઍ", "એ", "ઐ", "ઑ", "ઓ", "ઔ", "ઓ", "ઔ", "ૉ"}
},
}
m["Gukh"] = process_ranges{
"Khema",
110064239,
"abugida",
aliases = {"Gurung Khema", "Khema Phri", "Khema Lipi"},
ranges = {
0x0965, 0x0965,
0x16100, 0x16139,
},
}
m["Guru"] = process_ranges{
"Gurmukhi",
689894,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0A01, 0x0A03,
0x0A05, 0x0A0A,
0x0A0F, 0x0A10,
0x0A13, 0x0A28,
0x0A2A, 0x0A30,
0x0A32, 0x0A33,
0x0A35, 0x0A36,
0x0A38, 0x0A39,
0x0A3C, 0x0A3C,
0x0A3E, 0x0A42,
0x0A47, 0x0A48,
0x0A4B, 0x0A4D,
0x0A51, 0x0A51,
0x0A59, 0x0A5C,
0x0A5E, 0x0A5E,
0x0A66, 0x0A76,
0xA830, 0xA839,
},
normalizationFixes = handle_normalization_fixes{
from = {"ਅਾ", "ਅੈ", "ਅੌ", "ੲਿ", "ੲੀ", "ੲੇ", "ੳੁ", "ੳੂ", "ੳੋ"},
to = {"ਆ", "ਐ", "ਔ", "ਇ", "ਈ", "ਏ", "ਉ", "ਊ", "ਓ"}
},
}
m["Hang"] = process_ranges{
"Hangul",
8222,
"chữ tượng thanh âm tiết",
aliases = {"Hangeul"},
ranges = {
0x1100, 0x11FF,
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x302E, 0x3030,
0x3037, 0x3037,
0x30FB, 0x30FB,
0x3131, 0x318E,
0x3200, 0x321E,
0x3260, 0x327E,
0xA960, 0xA97C,
0xAC00, 0xD7A3,
0xD7B0, 0xD7C6,
0xD7CB, 0xD7FB,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFFA0, 0xFFBE,
0xFFC2, 0xFFC7,
0xFFCA, 0xFFCF,
0xFFD2, 0xFFD7,
0xFFDA, 0xFFDC,
},
}
m["Hani"] = process_ranges{
"Hán",
8201,
"logography",
ranges = {
0x2E80, 0x2E99,
0x2E9B, 0x2EF3,
0x2F00, 0x2FD5,
0x2FF0, 0x2FFF,
0x3001, 0x3003,
0x3005, 0x3011,
0x3013, 0x301F,
0x3021, 0x302D,
0x3030, 0x3030,
0x3037, 0x303F,
0x3190, 0x319F,
0x31C0, 0x31E5,
0x31EF, 0x31EF,
0x3220, 0x3247,
0x3280, 0x32B0,
0x32C0, 0x32CB,
0x30FB, 0x30FB,
0x32FF, 0x32FF,
0x3358, 0x3370,
0x337B, 0x337F,
0x33E0, 0x33FE,
0x3400, 0x4DBF,
0x4E00, 0x9FFF,
0xA700, 0xA707,
0xF900, 0xFA6D,
0xFA70, 0xFAD9,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0x16FE2, 0x16FE3,
0x16FF0, 0x16FF1,
0x1D360, 0x1D371,
0x1F250, 0x1F251,
0x20000, 0x2A6DF,
0x2A700, 0x2B739,
0x2B740, 0x2B81D,
0x2B820, 0x2CEA1,
0x2CEB0, 0x2EBE0,
0x2EBF0, 0x2EE5D,
0x2F800, 0x2FA1D,
0x30000, 0x3134A,
0x31350, 0x323AF,
},
varieties = {"Hanzi", "Kanji", "Hanja", "chữ Nôm"},
spaces = false,
}
m["Hans"] = {
"Hán giản thể",
185614,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hant"] = {
"Hán phồn thể",
178528,
m["Hani"][3],
ranges = m["Hani"].ranges,
characters = m["Hani"].characters,
spaces = m["Hani"].spaces,
parent = "Hani",
}
m["Hano"] = process_ranges{
"Hanunoo",
1584045,
"abugida",
aliases = {"Hanunó'o", "Hanuno'o"},
ranges = {
0x1720, 0x1736,
},
}
m["Hatr"] = process_ranges{
"Hatran",
20813038,
"abjad",
ranges = {
0x108E0, 0x108F2,
0x108F4, 0x108F5,
0x108FB, 0x108FF,
},
direction = "rtl",
}
m["Hebr"] = process_ranges{
"Do Thái",
33513,
"abjad", -- more precisely, impure abjad
ranges = {
0x0591, 0x05C7,
0x05D0, 0x05EA,
0x05EF, 0x05F4,
0x2135, 0x2138,
0xFB1D, 0xFB36,
0xFB38, 0xFB3C,
0xFB3E, 0xFB3E,
0xFB40, 0xFB41,
0xFB43, 0xFB44,
0xFB46, 0xFB4F,
},
direction = "rtl",
display_text = "Hebr-common",
sort_key = "Hebr-common",
strip_diacritics = "Hebr-common",
}
m["Hira"] = process_ranges{
"Hiragana",
48332,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3041, 0x3096,
0x3099, 0x30A0,
0x30FB, 0x30FC,
0xFE45, 0xFE46,
0xFF61, 0xFF65,
0xFF70, 0xFF70,
0xFF9E, 0xFF9F,
0x1B001, 0x1B11F,
0x1B132, 0x1B132,
0x1B150, 0x1B152,
0x1F200, 0x1F200,
},
varieties = {"Hentaigana"},
spaces = false,
}
m["Hluw"] = process_ranges{
"Anatolian hieroglyphic",
521323,
"logography, syllabary",
ranges = {
0x14400, 0x14646,
},
wikipedia_article = "Anatolian hieroglyphs",
}
m["Hmng"] = process_ranges{
"Pahawh Hmong",
365954,
"semisyllabary",
aliases = {"Hmong"},
ranges = {
0x16B00, 0x16B45,
0x16B50, 0x16B59,
0x16B5B, 0x16B61,
0x16B63, 0x16B77,
0x16B7D, 0x16B8F,
},
}
m["Hmnp"] = process_ranges{
"Nyiakeng Puachue Hmong",
33712499,
"alphabet",
ranges = {
0x1E100, 0x1E12C,
0x1E130, 0x1E13D,
0x1E140, 0x1E149,
0x1E14E, 0x1E14F,
},
}
m["Hung"] = process_ranges{
"Old Hungarian",
446224,
"alphabet",
aliases = {"Hungarian runic"},
ranges = {
0x10C80, 0x10CB2,
0x10CC0, 0x10CF2,
0x10CFA, 0x10CFF,
},
capitalized = true,
direction = "rtl",
}
m["Ibrnn"] = {
"Northeastern Iberian",
1113155,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Ibrns"] = {
"Southeastern Iberian",
2305351,
"semisyllabary",
ietf_subtag = "Zzzz",
-- Not in Unicode
}
m["Image"] = {
-- To be used to avoid any formatting or link processing
"Image-rendered",
478798,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Inds"] = {
"Indus",
601388,
aliases = {"Harappan", "Indus Valley"},
}
m["Ipach"] = {
"International Phonetic Alphabet",
21204,
aliases = {"IPA"},
ietf_subtag = "Latn",
}
m["Ital"] = process_ranges{
"Old Italic",
4891256,
"alphabet",
ranges = {
0x10300, 0x10323,
0x1032D, 0x1032F,
},
}
m["Java"] = process_ranges{
"Java",
879704,
"abugida",
ranges = {
0xA980, 0xA9CD,
0xA9CF, 0xA9D9,
0xA9DE, 0xA9DF,
},
}
m["Jurc"] = {
"Jurchen",
912240,
"logography",
spaces = false,
}
m["Kali"] = process_ranges{
"Kayah Li",
4919239,
"abugida",
ranges = {
0xA900, 0xA92F,
},
}
m["Kana"] = process_ranges{
"Katakana",
82946,
"syllabary",
ranges = {
0x3001, 0x3003,
0x3008, 0x3011,
0x3013, 0x301F,
0x3030, 0x3035,
0x3037, 0x3037,
0x303C, 0x303D,
0x3099, 0x309C,
0x30A0, 0x30FF,
0x31F0, 0x31FF,
0x32D0, 0x32FE,
0x3300, 0x3357,
0xFE45, 0xFE46,
0xFF61, 0xFF9F,
0x1AFF0, 0x1AFF3,
0x1AFF5, 0x1AFFB,
0x1AFFD, 0x1AFFE,
0x1B000, 0x1B000,
0x1B120, 0x1B122,
0x1B155, 0x1B155,
0x1B164, 0x1B167,
},
spaces = false,
}
m["Kawi"] = process_ranges{
"Kawi",
975802,
"abugida",
ranges = {
0x11F00, 0x11F10,
0x11F12, 0x11F3A,
0x11F3E, 0x11F5A,
},
}
m["Khar"] = process_ranges{
"Kharoshthi",
1161266,
"abugida",
ranges = {
0x10A00, 0x10A03,
0x10A05, 0x10A06,
0x10A0C, 0x10A13,
0x10A15, 0x10A17,
0x10A19, 0x10A35,
0x10A38, 0x10A3A,
0x10A3F, 0x10A48,
0x10A50, 0x10A58,
},
direction = "rtl",
}
m["Khmr"] = process_ranges{
"Khmer",
1054190,
"abugida",
ranges = {
0x1780, 0x17DD,
0x17E0, 0x17E9,
0x17F0, 0x17F9,
0x19E0, 0x19FF,
},
spaces = false,
normalizationFixes = handle_normalization_fixes{
from = {"ឣ", "ឤ"},
to = {"អ", "អា"}
},
}
m["Khoj"] = process_ranges{
"Khojki",
1740656,
"abugida",
ranges = {
0x0AE6, 0x0AEF,
0xA830, 0xA839,
0x11200, 0x11211,
0x11213, 0x11241,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑈀𑈬𑈱", "𑈀𑈬", "𑈀𑈱", "𑈀𑈳", "𑈁𑈱", "𑈆𑈬", "𑈬𑈰", "𑈬𑈱", "𑉀𑈮"},
to = {"𑈇", "𑈁", "𑈅", "𑈇", "𑈇", "𑈃", "𑈲", "𑈳", "𑈂"}
},
}
m["Khomt"] = {
"Khom Thai",
13023788,
"abugida",
-- Not in Unicode
}
m["Kitl"] = {
"Khitan large",
6401797,
"logography",
spaces = false,
}
m["Kits"] = process_ranges{
"Khitan small",
6401800,
"logography, syllabary",
ranges = {
0x16FE4, 0x16FE4,
0x18B00, 0x18CD5,
0x18CFF, 0x18CFF,
},
spaces = false,
}
m["Knda"] = process_ranges{
"Kannada",
839666,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C80, 0x0C8C,
0x0C8E, 0x0C90,
0x0C92, 0x0CA8,
0x0CAA, 0x0CB3,
0x0CB5, 0x0CB9,
0x0CBC, 0x0CC4,
0x0CC6, 0x0CC8,
0x0CCA, 0x0CCD,
0x0CD5, 0x0CD6,
0x0CDD, 0x0CDE,
0x0CE0, 0x0CE3,
0x0CE6, 0x0CEF,
0x0CF1, 0x0CF3,
0x1CD0, 0x1CD0,
0x1CD2, 0x1CD3,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA830, 0xA835,
},
normalizationFixes = handle_normalization_fixes{
from = {"ಉಾ", "ಋಾ", "ಒೌ"},
to = {"ಊ", "ೠ", "ಔ"}
},
}
m["Kpel"] = {
"Kpelle",
1586299,
"syllabary",
-- Not in Unicode
}
m["Krai"] = process_ranges{
"Kirat Rai",
123173834,
"abugida",
aliases = {"Rai", "Khambu Rai", "Rai Barṇamālā", "Kirat Khambu Rai"},
ranges = {
0x16D40, 0x16D79,
},
}
m["Kthi"] = process_ranges{
"Kaithi",
1253814,
"abugida",
ranges = {
0x0966, 0x096F,
0xA830, 0xA839,
0x11080, 0x110C2,
0x110CD, 0x110CD,
},
}
m["Kulit"] = {
"Kulitan",
6443044,
"abugida",
-- Not in Unicode
}
m["Lana"] = process_ranges{
"Tai Tham",
1314503,
"abugida",
aliases = {"Tham", "Tua Mueang", "Lanna"},
ranges = {
0x1A20, 0x1A5E,
0x1A60, 0x1A7C,
0x1A7F, 0x1A89,
0x1A90, 0x1A99,
0x1AA0, 0x1AAD,
},
spaces = false,
}
m["Laoo"] = process_ranges{
"Lao",
1815229,
"abugida",
ranges = {
0x0E81, 0x0E82,
0x0E84, 0x0E84,
0x0E86, 0x0E8A,
0x0E8C, 0x0EA3,
0x0EA5, 0x0EA5,
0x0EA7, 0x0EBD,
0x0EC0, 0x0EC4,
0x0EC6, 0x0EC6,
0x0EC8, 0x0ECE,
0x0ED0, 0x0ED9,
0x0EDC, 0x0EDF,
},
spaces = false,
}
m["Latn"] = process_ranges{
"Latinh",
8229,
"alphabet",
aliases = {"Roman"},
ranges = {
0x0041, 0x005A,
0x0061, 0x007A,
0x00AA, 0x00AA,
0x00BA, 0x00BA,
0x00C0, 0x00D6,
0x00D8, 0x00F6,
0x00F8, 0x02B8,
0x02C0, 0x02C1,
0x02E0, 0x02E4,
0x0363, 0x036F,
0x0485, 0x0486,
0x0951, 0x0952,
0x10FB, 0x10FB,
0x1D00, 0x1D25,
0x1D2C, 0x1D5C,
0x1D62, 0x1D65,
0x1D6B, 0x1D77,
0x1D79, 0x1DBE,
0x1DF8, 0x1DF8,
0x1E00, 0x1EFF,
0x202F, 0x202F,
0x2071, 0x2071,
0x207F, 0x207F,
0x2090, 0x209C,
0x20F0, 0x20F0,
0x2100, 0x2125,
0x2128, 0x2128,
0x212A, 0x2134,
0x2139, 0x213B,
0x2141, 0x214E,
0x2160, 0x2188,
0x2C60, 0x2C7F,
0xA700, 0xA707,
0xA722, 0xA787,
0xA78B, 0xA7CD,
0xA7D0, 0xA7D1,
0xA7D3, 0xA7D3,
0xA7D5, 0xA7DC,
0xA7F2, 0xA7FF,
0xA92E, 0xA92E,
0xAB30, 0xAB5A,
0xAB5C, 0xAB64,
0xAB66, 0xAB69,
0xFB00, 0xFB06,
0xFF21, 0xFF3A,
0xFF41, 0xFF5A,
0x10780, 0x10785,
0x10787, 0x107B0,
0x107B2, 0x107BA,
0x1DF00, 0x1DF1E,
0x1DF25, 0x1DF2A,
},
varieties = {"Rumi", "Romaji", "Rōmaji", "Romaja"},
capitalized = true,
translit = false,
}
m["Latf"] = {
"Fraktur",
148443,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
otherNames = {"Blackletter"}, -- Blackletter is actually the parent "script"
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Latg"] = {
"Gaelic",
1432616,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
otherNames = {"Irish"},
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["pjt-Latn"] = {
"Latin",
nil,
m["Latn"][3],
ranges = m["Latn"].ranges,
characters = m["Latn"].characters,
capitalized = m["Latn"].capitalized,
translit = m["Latn"].translit,
parent = "Latn",
}
m["Leke"] = {
"Leke",
19572613,
"abugida",
-- Not in Unicode
}
m["Lepc"] = process_ranges{
"Lepcha",
1481626,
"abugida",
aliases = {"Róng"},
ranges = {
0x1C00, 0x1C37,
0x1C3B, 0x1C49,
0x1C4D, 0x1C4F,
},
}
m["Limb"] = process_ranges{
"Limbu",
933796,
"abugida",
ranges = {
0x0965, 0x0965,
0x1900, 0x191E,
0x1920, 0x192B,
0x1930, 0x193B,
0x1940, 0x1940,
0x1944, 0x194F,
},
}
m["Lina"] = process_ranges{
"Linear A",
30972,
ranges = {
0x10107, 0x10133,
0x10600, 0x10736,
0x10740, 0x10755,
0x10760, 0x10767,
},
}
m["Linb"] = process_ranges{
"Linear B",
190102,
ranges = {
0x10000, 0x1000B,
0x1000D, 0x10026,
0x10028, 0x1003A,
0x1003C, 0x1003D,
0x1003F, 0x1004D,
0x10050, 0x1005D,
0x10080, 0x100FA,
0x10100, 0x10102,
0x10107, 0x10133,
0x10137, 0x1013F,
},
}
m["Lisu"] = process_ranges{
"Fraser",
1194621,
"alphabet",
aliases = {"Old Lisu", "Lisu"},
ranges = {
0x300A, 0x300B,
0xA4D0, 0xA4FF,
0x11FB0, 0x11FB0,
},
normalizationFixes = handle_normalization_fixes{
from = {"['’]", "[.ꓸ][.ꓸ]", "[.ꓸ][,ꓹ]"},
to = {"ʼ", "ꓺ", "ꓻ"}
},
}
m["Loma"] = {
"Loma",
13023816,
"syllabary",
-- Not in Unicode
}
m["Lyci"] = process_ranges{
"Lycian",
913587,
"alphabet",
ranges = {
0x10280, 0x1029C,
},
}
m["Lydi"] = process_ranges{
"Lydian",
4261300,
"alphabet",
ranges = {
0x10920, 0x10939,
0x1093F, 0x1093F,
},
direction = "rtl",
}
m["Mahj"] = process_ranges{
"Mahajani",
6732850,
"abugida",
ranges = {
0x0964, 0x096F,
0xA830, 0xA839,
0x11150, 0x11176,
},
}
m["Maka"] = process_ranges{
"Makasar",
72947229,
"abugida",
aliases = {"Old Makasar"},
ranges = {
0x11EE0, 0x11EF8,
},
}
m["Mand"] = process_ranges{
"Mandaic",
1812130,
aliases = {"Mandaean"},
ranges = {
0x0640, 0x0640,
0x0840, 0x085B,
0x085E, 0x085E,
},
direction = "rtl",
}
m["Mani"] = process_ranges{
"Manichaean",
3544702,
"abjad",
ranges = {
0x0640, 0x0640,
0x10AC0, 0x10AE6,
0x10AEB, 0x10AF6,
},
direction = "rtl",
}
m["Marc"] = process_ranges{
"Marchen",
72403709,
"abugida",
ranges = {
0x11C70, 0x11C8F,
0x11C92, 0x11CA7,
0x11CA9, 0x11CB6,
},
}
m["Maya"] = process_ranges{
"Maya",
211248,
aliases = {"Maya hieroglyphic", "Mayan", "Mayan hieroglyphic"},
ranges = {
0x1D2E0, 0x1D2F3,
},
}
m["Medf"] = process_ranges{
"Medefaidrin",
1519764,
aliases = {"Oberi Okaime", "Oberi Ɔkaimɛ"},
ranges = {
0x16E40, 0x16E9A,
},
capitalized = true,
}
m["Mend"] = process_ranges{
"Mende",
951069,
aliases = {"Mende Kikakui"},
ranges = {
0x1E800, 0x1E8C4,
0x1E8C7, 0x1E8D6,
},
direction = "rtl",
}
m["Merc"] = process_ranges{
"Meroitic cursive",
73028124,
"abugida",
ranges = {
0x109A0, 0x109B7,
0x109BC, 0x109CF,
0x109D2, 0x109FF,
},
direction = "rtl",
}
m["Mero"] = process_ranges{
"Meroitic hieroglyphic",
73028623,
"abugida",
ranges = {
0x10980, 0x1099F,
},
direction = "rtl",
wikipedia_article = "Meroitic hieroglyphs",
}
m["Mlym"] = process_ranges{
"Malayalam",
1164129,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0D00, 0x0D0C,
0x0D0E, 0x0D10,
0x0D12, 0x0D44,
0x0D46, 0x0D48,
0x0D4A, 0x0D4F,
0x0D54, 0x0D63,
0x0D66, 0x0D7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
0xA830, 0xA832,
},
normalizationFixes = handle_normalization_fixes{
from = {"ഇൗ", "ഉൗ", "എെ", "ഒാ", "ഒൗ", "ക്", "ണ്", "ന്റ", "ന്", "മ്", "യ്", "ര്", "ല്", "ള്", "ഴ്", "െെ", "ൻ്റ"},
to = {"ഈ", "ഊ", "ഐ", "ഓ", "ഔ", "ൿ", "ൺ", "ൻറ", "ൻ", "ൔ", "ൕ", "ർ", "ൽ", "ൾ", "ൖ", "ൈ", "ന്റ"}
},
}
m["Modi"] = process_ranges{
"Modi",
1703713,
"abugida",
ranges = {
0xA830, 0xA839,
0x11600, 0x11644,
0x11650, 0x11659,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑘀𑘹", "𑘀𑘺", "𑘁𑘹", "𑘁𑘺"},
to = {"𑘊", "𑘋", "𑘌", "𑘍"}
},
}
m["Mong"] = process_ranges{
"Mongolian",
1055705,
"alphabet",
aliases = {"Mongol bichig", "Hudum Mongol bichig"},
ranges = {
0x1800, 0x1805,
0x180A, 0x1819,
0x1820, 0x1842,
0x1878, 0x1878,
0x1880, 0x1897,
0x18A6, 0x18A6,
0x18A9, 0x18A9,
0x200C, 0x200D,
0x202F, 0x202F,
0x3001, 0x3002,
0x3008, 0x300B,
0x11660, 0x11668,
},
direction = "vertical-ltr",
}
m["mnc-Mong"] = process_ranges{
"Manchu",
122888,
m["Mong"][3],
ranges = {
0x1801, 0x1801,
0x1804, 0x1804,
0x1808, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x185D,
0x185F, 0x1861,
0x1864, 0x1869,
0x186C, 0x1871,
0x1873, 0x1877,
0x1880, 0x1888,
0x188F, 0x188F,
0x189A, 0x18A5,
0x18A8, 0x18A8,
0x18AA, 0x18AA,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "Mong",
}
m["sjo-Mong"] = process_ranges{
"Xibe",
113624153,
m["Mong"][3],
aliases = {"Sibe"},
ranges = {
0x1804, 0x1804,
0x1807, 0x1807,
0x180A, 0x180F,
0x1820, 0x1820,
0x1823, 0x1823,
0x1828, 0x1828,
0x182A, 0x182A,
0x182E, 0x1830,
0x1834, 0x1838,
0x183A, 0x183A,
0x185D, 0x1872,
0x200C, 0x200D,
0x202F, 0x202F,
},
direction = "vertical-ltr",
parent = "mnc-Mong",
}
m["xwo-Mong"] = process_ranges{
"Clear Script",
529085,
m["Mong"][3],
aliases = {"Todo", "Todo bichig"},
ranges = {
0x1800, 0x1801,
0x1804, 0x1806,
0x180A, 0x1820,
0x1828, 0x1828,
0x182F, 0x1831,
0x1834, 0x1834,
0x1837, 0x1838,
0x183A, 0x183B,
0x1840, 0x1840,
0x1843, 0x185C,
0x1880, 0x1887,
0x1889, 0x188F,
0x1894, 0x1894,
0x1896, 0x1899,
0x18A7, 0x18A7,
0x200C, 0x200D,
0x202F, 0x202F,
0x11669, 0x1166C,
},
direction = "vertical-ltr",
parent = "Mong",
}
m["Moon"] = {
"Moon",
918391,
"alphabet",
aliases = {"Moon System of Embossed Reading", "Moon type", "Moon writing", "Moon alphabet", "Moon code"},
-- Not in Unicode
}
m["Morse"] = {
"Morse code",
79897,
ietf_subtag = "Zsym",
}
m["Mroo"] = process_ranges{
"Mru",
75919253,
aliases = {"Mro", "Mrung"},
ranges = {
0x16A40, 0x16A5E,
0x16A60, 0x16A69,
0x16A6E, 0x16A6F,
},
}
m["Mtei"] = process_ranges{
"Meitei Mayek",
2981413,
"abugida",
aliases = {"Meetei Mayek", "Manipuri"},
ranges = {
0xAAE0, 0xAAF6,
0xABC0, 0xABED,
0xABF0, 0xABF9,
},
}
m["Mult"] = process_ranges{
"Multani",
17047906,
"abugida",
ranges = {
0x0A66, 0x0A6F,
0x11280, 0x11286,
0x11288, 0x11288,
0x1128A, 0x1128D,
0x1128F, 0x1129D,
0x1129F, 0x112A9,
},
}
m["Music"] = process_ranges{
"musical notation",
233861,
"pictography",
ranges = {
0x2669, 0x266F,
0x1D100, 0x1D126,
0x1D129, 0x1D1EA,
},
ietf_subtag = "Zsym",
translit = false,
}
m["Mymr"] = process_ranges{
"Miến Điện",
43887939,
"abugida",
aliases = {"Myanmar"},
ranges = {
0x1000, 0x109F,
0xA92E, 0xA92E,
0xA9E0, 0xA9FE,
0xAA60, 0xAA7F,
0x116D0, 0x116E3,
},
spaces = false,
}
m["Nagm"] = process_ranges{
"Mundari Bani",
106917274,
"alphabet",
aliases = {"Nag Mundari"},
ranges = {
0x1E4D0, 0x1E4F9,
},
}
m["Nand"] = process_ranges{
"Nandinagari",
6963324,
"abugida",
ranges = {
0x0964, 0x0965,
0x0CE6, 0x0CEF,
0x1CE9, 0x1CE9,
0x1CF2, 0x1CF2,
0x1CFA, 0x1CFA,
0xA830, 0xA835,
0x119A0, 0x119A7,
0x119AA, 0x119D7,
0x119DA, 0x119E4,
},
}
m["Narb"] = process_ranges{
"Ancient North Arabian",
1472213,
"abjad",
aliases = {"Old North Arabian"},
ranges = {
0x10A80, 0x10A9F,
},
direction = "rtl",
}
m["Nbat"] = process_ranges{
"Nabataean",
855624,
"abjad",
aliases = {"Nabatean"},
ranges = {
0x10880, 0x1089E,
0x108A7, 0x108AF,
},
direction = "rtl",
}
m["Newa"] = process_ranges{
"Newa",
7237292,
"abugida",
aliases = {"Newar", "Newari", "Prachalit Nepal"},
ranges = {
0x11400, 0x1145B,
0x1145D, 0x11461,
},
}
m["Nkdb"] = {
"Dongba",
1190953,
"pictography",
aliases = {"Naxi Dongba", "Nakhi Dongba", "Tomba", "Tompa", "Mo-so"},
spaces = false,
-- Not in Unicode
}
m["Nkgb"] = {
"Geba",
731189,
"syllabary",
aliases = {"Nakhi Geba", "Naxi Geba"},
spaces = false,
-- Not in Unicode
}
m["Nkoo"] = process_ranges{
"N'Ko",
1062587,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x07C0, 0x07FA,
0x07FD, 0x07FF,
0xFD3E, 0xFD3F,
},
direction = "rtl",
}
m["None"] = {
"unspecified",
nil,
-- This should not have any characters listed
ietf_subtag = "Zyyy",
translit = false,
character_category = false, -- none
}
m["Nshu"] = process_ranges{
"Nüshu",
56436,
"syllabary",
aliases = {"Nushu"},
ranges = {
0x16FE1, 0x16FE1,
0x1B170, 0x1B2FB,
},
spaces = false,
}
m["Ogam"] = process_ranges{
"Ogham",
184661,
ranges = {
0x1680, 0x169C,
},
}
m["Olck"] = process_ranges{
"Ol Chiki",
201688,
aliases = {"Ol Chemetʼ", "Ol", "Santali"},
ranges = {
0x1C50, 0x1C7F,
},
}
m["Onao"] = process_ranges{
"Ol Onal",
108607084,
"alphabet",
ranges = {
0x0964, 0x0965,
0x1E5D0, 0x1E5FA,
0x1E5FF, 0x1E5FF,
},
}
m["Orkh"] = process_ranges{
"Old Turkic",
5058305,
aliases = {"Orkhon runic"},
ranges = {
0x10C00, 0x10C48,
},
direction = "rtl",
}
m["Orya"] = process_ranges{
"Odia",
1760127,
"abugida",
aliases = {"Oriya"},
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B01, 0x0B03,
0x0B05, 0x0B0C,
0x0B0F, 0x0B10,
0x0B13, 0x0B28,
0x0B2A, 0x0B30,
0x0B32, 0x0B33,
0x0B35, 0x0B39,
0x0B3C, 0x0B44,
0x0B47, 0x0B48,
0x0B4B, 0x0B4D,
0x0B55, 0x0B57,
0x0B5C, 0x0B5D,
0x0B5F, 0x0B63,
0x0B66, 0x0B77,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ଅା", "ଏୗ", "ଓୗ"},
to = {"ଆ", "ଐ", "ଔ"}
},
}
m["Osge"] = process_ranges{
"Osage",
7105529,
ranges = {
0x104B0, 0x104D3,
0x104D8, 0x104FB,
},
capitalized = true,
}
m["Osma"] = process_ranges{
"Osmanya",
1377866,
ranges = {
0x10480, 0x1049D,
0x104A0, 0x104A9,
},
}
m["Ougr"] = process_ranges{
"Duy Ngô Nhĩ cổ",
1998938,
"abjad, alphabet",
ranges = {
0x0640, 0x0640,
0x10AF2, 0x10AF2,
0x10F70, 0x10F89,
},
-- This should ideally be "vertical-ltr", but getting the CSS right is tricky because it's right-to-left horizontally, but left-to-right vertically. Currently, displaying it vertically causes it to display bottom-to-top.
direction = "rtl",
}
m["Palm"] = process_ranges{
"Palmyrene",
17538100,
ranges = {
0x10860, 0x1087F,
},
direction = "rtl",
}
m["Pauc"] = process_ranges{
"Pau Cin Hau",
25339852,
ranges = {
0x11AC0, 0x11AF8,
},
}
m["Pcun"] = {
"Proto-Cuneiform",
1650699,
"pictography",
-- Not in Unicode
}
m["Pelm"] = {
"Proto-Elamite",
56305763,
"pictography",
-- Not in Unicode
}
m["Perm"] = process_ranges{
"Old Permic",
147899,
ranges = {
0x0483, 0x0483,
0x10350, 0x1037A,
},
}
m["Phag"] = process_ranges{
"Phags-pa",
822836,
"abugida",
ranges = {
0x1802, 0x1803,
0x1805, 0x1805,
0x200C, 0x200D,
0x202F, 0x202F,
0x3002, 0x3002,
0xA840, 0xA877,
},
direction = "vertical-ltr",
}
m["Phli"] = process_ranges{
"Inscriptional Pahlavi",
24089793,
"abjad",
ranges = {
0x10B60, 0x10B72,
0x10B78, 0x10B7F,
},
direction = "rtl",
}
m["Phlp"] = process_ranges{
"Psalter Pahlavi",
7253954,
"abjad",
ranges = {
0x0640, 0x0640,
0x10B80, 0x10B91,
0x10B99, 0x10B9C,
0x10BA9, 0x10BAF,
},
direction = "rtl",
}
m["Phlv"] = {
"Book Pahlavi",
72403118,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Phnx"] = process_ranges{
"Phoenician",
26752,
"abjad",
ranges = {
0x10900, 0x1091B,
0x1091F, 0x1091F,
},
direction = "rtl",
}
m["Plrd"] = process_ranges{
"Pollard",
601734,
"abugida",
aliases = {"Miao"},
ranges = {
0x16F00, 0x16F4A,
0x16F4F, 0x16F87,
0x16F8F, 0x16F9F,
},
}
m["Prti"] = process_ranges{
"Inscriptional Parthian",
13023804,
ranges = {
0x10B40, 0x10B55,
0x10B58, 0x10B5F,
},
direction = "rtl",
}
m["Psin"] = {
"Proto-Sinaitic",
1065250,
"abjad",
direction = "rtl",
-- Not in Unicode
}
m["Ranj"] = {
"Ranjana",
2385276,
"abugida",
-- Not in Unicode
}
m["Rjng"] = process_ranges{
"Rejang",
2007960,
"abugida",
ranges = {
0xA930, 0xA953,
0xA95F, 0xA95F,
},
}
m["Rohg"] = process_ranges{
"Hanifi Rohingya",
21028705,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0640, 0x0640,
0x06D4, 0x06D4,
0x10D00, 0x10D27,
0x10D30, 0x10D39,
},
direction = "rtl",
}
m["Roro"] = {
"Rongorongo",
209764,
-- Not in Unicode
}
m["Rumin"] = process_ranges{
"Rumi numerals",
nil,
ranges = {
0x10E60, 0x10E7E,
},
ietf_subtag = "Arab",
}
m["Runr"] = process_ranges{
"Runic",
82996,
"alphabet",
ranges = {
0x16A0, 0x16EA,
0x16EE, 0x16F8,
},
}
m["Samr"] = process_ranges{
"Samaritan",
1550930,
"abjad",
ranges = {
0x0800, 0x082D,
0x0830, 0x083E,
},
direction = "rtl",
}
m["Sarb"] = process_ranges{
"Ancient South Arabian",
446074,
"abjad",
aliases = {"Old South Arabian"},
ranges = {
0x10A60, 0x10A7F,
},
direction = "rtl",
}
m["Saur"] = process_ranges{
"Saurashtra",
3535165,
"abugida",
ranges = {
0xA880, 0xA8C5,
0xA8CE, 0xA8D9,
},
}
m["Semap"] = {
"flag semaphore",
250796,
"pictography",
ietf_subtag = "Zsym",
}
m["Sgnw"] = process_ranges{
"SignWriting",
1497335,
"pictography",
aliases = {"Sutton SignWriting"},
ranges = {
0x1D800, 0x1DA8B,
0x1DA9B, 0x1DA9F,
0x1DAA1, 0x1DAAF,
},
translit = false,
}
m["Shaw"] = process_ranges{
"Shavian",
1970098,
aliases = {"Shaw"},
ranges = {
0x10450, 0x1047F,
},
}
m["Shrd"] = process_ranges{
"Sharada",
2047117,
"abugida",
ranges = {
0x0951, 0x0951,
0x1CD7, 0x1CD7,
0x1CD9, 0x1CD9,
0x1CDC, 0x1CDD,
0x1CE0, 0x1CE0,
0xA830, 0xA835,
0xA838, 0xA838,
0x11180, 0x111DF,
},
}
m["Shui"] = {
"Sui",
752854,
"logography",
spaces = false,
-- Not in Unicode
}
m["Sidd"] = process_ranges{
"Siddham",
250379,
"abugida",
ranges = {
0x11580, 0x115B5,
0x115B8, 0x115DD,
},
}
m["Sidt"] = {
"Sidetic",
36659,
"alphabet",
direction = "rtl",
-- Not in Unicode
}
m["Sind"] = process_ranges{
"Khudabadi",
6402810,
"abugida",
aliases = {"Khudawadi"},
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x112B0, 0x112EA,
0x112F0, 0x112F9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑊰𑋠", "𑊰𑋥", "𑊰𑋦", "𑊰𑋧", "𑊰𑋨"},
to = {"𑊱", "𑊶", "𑊷", "𑊸", "𑊹"}
},
}
m["Sinh"] = process_ranges{
"Sinhalese",
1574992,
"abugida",
aliases = {"Sinhala"},
ranges = {
0x0964, 0x0965,
0x0D81, 0x0D83,
0x0D85, 0x0D96,
0x0D9A, 0x0DB1,
0x0DB3, 0x0DBB,
0x0DBD, 0x0DBD,
0x0DC0, 0x0DC6,
0x0DCA, 0x0DCA,
0x0DCF, 0x0DD4,
0x0DD6, 0x0DD6,
0x0DD8, 0x0DDF,
0x0DE6, 0x0DEF,
0x0DF2, 0x0DF4,
0x1CF2, 0x1CF2,
0x111E1, 0x111F4,
},
normalizationFixes = handle_normalization_fixes{
from = {"අා", "අැ", "අෑ", "උෟ", "ඍෘ", "ඏෟ", "එ්", "එෙ", "ඔෟ", "ෘෘ"},
to = {"ආ", "ඇ", "ඈ", "ඌ", "ඎ", "ඐ", "ඒ", "ඓ", "ඖ", "ෲ"}
},
}
m["Sogd"] = process_ranges{
"Sogdian",
578359,
"abjad",
ranges = {
0x0640, 0x0640,
0x10F30, 0x10F59,
},
direction = "rtl",
}
m["Sogo"] = process_ranges{
"Old Sogdian",
72403254,
"abjad",
ranges = {
0x10F00, 0x10F27,
},
direction = "rtl",
}
m["Sora"] = process_ranges{
"Sorang Sompeng",
7563292,
aliases = {"Sora Sompeng"},
ranges = {
0x110D0, 0x110E8,
0x110F0, 0x110F9,
},
}
m["Soyo"] = process_ranges{
"Soyombo",
8009382,
"abugida",
ranges = {
0x11A50, 0x11AA2,
},
}
m["Sund"] = process_ranges{
"Sundanese",
51589,
"abugida",
ranges = {
0x1B80, 0x1BBF,
0x1CC0, 0x1CC7,
},
}
m["Sunu"] = process_ranges{
"Sunuwar",
109984965,
"alphabet",
ranges = {
0x11BC0, 0x11BE1,
0x11BF0, 0x11BF9,
},
}
m["Sylo"] = process_ranges{
"Sylheti Nagri",
144128,
"abugida",
aliases = {"Sylheti Nāgarī", "Syloti Nagri"},
ranges = {
0x0964, 0x0965,
0x09E6, 0x09EF,
0xA800, 0xA82C,
},
}
m["Syrc"] = process_ranges{
"Syriac",
26567,
"abjad", -- more precisely, impure abjad
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0640, 0x0640,
0x064B, 0x0655,
0x0670, 0x0670,
0x0700, 0x070D,
0x070F, 0x074A,
0x074D, 0x074F,
0x0860, 0x086A,
0x1DF8, 0x1DF8,
0x1DFA, 0x1DFA,
},
direction = "rtl",
}
-- Syre, Syrj, Syrn are apparently subsumed into Syrc; discuss if this causes issues
m["Tagb"] = process_ranges{
"Tagbanwa",
977444,
"abugida",
ranges = {
0x1735, 0x1736,
0x1760, 0x176C,
0x176E, 0x1770,
0x1772, 0x1773,
},
}
m["Takr"] = process_ranges{
"Takri",
759202,
"abugida",
ranges = {
0x0964, 0x0965,
0xA830, 0xA839,
0x11680, 0x116B9,
0x116C0, 0x116C9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑚀𑚭", "𑚀𑚴", "𑚀𑚵", "𑚆𑚲"},
to = {"𑚁", "𑚈", "𑚉", "𑚇"}
},
}
m["Tale"] = process_ranges{
"Tai Nüa",
2566326,
"abugida",
aliases = {"Tai Nuea", "New Tai Nüa", "New Tai Nuea", "Dehong Dai", "Tai Dehong", "Tai Le"},
ranges = {
0x1040, 0x1049,
0x1950, 0x196D,
0x1970, 0x1974,
},
spaces = false,
}
m["Talu"] = process_ranges{
"Tày Lự mới",
3498863,
"abugida",
ranges = {
0x1980, 0x19AB,
0x19B0, 0x19C9,
0x19D0, 0x19DA,
0x19DE, 0x19DF,
},
spaces = false,
}
m["Taml"] = process_ranges{
"Tamil",
26803,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0B82, 0x0B83,
0x0B85, 0x0B8A,
0x0B8E, 0x0B90,
0x0B92, 0x0B95,
0x0B99, 0x0B9A,
0x0B9C, 0x0B9C,
0x0B9E, 0x0B9F,
0x0BA3, 0x0BA4,
0x0BA8, 0x0BAA,
0x0BAE, 0x0BB9,
0x0BBE, 0x0BC2,
0x0BC6, 0x0BC8,
0x0BCA, 0x0BCD,
0x0BD0, 0x0BD0,
0x0BD7, 0x0BD7,
0x0BE6, 0x0BFA,
0x1CDA, 0x1CDA,
0xA8F3, 0xA8F3,
0x11301, 0x11301,
0x11303, 0x11303,
0x1133B, 0x1133C,
0x11FC0, 0x11FF1,
0x11FFF, 0x11FFF,
},
normalizationFixes = handle_normalization_fixes{
from = {"அூ", "ஸ்ரீ"},
to = {"ஆ", "ஶ்ரீ"}
},
}
m["Tang"] = process_ranges{
"Tangut",
1373610,
"logography, syllabary",
ranges = {
0x31EF, 0x31EF,
0x16FE0, 0x16FE0,
0x17000, 0x187F7,
0x18800, 0x18AFF,
0x18D00, 0x18D08,
},
spaces = false,
}
m["Tavt"] = process_ranges{
"Tai Viet",
11818517,
"abugida",
ranges = {
0xAA80, 0xAAC2,
0xAADB, 0xAADF,
},
spaces = false,
}
m["Tayo"] = {
"Lai Tay",
16306701,
"abugida",
aliases = {"Tai Yo"},
direction = "vertical-rtl",
-- Not in Unicode
}
m["Telu"] = process_ranges{
"Telugu",
570450,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x0C00, 0x0C0C,
0x0C0E, 0x0C10,
0x0C12, 0x0C28,
0x0C2A, 0x0C39,
0x0C3C, 0x0C44,
0x0C46, 0x0C48,
0x0C4A, 0x0C4D,
0x0C55, 0x0C56,
0x0C58, 0x0C5A,
0x0C5D, 0x0C5D,
0x0C60, 0x0C63,
0x0C66, 0x0C6F,
0x0C77, 0x0C7F,
0x1CDA, 0x1CDA,
0x1CF2, 0x1CF2,
},
normalizationFixes = handle_normalization_fixes{
from = {"ఒౌ", "ఒౕ", "ిౕ", "ెౕ", "ొౕ"},
to = {"ఔ", "ఓ", "ీ", "ే", "ో"}
},
}
m["Teng"] = {
"Tengwar",
473725,
}
m["Tfng"] = process_ranges{
"Tifinagh",
208503,
"abjad, alphabet",
ranges = {
0x2D30, 0x2D67,
0x2D6F, 0x2D70,
0x2D7F, 0x2D7F,
},
otherNames = {"Libyco-Berber", "Berber"}, -- per Wikipedia, Libyco-Berber is the parent
}
m["Tglg"] = process_ranges{
"Baybayin",
812124,
"abugida",
aliases = {"Tagalog"},
ranges = {
0x1700, 0x1715,
0x171F, 0x171F,
0x1735, 0x1736,
},
}
m["Thaa"] = process_ranges{
"Thaana",
877906,
"abugida",
ranges = {
0x060C, 0x060C,
0x061B, 0x061C,
0x061F, 0x061F,
0x0660, 0x0669,
0x0780, 0x07B1,
0xFDF2, 0xFDF2,
0xFDFD, 0xFDFD,
},
direction = "rtl",
}
m["Thai"] = process_ranges{
"Thai",
236376,
"abugida",
ranges = {
0x0E01, 0x0E3A,
0x0E40, 0x0E5B,
},
spaces = false,
}
m["Tibt"] = process_ranges{
"Tạng",
46861,
"abugida",
ranges = {
0x0F00, 0x0F47,
0x0F49, 0x0F6C,
0x0F71, 0x0F97,
0x0F99, 0x0FBC,
0x0FBE, 0x0FCC,
0x0FCE, 0x0FD4,
0x0FD9, 0x0FDA,
0x3008, 0x300B,
},
normalizationFixes = handle_normalization_fixes{
combiningClasses = {["༹"] = 1},
from = {"ཷ", "ཹ"},
to = {"ྲཱྀ", "ླཱྀ"}
},
}
m["sit-tam-Tibt"] = {
"Tamyig",
109875213,
m["Tibt"][3],
ranges = m["Tibt"].ranges,
characters = m["Tibt"].characters,
parent = "Tibt",
normalizationFixes = m["Tibt"].normalizationFixes,
}
m["Tirh"] = process_ranges{
"Tirhuta",
1765752,
"abugida",
ranges = {
0x0951, 0x0952,
0x0964, 0x0965,
0x1CF2, 0x1CF2,
0xA830, 0xA839,
0x11480, 0x114C7,
0x114D0, 0x114D9,
},
normalizationFixes = handle_normalization_fixes{
from = {"𑒁𑒰", "𑒋𑒺", "𑒍𑒺", "𑒪𑒵", "𑒪𑒶"},
to = {"𑒂", "𑒌", "𑒎", "𑒉", "𑒊"}
},
}
m["Tnsa"] = process_ranges{
"Tangsa",
105576311,
"alphabet",
ranges = {
0x16A70, 0x16ABE,
0x16AC0, 0x16AC9,
},
}
m["Todr"] = process_ranges{
"Todhri",
10274731,
"alphabet",
direction = "rtl",
ranges = {
0x105C0, 0x105F3,
},
}
m["Tols"] = {
"Tolong Siki",
4459822,
"alphabet",
-- Not in Unicode
}
m["Toto"] = process_ranges{
"Toto",
104837516,
"abugida",
ranges = {
0x1E290, 0x1E2AE,
},
}
m["Tutg"] = process_ranges{
"Tigalari",
2604990,
"abugida",
aliases = {"Tulu"},
ranges = {
0x1CF2, 0x1CF2,
0x1CF4, 0x1CF4,
0xA8F1, 0xA8F1,
0x11380, 0x11389,
0x1138B, 0x1138B,
0x1138E, 0x1138E,
0x11390, 0x113B5,
0x113B7, 0x113C0,
0x113C2, 0x113C2,
0x113C5, 0x113C5,
0x113C7, 0x113CA,
0x113CC, 0x113D5,
0x113D7, 0x113D8,
0x113E1, 0x113E2,
},
}
m["Ugar"] = process_ranges{
"Ugaritic",
332652,
"abjad",
ranges = {
0x10380, 0x1039D,
0x1039F, 0x1039F,
},
}
m["Vaii"] = process_ranges{
"Vai",
523078,
"syllabary",
ranges = {
0xA500, 0xA62B,
},
}
m["Visp"] = {
"Visible Speech",
1303365,
"alphabet",
-- Not in Unicode
}
m["Vith"] = process_ranges{
"Vithkuqi",
3301993,
"alphabet",
ranges = {
0x10570, 0x1057A,
0x1057C, 0x1058A,
0x1058C, 0x10592,
0x10594, 0x10595,
0x10597, 0x105A1,
0x105A3, 0x105B1,
0x105B3, 0x105B9,
0x105BB, 0x105BC,
},
capitalized = true,
}
m["Wara"] = process_ranges{
"Varang Kshiti",
79199,
aliases = {"Warang Citi"},
ranges = {
0x118A0, 0x118F2,
0x118FF, 0x118FF,
},
capitalized = true,
}
m["Wcho"] = process_ranges{
"Wancho",
33713728,
"alphabet",
ranges = {
0x1E2C0, 0x1E2F9,
0x1E2FF, 0x1E2FF,
},
}
m["Wole"] = {
"Woleai",
6643710,
"syllabary",
-- Not in Unicode
}
m["Xpeo"] = process_ranges{
"Old Persian",
1471822,
ranges = {
0x103A0, 0x103C3,
0x103C8, 0x103D5,
},
}
m["Xsux"] = process_ranges{
"hình nêm",
401,
aliases = {"chữ hình nêm Sumer-Akkad"},
ranges = {
0x12000, 0x12399,
0x12400, 0x1246E,
0x12470, 0x12474,
0x12480, 0x12543,
},
}
m["Yezi"] = process_ranges{
"Yezidi",
13175481,
"alphabet",
ranges = {
0x060C, 0x060C,
0x061B, 0x061B,
0x061F, 0x061F,
0x0660, 0x0669,
0x10E80, 0x10EA9,
0x10EAB, 0x10EAD,
0x10EB0, 0x10EB1,
},
direction = "rtl",
}
m["Yiii"] = process_ranges{
"Lô Lô",
1197646,
"syllabary",
ranges = {
0x3001, 0x3002,
0x3008, 0x3011,
0x3014, 0x301B,
0x30FB, 0x30FB,
0xA000, 0xA48C,
0xA490, 0xA4C6,
0xFF61, 0xFF65,
},
}
m["Zanb"] = process_ranges{
"Zanabazar Square",
50809208,
"abugida",
ranges = {
0x11A00, 0x11A47,
},
}
m["Zmth"] = process_ranges{
"mathematical notation",
1140046,
ranges = {
0x00AC, 0x00AC,
0x00B1, 0x00B1,
0x00D7, 0x00D7,
0x00F7, 0x00F7,
0x03D0, 0x03D2,
0x03D5, 0x03D5,
0x03F0, 0x03F1,
0x03F4, 0x03F6,
0x0606, 0x0608,
0x2016, 0x2016,
0x2032, 0x2034,
0x2040, 0x2040,
0x2044, 0x2044,
0x2052, 0x2052,
0x205F, 0x205F,
0x2061, 0x2064,
0x207A, 0x207E,
0x208A, 0x208E,
0x20D0, 0x20DC,
0x20E1, 0x20E1,
0x20E5, 0x20E6,
0x20EB, 0x20EF,
0x2102, 0x2102,
0x2107, 0x2107,
0x210A, 0x2113,
0x2115, 0x2115,
0x2118, 0x211D,
0x2124, 0x2124,
0x2128, 0x2129,
0x212C, 0x212D,
0x212F, 0x2131,
0x2133, 0x2138,
0x213C, 0x2149,
0x214B, 0x214B,
0x2190, 0x21A7,
0x21A9, 0x21AE,
0x21B0, 0x21B1,
0x21B6, 0x21B7,
0x21BC, 0x21DB,
0x21DD, 0x21DD,
0x21E4, 0x21E5,
0x21F4, 0x22FF,
0x2308, 0x230B,
0x2320, 0x2321,
0x237C, 0x237C,
0x239B, 0x23B5,
0x23B7, 0x23B7,
0x23D0, 0x23D0,
0x23DC, 0x23E2,
0x25A0, 0x25A1,
0x25AE, 0x25B7,
0x25BC, 0x25C1,
0x25C6, 0x25C7,
0x25CA, 0x25CB,
0x25CF, 0x25D3,
0x25E2, 0x25E2,
0x25E4, 0x25E4,
0x25E7, 0x25EC,
0x25F8, 0x25FF,
0x2605, 0x2606,
0x2640, 0x2640,
0x2642, 0x2642,
0x2660, 0x2663,
0x266D, 0x266F,
0x27C0, 0x27FF,
0x2900, 0x2AFF,
0x2B30, 0x2B44,
0x2B47, 0x2B4C,
0xFB29, 0xFB29,
0xFE61, 0xFE66,
0xFE68, 0xFE68,
0xFF0B, 0xFF0B,
0xFF1C, 0xFF1E,
0xFF3C, 0xFF3C,
0xFF3E, 0xFF3E,
0xFF5C, 0xFF5C,
0xFF5E, 0xFF5E,
0xFFE2, 0xFFE2,
0xFFE9, 0xFFEC,
0x1D400, 0x1D454,
0x1D456, 0x1D49C,
0x1D49E, 0x1D49F,
0x1D4A2, 0x1D4A2,
0x1D4A5, 0x1D4A6,
0x1D4A9, 0x1D4AC,
0x1D4AE, 0x1D4B9,
0x1D4BB, 0x1D4BB,
0x1D4BD, 0x1D4C3,
0x1D4C5, 0x1D505,
0x1D507, 0x1D50A,
0x1D50D, 0x1D514,
0x1D516, 0x1D51C,
0x1D51E, 0x1D539,
0x1D53B, 0x1D53E,
0x1D540, 0x1D544,
0x1D546, 0x1D546,
0x1D54A, 0x1D550,
0x1D552, 0x1D6A5,
0x1D6A8, 0x1D7CB,
0x1D7CE, 0x1D7FF,
0x1EE00, 0x1EE03,
0x1EE05, 0x1EE1F,
0x1EE21, 0x1EE22,
0x1EE24, 0x1EE24,
0x1EE27, 0x1EE27,
0x1EE29, 0x1EE32,
0x1EE34, 0x1EE37,
0x1EE39, 0x1EE39,
0x1EE3B, 0x1EE3B,
0x1EE42, 0x1EE42,
0x1EE47, 0x1EE47,
0x1EE49, 0x1EE49,
0x1EE4B, 0x1EE4B,
0x1EE4D, 0x1EE4F,
0x1EE51, 0x1EE52,
0x1EE54, 0x1EE54,
0x1EE57, 0x1EE57,
0x1EE59, 0x1EE59,
0x1EE5B, 0x1EE5B,
0x1EE5D, 0x1EE5D,
0x1EE5F, 0x1EE5F,
0x1EE61, 0x1EE62,
0x1EE64, 0x1EE64,
0x1EE67, 0x1EE6A,
0x1EE6C, 0x1EE72,
0x1EE74, 0x1EE77,
0x1EE79, 0x1EE7C,
0x1EE7E, 0x1EE7E,
0x1EE80, 0x1EE89,
0x1EE8B, 0x1EE9B,
0x1EEA1, 0x1EEA3,
0x1EEA5, 0x1EEA9,
0x1EEAB, 0x1EEBB,
0x1EEF0, 0x1EEF1,
},
translit = false,
}
m["Zsym"] = process_ranges{
"symbolic",
80071,
"pictography",
ranges = {
0x20DD, 0x20E0,
0x20E2, 0x20E4,
0x20E7, 0x20EA,
0x20F0, 0x20F0,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
0x2114, 0x2114,
0x2116, 0x2117,
0x211E, 0x2123,
0x2125, 0x2127,
0x212A, 0x212B,
0x212E, 0x212E,
0x2132, 0x2132,
0x2139, 0x213B,
0x214A, 0x214A,
0x214C, 0x214F,
0x21A8, 0x21A8,
0x21AF, 0x21AF,
0x21B2, 0x21B5,
0x21B8, 0x21BB,
0x21DC, 0x21DC,
0x21DE, 0x21E3,
0x21E6, 0x21F3,
0x2300, 0x2307,
0x230C, 0x231F,
0x2322, 0x237B,
0x237D, 0x239A,
0x23B6, 0x23B6,
0x23B8, 0x23CF,
0x23D1, 0x23DB,
0x23E3, 0x23FF,
0x2500, 0x259F,
0x25A2, 0x25AD,
0x25B8, 0x25BB,
0x25C2, 0x25C5,
0x25C8, 0x25C9,
0x25CC, 0x25CE,
0x25D4, 0x25E1,
0x25E3, 0x25E3,
0x25E5, 0x25E6,
0x25ED, 0x25F7,
0x2600, 0x2604,
0x2607, 0x263F,
0x2641, 0x2641,
0x2643, 0x265F,
0x2664, 0x266C,
0x2670, 0x27BF,
0x2B00, 0x2B2F,
0x2B45, 0x2B46,
0x2B4D, 0x2B73,
0x2B76, 0x2B95,
0x2B97, 0x2BFF,
0x4DC0, 0x4DFF,
0x1F000, 0x1F02B,
0x1F030, 0x1F093,
0x1F0A0, 0x1F0AE,
0x1F0B1, 0x1F0BF,
0x1F0C1, 0x1F0CF,
0x1F0D1, 0x1F0F5,
0x1F300, 0x1F6D7,
0x1F6DC, 0x1F6EC,
0x1F6F0, 0x1F6FC,
0x1F700, 0x1F776,
0x1F77B, 0x1F7D9,
0x1F7E0, 0x1F7EB,
0x1F7F0, 0x1F7F0,
0x1F800, 0x1F80B,
0x1F810, 0x1F847,
0x1F850, 0x1F859,
0x1F860, 0x1F887,
0x1F890, 0x1F8AD,
0x1F8B0, 0x1F8B1,
0x1F900, 0x1FA53,
0x1FA60, 0x1FA6D,
0x1FA70, 0x1FA7C,
0x1FA80, 0x1FA88,
0x1FA90, 0x1FABD,
0x1FABF, 0x1FAC5,
0x1FACE, 0x1FADB,
0x1FAE0, 0x1FAE8,
0x1FAF0, 0x1FAF8,
0x1FB00, 0x1FB92,
0x1FB94, 0x1FBCA,
0x1FBF0, 0x1FBF9,
},
translit = false,
character_category = false, -- none
}
m["Zyyy"] = {
"undetermined",
104839687,
-- This should not have any characters listed, probably
translit = false,
character_category = false, -- none
}
m["Zzzz"] = {
"uncoded",
104839675,
-- This should not have any characters listed
translit = false,
character_category = false, -- none
}
-- These should be defined after the scripts they are composed of.
m["Hrkt"] = process_ranges{
"Kana",
187659,
"syllabary",
aliases = {"Japanese syllabaries"},
ranges = union(
m["Hira"].ranges,
m["Kana"].ranges
),
spaces = false,
}
m["Jpan"] = process_ranges{
"Japanese",
190502,
"logography, syllabary",
ranges = union(
m["Hrkt"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
spaces = false,
sort_by_scraping = true,
}
m["Kore"] = process_ranges{
"Korean",
711797,
"logography, syllabary",
ranges = union(
m["Hang"].ranges,
m["Hani"].ranges,
m["Latn"].ranges
),
}
return require("Module:languages").finalizeData(m, "script")
nusub0v5ozfbfh5rp0txx25hbjh4tr5
Mô đun:utilities
828
256188
2561587
2302377
2026-09-08T06:31:49Z
Hiyuune
50834
2561587
Scribunto
text/plain
local export = {}
local headword_data_module = "Module:headword/data"
local languages_module = "Module:languages"
local links_module = "Module:links"
local load_module = "Module:load"
local pages_module = "Module:pages"
local script_utilities_module = "Module:script utilities"
local scripts_module = "Module:scripts"
local string_utilities_module = "Module:string utilities"
local utilities_data_module = "Module:utilities/data"
local mw = mw
local anchor_encode = mw.uri.anchorEncode
local concat = table.concat
local format_categories -- Defined below.
local ipairs = ipairs
local require = require
local type = type
local unstrip = mw.text.unstrip
--[==[
Loaders for functions in other modules, which overwrite themselves with the target function when called. This ensures modules are only loaded when needed, retains the speed/convenience of locally-declared pre-loaded functions, and has no overhead after the first call, since the target functions are called directly in any subsequent calls.]==]
local function decode_entities(...)
decode_entities = require(string_utilities_module).decode_entities
return decode_entities(...)
end
local function get_script(...)
get_script = require(scripts_module).getByCode
return get_script(...)
end
local function is_content_page(...)
is_content_page = require(pages_module).is_content_page
return is_content_page(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function tag_text(...)
tag_text = require(script_utilities_module).tag_text
return tag_text(...)
end
local function trim(...)
trim = require(string_utilities_module).trim
return trim(...)
end
local function uupper(...)
uupper = require(string_utilities_module).upper
return uupper(...)
end
--[==[
Loaders for objects, which load data (or some other object) into some variable, which can then be accessed as "foo or get_foo()", where the function get_foo sets the object to "foo" and then returns it. This ensures they are only loaded when needed, and avoids the need to check for the existence of the object each time, since once "foo" has been set, "get_foo" will not be called again.]==]
local catfix_scripts
local function get_catfix_scripts()
catfix_scripts, get_catfix_scripts = load_data(utilities_data_module).catfix_scripts, nil
return catfix_scripts
end
local current_title
local function get_current_title()
current_title, get_current_title = mw.title.getCurrentTitle(), nil
return current_title
end
local defaultsort
local function get_defaultsort()
defaultsort, get_defaultsort = load_data(headword_data_module).page.pagename_defaultsort, nil
return defaultsort
end
local pagename
local function get_pagename()
pagename, get_pagename = load_data(headword_data_module).page.encoded_pagename, nil
return pagename
end
local und
local function get_und()
und, get_und = require(languages_module).getByCode("und"), nil
return und
end
do
local function handle_url(capture)
return capture:match("https?://[^%s%]]+%s([^%]]+)") or ""
end
--[==[
A helper function to strip wiki markup, giving the plaintext of what is displayed on the page.]==]
function export.get_plaintext(text)
text = text
:gsub("%[%[", "\1")
:gsub("%]%]", "\2")
-- Remove strip markers and HTML tags.
text = unstrip(text):gsub("<[^<>\1\2]+>", "")
-- Parse internal links for the display text, and remove categories.
text = remove_links(text)
-- Remove files.
text = text:gsub("\1[Ff][Ii][Ll][Ee]:[^\1\2]+\2", "")
:gsub("\1[Ii][Mm][Aa][Gg][Ee]:[^\1\2]+\2", "")
-- Parse external links for the display text.
text = text:gsub("%[(https?://[^%[%]]+)%]", handle_url)
-- Any remaining square brackets aren't involved in links, but must be escaped to avoid creating new links.
:gsub("\1", "[[")
:gsub("\2", "]]")
:gsub("%[", "[")
:gsub("]", "]")
-- Strip bold, italics and soft hyphens.
:gsub("('*)'''(.-'*)'''", "%1%2")
:gsub("('*)''(.-'*)''", "%1%2")
:gsub("", "")
-- Get any HTML entities and trim.
-- Note: don't decode URL percent encoding, as it shouldn't be used in display text and may cause problems if % is used.
return trim(decode_entities(text))
end
end
do
local function generate_sortkey(lang, sc, sort_key, sort_base)
-- If the sort key is "-", treat the language as undetermined (the default). This is desirable when categorising (e.g.) translation requests, as the pages to be categorised are always in English/Translingual.
if sort_key == "-" then
lang, sort_key = und or get_und(), nil
elseif not lang then
lang = und or get_und()
end
-- Generate the automatic sort key.
local auto = lang:makeSortKey(sort_base or pagename or get_pagename(), sc)
-- Use the page defaultsort if necessary. Try hard to avoid empty sort key, which causes categories to be
-- displayed as raw text; fall back to pagename if necessary.
if not auto or auto == "" then
auto = defaultsort or get_defaultsort()
end
if not auto or auto == "" then
auto = sort_base
end
if not auto or auto == "" then
auto = pagename or get_pagename()
end
-- If not sort key specified, use the automatic one.
if not sort_key or sort_key == "" then
return auto
-- Otherwise, if the language is not "und", categorize the manual sort key as either redundant or non-redundant.
-- FIXME: we should do this for "und" as well, but "Undetermined terms..." does not make sense for translations etc.
elseif lang:getCode() ~= "und" then
return sort_key, "[[Thể loại:Mục từ có mã sắp xếp " .. (
uupper(sort_key) == auto and "thừa " or
"thủ công không thừa"
) .. " " .. lang:getFullName() .. "|" .. sort_key .. "]]"
end
return sort_key
end
--[==[
Format the categories with the appropriate sort key.
* `cat` can take two forms:
** A string (the full category, minus the {"Category:"} prefix);
** A list of categories. Each category in the list can be either:
*** A string in the same format as above;
*** An object with the fields:
**** `cat`: a string in the same format as above (required);
**** `lang`: an optional language object to override the overall `lang`;
**** `sc`: an optional script object to override the overall `sc`.
**** `sort_key`: an optional sort key to override the overall `sort_key`;
**** `sort_base`: an optional sort base to override the overall `sort_base`;
* `lang` is an object encapsulating a language; if {nil}, the object for language code {"und"} (undetermined) will
be used. `lang` is used when computing the sort key (either from the subpage name or sort base).
* `sort_key` is placed in the category invocation, and indicates how the page will sort in the respective category.
Normally '''do not use this'''. Instead, leave it {nil}, and if you need to a control the sort order, use
{sort_base}, so that language-specific normalization is applied on top of the specified sort base. If neither
{sort_key} nor {sort_base} is specified, the default is to apply language-specific normalization to the subpage
name; see below.
* `sort_base` lets you override the default sort key while still maintaining appropriate language-specific
normalization. If {nil} is specified, this defaults to the subpage name, which is the portion of the full pagename
after subtracting the namespace prefix (and, in certain namespaces such as {User:}, but notably not in the
mainspace, after subtracting anything up through the final slash). The actual sort key is derived from the sort
base approximately by lowercasing, applying language-specific normalization and then uppercasing; note that the
same process is applied in deriving the sort key when no sort base is specified. For example, for French, Spanish,
etc. the normalization process maps accented letters to their unaccented equivalents, so that e.g. in French,
{{m|fr|ça}} sorts after {{m|fr|ca}} (instead of after the default Wikimedia sort order, which is approximately
based on Unicode sort order and places ç after z) and {{m|fr|côté}} sorts after {{m|fr|coté}} (instead of between
c and d). Similarly, in Russian the normalization process converts Cyrillic ё to a string consisting of Cyrillic е
followed by U+10FFFF, so that effectively ё sorts after е instead of the default Wikimedia sort, which (I think)
puts ё after я, the last letter of the Cyrillic alphabet.
* `force_output` forces normal output in all namespaces. Normally, nothing is output if the page isn't in the main,
Appendix:, Thesaurus:, Reconstruction: or Citations: namespaces.
* `sc` is a script object; if nil, the default will be derived from the sort base (or its default value, the
subpage name) by calling {lang:findBestScript()}. The value of `sc` is used during the sort base normalization
process; for example, languages with multiple scripts will often have script-specific normalization processes.]==]
function export.format_categories(cat, lang, sort_key, sort_base, force_output, sc)
if not (
force_output or
is_content_page(current_title or get_current_title()) or
current_title.prefixedText == "Wiktionary:Sandbox"
) then
return ""
elseif type(cat) == "string" then
local this_sort_key, extra = generate_sortkey(lang, sc, sort_key, sort_base)
return "[[Category:" .. cat .. "|" .. this_sort_key .. "]]" .. (extra or "")
end
local ret, i, n, default = {}, 0, 0
-- Iterate over all categories in `cat`.
while true do
i = i + 1
local category = cat[i]
if category == nil then
return concat(ret)
end
local this_sort_key, extra
-- If the category type is a table, use any custom options in it.
if type(category) == "table" then
category, this_sort_key, extra = category.cat, generate_sortkey(
category.lang or lang,
category.sc or sc,
category.sort_key or sort_key,
category.sort_base or sort_base
)
-- If `default` has already been determined, use it.
elseif default then
this_sort_key = default
-- Otherwise, calculate `default` and use it.
else
this_sort_key, extra = generate_sortkey(lang, sc, sort_key, sort_base)
default = this_sort_key
end
n = n + 1
ret[n] = "[[Category:" .. category .. "|" .. this_sort_key .. "]]" .. (extra or "")
end
end
format_categories = export.format_categories
end
--[==[
Add a "catfix", which is used on language-specific category pages to add language attributes and often script
classes to all entry names. The addition of language attributes and script classes makes the entry names display
better (using the language- or script-specific styles specified in [[MediaWiki:Common.css]]), which is particularly
important for non-English languages that do not have consistent font support in browsers.
Language attributes are added for all languages, but script classes are only added for languages with one script
listed in their data file, or for languages that have a default script listed in the {catfix_script} list in
[[Module:utilities/data]]. Some languages clearly have a default script, but still have other scripts listed in
their data file. If those other scripts are not simply scripts like {{cd|Brai}} (Braille), their default script
needs to be specified. Others do not have a default script.
* Serbo-Croatian is regularly written in both the Latin and Cyrillic scripts. Because it uses two scripts,
Serbo-Croatian cannot have a script class applied to entries in its category pages, as only one script class
can be specified at a time.
* German is usually written in the Latin script ({{cd|Latn}}), but Fraktur ({{cd|Latf}}) is also listed in
its data file. So German needs an entry in the {catfix_script} list, so that the {{cd|Latn}} (Latin) script
class will be applied to entries in its category pages.
To find the scripts listed for a language, go to [[Module:languages]] and use the search box to find the data file
for the language. To find out what a script code means, search the script code in [[Module:scripts/data]].]==]
function export.catfix(lang, sc)
if not lang or not lang.getCanonicalName then
error('The first argument to the function "catfix" should be a language object from [[Module:languages]] or [[Module:etymology languages]].')
end
if sc and not sc.getCode then
error('The second argument to the function "catfix" should be a script object from [[Module:scripts]].')
end
-- To add script classes to links on pages created by category boilerplate templates.
if not sc then
local code = (catfix_scripts or get_catfix_scripts())[lang:getCode()] or catfix_scripts[lang:getFullCode()]
if code then
sc = get_script(code)
end
end
-- If the language only has a single valid candidate script, apply it as the default.
if not sc then
local scripts = lang:getScripts()
if #scripts == 1 then
sc = scripts[1]
else
-- Iterate over scripts. If there is only one when ignoring
-- scripts like Brai, then pick that one.
for _, script in ipairs(scripts) do
if script:getCode() ~= "Brai" then
if sc then
-- Multiple candidates - fail.
sc = nil
break
else
sc = script
end
end
end
end
end
-- Hack: using a <ul> tag prevents the parser from automatically generating a <p> tag around the catfix element.
return "<ul class=\"catfix\" data-anchor=\"" ..
anchor_encode(lang:getFullName()) .. "\">" ..
tag_text("", lang, sc) .. "</ul>" ..
format_categories("Trang có sử dụng catfix", nil, nil, nil, true)
end
--[==[
Given a type (as a string) and an arbitrary number of entities, checks whether all of those entities are language,
family, script, writing system or Wikimedia language objects. Useful for error handling in functions that require
one of these kinds of object.
If `noErr` is set, the function returns false instead of throwing an error, which allows customised error handling to
be done in the calling function.]==]
function export.check_object(typ, noErr, ...)
if ... == nil then
if noErr then
return false
end
error("Must provide at least one object to check.", 2)
end
for _, obj in ipairs{...} do
if type(obj) ~= "table" or type(obj.hasType) ~= "function" then
if noErr then
return false
end
error("Function expected a " .. typ .. " object, but received a " .. type(obj) .. " instead.", 2)
elseif not (typ == "object" or obj:hasType(typ)) then
for _, wrong_type in ipairs{"family", "language", "script", "Wikimedia language", "writing system"} do
if obj:hasType(wrong_type) then
if noErr then
return false
end
error("Function expected a " .. typ .. " object, but received a " .. wrong_type .. " object instead.", 2)
end
end
if noErr then
return false
end
error("Function expected a " .. typ .. " object, but received another type of object instead.", 2)
end
end
return true
end
return export
d6u9v2vb4ythcweqkbxwiabmiewbc3n
Mô đun:languages/data/3/u
828
256761
2561467
2527971
2026-09-07T13:53:02Z
Lcsnes
40261
2561467
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["uam"] = {
"Uamué",
3441418,
}
m["uan"] = {
"Kuan",
6441085,
}
m["uar"] = {
"Tairuma",
7676386,
"ngf",
}
m["uba"] = {
"Ubang",
3914467,
"nic-ben",
"Latn",
}
m["ubi"] = {
"Ubi",
56264,
}
m["ubl"] = {
"tiếng Bikol Buhi'non",
18664494,
"phi",
"Latn",
"Tiếng Bikol Buhi'non",
"Bikol Buhi'non",
}
m["ubr"] = {
"Ubir",
3547642,
"poz-ocw",
"Latn",
}
m["ubu"] = {
"Umbu-Ungu",
12953245,
"ngf",
}
m["uby"] = {
"tiếng Ubykh",
36931,
"cau-nwc",
"Cyrl, Latn",
"Tiếng Ubykh",
"Ubykh",
translit = "uby-translit",
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {
Cyrl = s["cau-Cyrl-entryname"],
Latn = s["cau-Latn-entryname"],
},
sort_key = "uby-sortkey",
}
m["uda"] = {
"Uda",
11011951,
"nic-lcr",
}
m["ude"] = {
"tiếng Udihe",
13235,
"tuw-udg",
"Cyrl",
"Tiếng Udihe",
"Udihe",
}
m["udg"] = {
"tiếng Muduga",
16886762,
"dra-imd",
"Mlym",
"Tiếng Muduga",
"Muduga",
translit = "ml-translit",
}
m["udi"] = {
"tiếng Udi",
36867,
"cau-esm",
"Cyrl, Latn, Armn, Geor",
"Tiếng Udi",
"Udi",
ancestors = "xag",
translit = {
Cyrl = "udi-translit",
Armn = "Armn-translit",
Geor = "Geor-translit",
},
override_translit = true,
display_text = {Cyrl = s["cau-Cyrl-displaytext"]},
entry_name = {
Cyrl = s["cau-Cyrl-entryname"],
Latn = s["cau-Latn-entryname"],
},
}
m["udj"] = {
"Ujir",
14916906,
"poz-cet",
}
m["udl"] = {
"Uldeme",
3515078,
"cdc-cbm",
}
m["udm"] = {
"tiếng Udmurt",
13238,
"urj-prm",
"Cyrl",
"Tiếng Udmurt",
"Udmurt",
translit = "udm-translit",
override_translit = true,
sort_key = "udm-sortkey",
}
m["udu"] = {
"tiếng Uduk",
3182573,
"ssa-kom",
"Latn",
"Tiếng Uduk",
"Uduk",
}
m["ues"] = {
"Kioko",
18343036,
}
m["ufi"] = {
"Ufim",
7877531,
"ngf-fin",
"Latn",
}
m["uga"] = {
"tiếng Ugarit",
36928,
"sem-nwe",
"Ugar",
"Tiếng Ugarit",
"Ugarit",
translit = "uga-translit",
}
m["ugb"] = {
"Kuku-Ugbanh",
10549854,
}
m["uge"] = {
"Ughele",
966303,
"poz-ocw",
}
m["ugh"] = {
"tiếng Kubachi",
2445129,
"cau-drg",
"Cyrl",
"Tiếng Kubachi",
"Kubachi",
}
m["ugn"] = {
"Ugandan Sign Language",
7877677,
"sgn",
}
m["ugo"] = {
"tiếng Ugong",
3448919,
"tbq-lob",
"Thai",
"Tiếng Ugong",
"Ugong",
sort_key = "Thai-sortkey",
}
m["ugy"] = {
"Uruguayan Sign Language",
7901470,
"sgn",
}
m["uha"] = {
"Uhami",
3913328,
"alv-nwd",
"Latn",
}
m["uhn"] = {
"Damal",
4748974,
}
m["uis"] = {
"Uisai",
7878123,
"paa-sbo",
}
m["uiv"] = {
"Iyive",
11128658,
"nic-tvc",
"Latn",
}
m["uji"] = {
"Tanjijili",
3914939,
"nic-pls",
}
m["uka"] = {
"Kaburi",
6344482,
}
m["ukg"] = {
"Ukuriguma",
7878623,
"ngf-mad",
}
m["ukh"] = {
"Ukhwejo",
36623,
"bnt-bek",
}
m["uki"] = {
"tiếng Kui (Ấn Độ)",
33919,
"dra-kki",
"Orya",
"Tiếng Kui (Ấn Độ)",
"Kui (Ấn Độ)",
translit = "kxv-translit",
entry_name = {
remove_diacritics = "୕",
from = {"ଆଆ", "ଇଇ", "ଉଉ", "ଏଏ", "ଓଓ", "ିଇ", "ୁଉ", "େଏ", "ୋଓ"},
to = {"ଆ", "ଈ", "ଊ", "ଏ", "ଓ", "ୀ", "ୂ", "େ", "ୋ"},
},
}
m["ukk"] = {
"tiếng Muak Sa-aak",
23807993,
"mkh-pal",
nil,
"Tiếng Muak Sa-aak",
"Muak Sa-aak"
}
m["ukl"] = {
"Ukrainian Sign Language",
10322106,
"sgn",
}
m["ukp"] = {
"Ukpe-Bayobiri",
3914470,
"nic-ben",
"Latn",
}
m["ukq"] = {
"Ukwa",
7878635,
"nic-ief",
}
m["uks"] = {
"Kaapor Sign Language",
3322101,
"sgn",
}
m["uku"] = {
"Ukue",
3913387,
"alv-nwd",
"Latn",
}
m["ukw"] = {
"Ukwuani-Aboh-Ndoni",
36636,
"alv",
"Latn",
}
m["uky"] = {
"Kuuk Yak",
6448719,
"aus-psw",
"Latn",
}
m["ula"] = {
"Fungwa",
5509187,
"nic-shi",
}
m["ulb"] = {
"tiếng Olukumi",
36722,
"alv-yor",
"Latn",
"Tiếng Olukumi",
"Olukumi",
entry_name = {Latn = {remove_diacritics = c.grave .. c.acute .. c.macron}},
sort_key = {
from = {"ch", "ẹ", "gb", "gh", "gw", "kp", "kw", "ọ", "ṣ"},
to = {"c" .. p[1], "e" .. p[1], "g" .. p[1], "g" .. p[2], "g" .. p[3], "k" .. p[1], "k" .. p[2], "o" .. p[1], "s" .. p[1]}
},
}
m["ulc"] = {
"tiếng Ulch",
13239,
"tuw-nan",
"Cyrl, Latn",
"Tiếng Ulch",
"Ulch",
entry_name = {
from = {"['’]"},
to = {"ʼ"}
},
sort_key = "ulc-sortkey",
}
m["ule"] = {
"Lule",
12635889,
nil,
"Latn",
}
m["ulf"] = {
"Afra",
4477735,
"paa-pau",
}
m["uli"] = {
"Ulithian",
36842,
"poz-mic",
}
m["ulk"] = {
"tiếng Meriam",
788174,
"ngf",
"Latn",
"Tiếng Meriam",
"Meriam",
}
m["ull"] = {
"tiếng Ullatan",
8761579,
"dra-mal",
"Mlym",
"Tiếng Ullatan",
"Ullatan",
translit = "ml-translit",
}
m["ulm"] = {
"Ulumanda'",
3501892,
}
m["uln"] = {
"Unserdeutsch",
13244,
"crp",
"Latn",
ancestors = "de",
}
m["ulu"] = {
"Uma' Lung",
3548186,
"poz-swa",
}
m["ulw"] = {
"Ulwa",
2405552,
}
m["uma"] = {
"tiếng Umatilla",
12953952,
"nai-shp",
"Latn",
"Tiếng Umatilla",
"Umatilla",
ancestors = "nai-spt",
}
m["umb"] = {
"tiếng Umbundu",
36983,
"bnt",
"Latn",
"Tiếng Umbundu",
"Umbundu",
}
m["umc"] = {
"tiếng Marrucini",
36110,
"itc-sbl",
"Latn, Ital",
"Tiếng Marrucini",
"Marrucini",
translit = {Ital = "Ital-translit"},
}
m["umd"] = {
"Umbindhamu",
7881346,
"aus-pmn",
}
m["umg"] = {
"Umbuygamu",
3915677,
"aus-pmn",
}
m["umi"] = {
"Ukit",
7878321,
}
m["umm"] = {
"Umon",
3915448,
"nic-ucn",
"Latn",
}
m["umn"] = {
"Makyan Naga",
6740516,
"sit-kch",
}
m["umo"] = {
"Umotína",
7881740,
"sai-mje",
}
m["ump"] = {
"Umpila",
12953954,
"aus-pmn",
"Latn",
}
m["umr"] = {
"Umbugarla",
2980392,
}
m["ums"] = {
"Pendau",
7162371,
"poz-tot",
}
m["umu"] = {
"tiếng Munsee",
56547,
"del",
"Latn",
"Tiếng Munsee",
"Munsee",
entry_name = {remove_diacritics = c.acute .. c.breve},
}
m["una"] = {
"North Watut",
15887898,
"poz-ocw",
"Latn",
}
m["und"] = {
"không xác định ngôn ngữ",
nil,
"qfa-not",
"All",
"Không xác định ngôn ngữ",
"không xác định ngôn ngữ",
}
m["une"] = {
"Uneme",
3913357,
"alv-yek",
"Latn",
}
m["ung"] = {
"tiếng Ngarinyin",
1284885,
"aus-wor",
"Latn",
}
m["uni"] = {
"tiếng Uni",
65043886,
"paa-pio",
"Latn",
}
m["unk"] = {
"Enawené-Nawé",
3307184,
"awd",
"Latn",
}
m["unm"] = {
"tiếng Unami",
3549180,
"del",
"Latn",
"Tiếng Unami",
"Unami",
--[===[Don't strip diacritics from entry names, per [[WT:Grease pit/2020/May]].
entry_name = {remove_diacritics = c.grave .. c.diaer},]===]
}
m["unn"] = {
"Kurnai",
nil,
"aus-pam",
"Latn",
}
m["unr"] = {
"tiếng Mundari",
3327828,
"mun",
"Nagm, Deva, Beng, Orya, Latn",
"Tiếng Mundari",
"Mundari",
translit = {Deva = "hi-translit"}, -- for now
}
m["unu"] = {
"Unubahe",
7897776,
}
m["unx"] = {
"tiếng Munda",
36264959,
"mun",
"Latn, Deva, Beng, Orya",
"Tiếng Munda",
"Munda",
translit = {Deva = "hi-translit"},
}
m["unz"] = {
"Unde Kaili",
12953596,
"poz-kal",
"Latn",
}
m["uok"] = {
"Uokha",
3441216,
"alv-edo",
"Latn",
}
m["uon"] = {
"Kulon",
11182000,
"map",
"Latn",
}
m["upi"] = {
"Umeda",
7881465,
"paa-brd",
}
m["upv"] = {
"tiếng Uripiv-Wala-Rano-Atchin",
13249,
"poz-vnc",
"Latn",
"Tiếng Uripiv-Wala-Rano-Atchin",
"Uripiv-Wala-Rano-Atchin",
}
m["ura"] = {
"Urarina",
1579560,
}
m["urb"] = {
"tiếng Urubú-Kaapor",
13893353,
"tup-gua",
"Latn",
"Tiếng Urubú-Kaapor",
"Urubú-Kaapor",
}
m["urc"] = {
"Urningangg",
10710522,
}
m["ure"] = {
"Uru",
2992892,
}
m["urf"] = {
"Uradhi",
3915680,
"aus-pam",
"Latn",
}
m["urg"] = {
"Urigina",
7900603,
"ngf",
"Latn",
}
m["urh"] = {
"Urhobo",
36663,
"alv-swd",
"Latn",
}
m["uri"] = {
"Urim",
7900609,
"qfa-tor",
"Latn",
}
m["urk"] = {
"tiếng Urak Lawoi'",
7899573,
"poz-mly",
"Thai",
"Tiếng Urak Lawoi'",
"Urak Lawoi'",
sort_key = "Thai-sortkey",
}
m["url"] = {
"tiếng Urali",
7899602,
"dra-kod",
"Knda",
"Tiếng Urali",
"Urali",
translit = {Knda = "kn-translit"},
}
m["urm"] = {
"Urapmin",
7899769,
"ngf-okk",
}
m["urn"] = {
"Uruangnirin",
7901389,
"poz-cet",
"Latn",
}
m["uro"] = {
"Ura (New Guinea)",
3121049,
"paa-bng",
"Latn",
}
m["urp"] = {
"Uru-Pa-In",
7901376,
"tup-gua",
"Latn",
}
m["urr"] = {
"Lehalurup",
3272124,
}
m["urt"] = {
"Urat",
3502084,
"qfa-tor",
"Latn",
}
m["uru"] = {
"Urumi",
7901530,
"tup",
"Latn",
}
m["urv"] = {
"Uruava",
36875,
"poz-ocw",
"Latn",
}
m["urw"] = {
"Sop",
7562808,
"ngf-mad",
"Latn",
}
m["urx"] = {
"Urimo",
7900611,
"qfa-tor",
"Latn",
}
m["ury"] = {
"Orya",
7105295,
"paa-tkw",
"Latn",
}
m["urz"] = {
"Uru-Eu-Wau-Wau",
10266012,
"tup-gua",
"Latn",
}
m["usa"] = {
"Usarufa",
7901714,
"paa-kag",
"Latn",
}
m["ush"] = {
"tiếng Ushojo",
3540446,
"inc-shn",
"ur-Arab",
"Tiếng Ushojo",
"Ushojo",
}
m["usi"] = {
"tiếng Usui",
12644231,
"tbq-bdg",
"Beng, Latn",
"Tiếng Usui",
"Usui",
}
m["usk"] = {
"Usaghade",
3914048,
"nic-lcr",
"Latn",
}
m["usp"] = {
"Uspanteco",
36728,
"myn",
"Latn",
}
m["uss"] = {
"Saare",
nil,
"nic-knn",
"Latn",
}
m["usu"] = {
"Uya",
7904082,
}
m["uta"] = {
"Otank",
3913990,
"nic-tvc",
"Latn",
}
m["ute"] = {
"tiếng Ute",
13260,
"azc-num",
"Latn",
"Tiếng Ute",
"Ute",
}
m["uth"] = {
"tiếng Ut-Hun",
63313668,
"nic-knn",
"Latn",
"Tiếng Ut-Hun",
"Ut-Hun",
}
m["utp"] = {
"Aba",
2841465,
"poz-oce",
"Latn",
}
m["utr"] = {
"Etulo",
35262,
"alv-ido",
"Latn",
}
m["utu"] = {
"Utu",
7903469,
"ngf-mad",
}
m["uum"] = {
"tiếng Urum",
13257,
"trk-kcu",
"Cyrl",
translit = "uum-translit",
}
m["uun"] = {
"tiếng Kulon-Pazeh",
36435,
"map",
"Latn",
"Tiếng Kulon-Pazeh",
"Kulon-Pazeh",
}
m["uur"] = {
"Ura (Vanuatu)",
7899531,
"poz-oce",
"Latn",
}
m["uuu"] = {
"tiếng U",
953082,
"mkh-pal",
nil,
"Tiếng U",
"U",
}
m["uve"] = {
"West Uvean",
36837,
"poz-pnp",
"Latn",
}
m["uvh"] = {
"Uri",
7900540,
"ngf-fin",
"Latn",
}
m["uvl"] = {
"Lote",
3259972,
"poz-ocw",
"Latn",
}
m["uwa"] = {
"Kuku-Uwanh",
3915687,
"aus-pmn",
}
m["uya"] = {
"Doko-Uyanga",
7904095,
"nic-ucr",
"Latn",
}
m["uzs"] = {
"tiếng Nam Uzbek",
"1066787",
nil,
"Arab",
"Tiếng Nam Uzbek",
"Nam Uzbek",
ancestors = "trk-pro",
translit_module = "uzs-translit"
}
return require("Module:languages").finalizeData(m, "language")
bkx7da7cvunqmfz3gxe9j4ywpx33n01
Mô đun:zh-pron
828
264652
2561584
2350460
2026-09-08T06:16:45Z
Hiyuune
50834
2561584
Scribunto
text/plain
local m_str_utils = require("Module:string utilities")
local codepoint = m_str_utils.codepoint
local concat = table.concat
local explode_chars = require("Module:Hani").explode_chars
local find = m_str_utils.find
local format = string.format
local gmatch = m_str_utils.gmatch
local gsub = m_str_utils.gsub
local insert = table.insert
local ipairs = ipairs
local match = m_str_utils.match
local pairs = pairs
local split = m_str_utils.split
local gsplit = m_str_utils.gsplit
local export = {}
local hanzi = require("Module:scripts").getByCode("Hani"):getCharacters()
local bopomofo = require("Module:scripts").getByCode("Bopo"):getCharacters()
local langname = {
["cdo"] = "tiếng Mân Đông",
["cjy"] = "tiếng Tấn",
["cpx"] = "tiếng Phủ Tiên",
["cmn"] = "tiếng Quan Thoại",
["csp"] = "Southern Pinghua",
["dng"] = "tiếng Đông Can",
["gan"] = "tiếng Cám",
["hak"] = "tiếng Khách Gia",
["hsn"] = "tiếng Tương",
["hsn-lou"] = "tiếng Tương",
["hsn-hya"] = "tiếng Tương",
["nan-luh"] = "Leizhou Min",
["mnp"] = "tiếng Mân Bắc",
["nan-hbl"] = "tiếng Mân Tuyền Chương",
["nan-tws"] = "tiếng Triều Châu",
["wuu"] = "tiếng Ngô",
["wuu-jih"] = "tiếng Ngô",
["yue"] = "tiếng Quảng Đông",
["zhx-sic"] = "tiếng Tứ Xuyên",
["zhx-tai"] = "tiếng Đài Sơn",
}
local langname_abbr = {
["m"] = "tiếng Quan Thoại",
["m-s"] = "tiếng Tứ Xuyên",
["m-x"] = "tiếng Quan Thoại",
["m-nj"] = "tiếng Quan Thoại",
["dg"] = "tiếng Đông Can",
["c"] = "tiếng Quảng Đông",
["c-dg"] = "tiếng Quảng Đông",
["c-t"] = "tiếng Đài Sơn",
["c-yj"] = "tiếng Quảng Đông",
["g"] = "tiếng Cám",
["h"] = "tiếng Khách Gia",
["j"] = "tiếng Tấn",
["mb"] = "tiếng Mân Bắc",
["mc"] = "tiếng Hán trung cổ",
["md"] = "tiếng Mân Đông",
["mn"] = "tiếng Mân Tuyền Chương",
["mn-t"] = "tiếng Triều Châu",
["mn-l"] = "Leizhou Min",
["oc"] = "tiếng Hán thượng cổ",
["px"] = "Puxian Min",
["sp"] = "Southern Pinghua",
["w"] = "tiếng Ngô",
["w-j"] = "tiếng Ngô",
["x"] = "tiếng Tương",
["x-l"] = "Loudi Xiang",
["x-h"] = "Hengyang Xiang",
}
local pos_aliases_cat = {
["n"] = "Danh từ", ["noun"] = "Danh từ",
["pn"] = "Danh từ riêng", ["propn"] = "Danh từ riêng", ["proper"] = "Danh từ riêng", ["proper noun"] = "Danh từ riêng",
["place"] = "Địa danh",
["pron"] = "Đại từ", ["pronoun"] = "Đại từ",
["v"] = "Động từ", ["verb"] = "Động từ",
["a"] = "Tính từ", ["adj"] = "Tính từ", ["adjective"] = "Tính từ",
["adv"] = "Phó từ", ["adverb"] = "Phó từ",
["prep"] = "Giới từ", ["pre"] = "Giới từ",
["postp"] = "Hậu giới từ", ["post"] = "Hậu giới từ",
["con"] = "Liên từ", ["conj"] = "Liên từ", ["conjunction"] = "Liên từ",
["part"] = "Trợ từ", ["particle"] = "Trợ từ",
["pref"] = "Tiền tố", ["prefix"] = "Tiền tố",
["suf"] = "Hậu tố", ["suffix"] = "Hậu tố",
["infix"] = "Trung tố",
["prov"] = "Tục ngữ", ["proverb"] = "Tục ngữ",
["id"] = "Thành ngữ", ["idiom"] = "Thành ngữ",
["ch"] = "Thành ngữ truyền thống", ["cy"] = "Thành ngữ truyền thống", ["4ci"] = "Thành ngữ truyền thống",
["ph"] = "Cụm từ", ["phrase"] = "Cụm từ",
["int"] = "Thán từ", ["intj"] = "Thán từ", ["interj"] = "Thán từ", ["interjection"] = "Thán từ",
["cl"] = "Loại từ", ["cls"] = "Loại từ", ["classifier"] = "Loại từ",
["num"] = "Số", ["numeral"] = "Số",
["abb"] = "Từ viết tắt", ["abbreviation"] = "Từ viết tắt",
["det"] = "Từ hạn định", ["deter"] = "Từ hạn định", ["determiner"] = "Từ hạn định",
["syl"] = "Âm tiết", ["syllable"] = "Âm tiết",
}
local function make_note(text)
if find(text, ": ") then
text = "\n*" .. gsub(gsub(text, "\n", ".\n*"), "([:;]) ", "%1\n**")
elseif find(text, "; ") then
text = "\n*" .. gsub(text, "; ", ";\n*")
end
text = gsub(text, "“([^”]+)”", function (a) return "“" .. gsub(a, ";\n%*+", "; ") .. "”" end)
-- fix bug about indentation levels (see https://en.wiktionary.org/w/index.php?oldid=78848651)
local last_level = ("\n"..text):match("\n(%**)[^*\n][^\n]*$")
local append = last_level:gsub("%*","<ul>")
return "\n<div style=\"border: 1px solid var(--wikt-palette-forestgreen, #235923); padding: 4px; margin: 8px; background: var(--wikt-palette-lightyellow, #ffffe0);color:inherit; font-size: 85%\">'''Ghi chú''': " .. text .. ".</div>" .. append
end
local function ipa_format(text)
local numbers = { ["1"]="¹",["2"]="²",["3"]="³",["4"]="⁴",["5"]="⁵",["0"]="⁰",["-"]="⁻",["/"]="/, /" }
return gsub(text,"[0-5%-/]",numbers)
end
local function Consolas(text)
return '<span class="zhpron-monospace">' .. text .. "</span>"
end
local function format_IPA(text)
return '<span class="IPA">' .. text .. "</span>"
end
function export.make(frame)
local parent_args = frame:getParent().args
local params = {
pagename = {},
namespace = {},
dial = {},
mc = {},
oc = {},
cat = {},
only_cat = {type = "boolean"},
poj_form_zh_see = {type = "boolean"},
}
for abbr, _ in pairs(langname_abbr) do
params[abbr] = {}
params[abbr .. "a"] = {list = true}
params[abbr .. "_note"] = {}
end
local args = require("Module:parameters").process(parent_args, params, nil, "zh-pron", "make")
local title = mw.title.getCurrentTitle()
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local sortkey = (require("Module:Hani-sortkey").makeSortKey(pagename))
local is_single_hanzi = find(pagename, "^[" .. hanzi .. "]$") ~= nil
local namespace = args.namespace or mw.title.getCurrentTitle().nsText
local m_rom = args["m"]
local m_s_rom = args["m-s"]
local m_x_rom = args["m-x"]
local m_nj_rom = args["m-nj"]
local dg_rom = args["dg"]
local c_rom = args["c"]
local c_dg_rom = args["c-dg"]
local c_t_rom = args["c-t"]
local c_yj_rom = args["c-yj"]
local g_rom = args["g"]
local h_rom = args["h"]
local j_rom = args["j"]
local mb_rom = args["mb"]
local md_rom = args["md"]
local mn_rom = args["mn"]
local mn_l_rom = args["mn-l"]
local mn_t_rom = args["mn-t"]
local px_rom = args["px"]
local sp_rom = args["sp"]
local w_rom = args["w"]
local w_j_rom = args["w-j"]
local x_rom = args["x"]
local x_l_rom = args["x-l"]
local x_h_rom = args["x-h"]
local m_audio = args["ma"]
local m_s_audio = args["m-sa"]
local m_x_audio = args["m-xa"]
local m_nj_audio = args["m-nja"]
local dg_audio = args["dga"]
local c_audio = args["ca"]
local c_dg_audio = args["c-dga"]
local c_t_audio = args["c-ta"]
local c_yj_audio = args["c-yja"]
local g_audio = args["ga"]
local h_audio = args["ha"]
local j_audio = args["ja"]
local mb_audio = args["mba"]
local md_audio = args["mda"]
local mn_audio = args["mna"]
local mn_l_audio = args["mn-la"]
local mn_t_audio = args["mn-ta"]
local px_audio = args["pxa"]
local sp_audio = args["spa"]
local w_audio = args["wa"]
local w_j_audio = args["w-ja"]
local x_audio = args["xa"]
local x_l_audio = args["x-la"]
local x_h_audio = args["x-ha"]
local dial = args["dial"]
local mc = args["mc"]
local oc = args["oc"]
local only_cat = args["only_cat"]
-- True if arguments exist for the specified variety, using a language param abbreviation.
local function has_var(var)
return args[var] or #args[var .. "a"] > 0
end
local function add_audio(text, audios, lang, show)
-- This function has side effects
for _, audio in ipairs(audios) do
if audio == "y" then audio = format("%s-%s.ogg", lang, pagename) end
insert(text, "\n*" .. (show and "::" or "**") .. " [[Tập tin:")
insert(text, audio)
insert(text, "]]")
end
if #audios > 0 then
insert(text, "[[Thể loại:Mục từ có liên kết âm thanh ")
insert(text, langname[lang])
insert(text, "|" .. sortkey .. "]]")
end
end
local function add_audio_show(text, audios, lang)
add_audio(text, audios, lang, "show")
end
local text = {} --the pronunciation table
if not only_cat then
--The whole table consists of 4 parts
--"textShow" contains Part 1, 3 and 4
local textShow = {'<div class="standard-box zhpron" style="overflow:auto; max-width:500px; font-size:100%">'}
--"textHide" is Part 2
local textHide = {}
local function show(txt)
insert(textShow, txt)
end
local function hide(txt)
insert(textHide, txt)
end
local function hide_note(var)
local note = args[var .. "_note"]
if note then hide(make_note(note)) end
end
show('<div class="vsSwitcher" data-toggle-category="cách phát âm">')
--Part 1 and 2, "Pronunciation" and "Pronunciation expressed in different romanizations"
if m_rom or m_s_rom or m_x_rom or m_nj_rom or dg_rom then
show("\n* [[w:Quan thoại|Quan thoại]]")
end
if has_var("m") then
local m_args = {}
local m_pron = require("Module:cmn-pron")
if m_rom then
local str_analysis = m_pron.str_analysis
local other_m_vars = has_var("m-s") or has_var("m-x") or has_var("m-nj") or has_var("dg")
show("\n" .. str_analysis(m_rom, "head", other_m_vars))
m_args[1] = str_analysis(m_rom, "")
for i = 2, 5 do
m_args[i] = str_analysis(m_rom, tostring(i))
end
local m_args_params_prefixed_with_1 = {"n", "na", "nb", "nc", "nd"}
for _, base in ipairs(m_args_params_prefixed_with_1) do
for i = 1, 5 do
local param = tostring(i) .. base
m_args[param] = str_analysis(m_rom, param)
end
end
local m_args_params = {"py", "cap", "tl", "tl2", "tl3", "a", "audio", "er", "ertl", "ertl2", "ertl3",
"era", "eraudio"}
for _, base in ipairs(m_args_params) do
m_args[base] = str_analysis(m_rom, base)
for i = 2, 5 do
local param = tostring(i) .. base
m_args[param] = str_analysis(m_rom, param)
end
end
end
for i, audio in ipairs(m_audio) do
local ind = i == 1 and "" or tostring(i)
m_args[ind .. "a"] = audio
end
show(m_pron.make_audio(m_args))
hide(m_pron.make_args(m_args))
hide_note("m")
end
if (not m_rom) and (m_s_rom or m_x_rom or m_nj_rom or dg_rom) then
hide("\n* [[w:Quan thoại|Quan thoại]]")
end
if has_var("m-s") then
local m_s_pron = require("Module:zhx-sic-pron")
-- ȵ [[Wiktionary talk:Chinese entry guidelines/Sichuanese#"ny"]]
local m_s_processed = gsub(m_s_rom:gsub("/", " / "), "([%d-])([%a])", "%1 %2")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
if m_s_rom then
show("\n*: <small>(<i>[[w:Phương ngữ Tứ Xuyên|Thành Đô]], [[w:Bính âm tiếng Tứ Xuyên|SP]]</i>)</small>: ")
show(Consolas(m_s_processed))
end
add_audio_show(textShow, m_s_audio, "zhx-sic")
hide("\n** <small>(<i>[[w:Thành Đô|Thành Đô]]</i>)</small>")
hide("\n*** <small><i>[[w:Bính âm tiếng Tứ Xuyên|Bính âm tiếng Tứ Xuyên]]</i></small>: ")
hide(Consolas(m_s_processed))
local xinwenz = m_s_pron.convert(m_s_rom, "SWZ")
if xinwenz then
hide("\n*** <small><i>[[w:zh:四川话拉丁化新文字|Scuanxua Ladinxua Xin Wenz]]</i></small>: ")
hide(Consolas(m_s_pron.convert(m_s_rom, "SWZ")))
end
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học<sup>([[w:zh:成都话|ghi chú]])</sup></small>: ")
hide(format_IPA(m_s_pron.convert(m_s_rom, "IPA")))
hide_note("m-s")
end
if has_var("m-x") then
local m_x_pron = require("Module:cmn-pron-Xian")
local m_x_display, m_x_hidden, m_x_ipa = m_x_pron.py_process(m_x_rom)
show("\n*: <small>(<i>[[w:en:Guanzhong dialect|Tây An]], [[Wiktionary:Tiếng Trung Quốc/Tây An|Bính âm Quan Trung]]</i>)</small>: ")
show(Consolas(m_x_display))
add_audio_show(textShow, m_x_audio, "cmn")
hide("\n** <small>(<i>[[w:Tây An|Tây An]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tây An|Bính âm Quan Trung]]</i></small>: ")
hide(Consolas(m_x_hidden))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:en:Guanzhong dialect|ghi chú]])</sup></small>: ")
hide(format_IPA(m_x_ipa))
hide_note("m-x")
end
if has_var("m-nj") then
local m_nj_pron = require("Module:cmn-pron-Nanjing")
local m_nj_display, m_nj_hidden, m_nj_num, m_nj_ipa = m_nj_pron.py_process(m_nj_rom)
show("\n*: <small>(<i>[[w:Nanjing dialect|Nanjing]], [[Wiktionary:Tiếng Trung Quốc/Nanjing|Nanjing Pinyin]]</i>)</small>: ")
show(Consolas(m_nj_display))
add_audio_show(textShow, m_nj_audio, "cmn")
hide("\n** <small>(<i>[[w:Nanjing|Nanjing]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Nanjing|Nanjing Pinyin]]</i></small>: ")
hide(Consolas(m_nj_hidden))
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Nanjing|Nanjing Pinyin]] (numbered)</i></small>: ")
hide(Consolas(m_nj_num))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Nanjing dialect|ghi chú]])</sup></small>: ")
hide(format_IPA(m_nj_ipa))
hide_note("m-nj")
end
if has_var("dg") then
local dg_pron = require("Module:dng-pron")
local dg_processed = dg_pron.process(dg_rom)
if dg_rom then
show("\n*: <small>(<i>[[w:Tiếng Đông Can|Đông Can]], [[w:Bảng chữ cái tiếng Đông Can|Chữ Kirin]] và [[Wiktionary:Bảng chuyển tự tiếng Đông Can|Wiktionary]]</i>)</small>: ")
show(Consolas(dg_processed))
end
add_audio_show(textShow, dg_audio, "dng")
hide("\n** <small>(<i>[[w:Tiếng Đông Can|Đông Can]]</i>)</small>")
hide("\n*** <small><i>[[w:Bảng chữ cái tiếng Đông Can|Chữ Kirin]] và [[Wiktionary:Bảng chuyển tự tiếng Đông Can|Wiktionary]]</i></small>: ")
hide(Consolas(dg_processed))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Âm vị học tiếng Đông Can|ghi chú]])</sup></small>: ")
hide(format_IPA(dg_pron.convert(dg_rom, "IPA")) .. "\n**: <small>(Lưu ý: Cách phát âm trong tiếng Đông Can hiện đang được thử nghiệm và có thể không chính xác.)</small>")
hide_note("dg")
end
if has_var("c") or has_var("c-dg") or has_var("c-t") or has_var("c-yj") then
if c_rom or c_dg_rom or c_t_rom or c_yj_rom then
local c_count = (c_rom and 1 or 0) + (c_dg_rom and 1 or 0)
+ (c_t_rom and 1 or 0) + (c_yj_rom and 1 or 0)
local c_sep = (c_count == 1) and " " or "\n*: "
show("\n* [[w:Tiếng Quảng Đông|Quảng Đông]]")
hide("\n* [[w:Tiếng Quảng Đông|Quảng Đông]]")
if c_rom then
local c_pron = require("Module:yue-pron")
show(c_sep)
show("<small>(<i>")
if c_count > 1 then
show("[[w:Tiếng Quảng Châu|Quảng Châu]]–[[w:Tiếng Quảng Châu Hồng Kông|Hồng Kông]], ")
end
show("[[w:Việt bính|Việt bính]]</i>)</small>: ")
show(Consolas(c_pron.show_standard(c_rom, is_single_hanzi)))
add_audio_show(textShow, c_audio, "yue")
hide(c_pron.hide_standard(c_rom, is_single_hanzi))
if not args["c_note"] and is_single_hanzi and (c_rom:find("^[ao]") or c_rom:find(",[ao]")) then
args["c_note"] = "The zero initial " .. format_IPA("/∅-/") .. " is commonly pronounced with a ''ng''-initial " .. format_IPA("/ŋ-/") .. " in some varieties of Cantonese, including Hong Kong Cantonese"
end
hide_note("c")
end
if c_dg_rom then
local c_dg_pron = require("Module:yue-pron/Dongguan")
local c_dg_display = c_dg_rom:gsub(","," / ")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show(c_sep .. "<small>(<i>[[w:zh:東莞話|Dongguan]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Dongguan|Jyutping++]]</i>)</small>: ")
show(Consolas(c_dg_display))
add_audio_show(textShow, c_dg_audio, "yue")
hide("\n** <small>(<i>[[w:zh:東莞話|Dongguan]], [[w:Guancheng Subdistrict|Guancheng]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Dongguan|Jyutping++]]</i></small>: ")
hide(Consolas(c_dg_display))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:zh:東莞話|ghi chú]])</sup></small>: ")
hide(format_IPA(c_dg_pron.jpp_to_ipa(c_dg_rom)))
hide_note("c-dg")
end
if c_t_rom then
local c_t_pron = require("Module:yue-pron/Taishanese")
local c_t_display = c_t_rom:gsub(","," / ")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show(c_sep .. "<small>(<i>[[w:Tiếng Đài Sơn|Đài Sơn]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Tiếng Đài Sơn|Wiktionary]]</i>)</small>: ")
show(Consolas(c_t_display))
add_audio_show(textShow, c_t_audio, "zhx-tai")
hide("\n** <small>(<i>[[w:Tiếng Đài Sơn|Tiếng Đài Sơn]], [[w:Taicheng Subdistrict|Taicheng]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Tiếng Đài Sơn|Wiktionary]]</i></small>: ")
hide(Consolas(c_t_display))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Tiếng Đài Sơn|ghi chú]])</sup></small>: ")
hide(format_IPA(c_t_pron.hoisanva_to_ipa(c_t_rom)))
hide_note("c-t")
end
if c_yj_rom then
local c_yj_pron = require("Module:yue-pron/Yangjiang")
local c_yj_display = c_yj_rom:gsub(","," / ")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show(c_sep .. "<small>(<i>[[w:zh:陽江話|Yangjiang]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Yangjiang|Jyutping++]]</i>)</small>: ")
show(Consolas(c_yj_display))
add_audio_show(textShow, c_yj_audio, "yue")
hide("\n** <small>(<i>[[w:zh:陽江話|Yangjiang Yue]], [[w:Jiangcheng, Yangjiang|Jiangcheng]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Yangjiang|Jyutping++]]</i></small>: ")
hide(Consolas(c_yj_display))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Gao–Yang Yue|ghi chú]])</sup></small>: ")
hide(format_IPA(c_yj_pron.jpp_to_ipa(c_yj_rom)))
hide_note("c-yj")
end
end
end
if has_var("g") then
local g_pron = require("Module:gan-pron")
if g_rom then
show("\n* [[w:w:Tiếng Cám|Cám]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Cám|Wiktionary]]</i>)</small>: ")
show(Consolas(g_pron.rom(g_rom)))
end
add_audio_show(textShow, g_audio, "gan")
hide("\n* [[w:Tiếng Cám|Cám]]")
hide("\n** <small>(<i>[[w:Phương ngữ Nam Xương|Nam Xương]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Cám|Wiktionary]]</i></small>: ")
hide(Consolas(g_pron.rom(g_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Nam Xương|Nam Xương|ghi chú]])</sup></small>: ")
hide(format_IPA("/" .. g_pron.ipa(g_rom) .. "/"))
hide_note("g")
end
if h_rom and (find(h_rom, "pfs=.") or find(h_rom, "gd=.")) or #h_audio > 0 then
local h_pron = require("Module:hak-pron")
if find(h_rom, "pfs=.") or find(h_rom, "gd=.") then
show("\n* [[w:Tiếng Khách Gia|Khách Gia]]")
show(h_pron.rom_display(h_rom,"yes"))
end
add_audio_show(textShow, h_audio, "hak")
hide("\n* [[Wiktionary:Tiếng Trung Quốc/Tiếng Khách Gia|Khách Gia]]")
if h_rom then hide(h_pron.rom_display(h_rom,"")) end
hide_note("h")
end
if has_var("j") then
local j_pron = require("Module:cjy-pron")
if j_rom then
show("\n* [[w:Tiếng Tấn|Tấn]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tấn|Wiktionary]]</i>)</small>: ")
show(Consolas(j_pron.rom(j_rom)))
end
add_audio_show(textShow, j_audio, "cjy")
hide("\n* [[w:Tiếng Tấn|Tấn]]")
hide("\n** <small>(<i>[[w:Thái Nguyên, Sơn Tây|Thái Nguyên]]</i>)<sup>[[:w:zh:太原話|+]]</sup></small>")
if j_rom then
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tấn|Wiktionary]]</i></small>: ")
hide(Consolas(j_pron.rom(j_rom)))
end
local no_sandhi = false
local roms = split(j_rom, "/")
for i = 1, #roms do
if find(roms[i], " [^ ]+ ") then
no_sandhi = true
break
end
end
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học (<i>old-style" .. (no_sandhi and ", no sandhi" or "") .. "</i>)</small>: ")
hide(format_IPA("/" .. j_pron.ipa(j_rom, no_sandhi and "no_sandhi" or "") .. "/"))
hide_note("j")
end
if has_var("mb") then
local mb_pron = require("Module:mnp-pron")
if mb_rom then
show("\n* [[w:Tiếng Mân Bắc|Mân Bắc]] <small>(<i>[[w:La Mã hóa phương ngữ Kiến Ninh|KCR]]</i>)</small>: ")
show(Consolas(mb_pron.rom(mb_rom)))
end
add_audio_show(textShow, mb_audio, "mnp")
hide("\n* [[w:Tiếng Mân Bắc|Mân Bắc]]")
hide("\n** <small>(<i>[[w:Phương ngữ Kiến Âu|Kiến Âu]]</i>)</small>")
if mb_rom then
hide("\n*** <small><i>[[w:La Mã hóa phương ngữ Kiến Ninh|La Mã hóa phương ngữ Kiến Ninh]]</i></small>: ")
hide(Consolas(mb_pron.rom(mb_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Kiến Âu|ghi chú]])</sup></small>: ")
hide(format_IPA(mb_pron.ipa(mb_rom)))
end
hide_note("mb")
end
if has_var("md") then
local md_pron = require("Module:cdo-pron")
if md_rom then
show("\n* [[w:Mân Đông|Mân Đông]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Mân Đông|BUC]]</i>)</small>: ")
show(Consolas(md_pron.rom(md_rom)))
end
add_audio_show(textShow, md_audio, "cdo")
hide("\n* [[w:w:Mân Đông|Mân Đông]]")
hide("\n** <small>(<i>[[w:Phương ngữ Phúc Châu|Phúc Châu]]</i>)</small>")
if md_rom then
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Mân Đông|Bàng-uâ-cê]]</i></small>: ")
hide(Consolas(md_pron.rom(md_rom)))
if not (md_rom and find(md_rom, "([^/]*)-([^/]*)-([^/]*)-([^/]*)-([^/]*)")) then
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Phúc Châu|ghi chú]])</sup></small>: ")
hide(format_IPA("/" .. md_pron.ipa(md_rom) .. "/"))
else
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Phúc Châu|ghi chú]])</sup> (<i>no sandhi</i>)</small>: ")
hide(format_IPA("/" .. md_pron.ipa(md_rom, "no_sandhi") .. "/"))
end
end
hide_note("md")
end
if has_var("px") then
local px_pron = require("Module:cpx-pron")
show("\n* [[w:Puxian Min|Puxian Min]]")
show(px_pron.rom_display(px_rom,"brief"))
add_audio_show(textShow, px_audio, "cpx")
hide("\n* [[Wiktionary:About Chinese/Puxian Min|Puxian Min]]")
if px_rom then hide(px_pron.rom_display(px_rom,"complete")) end
hide_note("px")
end
if has_var("mn") or has_var("mn-l") or has_var("mn-t") then
local mn_pron, mn_l_pron
if has_var("mn") or has_var("mn-t") then
mn_pron = require("Module:nan-pron")
end
if has_var("mn-l") then
mn_l_pron = require("Module:luh-pron")
end
if mn_rom or mn_t_rom or mn_l_rom then
show("\n* [[w:Tiếng Mân Nam|Mân Nam]]")
if mn_rom then
show(((mn_l_rom or mn_t_rom) and "\n*:" or "") .. " <small>(<i>[[w:Tiếng Mân Tuyền Chương|Mân Tuyền Chương]], [[w:Phiên âm Bạch thoại|POJ]]</i>)</small>: ")
show(Consolas(mn_pron.poj_display(mn_pron.poj_check_invalid(mn_rom))))
add_audio_show(textShow, mn_audio, "nan-hbl")
end
if mn_t_rom then
show(((mn_rom or mn_l_rom) and "\n*:" or "") .. " <small>(<i>[[w:Tiếng Triều Châu|Triều Châu]], [[w:Peng'im|Peng'im]]</i>)</small>: ")
show(Consolas(mn_pron.pengim_display(mn_t_rom)))
add_audio_show(textShow, mn_t_audio, "nan-tws")
end
if mn_l_rom then
show(((mn_rom or mn_t_rom) and "\n*:" or "") .. " <small>(<i>[[w:Leizhou Min|Leizhou]], Leizhou Pinyin</i>)</small>: ")
show(Consolas(mn_l_pron.rom(mn_l_rom)))
add_audio_show(textShow, mn_l_audio, "luh")
end
end
hide("\n* [[w:Tiếng Mân Nam|Mân Nam]]")
if has_var("mn") then
hide(mn_pron.generate_all(mn_rom))
hide_note("mn")
end
if has_var("mn-t") then
hide("\n** <small>(<i>[[w:Tiếng Triều Châu|Triều Châu]]</i>)</small>")
hide("\n*** <small><i>[[w:Peng'im|Peng'im]]</i></small>: ")
hide(Consolas(mn_pron.pengim_display(mn_t_rom)))
hide("\n*** <small><i>[[w:Phiên âm Bạch thoại|Phiên âm Bạch thoại]]-like</i></small>: ")
hide(Consolas(mn_pron.pengim_to_pojlike_conv(mn_t_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:zh:潮州話#語音|ghi chú]])</sup></small>: ")
hide(format_IPA(mn_pron.pengim_to_ipa_conv(mn_t_rom)))
hide_note("mn-t")
end
if has_var("mn-l") then
hide("\n** <small>(<i>[[w:Leizhou Min|Leizhou]]</i>)</small>")
hide("\n*** <small><i>Leizhou Pinyin</i></small>: ")
hide(Consolas(mn_l_pron.rom(mn_l_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học</small>: ")
hide(format_IPA(mn_l_pron.ipa(mn_l_rom)))
hide_note("mn-l")
end
end
if has_var("sp") then
local sp_pron = require("Module:csp-pron")
local sp_processed = sp_rom:gsub(",([^ ])",", %1")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show("\n* [[w:Pinghua|Southern Pinghua]] <small>(<i>[[w:Pinghua|Nanning]], [[Wiktionary:Tiếng Trung Quốc/Southern Pinghua|Jyutping++]]</i>)</small>: ")
show(Consolas(sp_processed))
add_audio_show(textShow, sp_audio, "csp")
hide("\n* [[w:Pinghua|Southern Pinghua]]")
hide("\n** <small>(<i>[[w:Pinghua|Nanning Pinghua]], [[w:Nanning|Tingzi]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Southern Pinghua|Jyutping++]]</i></small>: ")
hide(Consolas(sp_processed))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Pinghua#Phonology|ghi chú]])</sup></small>: ")
hide(format_IPA(sp_pron.jpp_to_ipa(sp_rom)))
hide_note("sp")
end
if has_var("w") or has_var("w-j") then
local w_count = (w_rom and 1 or 0) + (w_j_rom and 1 or 0)
local w_show, w_hide, w_j_show, w_j_hide
if w_rom then
w_show, w_hide = require("Module:wuu-pron").make(w_rom, w_count)
end
if w_j_rom then
w_j_show, w_j_hide = require("Module:wuu-pron/Jinhua").make(w_j_rom, w_count)
end
if w_count > 1 then
show("\n* [[w:Tiếng Ngô|Ngô]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Ngô|Wugniu]]</i>)</small>")
else
show("\n* [[w:Tiếng Ngô|Ngô]]")
end
show(w_show)
show(w_j_show)
add_audio_show(textShow, w_audio, "wuu")
hide("\n* [[w:Tiếng Ngô|Ngô]]")
hide(w_hide)
hide(w_j_hide)
-- add_audio(textHide, w_audio, "wuu")
hide_note("w")
hide_note("w-j")
end
if has_var("x") or has_var("x-l") or has_var("x-h") then
local x_pron = has_var("x") and require("Module:hsn-pron") or nil
local x_l_pron = has_var("x-l") and require("Module:hsn-pron-Loudi") or nil
local x_h_pron = has_var("x-h") and require("Module:hsn-pron-Hengyang") or nil
if x_rom or x_l_rom or x_h_rom then
show("\n* [[w:Tiếng Tương|Tương]]")
if x_rom then
show(((x_l_rom or x_h_rom) and "\n*:" or "") .. " <small>(<i>[[w:Phương ngữ Trường Sa|Trường Sa]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Tương|Wiktionary]]</i>)</small>: ")
show(Consolas(x_pron.rom(x_rom)))
add_audio_show(textShow, x_audio, "hsn")
end
if x_l_rom then
show(((x_rom or x_h_rom) and "\n*:" or "") .. " <small>(<i>[[w:zh:娄底话|Loudi]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Loudi|Wiktionary]]</i>)</small>: ")
show(Consolas(x_l_pron.rom(x_l_rom)))
add_audio_show(textShow, x_l_audio, "hsn-lou")
end
if x_h_rom then
show(((x_rom or x_l_rom) and "\n*:" or "") .. " <small>(<i>[[w:Hengyang dialect|Hengyang]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Hengyang|Wiktionary]]</i>)</small>: ")
show(Consolas(x_h_pron.rom(x_h_rom)))
add_audio_show(textShow, x_h_audio, "hsn-hya")
end
end
hide("\n* [[w:Tiếng Tương|Tương]]")
if x_rom then
local x_diff = x_pron.stylediff(x_rom)
hide("\n** <small>(<i>[[w:Phương ngữ Trường Sa|Trường Sa]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tương|Wiktionary]]</i></small>: ")
hide(Consolas(x_pron.rom(x_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Trường Sa|ghi chú]])</sup>")
hide(x_diff and " (<i>old-style</i>)" or "")
hide("</small>: ")
hide(format_IPA("/" .. x_pron.ipa(x_rom) .. "/"))
if x_diff then
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Trường Sa|ghi chú]])</sup> (<i>new-style</i>)</small>: ")
hide(format_IPA("/" .. x_pron.ipa(x_rom, "new") .. "/"))
end
hide_note("x")
end
if x_l_rom then
hide("\n** <small>(<i>[[w:zh:娄底话|Loudi]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Loudi|Wiktionary]]</i></small>: ")
hide(Consolas(x_l_pron.rom(x_l_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:zh:娄底话|ghi chú]])</sup>")
hide("</small>: ")
hide(format_IPA("/" .. x_l_pron.ipa(x_l_rom) .. "/"))
hide_note("x-l")
end
if x_h_rom then
hide("\n** <small>(<i>[[w:Hengyang dialect|Hengyang]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Hengyang|Wiktionary]]</i></small>: ")
hide(Consolas(x_h_pron.rom(x_h_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Hengyang dialect|ghi chú]])</sup>")
hide("</small>: ")
hide(format_IPA("/" .. x_h_pron.ipa(x_h_rom) .. "/"))
hide_note("x-h")
end
end
-- combine textShow and textHide into text
text = {
concat(textShow),
'<span class="vsToggleElement" style="float: right;"></span>\n<div class="vsHide" style="clear:right;">\n<hr>\n',
concat(textHide),
"</div></div>"
}
--Part 3 "Dialectal data"
if dial ~= "n" and is_single_hanzi then
local success, m_dial = pcall(mw.loadData, "Module:zh/data/dial-pron/" .. pagename)
if success then
local dialPron = {}
local temporary = {}
if dial and find(dial, "^[0-9\\,]+$") then
for element in gsplit(dial, ",") do
insert(dialPron, m_dial[tonumber(element)])
end
else
for _, element in ipairs(m_dial) do
insert(dialPron, element)
end
end
for _, set in ipairs(dialPron) do
for _, object in ipairs(set[2]) do
insert(temporary, object)
end
end
insert(text,
'\n<hr style="clear:right;">\n<div class="vsSwitcher" data-toggle-category="pronunciations" style="background-color:var(--wikt-palette-palergreen, #F8FFFA);color:inherit">\n* ' ..
'Dữ liệu phương ngữ' ..
'<span class="vsToggleElement" style="float:right; padding:0 0"></span>\n' ..
'<div class="vsHide">'
)
insert(text, '\n{| class="wikitable" ' ..
'" style="width:100%; margin:0; ' ..
'text-align:center; border-collapse: collapse; border-style: hidden; display: table;"')
local locStart = "\n|-\n!"
local readingStart = concat({'\n!style="background:var(--wikt-palette-indigo-3, #e0defa);color:inherit; width:9em"|',
'<div style="float: right; clear: right; font-size:60%"><span class="plainlinks">[', tostring(mw.uri.fullUrl("Module:zh/data/dial-pron/" .. pagename, {["action"]="edit"})), ' edit]</span></div><span lang="zh" class="Hani">'})
local locEnd = '<span class="IPA">'
local headclr = 'style="background:#E8ECFA;color:inherit"|'
local mclr = 'style="background:#FAF5F0;color:inherit"|'
local jclr = 'style="background:#FAF5F0;color:inherit"|'
local wclr = 'style="background:#F4F0FA;color:inherit"|'
local huclr = 'style="background:#FAF9F0;color:inherit"|'
local xclr = 'style="background:#F0F2FA;color:inherit"|'
local gclr = 'style="background:#F0FAF3;color:inherit"|'
local haclr = 'style="background:#FAF0F6;color:inherit"|'
local cclr = 'style="background:#F0F5FA;color:inherit"|'
local minclr = 'style="background:#F7FAF0;color:inherit"|'
local clrList = {
mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr,
mclr, mclr, mclr, mclr, mclr, mclr, mclr, jclr, jclr, jclr,
wclr, wclr, wclr, wclr, huclr, huclr, xclr, xclr, gclr, haclr,
haclr, cclr, cclr, cclr, minclr, minclr, minclr, minclr, minclr
}
local locList = {
concat({headclr, "Biến thể ngôn ngữ\n!", headclr, "Tiếng địa phương"}),
concat({"rowspan=17 ", mclr, "Quan thoại\n!", mclr, "[[w:Tiếng Bắc Kinh|Bắc Kinh]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Cáp Nhĩ Tân|Cáp Nhĩ Tân]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Thiên Tân|Thiên Tân]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Tế Nam|Tế Nam]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Thanh Đảo|Thanh Đảo]]\n|", mclr}),
concat({mclr, "[[w:zh:鄭州話|Trịnh Châu]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Tây An|Tây An]]\n|", mclr}),
concat({mclr, "[[w:Tây Ninh, Thanh Hải|Tây Ninh]]\n|", mclr}),
concat({mclr, "[[w:Ngân Xuyên|Ngân Xuyên]]\n|", mclr}),
concat({mclr, "[[w:zh:蘭州話|Lan Châu]]\n|", mclr}),
concat({mclr, "[[w:zh:烏魯木齊話|Ürümqi]]\n|", mclr}),
concat({mclr, "[[w:zh:武漢話|Vũ Hán]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Thành Đô|Thành Đô]]\n|", mclr}),
concat({mclr, "[[w:zh:貴陽話|Quý Dương]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Côn Minh|Côn Minh]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Nam Kinh|Nam Kinh]]\n|", mclr}),
concat({mclr, "[[w:zh:合肥話|Hợp Phì]]\n|", mclr}),
concat({"rowspan=3 ", jclr, "Tiếng Tấn\n!", jclr, "[[w:zh:太原話|Thái Nguyên]]\n|", jclr}),
concat({jclr, "[[w:Bình Dao|Bình Dao]]\n|", jclr}),
concat({jclr, "[[w:Phương ngữ Hohhot|Hohhot]]\n|", jclr}),
concat({"rowspan=4 ", wclr, "Tiếng Ngô\n!", wclr, "[[w:Tiếng Thượng Hải|Thượng Hải]]\n|", wclr}),
concat({wclr, "[[w:Phương ngữ Tô Châu|Tô Châu]]\n|", wclr}),
concat({wclr, "[[w:Phương ngữ Hàng Châu|Hàng Châu]]\n|" , wclr}),
concat({wclr, "[[w:Tiếng Ôn Châu|Ôn Châu]]\n|", wclr}),
concat({"rowspan=2 ", huclr, "Tiếng Hồi\n!", huclr, "[[w:Shexian|Shexian]]\n|", huclr}),
concat({huclr, "[[w:zh:屯溪話|Đồn Khê]]\n|", huclr}),
concat({"rowspan=2 ", xclr, "Tiếng Tương\n!", xclr, "[[w:Phương ngữ Trường Sa|Trường Sa]]\n|", xclr}),
concat({xclr, "[[w:zh:湘潭話|Tương Đàm]]\n|", xclr}),
concat({gclr, "Tiếng Cám\n!", gclr, "[[w:Phương ngữ Nam Xương|Nam Xương]]\n|", gclr}),
concat({"rowspan=2 ", haclr, "Tiếng Khách Gia\n!", haclr, "[[w::Phương ngữ Mai Huyện|Mai Huyện]]\n|", haclr}),
concat({haclr, "[[w:Đào Viên|Đào Viên]]\n|", haclr}),
concat({"rowspan=3 ", cclr, "Tiếng Quảng Đông\n!", cclr, "[[w:Tiếng Quảng Châu|Quảng Châu]]\n|", cclr}),
concat({cclr, "[[w:Nam Ninh|Nam Ninh]]\n|", cclr}),
concat({cclr, "[[w:Tiếng Quảng Châu Hồng Kông|Hồng Kông]]\n|", cclr}),
concat({"rowspan=5 ", minclr, "Tiếng Mân\n!", minclr, "[[w:Phương ngữ Hạ Môn|Hạ Môn]] (Mân Tuyền Chương)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Phúc Châu|Phúc Châu]] (Mân Đông)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Kiến Âu|Kiến Âu]] (Mân Bắc)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Sán Đầu|Sán Đầu]] (Triều Châu)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Hải Khẩu|Hải Khẩu]] (Hải Nam)\n|", minclr})}
local function ipa_correct(ipa, location)
if location == 22 then return (gsub(ipa, "13", "23")) else return ipa end
end
local function fmtDial(text, location)
local fmttedPron = {}
if text == "" then return "" end
for pronunciation in gsplit(text, "|") do
local ipa = match(pronunciation, "^[^%(%)" .. hanzi .. "~,]+")
ipa = gsub(ipa, "([ptk])([0-5])", "%1̚%2")
local environ = match(pronunciation, "[%(%)" .. hanzi .. "~,]*$") or false
insert(fmttedPron, "<span class=\"IPA\"><small>/" ..
tostring(ipa_format(ipa_correct(ipa, location))) .. "/</small></span>" .. (environ
and " <span class=\"Hani\" lang=\"zh\"><small>"..environ.."</small></span>" or nil))
end
return concat(fmttedPron, "<br>")
end
for locationNo = 1, 40 do
for readingNo = 1, #dialPron do
if readingNo == 1 then
insert(text, locStart)
insert(text, locList[locationNo])
end
if locationNo == 1 then
local situation = dialPron[readingNo][1]
insert(text, readingStart)
insert(text, pagename)
insert(text, (pagename ~= situation and " (" ..
gsub(situation, pagename, "<b>" .. pagename .. "</b>") .. ")" or ""))
insert(text, "</span>")
else
insert(text, (readingNo == 1 and "" or "\n|" .. clrList[locationNo-1]))
insert(text, locEnd)
insert(text, fmtDial(dialPron[readingNo][2][locationNo-1], locationNo))
insert(text, "</span>")
end
end
end
insert(text, "\n|}</div></div>")
end
end
--Part 4 "Middle Chinese & Old Chinese"
local mc_preview, oc_preview
local m_ltc_pron, m_och_pron
-- !!!
-- The following function modifies the tables generated by mod:ltc-pron and mod:och-pron, shifting them
-- from using "mw-collapsible" to using "vsSwitcher", because the former
-- can not collapse on the mobile site and makes Chinese entries a mess.
-- It is supposed to be a temporary solution.
-- !!!
local function shiftCustomtoggle2Vsswitcher(s)
local result
result = (s:gsub(
'\n%* <div title="expand" class="mw%-customtoggle[^>]+">',
'\n<div class="vsSwitcher" data-toggle-category="pronunciations">\n* '
):gsub(
'<span style="float:right; border:1px solid var%(%-%-wikt%-palette%-lightgrey,#ccc%); border%-radius:1px; padding:0 0; font%-size:90%%">▼</span>(.-)</div>\n{| class="wikitable',
'<span class="vsToggleElement" style="float:right; padding:0 0"></span>%1\n<div class="vsHide">\n{| class="wikitable'
):gsub(
'{| class="wikitable mw%-collapsible mw%-collapsed" id="[^"]+"',
'{| class="wikitable"'
):gsub(
"\n|}$",
"\n|}</div></div>"
))
return result
end
if mc then
m_ltc_pron = require("Module:ltc-pron")
mc_preview = m_ltc_pron.retrieve_pron(pagename, false, mc, true)
if not mc_preview then
require("Module:debug/track")("zh-pron/Middle Chinese data not found")
mc = nil
end
end
if oc then
m_och_pron = require("Module:och-pron")
oc_preview = m_och_pron.generate_show(pagename, oc)
if not oc_preview then
require("Module:debug/track")("zh-pron/Old Chinese data not found")
oc = nil
end
end
if mc or oc then
insert(text, '\n<hr style="clear:right;">\n<div style="background-color:var(--wikt-palette-lighterblue, #ebf4ff); color:inherit; margin: 0 -5px -5px; padding: 0 5px 5px;">')
if mc then
insert(text, shiftCustomtoggle2Vsswitcher(m_ltc_pron.ipa(mc, mc_preview)))
end
if oc then
insert(text, shiftCustomtoggle2Vsswitcher(m_och_pron.ipa(oc, oc_preview)))
end
insert(text, "</div>")
end
insert(text, "</div>")
if namespace == "" or namespace == "-" then
if mc then
if is_single_hanzi then
if mc_preview:find("k̚$") then
insert(text, "[[Thể loại:Middle Chinese -k characters|" .. sortkey .. "]]")
elseif mc_preview:find("t̚$") then
insert(text, "[[Thể loại:Middle Chinese -t characters|" .. sortkey .. "]]")
elseif mc_preview:find("p̚$") then
insert(text, "[[Thể loại:Middle Chinese -p characters|" .. sortkey .. "]]")
end
end
end
if not args["cat"] then
insert(text, "[[Thể loại:Cách sử dụng zh-pron thiếu POS]]")
end
end
end
local conv_text = {} --categories
if namespace == "" or namespace == "-" then
local catText = args["cat"] or ""
local cat_start = "[[Thể loại:"
local cat_end = "]]"
if w_rom then
w_rom = gsub(w_rom, "%d", "")
end
local function add_cat(cat_table, name, cat)
insert(cat_table, cat_start .. name .. cat .. "|" .. sortkey .. cat_end)
end
local cats = split(catText, ",", true)
for i = 1, #cats do
if pos_aliases_cat[cats[i]] == "Thành ngữ truyền thống" then
insert(cats, i, "Thành ngữ")
break
end
end
insert(cats, 1, "Mục từ")
if is_single_hanzi then
insert(cats, 2, "Hán tự")
end
for i = 1, #cats do
local cat = cats[i]
if cat == "" then break end
cat = gsub(cat, "^ +", "")
if find(cat, ":") then
local cat_split = split(cat, ":", true)
local lang_name = langname_abbr[cat_split[1]]
local category = pos_aliases_cat[cat_split[2]] or cat
add_cat(conv_text, category, " tiếng Trung Quốc")
insert(conv_text, cat_start .. category .. " " .. lang_name .. "|" .. sortkey .. cat_end)
else
cat = pos_aliases_cat[cat] or cat
add_cat(conv_text, cat, " tiếng Trung Quốc")
if m_rom or m_x_rom or m_nj_rom then add_cat(conv_text, cat, " tiếng Quan Thoại") end
if has_var("m-s") then add_cat(conv_text, cat, " tiếng Tứ Xuyên") end
if has_var("dg") then add_cat(conv_text, cat, " tiếng Đông Can") end
if c_rom or c_dg_rom or c_yj_rom then add_cat(conv_text, cat, " tiếng Quảng Đông") end
if c_t_rom then add_cat(conv_text, cat, " tiếng Đài Sơn") end
if has_var("g") then add_cat(conv_text, cat, " tiếng Cám") end
if h_rom and (find(h_rom, "pfs=.") or find(h_rom, "gd=.")) or #h_audio > 0 then
add_cat(conv_text, cat, " tiếng Khách Gia")
end
if has_var("j") then add_cat(conv_text, cat, " tiếng Tấn") end
if has_var("mb") then add_cat(conv_text, cat, " tiếng Mân Bắc") end
if has_var("md") then add_cat(conv_text, cat, " tiếng Mân Đông") end
if has_var("mn") then add_cat(conv_text, cat, " tiếng Mân Tuyền Chương") end
if has_var("mn-t") then add_cat(conv_text, cat, " tiếng Triều Châu") end
if has_var("mn-l") then add_cat(conv_text, "Leizhou Min ", cat) end
if has_var("sp") then add_cat(conv_text, "tiếng Nam Bình ", cat) end
if has_var("w") then add_cat(conv_text, cat, " tiếng Ngô") end
if has_var("w-j") then add_cat(conv_text, cat, " tiếng Ngô") end
if has_var("x") then add_cat(conv_text, cat, " tiếng Tương") end
if has_var("x-l") then add_cat(conv_text, cat, " tiếng Tương") end
if has_var("x-h") then add_cat(conv_text, cat, " tiếng Tương") end
if mc and has_var("mc") then
add_cat(conv_text, cat, " tiếng Hán trung cổ")
end
if oc and has_var("oc") then
add_cat(conv_text, cat, " tiếng Hán thượng cổ")
end
end
end
if not args.only_cat then
insert(conv_text, cat_start .. "Mục từ có cách phát âm IPA tiếng Trung Quốc|" .. sortkey .. cat_end)
end
if not args.poj_form_zh_see then
if not find(pagename, "[" .. hanzi .. bopomofo .. "]") then
insert(conv_text, cat_start .. "Chinese terms written in foreign scripts|" .. sortkey .. cat_end)
end
-- TODO: handle Zhuyin.
-- Note: this parses any IDS to pick out the full character.
for _, character in ipairs(explode_chars(pagename)) do
if match(character, "[" .. hanzi .. "%%%+%-·×々〻𖿣⿰-]") then
insert(conv_text, cat_start .. "Từ đánh vần với " .. character .. " tiếng Trung Quốc|" .. sortkey .. cat_end)
end
end
end
end
local output = concat(text) .. concat(conv_text)
if namespace ~= "" and namespace ~= "-" then
output = gsub(output, "%[%[Thể loại:[^%]]+%]%]", "")
end
return output
end
return export
cromdsy0b868aq8gpyijf6hkz1t424u
2561586
2561584
2026-09-08T06:24:20Z
Hiyuune
50834
2561586
Scribunto
text/plain
local m_str_utils = require("Module:string utilities")
local codepoint = m_str_utils.codepoint
local concat = table.concat
local explode_chars = require("Module:Hani").explode_chars
local find = m_str_utils.find
local format = string.format
local gmatch = m_str_utils.gmatch
local gsub = m_str_utils.gsub
local insert = table.insert
local ipairs = ipairs
local match = m_str_utils.match
local pairs = pairs
local split = m_str_utils.split
local gsplit = m_str_utils.gsplit
local export = {}
local hanzi = require("Module:scripts").getByCode("Hani"):getCharacters()
local bopomofo = require("Module:scripts").getByCode("Bopo"):getCharacters()
local langname = {
["cdo"] = "tiếng Mân Đông",
["cjy"] = "tiếng Tấn",
["cpx"] = "tiếng Phủ Tiên",
["cmn"] = "tiếng Quan Thoại",
["csp"] = "Southern Pinghua",
["dng"] = "tiếng Đông Can",
["gan"] = "tiếng Cám",
["hak"] = "tiếng Khách Gia",
["hsn"] = "tiếng Tương",
["hsn-lou"] = "tiếng Tương",
["hsn-hya"] = "tiếng Tương",
["nan-luh"] = "Leizhou Min",
["mnp"] = "tiếng Mân Bắc",
["nan-hbl"] = "tiếng Mân Tuyền Chương",
["nan-tws"] = "tiếng Triều Châu",
["wuu"] = "tiếng Ngô",
["wuu-jih"] = "tiếng Ngô",
["yue"] = "tiếng Quảng Đông",
["zhx-sic"] = "tiếng Tứ Xuyên",
["zhx-tai"] = "tiếng Đài Sơn",
}
local langname_abbr = {
["m"] = "tiếng Quan Thoại",
["m-s"] = "tiếng Tứ Xuyên",
["m-x"] = "tiếng Quan Thoại",
["m-nj"] = "tiếng Quan Thoại",
["dg"] = "tiếng Đông Can",
["c"] = "tiếng Quảng Đông",
["c-dg"] = "tiếng Quảng Đông",
["c-t"] = "tiếng Đài Sơn",
["c-yj"] = "tiếng Quảng Đông",
["g"] = "tiếng Cám",
["h"] = "tiếng Khách Gia",
["j"] = "tiếng Tấn",
["mb"] = "tiếng Mân Bắc",
["mc"] = "tiếng Hán trung cổ",
["md"] = "tiếng Mân Đông",
["mn"] = "tiếng Mân Tuyền Chương",
["mn-t"] = "tiếng Triều Châu",
["mn-l"] = "Leizhou Min",
["oc"] = "tiếng Hán thượng cổ",
["px"] = "Puxian Min",
["sp"] = "Southern Pinghua",
["w"] = "tiếng Ngô",
["w-j"] = "tiếng Ngô",
["x"] = "tiếng Tương",
["x-l"] = "Loudi Xiang",
["x-h"] = "Hengyang Xiang",
}
local pos_aliases_cat = {
["n"] = "Danh từ", ["noun"] = "Danh từ",
["pn"] = "Danh từ riêng", ["propn"] = "Danh từ riêng", ["proper"] = "Danh từ riêng", ["proper noun"] = "Danh từ riêng",
["place"] = "Địa danh",
["pron"] = "Đại từ", ["pronoun"] = "Đại từ",
["v"] = "Động từ", ["verb"] = "Động từ",
["a"] = "Tính từ", ["adj"] = "Tính từ", ["adjective"] = "Tính từ",
["adv"] = "Phó từ", ["adverb"] = "Phó từ",
["prep"] = "Giới từ", ["pre"] = "Giới từ",
["postp"] = "Hậu giới từ", ["post"] = "Hậu giới từ",
["con"] = "Liên từ", ["conj"] = "Liên từ", ["conjunction"] = "Liên từ",
["part"] = "Trợ từ", ["particle"] = "Trợ từ",
["pref"] = "Tiền tố", ["prefix"] = "Tiền tố",
["suf"] = "Hậu tố", ["suffix"] = "Hậu tố",
["infix"] = "Trung tố",
["prov"] = "Tục ngữ", ["proverb"] = "Tục ngữ",
["id"] = "Thành ngữ", ["idiom"] = "Thành ngữ",
["ch"] = "Thành ngữ truyền thống", ["cy"] = "Thành ngữ truyền thống", ["4ci"] = "Thành ngữ truyền thống",
["ph"] = "Cụm từ", ["phrase"] = "Cụm từ",
["int"] = "Thán từ", ["intj"] = "Thán từ", ["interj"] = "Thán từ", ["interjection"] = "Thán từ",
["cl"] = "Loại từ", ["cls"] = "Loại từ", ["classifier"] = "Loại từ",
["num"] = "Số", ["numeral"] = "Số",
["abb"] = "Từ viết tắt", ["abbreviation"] = "Từ viết tắt",
["det"] = "Từ hạn định", ["deter"] = "Từ hạn định", ["determiner"] = "Từ hạn định",
["syl"] = "Âm tiết", ["syllable"] = "Âm tiết",
}
local function make_note(text)
if find(text, ": ") then
text = "\n*" .. gsub(gsub(text, "\n", ".\n*"), "([:;]) ", "%1\n**")
elseif find(text, "; ") then
text = "\n*" .. gsub(text, "; ", ";\n*")
end
text = gsub(text, "“([^”]+)”", function (a) return "“" .. gsub(a, ";\n%*+", "; ") .. "”" end)
-- fix bug about indentation levels (see https://en.wiktionary.org/w/index.php?oldid=78848651)
local last_level = ("\n"..text):match("\n(%**)[^*\n][^\n]*$")
local append = last_level:gsub("%*","<ul>")
return "\n<div style=\"border: 1px solid var(--wikt-palette-forestgreen, #235923); padding: 4px; margin: 8px; background: var(--wikt-palette-lightyellow, #ffffe0);color:inherit; font-size: 85%\">'''Ghi chú''': " .. text .. ".</div>" .. append
end
local function ipa_format(text)
local numbers = { ["1"]="¹",["2"]="²",["3"]="³",["4"]="⁴",["5"]="⁵",["0"]="⁰",["-"]="⁻",["/"]="/, /" }
return gsub(text,"[0-5%-/]",numbers)
end
local function Consolas(text)
return '<span class="zhpron-monospace">' .. text .. "</span>"
end
local function format_IPA(text)
return '<span class="IPA">' .. text .. "</span>"
end
function export.make(frame)
local parent_args = frame:getParent().args
local params = {
pagename = {},
namespace = {},
dial = {},
mc = {},
oc = {},
cat = {},
only_cat = {type = "boolean"},
poj_form_zh_see = {type = "boolean"},
}
for abbr, _ in pairs(langname_abbr) do
params[abbr] = {}
params[abbr .. "a"] = {list = true}
params[abbr .. "_note"] = {}
end
local args = require("Module:parameters").process(parent_args, params, nil, "zh-pron", "make")
local pagename = args.pagename or mw.loadData("Module:headword/data").pagename
local sortkey = (require("Module:Hani-sortkey").makeSortKey(pagename))
local is_single_hanzi = find(pagename, "^[" .. hanzi .. "]$") ~= nil
local namespace = args.namespace or mw.title.getCurrentTitle().nsText
local m_rom = args["m"]
local m_s_rom = args["m-s"]
local m_x_rom = args["m-x"]
local m_nj_rom = args["m-nj"]
local dg_rom = args["dg"]
local c_rom = args["c"]
local c_dg_rom = args["c-dg"]
local c_t_rom = args["c-t"]
local c_yj_rom = args["c-yj"]
local g_rom = args["g"]
local h_rom = args["h"]
local j_rom = args["j"]
local mb_rom = args["mb"]
local md_rom = args["md"]
local mn_rom = args["mn"]
local mn_l_rom = args["mn-l"]
local mn_t_rom = args["mn-t"]
local px_rom = args["px"]
local sp_rom = args["sp"]
local w_rom = args["w"]
local w_j_rom = args["w-j"]
local x_rom = args["x"]
local x_l_rom = args["x-l"]
local x_h_rom = args["x-h"]
local m_audio = args["ma"]
local m_s_audio = args["m-sa"]
local m_x_audio = args["m-xa"]
local m_nj_audio = args["m-nja"]
local dg_audio = args["dga"]
local c_audio = args["ca"]
local c_dg_audio = args["c-dga"]
local c_t_audio = args["c-ta"]
local c_yj_audio = args["c-yja"]
local g_audio = args["ga"]
local h_audio = args["ha"]
local j_audio = args["ja"]
local mb_audio = args["mba"]
local md_audio = args["mda"]
local mn_audio = args["mna"]
local mn_l_audio = args["mn-la"]
local mn_t_audio = args["mn-ta"]
local px_audio = args["pxa"]
local sp_audio = args["spa"]
local w_audio = args["wa"]
local w_j_audio = args["w-ja"]
local x_audio = args["xa"]
local x_l_audio = args["x-la"]
local x_h_audio = args["x-ha"]
local dial = args["dial"]
local mc = args["mc"]
local oc = args["oc"]
local only_cat = args["only_cat"]
-- True if arguments exist for the specified variety, using a language param abbreviation.
local function has_var(var)
return args[var] or #args[var .. "a"] > 0
end
local function add_audio(text, audios, lang, show)
-- This function has side effects
for _, audio in ipairs(audios) do
if audio == "y" then audio = format("%s-%s.ogg", lang, pagename) end
insert(text, "\n*" .. (show and "::" or "**") .. " [[Tập tin:")
insert(text, audio)
insert(text, "]]")
end
if #audios > 0 then
insert(text, "[[Thể loại:Mục từ có liên kết âm thanh ")
insert(text, langname[lang])
insert(text, "|" .. sortkey .. "]]")
end
end
local function add_audio_show(text, audios, lang)
add_audio(text, audios, lang, "show")
end
local text = {} --the pronunciation table
if not only_cat then
--The whole table consists of 4 parts
--"textShow" contains Part 1, 3 and 4
local textShow = {'<div class="standard-box zhpron" style="overflow:auto; max-width:500px; font-size:100%">'}
--"textHide" is Part 2
local textHide = {}
local function show(txt)
insert(textShow, txt)
end
local function hide(txt)
insert(textHide, txt)
end
local function hide_note(var)
local note = args[var .. "_note"]
if note then hide(make_note(note)) end
end
show('<div class="vsSwitcher" data-toggle-category="cách phát âm">')
--Part 1 and 2, "Pronunciation" and "Pronunciation expressed in different romanizations"
if m_rom or m_s_rom or m_x_rom or m_nj_rom or dg_rom then
show("\n* [[w:Quan thoại|Quan thoại]]")
end
if has_var("m") then
local m_args = {}
local m_pron = require("Module:cmn-pron")
if m_rom then
local str_analysis = m_pron.str_analysis
local other_m_vars = has_var("m-s") or has_var("m-x") or has_var("m-nj") or has_var("dg")
show("\n" .. str_analysis(m_rom, "head", other_m_vars))
m_args[1] = str_analysis(m_rom, "")
for i = 2, 5 do
m_args[i] = str_analysis(m_rom, tostring(i))
end
local m_args_params_prefixed_with_1 = {"n", "na", "nb", "nc", "nd"}
for _, base in ipairs(m_args_params_prefixed_with_1) do
for i = 1, 5 do
local param = tostring(i) .. base
m_args[param] = str_analysis(m_rom, param)
end
end
local m_args_params = {"py", "cap", "tl", "tl2", "tl3", "a", "audio", "er", "ertl", "ertl2", "ertl3",
"era", "eraudio"}
for _, base in ipairs(m_args_params) do
m_args[base] = str_analysis(m_rom, base)
for i = 2, 5 do
local param = tostring(i) .. base
m_args[param] = str_analysis(m_rom, param)
end
end
end
for i, audio in ipairs(m_audio) do
local ind = i == 1 and "" or tostring(i)
m_args[ind .. "a"] = audio
end
show(m_pron.make_audio(m_args))
hide(m_pron.make_args(m_args))
hide_note("m")
end
if (not m_rom) and (m_s_rom or m_x_rom or m_nj_rom or dg_rom) then
hide("\n* [[w:Quan thoại|Quan thoại]]")
end
if has_var("m-s") then
local m_s_pron = require("Module:zhx-sic-pron")
-- ȵ [[Wiktionary talk:Chinese entry guidelines/Sichuanese#"ny"]]
local m_s_processed = gsub(m_s_rom:gsub("/", " / "), "([%d-])([%a])", "%1 %2")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
if m_s_rom then
show("\n*: <small>(<i>[[w:Phương ngữ Tứ Xuyên|Thành Đô]], [[w:Bính âm tiếng Tứ Xuyên|SP]]</i>)</small>: ")
show(Consolas(m_s_processed))
end
add_audio_show(textShow, m_s_audio, "zhx-sic")
hide("\n** <small>(<i>[[w:Thành Đô|Thành Đô]]</i>)</small>")
hide("\n*** <small><i>[[w:Bính âm tiếng Tứ Xuyên|Bính âm tiếng Tứ Xuyên]]</i></small>: ")
hide(Consolas(m_s_processed))
local xinwenz = m_s_pron.convert(m_s_rom, "SWZ")
if xinwenz then
hide("\n*** <small><i>[[w:zh:四川话拉丁化新文字|Scuanxua Ladinxua Xin Wenz]]</i></small>: ")
hide(Consolas(m_s_pron.convert(m_s_rom, "SWZ")))
end
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học<sup>([[w:zh:成都话|ghi chú]])</sup></small>: ")
hide(format_IPA(m_s_pron.convert(m_s_rom, "IPA")))
hide_note("m-s")
end
if has_var("m-x") then
local m_x_pron = require("Module:cmn-pron-Xian")
local m_x_display, m_x_hidden, m_x_ipa = m_x_pron.py_process(m_x_rom)
show("\n*: <small>(<i>[[w:en:Guanzhong dialect|Tây An]], [[Wiktionary:Tiếng Trung Quốc/Tây An|Bính âm Quan Trung]]</i>)</small>: ")
show(Consolas(m_x_display))
add_audio_show(textShow, m_x_audio, "cmn")
hide("\n** <small>(<i>[[w:Tây An|Tây An]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tây An|Bính âm Quan Trung]]</i></small>: ")
hide(Consolas(m_x_hidden))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:en:Guanzhong dialect|ghi chú]])</sup></small>: ")
hide(format_IPA(m_x_ipa))
hide_note("m-x")
end
if has_var("m-nj") then
local m_nj_pron = require("Module:cmn-pron-Nanjing")
local m_nj_display, m_nj_hidden, m_nj_num, m_nj_ipa = m_nj_pron.py_process(m_nj_rom)
show("\n*: <small>(<i>[[w:Nanjing dialect|Nanjing]], [[Wiktionary:Tiếng Trung Quốc/Nanjing|Nanjing Pinyin]]</i>)</small>: ")
show(Consolas(m_nj_display))
add_audio_show(textShow, m_nj_audio, "cmn")
hide("\n** <small>(<i>[[w:Nanjing|Nanjing]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Nanjing|Nanjing Pinyin]]</i></small>: ")
hide(Consolas(m_nj_hidden))
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Nanjing|Nanjing Pinyin]] (numbered)</i></small>: ")
hide(Consolas(m_nj_num))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Nanjing dialect|ghi chú]])</sup></small>: ")
hide(format_IPA(m_nj_ipa))
hide_note("m-nj")
end
if has_var("dg") then
local dg_pron = require("Module:dng-pron")
local dg_processed = dg_pron.process(dg_rom)
if dg_rom then
show("\n*: <small>(<i>[[w:Tiếng Đông Can|Đông Can]], [[w:Bảng chữ cái tiếng Đông Can|Chữ Kirin]] và [[Wiktionary:Bảng chuyển tự tiếng Đông Can|Wiktionary]]</i>)</small>: ")
show(Consolas(dg_processed))
end
add_audio_show(textShow, dg_audio, "dng")
hide("\n** <small>(<i>[[w:Tiếng Đông Can|Đông Can]]</i>)</small>")
hide("\n*** <small><i>[[w:Bảng chữ cái tiếng Đông Can|Chữ Kirin]] và [[Wiktionary:Bảng chuyển tự tiếng Đông Can|Wiktionary]]</i></small>: ")
hide(Consolas(dg_processed))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Âm vị học tiếng Đông Can|ghi chú]])</sup></small>: ")
hide(format_IPA(dg_pron.convert(dg_rom, "IPA")) .. "\n**: <small>(Lưu ý: Cách phát âm trong tiếng Đông Can hiện đang được thử nghiệm và có thể không chính xác.)</small>")
hide_note("dg")
end
if has_var("c") or has_var("c-dg") or has_var("c-t") or has_var("c-yj") then
if c_rom or c_dg_rom or c_t_rom or c_yj_rom then
local c_count = (c_rom and 1 or 0) + (c_dg_rom and 1 or 0)
+ (c_t_rom and 1 or 0) + (c_yj_rom and 1 or 0)
local c_sep = (c_count == 1) and " " or "\n*: "
show("\n* [[w:Tiếng Quảng Đông|Quảng Đông]]")
hide("\n* [[w:Tiếng Quảng Đông|Quảng Đông]]")
if c_rom then
local c_pron = require("Module:yue-pron")
show(c_sep)
show("<small>(<i>")
if c_count > 1 then
show("[[w:Tiếng Quảng Châu|Quảng Châu]]–[[w:Tiếng Quảng Châu Hồng Kông|Hồng Kông]], ")
end
show("[[w:Việt bính|Việt bính]]</i>)</small>: ")
show(Consolas(c_pron.show_standard(c_rom, is_single_hanzi)))
add_audio_show(textShow, c_audio, "yue")
hide(c_pron.hide_standard(c_rom, is_single_hanzi))
if not args["c_note"] and is_single_hanzi and (c_rom:find("^[ao]") or c_rom:find(",[ao]")) then
args["c_note"] = "The zero initial " .. format_IPA("/∅-/") .. " is commonly pronounced with a ''ng''-initial " .. format_IPA("/ŋ-/") .. " in some varieties of Cantonese, including Hong Kong Cantonese"
end
hide_note("c")
end
if c_dg_rom then
local c_dg_pron = require("Module:yue-pron/Dongguan")
local c_dg_display = c_dg_rom:gsub(","," / ")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show(c_sep .. "<small>(<i>[[w:zh:東莞話|Dongguan]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Dongguan|Jyutping++]]</i>)</small>: ")
show(Consolas(c_dg_display))
add_audio_show(textShow, c_dg_audio, "yue")
hide("\n** <small>(<i>[[w:zh:東莞話|Dongguan]], [[w:Guancheng Subdistrict|Guancheng]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Dongguan|Jyutping++]]</i></small>: ")
hide(Consolas(c_dg_display))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:zh:東莞話|ghi chú]])</sup></small>: ")
hide(format_IPA(c_dg_pron.jpp_to_ipa(c_dg_rom)))
hide_note("c-dg")
end
if c_t_rom then
local c_t_pron = require("Module:yue-pron/Taishanese")
local c_t_display = c_t_rom:gsub(","," / ")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show(c_sep .. "<small>(<i>[[w:Tiếng Đài Sơn|Đài Sơn]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Tiếng Đài Sơn|Wiktionary]]</i>)</small>: ")
show(Consolas(c_t_display))
add_audio_show(textShow, c_t_audio, "zhx-tai")
hide("\n** <small>(<i>[[w:Tiếng Đài Sơn|Tiếng Đài Sơn]], [[w:Taicheng Subdistrict|Taicheng]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Tiếng Đài Sơn|Wiktionary]]</i></small>: ")
hide(Consolas(c_t_display))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Tiếng Đài Sơn|ghi chú]])</sup></small>: ")
hide(format_IPA(c_t_pron.hoisanva_to_ipa(c_t_rom)))
hide_note("c-t")
end
if c_yj_rom then
local c_yj_pron = require("Module:yue-pron/Yangjiang")
local c_yj_display = c_yj_rom:gsub(","," / ")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show(c_sep .. "<small>(<i>[[w:zh:陽江話|Yangjiang]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Yangjiang|Jyutping++]]</i>)</small>: ")
show(Consolas(c_yj_display))
add_audio_show(textShow, c_yj_audio, "yue")
hide("\n** <small>(<i>[[w:zh:陽江話|Yangjiang Yue]], [[w:Jiangcheng, Yangjiang|Jiangcheng]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Quảng Đông/Yangjiang|Jyutping++]]</i></small>: ")
hide(Consolas(c_yj_display))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Gao–Yang Yue|ghi chú]])</sup></small>: ")
hide(format_IPA(c_yj_pron.jpp_to_ipa(c_yj_rom)))
hide_note("c-yj")
end
end
end
if has_var("g") then
local g_pron = require("Module:gan-pron")
if g_rom then
show("\n* [[w:w:Tiếng Cám|Cám]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Cám|Wiktionary]]</i>)</small>: ")
show(Consolas(g_pron.rom(g_rom)))
end
add_audio_show(textShow, g_audio, "gan")
hide("\n* [[w:Tiếng Cám|Cám]]")
hide("\n** <small>(<i>[[w:Phương ngữ Nam Xương|Nam Xương]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Cám|Wiktionary]]</i></small>: ")
hide(Consolas(g_pron.rom(g_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Nam Xương|Nam Xương|ghi chú]])</sup></small>: ")
hide(format_IPA("/" .. g_pron.ipa(g_rom) .. "/"))
hide_note("g")
end
if h_rom and (find(h_rom, "pfs=.") or find(h_rom, "gd=.") or find(h_rom, "hrs=.") or find(h_rom, "ct=.")) or #h_audio > 0 then
local h_pron = require("Module:hak-pron")
if find(h_rom, "pfs=.") or find(h_rom, "gd=.") or find(h_rom, "hrs=.") or find(h_rom, "ct=.") then
show("\n* [[w:Tiếng Khách Gia|Khách Gia]]")
show(h_pron.rom_display(h_rom,"yes"))
end
add_audio_show(textShow, h_audio, "hak")
hide("\n* [[Wiktionary:Tiếng Trung Quốc/Tiếng Khách Gia|Khách Gia]]")
if h_rom then hide(h_pron.rom_display(h_rom,"")) end
hide_note("h")
end
if has_var("j") then
local j_pron = require("Module:cjy-pron")
if j_rom then
show("\n* [[w:Tiếng Tấn|Tấn]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tấn|Wiktionary]]</i>)</small>: ")
show(Consolas(j_pron.rom(j_rom)))
end
add_audio_show(textShow, j_audio, "cjy")
hide("\n* [[w:Tiếng Tấn|Tấn]]")
hide("\n** <small>(<i>[[w:Thái Nguyên, Sơn Tây|Thái Nguyên]]</i>)<sup>[[:w:zh:太原話|+]]</sup></small>")
if j_rom then
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tấn|Wiktionary]]</i></small>: ")
hide(Consolas(j_pron.rom(j_rom)))
end
local no_sandhi = false
local roms = split(j_rom, "/")
for i = 1, #roms do
if find(roms[i], " [^ ]+ ") then
no_sandhi = true
break
end
end
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học (<i>old-style" .. (no_sandhi and ", no sandhi" or "") .. "</i>)</small>: ")
hide(format_IPA("/" .. j_pron.ipa(j_rom, no_sandhi and "no_sandhi" or "") .. "/"))
hide_note("j")
end
if has_var("mb") then
local mb_pron = require("Module:mnp-pron")
if mb_rom then
show("\n* [[w:Tiếng Mân Bắc|Mân Bắc]] <small>(<i>[[w:La Mã hóa phương ngữ Kiến Ninh|KCR]]</i>)</small>: ")
show(Consolas(mb_pron.rom(mb_rom)))
end
add_audio_show(textShow, mb_audio, "mnp")
hide("\n* [[w:Tiếng Mân Bắc|Mân Bắc]]")
hide("\n** <small>(<i>[[w:Phương ngữ Kiến Âu|Kiến Âu]]</i>)</small>")
if mb_rom then
hide("\n*** <small><i>[[w:La Mã hóa phương ngữ Kiến Ninh|La Mã hóa phương ngữ Kiến Ninh]]</i></small>: ")
hide(Consolas(mb_pron.rom(mb_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Kiến Âu|ghi chú]])</sup></small>: ")
hide(format_IPA(mb_pron.ipa(mb_rom)))
end
hide_note("mb")
end
if has_var("md") then
local md_pron = require("Module:cdo-pron")
if md_rom then
show("\n* [[w:Mân Đông|Mân Đông]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Mân Đông|BUC]]</i>)</small>: ")
show(Consolas(md_pron.rom(md_rom)))
end
add_audio_show(textShow, md_audio, "cdo")
hide("\n* [[w:w:Mân Đông|Mân Đông]]")
hide("\n** <small>(<i>[[w:Phương ngữ Phúc Châu|Phúc Châu]]</i>)</small>")
if md_rom then
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Mân Đông|Bàng-uâ-cê]]</i></small>: ")
hide(Consolas(md_pron.rom(md_rom)))
if not (md_rom and find(md_rom, "([^/]*)-([^/]*)-([^/]*)-([^/]*)-([^/]*)")) then
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Phúc Châu|ghi chú]])</sup></small>: ")
hide(format_IPA("/" .. md_pron.ipa(md_rom) .. "/"))
else
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Phúc Châu|ghi chú]])</sup> (<i>no sandhi</i>)</small>: ")
hide(format_IPA("/" .. md_pron.ipa(md_rom, "no_sandhi") .. "/"))
end
end
hide_note("md")
end
if has_var("px") then
local px_pron = require("Module:cpx-pron")
show("\n* [[w:Puxian Min|Puxian Min]]")
show(px_pron.rom_display(px_rom,"brief"))
add_audio_show(textShow, px_audio, "cpx")
hide("\n* [[Wiktionary:About Chinese/Puxian Min|Puxian Min]]")
if px_rom then hide(px_pron.rom_display(px_rom,"complete")) end
hide_note("px")
end
if has_var("mn") or has_var("mn-l") or has_var("mn-t") then
local mn_pron, mn_l_pron
if has_var("mn") or has_var("mn-t") then
mn_pron = require("Module:nan-pron")
end
if has_var("mn-l") then
mn_l_pron = require("Module:luh-pron")
end
if mn_rom or mn_t_rom or mn_l_rom then
show("\n* [[w:Tiếng Mân Nam|Mân Nam]]")
if mn_rom then
show(((mn_l_rom or mn_t_rom) and "\n*:" or "") .. " <small>(<i>[[w:Tiếng Mân Tuyền Chương|Mân Tuyền Chương]], [[w:Phiên âm Bạch thoại|POJ]]</i>)</small>: ")
show(Consolas(mn_pron.poj_display(mn_pron.poj_check_invalid(mn_rom))))
add_audio_show(textShow, mn_audio, "nan-hbl")
end
if mn_t_rom then
show(((mn_rom or mn_l_rom) and "\n*:" or "") .. " <small>(<i>[[w:Tiếng Triều Châu|Triều Châu]], [[w:Peng'im|Peng'im]]</i>)</small>: ")
show(Consolas(mn_pron.pengim_display(mn_t_rom)))
add_audio_show(textShow, mn_t_audio, "nan-tws")
end
if mn_l_rom then
show(((mn_rom or mn_t_rom) and "\n*:" or "") .. " <small>(<i>[[w:Leizhou Min|Leizhou]], Leizhou Pinyin</i>)</small>: ")
show(Consolas(mn_l_pron.rom(mn_l_rom)))
add_audio_show(textShow, mn_l_audio, "luh")
end
end
hide("\n* [[w:Tiếng Mân Nam|Mân Nam]]")
if has_var("mn") then
hide(mn_pron.generate_all(mn_rom))
hide_note("mn")
end
if has_var("mn-t") then
hide("\n** <small>(<i>[[w:Tiếng Triều Châu|Triều Châu]]</i>)</small>")
hide("\n*** <small><i>[[w:Peng'im|Peng'im]]</i></small>: ")
hide(Consolas(mn_pron.pengim_display(mn_t_rom)))
hide("\n*** <small><i>[[w:Phiên âm Bạch thoại|Phiên âm Bạch thoại]]-like</i></small>: ")
hide(Consolas(mn_pron.pengim_to_pojlike_conv(mn_t_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:zh:潮州話#語音|ghi chú]])</sup></small>: ")
hide(format_IPA(mn_pron.pengim_to_ipa_conv(mn_t_rom)))
hide_note("mn-t")
end
if has_var("mn-l") then
hide("\n** <small>(<i>[[w:Leizhou Min|Leizhou]]</i>)</small>")
hide("\n*** <small><i>Leizhou Pinyin</i></small>: ")
hide(Consolas(mn_l_pron.rom(mn_l_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học</small>: ")
hide(format_IPA(mn_l_pron.ipa(mn_l_rom)))
hide_note("mn-l")
end
end
if has_var("sp") then
local sp_pron = require("Module:csp-pron")
local sp_processed = sp_rom:gsub(",([^ ])",", %1")
:gsub("%d[%d%*%-]*%f[^%d%*]", "<sup>%0</sup>")
show("\n* [[w:Pinghua|Southern Pinghua]] <small>(<i>[[w:Pinghua|Nanning]], [[Wiktionary:Tiếng Trung Quốc/Southern Pinghua|Jyutping++]]</i>)</small>: ")
show(Consolas(sp_processed))
add_audio_show(textShow, sp_audio, "csp")
hide("\n* [[w:Pinghua|Southern Pinghua]]")
hide("\n** <small>(<i>[[w:Pinghua|Nanning Pinghua]], [[w:Nanning|Tingzi]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Southern Pinghua|Jyutping++]]</i></small>: ")
hide(Consolas(sp_processed))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Pinghua#Phonology|ghi chú]])</sup></small>: ")
hide(format_IPA(sp_pron.jpp_to_ipa(sp_rom)))
hide_note("sp")
end
if has_var("w") or has_var("w-j") then
local w_count = (w_rom and 1 or 0) + (w_j_rom and 1 or 0)
local w_show, w_hide, w_j_show, w_j_hide
if w_rom then
w_show, w_hide = require("Module:wuu-pron").make(w_rom, w_count)
end
if w_j_rom then
w_j_show, w_j_hide = require("Module:wuu-pron/Jinhua").make(w_j_rom, w_count)
end
if w_count > 1 then
show("\n* [[w:Tiếng Ngô|Ngô]] <small>(<i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Ngô|Wugniu]]</i>)</small>")
else
show("\n* [[w:Tiếng Ngô|Ngô]]")
end
show(w_show)
show(w_j_show)
add_audio_show(textShow, w_audio, "wuu")
hide("\n* [[w:Tiếng Ngô|Ngô]]")
hide(w_hide)
hide(w_j_hide)
-- add_audio(textHide, w_audio, "wuu")
hide_note("w")
hide_note("w-j")
end
if has_var("x") or has_var("x-l") or has_var("x-h") then
local x_pron = has_var("x") and require("Module:hsn-pron") or nil
local x_l_pron = has_var("x-l") and require("Module:hsn-pron-Loudi") or nil
local x_h_pron = has_var("x-h") and require("Module:hsn-pron-Hengyang") or nil
if x_rom or x_l_rom or x_h_rom then
show("\n* [[w:Tiếng Tương|Tương]]")
if x_rom then
show(((x_l_rom or x_h_rom) and "\n*:" or "") .. " <small>(<i>[[w:Phương ngữ Trường Sa|Trường Sa]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Tương|Wiktionary]]</i>)</small>: ")
show(Consolas(x_pron.rom(x_rom)))
add_audio_show(textShow, x_audio, "hsn")
end
if x_l_rom then
show(((x_rom or x_h_rom) and "\n*:" or "") .. " <small>(<i>[[w:zh:娄底话|Loudi]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Loudi|Wiktionary]]</i>)</small>: ")
show(Consolas(x_l_pron.rom(x_l_rom)))
add_audio_show(textShow, x_l_audio, "hsn-lou")
end
if x_h_rom then
show(((x_rom or x_l_rom) and "\n*:" or "") .. " <small>(<i>[[w:Hengyang dialect|Hengyang]], [[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Hengyang|Wiktionary]]</i>)</small>: ")
show(Consolas(x_h_pron.rom(x_h_rom)))
add_audio_show(textShow, x_h_audio, "hsn-hya")
end
end
hide("\n* [[w:Tiếng Tương|Tương]]")
if x_rom then
local x_diff = x_pron.stylediff(x_rom)
hide("\n** <small>(<i>[[w:Phương ngữ Trường Sa|Trường Sa]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tương|Wiktionary]]</i></small>: ")
hide(Consolas(x_pron.rom(x_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Trường Sa|ghi chú]])</sup>")
hide(x_diff and " (<i>old-style</i>)" or "")
hide("</small>: ")
hide(format_IPA("/" .. x_pron.ipa(x_rom) .. "/"))
if x_diff then
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Phương ngữ Trường Sa|ghi chú]])</sup> (<i>new-style</i>)</small>: ")
hide(format_IPA("/" .. x_pron.ipa(x_rom, "new") .. "/"))
end
hide_note("x")
end
if x_l_rom then
hide("\n** <small>(<i>[[w:zh:娄底话|Loudi]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Loudi|Wiktionary]]</i></small>: ")
hide(Consolas(x_l_pron.rom(x_l_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:zh:娄底话|ghi chú]])</sup>")
hide("</small>: ")
hide(format_IPA("/" .. x_l_pron.ipa(x_l_rom) .. "/"))
hide_note("x-l")
end
if x_h_rom then
hide("\n** <small>(<i>[[w:Hengyang dialect|Hengyang]]</i>)</small>")
hide("\n*** <small><i>[[Wiktionary:Tiếng Trung Quốc/Tiếng Tương/Hengyang|Wiktionary]]</i></small>: ")
hide(Consolas(x_h_pron.rom(x_h_rom)))
hide("\n*** <small>[[Wiktionary:IPA|IPA]] Hán học <sup>([[w:Hengyang dialect|ghi chú]])</sup>")
hide("</small>: ")
hide(format_IPA("/" .. x_h_pron.ipa(x_h_rom) .. "/"))
hide_note("x-h")
end
end
-- combine textShow and textHide into text
text = {
concat(textShow),
'<span class="vsToggleElement" style="float: right;"></span>\n<div class="vsHide" style="clear:right;">\n<hr>\n',
concat(textHide),
"</div></div>"
}
--Part 3 "Dialectal data"
if dial ~= "n" and is_single_hanzi then
local success, m_dial = pcall(mw.loadData, "Module:zh/data/dial-pron/" .. pagename)
if success then
local dialPron = {}
local temporary = {}
if dial and find(dial, "^[0-9\\,]+$") then
for element in gsplit(dial, ",") do
insert(dialPron, m_dial[tonumber(element)])
end
else
for _, element in ipairs(m_dial) do
insert(dialPron, element)
end
end
for _, set in ipairs(dialPron) do
for _, object in ipairs(set[2]) do
insert(temporary, object)
end
end
insert(text,
'\n<hr style="clear:right;">\n<div class="vsSwitcher" data-toggle-category="pronunciations" style="background-color:var(--wikt-palette-palergreen, #F8FFFA);color:inherit">\n* ' ..
'Dữ liệu phương ngữ' ..
'<span class="vsToggleElement" style="float:right; padding:0 0"></span>\n' ..
'<div class="vsHide">'
)
insert(text, '\n{| class="wikitable" ' ..
'" style="width:100%; margin:0; ' ..
'text-align:center; border-collapse: collapse; border-style: hidden; display: table;"')
local locStart = "\n|-\n!"
local readingStart = concat({'\n!style="background:var(--wikt-palette-indigo-3, #e0defa);color:inherit; width:9em"|',
'<div style="float: right; clear: right; font-size:60%"><span class="plainlinks">[', tostring(mw.uri.fullUrl("Module:zh/data/dial-pron/" .. pagename, {["action"]="edit"})), ' edit]</span></div><span lang="zh" class="Hani">'})
local locEnd = '<span class="IPA">'
local headclr = 'style="background:#E8ECFA;color:inherit"|'
local mclr = 'style="background:#FAF5F0;color:inherit"|'
local jclr = 'style="background:#FAF5F0;color:inherit"|'
local wclr = 'style="background:#F4F0FA;color:inherit"|'
local huclr = 'style="background:#FAF9F0;color:inherit"|'
local xclr = 'style="background:#F0F2FA;color:inherit"|'
local gclr = 'style="background:#F0FAF3;color:inherit"|'
local haclr = 'style="background:#FAF0F6;color:inherit"|'
local cclr = 'style="background:#F0F5FA;color:inherit"|'
local minclr = 'style="background:#F7FAF0;color:inherit"|'
local clrList = {
mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr, mclr,
mclr, mclr, mclr, mclr, mclr, mclr, mclr, jclr, jclr, jclr,
wclr, wclr, wclr, wclr, huclr, huclr, xclr, xclr, gclr, haclr,
haclr, cclr, cclr, cclr, minclr, minclr, minclr, minclr, minclr
}
local locList = {
concat({headclr, "Biến thể ngôn ngữ\n!", headclr, "Tiếng địa phương"}),
concat({"rowspan=17 ", mclr, "Quan thoại\n!", mclr, "[[w:Tiếng Bắc Kinh|Bắc Kinh]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Cáp Nhĩ Tân|Cáp Nhĩ Tân]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Thiên Tân|Thiên Tân]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Tế Nam|Tế Nam]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Thanh Đảo|Thanh Đảo]]\n|", mclr}),
concat({mclr, "[[w:zh:鄭州話|Trịnh Châu]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Tây An|Tây An]]\n|", mclr}),
concat({mclr, "[[w:Tây Ninh, Thanh Hải|Tây Ninh]]\n|", mclr}),
concat({mclr, "[[w:Ngân Xuyên|Ngân Xuyên]]\n|", mclr}),
concat({mclr, "[[w:zh:蘭州話|Lan Châu]]\n|", mclr}),
concat({mclr, "[[w:zh:烏魯木齊話|Ürümqi]]\n|", mclr}),
concat({mclr, "[[w:zh:武漢話|Vũ Hán]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Thành Đô|Thành Đô]]\n|", mclr}),
concat({mclr, "[[w:zh:貴陽話|Quý Dương]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Côn Minh|Côn Minh]]\n|", mclr}),
concat({mclr, "[[w:Phương ngữ Nam Kinh|Nam Kinh]]\n|", mclr}),
concat({mclr, "[[w:zh:合肥話|Hợp Phì]]\n|", mclr}),
concat({"rowspan=3 ", jclr, "Tiếng Tấn\n!", jclr, "[[w:zh:太原話|Thái Nguyên]]\n|", jclr}),
concat({jclr, "[[w:Bình Dao|Bình Dao]]\n|", jclr}),
concat({jclr, "[[w:Phương ngữ Hohhot|Hohhot]]\n|", jclr}),
concat({"rowspan=4 ", wclr, "Tiếng Ngô\n!", wclr, "[[w:Tiếng Thượng Hải|Thượng Hải]]\n|", wclr}),
concat({wclr, "[[w:Phương ngữ Tô Châu|Tô Châu]]\n|", wclr}),
concat({wclr, "[[w:Phương ngữ Hàng Châu|Hàng Châu]]\n|" , wclr}),
concat({wclr, "[[w:Tiếng Ôn Châu|Ôn Châu]]\n|", wclr}),
concat({"rowspan=2 ", huclr, "Tiếng Hồi\n!", huclr, "[[w:Shexian|Shexian]]\n|", huclr}),
concat({huclr, "[[w:zh:屯溪話|Đồn Khê]]\n|", huclr}),
concat({"rowspan=2 ", xclr, "Tiếng Tương\n!", xclr, "[[w:Phương ngữ Trường Sa|Trường Sa]]\n|", xclr}),
concat({xclr, "[[w:zh:湘潭話|Tương Đàm]]\n|", xclr}),
concat({gclr, "Tiếng Cám\n!", gclr, "[[w:Phương ngữ Nam Xương|Nam Xương]]\n|", gclr}),
concat({"rowspan=2 ", haclr, "Tiếng Khách Gia\n!", haclr, "[[w::Phương ngữ Mai Huyện|Mai Huyện]]\n|", haclr}),
concat({haclr, "[[w:Đào Viên|Đào Viên]]\n|", haclr}),
concat({"rowspan=3 ", cclr, "Tiếng Quảng Đông\n!", cclr, "[[w:Tiếng Quảng Châu|Quảng Châu]]\n|", cclr}),
concat({cclr, "[[w:Nam Ninh|Nam Ninh]]\n|", cclr}),
concat({cclr, "[[w:Tiếng Quảng Châu Hồng Kông|Hồng Kông]]\n|", cclr}),
concat({"rowspan=5 ", minclr, "Tiếng Mân\n!", minclr, "[[w:Phương ngữ Hạ Môn|Hạ Môn]] (Mân Tuyền Chương)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Phúc Châu|Phúc Châu]] (Mân Đông)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Kiến Âu|Kiến Âu]] (Mân Bắc)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Sán Đầu|Sán Đầu]] (Triều Châu)\n|", minclr}),
concat({minclr, "[[w:Phương ngữ Hải Khẩu|Hải Khẩu]] (Hải Nam)\n|", minclr})}
local function ipa_correct(ipa, location)
if location == 22 then return (gsub(ipa, "13", "23")) else return ipa end
end
local function fmtDial(text, location)
local fmttedPron = {}
if text == "" then return "" end
for pronunciation in gsplit(text, "|") do
local ipa = match(pronunciation, "^[^%(%)" .. hanzi .. "~,]+")
ipa = gsub(ipa, "([ptk])([0-5])", "%1̚%2")
local environ = match(pronunciation, "[%(%)" .. hanzi .. "~,]*$") or false
insert(fmttedPron, "<span class=\"IPA\"><small>/" ..
tostring(ipa_format(ipa_correct(ipa, location))) .. "/</small></span>" .. (environ
and " <span class=\"Hani\" lang=\"zh\"><small>"..environ.."</small></span>" or nil))
end
return concat(fmttedPron, "<br>")
end
for locationNo = 1, 40 do
for readingNo = 1, #dialPron do
if readingNo == 1 then
insert(text, locStart)
insert(text, locList[locationNo])
end
if locationNo == 1 then
local situation = dialPron[readingNo][1]
insert(text, readingStart)
insert(text, pagename)
insert(text, (pagename ~= situation and " (" ..
gsub(situation, pagename, "<b>" .. pagename .. "</b>") .. ")" or ""))
insert(text, "</span>")
else
insert(text, (readingNo == 1 and "" or "\n|" .. clrList[locationNo-1]))
insert(text, locEnd)
insert(text, fmtDial(dialPron[readingNo][2][locationNo-1], locationNo))
insert(text, "</span>")
end
end
end
insert(text, "\n|}</div></div>")
end
end
--Part 4 "Middle Chinese & Old Chinese"
local mc_preview, oc_preview
local m_ltc_pron, m_och_pron
-- !!!
-- The following function modifies the tables generated by mod:ltc-pron and mod:och-pron, shifting them
-- from using "mw-collapsible" to using "vsSwitcher", because the former
-- can not collapse on the mobile site and makes Chinese entries a mess.
-- It is supposed to be a temporary solution.
-- !!!
local function shiftCustomtoggle2Vsswitcher(s)
local result
result = (s:gsub(
'\n%* <div title="expand" class="mw%-customtoggle[^>]+">',
'\n<div class="vsSwitcher" data-toggle-category="pronunciations">\n* '
):gsub(
'<span style="float:right; border:1px solid var%(%-%-wikt%-palette%-lightgrey,#ccc%); border%-radius:1px; padding:0 0; font%-size:90%%">▼</span>(.-)</div>\n{| class="wikitable',
'<span class="vsToggleElement" style="float:right; padding:0 0"></span>%1\n<div class="vsHide">\n{| class="wikitable'
):gsub(
'{| class="wikitable mw%-collapsible mw%-collapsed" id="[^"]+"',
'{| class="wikitable"'
):gsub(
"\n|}$",
"\n|}</div></div>"
))
return result
end
if mc then
m_ltc_pron = require("Module:ltc-pron")
mc_preview = m_ltc_pron.retrieve_pron(pagename, false, mc, true)
if not mc_preview then
require("Module:debug/track")("zh-pron/Middle Chinese data not found")
mc = nil
end
end
if oc then
m_och_pron = require("Module:och-pron")
oc_preview = m_och_pron.generate_show(pagename, oc)
if not oc_preview then
require("Module:debug/track")("zh-pron/Old Chinese data not found")
oc = nil
end
end
if mc or oc then
insert(text, '\n<hr style="clear:right;">\n<div style="background-color:var(--wikt-palette-lighterblue, #ebf4ff); color:inherit; margin: 0 -5px -5px; padding: 0 5px 5px;">')
if mc then
insert(text, shiftCustomtoggle2Vsswitcher(m_ltc_pron.ipa(mc, mc_preview)))
end
if oc then
insert(text, shiftCustomtoggle2Vsswitcher(m_och_pron.ipa(oc, oc_preview)))
end
insert(text, "</div>")
end
insert(text, "</div>")
if namespace == "" or namespace == "-" then
if mc then
if is_single_hanzi then
if mc_preview:find("k̚$") then
insert(text, "[[Thể loại:Middle Chinese -k characters|" .. sortkey .. "]]")
elseif mc_preview:find("t̚$") then
insert(text, "[[Thể loại:Middle Chinese -t characters|" .. sortkey .. "]]")
elseif mc_preview:find("p̚$") then
insert(text, "[[Thể loại:Middle Chinese -p characters|" .. sortkey .. "]]")
end
end
end
if not args["cat"] then
insert(text, "[[Thể loại:Cách sử dụng zh-pron thiếu POS]]")
end
end
end
local conv_text = {} --categories
if namespace == "" or namespace == "-" then
local catText = args["cat"] or ""
local cat_start = "[[Thể loại:"
local cat_end = "]]"
if w_rom then
w_rom = gsub(w_rom, "%d", "")
end
local function add_cat(cat_table, name, cat)
insert(cat_table, cat_start .. name .. cat .. "|" .. sortkey .. cat_end)
end
local cats = split(catText, ",", true)
for i = 1, #cats do
if pos_aliases_cat[cats[i]] == "Thành ngữ truyền thống" then
insert(cats, i, "Thành ngữ")
break
end
end
insert(cats, 1, "Mục từ")
if is_single_hanzi then
insert(cats, 2, "Hán tự")
end
for i = 1, #cats do
local cat = cats[i]
if cat == "" then break end
cat = gsub(cat, "^ +", "")
if find(cat, ":") then
local cat_split = split(cat, ":", true)
local lang_name = langname_abbr[cat_split[1]]
local category = pos_aliases_cat[cat_split[2]] or cat
add_cat(conv_text, category, " tiếng Trung Quốc")
insert(conv_text, cat_start .. category .. " " .. lang_name .. "|" .. sortkey .. cat_end)
else
cat = pos_aliases_cat[cat] or cat
add_cat(conv_text, cat, " tiếng Trung Quốc")
if m_rom or m_x_rom or m_nj_rom then add_cat(conv_text, cat, " tiếng Quan Thoại") end
if has_var("m-s") then add_cat(conv_text, cat, " tiếng Tứ Xuyên") end
if has_var("dg") then add_cat(conv_text, cat, " tiếng Đông Can") end
if c_rom or c_dg_rom or c_yj_rom then add_cat(conv_text, cat, " tiếng Quảng Đông") end
if c_t_rom then add_cat(conv_text, cat, " tiếng Đài Sơn") end
if has_var("g") then add_cat(conv_text, cat, " tiếng Cám") end
if h_rom and (find(h_rom, "pfs=.") or find(h_rom, "gd=.") or find(h_rom, "hrs=.") or find(h_rom, "ct=.")) or #h_audio > 0 then
add_cat(conv_text, cat, " tiếng Khách Gia")
end
if has_var("j") then add_cat(conv_text, cat, " tiếng Tấn") end
if has_var("mb") then add_cat(conv_text, cat, " tiếng Mân Bắc") end
if has_var("md") then add_cat(conv_text, cat, " tiếng Mân Đông") end
if has_var("mn") then add_cat(conv_text, cat, " tiếng Mân Tuyền Chương") end
if has_var("mn-t") then add_cat(conv_text, cat, " tiếng Triều Châu") end
if has_var("mn-l") then add_cat(conv_text, "Leizhou Min ", cat) end
if has_var("sp") then add_cat(conv_text, "tiếng Nam Bình ", cat) end
if has_var("w") then add_cat(conv_text, cat, " tiếng Ngô") end
if has_var("w-j") then add_cat(conv_text, cat, " tiếng Ngô") end
if has_var("x") then add_cat(conv_text, cat, " tiếng Tương") end
if has_var("x-l") then add_cat(conv_text, cat, " tiếng Tương") end
if has_var("x-h") then add_cat(conv_text, cat, " tiếng Tương") end
if mc and has_var("mc") then
add_cat(conv_text, cat, " tiếng Hán trung cổ")
end
if oc and has_var("oc") then
add_cat(conv_text, cat, " tiếng Hán thượng cổ")
end
end
end
if not args.only_cat then
insert(conv_text, cat_start .. "Mục từ có cách phát âm IPA tiếng Trung Quốc|" .. sortkey .. cat_end)
end
if not args.poj_form_zh_see then
if not find(pagename, "[" .. hanzi .. bopomofo .. "]") then
insert(conv_text, cat_start .. "Chinese terms written in foreign scripts|" .. sortkey .. cat_end)
end
-- TODO: handle Zhuyin.
-- Note: this parses any IDS to pick out the full character.
for _, character in ipairs(explode_chars(pagename)) do
if match(character, "[" .. hanzi .. "%%%+%-·×々〻𖿣⿰-]") then
insert(conv_text, cat_start .. "Từ đánh vần với " .. character .. " tiếng Trung Quốc|" .. sortkey .. cat_end)
end
end
end
end
local output = concat(text) .. concat(conv_text)
if namespace ~= "" and namespace ~= "-" then
output = gsub(output, "%[%[Thể loại:[^%]]+%]%]", "")
end
return output
end
return export
l8lru9frm5cu8zaotmamzabr1wt27e9
Mô đun:la-headword
828
266050
2561559
2261987
2026-09-08T02:26:39Z
Hiyuune
50834
2561559
Scribunto
text/plain
-- TODO: handle "-old" subtypes generally, appending "in Old Latin", where terms have additional OL inflections.
local export = {}
local pos_functions = {}
local string_utilities = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local form_is_empty = require("Module:la-utilities").form_is_empty
local insert = table.insert
local remove = table.remove
local umatch = mw.ustring.match
local lang = require("Module:languages").getByCode("la")
local NAMESPACE = mw.title.getCurrentTitle().nsText
local PAGENAME = mw.loadData("Module:headword/data").pagename
local legal_gender = {
["m"] = true,
["f"] = true,
["n"] = true,
["?"] = true,
["?!"] = true,
}
local declension_to_vi = {
["1"] = "loại 1",
["2"] = "loại 2",
["3"] = "loại 3",
["4"] = "loại 4",
["5"] = "loại 5",
}
local gender_names = {
["m"] = "giống đực",
["f"] = "giống cái",
["n"] = "giống trung",
["?"] = "không rõ giống",
["?!"] = "giống chưa chứng thực",
}
local function deep_equals(...)
deep_equals = require(table_module).deepEquals
return deep_equals(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function invert(...)
invert = require(table_module).invert
return invert(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities).pattern_escape
return pattern_escape(...)
end
local function serial_comma_join(...)
serial_comma_join = require(table_module).serialCommaJoin
return serial_comma_join(...)
end
local function split(...)
split = require(string_utilities).split
return split(...)
end
local function ulower(...)
ulower = require(string_utilities).lower
return ulower(...)
end
local function format(array, concatenater)
if #array == 0 then
return ""
end
local concatenated = concat(array, concatenater)
if concatenated == "" then
return ""
elseif concatenated:sub(-1) == "'" then
concatenated = concatenated .. " "
end
return "; ''" .. concatenated .. "''"
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[Phụ lục:Từ điển thuật ngữ#" .. anchor .. "|" .. text .. "]]"
end
local function make_link(page, display, face, accel)
return require("Module:links").full_link({term = page, alt = display, lang = lang, accel = accel}, face)
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local iargs = require("Module:parameters").process(frame.args, {
[1] = {required = true},
["def"] = true,
["suff_type"] = true,
})
local args = frame:getParent().args
local poscat = iargs[1]
local def = iargs.def
local suff_type = iargs.suff_type
local postype = nil
if suff_type then
postype = poscat .. '-' .. suff_type
else
postype = poscat
end
local data = {lang = lang, categories = {}, heads = {}, genders = {}, inflections = {}}
local infl_classes = {}
local title = {}
local postscript = {}
if poscat == "Hậu tố" then
insert_if_not(data.categories, "Dạng hậu tố " .. suff_type .. " tiếng Latinh")
end
if pos_functions[postype] then
local new_poscat = pos_functions[postype](def, args, data, infl_classes, title, postscript)
if new_poscat then
poscat = new_poscat
end
end
data.pos_category = poscat
postscript = concat(postscript, ", ")
return
require("Module:headword").full_headword(data)
.. format(infl_classes, "/")
.. format(title, ", ")
.. (postscript ~= "" and " (" .. postscript .. ")" or "")
end
local function process_num_type(numtype, categories)
if numtype == "card" then
insert_if_not(categories, "Số đếm tiếng Latinh")
elseif numtype == "ord" then
insert_if_not(categories, "Số thứ tự tiếng Latinh")
elseif numtype == "frac" then
insert_if_not(categories, "Phân số tiếng Latinh")
elseif numtype == "dist" then
insert_if_not(categories, "Số phân phối tiếng Latinh")
elseif numtype == "mul" then
insert_if_not(categories, "Số nhân tiếng Latinh")
elseif numtype == "coll" then
insert_if_not(categories, "Số tập hợp tiếng Latinh")
elseif numtype then
error("Unrecognized numeral type '" .. numtype .. "'")
end
end
local function normalize_derivation(deriv, anchor, text)
if not deriv then
return nil
end
local deriv1 = deriv[1]
if not deriv1 or deriv1 == "-" then
return deriv1
end
deriv.label = glossary_link(anchor, text)
return deriv
end
local function derivation(data, decldata, arg, anchor, text)
local der = normalize_derivation(decldata[arg], anchor, text)
if der and der ~= "-" then
insert(data.inflections, der)
end
end
local function nouns(pos, def, args, data, infl_classes, title)
local is_num = pos == "Số từ"
local is_pn = false
if pos == "Danh từ riêng" then
is_pn = true
pos = "Danh từ"
end
local decldata = require("Module:la-nominal").do_generate_noun_forms(args, pos, "headword", def, is_num)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_noun_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local genders = decldata.overriding_genders
if #genders == 0 then
if decldata.gender then
genders = {ulower(decldata.gender)}
elseif not is_num then
error("No gender explicitly specified in headword template using g=, and can't infer gender from lemma spec")
end
end
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
local gender = g:match("^(.[\128-\191]*)%-[sp]$")
if not gender then
gender = g
end
if not legal_gender[gender] then
error("Gender “" .. gender .. "” is not a valid Latin gender.")
end
insert(data.genders, g)
insert_if_not(categories, decldata.pos .. " " .. gender_names[gender] .. " không biến cách tiếng Latinh")
end
else
local is_irreg = false
local is_indecl = false
local is_decl = false
local has_multiple_decls = false
local has_multiple_variants = false
-- flatten declension specs
local decls = {}
for _, g in ipairs(genders) do
if not legal_gender[g] then
error("Gender “" .. g .. "” is not a valid Latin gender.")
elseif decldata.num == "pl" then
g = g .. "-p"
elseif decldata.num == "sg" then
g = g .. "-s"
end
insert(data.genders, g)
end
local function process_decl(decl_list, props)
local headword_decl = props.headword_decl
-- skip adjectival declensions
if headword_decl:match("+$") then
return
elseif props.decl == "irreg" then
is_irreg = true
headword_decl = headword_decl:match("^irreg/(.*)$") or headword_decl
local irreg_decls = split(headword_decl, ",")
if #irreg_decls > 1 then
has_multiple_decls = true
end
for _, d in ipairs(irreg_decls) do
if d == "indecl" or d == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, d)
end
else
if headword_decl == "indecl" or headword_decl == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, headword_decl)
end
end
for _, props in ipairs(decldata.propses) do
if props.headword_decl then
process_decl(decls, props)
else
local alternant_decls = {}
for _, alternant in ipairs(props) do
for _, single_props in ipairs(alternant) do
process_decl(alternant_decls, single_props)
end
end
if #alternant_decls > 1 then
has_multiple_decls = true
elseif #decls > 1 then
has_multiple_variants = true
end
for _, d in ipairs(alternant_decls) do
insert_if_not(decls, d)
end
end
end
if is_indecl and is_decl then
has_multiple_decls = true
end
if has_multiple_decls then
insert_if_not(categories, decldata.pos .. " có nhiều loại biến cách tiếng Latinh")
end
if has_multiple_variants then
insert_if_not(categories, decldata.pos .. " có nhiều biến thể ở biến cách đơn tiếng Latinh")
end
if is_irreg then
insert(title, glossary_link("bất quy tắc"))
insert_if_not(categories, decldata.pos .. " bất quy tắc tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " bất quy tắc tiếng Latinh")
end
end
if is_indecl then
if is_decl then
insert(title, glossary_link("không biến cách"))
else
insert(data.inflections, {label = glossary_link("không biến cách")})
end
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " không biến cách tiếng Latinh")
end
end
if #decls > 1 then
insert(title, "biến cách nhiều loại")
end
for _, decl in ipairs(decls) do
if not (decl == "0" or decl == "indecl" or decl == "sgpl" or decl == "irreg") then
local decl_class = declension_to_vi[decl]
if not decl_class then
error("Internal error: declension '" .. decl .. "' not recognized")
end
insert(title, "[[Phụ lục:Biến cách " .. decl_class .. " tiếng Latinh|" .. decl_class .. " declension]]")
insert_if_not(categories, decldata.pos .. " biến cách " .. decl_class .. " tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " " .. decldata.pos .. " biến cách " .. decl_class .. " tiếng Latinh")
end
end
end
local lemma_num = decldata.num == "pl" and "pl" or "sg"
if NAMESPACE == "Từ_tái_tạo" then
-- For reconstructed nouns:
if data.genders[1] == 'n' and lemma_num == 'sg' then
-- singular neuter nouns give a plural
local pl = decldata.forms["nom_pl"]
if pl and pl ~= "" and #pl > 0 then
pl.label = "số nhiều"
insert(data.inflections, pl)
end
else
-- all others give an oblique
local obl = decldata.forms["acc_" .. lemma_num]
if obl and obl ~= "" and #obl > 0 then
obl.label = "bổ cách"
insert(data.inflections, obl)
end
end
else
local gen = decldata.forms["gen_" .. lemma_num]
if (decldata.unattested["gen_" .. lemma_num]) then
gen[1] = '*' .. gen[1]
data.nolink = true
end
if gen and gen ~= "" and gen ~= "—" and #gen > 0 then
if is_decl then
-- Skip displaying the genitive for nouns that are only
-- indeclinable. But we do display it for nouns like Abrahām
-- and Ādām that can be either indeclinable or declined.
gen.label = "sinh cách"
insert(data.inflections, gen)
end
else
insert(data.inflections, {label = "không có sinh cách"})
insert_if_not(categories, decldata.pos .. " không có sinh cách tiếng Latinh")
end
end
end
derivation(data, decldata, "m", "giống đực")
derivation(data, decldata, "f", "giống cái")
derivation(data, decldata, "n", "giống trung")
derivation(data, decldata, "adj", "quan hệ", "tính từ quan hệ")
derivation(data, decldata, "dim", "giảm nhẹ nghĩa")
derivation(data, decldata, "aug", "tăng nhẹ nghĩa")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return is_pn and decldata.pos == "Danh từ" and "Danh từ riêng" or decldata.pos
end
pos_functions["Danh từ"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ", def, args, data, infl_classes, title)
end
pos_functions["Danh từ riêng"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ riêng", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-hậu tố"] = function(def, args, data, infl_classes, title)
return nouns("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-số từ"] = function(def, args, data, infl_classes, title)
return nouns("Số từ", def, args, data, infl_classes, title)
end
function export.verb_title(title, typeinfo, lemma_forms)
local conj = typeinfo.conj
local irreg_processing = typeinfo.irreg
local subtypes = typeinfo.subtypes
local first_lemma = ""
if #lemma_forms > 0 then
first_lemma = require("Module:links").remove_links(lemma_forms[1])
end
if conj == "1st" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 1|cách chia loại 1]]")
elseif conj == "2nd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 2|cách chia loại 2]]")
elseif conj == "3rd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]]")
elseif conj == "3rd-io" then
insert(title, ("[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]] %s-variant"):format(make_link(nil, "iō", "term")))
elseif conj == "4th" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 4|cách chia loại 4]]")
elseif conj == "irreg" then -- sum
insert(title, "[[Phụ lục:Động từ bất quy tắc tiếng Latinh|cách chia bất quy tắc]]")
end
if subtypes.highlydef then -- āiō, inquam
insert(title, "rất [[khiếm khuyết]]")
end
if subtypes.suppl then -- sum, volō
insert(title, "[[bổ khuyết]]")
end
if subtypes["3only"] then -- decet
insert(title, "chỉ có [[third person|ngôi thứ ba]]")
elseif subtypes.impers then -- decet, advesperāscit (also nopass)
insert(title, "[[impersonal verb|không ngôi]]")
end
if subtypes.depon then -- dēmōlior, calvor (also noperf)
insert(title, "[[trung gian]]")
end
if subtypes.perfaspres then -- meminī, ōdī
insert(title, "không có thân [[hiện tại]]")
-- If semidepon is set, only the active forms are affected.
local voice = subtypes.semidepon and "[[chủ động]] " or ""
insert(title, ("%sDạng [[hoàn thành]] %snghĩa [[hiện tại]]"):format(voice, voice))
-- Clarify that deponency can only apply to the perfect.
if subtypes.semidepon then -- ōdī
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]]")
end
if subtypes.optsemidepon then
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]] (không cần thiết)")
end
else
if subtypes.semidepon then -- fīdō, gaudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]]")
end
if subtypes.optsemidepon then -- audeō, placeō, soleō, pudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]] (không cần thiết)")
end
end
if subtypes.imponly then -- cedo, apage
insert(title, "chỉ có lối [[mệnh lệnh]]")
end
if subtypes.nopass then -- coacēscō
insert(title, "không có dạng [[bị động]]")
end
local stems = {}
if subtypes.nopres then -- coepī; perfaspres already handles this above
insert(stems, "[[hiện tại]]")
end
if subtypes.noperf then
insert(stems, "[[hoàn thành]]")
end
if subtypes.nosup or subtypes.supfutractvonly then
insert(stems, "[[supine]]")
end
if #stems > 0 then
local extra = subtypes.supfutractvonly and " trừ [[phân từ]] [[tương lai]] [[chủ động]]]"
insert(title, ("không có thân từ %s%s"):format(m_table.serialCommaJoin(stems, {conj = "hoặc"}), #stems > 1 and "s" or "", extra or ""))
end
if subtypes.nofut then -- soleō
insert(title, "không có thì [[tương lai]]")
end
if subtypes.pass3only then -- praefundō
insert(title, "[[third person#English|third person]]-only in the [[passive voice#English|passive]]")
elseif subtypes.passimpers then -- abambulō
local msg = "[[impersonal verb#English|impersonal]] in the [[passive voice#English|passive]]"
if subtypes.passimpersold then -- possum
msg = msg .. " in [[Old Latin]]"
end
insert(title, msg)
end
if subtypes.noimp then -- volō
insert(title, "no [[imperative mood#English|imperative]]")
end
if irreg_processing and umatch(first_lemma, "d[īū]cō$") then -- dīcō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] short [[imperative mood#English|imperative]]")
end
if subtypes.nofutractvptc and not subtypes.nosup then -- fīō
insert(title, "no [[future tense#English|future]] [[active voice#English|active]] [[participle#English|participle]]")
end
if not (subtypes.nopres or subtypes.perfaspres or subtypes.imponly) then
if subtypes.noinf then -- inquam
insert(title, "no [[infinitive#English|infinitive]]")
end
if subtypes.noger then -- libet
insert(title, "no [[gerund#English|gerund]]")
end
end
if subtypes.shorta then -- dō
insert(title, ("[[Appendix:Latin irregular verbs|irregular]] short %s in most forms"):format(make_link(nil, "ă", "term")))
end
if irreg_processing then
if first_lemma:match("edō$") then -- edō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] alternative forms")
elseif first_lemma:match("fīō$") then -- fīō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] long " .. make_link(nil, "ī", "term"))
end
end
end
pos_functions["Động từ"] = function(def, args, data, infl_classes, title)
local m_la_verb = require("Module:la-verb")
local def1, def2
if def then
def1, def2 = def:match("^(.-):(.*)$")
end
local conjdata, typeinfo = m_la_verb.make_data(args, true, def1, def2)
local lemma_forms = conjdata.overriding_lemma
if not lemma_forms or #lemma_forms == 0 then
lemma_forms = m_la_verb.get_lemma_forms(conjdata, true)
end
data.heads = lemma_forms
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-verb}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = conjdata.id
local perf_only = false
local function insert_inflection(infl, label)
infl.label = label
insert(data.inflections, infl)
end
local inf = m_la_verb.get_valid_forms(conjdata.forms["pres_actv_inf"])
if #inf > 0 then
insert_inflection(inf, "nguyên mẫu ở thì hiện tại")
else
inf = m_la_verb.get_valid_forms(conjdata.forms["perf_actv_inf"])
if #inf > 0 then
perf_only = true
insert_inflection(inf, "nguyên mẫu ở thì hoàn thành")
end
end
if not perf_only then
local perf = m_la_verb.get_valid_forms(conjdata.forms["1s_perf_actv_indc"])
if #perf == 0 then
perf = m_la_verb.get_valid_forms(conjdata.forms["3s_perf_actv_indc"])
end
if #perf > 0 then
insert_inflection(perf, "chủ động ở thì hoàn thành")
end
end
local subtypes = typeinfo.subtypes
if not (subtypes.depon or subtypes.semidepon) then
local sup = m_la_verb.get_valid_forms(conjdata.forms["acc_sup"])
if #sup > 0 then
insert_inflection(sup, "danh động từ")
else
local fap = m_la_verb.get_valid_forms(conjdata.forms["futr_actv_ptc"])
if #fap > 0 then
insert_inflection(fap, "phân từ tương lai chủ động")
end
end
end
export.verb_title(title, typeinfo, lemma_forms)
end
pos_functions["Hậu tố-động từ"] = pos_functions["Động từ"]
local function attested_form(decldata, index)
local form
if (decldata.unattested[index]) then
form = { { term = '*' .. decldata.forms[index][1], nolink = true } }
else
form = decldata.forms[index]
end
return form
end
local function degree_derivations(comp, sup, data)
local inflections = data.inflections
if not (comp or sup) then
return
elseif (not comp or comp == "-") and (not sup or sup == "-") then
insert(inflections, {label = "không so sánh được"})
insert_if_not(data.categories, "Phó từ không so sánh được tiếng Latinh")
return
elseif comp == "-" then
insert(inflections, {label = "không có so sánh hơn"})
elseif comp then
insert(inflections, comp)
end
if sup == "-" then
insert(inflections, {label = "không có so sánh nhất"})
elseif sup then
insert(inflections, sup)
end
end
local function adjectives(pos, def, args, data, infl_classes)
local is_num = pos == "Số từ"
local decldata = require("Module:la-nominal").do_generate_adj_forms(args, pos, "headword", nil, def)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_adj_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.num == "pl" then
insert_if_not(categories, decldata.pos .. " chỉ có số nhiều tiếng Latinh")
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
if decldata.pos == "Phân từ" then
local lemma1 = lemma[1]
if lemma1:sub(-4) == "ndum" then
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
elseif lemma1:match("um$") then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
end
end
else
local lemma_num = decldata.num == "pl" and "pl" or "sg"
local masc = decldata.forms["nom_" .. lemma_num .. "_m"]
local fem = attested_form(decldata, "nom_" .. lemma_num .. "_f")
local neut = attested_form(decldata, "nom_" .. lemma_num .. "_n")
local gen = attested_form(decldata, "gen_" .. lemma_num .. "_m")
local acc = attested_form(decldata, "acc_" .. lemma_num .. "_m")
if decldata.pos == "participles" then
local masc1 = masc[1]
if masc1:sub(-5) == "ūrus" then
insert_if_not(categories, "Phân từ tương lai chủ động tiếng Latinh")
elseif masc1:sub(-4) == "ndus" then
-- FIXME, should rename to "Latin gerundives")
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
else
local masc1_final2 = masc1:sub(-2)
if masc1_final2 == "us" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
elseif masc1_final2 == "ns" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
else
error("Unrecognized participle ending: " .. masc1)
end
end
end
-- We display the inflections in three different ways to mimic the
-- old way of doing things:
--
-- 1. If masc and fem are different, show masc, fem and neut.
-- 2. Otherwise, if masc and neut are different, show masc and neut.
-- 3. Otherwise, show masc nominative and masc genitive.
if not form_is_empty(fem) and not deep_equals(masc, fem) then
fem.label = "giống cái"
insert(data.inflections, fem)
if not form_is_empty(neut) then
neut.label = "giống trung"
insert(data.inflections, neut)
end
elseif not form_is_empty(neut) and not deep_equals(masc, neut) then
neut.label = "giống cái"
insert(data.inflections, neut)
elseif not form_is_empty(gen) then
gen.label = "sinh cách"
insert(data.inflections, gen)
elseif not form_is_empty(acc) then
acc.label = "đối cách"
insert(data.inflections, acc)
end
insert(infl_classes, decldata.title)
end
local comp = normalize_derivation(decldata.comp, "so sánh hơn")
local sup = normalize_derivation(decldata.sup, "so sánh nhất")
degree_derivations(comp, sup, data)
derivation(data, decldata, "adv", "Phó từ")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return decldata.pos
end
pos_functions["Tính từ"] = function(def, args, data, infl_classes, title)
return adjectives("Tính từ", def, args, data, infl_classes, title)
end
pos_functions["Phân từ"] = function(def, args, data, infl_classes, title)
return adjectives("Phân từ", def, args, data, infl_classes, title)
end
pos_functions["Từ hạn định"] = function(def, args, data, infl_classes, title)
return adjectives("Từ hạn định", def, args, data, infl_classes, title)
end
pos_functions["Đại từ"] = function(def, args, data, infl_classes, title)
return adjectives("Đại từ", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-hậu tố"] = function(def, args, data, infl_classes, title)
return adjectives("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-số từ"] = function(def, args, data, infl_classes, title)
return adjectives("Số từ", def, args, data, infl_classes, title)
end
pos_functions["Phó từ"] = function(def, args, data)
local sublist = {sublist = "/"}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {alias_of = "comp"},
[3] = {alias_of = "sup"},
["head"] = {list = true, required = true},
["comp"] = sublist,
["sup"] = sublist,
["adj"] = sublist,
["id"] = true,
})
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
local comp, sup = args.comp, args.sup
local irreg = false
if comp then
if comp[1] == "-" then
comp = "-"
elseif comp[1] == nil then
comp = nil
else
comp.label = glossary_link("so sánh hơn")
comp = args.comp
irreg = true
end
end
if sup then
if sup[1] == "-" then
sup = "-"
elseif sup[1] == nil then
sup = nil
else
sup.label = glossary_link("so sánh nhất")
sup = args.sup
irreg = true
end
end
local categories = data.categories
if irreg then
insert_if_not(categories, "Phó từ bất quy tắc tiếng Latinh")
end
if not (comp or sup) then
local default_comp = {label = glossary_link("so sánh hơn")}
local default_sup = {label = glossary_link("so sánh nhất")}
for _, head in ipairs(args.head) do
local stem = nil
for _, suff in ipairs{"iter", "nter", "ter", "er", "iē", "ē", "rā", "im", "ō"} do
stem = head:match("(.*)" .. pattern_escape(suff) .. "$")
comp_suff, sup_suff = "ius", "issimē"
if stem ~= nil then
if suff == "nter" then
stem = stem .. "nt"
elseif suff == "rā" then
comp_suff = "er" .. comp_suff
sup_suff = "imē"
end
insert(default_comp, stem .. comp_suff)
insert(default_sup, stem .. sup_suff)
break
end
end
if not stem then
error("Unrecognized adverb type, recognized types are “-ē”, “-er”, “-ter”, “-iter”, “-im”, or “-ō”, “-ra” or specify irregular forms or “-” if incomparable.")
end
end
comp = comp or default_comp
sup = sup or default_sup
end
degree_derivations(comp, sup, data)
derivation(data, args, "adj", "Tính từ")
end
pos_functions["Phó từ-hậu tố"] = pos_functions["Phó từ"]
local function get_forms(forms)
if #forms == 0 then
return nil
end
local i, attested = 1, false
while true do
local form = forms[i]
if form == nil then
return forms, attested
elseif form == "-" then
remove(forms, i)
else
if not (attested or get_plaintext(form):sub(1, 1) == "*") then
attested = true
end
i = i + 1
end
end
end
local function degree(pos, deg, pos_func, other_pos, other_pos_label, other_deg, other_deg_label, args, data, infl_classes)
local list = {list = true}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
["head"] = list,
["positive"] = list,
[other_pos] = {sublist = "/"},
[other_deg] = list,
["id"] = true,
})
data.no_redundant_head_cat = #args.head == 0
-- Set default manually so we can tell whether the user specified head=.
if #args.head == 0 then
args.head = {PAGENAME}
end
data.heads = args.head
data.id = args.id
insert(data.inflections, {label = deg})
if pos_func then
pos_func(args, data, infl_classes)
end
local positive, positive_attested = get_forms(args.positive)
if positive then
if not positive_attested then
insert(data.categories, pos .. " chỉ có " .. deg .. " tiếng Latinh")
end
if #positive > 0 then
args.positive.label = "khẳng định"
insert(data.inflections, args.positive)
else
insert(data.inflections, {label = "không có dạng khẳng định"})
end
end
local other = get_forms(args[other_deg])
if other then
if #other > 0 then
args[other_deg].label = other_deg_label
insert(data.inflections, args[other_deg])
else
insert(data.inflections, {label = "không có dạng " .. other_deg_label})
end
end
derivation(data, args, other_pos, other_pos_label)
-- If a lemma, return the primary part of speech ("adjectives" or
-- "adverbs"), so that the term is categorized in "Latin adjectives" or
-- "Latin adverbs". Otherwise, return nothing, so that the term goes in the
-- relevant non-lemma category (e.g. "Latin comparative adjectives"), and
-- into "Latin non-lemma forms".
if positive and not positive_attested then
return pos
end
end
local function comp_adj(args, data, infl_classes)
insert(infl_classes, "[[Appendix:Latin third declension|third declension]]")
local n = {label = "neuter"}
for _, head in ipairs(args.head) do
local neuter = head:gsub("or$", "us")
insert(n, neuter)
end
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function sup_adj(args, data, infl_classes)
insert(infl_classes, "[[Phụ lục:Biến cách loại 1 tiếng Latinh|loại 1]]")
insert(infl_classes, "[[Phụ lục:Biến cách loại 2 tiếng Latinh|biến cách loại 2]]")
local f, n = {label = "giống cái"}, {label = "giống trung"}
for _, head in ipairs(args.head) do
local stem = head:gsub("us$", "")
insert(f, stem .. "a")
insert(n, stem .. "um")
end
insert(data.inflections, f)
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function adpositions(pos, def, args, data, infl_classes, title, postscript)
local cases = invert(require("Module:la-utilities").cases)
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {list = true, set = keys_to_list(cases)},
["head"] = {list = true, required = true},
["id"] = true,
})
-- Case names are supplied in numbered arguments, optionally preceded by
-- headwords.
cases = args[2]
for i = 1, #cases do
for j = i + 1, #cases do
if cases[i] == cases[j] then
error("Duplicate case")
end
end
local case = cases[i]
local appendix_link = glossary_link(case)
if i == 1 then
appendix_link = "+ " .. appendix_link
end
insert(postscript, appendix_link)
insert_if_not(data.categories, "Latin " .. pos .. " governing the " .. case)
end
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
end
pos_functions["Giới từ"] = function(...)
return adpositions("prepositions", ...)
end
pos_functions["Hậu giới từ"] = function(...)
return adpositions("postpositions", ...)
end
pos_functions["Danh động từ"] = function(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = "labōrandum"}, -- headword
[2] = true, -- gerundive
})
data.heads = {args[1]}
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
insert(data.inflections, {label = "[[Phụ lục:Từ điển thuật ngữ#đối cách|đối cách]]"})
local stem = args[1]:match("^(.*)um$")
if not stem then
error("Unrecognized gerund ending: " .. stem)
end
if args[2] == "-" then
insert(data.inflections, {label = "không có [[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
else
insert(data.inflections, {[1] = args[2] or stem .. "us", label = "[[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
end
end
local function non_lemma_forms(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = def}, -- headword or cases
["head"] = {list = true, require_index = true},
["g"] = {list = true},
["id"] = true,
})
local heads = {args[1]}
for _, head in ipairs(args.head) do
insert(heads, head)
end
data.heads = heads
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
data.genders = args.g
data.id = args.id
end
pos_functions["Biến thể hình thái danh từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh từ riêng"] = non_lemma_forms
pos_functions["Biến thể hình thái đại từ"] = non_lemma_forms
pos_functions["Biến thể hình thái động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái tính từ"] = non_lemma_forms
pos_functions["Biến thể hình thái phân từ"] = non_lemma_forms
pos_functions["Biến thể hình thái từ hạn định"] = non_lemma_forms
pos_functions["Biến thể hình thái số từ"] = non_lemma_forms
pos_functions["Biến thể hình thái hậu tố"] = non_lemma_forms
return export
8hqn6ty1yjsmh108q82kwk0frm9gu4i
2561561
2561559
2026-09-08T02:29:40Z
Hiyuune
50834
2561561
Scribunto
text/plain
-- TODO: handle "-old" subtypes generally, appending "in Old Latin", where terms have additional OL inflections.
local export = {}
local pos_functions = {}
local string_utilities = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local form_is_empty = require("Module:la-utilities").form_is_empty
local insert = table.insert
local remove = table.remove
local umatch = mw.ustring.match
local lang = require("Module:languages").getByCode("la")
local NAMESPACE = mw.title.getCurrentTitle().nsText
local PAGENAME = mw.loadData("Module:headword/data").pagename
local legal_gender = {
["m"] = true,
["f"] = true,
["n"] = true,
["?"] = true,
["?!"] = true,
}
local declension_to_vi = {
["1"] = "loại 1",
["2"] = "loại 2",
["3"] = "loại 3",
["4"] = "loại 4",
["5"] = "loại 5",
}
local gender_names = {
["m"] = "giống đực",
["f"] = "giống cái",
["n"] = "giống trung",
["?"] = "không rõ giống",
["?!"] = "giống chưa chứng thực",
}
local function deep_equals(...)
deep_equals = require(table_module).deepEquals
return deep_equals(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function invert(...)
invert = require(table_module).invert
return invert(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities).pattern_escape
return pattern_escape(...)
end
local function serial_comma_join(...)
serial_comma_join = require(table_module).serialCommaJoin
return serial_comma_join(...)
end
local function split(...)
split = require(string_utilities).split
return split(...)
end
local function ulower(...)
ulower = require(string_utilities).lower
return ulower(...)
end
local function format(array, concatenater)
if #array == 0 then
return ""
end
local concatenated = concat(array, concatenater)
if concatenated == "" then
return ""
elseif concatenated:sub(-1) == "'" then
concatenated = concatenated .. " "
end
return "; ''" .. concatenated .. "''"
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[Phụ lục:Từ điển thuật ngữ#" .. anchor .. "|" .. text .. "]]"
end
local function make_link(page, display, face, accel)
return require("Module:links").full_link({term = page, alt = display, lang = lang, accel = accel}, face)
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local iargs = require("Module:parameters").process(frame.args, {
[1] = {required = true},
["def"] = true,
["suff_type"] = true,
})
local args = frame:getParent().args
local poscat = iargs[1]
local def = iargs.def
local suff_type = iargs.suff_type
local postype = nil
if suff_type then
postype = poscat .. '-' .. suff_type
else
postype = poscat
end
local data = {lang = lang, categories = {}, heads = {}, genders = {}, inflections = {}}
local infl_classes = {}
local title = {}
local postscript = {}
if poscat == "Hậu tố" then
insert_if_not(data.categories, "Dạng hậu tố " .. suff_type .. " tiếng Latinh")
end
if pos_functions[postype] then
local new_poscat = pos_functions[postype](def, args, data, infl_classes, title, postscript)
if new_poscat then
poscat = new_poscat
end
end
data.pos_category = poscat
postscript = concat(postscript, ", ")
return
require("Module:headword").full_headword(data)
.. format(infl_classes, "/")
.. format(title, ", ")
.. (postscript ~= "" and " (" .. postscript .. ")" or "")
end
local function process_num_type(numtype, categories)
if numtype == "card" then
insert_if_not(categories, "Số đếm tiếng Latinh")
elseif numtype == "ord" then
insert_if_not(categories, "Số thứ tự tiếng Latinh")
elseif numtype == "frac" then
insert_if_not(categories, "Phân số tiếng Latinh")
elseif numtype == "dist" then
insert_if_not(categories, "Số phân phối tiếng Latinh")
elseif numtype == "mul" then
insert_if_not(categories, "Số nhân tiếng Latinh")
elseif numtype == "coll" then
insert_if_not(categories, "Số tập hợp tiếng Latinh")
elseif numtype then
error("Unrecognized numeral type '" .. numtype .. "'")
end
end
local function normalize_derivation(deriv, anchor, text)
if not deriv then
return nil
end
local deriv1 = deriv[1]
if not deriv1 or deriv1 == "-" then
return deriv1
end
deriv.label = glossary_link(anchor, text)
return deriv
end
local function derivation(data, decldata, arg, anchor, text)
local der = normalize_derivation(decldata[arg], anchor, text)
if der and der ~= "-" then
insert(data.inflections, der)
end
end
local function nouns(pos, def, args, data, infl_classes, title)
local is_num = pos == "Số từ"
local is_pn = false
if pos == "Danh từ riêng" then
is_pn = true
pos = "Danh từ"
end
local decldata = require("Module:la-nominal").do_generate_noun_forms(args, pos, "headword", def, is_num)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_noun_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local genders = decldata.overriding_genders
if #genders == 0 then
if decldata.gender then
genders = {ulower(decldata.gender)}
elseif not is_num then
error("No gender explicitly specified in headword template using g=, and can't infer gender from lemma spec")
end
end
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
local gender = g:match("^(.[\128-\191]*)%-[sp]$")
if not gender then
gender = g
end
if not legal_gender[gender] then
error("Gender “" .. gender .. "” is not a valid Latin gender.")
end
insert(data.genders, g)
insert_if_not(categories, decldata.pos .. " " .. gender_names[gender] .. " không biến cách tiếng Latinh")
end
else
local is_irreg = false
local is_indecl = false
local is_decl = false
local has_multiple_decls = false
local has_multiple_variants = false
-- flatten declension specs
local decls = {}
for _, g in ipairs(genders) do
if not legal_gender[g] then
error("Gender “" .. g .. "” is not a valid Latin gender.")
elseif decldata.num == "pl" then
g = g .. "-p"
elseif decldata.num == "sg" then
g = g .. "-s"
end
insert(data.genders, g)
end
local function process_decl(decl_list, props)
local headword_decl = props.headword_decl
-- skip adjectival declensions
if headword_decl:match("+$") then
return
elseif props.decl == "irreg" then
is_irreg = true
headword_decl = headword_decl:match("^irreg/(.*)$") or headword_decl
local irreg_decls = split(headword_decl, ",")
if #irreg_decls > 1 then
has_multiple_decls = true
end
for _, d in ipairs(irreg_decls) do
if d == "indecl" or d == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, d)
end
else
if headword_decl == "indecl" or headword_decl == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, headword_decl)
end
end
for _, props in ipairs(decldata.propses) do
if props.headword_decl then
process_decl(decls, props)
else
local alternant_decls = {}
for _, alternant in ipairs(props) do
for _, single_props in ipairs(alternant) do
process_decl(alternant_decls, single_props)
end
end
if #alternant_decls > 1 then
has_multiple_decls = true
elseif #decls > 1 then
has_multiple_variants = true
end
for _, d in ipairs(alternant_decls) do
insert_if_not(decls, d)
end
end
end
if is_indecl and is_decl then
has_multiple_decls = true
end
if has_multiple_decls then
insert_if_not(categories, decldata.pos .. " có nhiều loại biến cách tiếng Latinh")
end
if has_multiple_variants then
insert_if_not(categories, decldata.pos .. " có nhiều biến thể ở biến cách đơn tiếng Latinh")
end
if is_irreg then
insert(title, glossary_link("bất quy tắc"))
insert_if_not(categories, decldata.pos .. " bất quy tắc tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " bất quy tắc tiếng Latinh")
end
end
if is_indecl then
if is_decl then
insert(title, glossary_link("không biến cách"))
else
insert(data.inflections, {label = glossary_link("không biến cách")})
end
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " không biến cách tiếng Latinh")
end
end
if #decls > 1 then
insert(title, "biến cách nhiều loại")
end
for _, decl in ipairs(decls) do
if not (decl == "0" or decl == "indecl" or decl == "sgpl" or decl == "irreg") then
local decl_class = declension_to_vi[decl]
if not decl_class then
error("Internal error: declension '" .. decl .. "' not recognized")
end
insert(title, "[[Phụ lục:Biến cách " .. decl_class .. " tiếng Latinh|" .. decl_class .. " declension]]")
insert_if_not(categories, decldata.pos .. " biến cách " .. decl_class .. " tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " biến cách " .. decl_class .. " tiếng Latinh")
end
end
end
local lemma_num = decldata.num == "pl" and "pl" or "sg"
if NAMESPACE == "Từ_tái_tạo" then
-- For reconstructed nouns:
if data.genders[1] == 'n' and lemma_num == 'sg' then
-- singular neuter nouns give a plural
local pl = decldata.forms["nom_pl"]
if pl and pl ~= "" and #pl > 0 then
pl.label = "số nhiều"
insert(data.inflections, pl)
end
else
-- all others give an oblique
local obl = decldata.forms["acc_" .. lemma_num]
if obl and obl ~= "" and #obl > 0 then
obl.label = "bổ cách"
insert(data.inflections, obl)
end
end
else
local gen = decldata.forms["gen_" .. lemma_num]
if (decldata.unattested["gen_" .. lemma_num]) then
gen[1] = '*' .. gen[1]
data.nolink = true
end
if gen and gen ~= "" and gen ~= "—" and #gen > 0 then
if is_decl then
-- Skip displaying the genitive for nouns that are only
-- indeclinable. But we do display it for nouns like Abrahām
-- and Ādām that can be either indeclinable or declined.
gen.label = "sinh cách"
insert(data.inflections, gen)
end
else
insert(data.inflections, {label = "không có sinh cách"})
insert_if_not(categories, decldata.pos .. " không có sinh cách tiếng Latinh")
end
end
end
derivation(data, decldata, "m", "giống đực")
derivation(data, decldata, "f", "giống cái")
derivation(data, decldata, "n", "giống trung")
derivation(data, decldata, "adj", "quan hệ", "tính từ quan hệ")
derivation(data, decldata, "dim", "giảm nhẹ nghĩa")
derivation(data, decldata, "aug", "tăng nhẹ nghĩa")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return is_pn and decldata.pos == "Danh từ" and "Danh từ riêng" or decldata.pos
end
pos_functions["Danh từ"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ", def, args, data, infl_classes, title)
end
pos_functions["Danh từ riêng"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ riêng", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-hậu tố"] = function(def, args, data, infl_classes, title)
return nouns("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-số từ"] = function(def, args, data, infl_classes, title)
return nouns("Số từ", def, args, data, infl_classes, title)
end
function export.verb_title(title, typeinfo, lemma_forms)
local conj = typeinfo.conj
local irreg_processing = typeinfo.irreg
local subtypes = typeinfo.subtypes
local first_lemma = ""
if #lemma_forms > 0 then
first_lemma = require("Module:links").remove_links(lemma_forms[1])
end
if conj == "1st" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 1|cách chia loại 1]]")
elseif conj == "2nd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 2|cách chia loại 2]]")
elseif conj == "3rd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]]")
elseif conj == "3rd-io" then
insert(title, ("[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]] %s-variant"):format(make_link(nil, "iō", "term")))
elseif conj == "4th" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 4|cách chia loại 4]]")
elseif conj == "irreg" then -- sum
insert(title, "[[Phụ lục:Động từ bất quy tắc tiếng Latinh|cách chia bất quy tắc]]")
end
if subtypes.highlydef then -- āiō, inquam
insert(title, "rất [[khiếm khuyết]]")
end
if subtypes.suppl then -- sum, volō
insert(title, "[[bổ khuyết]]")
end
if subtypes["3only"] then -- decet
insert(title, "chỉ có [[third person|ngôi thứ ba]]")
elseif subtypes.impers then -- decet, advesperāscit (also nopass)
insert(title, "[[impersonal verb|không ngôi]]")
end
if subtypes.depon then -- dēmōlior, calvor (also noperf)
insert(title, "[[trung gian]]")
end
if subtypes.perfaspres then -- meminī, ōdī
insert(title, "không có thân [[hiện tại]]")
-- If semidepon is set, only the active forms are affected.
local voice = subtypes.semidepon and "[[chủ động]] " or ""
insert(title, ("%sDạng [[hoàn thành]] %snghĩa [[hiện tại]]"):format(voice, voice))
-- Clarify that deponency can only apply to the perfect.
if subtypes.semidepon then -- ōdī
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]]")
end
if subtypes.optsemidepon then
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]] (không cần thiết)")
end
else
if subtypes.semidepon then -- fīdō, gaudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]]")
end
if subtypes.optsemidepon then -- audeō, placeō, soleō, pudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]] (không cần thiết)")
end
end
if subtypes.imponly then -- cedo, apage
insert(title, "chỉ có lối [[mệnh lệnh]]")
end
if subtypes.nopass then -- coacēscō
insert(title, "không có dạng [[bị động]]")
end
local stems = {}
if subtypes.nopres then -- coepī; perfaspres already handles this above
insert(stems, "[[hiện tại]]")
end
if subtypes.noperf then
insert(stems, "[[hoàn thành]]")
end
if subtypes.nosup or subtypes.supfutractvonly then
insert(stems, "[[supine]]")
end
if #stems > 0 then
local extra = subtypes.supfutractvonly and " trừ [[phân từ]] [[tương lai]] [[chủ động]]]"
insert(title, ("không có thân từ %s%s"):format(m_table.serialCommaJoin(stems, {conj = "hoặc"}), #stems > 1 and "s" or "", extra or ""))
end
if subtypes.nofut then -- soleō
insert(title, "không có thì [[tương lai]]")
end
if subtypes.pass3only then -- praefundō
insert(title, "[[third person#English|third person]]-only in the [[passive voice#English|passive]]")
elseif subtypes.passimpers then -- abambulō
local msg = "[[impersonal verb#English|impersonal]] in the [[passive voice#English|passive]]"
if subtypes.passimpersold then -- possum
msg = msg .. " in [[Old Latin]]"
end
insert(title, msg)
end
if subtypes.noimp then -- volō
insert(title, "no [[imperative mood#English|imperative]]")
end
if irreg_processing and umatch(first_lemma, "d[īū]cō$") then -- dīcō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] short [[imperative mood#English|imperative]]")
end
if subtypes.nofutractvptc and not subtypes.nosup then -- fīō
insert(title, "no [[future tense#English|future]] [[active voice#English|active]] [[participle#English|participle]]")
end
if not (subtypes.nopres or subtypes.perfaspres or subtypes.imponly) then
if subtypes.noinf then -- inquam
insert(title, "no [[infinitive#English|infinitive]]")
end
if subtypes.noger then -- libet
insert(title, "no [[gerund#English|gerund]]")
end
end
if subtypes.shorta then -- dō
insert(title, ("[[Appendix:Latin irregular verbs|irregular]] short %s in most forms"):format(make_link(nil, "ă", "term")))
end
if irreg_processing then
if first_lemma:match("edō$") then -- edō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] alternative forms")
elseif first_lemma:match("fīō$") then -- fīō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] long " .. make_link(nil, "ī", "term"))
end
end
end
pos_functions["Động từ"] = function(def, args, data, infl_classes, title)
local m_la_verb = require("Module:la-verb")
local def1, def2
if def then
def1, def2 = def:match("^(.-):(.*)$")
end
local conjdata, typeinfo = m_la_verb.make_data(args, true, def1, def2)
local lemma_forms = conjdata.overriding_lemma
if not lemma_forms or #lemma_forms == 0 then
lemma_forms = m_la_verb.get_lemma_forms(conjdata, true)
end
data.heads = lemma_forms
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-verb}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = conjdata.id
local perf_only = false
local function insert_inflection(infl, label)
infl.label = label
insert(data.inflections, infl)
end
local inf = m_la_verb.get_valid_forms(conjdata.forms["pres_actv_inf"])
if #inf > 0 then
insert_inflection(inf, "nguyên mẫu ở thì hiện tại")
else
inf = m_la_verb.get_valid_forms(conjdata.forms["perf_actv_inf"])
if #inf > 0 then
perf_only = true
insert_inflection(inf, "nguyên mẫu ở thì hoàn thành")
end
end
if not perf_only then
local perf = m_la_verb.get_valid_forms(conjdata.forms["1s_perf_actv_indc"])
if #perf == 0 then
perf = m_la_verb.get_valid_forms(conjdata.forms["3s_perf_actv_indc"])
end
if #perf > 0 then
insert_inflection(perf, "chủ động ở thì hoàn thành")
end
end
local subtypes = typeinfo.subtypes
if not (subtypes.depon or subtypes.semidepon) then
local sup = m_la_verb.get_valid_forms(conjdata.forms["acc_sup"])
if #sup > 0 then
insert_inflection(sup, "danh động từ")
else
local fap = m_la_verb.get_valid_forms(conjdata.forms["futr_actv_ptc"])
if #fap > 0 then
insert_inflection(fap, "phân từ tương lai chủ động")
end
end
end
export.verb_title(title, typeinfo, lemma_forms)
end
pos_functions["Hậu tố-động từ"] = pos_functions["Động từ"]
local function attested_form(decldata, index)
local form
if (decldata.unattested[index]) then
form = { { term = '*' .. decldata.forms[index][1], nolink = true } }
else
form = decldata.forms[index]
end
return form
end
local function degree_derivations(comp, sup, data)
local inflections = data.inflections
if not (comp or sup) then
return
elseif (not comp or comp == "-") and (not sup or sup == "-") then
insert(inflections, {label = "không so sánh được"})
insert_if_not(data.categories, "Phó từ không so sánh được tiếng Latinh")
return
elseif comp == "-" then
insert(inflections, {label = "không có so sánh hơn"})
elseif comp then
insert(inflections, comp)
end
if sup == "-" then
insert(inflections, {label = "không có so sánh nhất"})
elseif sup then
insert(inflections, sup)
end
end
local function adjectives(pos, def, args, data, infl_classes)
local is_num = pos == "Số từ"
local decldata = require("Module:la-nominal").do_generate_adj_forms(args, pos, "headword", nil, def)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_adj_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.num == "pl" then
insert_if_not(categories, decldata.pos .. " chỉ có số nhiều tiếng Latinh")
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
if decldata.pos == "Phân từ" then
local lemma1 = lemma[1]
if lemma1:sub(-4) == "ndum" then
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
elseif lemma1:match("um$") then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
end
end
else
local lemma_num = decldata.num == "pl" and "pl" or "sg"
local masc = decldata.forms["nom_" .. lemma_num .. "_m"]
local fem = attested_form(decldata, "nom_" .. lemma_num .. "_f")
local neut = attested_form(decldata, "nom_" .. lemma_num .. "_n")
local gen = attested_form(decldata, "gen_" .. lemma_num .. "_m")
local acc = attested_form(decldata, "acc_" .. lemma_num .. "_m")
if decldata.pos == "participles" then
local masc1 = masc[1]
if masc1:sub(-5) == "ūrus" then
insert_if_not(categories, "Phân từ tương lai chủ động tiếng Latinh")
elseif masc1:sub(-4) == "ndus" then
-- FIXME, should rename to "Latin gerundives")
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
else
local masc1_final2 = masc1:sub(-2)
if masc1_final2 == "us" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
elseif masc1_final2 == "ns" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
else
error("Unrecognized participle ending: " .. masc1)
end
end
end
-- We display the inflections in three different ways to mimic the
-- old way of doing things:
--
-- 1. If masc and fem are different, show masc, fem and neut.
-- 2. Otherwise, if masc and neut are different, show masc and neut.
-- 3. Otherwise, show masc nominative and masc genitive.
if not form_is_empty(fem) and not deep_equals(masc, fem) then
fem.label = "giống cái"
insert(data.inflections, fem)
if not form_is_empty(neut) then
neut.label = "giống trung"
insert(data.inflections, neut)
end
elseif not form_is_empty(neut) and not deep_equals(masc, neut) then
neut.label = "giống cái"
insert(data.inflections, neut)
elseif not form_is_empty(gen) then
gen.label = "sinh cách"
insert(data.inflections, gen)
elseif not form_is_empty(acc) then
acc.label = "đối cách"
insert(data.inflections, acc)
end
insert(infl_classes, decldata.title)
end
local comp = normalize_derivation(decldata.comp, "so sánh hơn")
local sup = normalize_derivation(decldata.sup, "so sánh nhất")
degree_derivations(comp, sup, data)
derivation(data, decldata, "adv", "Phó từ")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return decldata.pos
end
pos_functions["Tính từ"] = function(def, args, data, infl_classes, title)
return adjectives("Tính từ", def, args, data, infl_classes, title)
end
pos_functions["Phân từ"] = function(def, args, data, infl_classes, title)
return adjectives("Phân từ", def, args, data, infl_classes, title)
end
pos_functions["Từ hạn định"] = function(def, args, data, infl_classes, title)
return adjectives("Từ hạn định", def, args, data, infl_classes, title)
end
pos_functions["Đại từ"] = function(def, args, data, infl_classes, title)
return adjectives("Đại từ", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-hậu tố"] = function(def, args, data, infl_classes, title)
return adjectives("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-số từ"] = function(def, args, data, infl_classes, title)
return adjectives("Số từ", def, args, data, infl_classes, title)
end
pos_functions["Phó từ"] = function(def, args, data)
local sublist = {sublist = "/"}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {alias_of = "comp"},
[3] = {alias_of = "sup"},
["head"] = {list = true, required = true},
["comp"] = sublist,
["sup"] = sublist,
["adj"] = sublist,
["id"] = true,
})
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
local comp, sup = args.comp, args.sup
local irreg = false
if comp then
if comp[1] == "-" then
comp = "-"
elseif comp[1] == nil then
comp = nil
else
comp.label = glossary_link("so sánh hơn")
comp = args.comp
irreg = true
end
end
if sup then
if sup[1] == "-" then
sup = "-"
elseif sup[1] == nil then
sup = nil
else
sup.label = glossary_link("so sánh nhất")
sup = args.sup
irreg = true
end
end
local categories = data.categories
if irreg then
insert_if_not(categories, "Phó từ bất quy tắc tiếng Latinh")
end
if not (comp or sup) then
local default_comp = {label = glossary_link("so sánh hơn")}
local default_sup = {label = glossary_link("so sánh nhất")}
for _, head in ipairs(args.head) do
local stem = nil
for _, suff in ipairs{"iter", "nter", "ter", "er", "iē", "ē", "rā", "im", "ō"} do
stem = head:match("(.*)" .. pattern_escape(suff) .. "$")
comp_suff, sup_suff = "ius", "issimē"
if stem ~= nil then
if suff == "nter" then
stem = stem .. "nt"
elseif suff == "rā" then
comp_suff = "er" .. comp_suff
sup_suff = "imē"
end
insert(default_comp, stem .. comp_suff)
insert(default_sup, stem .. sup_suff)
break
end
end
if not stem then
error("Unrecognized adverb type, recognized types are “-ē”, “-er”, “-ter”, “-iter”, “-im”, or “-ō”, “-ra” or specify irregular forms or “-” if incomparable.")
end
end
comp = comp or default_comp
sup = sup or default_sup
end
degree_derivations(comp, sup, data)
derivation(data, args, "adj", "Tính từ")
end
pos_functions["Phó từ-hậu tố"] = pos_functions["Phó từ"]
local function get_forms(forms)
if #forms == 0 then
return nil
end
local i, attested = 1, false
while true do
local form = forms[i]
if form == nil then
return forms, attested
elseif form == "-" then
remove(forms, i)
else
if not (attested or get_plaintext(form):sub(1, 1) == "*") then
attested = true
end
i = i + 1
end
end
end
local function degree(pos, deg, pos_func, other_pos, other_pos_label, other_deg, other_deg_label, args, data, infl_classes)
local list = {list = true}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
["head"] = list,
["positive"] = list,
[other_pos] = {sublist = "/"},
[other_deg] = list,
["id"] = true,
})
data.no_redundant_head_cat = #args.head == 0
-- Set default manually so we can tell whether the user specified head=.
if #args.head == 0 then
args.head = {PAGENAME}
end
data.heads = args.head
data.id = args.id
insert(data.inflections, {label = deg})
if pos_func then
pos_func(args, data, infl_classes)
end
local positive, positive_attested = get_forms(args.positive)
if positive then
if not positive_attested then
insert(data.categories, pos .. " chỉ có " .. deg .. " tiếng Latinh")
end
if #positive > 0 then
args.positive.label = "khẳng định"
insert(data.inflections, args.positive)
else
insert(data.inflections, {label = "không có dạng khẳng định"})
end
end
local other = get_forms(args[other_deg])
if other then
if #other > 0 then
args[other_deg].label = other_deg_label
insert(data.inflections, args[other_deg])
else
insert(data.inflections, {label = "không có dạng " .. other_deg_label})
end
end
derivation(data, args, other_pos, other_pos_label)
-- If a lemma, return the primary part of speech ("adjectives" or
-- "adverbs"), so that the term is categorized in "Latin adjectives" or
-- "Latin adverbs". Otherwise, return nothing, so that the term goes in the
-- relevant non-lemma category (e.g. "Latin comparative adjectives"), and
-- into "Latin non-lemma forms".
if positive and not positive_attested then
return pos
end
end
local function comp_adj(args, data, infl_classes)
insert(infl_classes, "[[Appendix:Latin third declension|third declension]]")
local n = {label = "neuter"}
for _, head in ipairs(args.head) do
local neuter = head:gsub("or$", "us")
insert(n, neuter)
end
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function sup_adj(args, data, infl_classes)
insert(infl_classes, "[[Phụ lục:Biến cách loại 1 tiếng Latinh|loại 1]]")
insert(infl_classes, "[[Phụ lục:Biến cách loại 2 tiếng Latinh|biến cách loại 2]]")
local f, n = {label = "giống cái"}, {label = "giống trung"}
for _, head in ipairs(args.head) do
local stem = head:gsub("us$", "")
insert(f, stem .. "a")
insert(n, stem .. "um")
end
insert(data.inflections, f)
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function adpositions(pos, def, args, data, infl_classes, title, postscript)
local cases = invert(require("Module:la-utilities").cases)
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {list = true, set = keys_to_list(cases)},
["head"] = {list = true, required = true},
["id"] = true,
})
-- Case names are supplied in numbered arguments, optionally preceded by
-- headwords.
cases = args[2]
for i = 1, #cases do
for j = i + 1, #cases do
if cases[i] == cases[j] then
error("Duplicate case")
end
end
local case = cases[i]
local appendix_link = glossary_link(case)
if i == 1 then
appendix_link = "+ " .. appendix_link
end
insert(postscript, appendix_link)
insert_if_not(data.categories, "Latin " .. pos .. " governing the " .. case)
end
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
end
pos_functions["Giới từ"] = function(...)
return adpositions("prepositions", ...)
end
pos_functions["Hậu giới từ"] = function(...)
return adpositions("postpositions", ...)
end
pos_functions["Danh động từ"] = function(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = "labōrandum"}, -- headword
[2] = true, -- gerundive
})
data.heads = {args[1]}
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
insert(data.inflections, {label = "[[Phụ lục:Từ điển thuật ngữ#đối cách|đối cách]]"})
local stem = args[1]:match("^(.*)um$")
if not stem then
error("Unrecognized gerund ending: " .. stem)
end
if args[2] == "-" then
insert(data.inflections, {label = "không có [[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
else
insert(data.inflections, {[1] = args[2] or stem .. "us", label = "[[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
end
end
local function non_lemma_forms(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = def}, -- headword or cases
["head"] = {list = true, require_index = true},
["g"] = {list = true},
["id"] = true,
})
local heads = {args[1]}
for _, head in ipairs(args.head) do
insert(heads, head)
end
data.heads = heads
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
data.genders = args.g
data.id = args.id
end
pos_functions["Biến thể hình thái danh từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh từ riêng"] = non_lemma_forms
pos_functions["Biến thể hình thái đại từ"] = non_lemma_forms
pos_functions["Biến thể hình thái động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái tính từ"] = non_lemma_forms
pos_functions["Biến thể hình thái phân từ"] = non_lemma_forms
pos_functions["Biến thể hình thái từ hạn định"] = non_lemma_forms
pos_functions["Biến thể hình thái số từ"] = non_lemma_forms
pos_functions["Biến thể hình thái hậu tố"] = non_lemma_forms
return export
ph2pwzmgja31ucx09rhwkhhym92hfsw
2561562
2561561
2026-09-08T02:30:15Z
Hiyuune
50834
2561562
Scribunto
text/plain
-- TODO: handle "-old" subtypes generally, appending "in Old Latin", where terms have additional OL inflections.
local export = {}
local pos_functions = {}
local string_utilities = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local form_is_empty = require("Module:la-utilities").form_is_empty
local insert = table.insert
local remove = table.remove
local umatch = mw.ustring.match
local lang = require("Module:languages").getByCode("la")
local NAMESPACE = mw.title.getCurrentTitle().nsText
local PAGENAME = mw.loadData("Module:headword/data").pagename
local legal_gender = {
["m"] = true,
["f"] = true,
["n"] = true,
["?"] = true,
["?!"] = true,
}
local declension_to_vi = {
["1"] = "loại 1",
["2"] = "loại 2",
["3"] = "loại 3",
["4"] = "loại 4",
["5"] = "loại 5",
}
local gender_names = {
["m"] = "giống đực",
["f"] = "giống cái",
["n"] = "giống trung",
["?"] = "không rõ giống",
["?!"] = "giống chưa chứng thực",
}
local function deep_equals(...)
deep_equals = require(table_module).deepEquals
return deep_equals(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function invert(...)
invert = require(table_module).invert
return invert(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities).pattern_escape
return pattern_escape(...)
end
local function serial_comma_join(...)
serial_comma_join = require(table_module).serialCommaJoin
return serial_comma_join(...)
end
local function split(...)
split = require(string_utilities).split
return split(...)
end
local function ulower(...)
ulower = require(string_utilities).lower
return ulower(...)
end
local function format(array, concatenater)
if #array == 0 then
return ""
end
local concatenated = concat(array, concatenater)
if concatenated == "" then
return ""
elseif concatenated:sub(-1) == "'" then
concatenated = concatenated .. " "
end
return "; ''" .. concatenated .. "''"
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[Phụ lục:Từ điển thuật ngữ#" .. anchor .. "|" .. text .. "]]"
end
local function make_link(page, display, face, accel)
return require("Module:links").full_link({term = page, alt = display, lang = lang, accel = accel}, face)
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local iargs = require("Module:parameters").process(frame.args, {
[1] = {required = true},
["def"] = true,
["suff_type"] = true,
})
local args = frame:getParent().args
local poscat = iargs[1]
local def = iargs.def
local suff_type = iargs.suff_type
local postype = nil
if suff_type then
postype = poscat .. '-' .. suff_type
else
postype = poscat
end
local data = {lang = lang, categories = {}, heads = {}, genders = {}, inflections = {}}
local infl_classes = {}
local title = {}
local postscript = {}
if poscat == "Hậu tố" then
insert_if_not(data.categories, "Dạng hậu tố " .. suff_type .. " tiếng Latinh")
end
if pos_functions[postype] then
local new_poscat = pos_functions[postype](def, args, data, infl_classes, title, postscript)
if new_poscat then
poscat = new_poscat
end
end
data.pos_category = poscat
postscript = concat(postscript, ", ")
return
require("Module:headword").full_headword(data)
.. format(infl_classes, "/")
.. format(title, ", ")
.. (postscript ~= "" and " (" .. postscript .. ")" or "")
end
local function process_num_type(numtype, categories)
if numtype == "card" then
insert_if_not(categories, "Số đếm tiếng Latinh")
elseif numtype == "ord" then
insert_if_not(categories, "Số thứ tự tiếng Latinh")
elseif numtype == "frac" then
insert_if_not(categories, "Phân số tiếng Latinh")
elseif numtype == "dist" then
insert_if_not(categories, "Số phân phối tiếng Latinh")
elseif numtype == "mul" then
insert_if_not(categories, "Số nhân tiếng Latinh")
elseif numtype == "coll" then
insert_if_not(categories, "Số tập hợp tiếng Latinh")
elseif numtype then
error("Unrecognized numeral type '" .. numtype .. "'")
end
end
local function normalize_derivation(deriv, anchor, text)
if not deriv then
return nil
end
local deriv1 = deriv[1]
if not deriv1 or deriv1 == "-" then
return deriv1
end
deriv.label = glossary_link(anchor, text)
return deriv
end
local function derivation(data, decldata, arg, anchor, text)
local der = normalize_derivation(decldata[arg], anchor, text)
if der and der ~= "-" then
insert(data.inflections, der)
end
end
local function nouns(pos, def, args, data, infl_classes, title)
local is_num = pos == "Số từ"
local is_pn = false
if pos == "Danh từ riêng" then
is_pn = true
pos = "Danh từ"
end
local decldata = require("Module:la-nominal").do_generate_noun_forms(args, pos, "headword", def, is_num)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_noun_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local genders = decldata.overriding_genders
if #genders == 0 then
if decldata.gender then
genders = {ulower(decldata.gender)}
elseif not is_num then
error("No gender explicitly specified in headword template using g=, and can't infer gender from lemma spec")
end
end
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
local gender = g:match("^(.[\128-\191]*)%-[sp]$")
if not gender then
gender = g
end
if not legal_gender[gender] then
error("Gender “" .. gender .. "” is not a valid Latin gender.")
end
insert(data.genders, g)
insert_if_not(categories, decldata.pos .. " " .. gender_names[gender] .. " không biến cách tiếng Latinh")
end
else
local is_irreg = false
local is_indecl = false
local is_decl = false
local has_multiple_decls = false
local has_multiple_variants = false
-- flatten declension specs
local decls = {}
for _, g in ipairs(genders) do
if not legal_gender[g] then
error("Gender “" .. g .. "” is not a valid Latin gender.")
elseif decldata.num == "pl" then
g = g .. "-p"
elseif decldata.num == "sg" then
g = g .. "-s"
end
insert(data.genders, g)
end
local function process_decl(decl_list, props)
local headword_decl = props.headword_decl
-- skip adjectival declensions
if headword_decl:match("+$") then
return
elseif props.decl == "irreg" then
is_irreg = true
headword_decl = headword_decl:match("^irreg/(.*)$") or headword_decl
local irreg_decls = split(headword_decl, ",")
if #irreg_decls > 1 then
has_multiple_decls = true
end
for _, d in ipairs(irreg_decls) do
if d == "indecl" or d == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, d)
end
else
if headword_decl == "indecl" or headword_decl == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, headword_decl)
end
end
for _, props in ipairs(decldata.propses) do
if props.headword_decl then
process_decl(decls, props)
else
local alternant_decls = {}
for _, alternant in ipairs(props) do
for _, single_props in ipairs(alternant) do
process_decl(alternant_decls, single_props)
end
end
if #alternant_decls > 1 then
has_multiple_decls = true
elseif #decls > 1 then
has_multiple_variants = true
end
for _, d in ipairs(alternant_decls) do
insert_if_not(decls, d)
end
end
end
if is_indecl and is_decl then
has_multiple_decls = true
end
if has_multiple_decls then
insert_if_not(categories, decldata.pos .. " có nhiều loại biến cách tiếng Latinh")
end
if has_multiple_variants then
insert_if_not(categories, decldata.pos .. " có nhiều biến thể ở biến cách đơn tiếng Latinh")
end
if is_irreg then
insert(title, glossary_link("bất quy tắc"))
insert_if_not(categories, decldata.pos .. " bất quy tắc tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " bất quy tắc tiếng Latinh")
end
end
if is_indecl then
if is_decl then
insert(title, glossary_link("không biến cách"))
else
insert(data.inflections, {label = glossary_link("không biến cách")})
end
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " không biến cách tiếng Latinh")
end
end
if #decls > 1 then
insert(title, "biến cách nhiều loại")
end
for _, decl in ipairs(decls) do
if not (decl == "0" or decl == "indecl" or decl == "sgpl" or decl == "irreg") then
local decl_class = declension_to_vi[decl]
if not decl_class then
error("Internal error: declension '" .. decl .. "' not recognized")
end
insert(title, "[[Phụ lục:Biến cách " .. decl_class .. " tiếng Latinh|" .. decl_class .. " declension]]")
insert_if_not(categories, decldata.pos .. " biến cách " .. decl_class .. " tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " biến cách " .. decl_class .. " " .. gender_names[g] .. " tiếng Latinh")
end
end
end
local lemma_num = decldata.num == "pl" and "pl" or "sg"
if NAMESPACE == "Từ_tái_tạo" then
-- For reconstructed nouns:
if data.genders[1] == 'n' and lemma_num == 'sg' then
-- singular neuter nouns give a plural
local pl = decldata.forms["nom_pl"]
if pl and pl ~= "" and #pl > 0 then
pl.label = "số nhiều"
insert(data.inflections, pl)
end
else
-- all others give an oblique
local obl = decldata.forms["acc_" .. lemma_num]
if obl and obl ~= "" and #obl > 0 then
obl.label = "bổ cách"
insert(data.inflections, obl)
end
end
else
local gen = decldata.forms["gen_" .. lemma_num]
if (decldata.unattested["gen_" .. lemma_num]) then
gen[1] = '*' .. gen[1]
data.nolink = true
end
if gen and gen ~= "" and gen ~= "—" and #gen > 0 then
if is_decl then
-- Skip displaying the genitive for nouns that are only
-- indeclinable. But we do display it for nouns like Abrahām
-- and Ādām that can be either indeclinable or declined.
gen.label = "sinh cách"
insert(data.inflections, gen)
end
else
insert(data.inflections, {label = "không có sinh cách"})
insert_if_not(categories, decldata.pos .. " không có sinh cách tiếng Latinh")
end
end
end
derivation(data, decldata, "m", "giống đực")
derivation(data, decldata, "f", "giống cái")
derivation(data, decldata, "n", "giống trung")
derivation(data, decldata, "adj", "quan hệ", "tính từ quan hệ")
derivation(data, decldata, "dim", "giảm nhẹ nghĩa")
derivation(data, decldata, "aug", "tăng nhẹ nghĩa")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return is_pn and decldata.pos == "Danh từ" and "Danh từ riêng" or decldata.pos
end
pos_functions["Danh từ"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ", def, args, data, infl_classes, title)
end
pos_functions["Danh từ riêng"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ riêng", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-hậu tố"] = function(def, args, data, infl_classes, title)
return nouns("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-số từ"] = function(def, args, data, infl_classes, title)
return nouns("Số từ", def, args, data, infl_classes, title)
end
function export.verb_title(title, typeinfo, lemma_forms)
local conj = typeinfo.conj
local irreg_processing = typeinfo.irreg
local subtypes = typeinfo.subtypes
local first_lemma = ""
if #lemma_forms > 0 then
first_lemma = require("Module:links").remove_links(lemma_forms[1])
end
if conj == "1st" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 1|cách chia loại 1]]")
elseif conj == "2nd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 2|cách chia loại 2]]")
elseif conj == "3rd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]]")
elseif conj == "3rd-io" then
insert(title, ("[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]] %s-variant"):format(make_link(nil, "iō", "term")))
elseif conj == "4th" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 4|cách chia loại 4]]")
elseif conj == "irreg" then -- sum
insert(title, "[[Phụ lục:Động từ bất quy tắc tiếng Latinh|cách chia bất quy tắc]]")
end
if subtypes.highlydef then -- āiō, inquam
insert(title, "rất [[khiếm khuyết]]")
end
if subtypes.suppl then -- sum, volō
insert(title, "[[bổ khuyết]]")
end
if subtypes["3only"] then -- decet
insert(title, "chỉ có [[third person|ngôi thứ ba]]")
elseif subtypes.impers then -- decet, advesperāscit (also nopass)
insert(title, "[[impersonal verb|không ngôi]]")
end
if subtypes.depon then -- dēmōlior, calvor (also noperf)
insert(title, "[[trung gian]]")
end
if subtypes.perfaspres then -- meminī, ōdī
insert(title, "không có thân [[hiện tại]]")
-- If semidepon is set, only the active forms are affected.
local voice = subtypes.semidepon and "[[chủ động]] " or ""
insert(title, ("%sDạng [[hoàn thành]] %snghĩa [[hiện tại]]"):format(voice, voice))
-- Clarify that deponency can only apply to the perfect.
if subtypes.semidepon then -- ōdī
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]]")
end
if subtypes.optsemidepon then
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]] (không cần thiết)")
end
else
if subtypes.semidepon then -- fīdō, gaudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]]")
end
if subtypes.optsemidepon then -- audeō, placeō, soleō, pudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]] (không cần thiết)")
end
end
if subtypes.imponly then -- cedo, apage
insert(title, "chỉ có lối [[mệnh lệnh]]")
end
if subtypes.nopass then -- coacēscō
insert(title, "không có dạng [[bị động]]")
end
local stems = {}
if subtypes.nopres then -- coepī; perfaspres already handles this above
insert(stems, "[[hiện tại]]")
end
if subtypes.noperf then
insert(stems, "[[hoàn thành]]")
end
if subtypes.nosup or subtypes.supfutractvonly then
insert(stems, "[[supine]]")
end
if #stems > 0 then
local extra = subtypes.supfutractvonly and " trừ [[phân từ]] [[tương lai]] [[chủ động]]]"
insert(title, ("không có thân từ %s%s"):format(m_table.serialCommaJoin(stems, {conj = "hoặc"}), #stems > 1 and "s" or "", extra or ""))
end
if subtypes.nofut then -- soleō
insert(title, "không có thì [[tương lai]]")
end
if subtypes.pass3only then -- praefundō
insert(title, "[[third person#English|third person]]-only in the [[passive voice#English|passive]]")
elseif subtypes.passimpers then -- abambulō
local msg = "[[impersonal verb#English|impersonal]] in the [[passive voice#English|passive]]"
if subtypes.passimpersold then -- possum
msg = msg .. " in [[Old Latin]]"
end
insert(title, msg)
end
if subtypes.noimp then -- volō
insert(title, "no [[imperative mood#English|imperative]]")
end
if irreg_processing and umatch(first_lemma, "d[īū]cō$") then -- dīcō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] short [[imperative mood#English|imperative]]")
end
if subtypes.nofutractvptc and not subtypes.nosup then -- fīō
insert(title, "no [[future tense#English|future]] [[active voice#English|active]] [[participle#English|participle]]")
end
if not (subtypes.nopres or subtypes.perfaspres or subtypes.imponly) then
if subtypes.noinf then -- inquam
insert(title, "no [[infinitive#English|infinitive]]")
end
if subtypes.noger then -- libet
insert(title, "no [[gerund#English|gerund]]")
end
end
if subtypes.shorta then -- dō
insert(title, ("[[Appendix:Latin irregular verbs|irregular]] short %s in most forms"):format(make_link(nil, "ă", "term")))
end
if irreg_processing then
if first_lemma:match("edō$") then -- edō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] alternative forms")
elseif first_lemma:match("fīō$") then -- fīō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] long " .. make_link(nil, "ī", "term"))
end
end
end
pos_functions["Động từ"] = function(def, args, data, infl_classes, title)
local m_la_verb = require("Module:la-verb")
local def1, def2
if def then
def1, def2 = def:match("^(.-):(.*)$")
end
local conjdata, typeinfo = m_la_verb.make_data(args, true, def1, def2)
local lemma_forms = conjdata.overriding_lemma
if not lemma_forms or #lemma_forms == 0 then
lemma_forms = m_la_verb.get_lemma_forms(conjdata, true)
end
data.heads = lemma_forms
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-verb}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = conjdata.id
local perf_only = false
local function insert_inflection(infl, label)
infl.label = label
insert(data.inflections, infl)
end
local inf = m_la_verb.get_valid_forms(conjdata.forms["pres_actv_inf"])
if #inf > 0 then
insert_inflection(inf, "nguyên mẫu ở thì hiện tại")
else
inf = m_la_verb.get_valid_forms(conjdata.forms["perf_actv_inf"])
if #inf > 0 then
perf_only = true
insert_inflection(inf, "nguyên mẫu ở thì hoàn thành")
end
end
if not perf_only then
local perf = m_la_verb.get_valid_forms(conjdata.forms["1s_perf_actv_indc"])
if #perf == 0 then
perf = m_la_verb.get_valid_forms(conjdata.forms["3s_perf_actv_indc"])
end
if #perf > 0 then
insert_inflection(perf, "chủ động ở thì hoàn thành")
end
end
local subtypes = typeinfo.subtypes
if not (subtypes.depon or subtypes.semidepon) then
local sup = m_la_verb.get_valid_forms(conjdata.forms["acc_sup"])
if #sup > 0 then
insert_inflection(sup, "danh động từ")
else
local fap = m_la_verb.get_valid_forms(conjdata.forms["futr_actv_ptc"])
if #fap > 0 then
insert_inflection(fap, "phân từ tương lai chủ động")
end
end
end
export.verb_title(title, typeinfo, lemma_forms)
end
pos_functions["Hậu tố-động từ"] = pos_functions["Động từ"]
local function attested_form(decldata, index)
local form
if (decldata.unattested[index]) then
form = { { term = '*' .. decldata.forms[index][1], nolink = true } }
else
form = decldata.forms[index]
end
return form
end
local function degree_derivations(comp, sup, data)
local inflections = data.inflections
if not (comp or sup) then
return
elseif (not comp or comp == "-") and (not sup or sup == "-") then
insert(inflections, {label = "không so sánh được"})
insert_if_not(data.categories, "Phó từ không so sánh được tiếng Latinh")
return
elseif comp == "-" then
insert(inflections, {label = "không có so sánh hơn"})
elseif comp then
insert(inflections, comp)
end
if sup == "-" then
insert(inflections, {label = "không có so sánh nhất"})
elseif sup then
insert(inflections, sup)
end
end
local function adjectives(pos, def, args, data, infl_classes)
local is_num = pos == "Số từ"
local decldata = require("Module:la-nominal").do_generate_adj_forms(args, pos, "headword", nil, def)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_adj_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.num == "pl" then
insert_if_not(categories, decldata.pos .. " chỉ có số nhiều tiếng Latinh")
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
if decldata.pos == "Phân từ" then
local lemma1 = lemma[1]
if lemma1:sub(-4) == "ndum" then
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
elseif lemma1:match("um$") then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
end
end
else
local lemma_num = decldata.num == "pl" and "pl" or "sg"
local masc = decldata.forms["nom_" .. lemma_num .. "_m"]
local fem = attested_form(decldata, "nom_" .. lemma_num .. "_f")
local neut = attested_form(decldata, "nom_" .. lemma_num .. "_n")
local gen = attested_form(decldata, "gen_" .. lemma_num .. "_m")
local acc = attested_form(decldata, "acc_" .. lemma_num .. "_m")
if decldata.pos == "participles" then
local masc1 = masc[1]
if masc1:sub(-5) == "ūrus" then
insert_if_not(categories, "Phân từ tương lai chủ động tiếng Latinh")
elseif masc1:sub(-4) == "ndus" then
-- FIXME, should rename to "Latin gerundives")
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
else
local masc1_final2 = masc1:sub(-2)
if masc1_final2 == "us" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
elseif masc1_final2 == "ns" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
else
error("Unrecognized participle ending: " .. masc1)
end
end
end
-- We display the inflections in three different ways to mimic the
-- old way of doing things:
--
-- 1. If masc and fem are different, show masc, fem and neut.
-- 2. Otherwise, if masc and neut are different, show masc and neut.
-- 3. Otherwise, show masc nominative and masc genitive.
if not form_is_empty(fem) and not deep_equals(masc, fem) then
fem.label = "giống cái"
insert(data.inflections, fem)
if not form_is_empty(neut) then
neut.label = "giống trung"
insert(data.inflections, neut)
end
elseif not form_is_empty(neut) and not deep_equals(masc, neut) then
neut.label = "giống cái"
insert(data.inflections, neut)
elseif not form_is_empty(gen) then
gen.label = "sinh cách"
insert(data.inflections, gen)
elseif not form_is_empty(acc) then
acc.label = "đối cách"
insert(data.inflections, acc)
end
insert(infl_classes, decldata.title)
end
local comp = normalize_derivation(decldata.comp, "so sánh hơn")
local sup = normalize_derivation(decldata.sup, "so sánh nhất")
degree_derivations(comp, sup, data)
derivation(data, decldata, "adv", "Phó từ")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return decldata.pos
end
pos_functions["Tính từ"] = function(def, args, data, infl_classes, title)
return adjectives("Tính từ", def, args, data, infl_classes, title)
end
pos_functions["Phân từ"] = function(def, args, data, infl_classes, title)
return adjectives("Phân từ", def, args, data, infl_classes, title)
end
pos_functions["Từ hạn định"] = function(def, args, data, infl_classes, title)
return adjectives("Từ hạn định", def, args, data, infl_classes, title)
end
pos_functions["Đại từ"] = function(def, args, data, infl_classes, title)
return adjectives("Đại từ", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-hậu tố"] = function(def, args, data, infl_classes, title)
return adjectives("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-số từ"] = function(def, args, data, infl_classes, title)
return adjectives("Số từ", def, args, data, infl_classes, title)
end
pos_functions["Phó từ"] = function(def, args, data)
local sublist = {sublist = "/"}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {alias_of = "comp"},
[3] = {alias_of = "sup"},
["head"] = {list = true, required = true},
["comp"] = sublist,
["sup"] = sublist,
["adj"] = sublist,
["id"] = true,
})
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
local comp, sup = args.comp, args.sup
local irreg = false
if comp then
if comp[1] == "-" then
comp = "-"
elseif comp[1] == nil then
comp = nil
else
comp.label = glossary_link("so sánh hơn")
comp = args.comp
irreg = true
end
end
if sup then
if sup[1] == "-" then
sup = "-"
elseif sup[1] == nil then
sup = nil
else
sup.label = glossary_link("so sánh nhất")
sup = args.sup
irreg = true
end
end
local categories = data.categories
if irreg then
insert_if_not(categories, "Phó từ bất quy tắc tiếng Latinh")
end
if not (comp or sup) then
local default_comp = {label = glossary_link("so sánh hơn")}
local default_sup = {label = glossary_link("so sánh nhất")}
for _, head in ipairs(args.head) do
local stem = nil
for _, suff in ipairs{"iter", "nter", "ter", "er", "iē", "ē", "rā", "im", "ō"} do
stem = head:match("(.*)" .. pattern_escape(suff) .. "$")
comp_suff, sup_suff = "ius", "issimē"
if stem ~= nil then
if suff == "nter" then
stem = stem .. "nt"
elseif suff == "rā" then
comp_suff = "er" .. comp_suff
sup_suff = "imē"
end
insert(default_comp, stem .. comp_suff)
insert(default_sup, stem .. sup_suff)
break
end
end
if not stem then
error("Unrecognized adverb type, recognized types are “-ē”, “-er”, “-ter”, “-iter”, “-im”, or “-ō”, “-ra” or specify irregular forms or “-” if incomparable.")
end
end
comp = comp or default_comp
sup = sup or default_sup
end
degree_derivations(comp, sup, data)
derivation(data, args, "adj", "Tính từ")
end
pos_functions["Phó từ-hậu tố"] = pos_functions["Phó từ"]
local function get_forms(forms)
if #forms == 0 then
return nil
end
local i, attested = 1, false
while true do
local form = forms[i]
if form == nil then
return forms, attested
elseif form == "-" then
remove(forms, i)
else
if not (attested or get_plaintext(form):sub(1, 1) == "*") then
attested = true
end
i = i + 1
end
end
end
local function degree(pos, deg, pos_func, other_pos, other_pos_label, other_deg, other_deg_label, args, data, infl_classes)
local list = {list = true}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
["head"] = list,
["positive"] = list,
[other_pos] = {sublist = "/"},
[other_deg] = list,
["id"] = true,
})
data.no_redundant_head_cat = #args.head == 0
-- Set default manually so we can tell whether the user specified head=.
if #args.head == 0 then
args.head = {PAGENAME}
end
data.heads = args.head
data.id = args.id
insert(data.inflections, {label = deg})
if pos_func then
pos_func(args, data, infl_classes)
end
local positive, positive_attested = get_forms(args.positive)
if positive then
if not positive_attested then
insert(data.categories, pos .. " chỉ có " .. deg .. " tiếng Latinh")
end
if #positive > 0 then
args.positive.label = "khẳng định"
insert(data.inflections, args.positive)
else
insert(data.inflections, {label = "không có dạng khẳng định"})
end
end
local other = get_forms(args[other_deg])
if other then
if #other > 0 then
args[other_deg].label = other_deg_label
insert(data.inflections, args[other_deg])
else
insert(data.inflections, {label = "không có dạng " .. other_deg_label})
end
end
derivation(data, args, other_pos, other_pos_label)
-- If a lemma, return the primary part of speech ("adjectives" or
-- "adverbs"), so that the term is categorized in "Latin adjectives" or
-- "Latin adverbs". Otherwise, return nothing, so that the term goes in the
-- relevant non-lemma category (e.g. "Latin comparative adjectives"), and
-- into "Latin non-lemma forms".
if positive and not positive_attested then
return pos
end
end
local function comp_adj(args, data, infl_classes)
insert(infl_classes, "[[Appendix:Latin third declension|third declension]]")
local n = {label = "neuter"}
for _, head in ipairs(args.head) do
local neuter = head:gsub("or$", "us")
insert(n, neuter)
end
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function sup_adj(args, data, infl_classes)
insert(infl_classes, "[[Phụ lục:Biến cách loại 1 tiếng Latinh|loại 1]]")
insert(infl_classes, "[[Phụ lục:Biến cách loại 2 tiếng Latinh|biến cách loại 2]]")
local f, n = {label = "giống cái"}, {label = "giống trung"}
for _, head in ipairs(args.head) do
local stem = head:gsub("us$", "")
insert(f, stem .. "a")
insert(n, stem .. "um")
end
insert(data.inflections, f)
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function adpositions(pos, def, args, data, infl_classes, title, postscript)
local cases = invert(require("Module:la-utilities").cases)
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {list = true, set = keys_to_list(cases)},
["head"] = {list = true, required = true},
["id"] = true,
})
-- Case names are supplied in numbered arguments, optionally preceded by
-- headwords.
cases = args[2]
for i = 1, #cases do
for j = i + 1, #cases do
if cases[i] == cases[j] then
error("Duplicate case")
end
end
local case = cases[i]
local appendix_link = glossary_link(case)
if i == 1 then
appendix_link = "+ " .. appendix_link
end
insert(postscript, appendix_link)
insert_if_not(data.categories, "Latin " .. pos .. " governing the " .. case)
end
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
end
pos_functions["Giới từ"] = function(...)
return adpositions("prepositions", ...)
end
pos_functions["Hậu giới từ"] = function(...)
return adpositions("postpositions", ...)
end
pos_functions["Danh động từ"] = function(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = "labōrandum"}, -- headword
[2] = true, -- gerundive
})
data.heads = {args[1]}
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
insert(data.inflections, {label = "[[Phụ lục:Từ điển thuật ngữ#đối cách|đối cách]]"})
local stem = args[1]:match("^(.*)um$")
if not stem then
error("Unrecognized gerund ending: " .. stem)
end
if args[2] == "-" then
insert(data.inflections, {label = "không có [[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
else
insert(data.inflections, {[1] = args[2] or stem .. "us", label = "[[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
end
end
local function non_lemma_forms(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = def}, -- headword or cases
["head"] = {list = true, require_index = true},
["g"] = {list = true},
["id"] = true,
})
local heads = {args[1]}
for _, head in ipairs(args.head) do
insert(heads, head)
end
data.heads = heads
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
data.genders = args.g
data.id = args.id
end
pos_functions["Biến thể hình thái danh từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh từ riêng"] = non_lemma_forms
pos_functions["Biến thể hình thái đại từ"] = non_lemma_forms
pos_functions["Biến thể hình thái động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái tính từ"] = non_lemma_forms
pos_functions["Biến thể hình thái phân từ"] = non_lemma_forms
pos_functions["Biến thể hình thái từ hạn định"] = non_lemma_forms
pos_functions["Biến thể hình thái số từ"] = non_lemma_forms
pos_functions["Biến thể hình thái hậu tố"] = non_lemma_forms
return export
mbxyzygixywko6etwcbd3xfbikbw5de
2561580
2561562
2026-09-08T05:38:17Z
Hiyuune
50834
2561580
Scribunto
text/plain
-- TODO: handle "-old" subtypes generally, appending "in Old Latin", where terms have additional OL inflections.
local export = {}
local pos_functions = {}
local string_utilities = "Module:string utilities"
local table_module = "Module:table"
local utilities_module = "Module:utilities"
local concat = table.concat
local form_is_empty = require("Module:la-utilities").form_is_empty
local insert = table.insert
local remove = table.remove
local umatch = mw.ustring.match
local lang = require("Module:languages").getByCode("la")
local NAMESPACE = mw.title.getCurrentTitle().nsText
local PAGENAME = mw.loadData("Module:headword/data").pagename
local legal_gender = {
["m"] = true,
["f"] = true,
["n"] = true,
["?"] = true,
["?!"] = true,
}
local declension_to_vi = {
["1"] = "loại 1",
["2"] = "loại 2",
["3"] = "loại 3",
["4"] = "loại 4",
["5"] = "loại 5",
}
local gender_names = {
["m"] = "giống đực",
["f"] = "giống cái",
["n"] = "giống trung",
["?"] = "không rõ giống",
["?!"] = "giống chưa chứng thực",
}
local function deep_equals(...)
deep_equals = require(table_module).deepEquals
return deep_equals(...)
end
local function get_plaintext(...)
get_plaintext = require(utilities_module).get_plaintext
return get_plaintext(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function invert(...)
invert = require(table_module).invert
return invert(...)
end
local function keys_to_list(...)
keys_to_list = require(table_module).keysToList
return keys_to_list(...)
end
local function pattern_escape(...)
pattern_escape = require(string_utilities).pattern_escape
return pattern_escape(...)
end
local function serial_comma_join(...)
serial_comma_join = require(table_module).serialCommaJoin
return serial_comma_join(...)
end
local function split(...)
split = require(string_utilities).split
return split(...)
end
local function ulower(...)
ulower = require(string_utilities).lower
return ulower(...)
end
local function format(array, concatenater)
if #array == 0 then
return ""
end
local concatenated = concat(array, concatenater)
if concatenated == "" then
return ""
elseif concatenated:sub(-1) == "'" then
concatenated = concatenated .. " "
end
return "; ''" .. concatenated .. "''"
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[Phụ lục:Từ điển thuật ngữ#" .. anchor .. "|" .. text .. "]]"
end
local function make_link(page, display, face, accel)
return require("Module:links").full_link({term = page, alt = display, lang = lang, accel = accel}, face)
end
-- The main entry point.
-- This is the only function that can be invoked from a template.
function export.show(frame)
local iargs = require("Module:parameters").process(frame.args, {
[1] = {required = true},
["def"] = true,
["suff_type"] = true,
})
local args = frame:getParent().args
local poscat = iargs[1]
local def = iargs.def
local suff_type = iargs.suff_type
local postype = nil
if suff_type then
postype = poscat .. '-' .. suff_type
else
postype = poscat
end
local data = {lang = lang, categories = {}, heads = {}, genders = {}, inflections = {}}
local infl_classes = {}
local title = {}
local postscript = {}
if poscat == "Hậu tố" then
insert_if_not(data.categories, "Dạng hậu tố " .. suff_type .. " tiếng Latinh")
end
if pos_functions[postype] then
local new_poscat = pos_functions[postype](def, args, data, infl_classes, title, postscript)
if new_poscat then
poscat = new_poscat
end
end
data.pos_category = poscat
postscript = concat(postscript, ", ")
return
require("Module:headword").full_headword(data)
.. format(infl_classes, "/")
.. format(title, ", ")
.. (postscript ~= "" and " (" .. postscript .. ")" or "")
end
local function process_num_type(numtype, categories)
if numtype == "card" then
insert_if_not(categories, "Số đếm tiếng Latinh")
elseif numtype == "ord" then
insert_if_not(categories, "Số thứ tự tiếng Latinh")
elseif numtype == "frac" then
insert_if_not(categories, "Phân số tiếng Latinh")
elseif numtype == "dist" then
insert_if_not(categories, "Số phân phối tiếng Latinh")
elseif numtype == "mul" then
insert_if_not(categories, "Số nhân tiếng Latinh")
elseif numtype == "coll" then
insert_if_not(categories, "Số tập hợp tiếng Latinh")
elseif numtype then
error("Unrecognized numeral type '" .. numtype .. "'")
end
end
local function normalize_derivation(deriv, anchor, text)
if not deriv then
return nil
end
local deriv1 = deriv[1]
if not deriv1 or deriv1 == "-" then
return deriv1
end
deriv.label = glossary_link(anchor, text)
return deriv
end
local function derivation(data, decldata, arg, anchor, text)
local der = normalize_derivation(decldata[arg], anchor, text)
if der and der ~= "-" then
insert(data.inflections, der)
end
end
local function nouns(pos, def, args, data, infl_classes, title)
local is_num = pos == "Số từ"
local is_pn = false
if pos == "Danh từ riêng" then
is_pn = true
pos = "Danh từ"
end
local decldata = require("Module:la-nominal").do_generate_noun_forms(args, pos, "headword", def, is_num)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_noun_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local genders = decldata.overriding_genders
if #genders == 0 then
if decldata.gender then
genders = {ulower(decldata.gender)}
elseif not is_num then
error("No gender explicitly specified in headword template using g=, and can't infer gender from lemma spec")
end
end
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
local gender = g:match("^(.[\128-\191]*)%-[sp]$")
if not gender then
gender = g
end
if not legal_gender[gender] then
error("Gender “" .. gender .. "” is not a valid Latin gender.")
end
insert(data.genders, g)
insert_if_not(categories, decldata.pos .. " " .. gender_names[gender] .. " không biến cách tiếng Latinh")
end
else
local is_irreg = false
local is_indecl = false
local is_decl = false
local has_multiple_decls = false
local has_multiple_variants = false
-- flatten declension specs
local decls = {}
for _, g in ipairs(genders) do
if not legal_gender[g] then
error("Gender “" .. g .. "” is not a valid Latin gender.")
elseif decldata.num == "pl" then
g = g .. "-p"
elseif decldata.num == "sg" then
g = g .. "-s"
end
insert(data.genders, g)
end
local function process_decl(decl_list, props)
local headword_decl = props.headword_decl
-- skip adjectival declensions
if headword_decl:match("+$") then
return
elseif props.decl == "irreg" then
is_irreg = true
headword_decl = headword_decl:match("^irreg/(.*)$") or headword_decl
local irreg_decls = split(headword_decl, ",")
if #irreg_decls > 1 then
has_multiple_decls = true
end
for _, d in ipairs(irreg_decls) do
if d == "indecl" or d == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, d)
end
else
if headword_decl == "indecl" or headword_decl == "0" then
is_indecl = true
else
is_decl = true
end
insert_if_not(decl_list, headword_decl)
end
end
for _, props in ipairs(decldata.propses) do
if props.headword_decl then
process_decl(decls, props)
else
local alternant_decls = {}
for _, alternant in ipairs(props) do
for _, single_props in ipairs(alternant) do
process_decl(alternant_decls, single_props)
end
end
if #alternant_decls > 1 then
has_multiple_decls = true
elseif #decls > 1 then
has_multiple_variants = true
end
for _, d in ipairs(alternant_decls) do
insert_if_not(decls, d)
end
end
end
if is_indecl and is_decl then
has_multiple_decls = true
end
if has_multiple_decls then
insert_if_not(categories, decldata.pos .. " có nhiều loại biến cách tiếng Latinh")
end
if has_multiple_variants then
insert_if_not(categories, decldata.pos .. " có nhiều biến thể ở biến cách đơn tiếng Latinh")
end
if is_irreg then
insert(title, glossary_link("bất quy tắc"))
insert_if_not(categories, decldata.pos .. " bất quy tắc tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " bất quy tắc tiếng Latinh")
end
end
if is_indecl then
if is_decl then
insert(title, glossary_link("không biến cách"))
else
insert(data.inflections, {label = glossary_link("không biến cách")})
end
insert_if_not(categories, decldata.pos .. " không biến cách tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " " .. gender_names[g] .. " không biến cách tiếng Latinh")
end
end
if #decls > 1 then
insert(title, "biến cách nhiều loại")
end
for _, decl in ipairs(decls) do
if not (decl == "0" or decl == "indecl" or decl == "sgpl" or decl == "irreg") then
local decl_class = declension_to_vi[decl]
if not decl_class then
error("Internal error: declension '" .. decl .. "' not recognized")
end
insert(title, "[[Phụ lục:Biến cách " .. decl_class .. " tiếng Latinh|" .. decl_class .. " declension]]")
insert_if_not(categories, decldata.pos .. " biến cách " .. decl_class .. " tiếng Latinh")
for _, g in ipairs(genders) do
insert_if_not(categories, decldata.pos .. " biến cách " .. decl_class .. " " .. gender_names[g] .. " tiếng Latinh")
end
end
end
local lemma_num = decldata.num == "pl" and "pl" or "sg"
if NAMESPACE == "Từ_tái_tạo" then
-- For reconstructed nouns:
if data.genders[1] == 'n' and lemma_num == 'sg' then
-- singular neuter nouns give a plural
local pl = decldata.forms["nom_pl"]
if pl and pl ~= "" and #pl > 0 then
pl.label = "số nhiều"
insert(data.inflections, pl)
end
else
-- all others give an oblique
local obl = decldata.forms["acc_" .. lemma_num]
if obl and obl ~= "" and #obl > 0 then
obl.label = "bổ cách"
insert(data.inflections, obl)
end
end
else
local gen = decldata.forms["gen_" .. lemma_num]
if (decldata.unattested["gen_" .. lemma_num]) then
gen[1] = '*' .. gen[1]
data.nolink = true
end
if gen and gen ~= "" and gen ~= "—" and #gen > 0 then
if is_decl then
-- Skip displaying the genitive for nouns that are only
-- indeclinable. But we do display it for nouns like Abrahām
-- and Ādām that can be either indeclinable or declined.
gen.label = "sinh cách"
insert(data.inflections, gen)
end
else
insert(data.inflections, {label = "không có sinh cách"})
insert_if_not(categories, decldata.pos .. " không có sinh cách tiếng Latinh")
end
end
end
derivation(data, decldata, "m", "giống đực")
derivation(data, decldata, "f", "giống cái")
derivation(data, decldata, "n", "giống trung")
derivation(data, decldata, "adj", "quan hệ", "tính từ quan hệ")
derivation(data, decldata, "dim", "giảm nhẹ nghĩa")
derivation(data, decldata, "aug", "tăng nhẹ nghĩa")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return is_pn and decldata.pos == "Danh từ" and "Danh từ riêng" or decldata.pos
end
pos_functions["Danh từ"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ", def, args, data, infl_classes, title)
end
pos_functions["Danh từ riêng"] = function(def, args, data, infl_classes, title)
return nouns("Danh từ riêng", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-hậu tố"] = function(def, args, data, infl_classes, title)
return nouns("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Danh từ-số từ"] = function(def, args, data, infl_classes, title)
return nouns("Số từ", def, args, data, infl_classes, title)
end
function export.verb_title(title, typeinfo, lemma_forms)
local conj = typeinfo.conj
local irreg_processing = typeinfo.irreg
local subtypes = typeinfo.subtypes
local first_lemma = ""
if #lemma_forms > 0 then
first_lemma = require("Module:links").remove_links(lemma_forms[1])
end
if conj == "1st" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 1|cách chia loại 1]]")
elseif conj == "2nd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 2|cách chia loại 2]]")
elseif conj == "3rd" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]]")
elseif conj == "3rd-io" then
insert(title, ("[[Phụ lục:Động từ tiếng Latinh chia kiểu 3|cách chia loại 3]] %s-variant"):format(make_link(nil, "iō", "term")))
elseif conj == "4th" then
insert(title, "[[Phụ lục:Động từ tiếng Latinh chia kiểu 4|cách chia loại 4]]")
elseif conj == "irreg" then -- sum
insert(title, "[[Phụ lục:Động từ bất quy tắc tiếng Latinh|cách chia bất quy tắc]]")
end
if subtypes.highlydef then -- āiō, inquam
insert(title, "rất [[khiếm khuyết]]")
end
if subtypes.suppl then -- sum, volō
insert(title, "[[bổ khuyết]]")
end
if subtypes["3only"] then -- decet
insert(title, "chỉ có [[third person|ngôi thứ ba]]")
elseif subtypes.impers then -- decet, advesperāscit (also nopass)
insert(title, "[[impersonal verb|không ngôi]]")
end
if subtypes.depon then -- dēmōlior, calvor (also noperf)
insert(title, "[[trung gian]]")
end
if subtypes.perfaspres then -- meminī, ōdī
insert(title, "không có thân [[hiện tại]]")
-- If semidepon is set, only the active forms are affected.
local voice = subtypes.semidepon and "[[chủ động]] " or ""
insert(title, ("%sDạng [[hoàn thành]] %snghĩa [[hiện tại]]"):format(voice, voice))
-- Clarify that deponency can only apply to the perfect.
if subtypes.semidepon then -- ōdī
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]]")
end
if subtypes.optsemidepon then
insert(title, "động từ [[trung gian]] dạng [[hoàn thành]] (không cần thiết)")
end
else
if subtypes.semidepon then -- fīdō, gaudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]]")
end
if subtypes.optsemidepon then -- audeō, placeō, soleō, pudeō
insert(title, "[[semi-deponent#Tiếng Anh|bán trung gian]] (không cần thiết)")
end
end
if subtypes.imponly then -- cedo, apage
insert(title, "chỉ có lối [[mệnh lệnh]]")
end
if subtypes.nopass then -- coacēscō
insert(title, "không có dạng [[bị động]]")
end
local stems = {}
if subtypes.nopres then -- coepī; perfaspres already handles this above
insert(stems, "[[hiện tại]]")
end
if subtypes.noperf then
insert(stems, "[[hoàn thành]]")
end
if subtypes.nosup or subtypes.supfutractvonly then
insert(stems, "[[supine]]")
end
if #stems > 0 then
local extra = subtypes.supfutractvonly and " except in the [[future tense#English|future]] [[active voice#English|active]] [[participle#English|participle]]"
insert(title, ("no %s stem%s%s"):format(serial_comma_join(stems, {conj = "or"}), #stems > 1 and "s" or "", extra or ""))
end
if subtypes.nofut then -- soleō
insert(title, "không có thì [[tương lai]]")
end
if subtypes.pass3only then -- praefundō
insert(title, "[[third person#English|third person]]-only in the [[passive voice#English|passive]]")
elseif subtypes.passimpers then -- abambulō
local msg = "[[impersonal verb#English|impersonal]] in the [[passive voice#English|passive]]"
if subtypes.passimpersold then -- possum
msg = msg .. " in [[Old Latin]]"
end
insert(title, msg)
end
if subtypes.noimp then -- volō
insert(title, "no [[imperative mood#English|imperative]]")
end
if irreg_processing and umatch(first_lemma, "d[īū]cō$") then -- dīcō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] short [[imperative mood#English|imperative]]")
end
if subtypes.nofutractvptc and not subtypes.nosup then -- fīō
insert(title, "no [[future tense#English|future]] [[active voice#English|active]] [[participle#English|participle]]")
end
if not (subtypes.nopres or subtypes.perfaspres or subtypes.imponly) then
if subtypes.noinf then -- inquam
insert(title, "no [[infinitive#English|infinitive]]")
end
if subtypes.noger then -- libet
insert(title, "no [[gerund#English|gerund]]")
end
end
if subtypes.shorta then -- dō
insert(title, ("[[Appendix:Latin irregular verbs|irregular]] short %s in most forms"):format(make_link(nil, "ă", "term")))
end
if irreg_processing then
if first_lemma:match("edō$") then -- edō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] alternative forms")
elseif first_lemma:match("fīō$") then -- fīō
insert(title, "[[Appendix:Latin irregular verbs|irregular]] long " .. make_link(nil, "ī", "term"))
end
end
end
pos_functions["Động từ"] = function(def, args, data, infl_classes, title)
local m_la_verb = require("Module:la-verb")
local def1, def2
if def then
def1, def2 = def:match("^(.-):(.*)$")
end
local conjdata, typeinfo = m_la_verb.make_data(args, true, def1, def2)
local lemma_forms = conjdata.overriding_lemma
if not lemma_forms or #lemma_forms == 0 then
lemma_forms = m_la_verb.get_lemma_forms(conjdata, true)
end
data.heads = lemma_forms
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-verb}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = conjdata.id
local perf_only = false
local function insert_inflection(infl, label)
infl.label = label
insert(data.inflections, infl)
end
local inf = m_la_verb.get_valid_forms(conjdata.forms["pres_actv_inf"])
if #inf > 0 then
insert_inflection(inf, "nguyên mẫu ở thì hiện tại")
else
inf = m_la_verb.get_valid_forms(conjdata.forms["perf_actv_inf"])
if #inf > 0 then
perf_only = true
insert_inflection(inf, "nguyên mẫu ở thì hoàn thành")
end
end
if not perf_only then
local perf = m_la_verb.get_valid_forms(conjdata.forms["1s_perf_actv_indc"])
if #perf == 0 then
perf = m_la_verb.get_valid_forms(conjdata.forms["3s_perf_actv_indc"])
end
if #perf > 0 then
insert_inflection(perf, "chủ động ở thì hoàn thành")
end
end
local subtypes = typeinfo.subtypes
if not (subtypes.depon or subtypes.semidepon) then
local sup = m_la_verb.get_valid_forms(conjdata.forms["acc_sup"])
if #sup > 0 then
insert_inflection(sup, "danh động từ")
else
local fap = m_la_verb.get_valid_forms(conjdata.forms["futr_actv_ptc"])
if #fap > 0 then
insert_inflection(fap, "phân từ tương lai chủ động")
end
end
end
export.verb_title(title, typeinfo, lemma_forms)
end
pos_functions["Hậu tố-động từ"] = pos_functions["Động từ"]
local function attested_form(decldata, index)
local form
if (decldata.unattested[index]) then
form = { { term = '*' .. decldata.forms[index][1], nolink = true } }
else
form = decldata.forms[index]
end
return form
end
local function degree_derivations(comp, sup, data)
local inflections = data.inflections
if not (comp or sup) then
return
elseif (not comp or comp == "-") and (not sup or sup == "-") then
insert(inflections, {label = "không so sánh được"})
insert_if_not(data.categories, "Phó từ không so sánh được tiếng Latinh")
return
elseif comp == "-" then
insert(inflections, {label = "không có so sánh hơn"})
elseif comp then
insert(inflections, comp)
end
if sup == "-" then
insert(inflections, {label = "không có so sánh nhất"})
elseif sup then
insert(inflections, sup)
end
end
local function adjectives(pos, def, args, data, infl_classes)
local is_num = pos == "Số từ"
local decldata = require("Module:la-nominal").do_generate_adj_forms(args, pos, "headword", nil, def)
local lemma = decldata.overriding_lemma
-- TODO: modify the headword line if the slot isn't the expected one.
if #lemma == 0 then
for slot in require("Module:la-nominal").iter_potential_adj_lemma_slots() do
local potential_lemma = decldata.forms["linked_" .. slot]
if not form_is_empty(potential_lemma) then
if decldata.unattested[slot] then
potential_lemma = "*" .. potential_lemma
end
lemma = potential_lemma
break
end
end
end
data.heads = lemma
-- Since we always set data.heads to the lemma and specification of the lemma is mandatory in {{la-noun}}, there aren't
-- really any redundant heads.
data.no_redundant_head_cat = true
data.id = decldata.id
local categories = data.categories
if is_num then
process_num_type(decldata.num_type, categories)
end
if decldata.num == "pl" then
insert_if_not(categories, decldata.pos .. " chỉ có số nhiều tiếng Latinh")
end
if decldata.indecl then
insert(data.inflections, {label = glossary_link("không biến cách")})
if decldata.pos == "Phân từ" then
local lemma1 = lemma[1]
if lemma1:sub(-4) == "ndum" then
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
elseif lemma1:match("um$") then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
end
end
else
local lemma_num = decldata.num == "pl" and "pl" or "sg"
local masc = decldata.forms["nom_" .. lemma_num .. "_m"]
local fem = attested_form(decldata, "nom_" .. lemma_num .. "_f")
local neut = attested_form(decldata, "nom_" .. lemma_num .. "_n")
local gen = attested_form(decldata, "gen_" .. lemma_num .. "_m")
local acc = attested_form(decldata, "acc_" .. lemma_num .. "_m")
if decldata.pos == "participles" then
local masc1 = masc[1]
if masc1:sub(-5) == "ūrus" then
insert_if_not(categories, "Phân từ tương lai chủ động tiếng Latinh")
elseif masc1:sub(-4) == "ndus" then
-- FIXME, should rename to "Latin gerundives")
insert_if_not(categories, "Phân từ tương lai bị động tiếng Latinh")
else
local masc1_final2 = masc1:sub(-2)
if masc1_final2 == "us" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
elseif masc1_final2 == "ns" then
insert_if_not(categories, "Phân từ hoàn thành tiếng Latinh")
else
error("Unrecognized participle ending: " .. masc1)
end
end
end
-- We display the inflections in three different ways to mimic the
-- old way of doing things:
--
-- 1. If masc and fem are different, show masc, fem and neut.
-- 2. Otherwise, if masc and neut are different, show masc and neut.
-- 3. Otherwise, show masc nominative and masc genitive.
if not form_is_empty(fem) and not deep_equals(masc, fem) then
fem.label = "giống cái"
insert(data.inflections, fem)
if not form_is_empty(neut) then
neut.label = "giống trung"
insert(data.inflections, neut)
end
elseif not form_is_empty(neut) and not deep_equals(masc, neut) then
neut.label = "giống cái"
insert(data.inflections, neut)
elseif not form_is_empty(gen) then
gen.label = "sinh cách"
insert(data.inflections, gen)
elseif not form_is_empty(acc) then
acc.label = "đối cách"
insert(data.inflections, acc)
end
insert(infl_classes, decldata.title)
end
local comp = normalize_derivation(decldata.comp, "so sánh hơn")
local sup = normalize_derivation(decldata.sup, "so sánh nhất")
degree_derivations(comp, sup, data)
derivation(data, decldata, "adv", "Phó từ")
for _, cat in ipairs(decldata.categories) do
insert_if_not(categories, cat)
end
for _, cat in ipairs(decldata.cat) do
insert_if_not(categories, cat .. " tiếng Latinh")
end
return decldata.pos
end
pos_functions["Tính từ"] = function(def, args, data, infl_classes, title)
return adjectives("Tính từ", def, args, data, infl_classes, title)
end
pos_functions["Phân từ"] = function(def, args, data, infl_classes, title)
return adjectives("Phân từ", def, args, data, infl_classes, title)
end
pos_functions["Từ hạn định"] = function(def, args, data, infl_classes, title)
return adjectives("Từ hạn định", def, args, data, infl_classes, title)
end
pos_functions["Đại từ"] = function(def, args, data, infl_classes, title)
return adjectives("Đại từ", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-hậu tố"] = function(def, args, data, infl_classes, title)
return adjectives("Hậu tố", def, args, data, infl_classes, title)
end
pos_functions["Tính từ-số từ"] = function(def, args, data, infl_classes, title)
return adjectives("Số từ", def, args, data, infl_classes, title)
end
pos_functions["Phó từ"] = function(def, args, data)
local sublist = {sublist = "/"}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {alias_of = "comp"},
[3] = {alias_of = "sup"},
["head"] = {list = true, required = true},
["comp"] = sublist,
["sup"] = sublist,
["adj"] = sublist,
["id"] = true,
})
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
local comp, sup = args.comp, args.sup
local irreg = false
if comp then
if comp[1] == "-" then
comp = "-"
elseif comp[1] == nil then
comp = nil
else
comp.label = glossary_link("so sánh hơn")
comp = args.comp
irreg = true
end
end
if sup then
if sup[1] == "-" then
sup = "-"
elseif sup[1] == nil then
sup = nil
else
sup.label = glossary_link("so sánh nhất")
sup = args.sup
irreg = true
end
end
local categories = data.categories
if irreg then
insert_if_not(categories, "Phó từ bất quy tắc tiếng Latinh")
end
if not (comp or sup) then
local default_comp = {label = glossary_link("so sánh hơn")}
local default_sup = {label = glossary_link("so sánh nhất")}
for _, head in ipairs(args.head) do
local stem = nil
for _, suff in ipairs{"iter", "nter", "ter", "er", "iē", "ē", "rā", "im", "ō"} do
stem = head:match("(.*)" .. pattern_escape(suff) .. "$")
comp_suff, sup_suff = "ius", "issimē"
if stem ~= nil then
if suff == "nter" then
stem = stem .. "nt"
elseif suff == "rā" then
comp_suff = "er" .. comp_suff
sup_suff = "imē"
end
insert(default_comp, stem .. comp_suff)
insert(default_sup, stem .. sup_suff)
break
end
end
if not stem then
error("Unrecognized adverb type, recognized types are “-ē”, “-er”, “-ter”, “-iter”, “-im”, or “-ō”, “-ra” or specify irregular forms or “-” if incomparable.")
end
end
comp = comp or default_comp
sup = sup or default_sup
end
degree_derivations(comp, sup, data)
derivation(data, args, "adj", "Tính từ")
end
pos_functions["Phó từ-hậu tố"] = pos_functions["Phó từ"]
local function get_forms(forms)
if #forms == 0 then
return nil
end
local i, attested = 1, false
while true do
local form = forms[i]
if form == nil then
return forms, attested
elseif form == "-" then
remove(forms, i)
else
if not (attested or get_plaintext(form):sub(1, 1) == "*") then
attested = true
end
i = i + 1
end
end
end
local function degree(pos, deg, pos_func, other_pos, other_pos_label, other_deg, other_deg_label, args, data, infl_classes)
local list = {list = true}
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
["head"] = list,
["positive"] = list,
[other_pos] = {sublist = "/"},
[other_deg] = list,
["id"] = true,
})
data.no_redundant_head_cat = #args.head == 0
-- Set default manually so we can tell whether the user specified head=.
if #args.head == 0 then
args.head = {PAGENAME}
end
data.heads = args.head
data.id = args.id
insert(data.inflections, {label = deg})
if pos_func then
pos_func(args, data, infl_classes)
end
local positive, positive_attested = get_forms(args.positive)
if positive then
if not positive_attested then
insert(data.categories, pos .. " chỉ có " .. deg .. " tiếng Latinh")
end
if #positive > 0 then
args.positive.label = "khẳng định"
insert(data.inflections, args.positive)
else
insert(data.inflections, {label = "không có dạng khẳng định"})
end
end
local other = get_forms(args[other_deg])
if other then
if #other > 0 then
args[other_deg].label = other_deg_label
insert(data.inflections, args[other_deg])
else
insert(data.inflections, {label = "không có dạng " .. other_deg_label})
end
end
derivation(data, args, other_pos, other_pos_label)
-- If a lemma, return the primary part of speech ("adjectives" or
-- "adverbs"), so that the term is categorized in "Latin adjectives" or
-- "Latin adverbs". Otherwise, return nothing, so that the term goes in the
-- relevant non-lemma category (e.g. "Latin comparative adjectives"), and
-- into "Latin non-lemma forms".
if positive and not positive_attested then
return pos
end
end
local function comp_adj(args, data, infl_classes)
insert(infl_classes, "[[Appendix:Latin third declension|third declension]]")
local n = {label = "neuter"}
for _, head in ipairs(args.head) do
local neuter = head:gsub("or$", "us")
insert(n, neuter)
end
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function sup_adj(args, data, infl_classes)
insert(infl_classes, "[[Phụ lục:Biến cách loại 1 tiếng Latinh|loại 1]]")
insert(infl_classes, "[[Phụ lục:Biến cách loại 2 tiếng Latinh|biến cách loại 2]]")
local f, n = {label = "giống cái"}, {label = "giống trung"}
for _, head in ipairs(args.head) do
local stem = head:gsub("us$", "")
insert(f, stem .. "a")
insert(n, stem .. "um")
end
insert(data.inflections, f)
insert(data.inflections, n)
end
pos_functions["Tính từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Tính từ", "so sánh nhất", sup_adj, "adv", "Phó từ", "comp", "so sánh hơn", args, data, infl_classes)
end
pos_functions["Phó từ so sánh nhất"] = function(def, args, data, infl_classes, title)
return degree("Phó từ", "so sánh nhất", nil, "adj", "Tính từ", "comp", "so sánh hơn", args, data, infl_classes)
end
local function adpositions(pos, def, args, data, infl_classes, title, postscript)
local cases = invert(require("Module:la-utilities").cases)
args = require("Module:parameters").process(args, {
[1] = {alias_of = "head", list = false},
[2] = {list = true, set = keys_to_list(cases)},
["head"] = {list = true, required = true},
["id"] = true,
})
-- Case names are supplied in numbered arguments, optionally preceded by
-- headwords.
cases = args[2]
for i = 1, #cases do
for j = i + 1, #cases do
if cases[i] == cases[j] then
error("Duplicate case")
end
end
local case = cases[i]
local appendix_link = glossary_link(case)
if i == 1 then
appendix_link = "+ " .. appendix_link
end
insert(postscript, appendix_link)
insert_if_not(data.categories, "Latin " .. pos .. " governing the " .. case)
end
data.heads = args.head
data.no_redundant_head_cat = true -- since head= is required
data.id = args.id
end
pos_functions["Giới từ"] = function(...)
return adpositions("prepositions", ...)
end
pos_functions["Hậu giới từ"] = function(...)
return adpositions("postpositions", ...)
end
pos_functions["Danh động từ"] = function(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = "labōrandum"}, -- headword
[2] = true, -- gerundive
})
data.heads = {args[1]}
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
insert(data.inflections, {label = "[[Phụ lục:Từ điển thuật ngữ#đối cách|đối cách]]"})
local stem = args[1]:match("^(.*)um$")
if not stem then
error("Unrecognized gerund ending: " .. stem)
end
if args[2] == "-" then
insert(data.inflections, {label = "không có [[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
else
insert(data.inflections, {[1] = args[2] or stem .. "us", label = "[[Phụ lục:Từ điển thuật ngữ#gerundive|gerundive]]"})
end
end
local function non_lemma_forms(def, args, data)
args = require("Module:parameters").process(args, {
[1] = {required = true, default = def}, -- headword or cases
["head"] = {list = true, require_index = true},
["g"] = {list = true},
["id"] = true,
})
local heads = {args[1]}
for _, head in ipairs(args.head) do
insert(heads, head)
end
data.heads = heads
data.no_redundant_head_cat = true -- since 1= is required and goes into data.heads
data.genders = args.g
data.id = args.id
end
pos_functions["Biến thể hình thái danh từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh từ riêng"] = non_lemma_forms
pos_functions["Biến thể hình thái đại từ"] = non_lemma_forms
pos_functions["Biến thể hình thái động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái danh động từ"] = non_lemma_forms
pos_functions["Biến thể hình thái tính từ"] = non_lemma_forms
pos_functions["Biến thể hình thái phân từ"] = non_lemma_forms
pos_functions["Biến thể hình thái từ hạn định"] = non_lemma_forms
pos_functions["Biến thể hình thái số từ"] = non_lemma_forms
pos_functions["Biến thể hình thái hậu tố"] = non_lemma_forms
return export
numhysndtarwjk5d7vf5urghp8u5iti
Mô đun:la-nominal
828
266069
2561557
2327188
2026-09-08T01:58:55Z
Hiyuune
50834
2561557
Scribunto
text/plain
local export = {}
--[=[
Authorship: Ben Wing <benwing2>, with many ideas and a little code coming from
the old [[Module:la-decl-multi]] by KC Kenny Lau.
]=]
-- TODO:
-- (DONE) Eliminate specification of noteindex from la-adj/data
-- (DONE?) Finish autodetection of adjectives
-- (DONE) Remove old noun code
-- (DONE) Implement <.sufn>
-- (DONE) Look into adj voc=false
-- (DONE) Handle loc in adjectives
-- Error on bad subtypes
-- Make sure Google Books link still works.
-- (DONE) Make sure .sufn triggers insertion of 'with m optionally -> n in compounds' in title.
-- (DONE) Make sure title returned to la-adj lowercases the first letter even with a custom title.
--[=[
TERMINOLOGY:
-- "slot" = A particular case/number combination (for nouns) or
case/number/gender combination (for adjectives). Example slot names are
"abl_sg" (for noun) or "acc_pl_f" (for adjectives). Each slot is filled
with zero or more forms.
-- "form" = The declined Latin form representing the value of a given slot.
For example, rēge is a form, representing the value of the abl_sg slot of
the lemma rēx.
-- "lemma" = The dictionary form of a given Latin term. For nouns, it's
generally the nominative singular, but will be the nominative plural of
plurale tantum nouns (e.g. [[castra]]), and may occasionally be another
form (e.g. the genitive singular) if the nominative singular is missing.
For adjectives, it's generally the masculine nominative singular, but
will be the masculine nominative plural of plurale tantum adjectives
(e.g. [[dēnī]]).
-- "plurale tantum" (plural "pluralia tantum") = A noun or adjective that
exists only in the plural. Examples are castra "army camp", faucēs "throat",
and dēnī "ten each" (used for counting pluralia tantum nouns).
-- "singulare tantum" (plural "singularia tantum") = A noun or adjective that
exists only in the singular. Examples are geōlogia "geology" (and in
general most non-count nouns) and the adjective ūnus "one".
]=]
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local headword_data_module = "Module:headword/data"
local json_module = "Module:JSON"
local la_adj_data_module = "Module:la-adj/data"
local la_adj_table_module = "Module:la-adj/table"
local la_noun_data_module = "Module:la-noun/data"
local la_noun_table_module = "Module:la-noun/table"
local la_utilities_module = "Module:la-utilities"
local languages_module = "Module:languages"
local links_module = "Module:links"
local load_module = "Module:load"
local parameters_module = "Module:parameters"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local concat = table.concat
local insert = table.insert
local iter_adj_slots -- defined below
local iter_noun_slots -- defined below
local umatch = mw.ustring.match
local function add_indefinite_article(...)
add_indefinite_article = require(en_utilities_module).add_indefinite_article
return add_indefinite_article(...)
end
local function contains(...)
contains = require(table_module).contains
return contains(...)
end
local function debug_track(...)
debug_track = require(debug_track_module)
return debug_track(...)
end
local function deep_copy(...)
deep_copy = require(table_module).deepCopy
return deep_copy(...)
end
local function deep_equals(...)
deep_equals = require(table_module).deepEquals
return deep_equals(...)
end
local function full_link(...)
full_link = require(links_module).full_link
return full_link(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function lcfirst(...)
lcfirst = require(string_utilities_module).lcfirst
return lcfirst(...)
end
local function load_data(...)
load_data = require(load_module).load_data
return load_data(...)
end
local function make_adj_table(...)
make_adj_table = require(la_adj_table_module).make_table
return make_adj_table(...)
end
local function make_noun_table(...)
make_noun_table = require(la_noun_table_module).make_table
return make_noun_table(...)
end
local function make_noun_table_sg(...)
make_noun_table_sg = require(la_noun_table_module).make_table_sg
return make_noun_table_sg(...)
end
local function make_noun_table_pl(...)
make_noun_table_pl = require(la_noun_table_module).make_table_pl
return make_noun_table_pl(...)
end
local function make_stem2(...)
make_stem2 = require(la_utilities_module).make_stem2
return make_stem2(...)
end
local function normalize_form(...)
normalize_form = require(la_utilities_module).normalize_form
return normalize_form(...)
end
local function pluralize(...)
pluralize = require(en_utilities_module).pluralize
return pluralize(...)
end
local function process_params(...)
process_params = require(parameters_module).process
return process_params(...)
end
local function remove_links(...)
remove_links = require(links_module).remove_links
return remove_links(...)
end
local function singularize(...)
singularize = require(en_utilities_module).singularize
return singularize(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function ucfirst(...)
ucfirst = require(string_utilities_module).ucfirst
return ucfirst(...)
end
local m_adj_decl
local function get_m_adj_decl()
m_adj_decl, get_m_adj_decl = require(la_adj_data_module), nil
return m_adj_decl
end
local m_noun_decl
local function get_m_noun_decl()
m_noun_decl, get_m_noun_decl = require(la_noun_data_module), nil
return m_noun_decl
end
local lang
local function get_lang()
lang, get_lang = require(languages_module).getByCode("la")
return lang
end
local namespace
local function get_namespace()
namespace, get_namespace = load_data(headword_data_module).page.namespace, nil
return namespace
end
local pagename
local function get_pagename()
pagename, get_pagename = load_data(headword_data_module).pagename, nil
return pagename
end
local ligatures = {
['Ae'] = 'Æ',
['ae'] = 'æ',
['Oe'] = 'Œ',
['oe'] = 'œ',
}
local cases = {
"nom", "gen", "acc", "dat", "abl", "voc", "loc"
}
local cases_n = #cases
local nums = {
"sg", "pl"
}
local nums_n = #nums
local genders = {
"m", "f", "n"
}
local genders_n = #genders
local declension_to_vi = setmetatable({
["1"] = "loại 1",
["1&2"] = "loại 1 và 2",
["2"] = "loại 2",
["3"] = "loại 3",
["4"] = "loại 4",
["5"] = "loại 5",
}, {
__index = function(t, k)
return rawget(t, k:match("^[^+-]*"))
end
})
local number_to_english = {
"one", "two", "three", "four", "five"
}
local linked_prefixes = {
"", "linked_"
}
function export.iter_potential_noun_lemma_slots()
local num, case = 1, 0
return function()
case = case + 1
if case > 3 then
case = 1
num = num + 1
if num > nums_n then
return nil
end
end
return cases[case] .. "_" .. nums[num]
end
end
local potential_noun_lemma_slots = {}
for slot in export.iter_potential_noun_lemma_slots() do
insert(potential_noun_lemma_slots, slot)
end
local linked_to_non_linked_noun_slots = {}
for _, slot in ipairs(potential_noun_lemma_slots) do
linked_to_non_linked_noun_slots["linked_" .. slot] = slot
end
-- Iterate over all the "slots" associated with a noun declension, where a slot
-- is a particular case/number combination. If overridable_only, don't include the
-- "linked_" variants (linked_nom_sg, linked_nom_pl), which aren't overridable.
function export.iter_noun_slots(overridable_only)
local case, num, linked_variant = 1, 1, 0
return function()
linked_variant = linked_variant + 1
local max_linked_variant = (overridable_only or case > 3) and 1 or 2
if linked_variant > max_linked_variant then
linked_variant = 1
num = num + 1
if num > nums_n then
num = 1
case = case + 1
if case > cases_n then
return nil
end
end
end
return linked_prefixes[linked_variant] .. cases[case] .. "_" .. nums[num]
end
end
iter_noun_slots = export.iter_noun_slots
function export.iter_potential_adj_lemma_slots()
local num, case, gen = 1, 1, 0
return function()
gen = gen + 1
if gen > genders_n then
gen = 1
case = case + 1
if case > 3 then
case = 1
num = num + 1
if num > nums_n then
return nil
end
end
end
return cases[case] .. "_" .. nums[num] .. "_" .. genders[gen]
end
end
-- List of adjective slots for which we generate linked variants. Include
-- feminine and neuter variants because they will be needed if the adjective
-- is part of a multiword feminine or neuter noun.
local potential_adj_lemma_slots = {}
for slot in export.iter_potential_adj_lemma_slots() do
insert(potential_adj_lemma_slots, slot)
end
local linked_to_non_linked_adj_slots = {}
for _, slot in ipairs(potential_adj_lemma_slots) do
linked_to_non_linked_adj_slots["linked_" .. slot] = slot
end
-- Iterate over all the "slots" associated with an adjective declension, where a slot
-- is a particular case/number/gender combination. If overridable_only, don't include the
-- "linked_" variants (linked_nom_sg_m, linked_nom_pl_m, etc.), which aren't overridable.
function export.iter_adj_slots(overridable_only)
local case, num, gen, linked_variant = 1, 1, 1, 0
return function()
linked_variant = linked_variant + 1
local max_linked_variant = (overridable_only or case > 3) and 1 or 2
if linked_variant > max_linked_variant then
linked_variant = 1
gen = gen + 1
if gen > genders_n then
gen = 1
num = num + 1
if num > nums_n then
num = 1
case = case + 1
if case > cases_n then
return nil
end
end
end
end
return linked_prefixes[linked_variant] .. cases[case] .. "_" .. nums[num] .. "_" .. genders[gen]
end
end
iter_adj_slots = export.iter_adj_slots
-- Iterate over all the "slots" associated with a noun or adjective declension (depending on
-- the value of IS_ADJ), where a slot is a particular case/number combination (in the case of
-- nouns) or case/number/gender combination (in the case of adjectives). If OVERRIDABLE_ONLY
-- is specified, only include overridable slots (not including linked_ variants).
local function iter_slots(is_adj, overridable_only)
if is_adj then
return iter_adj_slots(overridable_only)
end
return iter_noun_slots(overridable_only)
end
local function concat_forms_in_slot(forms)
if forms and forms ~= "" and forms ~= "—" and #forms > 0 then
local new_vals = {}
for _, v in ipairs(forms) do
insert(new_vals, (v:gsub("|", "<!>")))
end
return concat(new_vals, ",")
end
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[Appendix:Glossary#" .. anchor .. "|" .. text .. "]]"
end
local function track(page)
debug_track("la-nominal/" .. page)
return true
end
local function set_union(sets)
local union = {}
for _, set in ipairs(sets) do
for key, _ in pairs(set) do
union[key] = true
end
end
return union
end
local function set_difference(set1, set2)
local diff = {}
for key, _ in pairs(set1) do
if not set2[key] then
diff[key] = true
end
end
return diff
end
-- If a form is set as '*', that means it is unattested
-- but should still be generated
-- TODO: handle asterisks in forms stored in the data
local function unattested_forms(data, args, is_adj)
for slot in iter_slots(is_adj) do
local arg = args[slot]
if arg ~= nil then
arg = arg:match("^*(.*)")
if arg then
data.unattested[slot] = true
args[slot] = arg ~= "" and arg or nil
end
end
end
end
-- Make a link only if the form is attested
local function link_if_attested(form, accel, is_unattested)
local data = {lang = lang or get_lang()}
if is_unattested then
data.alt = "*" .. form
else
data.term = form
data.accel = accel
end
return full_link(data)
end
local function process_form(slot, data, args, linked_to_non_linked)
local forms = data.forms
-- If nomf=1 passed, clear out all masculine and feminine forms.
if data.nomf and slot:match("%f[^%z_][mf]%f[%z_]") then
forms[slot] = nil
end
-- If noneut=1 passed, clear out all neuter forms.
if data.noneut and slot:match("%f[^%z_]n%f[%z_]") then
forms[slot] = nil
end
local val
if args[slot] then
val = args[slot]
data.user_specified[slot] = true
else
-- Overridding nom_sg/nom_sg_m etc. should override linked_nom_sg
-- so that the correct value gets displayed in the headword, which
-- uses linked_nom_sg.
local non_linked_equiv_slot = linked_to_non_linked[slot]
if non_linked_equiv_slot and args[non_linked_equiv_slot] then
val = args[non_linked_equiv_slot]
data.user_specified[slot] = true
else
val = forms[slot]
end
end
if val then
if type(val) == "string" then
val = split(val, "/", true, true)
end
local num = data.num
if (
(num == "pl" and slot:find("sg", nil, true)) or
(num == "sg" and slot:find("pl", nil, true))
) then
forms[slot] = nil
elseif val[1] == "" or val[1] == "-" or val[1] == "—" then
forms[slot] = "—"
if val[2] then
error("Cannot specify additional forms for " .. slot .. ' if it has been cancelled with "-"')
end
else
forms[slot] = val
end
end
end
local function process_noun_forms_and_overrides(data, args, generate_type)
local redlink = false
unattested_forms(data, args);
-- Process overrides and canonicalize forms.
for slot in iter_noun_slots() do
process_form(slot, data, args, linked_to_non_linked_noun_slots)
end
-- No accel forms or red link checking if generate_type == "bare".
if generate_type == "bare" then
return
end
-- Compute the lemma for accelerators. Do this after processing
-- overrides in case we overrode the lemma form(s).
local accel_lemma
if data.num and data.num ~= "" then
accel_lemma = data.forms["nom_" .. data.num]
else
accel_lemma = data.forms["nom_sg"]
end
if type(accel_lemma) == "table" then
accel_lemma = accel_lemma[1]
end
-- Set the accelerators, and determine if there are red links.
for slot in iter_noun_slots() do
local val = data.forms[slot]
if val and val ~= "" and val ~= "—" and #val > 0 then
for _, form in ipairs(val) do
local accel_form = slot
accel_form = accel_form:gsub("_([sp])[gl]$", "|%1")
data.accel[slot] = {form = accel_form, lemma = accel_lemma}
if not redlink and namespace == "" and not form:find("%[") then
local lang = lang or get_lang()
local title = lang:logicalToPhysical(lang:stripDiacritics(form))
local t = mw.title.new(title)
if t and not t.exists then
insert(data.categories, data.pos ..
" có liên kết đỏ trong bảng biến tố của chúng " .. lang:getCanonicalName())
redlink = true
end
end
end
end
end
end
local function process_adj_forms_and_overrides(data, args, generate_type)
local redlink = false
unattested_forms(data, args, true)
-- Process overrides and canonicalize forms.
for slot in iter_adj_slots() do
process_form(slot, data, args, linked_to_non_linked_adj_slots)
end
-- See if the masculine and feminine/neuter are the same across all slots.
-- If so, blank out the feminine/neuter so we use a table that combines
-- masculine and feminine, or masculine/feminine/neuter.
for _, gender in ipairs({"f", "n"}) do
local other_is_masc = true
for _, case in ipairs(cases) do
for _, num in ipairs(nums) do
if not deep_equals(data.forms[case .. "_" .. num .. "_" .. gender],
data.forms[case .. "_" .. num .. "_m"]) then
other_is_masc = false
break
end
end
if not other_is_masc then
break
end
end
if other_is_masc then
for _, case in ipairs(cases) do
for _, num in ipairs(nums) do
data.forms[case .. "_" .. num .. "_" .. gender] = nil
end
end
end
end
-- No accel forms or red link checking if generate_type == "bare".
if generate_type == "bare" then
return
end
-- Compute the lemma for accelerators. Do this after processing
-- overrides in case we overrode the lemma form(s).
local accel_lemma, accel_lemma_f
if data.num and data.num ~= "" then
accel_lemma = data.forms["nom_" .. data.num .. "_m"]
accel_lemma_f = data.forms["nom_" .. data.num .. "_f"]
else
accel_lemma = data.forms["nom_sg_m"]
accel_lemma_f = data.forms["nom_sg_f"]
end
if type(accel_lemma) == "table" then
accel_lemma = accel_lemma[1]
end
if type(accel_lemma_f) == "table" then
accel_lemma_f = accel_lemma_f[1]
end
-- Set the accelerators, and determine if there are red links.
for slot in iter_adj_slots() do
local val = data.forms[slot]
if val and val ~= "" and val ~= "—" and val[1] then
for _, form in ipairs(val) do
-- FIXME: We should skip accelerators entirely if there are embedded links in the form.
-- FIXME: Even better, make the accelerator code do that automatically.
local accel_form = slot
accel_form = accel_form:gsub("_([sp])[gl]_", "|%1|")
if data.noneut then
-- If noneut=1, we're being asked to do a noun like
-- Aquītānus or Rōmānus that has masculine and feminine
-- variants, not an adjective. In that case, make the
-- accelerators correspond to nominal case/number forms
-- without the gender, and use the feminine as the
-- lemma for feminine forms.
if slot:find("_f", nil, true) then
data.accel[slot] = {form = accel_form:gsub("|f$", ""), lemma = accel_lemma_f}
else
data.accel[slot] = {form = accel_form:gsub("|m$", ""), lemma = accel_lemma}
end
else
if not data.forms.nom_sg_n and not data.forms.nom_pl_n then
-- use multipart tags if called for
accel_form = accel_form:gsub("|m$", "|m//f//n")
elseif not data.forms.nom_sg_f and not data.forms.nom_pl_f then
accel_form = accel_form:gsub("|m$", "|m//f")
end
-- use the order nom|m|s, which is more standard than nom|s|m
accel_form = accel_form:gsub("|(.-)|(.-)$", "|%2|%1")
data.accel[slot] = {form = accel_form, lemma = accel_lemma}
end
if not redlink and namespace == "" and not form:find("%[") then
local lang = lang or get_lang()
local title = lang:logicalToPhysical(lang:stripDiacritics(form))
local t = mw.title.new(title)
if t and not t.exists then
insert(data.categories, data.pos ..
" có liên kết đỏ trong bảng biến tố của chúng " .. lang:getCanonicalName())
redlink = true
end
end
end
end
end
end
-- Convert data.forms[slot] for all slots into displayable text. This is
-- an older function, still currently used for nouns but not for adjectives.
-- For adjectives, the adjective table module has special code to combine
-- adjacent slots, and needs the original forms plus other text that will
-- go into the displayable text for the slot; this is handled below by
-- partial_show_forms() and finish_show_form().
local function show_forms(data, is_adj)
local noteindex = 1
local notes = {}
local seen_notes = {}
for slot in iter_slots(is_adj) do
local val = data.forms[slot]
if val and val ~= "" and val ~= "—" then
for i, form in ipairs(val) do
local link = link_if_attested(form, data.accel[slot], data.unattested[slot])
local this_notes = data.notes[slot .. i]
if this_notes and not data.user_specified[slot] then
if type(this_notes) == "string" then
this_notes = {this_notes}
end
local link_indices = {}
for _, this_note in ipairs(this_notes) do
local this_noteindex = seen_notes[this_note]
if not this_noteindex then
-- Generate a footnote index.
this_noteindex = noteindex
noteindex = noteindex + 1
insert(notes, '<sup style="color: var(--wikt-palette-red,red)">' .. this_noteindex .. '</sup>' .. this_note)
seen_notes[this_note] = this_noteindex
end
insert_if_not(link_indices, this_noteindex)
end
val[i] = link .. '<sup style="color: var(--wikt-palette-red,red)">' .. concat(link_indices, ",") .. '</sup>'
else
val[i] = link
end
end
-- FIXME, do we want this difference?
data.forms[slot] = concat(val, is_adj and ", " or "<br />")
end
end
for _, footnote in ipairs(data.footnotes) do
insert(notes, footnote)
end
data.footnotes = concat(notes, "<br />")
end
-- Generate the display form for a set of slots with identical content. We
-- verify that the slots are actually identical, and throw an assertion error
-- if not. The display form is as in show_forms() but combines together all the
-- accelerator forms for all the slots.
local function finish_show_form(data, slots, is_adj)
assert(#slots > 0)
local slot1 = slots[1]
local forms = data.forms[slot1]
local notetext = data.notetext[slot1]
for _, slot in ipairs(slots) do
if not deep_equals(data.forms[slot], forms) then
error("data.forms[" .. slot1 .. "] = " .. (concat_forms_in_slot(forms) or "nil") ..
", but data.forms[" .. slot .. "] = " .. (concat_forms_in_slot(data.forms[slot]) or "nil"))
end
assert(deep_equals(data.notetext[slot], notetext))
end
if not forms then
return "—"
else
local accel_forms = {}
local accel_lemma = data.accel[slot1].lemma
for _, slot in ipairs(slots) do
assert(data.accel[slot].lemma == accel_lemma)
insert(accel_forms, data.accel[slot].form)
end
local combined_accel_form = concat(accel_forms, "|;|")
local accel = {form = combined_accel_form, lemma = accel_lemma}
local formtext = {}
for i, form in ipairs(forms) do
insert(formtext, link_if_attested(form, accel, data.unattested[slot1]) .. notetext[i])
end
-- FIXME, do we want this difference?
return concat(formtext, is_adj and ", " or "<br />")
end
end
-- Used by the adjective table module. This does some of the work of
-- show_forms(); in particular, it converts all empty forms of any format
-- (nil, "", "—") to nil and, if the forms aren't empty, generates the footnote
-- text associated with each form.
local function partial_show_forms(data, is_adj)
local noteindex = 1
local notes = {}
local seen_notes = {}
data.notetext = {}
-- Store this function in DATA so that it can be called from the adjective
-- table module without needing to require this module, which will (or
-- could) lead to recursive module requiring.
data.finish_show_form = finish_show_form
for slot in iter_slots(is_adj) do
local val = data.forms[slot]
if not val or val == "" or val == "—" then
data.forms[slot] = nil
else
local notetext = {}
for i in ipairs(val) do
local this_notes = data.notes[slot .. i]
if this_notes and not data.user_specified[slot] then
if type(this_notes) == "string" then
this_notes = {this_notes}
end
local link_indices = {}
for _, this_note in ipairs(this_notes) do
local this_noteindex = seen_notes[this_note]
if not this_noteindex then
-- Generate a footnote index.
this_noteindex = noteindex
noteindex = noteindex + 1
insert(notes, '<sup style="color: var(--wikt-palette-red,red)">' .. this_noteindex .. '</sup>' .. this_note)
seen_notes[this_note] = this_noteindex
end
insert_if_not(link_indices, this_noteindex)
end
insert(notetext, '<sup style="color: var(--wikt-palette-red,red)">' .. concat(link_indices, ",") .. '</sup>')
else
insert(notetext, "")
end
end
data.notetext[slot] = notetext
end
end
for _, footnote in ipairs(data.footnotes) do
insert(notes, footnote)
end
data.footnotes = concat(notes, "<br />")
end
-- Given an ending (or possibly a full regex matching the entire lemma, if
-- a regex group is present), return the base minus the ending, or nil if
-- the ending doesn't match.
local function extract_base(lemma, ending)
if ending:find("(", nil, true) then
return umatch(lemma, ending)
end
return umatch(lemma, "^(.*)" .. ending .. "$")
end
-- Given ENDINGS_AND_SUBTYPES (a list of pairs of endings with associated
-- subtypes, where each pair consists of a single ending spec and a list of
-- subtypes), check each ending in turn against LEMMA. If it matches, return
-- the pair BASE, STEM2, SUBTYPES where BASE is the remainder of LEMMA minus
-- the ending, STEM2 is as passed in, and SUBTYPES is the subtypes associated
-- with the ending. But don't return SUBTYPES if any of the subtypes in the
-- list is specifically canceled in SPECIFIED_SUBTYPES (a set, i.e. a table
-- where the keys are strings and the value is always true); instead, consider
-- the next ending in turn. If no endings match, throw an error if DECLTYPE is
-- non-nil, mentioning the DECLTYPE (the user-specified declension); but if
-- DECLTYPE is nil, just return nil, nil, nil.
--
-- The ending spec in ENDINGS_AND_SUBTYPES is one of the following:
--
-- 1. A simple string, e.g. "tūdō", specifying an ending.
-- 2. A regex that should match the entire lemma (it should be anchored at
-- the beginning with ^ and at the end with $), and contains a single
-- capturing group to match the base.
-- 3. A pair {SIMPLE_STRING_OR_REGEX, STEM2_ENDING} where
-- SIMPLE_STRING_OR_REGEX is one of the previous two possibilities and
-- STEM2_ENDING is a string specifying the corresponding ending that must
-- be present in STEM2. If this form is used, the combination of
-- base + STEM2_ENDING must exactly match STEM2 in order for this entry
-- to be considered a match. An example is {"is", ""}, which will match
-- lemma == "follis", stem2 == "foll", but not lemma == "lapis",
-- stem2 == "lapid".
local function get_noun_subtype_by_ending(lemma, stem2, decltype, specified_subtypes,
endings_and_subtypes)
for _, ending_and_subtypes in ipairs(endings_and_subtypes) do
local ending = ending_and_subtypes[1]
local subtypes = ending_and_subtypes[2]
local not_this_subtype = false
if (
specified_subtypes.pl and not contains(subtypes, "pl") or
contains(subtypes, "both") and not specified_subtypes.both
) then
-- We now require that plurale tantum terms specify a plural-form lemma.
-- The autodetected subtypes will include 'pl' for such lemmas; if not,
-- we fail this entry. Additionally, if the rule contains 'both', it
-- must be explicitly specified to match.
not_this_subtype = true
else
for _, subtype in ipairs(subtypes) do
-- A subtype is directly canceled by specifying -SUBTYPE.
-- In addition, M or F as a subtype is canceled by N, and
-- vice-versa, but M doesn't cancel F or vice-versa; instead,
-- we simply ignore the conflicting gender specification when
-- constructing the combination of specified and inferred subtypes.
-- The reason for this is that neuters have distinct declensions
-- from masculines and feminines, but masculines and feminines have
-- the same declension, and various nouns in Latin that are
-- normally masculine are exceptionally feminine and vice-versa
-- (nauta, agricola, fraxinus, malus "apple tree", manus, rēs,
-- etc.).
--
-- In addition, sg as a subtype is canceled by pl and vice-versa.
-- It's also possible to specify both, which will override sg but
-- not cancel it (in the sense that it won't prevent the relevant
-- rule from matching). For example, there's a rule specifying that
-- lemmas beginning with a capital letter and ending in -ius take
-- the ius.voci.sg subtypes. Specifying such a lemma with the
-- subtype both will result in the ius.voci.both subtypes, whereas
-- specifying such a lemma with the subtype pl will cause this rule
-- not to match, and it will fall through to a less specific rule
-- that returns just the ius subtype, which will be combined with
-- the explicitly specified pl subtype to produce ius.pl.
if specified_subtypes["-" .. subtype] or
subtype == "N" and (specified_subtypes.M or specified_subtypes.F) or
(subtype == "M" or subtype == "F") and specified_subtypes.N or
subtype == "sg" and specified_subtypes.pl or
subtype == "pl" and specified_subtypes.sg then
not_this_subtype = true
break
end
end
end
if not not_this_subtype then
if type(ending) == "table" then
local lemma_ending = ending[1]
local stem2_ending = ending[2]
local base = extract_base(lemma, lemma_ending)
if base and base .. stem2_ending == stem2 then
return base, stem2, subtypes
end
else
local base = extract_base(lemma, ending)
if base then
return base, stem2, subtypes
end
end
end
end
if decltype then
error("Unrecognized ending for declension-" .. decltype .. " noun: " .. lemma)
end
return nil, nil, nil
end
-- Autodetect the subtype of a noun given all the information specified by the
-- user: lemma, stem2, declension type and specified subtypes. Three values are
-- returned: the lemma base (i.e. the stem of the lemma, as required by the
-- declension functions), the new stem2 and the autodetected subtypes. Note
-- that this will not detect a given subtype if the explicitly specified
-- subtypes are incompatible (i.e. if -SUBTYPE is specified for any subtype
-- that would be returned; or if M or F is specified when N would be returned,
-- and vice-versa; or if pl is specified when sg would be returned, and
-- vice-versa).
--
-- NOTE: This function has intimate knowledge of the way that the declension
-- functions handle subtypes, particularly for the third declension.
local function detect_noun_subtype(lemma, stem2, typ, subtypes)
local base, _
if typ == "1" then
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"ām", {"F", "am"}},
{"ās", {"M", "Greek", "Ma"}},
{"ēs", {"M", "Greek", "Me"}},
{"ā", {"F", "Greek", "Fa"}},
{"ē", {"F", "Greek"}},
{"ae", {"F", "pl"}},
-- If the lemma ends in -a and the user said N or -F, then F won't
-- apply, and the second (neuter) -a will apply; if the user said
-- pl, then the third (neuter plural) -a will apply.
{"a", {"F"}},
{"a", {"N"}},
{"a", {"N", "pl"}},
})
elseif typ == "2" then
local detected_subtypes
lemma, stem2, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"^(.*r)$", {"M", "er"}},
{"^(.*v)os$", {"M", "vos"}},
{"^(.*v)om$", {"N", "vom"}},
-- If the lemma ends in -os and the user said N or -M, then M won't
-- apply, and the second (neuter) -os will apply.
{"os", {"M", "Greek"}},
{"os", {"N", "Greek", "us"}},
{"on", {"N", "Greek"}},
-- -ius beginning with a capital letter is assumed a proper name,
-- and takes the voci subtype (vocative in -ī) along with the ius
-- subtype and sg-only. Other nouns in -ius just take the ius
-- subtype. Explicitly specify "sg" so that if .pl is given,
-- this rule won't apply.
{"^(%u.*)[iï]us$", {"M", "ius", "voci", "sg"}},
{"[iï]us", {"M", "ius"}},
{"[iï]um", {"N", "ium"}},
-- If the lemma ends in -us and the user said N or -M, then M won't
-- won't apply, and the second (neuter) -us will apply.
{"us", {"M"}},
{"us", {"N", "us"}},
{"um", {"N"}},
{"[iï]ī", {"M", "ius", "pl"}},
{"[iï]a", {"N", "ium", "pl"}},
-- If the lemma ends in -ī and the user said N or -M, then M won't
-- apply, and the second (neuter) -ī will apply.
{"ī", {"M", "pl"}},
{"ī", {"N", "us", "pl"}},
{"oe", {"M", "Greek", "pl"}},
{"a", {"N", "pl"}},
})
stem2 = stem2 or lemma
return lemma, stem2, detected_subtypes
elseif typ == "3" then
if subtypes.pl then
if subtypes.Greek then
base = lemma:match("^(.*)erēs$")
if base then
return base .. "ēr", base .. "er", {"er"}
end
base = lemma:match("^(.*)ontēs$")
if base then
return base .. "ōn", base .. "ont", {"on"}
end
base = lemma:match("^(.*)es$")
if base then
return base, stem2 or base, {}
end
error("Unrecognized ending for declension-3 plural Greek noun: " .. lemma)
end
base = lemma:match("^(.*)[iï]a$")
if base then
return base, stem2 or base, {"N", "I", "pure"}
end
base = lemma:match("^(.*)a$")
if base then
return base, stem2 or base, {"N"}
end
base = lemma:match("^(.*)ēs$")
if base then
return base, stem2 or base, {}
end
error("Unrecognized ending for declension-3 plural noun: " .. lemma)
end
stem2 = stem2 or make_stem2(lemma)
local detected_subtypes
if subtypes.Greek then
base, _, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, nil, subtypes, {
{{"is", ""}, {"I"}},
{"ēr", {"er"}},
{"ōn", {"on"}},
})
if base then
return lemma, stem2, detected_subtypes
end
return lemma, stem2, {}
end
if not subtypes.N then
base, _, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, nil, subtypes, {
{{"^(%u.*pol)is$", ""}, {"F", "polis", "sg", "loc"}},
{{"tūdō", "tūdin"}, {"F"}},
{{"tās", "tāt"}, {"F"}},
{{"tūs", "tūt"}, {"F"}},
{{"tiō", "tiōn"}, {"F"}},
{{"siō", "siōn"}, {"F"}},
{{"xiō", "xiōn"}, {"F"}},
{{"gō", "gin"}, {"F"}},
{{"or", "ōr"}, {"M"}},
{{"tr[iī]x", "trīc"}, {"F"}},
{{"is", ""}, {"I"}},
{{"^(%l.*)ēs$", ""}, {"I"}},
})
if base then
return lemma, stem2, detected_subtypes
end
end
base, _, detected_subtypes = get_noun_subtype_by_ending(lemma, stem2, nil, subtypes, {
{{"us", "or"}, {"N"}},
{{"us", "er"}, {"N"}},
{{"ma", "mat"}, {"N"}},
{{"men", "min"}, {"N"}},
{{"^(%u.*)[eë]$", ""}, {"N", "sg"}},
{{"[eë]", ""}, {"N", "I", "pure"}},
{{"al", "āl"}, {"N", "I", "pure"}},
{{"ar", "ār"}, {"N", "I", "pure"}},
})
if base then
return lemma, stem2, detected_subtypes
end
return lemma, stem2, {}
elseif typ == "4" then
if subtypes.echo or subtypes.Callisto then
base = lemma:match("^(.*)ō$")
if not base then
error("Declension-4 noun of subtype .echo or .Callisto should end in -ō: " .. lemma)
end
if subtypes.Callisto then
return base, nil, {"F", "sg"}
else
return base, nil, {"F"}
end
end
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"us", {"M"}},
{"ū̆", {"N"}},
{"ūs", {"M", "pl"}},
{"[uü]a", {"N", "pl"}},
})
elseif typ == "5" then
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"[iï]ēs", {"F", "i"}},
{"[iï]ēs", {"F", "i", "pl"}},
{"ēs", {"F"}},
{"ēs", {"F", "pl"}},
})
elseif typ == "sgpl" then
return lemma, stem2, {}
elseif typ == "irreg" and lemma == "domus" then
-- [[domus]] auto-sets data.loc = true, but we need to know this
-- before declining the noun so we can propagate it to other segments.
return lemma, nil, {"loc"}
elseif typ == "indecl" or typ == "irreg" and (
lemma == "Deus" or umatch(lemma, "^[IJ]ēs[uū]s$") or
lemma == "Athōs" or lemma == "vēnum"
) then
-- Indeclinable nouns, and certain irregular nouns, set data.num = "sg",
-- but we need to know this before declining the noun so we can
-- propagate it to other segments.
return get_noun_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"", {"both"}},
{"", {"sg"}},
{"", {"pl"}},
})
else
return lemma, nil, {}
end
end
-- Given ENDINGS_AND_SUBTYPES (a list of four-tuples of ENDING, RETTYPE,
-- SUBTYPES, PROCESS_RETVAL), check each ENDING in turn against LEMMA and
-- STEM2. If it matches, return a four-tuple BASE, STEM2, RETTYPE, NEW_SUBTYPES
-- where BASE is normally the remainder of LEMMA minus the ending, STEM2 is
-- as passed in, RETTYPE is as passed in, and NEW_SUBTYPES is the same as
-- SUBTYPES minus any subtypes beginning with a hyphen. If no endings match,
-- throw an error if DECLTYPPE is non-nil, mentioning the DECLTYPE
-- (user-specified declension); but if DECLTYPE is nil, just return the tuple
-- nil, nil, nil, nil.
--
-- In order for a given entry to match, ENDING must match and also the subtypes
-- in SUBTYPES (a list) must not be incompatible with the passed-in
-- user-specified subtypes SPECIFIED_SUBTYPES (a set, i.e. a table where the
-- keys are strings and the value is always true). "Incompatible" means that
-- a given SUBTYPE is specified in either one and -SUBTYPE in the other, or
-- that "pl" is found in SPECIFIED_SUBTYPES and not in SUBTYPES.
--
-- The ending spec in ENDINGS_AND_SUBTYPES is one of the following:
--
-- 1. A simple string, e.g. "tūdō", specifying an ending.
-- 2. A regex that should match the entire lemma (it should be anchored at
-- the beginning with ^ and at the end with $), and contains a single
-- capturing group to match the base.
-- 3. A pair {SIMPLE_STRING_OR_REGEX, STEM2_ENDING} where
-- SIMPLE_STRING_OR_REGEX is one of the previous two possibilities and
-- STEM2_ENDING is a string specifying the corresponding ending that must
-- be present in STEM2. If this form is used, the combination of
-- base + STEM2_ENDING must exactly match STEM2 in order for this entry
-- to be considered a match. An example is {"is", ""}, which will match
-- lemma == "follis", stem2 == "foll", but not lemma == "lapis",
-- stem2 == "lapid".
--
-- If PROCESS_STEM2 is given and the returned STEM2 would be nil, call
-- process_stem2(BASE) to get the STEM2 to return.
local function get_adj_type_and_subtype_by_ending(lemma, stem2, decltype,
specified_subtypes, endings_and_subtypes, process_stem2)
for _, ending_and_subtypes in ipairs(endings_and_subtypes) do
local ending = ending_and_subtypes[1]
local rettype = ending_and_subtypes[2]
local subtypes = ending_and_subtypes[3]
local process_retval = ending_and_subtypes[4]
local not_this_subtype = false
if (
specified_subtypes.pl and not contains(subtypes, "pl") or
contains(subtypes, "both") and not specified_subtypes.both
) then
-- We now require that plurale tantum terms specify a plural-form lemma.
-- The autodetected subtypes will include 'pl' for such lemmas; if not,
-- we fail this entry. Additionally, if the rule contains 'both', it
-- must be explicitly specified to match.
not_this_subtype = true
else
for _, subtype in ipairs(subtypes) do
-- A subtype is directly canceled by specifying -SUBTYPE.
if specified_subtypes["-" .. subtype] then
not_this_subtype = true
break
end
-- A subtype is canceled if the user specified SUBTYPE and
-- -SUBTYPE is given in the to-be-returned subtypes.
local must_not_be_present = subtype:match("^%-(.*)$")
if must_not_be_present and specified_subtypes[must_not_be_present] then
not_this_subtype = true
break
end
end
end
if not not_this_subtype then
local base
if type(ending) == "table" then
local lemma_ending = ending[1]
local stem2_ending = ending[2]
base = extract_base(lemma, lemma_ending)
if base and base .. stem2_ending ~= stem2 then
base = nil
end
else
base = extract_base(lemma, ending)
end
if base then
-- Remove subtypes of the form -SUBTYPE from the subtypes
-- to be returned.
local new_subtypes = {}
for _, subtype in ipairs(subtypes) do
if subtype:sub(1, 1) ~= "-" then
insert(new_subtypes, subtype)
end
end
if process_retval then
base, stem2 = process_retval(base, stem2)
end
if process_stem2 then
stem2 = stem2 or process_stem2(base)
end
return base, stem2, rettype, new_subtypes
end
end
end
if not decltype then
return nil, nil, nil, nil
elseif decltype == "" then
error("Unrecognized ending for adjective: " .. lemma)
else
error("Unrecognized ending for declension-" .. decltype .. " adjective: " .. lemma)
end
end
-- Autodetect the type and subtype of an adjective given all the information
-- specified by the user: lemma, stem2, declension type and specified subtypes.
-- Four values are returned: the lemma base (i.e. the stem of the lemma, as
-- required by the declension functions), the value of stem2 to pass to the
-- declension function, the declension type and the autodetected subtypes.
-- Note that this will not detect a given subtype if -SUBTYPE is specified for
-- any subtype that would be returned, or if SUBTYPE is specified and -SUBTYPE
-- is among the subtypes that would be returned (such subtypes are filtered out
-- of the returned subtypes).
local function detect_adj_type_and_subtype(lemma, stem2, typ, subtypes)
local function base_as_stem2(base, stem2)
return base, base
end
local function constant_base(baseval)
return function(base, stem2)
return baseval, nil
end
end
local function decl12_stem2(base)
return base
end
local function decl3_stem2(base)
return make_stem2(base)
end
local decl12_entries = {
{"us", "1&2+", {}},
{"a", "1&2+", {}},
{"um", "1&2+", {}},
{"ī", "1&2+", {"pl"}},
{"ae", "1&2+", {"pl"}},
{"a", "1&2+", {"pl"}},
-- Nearly all -os adjectives are greekA
{"os", "1&2+", {"greekA", "-greekE"}},
{"os", "1&2+", {"greekE", "-greekA"}},
{"ē", "1&2+", {"greekE", "-greekA"}},
{"on", "1&2+", {"greekA", "-greekE"}},
{"on", "1&2+", {"greekE", "-greekA"}},
{"^(.*er)$", "1&2+", {"er"}},
{"^(.*ur)$", "1&2+", {"er"}},
{"^(h)ic$", "1&2+", {"ic"}},
}
local decl3_entries = {
{"^(.*er)$", "3-3+", {"I"}},
{"^(.*er)$", "3-3+", {}},
{"is", "3-2+", {"I"}},
{"is", "3-2+", {}},
{"e", "3-2+", {"I"}},
{"e", "3-2+", {}},
{"^(.*[iïj])or$", "3-C+", {"abl_e_i", "-abl_i_e"}},
{"^(.*[iïj])or$", "3-C+", {}},
{"^(min)or$", "3-C+", {"abl_e_i", "-abl_i_e"}},
{"^(min)or$", "3-C+", {}},
{"^(.*trīx)$", "3-def+", {"trix", "abl_i_e", "-abl_e_i"}},
{"^(.*trīx)$", "3-def+", {"trix"}},
{"^(.*tor)$", "3-def+", {"tor", "abl_i_e", "-abl_e_i"}},
{"^(.*tor)$", "3-def+", {"tor"}},
-- Detect -ēs as 3-1 without auto-inferring .pl if .pl
-- not specified. If we don't do this, the later entry for
-- -ēs will auto-infer .pl whenever -ēs is specified (which
-- won't work for adjectives like quadripēs, volucripēs).
-- Essentially, for declension-3 adjectives, we require that
-- .pl is given if the lemma is plural.
--
-- Most 3-1 adjectives are i-stem (e.g. audāx) so we require -I
-- to be given with non-i-stem adjectives. The first entry below
-- will apply when -I isn't given, the second when it is given.
{"^(.*ēs)$", "3-1+", {"I", "abl_i_e", "-abl_e_i"}},
{"^(.*ēs)$", "3-1+", {"I"}},
{"^(.*ēs)$", "3-1+", {"par", "abl_i_e", "-abl_e_i"}},
{"^(.*ēs)$", "3-1+", {"par"}},
{"^(.*[iïj])ōrēs$", "3-C+", {"pl"}},
{"^(min)ōrēs$", "3-C+", {"pl"}},
-- If .pl with -ēs, we don't know if the adjective is 3-1, 3-2
-- or 3-3. Since 3-2 is probably the most common, we infer it
-- (as well as the fact that these adjectives *are* in a sense
-- 3-2 since they have a distinct neuter in -(i)a. Note that
-- we have two entries here; the first one will apply unless
-- -I is given, and will infer an i-stem adjective; the second
-- one will apply otherwise (and infer a non-i-stem 3-1 adjective).
{"ēs", "3-2+", {"pl", "I"}, base_as_stem2},
{"ēs", "3-1+", {"pl", "par"}, base_as_stem2},
-- Same for neuters.
{"ia", "3-2+", {"pl", "I"}, base_as_stem2},
{"a", "3-1+", {"pl", "par"}, base_as_stem2},
-- As above for -ēs but for miscellaneous singulars.
{"", "3-1+", {"I", "abl_i_e", "-abl_e_i"}},
{"", "3-1+", {"I"}},
{"", "3-1+", {"par", "abl_i_e", "-abl_e_i"}},
{"", "3-1+", {"par"}},
}
local function get_subtypes_and_endings(typ, f)
local subtypes_and_endings = {}
for _, v in ipairs(decl3_entries) do
if f(v) then
v = deep_copy(v)
v[2] = typ
insert(subtypes_and_endings, v)
end
end
return subtypes_and_endings
end
local function compare(spec)
return spec[2] == typ
end
if typ == "+" then
local base, new_stem2, rettype, new_subtypes = get_adj_type_and_subtype_by_ending(lemma, stem2, nil, subtypes, decl12_entries, decl12_stem2)
if base then
return base, new_stem2, rettype, new_subtypes
else
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, decl3_entries, decl3_stem2)
end
elseif typ == "3+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, decl3_entries, decl3_stem2)
elseif typ == "1&2+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, decl12_entries, decl12_stem2)
elseif typ == "1-1+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"a", typ, {}},
{"ae", typ, {"pl"}},
})
elseif typ == "2-2+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"us", typ, {}},
{"um", typ, {}},
{"ī", typ, {"pl"}},
{"a", typ, {"pl"}},
{"os", typ, {"greek"}},
{"on", typ, {"greek"}},
{"oe", typ, {"greek", "pl"}},
})
elseif typ == "3-1+" then
-- Use the specs from `decl3_entries`, but add the two i-stem 3-2+ specs when plural-only, as they're the same when 3-1+.
local subtypes_and_endings = get_subtypes_and_endings(typ, function(spec)
local spec1, spec2 = spec[1], spec[2]
return spec2 == typ or (spec2 == "3-2+" and spec1 == "ēs" or spec1 == "ia")
end)
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, subtypes_and_endings, decl3_stem2)
elseif typ == "3-def+" then
-- Like 3-1+ but defective in gender
local subtypes_and_endings = get_subtypes_and_endings(typ, compare)
insert(subtypes_and_endings, {"", typ, {"I"}})
insert(subtypes_and_endings, {"", typ, {"par"}})
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, subtypes_and_endings, decl3_stem2)
elseif typ == "3-2+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"is", typ, {}},
{"e", typ, {}},
-- Detect -ēs as 3-2 without auto-inferring .pl if .pl
-- not specified. If we don't do this, the later entry for
-- -ēs will auto-infer .pl whenever -ēs is specified (which
-- won't work for adjectives like isoscelēs). Essentially,
-- for declension-3 adjectives, we require that .pl is given
-- if the lemma is plural.
{"ēs", typ, {}},
{"ēs", typ, {"pl"}},
{"ia", typ, {"pl"}},
}, decl3_stem2)
elseif typ == "3-3+" or typ == "3-P+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"ēs", typ, {"pl"}, base_as_stem2},
{"ia", typ, {"pl"}, base_as_stem2},
{"", typ, {}},
}, decl3_stem2)
elseif typ == "3-C+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, get_subtypes_and_endings(typ, compare), decl3_stem2)
elseif typ == "irreg+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"^(duo)$", typ, {"pl"}},
{"^(ambō)$", typ, {"pl"}},
{"^(mīll?ia)$", typ, {"N", "pl"}, constant_base("mīlle")},
-- match ea
{"^(ea)$", typ, {}, constant_base("is")},
-- match id
{"^(id)$", typ, {}, constant_base("is")},
-- match plural eī, iī
{"^([ei]ī)$", typ, {"pl"}, constant_base("is")},
-- match plural ea, eae
{"^(eae?)$", typ, {"pl"}, constant_base("is")},
-- match eadem
{"^(eadem)$", typ, {}, constant_base("īdem")},
-- match īdem, idem
{"^([īi]dem)$", typ, {}, constant_base("īdem")},
-- match plural īdem
{"^(īdem)$", typ, {"pl"}},
-- match plural eadem, eaedem
{"^(eae?dem)$", typ, {"pl"}, constant_base("īdem")},
-- match illa, ipsa, ista; it doesn't matter if we overmatch because
-- we'll get an error as we use the stem itself in the returned base
{"^(i[lps][lst])a$", typ, {}, function(base, stem2) return base .. "e", nil end},
-- match illud, istud; as above, it doesn't matter if we overmatch
{"^(i[ls][lt])ud$", typ, {}, function(base, stem2) return base .. "e", nil end},
-- match ipsum
{"^(ipsum)$", typ, {}, constant_base("ipse")},
-- match plural illī, ipsī, istī; as above, it doesn't matter if we
-- overmatch
{"^(i[lps][lst])ī$", typ, {"pl"}, function(base, stem2) return base .. "e", nil end},
-- match plural illa, illae, ipsa, ipsae, ista, istae; as above, it
-- doesn't matter if we overmatch
{"^(i[lps][lst])ae?$", typ, {"pl"}, function(base, stem2) return base .. "e", nil end},
-- Detect quī as non-plural unless .pl specified.
{"^(quī)$", typ, {}},
-- Otherwise detect quī as plural.
{"^(quī)$", typ, {"pl"}},
-- Same for quae.
{"^(quae)$", typ, {}, constant_base("quī")},
{"^(quae)$", typ, {"pl"}, constant_base("quī")},
{"^(quid)$", typ, {}, constant_base("quis")},
{"^(quod)$", typ, {}, constant_base("quī")},
{"^(qui[cd]quid)$", typ, {}, constant_base("quisquis")},
{"^(quīquī)$", typ, {"pl"}, constant_base("quisquis")},
{"^(quaequae)$", typ, {"pl"}, constant_base("quisquis")},
-- match all remaining lemmas in lemma form
{"", typ, {}},
})
elseif typ == "indecl+" then
return get_adj_type_and_subtype_by_ending(lemma, stem2, typ, subtypes, {
{"", typ, {"both"}},
{"", typ, {"sg"}},
{"", typ, {"pl"}},
})
else -- 0+
return lemma, nil, typ, {}
end
end
-- Parse a segment (e.g. "lūna<1>", "aegis/aegid<3.Greek>", "bōs<irreg.F>",
-- bonus<+>", or "[[vetus]]/veter<3+.-I>"), consisting of a lemma (or optionally
-- a lemma/stem) and declension+subtypes, where a + in the declension indicates
-- an adjective. Brackets can be present to indicate links, for use in
-- {{la-noun}} and {{la-adj}}. The return value is a table, e.g.:
-- {
-- decl = "1",
-- is_adj = false,
-- orig_lemma = "lūna",
-- lemma = "lūna",
-- stem2 = nil,
-- gender = "F",
-- types = {["F"] = true},
-- args = {"lūn"}
-- }
--
-- or
--
-- {
-- decl = "3",
-- is_adj = false,
-- orig_lemma = "aegis",
-- lemma = "aegis",
-- stem2 = "aegid",
-- gender = nil,
-- types = {["Greek"] = true},
-- args = {"aegis", "aegid"}
-- }
--
-- or
--
-- {
-- decl = "irreg",
-- is_adj = false,
-- orig_lemma = "bōs",
-- lemma = "bōs",
-- stem2 = nil,
-- gender = "F",
-- types = {["F"] = true},
-- args = {"bōs"}
-- }
-- or
--
-- {
-- decl = "1&2+",
-- is_adj = true,
-- orig_lemma = "bonus",
-- lemma = "bonus",
-- stem2 = nil,
-- gender = nil,
-- types = {},
-- args = {"bon"}
-- }
--
-- or
--
-- {
-- decl = "3-1+",
-- is_adj = true,
-- orig_lemma = "[[vetus]]",
-- lemma = "vetus",
-- stem2 = "veter",
-- gender = nil,
-- types = {},
-- args = {"vetus", "veter"}
-- }
local function parse_segment(segment)
local stem_part, spec_part = segment:match("^(.*)<(.-)>$")
local stems = split(stem_part, "/", true, true)
local specs = split(spec_part, ".", true, true)
local types = {}
local num = nil
local loc = false
local args = {}
local decl
for j, spec in ipairs(specs) do
if j == 1 then
decl = spec
else
local begins_with_hyphen
begins_with_hyphen, spec = spec:match("^(%-?)(.*)$")
spec = begins_with_hyphen .. spec:gsub("%-", "_")
types[spec] = true
end
end
local orig_lemma = stems[1]
if not orig_lemma or orig_lemma == "" then
orig_lemma = pagename or get_pagename()
end
local lemma = remove_links(orig_lemma)
local stem2 = stems[2]
if stem2 == "" then
stem2 = nil
end
if #stems > 2 then
error("Too many stems, at most 2 should be given: " .. stem_part)
end
local base, detected_subtypes
local is_adj = false
local gender = nil
if decl:find("+", nil, true) then
base, stem2, decl, detected_subtypes = detect_adj_type_and_subtype(lemma, stem2, decl, types)
is_adj = true
for _, subtype in ipairs(detected_subtypes) do
if types["-" .. subtype] then
-- if a "cancel subtype" spec is given, remove the cancel spec
-- and don't apply the subtype
types["-" .. subtype] = nil
else
types[subtype] = true
end
end
else
base, stem2, detected_subtypes = detect_noun_subtype(lemma, stem2, decl, types)
for _, subtype in ipairs(detected_subtypes) do
if types["-" .. subtype] then
-- if a "cancel subtype" spec is given, remove the cancel spec
-- and don't apply the subtype
types["-" .. subtype] = nil
elseif (subtype == "M" or subtype == "F" or subtype == "N") and
(types.M or types.F or types.N) then
-- if gender already specified, don't create conflicting gender spec
elseif (subtype == "sg" or subtype == "pl" or subtype == "both") and
(types.sg or types.pl or types.both) then
-- if number restriction already specified, don't create conflicting
-- number restriction spec
else
types[subtype] = true
end
end
if not types.pl and not types.both and umatch(lemma, "^%u") then
types.sg = true
end
end
if types.loc then
loc = true
types.loc = nil
end
if types.M then
gender = "M"
elseif types.F then
gender = "F"
elseif types.N then
gender = "N"
end
if types.pl then
num = "pl"
types.pl = nil
elseif types.sg then
num = "sg"
types.sg = nil
end
args[1] = base
args[2] = stem2
return {
decl = decl,
is_adj = is_adj,
gender = gender,
orig_lemma = orig_lemma,
lemma = lemma,
stem2 = stem2,
types = types,
num = num,
loc = loc,
args = args,
}
end
-- Parse a segment run (i.e. a string with zero or more segments [see
-- parse_segment] and optional surrounding text, e.g. "foenum<2>-graecum<2>"
-- or "[[pars]]/part<3.abl-e-occ-i> [[oratio|ōrātiōnis]]"). The segment run
-- currently cannot contain any alternants (e.g. "((epulum<2.sg>,epulae<1>))").
-- The return value is a table of the following form:
-- {
-- segments = PARSED_SEGMENTS (a list of parsed segments),
-- loc = LOC (a boolean indicating whether any of the individual segments
-- has a locative),
-- num = NUM (the first specified value for a number restriction, or nil if
-- no number restrictions),
-- gender = GENDER (the first specified or inferred gender, or nil if none),
-- is_adj = IS_ADJ (true if all segments are adjective segments, false if
-- there's at least one noun segment, nil if only raw-text segments),
-- propses = PROPSES (list of per-word properties, where each element is an
-- object {
-- decl = DECL (declension),
-- types = TYPES (set describing the subtypes of a given word),
-- }
-- }
-- Each element in PARSED_SEGMENTS is as returned by parse_segment() but will
-- have an additional .orig_prefix field indicating the text before the segment
-- (including bracketed links) and corresponding .prefix field indicating the text
-- with bracketed links resolved. If there is trailing text, the last element will
-- have only .orig_prefix and .prefix fields containing that trailing text.
local function parse_segment_run(segment_run)
local loc = nil
local num = nil
local is_adj = nil
-- If the segment run begins with a hyphen, include the hyphen in the
-- set of allowed characters for a declined segment. This way, e.g. the
-- suffix [[-cen]] can be declared as {{la-ndecl|-cen/-cin<3>}} rather than
-- {{la-ndecl|-cen/cin<3>}}, which is less intuitive.
local is_suffix = segment_run:sub(1, 1) == "-"
local segments = {}
local propses = {}
-- We want to not break up a bracketed link followed by <> even if it has a space or
-- hyphen in it. So we do an outer capturing split to find the bracketed links followed
-- by <>, then do inner capturing splits on all the remaining text to find the other
-- declined terms.
local bracketed_segments = split(segment_run, "(%[%[[^%[%]]-%]%]<.->)")
for i, bracketed_segment in ipairs(bracketed_segments) do
if i % 2 == 0 then
insert(segments, bracketed_segment)
else
for _, subsegment in ipairs(split(bracketed_segment, is_suffix and "([^<> ,]+<.->)" or "([^<> ,%-]+<.->)")) do
insert(segments, subsegment)
end
end
end
local parsed_segments = {}
local gender = nil
for i = 2, (#segments - 1), 2 do
local parsed_segment = parse_segment(segments[i])
-- Overall locative is true if any segments call for locative.
loc = loc or parsed_segment.loc
-- The first specified value for num is used becomes the overall value.
num = num or parsed_segment.num
if is_adj == nil then
is_adj = parsed_segment.is_adj
else
is_adj = is_adj and parsed_segment.is_adj
end
gender = gender or parsed_segment.gender
parsed_segment.orig_prefix = segments[i - 1]
parsed_segment.prefix = remove_links(segments[i - 1])
parsed_segment.props = {
decl = parsed_segment.decl,
types = parsed_segment.types,
gender = parsed_segment.gender,
num = parsed_segment.num,
}
insert(parsed_segments, parsed_segment)
insert(propses, parsed_segment.props)
end
if segments[#segments] ~= "" then
insert(parsed_segments, {
orig_prefix = segments[#segments],
prefix = remove_links(segments[#segments]),
})
end
return {
segments = parsed_segments,
loc = loc,
num = num,
is_adj = is_adj,
gender = gender,
propses = propses,
}
end
-- Parse an alternant, e.g. "((epulum<2.sg>,epulae<1>))",
-- "((Serapis<3>,Serapis/Serapid<3>))" or
-- "((rēs<5>pūblica<1>,rēspūblica<1>))". The return value is a table of the form
-- {
-- alternants = PARSED_ALTERNANTS (a list of segment runs, each of which is a
-- list of parsed segments as returned by parse_segment_run()),
-- loc = LOC (a boolean indicating whether any of the individual segment runs
-- has a locative),
-- num = NUM (the overall number restriction, one of "sg", "pl" or "both"),
-- gender = GENDER (the first specified or inferred gender, or nil if none),
-- is_adj = IS_ADJ (true if all non-constant alternants are adjectives, false
-- if all nouns, nil if only constant alternants; conflicting alternants
-- cause an error),
-- propses = PROPSES (list of lists of per-word property objecs),
-- }
local function parse_alternant(alternant)
local parsed_alternants = {}
local alternant_spec = alternant:match("^%(%((.-)%)%)$")
local alternants = split(alternant_spec, ",", true, true)
local loc = false
local num = nil
local gender = nil
local is_adj = nil
local propses = {}
for i, alternant in ipairs(alternants) do
local parsed_run = parse_segment_run(alternant)
insert(parsed_alternants, parsed_run)
loc = loc or parsed_run.loc
-- First time through, set the overall num to the num of the first run,
-- even if nil. After that, if we ever see a run with a different value
-- of num, set the overall num to "both". That way, if all alternants
-- don't specify a num, we get an unspecified num, but if some do and
-- some don't, we get both, because an unspecified num defaults to
-- both.
if i == 1 then
num = parsed_run.num
elseif num ~= parsed_run.num then
-- FIXME, this needs to be rethought to allow for
-- adjective alternants.
num = "both"
end
gender = gender or parsed_run.gender
if is_adj == nil then
is_adj = parsed_run.is_adj
elseif parsed_run.is_adj ~= nil and parsed_run.is_adj ~= is_adj then
error("Saw both noun and adjective alternants; not allowed")
end
insert(propses, parsed_run.propses)
end
return {
alternants = parsed_alternants,
loc = loc,
num = num,
gender = gender,
is_adj = is_adj,
propses = propses,
}
end
-- Parse a segment run (see parse_segment_run()). Unlike for
-- parse_segment_run(), this can contain alternants such as
-- "((epulum<2.sg>,epulae<1>))" or "((Serapis<3.sg>,Serapis/Serapid<3.sg>))"
-- embedded in it to indicate words composed of multiple declensions.
-- The return value is a table of the following form:
-- {
-- segments = PARSED_SEGMENTS (a list of parsed segments),
-- loc = LOC (a boolean indicating whether any of the individual segments has
-- a locative),
-- num = NUM (the first specified value for a number restriction, or nil if
-- no number restrictions),
-- gender = GENDER (the first specified or inferred gender, or nil if none),
-- is_adj = IS_ADJ (true if all segments are adjective segments, false if
-- there's at least one noun segment, nil if only raw-text segments),
-- propses = PROPSES (list of either per-word property objects or lists of
-- lists of such objects),
-- }.
-- Each element in PARSED_SEGMENTS is one of three types:
--
-- 1. A regular segment, as returned by parse_segment() but with additional
-- .prefix and .orig_prefix fields indicating the text before the segment, as per
-- the return value of parse_segment_run().
-- 2. A raw-text segment, i.e. a table with only .prefix and .orig_prefix fields
-- containing the raw text.
-- 3. An alternating segment, as returned by parse_alternant().
-- Note that each alternant is a segment run rather than a single parsed
-- segment to allow for alternants like "((rēs<5>pūblica<1>,rēspūblica<1>))".
-- The parsed segment runs in PARSED_SEGMENT_RUNS are tables as returned by
-- parse_segment_run() (of the same form as the overall return value of
-- parse_segment_run_allowing_alternants()).
local function parse_segment_run_allowing_alternants(segment_run)
if segment_run:find(" ", nil, true) then
track("has-space")
end
if segment_run:find("((", nil, true) then
track("has-alternant")
end
local alternating_segments = split(segment_run, "(%(%(.-%)%))")
local parsed_segments = {}
local loc = false
local num = nil
local gender = nil
local is_adj = nil
local propses = {}
for i = 1, #alternating_segments do
local alternating_segment = alternating_segments[i]
if alternating_segment ~= "" then
local this_is_adj
if i % 2 == 1 then
local parsed_run = parse_segment_run(alternating_segment)
for _, parsed_segment in ipairs(parsed_run.segments) do
insert(parsed_segments, parsed_segment)
end
loc = loc or parsed_run.loc
num = num or parsed_run.num
gender = gender or parsed_run.gender
this_is_adj = parsed_run.is_adj
for _, props in ipairs(parsed_run.propses) do
insert(propses, props)
end
else
local parsed_alternating_segment = parse_alternant(alternating_segment)
insert(parsed_segments, parsed_alternating_segment)
loc = loc or parsed_alternating_segment.loc
num = num or parsed_alternating_segment.num
gender = gender or parsed_alternating_segment.gender
this_is_adj = parsed_alternating_segment.is_adj
insert(propses, parsed_alternating_segment.propses)
end
if is_adj == nil then
is_adj = this_is_adj
elseif this_is_adj ~= nil then
is_adj = is_adj and this_is_adj
end
end
end
if #parsed_segments > 1 then
track("multiple-segments")
end
return {
segments = parsed_segments,
loc = loc,
num = num,
gender = gender,
is_adj = is_adj,
propses = propses,
}
end
-- Combine each form in FORMS (a list of forms associated with a slot) with each
-- form in NEW_FORMS (either a single string for a single form, or a list of
-- forms) by concatenating EXISTING_FORM .. PREFIX .. NEW_FORM. Also combine
-- NOTES (a table specifying the footnotes associated with each existing form,
-- i.e. a map from form indices to lists of footnotes) with NEW_NOTES (new
-- footnotes associated with the new forms, in the same format as NOTES). Return
-- a pair NEW_FORMS, NEW_NOTES where either or both of FORMS and NOTES (but not
-- the sublists in NOTES) may be destructively modified to generate the return
-- values.
local function append_form(forms, notes, new_forms, new_notes, prefix)
if forms == nil then
return
end
new_forms = new_forms or ""
notes = notes or {}
new_notes = new_notes or {}
prefix = prefix or ""
if type(new_forms) == "table" and #new_forms == 1 then
new_forms = new_forms[1]
end
if type(new_forms) == "string" then
-- If there's only one new form, destructively modify the existing
-- forms and notes for this new form and its footnotes.
for i = 1, #forms do
forms[i] = forms[i] .. prefix .. new_forms
if new_notes[1] then
if not notes[i] then
notes[i] = new_notes[1]
else
local combined_notes = deep_copy(notes[i])
for _, note in ipairs(new_notes[1]) do
insert(combined_notes, note)
end
notes[i] = combined_notes
end
end
end
return forms, notes
else
-- If there are multiple new forms, we need to loop over all
-- combinations of new and old forms. In that case, use new tables
-- for the combined forms and notes.
local ret_forms = {}
local ret_notes = {}
for i=1, #forms do
for j=1, #new_forms do
insert(ret_forms, forms[i] .. prefix .. new_forms[j])
if new_notes[j] then
if not notes[i] then
-- We are constructing a linearized matrix of size
-- NI x NJ where J is in the inner loop. If I and J
-- are zero-based, the linear index of (I, J) is
-- I * NJ + J. However, we are one-based, so the
-- same formula won't work. Instead, we effectively
-- need to convert to zero-based indices, compute
-- the zero-based linear index, and then convert it
-- back to a one-based index, i.e.
--
-- (I - 1) * NJ + (J - 1) + 1
--
-- i.e. (I - 1) * NJ + J.
ret_notes[(i - 1) * #new_forms + j] = new_notes[j]
else
local combined_notes = deep_copy(notes[i])
for _, note in ipairs(new_notes[j]) do
insert(combined_notes, note)
end
ret_notes[(i - 1) * #new_forms + j] = combined_notes
end
end
end
end
return ret_forms, ret_notes
end
end
-- Destructively modify any forms in FORMS (a map from a slot to a form or a
-- list of forms) by converting sequences of ae, oe, Ae or Oe to the
-- appropriate ligatures.
local function apply_ligatures(forms, is_adj)
for slot in iter_slots(is_adj) do
if type(forms[slot]) == "string" then
forms[slot] = forms[slot]:gsub("[AaOo]e", ligatures)
elseif type(forms[slot]) == "table" then
for i = 1, #forms[slot] do
forms[slot][i] = forms[slot][i]:gsub("[AaOo]e", ligatures)
end
end
end
end
-- Modify any forms in FORMS (a map from a slot to a form or a list of forms) by
-- converting final m to optional n or m.
local function apply_sufn(forms, is_adj)
for slot in iter_slots(is_adj) do
if type(forms[slot]) == "string" then
if forms[slot]:sub(-1) == "m" then
forms[slot] = {forms[slot]:gsub("m$", "n"), forms[slot]}
end
elseif type(forms[slot]) == "table" then
-- See if there are any final m's.
local final_m
for i = 1, #forms[slot] do
if forms[slot][i]:sub(-1) == "m" then
final_m = true
break
end
end
if final_m then
local newval = {}
for i = 1, #forms[slot] do
if forms[slot][i]:sub(-1) == "m" then
insert(newval, (forms[slot][i]:gsub("m$", "n")))
end
insert(newval, forms[slot][i])
end
forms[slot] = newval
end
end
end
end
-- If NUM == "sg", copy the singular forms to the plural ones; vice-versa if
-- NUM == "pl". This should allow for the equivalent of plural
-- "alpha and omega" formed from two singular nouns, and for the equivalent of
-- plural "St. Vincent and the Grenadines" formed from a singular noun and a
-- plural noun. (These two examples actually occur in Russian, at least.)
local function propagate_number_restrictions(forms, num, is_adj)
if num == "sg" or num == "pl" then
for slot in iter_slots(is_adj) do
if slot:find(num, nil, true) then
local other_num_slot = num == "sg" and slot:gsub("sg", "pl") or slot:gsub("pl", "sg")
forms[other_num_slot] = type(forms[slot]) == "table" and deep_copy(forms[slot]) or forms[slot]
end
end
end
end
local function join_sentences(sentences, joiner)
-- Lowercase the first letter of all but the first sentence, and remove the
-- final period from all but the last sentence. Then join together with the
-- joiner (e.g. " and " or " or ").
-- FIXME: Should we join three or more as e.g. "foo, bar and baz"?
local sentences_to_join = {}
for i, sentence in ipairs(sentences) do
if i < #sentences then
sentence = sentence:gsub("%.$", "")
end
if i > 1 then
sentence = lcfirst(sentence)
end
insert(sentences_to_join, sentence)
end
return concat(sentences_to_join, joiner)
end
-- Construct the declension of a parsed segment run of the form returned by
-- parse_segment_run() or parse_segment_run_allowing_alternants(). Return value
-- is a table
-- {
-- forms = FORMS (keyed by slot, list of forms for that slot),
-- notes = NOTES (keyed by slot, map from form indices to lists of footnotes),
-- title = TITLE (list of titles for each segment in the run),
-- categories = CATEGORIES (combined categories for all segments),
-- }
local function decline_segment_run(parsed_run, pos, is_adj)
local declensions = {
-- For each possible slot (e.g. "abl_sg"), list of possible forms.
forms = {},
-- Keyed by slot (e.g. "abl_sg"). Value is a table indicating the footnotes
-- corresponding to the forms for that slot. Each such table maps indices
-- (the index of the corresponding form) to a list of one or more
-- footnotes.
notes = {},
title = {},
unattested = {},
subtitleses = {},
orig_titles = {},
categories = {},
footnotes = {},
-- May be set true if declining a 1-1 adjective
loc = false,
noneut = false,
nomf = false,
}
for slot in iter_slots(is_adj) do
declensions.forms[slot] = {""}
end
for i, seg in ipairs(parsed_run.segments) do
local decl = seg.decl
if decl then -- not an alternant, not a constant segment
seg.loc = parsed_run.loc
seg.num = seg.num or parsed_run.num
seg.gender = seg.gender or parsed_run.gender
local data, potential_lemma_slots
if seg.is_adj then
if not (m_adj_decl or get_m_adj_decl())[decl] then
error("Unrecognized declension '" .. decl .. "'")
end
potential_lemma_slots = potential_adj_lemma_slots
data = {
subtitles = {},
num = seg.num or "",
gender = seg.gender,
loc = seg.loc,
noneut = false,
nomf = false,
pos = is_adj and pos or "adjectives",
forms = {},
types = seg.types,
unattested = {},
categories = {},
notes = {},
}
(m_adj_decl or get_m_adj_decl())[decl](data, seg.args)
local apparent_decl = data.decl or decl
if data.loc then
declensions.loc = true
end
if data.noneut then
declensions.noneut = true
end
if data.nomf then
declensions.nomf = true
end
-- Construct title out of "original title" and subtitles.
if not data.title then
if decl == "irreg+" and apparent_decl ~= decl and #data.subtitles == 0 then
insert(data.subtitles, glossary_link("irregular"))
end
if declension_to_vi[apparent_decl] then
local english = declension_to_vi[apparent_decl]
data.title = "[[Appendix:Latin " .. english .. " declension|" .. english .. "-declension]]"
elseif apparent_decl == "irreg+" then
data.title = glossary_link("irregular")
elseif apparent_decl == "indecl+" or apparent_decl == "0+" then
data.title = glossary_link("indeclinable")
else
error("Internal error! Don't recognize adjective declension " .. apparent_decl)
end
data.title = data.title .. " " .. singularize(data.pos)
end
if data.types.sufn then
insert(data.subtitles, {"with", " ''m'' optionally → ''n'' in compounds"})
elseif data.types.not_sufn then
insert(data.subtitles, {"without", " ''m'' optionally → ''n'' in compounds"})
end
-- Record original title and subtitles for use in alternant title-constructing code.
insert(declensions.orig_titles, data.title)
if #data.subtitles > 0 then
local subtitles = {}
for _, subtitle in ipairs(data.subtitles) do
if type(subtitle) == "table" then
-- Occurs e.g. with ''idem'', ''quīdam''
insert(subtitles, concat(subtitle))
else
insert(subtitles, subtitle)
end
end
data.title = data.title .. " (" .. concat(subtitles, ", ") .. ")"
end
insert(declensions.subtitleses, data.subtitles)
else
if not (m_noun_decl or get_m_noun_decl())[decl] then
error("Unrecognized declension '" .. decl .. "'")
end
potential_lemma_slots = potential_noun_lemma_slots
data = {
subtitles = {},
num = seg.num or "",
loc = seg.loc,
pos = pos,
forms = {},
types = seg.types,
unattested = {},
categories = {},
notes = {},
}
(m_noun_decl or get_m_noun_decl())[decl](data, seg.args)
local apparent_decl = data.decl or decl
seg.props.headword_decl = apparent_decl
-- Construct title out of "original title" and subtitles.
if not data.title then
if decl == "irreg" and apparent_decl ~= decl and #data.subtitles == 0 then
insert(data.subtitles, glossary_link("irregular"))
end
if declension_to_vi[apparent_decl] then
local english = declension_to_vi[apparent_decl]
data.title = "[[Appendix:Latin " .. english .. " declension|" .. english .. "-declension]]"
elseif apparent_decl == "irreg" then
data.title = glossary_link("irregular")
elseif apparent_decl == "indecl" or apparent_decl == "0" or apparent_decl == "sgpl" then
data.title = glossary_link("indeclinable")
else
error("Internal error! Don't recognize noun declension " .. apparent_decl)
end
data.title = data.title .. " " .. singularize(data.pos)
end
if data.types.sufn then
insert(data.subtitles, {"with", " ''m'' optionally → ''n'' in compounds"})
elseif data.types.not_sufn then
insert(data.subtitles, {"without", " ''m'' optionally → ''n'' in compounds"})
end
-- Record original title and subtitles for use in alternant title-constructing code.
insert(declensions.orig_titles, data.title)
if #data.subtitles > 0 then
local subtitles = {}
for _, subtitle in ipairs(data.subtitles) do
if type(subtitle) == "table" then
-- Occurs e.g. with 1st-declension ''-ābus'' ending where
-- we want a common prefix to be extracted out if possible
-- in the alternant title-generating code.
insert(subtitles, concat(subtitle))
else
insert(subtitles, subtitle)
end
end
data.title = data.title .. " (" .. concat(subtitles, ", ") .. ")"
end
insert(declensions.subtitleses, data.subtitles)
end
-- Generate linked variants of slots that may be the lemma.
-- If the form is the same as the lemma (with links removed),
-- substitute the original lemma (with links included).
for _, slot in ipairs(potential_lemma_slots) do
local forms = data.forms[slot]
if forms then
local linked_forms = {}
if type(forms) ~= "table" then
forms = {forms}
end
for _, form in ipairs(forms) do
if form == seg.lemma then
insert(linked_forms, seg.orig_lemma)
else
insert(linked_forms, form)
end
end
data.forms["linked_" .. slot] = linked_forms
end
end
if seg.types.lig then
apply_ligatures(data.forms, is_adj)
end
if seg.types.sufn then
apply_sufn(data.forms, is_adj)
end
propagate_number_restrictions(data.forms, seg.num, is_adj)
for slot in iter_slots(is_adj) do
-- 1. Select the forms to append to the existing ones.
local new_forms
if is_adj then
if not seg.is_adj then
error("Can't decline noun '" .. seg.lemma .. "' when overall term is an adjective")
end
new_forms = data.forms[slot]
if not new_forms and slot:find("_[fn]$") then
new_forms = data.forms[slot:gsub("_[fn]$", "_m")]
end
elseif seg.is_adj then
if not seg.gender then
error("Declining modifying adjective " .. seg.lemma .. " but don't know gender of associated noun")
end
-- Select the appropriately gendered equivalent of the case/number
-- combination. Some adjectives won't have feminine or neuter
-- variants, though (e.g. 3-1 and 3-2 adjectives don't have a
-- distinct feminine), so in that case select the masculine.
new_forms = data.forms[slot .. "_" .. mw.ustring.lower(seg.gender)]
or data.forms[slot .. "_m"]
else
new_forms = data.forms[slot]
end
-- 2. Extract the new footnotes in the format we require, which is
-- different from the format passed in by the declension functions.
local new_notes = {}
if type(new_forms) == "string" and data.notes[slot .. "1"] then
new_notes[1] = {data.notes[slot .. "1"]}
elseif new_forms then
for j = 1, #new_forms do
if data.notes[slot .. j] then
new_notes[j] = {data.notes[slot .. j]}
end
end
end
-- 3. Append new forms and footnotes to the existing ones.
new_forms = normalize_form(new_forms)
if new_forms == nil then
declensions.forms[slot] = nil
declensions.notes[slot] = nil
else
declensions.forms[slot], declensions.notes[slot] = append_form(
declensions.forms[slot], declensions.notes[slot], new_forms,
new_notes, slot:find("linked", nil, true) and seg.orig_prefix or seg.prefix)
end
end
for slot, v in pairs(data.unattested) do
if v then
declensions.unattested[slot] = true
end
end
if not seg.types.nocat and (is_adj or not seg.is_adj) then
for _, cat in ipairs(data.categories) do
insert_if_not(declensions.categories, cat)
end
end
if data.footnote then
insert(declensions.footnotes, data.footnote)
end
if seg.prefix ~= "" and seg.prefix ~= "-" and seg.prefix ~= " " then
insert(declensions.title, glossary_link("indeclinable") .. " portion")
end
insert(declensions.title, data.title)
elseif seg.alternants then
local seg_declensions = nil
local seg_titles = {}
local seg_subtitleses = {}
local seg_stems_seen = {}
local seg_unattested = {}
local seg_categories = {}
local seg_footnotes = {}
-- If all alternants have exactly one non-constant segment and all are
-- of the same declension, we use special code that displays the
-- differences in the subtitles. Otherwise we use more general code
-- that displays the full title and subtitles of each segment,
-- separating segment combined titles by "and" and the segment-run
-- combined titles by "or".
local title_the_hard_way = false
local alternant_decl = nil
local alternant_decl_title = nil
for _, this_parsed_run in ipairs(seg.alternants) do
local num_non_constant_segments = 0
for _, segment in ipairs(this_parsed_run.segments) do
if segment.decl then
if not alternant_decl then
alternant_decl = segment.decl
elseif alternant_decl ~= segment.decl then
title_the_hard_way = true
num_non_constant_segments = 500
break
end
num_non_constant_segments = num_non_constant_segments + 1
end
end
if num_non_constant_segments ~= 1 then
title_the_hard_way = true
break
end
end
if not title_the_hard_way then
-- If using the special-purpose code, find the subtypes that are
-- not present in a given alternant but are present in at least
-- one other, and record "negative" variants of these subtypes
-- so that the declension-construction code can record subtitles
-- for these negative variants (so we can construct text like
-- "i-stem or imparisyllabic non-i-stem").
local subtypeses = {}
for _, this_parsed_run in ipairs(seg.alternants) do
for _, segment in ipairs(this_parsed_run.segments) do
if segment.decl then
insert(subtypeses, segment.types)
insert_if_not(seg_stems_seen, segment.stem2)
end
end
end
local union = set_union(subtypeses)
for _, this_parsed_run in ipairs(seg.alternants) do
for _, segment in ipairs(this_parsed_run.segments) do
if segment.decl then
local neg_subtypes = set_difference(union, segment.types)
for neg_subtype, _ in pairs(neg_subtypes) do
segment.types["not_" .. neg_subtype] = true
end
end
end
end
end
for _, this_parsed_run in ipairs(seg.alternants) do
this_parsed_run.loc = seg.loc
this_parsed_run.num = this_parsed_run.num or seg.num
this_parsed_run.gender = this_parsed_run.gender or seg.gender
local this_declensions = decline_segment_run(this_parsed_run, pos, is_adj)
if this_declensions.noneut then
declensions.noneut = true
end
if this_declensions.nomf then
declensions.nomf = true
end
-- If there's a number restriction on the segment run, blank
-- out the forms outside the restriction. This allows us to
-- e.g. construct heteroclites that decline one way in the
-- singular and a different way in the plural.
if this_parsed_run.num == "sg" or this_parsed_run.num == "pl" then
for slot in iter_slots(is_adj) do
if this_parsed_run.num == "sg" and slot:find("pl", nil, true) or
this_parsed_run.num == "pl" and slot:find("sg", nil, true) then
this_declensions.forms[slot] = {}
this_declensions.notes[slot] = nil
end
end
end
if not seg_declensions then
seg_declensions = this_declensions
else
for slot in iter_slots(is_adj) do
-- For a given slot, combine the existing and new forms.
-- We do this by checking to see whether a new form is
-- already present and not adding it if so; in the
-- process, we keep a map from indices in the new forms
-- to indices in the combined forms, for use in
-- combining footnotes below.
local curforms = seg_declensions.forms[slot] or {}
local newforms = this_declensions.forms[slot] or {}
local newform_index_to_new_index = {}
for newj, form in ipairs(newforms) do
local did_break = false
for j = 1, #curforms do
if curforms[j] == form then
newform_index_to_new_index[newj] = j
did_break = true
break
end
end
if not did_break then
insert(curforms, form)
newform_index_to_new_index[newj] = #curforms
end
end
seg_declensions.forms[slot] = curforms
-- Now combine the footnotes. Keep in mind that
-- each form may have its own set of footnotes, and
-- in some cases we didn't add a form from the new
-- list of forms because it already occurred in the
-- existing list of forms; in that case, we combine
-- footnotes from the two sources.
local curnotes = seg_declensions.notes[slot]
local newnotes = this_declensions.notes[slot]
if newnotes then
if not curnotes then
curnotes = {}
end
for index, notes in pairs(newnotes) do
local combined_index = newform_index_to_new_index[index]
if not curnotes[combined_index] then
curnotes[combined_index] = notes
else
local combined = mw.clone(curnotes[combined_index])
for _, note in ipairs(newnotes) do
insert_if_not(combined, note)
end
curnotes[combined_index] = combined
end
end
end
end
end
for slot, v in pairs(this_declensions.unattested) do
if v then
seg_unattested[slot] = true
end
end
for _, cat in ipairs(this_declensions.categories) do
insert_if_not(seg_categories, cat)
end
for _, footnote in ipairs(this_declensions.footnotes) do
insert_if_not(seg_footnotes, footnote)
end
insert_if_not(seg_titles, this_declensions.title)
for _, subtitles in ipairs(this_declensions.subtitleses) do
insert(seg_subtitleses, subtitles)
end
if not alternant_decl_title then
alternant_decl_title = this_declensions.orig_titles[1]
end
end
-- If overall run is singular, copy singular to plural, and
-- vice-versa. See propagate_number_restrictions() for rationale;
-- also, this should eliminate cases of empty forms, which will
-- cause the overall set of forms for that slot to be empty.
propagate_number_restrictions(seg_declensions.forms, parsed_run.num, is_adj)
for slot in iter_slots(is_adj) do
local new_forms = normalize_form(seg_declensions.forms[slot])
if new_forms == nil then
declensions.forms[slot] = nil
declensions.notes[slot] = nil
else
declensions.forms[slot], declensions.notes[slot] = append_form(
declensions.forms[slot], declensions.notes[slot],
new_forms, seg_declensions.notes[slot], nil)
end
end
for slot, v in pairs(seg_unattested) do
if v then
declensions.unattested[slot] = true
end
end
if is_adj or not seg.is_adj then
for _, cat in ipairs(seg_categories) do
insert_if_not(declensions.categories, cat)
end
end
for _, footnote in ipairs(seg_footnotes) do
insert_if_not(declensions.footnotes, footnote)
end
local title_to_insert
if title_the_hard_way then
title_to_insert = join_sentences(seg_titles, " or ")
else
-- Special-purpose title-generation code, for the common
-- situation where each alternant has single-segment runs and
-- all segments belong to the same declension.
--
-- 1. Find the initial subtitles common to all segments.
local first_subtitles = seg_subtitleses[1]
local num_common_subtitles = #first_subtitles
for j = 2, #seg_subtitleses do
local this_subtitles = seg_subtitleses[j]
for k = 1, num_common_subtitles do
if not deep_equals(first_subtitles[k], this_subtitles[k]) then
num_common_subtitles = k - 1
break
end
end
end
-- 2. Construct the portion of the text based on the common subtitles.
local common_subtitles = {}
for j = 1, num_common_subtitles do
if type(first_subtitles[j]) == "table" then
insert(common_subtitles, concat(first_subtitles[j]))
else
insert(common_subtitles, first_subtitles[j])
end
end
local common_subtitle_portion = concat(common_subtitles, ", ")
local non_common_subtitle_portion
-- 3. Special-case the situation where there's one non-common
-- subtitle in each segment and a common prefix or suffix to
-- all of them.
local common_prefix, common_suffix
for j = 1, #seg_subtitleses do
local this_subtitles = seg_subtitleses[j]
if #this_subtitles ~= num_common_subtitles + 1 or
type(this_subtitles[num_common_subtitles + 1]) ~= "table" or
#this_subtitles[num_common_subtitles + 1] ~= 2 then
break
end
if j == 1 then
common_prefix = this_subtitles[num_common_subtitles + 1][1]
common_suffix = this_subtitles[num_common_subtitles + 1][2]
else
local this_prefix = this_subtitles[num_common_subtitles + 1][1]
local this_suffix = this_subtitles[num_common_subtitles + 1][2]
if this_prefix ~= common_prefix then
common_prefix = nil
end
if this_suffix ~= common_suffix then
common_suffix = nil
end
if not common_prefix and not common_suffix then
break
end
end
end
if common_prefix or common_suffix then
if common_prefix and common_suffix then
error("Something is wrong, first non-common subtitle is actually common to all segments")
end
if common_prefix then
local non_common_parts = {}
for j = 1, #seg_subtitleses do
insert(non_common_parts, seg_subtitleses[j][num_common_subtitles + 1][2])
end
non_common_subtitle_portion = common_prefix .. concat(non_common_parts, " or ")
else
local non_common_parts = {}
for j = 1, #seg_subtitleses do
insert(non_common_parts, seg_subtitleses[j][num_common_subtitles + 1][1])
end
non_common_subtitle_portion = concat(non_common_parts, " or ") .. common_suffix
end
else
-- 4. Join the subtitles that differ from segment to segment.
-- Record whether there are any such differing subtitles.
-- If some segments have differing subtitles and others don't,
-- we use the text "otherwise" for the segments without
-- differing subtitles.
local saw_non_common_subtitles = false
local non_common_subtitles = {}
for j = 1, #seg_subtitleses do
local this_subtitles = seg_subtitleses[j]
local this_non_common_subtitles = {}
for k = num_common_subtitles + 1, #this_subtitles do
if type(this_subtitles[k]) == "table" then
insert(this_non_common_subtitles, concat(this_subtitles[k]))
else
insert(this_non_common_subtitles, this_subtitles[k])
end
end
if #this_non_common_subtitles > 0 then
insert(non_common_subtitles, concat(this_non_common_subtitles, ", "))
saw_non_common_subtitles = true
else
insert(non_common_subtitles, "otherwise")
end
end
non_common_subtitle_portion =
saw_non_common_subtitles and concat(non_common_subtitles, " or ") or ""
end
-- 5. Combine the common and non-common subtitle portions.
local subtitle_portions = {}
if common_subtitle_portion ~= "" then
insert(subtitle_portions, common_subtitle_portion)
end
if non_common_subtitle_portion ~= "" then
insert(subtitle_portions, non_common_subtitle_portion)
end
if #seg_stems_seen > 1 then
insert(subtitle_portions,
(number_to_english[#seg_stems_seen] or "" .. #seg_stems_seen) .. " different stems"
)
end
local subtitle_portion = concat(subtitle_portions, "; ")
if subtitle_portion ~= "" then
title_to_insert = alternant_decl_title .. " (" .. subtitle_portion .. ")"
else
title_to_insert = alternant_decl_title
end
end
-- Don't insert blank title (happens e.g. with "((ali))quis<irreg+>").
if title_to_insert ~= "" then
insert(declensions.title, title_to_insert)
end
else
for slot in iter_slots(is_adj) do
declensions.forms[slot], declensions.notes[slot] = append_form(
declensions.forms[slot], declensions.notes[slot],
slot:find("linked", nil, true) and seg.orig_prefix or seg.prefix)
end
insert(declensions.title, glossary_link("indeclinable") .. " portion")
end
end
-- First title is uppercase, remainder have an indefinite article, joined
-- using "with".
local titles = {}
for i, title in ipairs(declensions.title) do
if i == 1 then
insert(titles, ucfirst(title))
else
insert(titles, add_indefinite_article(title))
end
end
declensions.title = concat(titles, " with ")
return declensions
end
local function construct_title(args_title, declensions_title, generate_type, parsed_run)
if args_title then
declensions_title = args_title:gsub("<1>", "[[Appendix:Latin first declension|first declension]]")
declensions_title = declensions_title:gsub("<1&2>", "[[Appendix:Latin first declension|first]]/[[Appendix:Latin second declension|second declension]]")
declensions_title = declensions_title:gsub("<2>", "[[Appendix:Latin second declension|second declension]]")
declensions_title = declensions_title:gsub("<3>", "[[Appendix:Latin third declension|third declension]]")
declensions_title = declensions_title:gsub("<4>", "[[Appendix:Latin fourth declension|fourth declension]]")
declensions_title = declensions_title:gsub("<5>", "[[Appendix:Latin fifth declension|fifth declension]]")
if generate_type == "headword" then
declensions_title = lcfirst((declensions_title:gsub("%.$", "")))
else
declensions_title = ucfirst(declensions_title)
end
else
local post_text_parts = {}
if parsed_run.loc then
insert(post_text_parts, ", with locative")
end
-- FIXME: Hierosolyma has -a/-ōrum (2nd neut. pl. with sg. meaning) and -a/-ae (1st fem. sg.)
-- alternants, but because it has singular and plural forms overall, it's not made clear that
-- each alternant is restricted to one number.
if parsed_run.num == "sg" then
insert(post_text_parts, ", singular only")
elseif parsed_run.num == "pl" then
insert(post_text_parts, ", plural only")
end
local post_text = concat(post_text_parts)
if generate_type == "headword" then
declensions_title = lcfirst(declensions_title) .. post_text
else
declensions_title = ucfirst(declensions_title) .. post_text .. "."
end
end
return declensions_title
end
function export.do_generate_noun_forms(parent_args, pos, generate_type, def)
local params = {
[1] = {required = true, default = def or "aqua<1>"},
footnote = true,
title = true,
num = true,
json = {type = "boolean"},
}
for slot in iter_noun_slots() do
params[slot] = true
end
if generate_type == "headword" then
local list = {list = true}
local sublist = {sublist = "/"}
params.lemma = list
params.id = true
params.cat = list
params.m = sublist
params.f = sublist
params.n = sublist
params.adj = sublist
params.dim = sublist
params.aug = sublist
params.g = list
params.indecl = {type = "boolean"}
end
if pos == "numerals" then
params.type = true
end
local args = process_params(parent_args, params)
if args.title then
track("overriding-title")
end
local parsed_run = parse_segment_run_allowing_alternants(args[1])
parsed_run.loc = parsed_run.loc or not not (args.loc_sg or args.loc_pl)
parsed_run.num = args.num or parsed_run.num
local declensions = decline_segment_run(parsed_run, pos, false)
if not parsed_run.loc then
declensions.forms.loc_sg = nil
declensions.forms.loc_pl = nil
end
declensions.title = construct_title(args.title, declensions.title, generate_type, parsed_run)
local all_data = {
title = declensions.title,
footnotes = {},
num = parsed_run.num or "",
gender = parsed_run.gender,
propses = parsed_run.propses,
forms = declensions.forms,
unattested = declensions.unattested,
categories = declensions.categories,
notes = {},
user_specified = {},
overriding_lemma = args.lemma,
id = args.id,
pos = pos,
cat = args.cat,
indecl = args.indecl,
m = args.m,
f = args.f,
overriding_genders = args.g,
num_type = args["type"],
}
if generate_type ~= "bare" then
all_data.accel = {}
end
if args.footnote then
insert_if_not(all_data.footnotes, args.footnote)
end
for _, footnote in ipairs(declensions.footnotes) do
insert_if_not(all_data.footnotes, footnote)
end
for slot in iter_noun_slots() do
if declensions.notes[slot] then
for index, notes in pairs(declensions.notes[slot]) do
all_data.notes[slot .. index] = notes
end
end
end
process_noun_forms_and_overrides(all_data, args, generate_type)
if args.json then
return require(json_module).toJSON(all_data)
end
return all_data
end
function export.do_generate_adj_forms(parent_args, pos, generate_type, degree, def)
local boolean = {type = "boolean"}
local params = {
[1] = {required = true, default = def or "bonus"},
footnote = true,
title = true,
num = true,
noneut = boolean,
nomf = boolean,
json = boolean,
}
for slot in iter_adj_slots() do
params[slot] = true
end
for slot in iter_noun_slots(true) do
params[slot] = true
end
if generate_type == "headword" then
local list = {list = true}
local sublist = {sublist = "/"}
params.lemma = list
params.adv = sublist
params.id = true
params.cat = list
params.indecl = boolean
if degree == "comparative" or degree == "superlative" then
params.positive = sublist
end
if degree ~= "comparative" then
params.comp = sublist
end
if degree ~= "superlative" then
params.sup = sublist
end
end
local set_pos
if not pos then
params.pos = {set = {"adjective", "determiner", "participle", "pronoun"}, default = "adjective"}
set_pos = true
elseif pos == "numerals" then
params.type = true
end
local args = process_params(parent_args, params)
if set_pos then
pos = pluralize(args.pos)
end
for slot in iter_noun_slots(true) do
local arg = args[slot]
if arg ~= nil then
for i = 1, genders_n do
local slot_g = slot .. "_" .. genders[i]
local arg_g = args[slot_g]
if arg_g == nil then
args[slot_g] = arg
end
end
args[slot] = nil
end
end
if args.title then
track("overriding-title")
end
local segment_run = args[1]
if not segment_run:match("[<(]") then
-- If the segment run doesn't have any explicit declension specs or alternants,
-- add a default declension spec of <+> to it (or <0+> for indeclinable
-- adjectives). This allows the majority of adjectives to just specify
-- the lemma.
segment_run = segment_run .. (args.indecl and "<0+>" or "<+>")
end
local parsed_run = parse_segment_run_allowing_alternants(segment_run)
parsed_run.loc = parsed_run.loc or not not (
args.loc_sg_m or args.loc_sg_f or args.loc_sg_n or args.loc_pl_m or args.loc_pl_f or args.loc_pl_n
)
parsed_run.num = args.num or parsed_run.num
local declensions = decline_segment_run(parsed_run, pos, true)
if not parsed_run.loc then
declensions.forms.loc_sg_m = nil
declensions.forms.loc_sg_f = nil
declensions.forms.loc_sg_n = nil
declensions.forms.loc_pl_m = nil
declensions.forms.loc_pl_f = nil
declensions.forms.loc_pl_n = nil
end
declensions.title = construct_title(args.title, declensions.title, generate_type, parsed_run)
local all_data = {
title = declensions.title,
footnotes = {},
num = parsed_run.num or "",
propses = parsed_run.propses,
forms = declensions.forms,
unattested = declensions.unattested,
categories = declensions.categories,
notes = {},
user_specified = {},
accel = {},
loc = declensions.loc,
noneut = args.noneut or declensions.noneut,
nomf = args.nomf or declensions.nomf,
overriding_lemma = args.lemma,
positive = args.positive,
comp = args.comp,
sup = args.sup,
adv = args.adv,
id = args.id,
pos = pos,
cat = args.cat,
indecl = args.indecl,
num_type = args["type"],
}
if generate_type ~= "bare" then
all_data.accel = {}
end
if args.footnote then
insert_if_not(all_data.footnotes, args.footnote)
end
for _, footnote in ipairs(declensions.footnotes) do
insert_if_not(all_data.footnotes, footnote)
end
for slot in iter_adj_slots() do
if declensions.notes[slot] then
for index, notes in pairs(declensions.notes[slot]) do
all_data.notes[slot .. index] = notes
end
end
end
process_adj_forms_and_overrides(all_data, args, generate_type)
if args.json then
return require(json_module).toJSON(all_data)
end
return all_data
end
function export.show_noun(frame)
local parent_args = frame:getParent().args
local data = export.do_generate_noun_forms(parent_args, "nouns")
if type(data) == "string" then -- JSON
return data
end
show_forms(data, false)
local num = data.num
if num == "sg" then
return make_noun_table_sg(data)
elseif num == "pl" then
return make_noun_table_pl(data)
end
return make_noun_table(data)
end
function export.show_adj(frame)
local parent_args = frame:getParent().args
local data = export.do_generate_adj_forms(parent_args)
if type(data) == "string" then -- JSON
return data
end
partial_show_forms(data, true)
return make_adj_table(data)
end
return export
3rc746p7a2j6tz2jt5lhficbk9fwe46
Mô đun:la-adj/data
828
266072
2561560
2106171
2026-09-08T02:27:58Z
Hiyuune
50834
2561560
Scribunto
text/plain
local decl = {}
local en_utilities_module = "Module:en-utilities"
local la_utilities_module = "Module:la-utilities"
local table_deep_copy_module = "Module:table/deepCopy"
local table_empty_module = "Module:table/empty"
local table_insert_if_not_module = "Module:table/insertIfNot"
local require = require
local umatch = mw.ustring.match
local usub = mw.ustring.sub
local function add_form(...)
add_form = require(la_utilities_module).add_form
return add_form(...)
end
local function deep_copy(...)
deep_copy = require(table_deep_copy_module)
return deep_copy(...)
end
local function empty_table(...)
empty_table = require(table_empty_module)
return empty_table(...)
end
local function insert_if_not(...)
insert_if_not = require(table_insert_if_not_module)
return insert_if_not(...)
end
local function remove_forms(...)
remove_forms = require(la_utilities_module).remove_forms
return remove_forms(...)
end
local function singularize(...)
singularize = require(en_utilities_module).singularize
return singularize(...)
end
local function glossary_link(anchor, text)
text = text or anchor
return "[[Phụ lục:Từ điển thuật ngữ#" .. anchor .. "|" .. text .. "]]"
end
local function decl_link(english_declension, decl_text)
decl_text = decl_text or english_declension
return "[[Phụ lục:Biến cách loại " .. english_declension .. " tiếng Latinh|" .. decl_text .. "]]"
end
local function preprocess(...)
local frame = mw.getCurrentFrame()
function preprocess(text)
return frame:preprocess(text)
end
return preprocess(...)
end
decl["0+"] = function(data, args)
local forms, categories = data.forms, data.categories
local stem = args[1]
forms["nom_sg_m"] = stem
forms["nom_pl_m"] = stem
forms["gen_sg_m"] = stem
forms["gen_pl_m"] = stem
forms["dat_sg_m"] = stem
forms["dat_pl_m"] = stem
forms["acc_sg_m"] = stem
forms["acc_pl_m"] = stem
forms["abl_sg_m"] = stem
forms["abl_pl_m"] = stem
forms["voc_sg_m"] = stem
forms["voc_pl_m"] = stem
forms["loc_sg_m"] = stem
forms["loc_pl_m"] = stem
insert_if_not(categories, data.pos .. " không biến cách tiếng Latinh")
end
decl["1&2+"] = function(data, args)
local forms, types, pos, subtitles, categories = data.forms, data.types, data.pos, data.subtitles, data.categories
local stem = args[1]
local singpos, gender = singularize(pos), data.gender
if gender == "F" then
data.title = decl_link("loại 1") .. " " .. singpos
elseif gender then
data.title = decl_link("loại 2") .. " " .. singpos
else
data.title = decl_link("loại 1", "loại 2") .. "/" .. decl_link("loại 1") .. " " .. singpos
end
local original
if types.er then
local final2 = stem:sub(-2)
if final2 == "er" then
insert_if_not(subtitles, "nominative masculine singular in ''-er''")
insert_if_not(categories, "Latin first and second declension "
.. pos .. " with nominative masculine singular in -er")
elseif final2 == "ur" then
insert_if_not(subtitles, "nominative masculine singular in ''-ur''")
insert_if_not(categories, "Latin first and second declension "
.. pos .. " with nominative masculine singular in -ur")
else
error("Unrecognized ''-r'' stem (doesn't end in ''-er'' or ''-ur''): " .. stem)
end
stem, original = args[2], stem
end
local us = "us"
local a_sf = "a"
local um = "um"
local ae_gsf = "ae"
local am = "am"
local a_macron = "ā"
local i_pl = stem .. "ī"
if types.greekA or types.greekE then
insert_if_not(subtitles, "Greek-type")
insert_if_not(categories, "Latin first and second declension " .. pos .. " with Greek declension")
if types.greekA then
us = "os"
um = "on"
am = "ān"
else
us = "os"
a_sf = "ē"
um = "on"
ae_gsf = "ēs"
am = "ēn"
a_macron = "ē"
end
i_pl = {i_pl, stem .. "oe"} -- FIXME: add .oe spec.
end
forms["nom_sg_m"] = original or (stem .. us)
forms["nom_sg_f"] = stem .. a_sf
forms["nom_sg_n"] = stem .. um
forms["nom_pl_m"] = i_pl
forms["nom_pl_f"] = stem .. "ae"
forms["nom_pl_n"] = stem .. "a"
forms["gen_sg_m"] = stem .. "ī"
forms["gen_sg_f"] = stem .. ae_gsf
forms["gen_sg_n"] = stem .. "ī"
forms["gen_pl_m"] = stem .. "ōrum"
forms["gen_pl_f"] = stem .. "ārum"
forms["gen_pl_n"] = stem .. "ōrum"
forms["dat_sg_m"] = stem .. "ō"
forms["dat_sg_f"] = stem .. "ae"
forms["dat_sg_n"] = stem .. "ō"
forms["dat_pl_m"] = stem .. "īs"
forms["dat_pl_f"] = stem .. "īs"
forms["dat_pl_n"] = stem .. "īs"
forms["acc_sg_m"] = stem .. um
forms["acc_sg_f"] = stem .. am
forms["acc_sg_n"] = stem .. um
forms["acc_pl_m"] = stem .. "ōs"
forms["acc_pl_f"] = stem .. "ās"
forms["acc_pl_n"] = stem .. "a"
forms["abl_sg_m"] = stem .. "ō"
forms["abl_sg_f"] = stem .. a_macron
forms["abl_sg_n"] = stem .. "ō"
forms["abl_pl_m"] = stem .. "īs"
forms["abl_pl_f"] = stem .. "īs"
forms["abl_pl_n"] = stem .. "īs"
forms["voc_sg_m"] = original or (stem .. "e")
forms["voc_sg_f"] = stem .. a_sf
forms["voc_sg_n"] = stem .. um
forms["voc_pl_m"] = i_pl
forms["voc_pl_f"] = stem .. "ae"
forms["voc_pl_n"] = stem .. "a"
if types.ius then
insert_if_not(subtitles, "pronominal declension")
--insert_if_not(subtitles, "with genitive singular in ''-ī̆us'' and dative singular in ''-ī''")
insert_if_not(categories, "Latin first and second declension " .. pos .. " with genitive singular in -ī̆us")
forms["gen_sg_m"] = stem .. "ī̆us"
forms["gen_sg_f"] = stem .. "ī̆us"
forms["gen_sg_n"] = stem .. "ī̆us"
forms["dat_sg_m"] = stem .. "ī"
forms["dat_sg_f"] = stem .. "ī"
forms["dat_sg_n"] = stem .. "ī"
elseif types.not_ius then
insert_if_not(subtitles, "non-pronominal declension")
--insert_if_not(subtitles, "with normal genitive and dative singular")
end
if stem == "me" then
forms["voc_sg_m"] = "mī"
end
if types.ic then
insert_if_not(subtitles, "''hic''-type")
--insert_if_not(subtitles, "with genitive singular ending in ''-ius'' and dative singular ending in ''-ic''")
local oc = "oc"
local oc_macron = "ōc"
if stem == "ill" then
oc = "uc"
oc_macron = "ūc"
end
forms["nom_sg_m"] = stem .. "ic"
forms["nom_sg_f"] = stem .. "aec"
forms["nom_sg_n"] = stem .. oc
forms["nom_pl_n"] = stem .. "aec"
forms["gen_sg_m"] = stem .. "uius"
forms["gen_sg_f"] = stem .. "uius"
forms["gen_sg_n"] = stem .. "uius"
forms["dat_sg_m"] = stem .. "uic"
forms["dat_sg_f"] = stem .. "uic"
forms["dat_sg_n"] = stem .. "uic"
forms["acc_sg_m"] = stem .. "unc"
forms["acc_sg_f"] = stem .. "anc"
forms["acc_sg_n"] = stem .. oc
forms["acc_pl_n"] = stem .. "aec"
forms["abl_sg_m"] = stem .. "ōc"
forms["abl_sg_f"] = stem .. "āc"
forms["abl_sg_n"] = stem .. oc_macron
forms["voc_sg_m"] = "-"
forms["voc_sg_f"] = "-"
forms["voc_sg_n"] = "-"
forms["voc_pl_m"] = "-"
forms["voc_pl_f"] = "-"
forms["voc_pl_n"] = "-"
end
if types.distr then
if stem:sub(-1) == "n" then
insert_if_not(subtitles, "distributive, normally plural-only; short genitive plurals in ''-num'' preferred")
forms["gen_pl_m"] = {stem .. "um", stem .. "ōrum"}
forms["gen_pl_f"] = {stem .. "um", stem .. "ārum"}
forms["gen_pl_n"] = {stem .. "um", stem .. "ōrum"}
else
error("Unrecognized distributive numeral stem (doesn't end in ''n''): " .. stem)
end
original = stem
stem = args[2]
end
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["gen_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin first and second declension " .. pos)
end
decl["1-1+"] = function(data, args)
local forms, pos, subtitles, categories = data.forms, data.pos, data.subtitles, data.categories
local stem = args[1]
data.title = decl_link("first") .. " one-termination " .. singularize(pos)
forms["nom_sg_m"] = stem .. "a"
forms["nom_pl_m"] = stem .. "ae"
forms["nom_pl_n"] = stem .. "a"
forms["gen_sg_m"] = stem .. "ae"
forms["gen_pl_m"] = stem .. "ārum"
forms["dat_sg_m"] = stem .. "ae"
forms["dat_pl_m"] = stem .. "īs"
forms["acc_sg_m"] = stem .. "am"
forms["acc_sg_n"] = stem .. "a"
forms["acc_pl_m"] = stem .. "ās"
forms["acc_pl_n"] = stem .. "a"
forms["abl_sg_m"] = stem .. "ā"
forms["abl_pl_m"] = stem .. "īs"
forms["voc_sg_m"] = stem .. "a"
forms["voc_pl_m"] = stem .. "ae"
forms["voc_pl_n"] = stem .. "a"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
insert_if_not(categories, "Latin first declension " .. data.pos)
end
decl["2-2+"] = function(data, args)
local forms, types, pos, subtitles, categories = data.forms, data.types, data.pos, data.subtitles, data.categories
local stem = args[1]
data.title = decl_link("second") .. " two-termination " .. singularize(pos)
local us = "us"
local um = "um"
local i_pl = stem .. "ī"
if types.greek then
insert_if_not(subtitles, "Greek-type")
insert_if_not(categories, "Latin second declension " .. pos .. " with Greek declension")
us = "os"
um = "on"
i_pl = {i_pl, stem .. "oe"} -- FIXME: add .oe spec.
end
forms["nom_sg_m"] = stem .. us
forms["nom_sg_n"] = stem .. um
forms["nom_pl_m"] = i_pl
forms["nom_pl_n"] = stem .. "a"
forms["gen_sg_m"] = stem .. "ī"
forms["gen_sg_n"] = stem .. "ī"
forms["gen_pl_m"] = stem .. "ōrum"
forms["gen_pl_n"] = stem .. "ōrum"
forms["dat_sg_m"] = stem .. "ō"
forms["dat_sg_n"] = stem .. "ō"
forms["dat_pl_m"] = stem .. "īs"
forms["dat_pl_n"] = stem .. "īs"
forms["acc_sg_m"] = stem .. um
forms["acc_sg_n"] = stem .. um
forms["acc_pl_m"] = stem .. "ōs"
forms["acc_pl_n"] = stem .. "a"
forms["abl_sg_m"] = stem .. "ō"
forms["abl_sg_n"] = stem .. "ō"
forms["abl_pl_m"] = stem .. "īs"
forms["abl_pl_n"] = stem .. "īs"
forms["voc_sg_m"] = stem .. "e"
forms["voc_sg_n"] = stem .. um
forms["voc_pl_m"] = i_pl
forms["voc_pl_n"] = stem .. "a"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin second declension " .. pos)
end
local function abl_i_e(...)
local function update_slot(forms, slot, f, do_copy)
if not forms[slot] then
return do_copy
elseif do_copy then
f = deep_copy(f)
end
forms[slot] = f
return true
end
function abl_i_e(stem, forms, types)
local f, do_copy
if types["abl_e_i"] then
f = {stem .. "e", stem .. "ī"}
elseif types["abl_i_e"] then
f = {stem .. "ī", stem .. "e"}
else
return
end
do_copy = update_slot(forms, "abl_sg_m", f, do_copy)
do_copy = update_slot(forms, "abl_sg_f", f, do_copy)
-- Neuter doesn't take -e with i-stems.
if not types.I then
update_slot(forms, "abl_sg_n", f, do_copy)
end
end
return abl_i_e(...)
end
decl["3-1+"] = function(data, args)
local forms, types, pos, subtitles, notes, categories = data.forms, data.types, data.pos, data.subtitles, data.notes, data.categories
local stem1, stem2 = args[1], args[2]
local singpos = singularize(pos)
if data.gender then
data.title = decl_link("third") .. " " .. singpos
else
data.title = decl_link("third") .. " one-termination " .. singpos
end
forms["nom_sg_m"] = stem1
forms["nom_sg_n"] = stem1
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "ia"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "ium"
forms["gen_pl_n"] = stem2 .. "ium"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_n"] = stem1
forms["acc_pl_m"] = {stem2 .. "īs", stem2 .. "ēs"}
forms["acc_pl_n"] = stem2 .. "ia"
forms["abl_sg_m"] = {stem2 .. "ī", stem2 .. "e"}
forms["abl_sg_n"] = {stem2 .. "ī", stem2 .. "e"}
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
forms["voc_sg_m"] = stem1
forms["voc_sg_n"] = stem1
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "ia"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
if types.par then
insert_if_not(subtitles, "non-i-stem")
forms["nom_pl_n"] = stem2 .. "a"
forms["gen_pl_m"] = stem2 .. "um"
forms["gen_pl_n"] = stem2 .. "um"
forms["abl_sg_m"] = stem2 .. "e"
forms["abl_sg_n"] = stem2 .. "e"
forms["loc_sg_m"] = {stem2 .. "ī", stem2 .. "e"} -- Really?
forms["loc_sg_n"] = {stem2 .. "ī", stem2 .. "e"} -- Why does this happen?
forms["acc_pl_n"] = stem2 .. "a"
forms["voc_pl_n"] = stem2 .. "a"
elseif types.not_par then
insert_if_not(subtitles, "i-stem")
end
local es_base = stem1:match("^(.-)ēs$")
if es_base and es_base == stem2 then
if types.greek then
local note1 = "It is unknown whether adjectives of this type would use i-stem or consonant-stem endings in Classical Latin: the relevant forms are not attested. Depending on the word, either ending or both may be attested in New Latin."
forms["nom_sg_n"] = stem2 .. "es"
forms["acc_sg_n"] = stem2 .. "es"
forms["voc_sg_n"] = stem2 .. "es"
forms["nom_pl_n"] = {stem2 .. "a", stem2 .. "ia"}
notes["nom_pl_n2"] = note1
forms["acc_pl_n"] = {stem2 .. "a", stem2 .. "ia"}
notes["acc_pl_n2"] = note1
forms["voc_pl_n"] = {stem2 .. "a", stem2 .. "ia"}
notes["voc_pl_n2"] = note1
forms["abl_sg_m"] = {stem2 .. "e", stem2 .. "ī"}
notes["abl_sg_m2"] = note1
forms["abl_sg_n"] = {stem2 .. "e", stem2 .. "ī"}
notes["abl_sg_n2"] = note1
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
notes["loc_sg_m2"] = note1
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
notes["loc_sg_n2"] = note1
forms["gen_pl_m"] = {stem2 .. "um", stem2 .. "ium"}
notes["gen_pl_m2"] = note1
forms["gen_pl_n"] = {stem2 .. "um", stem2 .. "ium"}
notes["gen_pl_n2"] = note1
insert_if_not(subtitles, "Greek-type")
elseif types.not_greek then
insert_if_not(subtitles, "non-Greek-type")
end
end
insert_if_not(categories, "Latin third declension " .. pos)
insert_if_not(categories, "Latin third declension " .. pos .. " of one termination")
end
decl["3-def+"] = function(data, args)
local forms, types, pos, subtitles, notes, categories = data.forms, data.types, data.pos, data.subtitles, data.notes, data.categories
local stem1, stem2 = args[1], args[2]
local singpos = singularize(pos)
if data.gender then
data.title = decl_link("third") .. " " .. singpos
else
data.title = decl_link("third") .. " defective " .. singpos
end
forms["nom_sg_m"] = stem1
forms["nom_sg_n"] = stem1
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "ia"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "ium"
forms["gen_pl_n"] = stem2 .. "ium"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_n"] = stem1
forms["acc_pl_m"] = stem2 .. "ēs"
forms["acc_pl_n"] = stem2 .. "ia"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
forms["voc_sg_m"] = stem1
forms["voc_sg_n"] = stem1
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "ia"
if types.tor then
data.title = decl_link("third") .. " masculine-only " .. singpos
insert_if_not(subtitles, "non-i-stem")
remove_forms(forms, {"_f$", "_n$"})
forms["nom_sg_m"] = stem1
forms["gen_sg_m"] = stem2 .. "is"
forms["dat_sg_m"] = stem2 .. "ī"
forms["acc_sg_m"] = stem2 .. "em"
forms["abl_sg_m"] = stem2 .. "e"
forms["voc_sg_m"] = stem1
forms["nom_pl_m"] = stem2 .. "ēs"
forms["gen_pl_m"] = stem2 .. "um"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["acc_pl_m"] = stem2 .. "ēs"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["voc_pl_m"] = stem2 .. "ēs"
insert_if_not(categories, "Latin third declension masculine-only adjectives")
end
if types.trix then
insert_if_not(subtitles, "feminine-only when singular, feminine or neuter when plural")
remove_forms(forms, {"_m$", "sg_n$"})
forms["nom_sg_f"] = stem1
forms["gen_sg_f"] = stem2 .. "is"
forms["dat_sg_f"] = stem2 .. "ī"
forms["acc_sg_f"] = stem2 .. "em"
forms["abl_sg_f"] = {stem2 .. "e", stem2 .. "ī"}
forms["voc_sg_f"] = stem1
forms["nom_pl_f"] = stem2 .. "ēs"
forms["gen_pl_f"] = stem2 .. "ium"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["acc_pl_f"] = stem2 .. "ēs"
forms["abl_pl_f"] = stem2 .. "ibus"
forms["voc_pl_f"] = stem2 .. "ēs"
insert_if_not(categories, "Latin third declension feminine- and neuter-only adjectives")
end
if types.trixf then
data.title = decl_link("third") .. " feminine-only " .. singpos
remove_forms(forms, {"_m$", "_n$"})
forms["nom_sg_f"] = stem1
forms["gen_sg_f"] = stem2 .. "is"
forms["dat_sg_f"] = stem2 .. "ī"
forms["acc_sg_f"] = stem2 .. "em"
forms["abl_sg_f"] = {stem2 .. "e", stem2 .. "ī"}
forms["voc_sg_f"] = stem1
forms["nom_pl_f"] = stem2 .. "ēs"
forms["gen_pl_f"] = stem2 .. "ium"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["acc_pl_f"] = stem2 .. "ēs"
forms["abl_pl_f"] = stem2 .. "ibus"
forms["voc_pl_f"] = stem2 .. "ēs"
insert_if_not(categories, "Latin third declension feminine-only adjectives")
end
if types.idis then
data.title = decl_link("third") .. " feminine-only " .. singpos
insert_if_not(subtitles, "non-i-stem")
remove_forms(forms, {"_m$", "_n$"})
forms["nom_sg_f"] = stem1
forms["gen_sg_f"] = {stem2 .. "is", stem2 .. "os"}
forms["dat_sg_f"] = stem2 .. "ī"
forms["acc_sg_f"] = {stem2 .. "em", stem2 .. "a"}
forms["abl_sg_f"] = stem2 .. "e"
forms["voc_sg_f"] = stem1
forms["nom_pl_f"] = {stem2 .. "ēs", stem2 .. "es"}
forms["gen_pl_f"] = stem2 .. "um"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["acc_pl_f"] = {stem2 .. "ēs", stem2 .. "as"}
forms["abl_pl_f"] = stem2 .. "ibus"
forms["voc_pl_f"] = {stem2 .. "ēs", stem2 .. "es"}
insert_if_not(categories, "Latin third declension feminine-only adjectives")
end
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["abl_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin third declension " .. pos)
end
decl["3-C+"] = function(data, args)
local forms, types, pos, categories = data.forms, data.types, data.pos, data.categories
local stem1 = args[1]
local stem2 = stem1 .. "ōr"
data.title = decl_link("third") .. " comparative " .. singularize(pos)
forms["nom_sg_m"] = stem1 .. "or"
forms["nom_sg_n"] = stem1 .. "us"
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "a"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "um"
forms["gen_pl_n"] = stem2 .. "um"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_n"] = stem1 .. "us"
forms["acc_pl_m"] = {stem2 .. "ēs", stem2 .. "īs"}
forms["acc_pl_n"] = stem2 .. "a"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
abl_i_e(stem2, forms, types)
forms["voc_sg_m"] = stem1 .. "or"
forms["voc_sg_n"] = stem1 .. "us"
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "a"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin third declension " .. pos)
insert_if_not(categories, "Latin comparative adjectives")
end
decl["3-P+"] = function(data, args)
local forms, notes = data.forms, data.notes
local stem2 = args[2]
decl["3-1+"](data, args)
data.title = decl_link("third") .. " participle"
local note1 = "When used purely as an adjective."
forms["abl_sg_m"] = {stem2 .. "e", stem2 .. "ī"}
notes["abl_sg_m2"] = note1
forms["abl_sg_n"] = {stem2 .. "e", stem2 .. "ī"}
notes["abl_sg_n2"] = note1
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
notes["loc_sg_m2"] = note1
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
notes["loc_sg_n2"] = note1
forms["acc_pl_m"] = {stem2 .. "ēs", stem2 .. "īs"}
end
decl["3-2+"] = function(data, args)
local forms, types, pos, categories = data.forms, data.types, data.pos, data.categories
local stem = args[1]
local singpos = singularize(pos)
if data.gender then
data.title = decl_link("third") .. " " .. singpos
else
data.title = decl_link("third") .. " two-termination " .. singpos
end
forms["nom_sg_m"] = stem .. "is"
forms["nom_sg_n"] = stem .. "e"
forms["nom_pl_m"] = stem .. "ēs"
forms["nom_pl_n"] = stem .. "ia"
forms["gen_sg_m"] = stem .. "is"
forms["gen_sg_n"] = stem .. "is"
forms["gen_pl_m"] = stem .. "ium"
forms["gen_pl_n"] = stem .. "ium"
forms["dat_sg_m"] = stem .. "ī"
forms["dat_sg_n"] = stem .. "ī"
forms["dat_pl_m"] = stem .. "ibus"
forms["dat_pl_n"] = stem .. "ibus"
forms["acc_sg_m"] = stem .. "em"
forms["acc_sg_n"] = stem .. "e"
forms["acc_pl_m"] = {stem .. "īs", stem .. "ēs"}
forms["acc_pl_n"] = stem .. "ia"
forms["abl_sg_m"] = stem .. "ī"
forms["abl_sg_n"] = stem .. "ī"
forms["abl_pl_m"] = stem .. "ibus"
forms["abl_pl_n"] = stem .. "ibus"
-- abl_i_e(stem, forms, types) -- enable once [[Module:la-nominal]] has ben updated
forms["voc_sg_m"] = stem .. "is"
forms["voc_sg_n"] = stem .. "e"
forms["voc_pl_m"] = stem .. "ēs"
forms["voc_pl_n"] = stem .. "ia"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin third declension " .. pos)
insert_if_not(categories, "Latin third declension " .. pos .. " of two terminations")
end
decl["3-3+"] = function(data, args)
local forms, types, pos, categories = data.forms, data.types, data.pos, data.categories
local stem1, stem2 = args[1], args[2]
local singpos = singularize(pos)
if data.gender then
data.title = decl_link("third") .. " " .. singpos
else
data.title = decl_link("third") .. " three-termination " .. singpos
end
forms["nom_sg_m"] = stem1
forms["nom_sg_f"] = stem2 .. "is"
forms["nom_sg_n"] = stem2 .. "e"
forms["nom_pl_m"] = stem2 .. "ēs"
forms["nom_pl_f"] = stem2 .. "ēs"
forms["nom_pl_n"] = stem2 .. "ia"
forms["gen_sg_m"] = stem2 .. "is"
forms["gen_sg_f"] = stem2 .. "is"
forms["gen_sg_n"] = stem2 .. "is"
forms["gen_pl_m"] = stem2 .. "ium"
forms["gen_pl_f"] = stem2 .. "ium"
forms["gen_pl_n"] = stem2 .. "ium"
forms["dat_sg_m"] = stem2 .. "ī"
forms["dat_sg_f"] = stem2 .. "ī"
forms["dat_sg_n"] = stem2 .. "ī"
forms["dat_pl_m"] = stem2 .. "ibus"
forms["dat_pl_f"] = stem2 .. "ibus"
forms["dat_pl_n"] = stem2 .. "ibus"
forms["acc_sg_m"] = stem2 .. "em"
forms["acc_sg_f"] = stem2 .. "em"
forms["acc_sg_n"] = stem2 .. "e"
forms["acc_pl_m"] = {stem2 .. "īs", stem2 .. "ēs"}
forms["acc_pl_f"] = {stem2 .. "īs", stem2 .. "ēs"}
forms["acc_pl_n"] = stem2 .. "ia"
forms["abl_sg_m"] = stem2 .. "ī"
forms["abl_sg_f"] = stem2 .. "ī"
forms["abl_sg_n"] = stem2 .. "ī"
forms["abl_pl_m"] = stem2 .. "ibus"
forms["abl_pl_f"] = stem2 .. "ibus"
forms["abl_pl_n"] = stem2 .. "ibus"
-- abl_i_e(stem2, forms, types) -- enable once [[Module:la-nominal]] has ben updated
forms["voc_sg_m"] = stem1
forms["voc_sg_f"] = stem2 .. "is"
forms["voc_sg_n"] = stem2 .. "e"
forms["voc_pl_m"] = stem2 .. "ēs"
forms["voc_pl_f"] = stem2 .. "ēs"
forms["voc_pl_n"] = stem2 .. "ia"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["abl_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin third declension " .. pos)
insert_if_not(categories, "Latin third declension " .. pos .. " of three terminations")
end
decl["indecl+"] = function(data, args)
local forms, subtitles, categories = data.forms, data.subtitles, data.categories
local stem = args[1]
insert_if_not(subtitles, "used only in the nominative and accusative")
forms["nom_sg_m"] = stem
forms["nom_pl_m"] = "-"
forms["gen_sg_m"] = "-"
forms["gen_pl_m"] = "-"
forms["dat_sg_m"] = "-"
forms["dat_pl_m"] = "-"
forms["acc_sg_m"] = stem
forms["acc_pl_m"] = "-"
forms["abl_sg_m"] = "-"
forms["abl_pl_m"] = "-"
forms["voc_sg_m"] = "-"
forms["voc_pl_m"] = "-"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
insert_if_not(categories, "Latin indeclinable " .. data.pos)
end
decl["irreg+"] = function(data, args)
local forms, types, pos, notes, categories = data.forms, data.types, data.pos, data.notes, data.categories
local arg1 = args[1]
if arg1 == "duo" or arg1 == "ambō" then
local stem = usub(arg1, 1, -2)
data.title = stem == "amb" and glossary_link("irregular") .. " adjective" or "numeral"
data.num = "pl"
local stem_with_o = stem .. (stem == "amb" and "ō" or "o")
local note1 = preprocess("Genitive plural {{m|la|duum}} is sometimes spelled {{m|la|duûm}} in New Latin texts. Its ending {{m|la|-um|id=genitive plural}} is the regular outcome of the original second-declension genitive plural ending (compare Greek {{m|grc|-ων}}, {{m|grc|-ῶν}}) not a contraction of {{m|la||-ōrum}} (a newer innovation). The corresponding Old Latin form {{m|la|duom}} is used by Plautus and mentioned by Cicero; it was potentially pronounced as {{m|la|duōm}} in Archaic Latin, but some linguists believe vowels were shortened before final {{m|la||-m}} already in Proto-Italic.")
forms["nom_pl_m"] = stem_with_o
forms["nom_pl_f"] = stem .. "ae"
forms["nom_pl_n"] = stem_with_o
forms["gen_pl_m"] = stem .. "ōrum"
forms["gen_pl_f"] = stem .. "ārum"
forms["gen_pl_n"] = stem .. "ōrum"
forms["dat_pl_m"] = stem .. "ōbus"
forms["dat_pl_f"] = stem .. "ābus"
forms["dat_pl_n"] = stem .. "ōbus"
forms["acc_pl_m"] = {stem .. "ōs", stem_with_o}
forms["acc_pl_f"] = stem .. "ās"
forms["acc_pl_n"] = stem_with_o
forms["abl_pl_m"] = stem .. "ōbus"
forms["abl_pl_f"] = stem .. "ābus"
forms["abl_pl_n"] = stem .. "ōbus"
forms["voc_pl_m"] = stem_with_o
forms["voc_pl_f"] = stem .. "ae"
forms["voc_pl_n"] = stem_with_o
if stem == "du" then
forms["gen_pl_m"] = {forms["gen_pl_m"], "duum"}
notes["gen_pl_m2"] = note1
forms["gen_pl_n"] = {forms["gen_pl_n"], "duum"}
notes["gen_pl_n2"] = note1
end
elseif arg1:sub(-6) == "mīlle" then
data.title = "semi-" .. glossary_link("indeclinable") .. " numeral"
local stem = arg1:sub(1, -3)
forms["nom_sg_m"] = stem .. "le"
forms["nom_pl_m"] = {stem .. "ia", stem .. "lia"}
forms["gen_sg_m"] = stem .. "le"
forms["gen_pl_m"] = {stem .. "ium", stem .. "lium"}
forms["dat_sg_m"] = stem .. "le"
forms["dat_pl_m"] = {stem .. "ibus", stem .. "libus"}
forms["acc_sg_m"] = stem .. "le"
forms["acc_pl_m"] = {stem .. "ia", stem .. "lia"}
forms["abl_sg_m"] = stem .. "le"
forms["abl_pl_m"] = {stem .. "ibus", stem .. "libus"}
forms["voc_sg_m"] = stem .. "le"
forms["voc_pl_m"] = {stem .. "ia", stem .. "lia"}
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
elseif arg1 == "ille" or arg1 == "iste" or arg1 == "ipse" or arg1 == "olle" then
local stem = arg1:sub(1, -2)
types.ius = true
decl["1&2+"](data, {stem})
data.title = glossary_link("demonstrative") .. " " .. singularize(data.pos)
forms["nom_sg_m"] = arg1
if arg1 == "ipse" then
local note1 = "Medieval Latin."
add_form(forms, "nom_sg_n", stem, "ud")
notes["nom_sg_n2"] = note1
add_form(forms, "acc_sg_n", stem, "ud")
notes["acc_sg_n2"] = note1
else
forms["nom_sg_n"] = stem .. "ud"
forms["acc_sg_n"] = stem .. "ud"
end
forms["voc_sg_m"] = "-"
forms["voc_sg_f"] = "-"
forms["voc_sg_n"] = "-"
forms["voc_pl_m"] = "-"
forms["voc_pl_f"] = "-"
forms["voc_pl_n"] = "-"
empty_table(categories)
elseif arg1 == "illic" or arg1 == "istic" or arg1 == "isthic" then
data.title = glossary_link("demonstrative") .. " " .. singularize(data.pos)
local stem, unattested = arg1:sub(1, -3), data.unattested
forms["nom_sg_m"] = stem .. "ic"
forms["nom_sg_f"] = stem .. "aec"
forms["nom_sg_n"] = {stem .. "uc", stem .. "ucce", stem .. "oc"}
forms["gen_sg_m"] = stem .. "ī̆usce"
forms["gen_sg_f"] = stem .. "ī̆usce"
forms["gen_sg_n"] = stem .. "ī̆usce"
forms["dat_sg_m"] = stem .. "īc"
forms["dat_sg_f"] = stem .. "īc"
forms["dat_sg_n"] = stem .. "īc"
forms["acc_sg_m"] = stem .. "unc"
forms["acc_sg_f"] = stem .. "anc"
forms["acc_sg_n"] = {stem .. "uc", stem .. "ucce", stem .. "oc"}
forms["abl_sg_m"] = stem .. "ōc"
forms["abl_sg_f"] = stem .. "āc"
forms["abl_sg_n"] = stem .. "ōc"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["gen_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["nom_pl_m"] = stem .. "īsce"
forms["nom_pl_f"] = stem .. "aec"
forms["nom_pl_n"] = stem .. "aec"
forms["gen_pl_m"] = stem .. "ōrunc"
unattested["gen_pl_m"] = true
forms["gen_pl_f"] = stem .. "ārunc"
unattested["gen_pl_f"] = true
forms["gen_ok_n"] = stem .. "ōrunc"
unattested["gen_pl_n"] = true
forms["dat_pl_m"] = stem .. "īsce"
forms["dat_pl_f"] = stem .. "īsce"
forms["dat_pl_n"] = stem .. "īsce"
forms["acc_pl_m"] = stem .. "ōsce"
forms["acc_pl_f"] = stem .. "āsce"
forms["acc_pl_n"] = stem .. "aec"
forms["abl_pl_m"] = stem .. "īsce"
forms["abl_pl_f"] = stem .. "īsce"
forms["abl_pl_n"] = stem .. "īsce"
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
elseif arg1 == "hice" then
data.title = glossary_link("demonstrative") .. " pronoun"
forms["nom_sg_m"] = "hice"
forms["nom_sg_f"] = "haece"
forms["nom_sg_n"] = "hoce"
forms["nom_pl_m"] = "hīce"
forms["nom_pl_f"] = "haece"
forms["nom_pl_n"] = "haece"
forms["gen_sg_m"] = "huiusce"
forms["gen_sg_f"] = "huiusce"
forms["gen_sg_n"] = "huiusce"
forms["gen_pl_m"] = {"hōrunce", "hōrumce"}
forms["gen_pl_f"] = {"hārunce", "hārumce"}
forms["gen_pl_n"] = {"hōrunce", "hōrumce"}
forms["dat_sg_m"] = "huīce"
forms["dat_sg_f"] = "huīce"
forms["dat_sg_n"] = "huīce"
forms["dat_pl_m"] = "hīsce"
forms["dat_pl_f"] = "hīsce"
forms["dat_pl_n"] = "hīsce"
forms["acc_sg_m"] = "hunce"
forms["acc_sg_f"] = "hance"
forms["acc_sg_n"] = "hoce"
forms["acc_pl_m"] = "hōsce"
forms["acc_pl_f"] = "hāsce"
forms["acc_pl_n"] = "haece"
forms["abl_sg_m"] = "hōce"
forms["abl_sg_f"] = "hāce"
forms["abl_sg_n"] = "hōce"
forms["abl_pl_m"] = "hīsce"
forms["abl_pl_f"] = "hīsce"
forms["abl_pl_n"] = "hīsce"
forms["loc_sg_m"] = deep_copy(forms["gen_sg_m"])
forms["loc_sg_f"] = deep_copy(forms["gen_sg_f"])
forms["loc_sg_n"] = deep_copy(forms["gen_sg_n"])
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_f"] = deep_copy(forms["abl_pl_f"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
elseif arg1 == "plūs" then
data.title = glossary_link("irregular") .. " " .. decl_link("third") .. " comparative " .. singularize(pos) .. ", plural-only in Classical Latin"
local note1 = "None of the singular forms are used as adjectives in Classical Latin."
forms["nom_sg_n"] = "plūs"
notes["nom_sg_n1"] = note1
forms["nom_pl_m"] = "plūrēs"
forms["nom_pl_n"] = "plūra"
forms["gen_sg_m"] = "plūris"
notes["gen_sg_m1"] = note1
forms["gen_sg_n"] = "plūris"
notes["gen_sg_n1"] = note1
forms["gen_pl_m"] = "plūrium"
forms["gen_pl_n"] = "plūrium"
forms["dat_sg_m"] = "plūrī"
notes["dat_sg_m1"] = note1
forms["dat_sg_n"] = "plūrī"
notes["dat_sg_n1"] = note1
forms["dat_pl_m"] = "plūribus"
forms["dat_pl_n"] = "plūribus"
forms["acc_sg_m"] = "plūrem"
notes["acc_sg_m1"] = note1
forms["acc_sg_f"] = "plūrem"
notes["acc_sg_f1"] = note1
forms["acc_sg_n"] = "plūs"
notes["acc_sg_n1"] = note1
forms["acc_pl_m"] = {"plūrēs", "plūrīs"}
forms["acc_pl_n"] = "plūra"
forms["abl_sg_m"] = {"plūrī", "plūre"}
notes["abl_sg_m1"] = note1
notes["abl_sg_m2"] = note1
forms["abl_sg_f"] = {"plūrī", "plūre"}
notes["abl_sg_f1"] = note1
notes["abl_sg_f2"] = note1
forms["abl_sg_n"] = {"plūrī", "plūre"}
notes["abl_sg_n1"] = note1
notes["abl_sg_n2"] = note1
forms["abl_pl_m"] = "plūribus"
forms["abl_pl_n"] = "plūribus"
forms["voc_sg_n"] = "plūs"
notes["voc_sg_n1"] = note1
forms["voc_pl_m"] = "plūrēs"
forms["voc_pl_n"] = "plūra"
forms["loc_sg_m"] = deep_copy(forms["abl_sg_m"])
notes["loc_sg_m1"] = note1
notes["loc_sg_m2"] = note1
forms["loc_sg_f"] = deep_copy(forms["abl_sg_f"])
notes["loc_sg_f1"] = note1
notes["loc_sg_f2"] = note1
forms["loc_sg_n"] = deep_copy(forms["abl_sg_n"])
notes["loc_sg_n1"] = note1
notes["loc_sg_n2"] = note1
forms["loc_pl_m"] = deep_copy(forms["abl_pl_m"])
forms["loc_pl_n"] = deep_copy(forms["abl_pl_n"])
insert_if_not(categories, "Latin third declension " .. pos)
insert_if_not(categories, "Latin third declension " .. pos .. " of one termination")
elseif umatch(arg1, "^egō̆?$") or arg1 == "nōs" then
data.title = glossary_link("personal") .. " pronoun"
forms["nom_sg_m"] = arg1
forms["nom_pl_m"] = "nōs"
forms["gen_sg_m"] = "meī"
forms["gen_pl_m"] = {"nostrī", "nostrum"}
forms["dat_sg_m"] = "mihī̆"
forms["dat_pl_m"] = "nōbīs"
forms["acc_sg_m"] = {"mē", "mēmē"}
forms["acc_pl_m"] = "nōs"
forms["abl_sg_m"] = {"mē", "mēmē"}
forms["abl_pl_m"] = "nōbīs"
forms["voc_sg_m"] = arg1
forms["voc_pl_m"] = "nōs"
elseif arg1 == "tū" or arg1 == "vōs" then
data.title = glossary_link("personal") .. " pronoun"
forms["nom_sg_m"] = arg1
forms["nom_pl_m"] = "vōs"
forms["gen_sg_m"] = "tuī"
forms["gen_pl_m"] = {"vestrī", "vestrum"}
forms["dat_sg_m"] = "tibī̆"
forms["dat_pl_m"] = "vōbīs"
forms["acc_sg_m"] = {"tē", "tētē"}
forms["acc_pl_m"] = "vōs"
forms["abl_sg_m"] = {"tē", "tētē"}
forms["abl_pl_m"] = "vōbīs"
forms["voc_sg_m"] = arg1
forms["voc_pl_m"] = "vōs"
elseif arg1 == "suī" then
data.title = glossary_link("reflexive") .. " pronoun"
forms["nom_sg_m"] = "-"
forms["nom_pl_m"] = "-"
forms["gen_sg_m"] = arg1
forms["gen_pl_m"] = forms["gen_sg_m"]
forms["dat_sg_m"] = "sibī̆"
forms["dat_pl_m"] = forms["dat_sg_m"]
forms["acc_sg_m"] = {"sē", "sēsē"}
forms["acc_pl_m"] = {"sē", "sēsē"}
forms["abl_sg_m"] = {"sē", "sēsē"}
forms["abl_pl_m"] = {"sē", "sēsē"}
forms["voc_sg_m"] = "-"
forms["voc_pl_m"] = "-"
elseif arg1 == "is" or arg1 == "īdem" then
data.title = glossary_link("demonstrative") .. " pronoun"
local note1 = preprocess("The dative singular is found spelled {{orth|{{sma|{{lang|la|EIEI}}}}}} (here represented as {{m|la||-ēī}}), and scanned as two longs in {{w|Plautus}}, but also as a monosyllable; the latter is its normal scansion in Classical. Other spellings include {{orth|{{sma|{{lang|la|EEI}}}}}}{{,}} and {{orth|{{sma|{{lang|la|IEI}}}}}}.")
local note2 = preprocess("The nominative/dative/ablative plural forms regularly developed into a monosyllable {{IPAchar|/iː(s)/}}, with later remodelling; compare the etymology of {{m|la|deus}}. This {{IPAchar|/iː/}} was normally spelled as {{orth|{{sma|{{lang|la|EI}}}}}} during and as {{orth|{{sma|{{lang|la|II}}}}}} after the Republic; a disyllabic {{m|la||-iī}}, spelled {{orth|{{sma|{{lang|la|II}}}}}}, {{orth|{{sma|{{lang|la|I}}}}}}, appears in Silver Age poetry, while disyllabic {{m|la||-eīs}} is only post-Classical. Other spellings include {{orth|{{sma|{{lang|la|EEI(S)}}}}}}, {{orth|{{sma|{{lang|la|EIEI(S)}}}}}}{{,}} and {{orth|{{sma|{{lang|la|IEI(S)}}}}}}.")
forms["nom_sg_m"] = "is"
forms["nom_sg_f"] = "ea"
forms["nom_sg_n"] = "id"
forms["nom_pl_m"] = {"iī", "eī", "ī"}
notes["nom_pl_m1"] = note2
forms["nom_pl_f"] = "eae"
forms["nom_pl_n"] = "ea"
forms["gen_sg_m"] = {"eius", "ejus"}
forms["gen_sg_f"] = {"eius", "ejus"}
forms["gen_sg_n"] = {"eius", "ejus"}
forms["gen_pl_m"] = {"eōrum", "eum"}
forms["gen_pl_f"] = "eārum"
forms["gen_pl_n"] = {"eōrum", "eum"}
forms["dat_sg_m"] = {"eī", "e͡i", "ēī"}
notes["dat_sg_m1"] = note1
forms["dat_sg_f"] = {"eī", "e͡i", "ēī", "eae"}
notes["dat_sg_f1"] = note1
forms["dat_sg_n"] = {"eī", "e͡i", "ēī"}
notes["dat_sg_n1"] = note1
forms["dat_pl_m"] = {"iīs", "eīs", "īs", "ībus"}
notes["dat_pl_m1"] = note2
forms["dat_pl_f"] = {"iīs", "eīs", "īs", "eābus"}
notes["dat_pl_f1"] = note2
forms["dat_pl_n"] = {"iīs", "eīs", "īs"}
notes["dat_pl_n1"] = note2
forms["acc_sg_m"] = "eum"
forms["acc_sg_f"] = "eam"
forms["acc_sg_n"] = "id"
forms["acc_pl_m"] = "eōs"
forms["acc_pl_f"] = "eās"
forms["acc_pl_n"] = "ea"
forms["abl_sg_m"] = "eō"
forms["abl_sg_f"] = "eā"
forms["abl_sg_n"] = "eō"
forms["abl_pl_m"] = {"iīs", "eīs", "īs"}
notes["abl_pl_m1"] = note2
forms["abl_pl_f"] = {"iīs", "eīs", "īs"}
notes["abl_pl_f1"] = note2
forms["abl_pl_n"] = {"iīs", "eīs", "īs"}
notes["abl_pl_n1"] = note2
if arg1 == "īdem" then
forms["nom_sg_m"] = "ī"
forms["nom_sg_n"] = "i"
forms["acc_sg_n"] = "i"
end
elseif arg1 == "quis" or arg1 == "quī" then
local note1 = preprocess("{{m|la|qua|Qua|ng=with short {{m|la||ă}}}} occurs only as an indefinite pronoun or determiner, placed immediately after {{m|la|sī}}, {{m|la|nē}}{{,}} or {{m|la|num}}. The combinations {{m|la|sīqua}}, {{m|la|nēqua}}, and {{m|la|numqua}} are sometimes written without spacing (as also are the masculines {{m|la|sīquis}}, {{m|la|nēquis}}{{,}} and {{m|la|numquis}}). Compare {{m|la|aliquis}}, {{m|la|aliqua}}, {{m|la|aliquid}}. {{m|la|quae|Quae}} can also be used instead of {{m|la||quă}}, and {{m|la||quă}} is never used as an interrogative pronoun/determiner, relative pronoun/determiner{{,}} or feminine nominative plural.")
local note2 = "Republican Latin."
local note3 = preprocess("{{m|la|quī|Quī}} is occasionally used as an ablative singular, whence {{m|la|quīcum|t=with whom}}; it was originally preferred in instrumental meanings.")
if arg1 == "quī" then
if pos == "pronouns" then
data.title = glossary_link("relative") .. " pronoun"
forms["nom_sg_m"] = {"quī", "quei"}
notes["nom_sg_m2"] = note2
forms["nom_sg_f"] = {"quae", "quai"}
notes["nom_sg_f2"] = note2
forms["nom_pl_n"] = "quae"
forms["acc_pl_n"] = "quae"
else
data.title = glossary_link("relative") .. "/" .. glossary_link("interrogative") .. " determiner"
forms["nom_sg_m"] = {"quī", "quei", "quis"}
notes["nom_sg_m2"] = note2
notes["nom_sg_m3"] = note2
forms["nom_sg_f"] = {"quae", "quai", "qua"}
notes["nom_sg_f2"] = note2
notes["nom_sg_f3"] = note1
forms["nom_pl_n"] = {"quae", "qua"}
notes["nom_pl_n2"] = note1
forms["acc_pl_n"] = {"quae", "qua"}
notes["acc_pl_n2"] = note1
end
forms["nom_sg_n"] = "quod"
forms["nom_pl_m"] = {"quī", "quei"}
notes["nom_pl_m2"] = note2
forms["nom_pl_f"] = "quae"
forms["gen_pl_m"] = "quōrum"
forms["gen_pl_f"] = "quārum"
forms["gen_pl_n"] = "quōrum"
forms["acc_sg_f"] = "quam"
forms["acc_sg_n"] = "quod"
forms["acc_pl_m"] = "quōs"
forms["acc_pl_f"] = "quās"
else
data.title = glossary_link("interrogative") .. "/" .. glossary_link("indefinite") .. " pronoun"
forms["nom_sg_m"] = {"quis", "quī", "quei"}
notes["nom_sg_m3"] = note2
forms["nom_sg_f"] = {"quae", "quis", "qua"}
notes["nom_sg_f2"] = note2
notes["nom_sg_f3"] = note1
forms["nom_sg_n"] = "quid"
forms["nom_pl_m"] = {"quī", "quei", "quēs"}
notes["nom_pl_m2"] = note2
notes["nom_pl_m3"] = note2
forms["nom_pl_f"] = {"quae", "quēs"}
notes["nom_pl_f2"] = note2
forms["nom_pl_n"] = {"quae", "qua"}
notes["nom_pl_n2"] = note1
forms["gen_pl_m"] = {"quōrum", "quium"}
forms["gen_pl_f"] = {"quārum", "quium"}
forms["gen_pl_n"] = {"quōrum", "quium"}
notes["gen_pl_m2"] = note2
notes["gen_pl_f2"] = note2
notes["gen_pl_n2"] = note2
forms["acc_sg_f"] = {"quam", "quem"}
notes["acc_sg_f2"] = note2
forms["acc_sg_n"] = "quid"
forms["acc_pl_m"] = {"quōs", "quēs"}
notes["acc_pl_m2"] = note2
forms["acc_pl_f"] = {"quās", "quēs"}
notes["acc_pl_f2"] = note2
forms["acc_pl_n"] = {"quae", "qua"}
notes["acc_pl_n2"] = note1
end
forms["gen_sg_m"] = {"cuius", "quoius"}
forms["gen_sg_f"] = {"cuius", "quoius"}
forms["gen_sg_n"] = {"cuius", "quoius"}
notes["gen_sg_m2"] = note2
notes["gen_sg_f2"] = note2
notes["gen_sg_n2"] = note2
forms["dat_sg_m"] = {"cui", "quoi", "[[quoī]] / [[quoei]]", "[[quoiī]] / [[quoiei]]"}
forms["dat_sg_f"] = {"cui", "quoi", "[[quoī]] / [[quoei]]", "[[quoiī]] / [[quoiei]]"}
forms["dat_sg_n"] = {"cui", "quoi", "[[quoī]] / [[quoei]]", "[[quoiī]] / [[quoiei]]"}
notes["dat_sg_m2"] = note2
notes["dat_sg_m3"] = note2
notes["dat_sg_m4"] = note2
notes["dat_sg_f2"] = note2
notes["dat_sg_f3"] = note2
notes["dat_sg_f4"] = note2
notes["dat_sg_n2"] = note2
notes["dat_sg_n3"] = note2
notes["dat_sg_n4"] = note2
forms["dat_pl_m"] = {"quibus", "quīs", "queis"}
forms["dat_pl_f"] = {"quibus", "quīs", "queis"}
forms["dat_pl_n"] = {"quibus", "quīs", "queis"}
notes["dat_pl_m3"] = note2
notes["dat_pl_f3"] = note2
notes["dat_pl_n3"] = note2
forms["acc_sg_m"] = "quem"
forms["abl_sg_m"] = {"quō", "quī"}
forms["abl_sg_f"] = {"quā", "quī"}
forms["abl_sg_n"] = {"quō", "quī"}
notes["abl_sg_m2"] = note3
notes["abl_sg_f2"] = note3
notes["abl_sg_n2"] = note3
forms["abl_pl_m"] = {"quibus", "quīs", "queis"}
forms["abl_pl_f"] = {"quibus", "quīs", "queis"}
forms["abl_pl_n"] = {"quibus", "quīs", "queis"}
notes["abl_pl_m3"] = note2
notes["abl_pl_f3"] = note2
notes["abl_pl_n3"] = note2
elseif arg1 == "aliquī" then
data.title = glossary_link("indefinite") .. " " .. glossary_link("determiner")
local note1 = "Normatively, [[aliqui#Latin|aliquī]] is a determiner (used adjectivally) and [[aliquis#Latin|aliquis]] is a pronoun (used substantively), but the opposite usages can be found, even among the best Classical writers."
local note2 = "The feminine nominative singular form is usually ''aliqua'', but there are a handful of possible examples of ''aliquae'' as a feminine nominative singular form; see [[Citations:aliquae]]. The feminine nominative plural can only be ''aliquae'', and there are perhaps no solid examples of the neuter nominative/accusative plural taking any form other than ''aliqua''."
local note3 = "Alternative spelling [[aliquoius]] (used in Republican Latin or earlier)."
local note4 = "Alternative spelling [[aliqueis]] (used in Republican Latin or earlier)."
local note5 = "Alternative spelling [[aliquoi]] (used in Republican Latin or earlier)."
forms["nom_sg_m"] = {"aliquī", "aliquis"}
notes["nom_sg_m2"] = note1
forms["nom_sg_f"] = "aliqua"
notes["nom_sg_f1"] = note2
forms["nom_sg_n"] = "aliquod"
forms["nom_pl_m"] = "aliquī"
forms["nom_pl_f"] = "aliquae"
notes["nom_pl_f1"] = note2
forms["nom_pl_n"] = "aliqua"
notes["nom_pl_n1"] = note2
forms["gen_sg_m"] = "alicuius"
notes["gen_sg_m1"] = note3
forms["gen_sg_f"] = "alicuius"
notes["gen_sg_f1"] = note3
forms["gen_sg_n"] = "alicuius"
notes["gen_sg_n1"] = note3
forms["gen_pl_m"] = "aliquōrum"
forms["gen_pl_f"] = "aliquārum"
forms["gen_pl_n"] = "aliquōrum"
forms["dat_sg_m"] = "alicui"
notes["dat_sg_m1"] = note5
forms["dat_sg_f"] = "alicui"
notes["dat_sg_f1"] = note5
forms["dat_sg_n"] = "alicui"
notes["dat_sg_n1"] = note5
forms["dat_pl_m"] = {"aliquīs", "aliquibus"}
notes["dat_pl_m1"] = note4
forms["dat_pl_f"] = {"aliquīs", "aliquibus"}
notes["dat_pl_f1"] = note4
forms["dat_pl_n"] = {"aliquīs", "aliquibus"}
notes["dat_pl_n1"] = note4
forms["acc_sg_m"] = "aliquem"
forms["acc_sg_f"] = "aliquam"
forms["acc_sg_n"] = "aliquod"
forms["acc_pl_m"] = "aliquōs"
forms["acc_pl_f"] = "aliquās"
forms["acc_pl_n"] = "aliqua"
notes["acc_pl_n1"] = note2
forms["abl_sg_m"] = "aliquō"
forms["abl_sg_f"] = "aliquā"
forms["abl_sg_n"] = "aliquō"
forms["abl_pl_m"] = {"aliquīs", "aliquibus"}
notes["abl_pl_m1"] = note4
forms["abl_pl_f"] = {"aliquīs", "aliquibus"}
notes["abl_pl_f1"] = note4
forms["abl_pl_n"] = {"aliquīs", "aliquibus"}
notes["abl_pl_n1"] = note4
elseif arg1 == "aliquis" then
data.title = glossary_link("indefinite") .. " " .. glossary_link("pronoun")
local note1 = preprocess("{{m|la|aliquī|g=m|qq=nom. sg.}} is relatively rare (but classically attested) as a pronoun, although frequent as a determiner.")
local note2 = preprocess("{{m|la|aliqua|g=f|qq=nom. sg.}} is very rare as a pronoun, although frequent as a determiner.")
local note3 = preprocess("{{m|la|alicuius|qq=gen. sg.}} and {{m|la|alicui|qq=dat. sg.}} have alternative spellings {{m|la|aliquoius}}, {{m|la|aliquoi}} (used in Republican Latin or earlier).")
local note4 = "Alternative spelling [[aliqueis]] (used in Republican Latin or earlier)."
local note4 = preprocess("{{m|la|aliquīs|qq=abl. pl.}} has the alternative spelling {{m|la|aliqueis}} (used in Republican Latin or earlier).")
local note5 = preprocess("{{m|la|aliquī|qq=abl. sg.}} is a rare Old Latin form, attested in Plautus in place of {{m|la|aliquō}} as a masculine and neuter pronoun.")
local note6 = preprocess("{{m|la|aliquī|qq=nom. pl.}} had an alternative Old Latin form {{m|la|aliquēs}} according to the Late Latin grammarian Charisius.")
forms["nom_sg_m"] = {"aliquis", "aliquī"}
notes["nom_sg_m2"] = note1
forms["nom_sg_f"] = "aliqua"
notes["nom_sg_f1"] = note2
forms["nom_sg_n"] = "aliquid"
forms["nom_pl_m"] = "aliquī"
notes["nom_pl_m1"] = note6
forms["nom_pl_f"] = "aliquae"
forms["nom_pl_n"] = "aliqua"
forms["gen_sg_m"] = "alicuius"
notes["gen_sg_m1"] = note3
forms["gen_sg_f"] = "alicuius"
notes["gen_sg_f1"] = note3
forms["gen_sg_n"] = "alicuius"
notes["gen_sg_n1"] = note3
forms["gen_pl_m"] = "aliquōrum"
forms["gen_pl_f"] = "aliquārum"
forms["gen_pl_n"] = "aliquōrum"
forms["dat_sg_m"] = "alicui"
notes["dat_sg_m1"] = note3
forms["dat_sg_f"] = "alicui"
notes["dat_sg_f1"] = note3
forms["dat_sg_n"] = "alicui"
notes["dat_sg_n1"] = note3
forms["dat_pl_m"] = {"aliquīs", "aliquibus"}
notes["dat_pl_m1"] = note4
forms["dat_pl_f"] = {"aliquīs", "aliquibus"}
notes["dat_pl_f1"] = note4
forms["dat_pl_n"] = {"aliquīs", "aliquibus"}
notes["dat_pl_n1"] = note4
forms["acc_sg_m"] = "aliquem"
forms["acc_sg_f"] = "aliquam"
forms["acc_sg_n"] = "aliquid"
forms["acc_pl_m"] = "aliquōs"
forms["acc_pl_f"] = "aliquās"
forms["acc_pl_n"] = "aliqua"
forms["abl_sg_m"] = {"aliquō", "aliquī"}
notes["abl_sg_m2"] = note5
forms["abl_sg_f"] = {"aliquā", "aliquī"}
notes["abl_sg_f2"] = note5
forms["abl_sg_n"] = {"aliquō", "aliquī"}
notes["abl_sg_n2"] = note5
forms["abl_pl_m"] = {"aliquīs", "aliquibus"}
notes["abl_pl_m1"] = note4
forms["abl_pl_f"] = {"aliquīs", "aliquibus"}
notes["abl_pl_f1"] = note4
forms["abl_pl_n"] = {"aliquīs", "aliquibus"}
notes["abl_pl_n1"] = note4
elseif arg1 == "quisquam" then
if pos == "pronouns" then
local note1 = "Republican Latin."
local note2 = "Used in the feminine only in Old Latin."
data.title = glossary_link("negative polarity item", "negative polarity") .. " " .. glossary_link("indefinite") .. " " .. glossary_link("pronoun")
forms["nom_sg_m"] = "quisquam"
notes["nom_sg_m1"] = note2
forms["nom_sg_n"] = {"quicquam", "quidquam"}
forms["gen_sg_m"] = {"cuiusquam", "quoiusquam"}
forms["gen_sg_f"] = {"cuiusquam", "quoiusquam"}
forms["gen_sg_n"] = {"cuiusquam", "quoiusquam"}
notes["gen_sg_m2"] = note1
notes["gen_sg_f2"] = note1
notes["gen_sg_n2"] = note1
forms["dat_sg_m"] = {"cuiquam", "quoiquam"}
forms["dat_sg_f"] = {"cuiquam", "quoiquam"}
forms["dat_sg_n"] = {"cuiquam", "quoiquam"}
notes["dat_sg_m2"] = note1
notes["dat_sg_f2"] = note1
notes["dat_sg_n2"] = note1
forms["acc_sg_m"] = "quemquam"
notes["acc_sg_m1"] = note2
forms["acc_sg_n"] = {"quicquam", "quidquam"}
forms["abl_sg_m"] = {"quōquam", "quīquam"}
forms["abl_sg_n"] = {"quōquam", "quīquam"}
elseif pos == "determiners" then
local note1 = "Only attested in postclassical Latin. In Classical Latin, forms of [[ullus#Latin|ūllus]] were used instead."
local note2 = "Only attested as a feminine form in the preclassical Latin of authors like Plautus."
local note3 = "Attested only once in Classical Latin. Usually [[ullus#Latin|ūllam]] was used instead."
local note4 = "Attested, but rare in Classical Latin. Usually [[ullus#Latin|ūllō]] was used instead."
data.title = glossary_link("negative polarity item", "negative polarity") .. " " .. glossary_link("indefinite") .. " " .. glossary_link("determiner")
forms["nom_sg_m"] = "quisquam"
forms["nom_sg_f"] = {"quaequam", "quisquam"}
notes["nom_sg_f1"] = note1
notes["nom_sg_f2"] = note2
forms["nom_sg_n"] = "quodquam"
notes["nom_sg_n1"] = note1
forms["nom_pl_m"] = "quīquam"
notes["nom_pl_m1"] = note1
forms["nom_pl_f"] = "quaequam"
notes["nom_pl_f1"] = note1
forms["nom_pl_n"] = "quaequam"
notes["nom_pl_n1"] = note1
forms["gen_sg_m"] = "cuiusquam"
forms["gen_sg_f"] = "cuiusquam"
forms["gen_sg_n"] = "cuiusquam"
forms["gen_pl_m"] = "quōrumquam"
notes["gen_pl_m1"] = note1
forms["gen_pl_f"] = "quārumquam"
notes["gen_pl_f1"] = note1
forms["gen_pl_n"] = "quōrumquam"
notes["gen_pl_n1"] = note1
forms["dat_sg_m"] = "cuiquam"
forms["dat_sg_f"] = "cuiquam"
forms["dat_sg_n"] = "cuiquam"
forms["dat_pl_m"] = "quibusquam"
notes["dat_pl_m1"] = note1
forms["dat_pl_f"] = "quibusquam"
notes["dat_pl_f1"] = note1
forms["dat_pl_n"] = "quibusquam"
notes["dat_pl_n1"] = note1
forms["acc_sg_m"] = "quemquam"
forms["acc_sg_f"] = {"quamquam", "quemquam"}
notes["acc_sg_f1"] = note3
notes["acc_sg_f2"] = note2
forms["acc_sg_n"] = "quodquam"
notes["acc_sg_n1"] = note1
forms["acc_pl_m"] = "quōsquam"
notes["acc_pl_m1"] = note1
forms["acc_pl_f"] = "quāsquam"
notes["acc_pl_f1"] = note1
forms["acc_pl_n"] = "quaequam"
notes["acc_pl_n1"] = note1
forms["abl_sg_m"] = {"quōquam", "quīquam"}
notes["abl_sg_m1"] = note4
notes["abl_sg_m2"] = note2
forms["abl_sg_f"] = "quāquam"
notes["abl_sg_f1"] = note1
forms["abl_sg_n"] = "quōquam"
notes["abl_sg_n1"] = note4
forms["abl_pl_m"] = "quibusquam"
notes["abl_pl_m1"] = note1
forms["abl_pl_f"] = "quibusquam"
notes["abl_pl_f1"] = note1
forms["abl_pl_n"] = "quibusquam"
notes["abl_pl_n1"] = note1
forms["voc_sg_m"] = "quisquam"
notes["voc_sg_m1"] = note1
forms["voc_sg_f"] = "quaequam"
notes["voc_sg_f1"] = note1
forms["voc_sg_n"] = "quodquam"
notes["voc_sg_n1"] = note1
forms["voc_pl_m"] = "quīquam"
notes["voc_pl_m1"] = note1
forms["voc_pl_f"] = "quaequam"
notes["voc_pl_f1"] = note1
forms["voc_pl_n"] = "quaequam"
notes["voc_pl_n1"] = note1
end
elseif arg1 == "quisquis" then
data.title = glossary_link("relative") .. "/" .. glossary_link("interrogative") .. " pronoun"
forms["nom_sg_m"] = "quisquis"
forms["nom_sg_f"] = "quisquis"
forms["nom_sg_n"] = {"quidquid", "quicquid"}
forms["nom_pl_m"] = "quīquī"
forms["nom_pl_f"] = "quaequae"
forms["nom_pl_n"] = "quaequae"
forms["gen_sg_m"] = "cuiuscuius"
forms["gen_sg_f"] = "cuiuscuius"
forms["gen_sg_n"] = "cuiuscuius"
forms["gen_pl_m"] = "quōrumquōrum"
forms["gen_pl_f"] = "quārumquārum"
forms["gen_pl_n"] = "quōrumquōrum"
forms["dat_sg_m"] = "cuicui"
forms["dat_sg_f"] = "cuicui"
forms["dat_sg_n"] = "cuicui"
forms["dat_pl_m"] = {"quibusquibus", "quīsquīs"}
forms["dat_pl_f"] = {"quibusquibus", "quīsquīs"}
forms["dat_pl_n"] = {"quibusquibus", "quīsquīs"}
forms["acc_sg_m"] = "quemquem"
forms["acc_sg_f"] = "quamquam"
forms["acc_sg_n"] = {"quidquid", "quicquid"}
forms["acc_pl_m"] = "quōsquōs"
forms["acc_pl_f"] = "quāsquās"
forms["acc_pl_n"] = "quaequae"
forms["abl_sg_m"] = "quōquō"
forms["abl_sg_f"] = "quāquā"
forms["abl_sg_n"] = "quōquō"
forms["abl_pl_m"] = {"quibusquibus", "quīsquīs"}
forms["abl_pl_f"] = {"quibusquibus", "quīsquīs"}
forms["abl_pl_n"] = {"quibusquibus", "quīsquīs"}
forms["voc_sg_m"] = "quisquis"
forms["voc_sg_f"] = "quisquis"
forms["voc_sg_n"] = {"quidquid", "quicquid"}
forms["voc_pl_m"] = "quīquī"
forms["voc_pl_f"] = "quaequae"
forms["voc_pl_n"] = "quaequae"
elseif arg1 == "ecquis" then
local note1 = "Unattested in classical Latin."
local note2 = "Attested only twice in Classical Latin."
data.title = glossary_link("interrogative") .. " pronoun"
forms["nom_sg_m"] = {"ecquis", "ecquī"}
forms["nom_sg_f"] = {"ecqua", "ecquae"}
forms["nom_sg_n"] = "ecquid"
forms["nom_pl_m"] = "ecquī"
forms["nom_pl_f"] = "ecquae"
forms["nom_pl_n"] = {"ecqua", "ecquae"}
forms["gen_sg_m"] = "eccuius"
forms["gen_sg_f"] = "eccuius"
forms["gen_sg_n"] = "eccuius"
notes["gen_sg_m1"] = note1
notes["gen_sg_f1"] = note1
notes["gen_sg_n1"] = note1
forms["dat_sg_m"] = "eccui"
forms["dat_sg_f"] = "eccui"
forms["dat_sg_n"] = "eccui"
notes["dat_sg_m1"] = note2
notes["dat_sg_f1"] = note2
notes["dat_sg_n1"] = note2
forms["acc_sg_m"] = "ecquem"
forms["acc_sg_f"] = "ecquam"
forms["acc_sg_n"] = "ecquod"
forms["acc_pl_m"] = "ecquōs"
forms["acc_pl_f"] = "ecquās"
forms["acc_pl_n"] = {"ecqua", "ecquae"}
forms["abl_sg_m"] = {"ecquō", "ecquī"}
forms["abl_sg_f"] = {"ecquā", "ecquī"}
forms["abl_sg_n"] = {"ecquō", "ecquī"}
elseif arg1 == "quīdam" then
local note1 = "The genitive singular was spelled [[quoiusdam#Latin|''quoiusdam'']] before the Augustan period."
local note2 = "The dative singular was spelled [[quoidam#Latin|''quoidam'']] before the Augustan period."
local note3 = "An alternative masculine nominative/accusative plural form [[quesdam#Latin|''quēsdam'']] occurs in Accius."
local note4 = "The dative/ablative plural has a rare alternative form [[quisdam#Latin|''quīsdam'']]/[[queisdam#Latin|''queisdam'']]."
data.title = glossary_link("indefinite") .. " pronoun"
forms["nom_sg_m"] = "quīdam"
forms["nom_sg_f"] = "quaedam"
forms["nom_sg_n"] = "quiddam"
forms["nom_pl_m"] = "quīdam"
notes["nom_pl_m1"] = note3
forms["nom_pl_f"] = "quaedam"
forms["nom_pl_n"] = "quaedam"
forms["gen_sg_m"] = "cuiusdam"
forms["gen_sg_f"] = "cuiusdam"
forms["gen_sg_n"] = "cuiusdam"
notes["gen_sg_m1"] = note1
notes["gen_sg_f1"] = note1
notes["gen_sg_n1"] = note1
forms["gen_pl_m"] = {"quōrundam", "quōrumdam"}
forms["gen_pl_f"] = {"quārundam", "quārumdam"}
forms["gen_pl_n"] = {"quōrundam", "quōrumdam"}
forms["dat_sg_m"] = "cuidam"
forms["dat_sg_f"] = "cuidam"
forms["dat_sg_n"] = "cuidam"
notes["dat_sg_m1"] = note2
notes["dat_sg_f1"] = note2
notes["dat_sg_n1"] = note2
forms["dat_pl_m"] = "quibusdam"
forms["dat_pl_f"] = "quibusdam"
forms["dat_pl_n"] = "quibusdam"
notes["dat_pl_m1"] = note4
notes["dat_pl_f1"] = note4
notes["dat_pl_n1"] = note4
forms["acc_sg_m"] = {"quendam", "quemdam"}
forms["acc_sg_f"] = {"quandam", "quamdam"}
forms["acc_sg_n"] = "quiddam"
forms["acc_pl_m"] = "quōsdam"
notes["acc_pl_m1"] = note3
forms["acc_pl_f"] = "quāsdam"
forms["acc_pl_n"] = "quaedam"
forms["abl_sg_m"] = "quōdam"
forms["abl_sg_f"] = "quādam"
forms["abl_sg_n"] = "quōdam"
forms["abl_pl_m"] = "quibusdam"
forms["abl_pl_f"] = "quibusdam"
forms["abl_pl_n"] = "quibusdam"
notes["abl_pl_m1"] = note4
notes["abl_pl_f1"] = note4
notes["abl_pl_n1"] = note4
elseif arg1 == "nēmō" then
local note1 = "The genitive [[neminis|''nēminis'']] is not used in Classical Latin, and is generally also avoided by later authors."
local note2 = "The ablative [[nemine|''nēmine'']] is not used in Classical Latin, but can be seen in authors from the Imperial period onwards."
data.title = "Negative pronoun and " .. glossary_link("determiner")
forms["nom_sg_m"] = "nēmō"
forms["nom_sg_f"] = "nēmō"
forms["gen_sg_m"] = {"nūllī̆us", "nēminis"}
forms["gen_sg_f"] = {"nūllī̆us", "nēminis"}
notes["gen_sg_m2"] = note1
notes["gen_sg_f2"] = note1
forms["dat_sg_m"] = "nēminī"
forms["dat_sg_f"] = "nēminī"
forms["acc_sg_m"] = "nēminem"
forms["acc_sg_f"] = "nēminem"
forms["abl_sg_m"] = {"nūllō", "nēmine"}
forms["abl_sg_f"] = {"nūllā", "nēmine"}
notes["abl_sg_m2"] = note2
notes["abl_sg_f2"] = note2
else
error('adjective ' .. arg1 .. ' not recognized')
end
end
return decl
-- For Vim, so we get 4-space tabs
-- vim: set ts=4 sw=4 noet:
ga455cmkizkrwx7mapjsd7vn2h6yoc9
Mô đun:la-adj/table
828
266073
2561556
2256992
2026-09-08T01:42:04Z
Hiyuune
50834
2561556
Scribunto
text/plain
local export = {}
local m_table = require("Module:table")
local m_inflection_table = require("Module:inflection-table")
local function convert(data, conv)
local col = {}
local row = {}
local marked = {}
local slots = {}
local function add(i,j)
local col = col[i][j]
local row = row[i][j]
if col==0 or row==0 then
return ""
end
local entry = data.finish_show_form(data, slots[i][j])
if col==1 then
if row==1 then
return '\n| ' .. entry
else
return '\n| rowspan=' .. row .. ' | ' .. entry
end
else
if row==1 then
return '\n| colspan=' .. col .. ' | ' .. entry
else
return '\n| colspan=' .. col .. ' rowspan=' .. row .. ' | ' .. entry
end
end
end
for i=1,#conv do
col[i] = {}
row[i] = {}
marked[i] = {}
slots[i] = {}
for j=1,#conv[i] do
col[i][j] = 1
row[i][j] = 1
marked[i][j] = false
slots[i][j] = {conv[i][j]}
end
end
-- Return true if the contents of the two slots are equal in every
-- way. This means the forms are the same, the footnote text is the
-- same, and the accelerator lemmas are the same. We need to compare
-- the accelerator lemmas because in some cases different slots have
-- different lemmas (e.g. when noneut=1 is set, the masculine slots
-- will have the masculine lemma but the feminine slots will have the
-- feminine lemma).
local function slots_equal(slot1, slot2)
return m_table.deepEquals(data.forms[slot1], data.forms[slot2]) and
m_table.deepEquals(data.notetext[slot1], data.notetext[slot2]) and
(data.accel[slot1] and data.accel[slot1].lemma or nil) ==
(data.accel[slot2] and data.accel[slot2].lemma or nil)
end
--merge identical cells within a row
for i=1,#conv do for j=1,#conv[i] do
if col[i][j] ~= 0 then
for k=j+1,#conv[i] do
local slotij = conv[i][j]
local slotik = conv[i][k]
if not slots_equal(slotij, slotik) then
break
end
col[i][j] = col[i][j] + 1
col[i][k] = 0
row[i][k] = 0
for _, slot in ipairs(slots[i][k]) do
table.insert(slots[i][j], slot)
end
slots[i][k] = nil
end
end
end end
--final
for i=1,#conv do
for j=1,#conv[i] do
conv[i][j] = add(i,j)
end
conv[i] = table.concat(conv[i])
end
return conv
end
local function make_table_mfn_pl(data, mfonly)
local conv = {
{"nom_pl_m"},
{"gen_pl_m"},
{"dat_pl_m"},
{"acc_pl_m"},
{"abl_pl_m"},
{"voc_pl_m"},
{"loc_pl_m"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! ' .. (mfonly and 'masc./fem.' or 'masc./fem./neut.')
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_mfn_sg(data, mfonly)
local conv = {
{"nom_sg_m"},
{"gen_sg_m"},
{"dat_sg_m"},
{"acc_sg_m"},
{"abl_sg_m"},
{"voc_sg_m"},
{"loc_sg_m"},
}
conv = convert(data, conv)
local output = data.title .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" | số ít'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! ' .. (mfonly and 'giống đực/giống cái' or 'giống đực/giống cái/giống trung')
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_n_pl(data)
local conv = {
{"nom_pl_n"},
{"gen_pl_n"},
{"dat_pl_n"},
{"acc_pl_n"},
{"abl_pl_n"},
{"voc_pl_n"},
{"loc_pl_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! ' .. 'giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_n_sg(data)
local conv = {
{"nom_sg_n"},
{"gen_sg_n"},
{"dat_sg_n"},
{"acc_sg_n"},
{"abl_sg_n"},
{"voc_sg_n"},
{"loc_sg_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" | số ít'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! ' .. 'giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_mf_and_n_pl(data)
local conv = {
{"nom_pl_m", "nom_pl_n"},
{"gen_pl_m", "gen_pl_n"},
{"dat_pl_m", "dat_pl_n"},
{"acc_pl_m", "acc_pl_n"},
{"abl_pl_m", "abl_pl_n"},
{"voc_pl_m", "voc_pl_n"},
{"loc_pl_m", "loc_pl_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="2" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực/giống cái'
output = output .. '\n! giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_mf_and_n_sg(data)
local conv = {
{"nom_sg_m", "nom_sg_n"},
{"gen_sg_m", "gen_sg_n"},
{"dat_sg_m", "dat_sg_n"},
{"acc_sg_m", "acc_sg_n"},
{"abl_sg_m", "abl_sg_n"},
{"voc_sg_m", "voc_sg_n"},
{"loc_sg_m", "loc_sg_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="2" | số ít'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực/giống cái'
output = output .. '\n! giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_m_and_f_pl(data)
local conv = {
{"nom_pl_m", "nom_pl_f"},
{"gen_pl_m", "gen_pl_f"},
{"dat_pl_m", "dat_pl_f"},
{"acc_pl_m", "acc_pl_f"},
{"abl_pl_m", "abl_pl_f"},
{"voc_pl_m", "voc_pl_f"},
{"loc_pl_m", "loc_pl_f"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="2" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_m_and_f_sg(data)
local conv = {
{"nom_sg_m", "nom_sg_f"},
{"gen_sg_m", "gen_sg_f"},
{"dat_sg_m", "dat_sg_f"},
{"acc_sg_m", "acc_sg_f"},
{"abl_sg_m", "abl_sg_f"},
{"voc_sg_m", "voc_sg_f"},
{"loc_sg_m", "loc_sg_f"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="2" | số ít'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_m_and_f_and_n_pl(data)
local conv = {
{"nom_pl_m", "nom_pl_f", "nom_pl_n"},
{"gen_pl_m", "gen_pl_f", "gen_pl_n"},
{"dat_pl_m", "dat_pl_f", "dat_pl_n"},
{"acc_pl_m", "acc_pl_f", "acc_pl_n"},
{"abl_pl_m", "abl_pl_f", "abl_pl_n"},
{"voc_pl_m", "voc_pl_f", "voc_pl_n"},
{"loc_pl_m", "loc_pl_f", "loc_pl_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="3" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n! giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_m_and_f_and_n_sg(data)
local conv = {
{"nom_sg_m", "nom_sg_f", "nom_sg_n"},
{"gen_sg_m", "gen_sg_f", "gen_sg_n"},
{"dat_sg_m", "dat_sg_f", "dat_sg_n"},
{"acc_sg_m", "acc_sg_f", "acc_sg_n"},
{"abl_sg_m", "abl_sg_f", "abl_sg_n"},
{"voc_sg_m", "voc_sg_f", "voc_sg_n"},
{"loc_sg_m", "loc_sg_f", "loc_sg_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="3" | số ít'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n! giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_mfn(data, mfonly)
local conv = {
{"nom_sg_m"},
{"gen_sg_m"},
{"dat_sg_m"},
{"acc_sg_m"},
{"abl_sg_m"},
{"voc_sg_m"},
{"loc_sg_m"},
{"nom_pl_m"},
{"gen_pl_m"},
{"dat_pl_m"},
{"acc_pl_m"},
{"abl_pl_m"},
{"voc_pl_m"},
{"loc_pl_m"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" | số ít'
output = output .. '\n|class="separator" rowspan="999"|'
output = output .. '\n!class="outer" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! ' .. (mfonly and 'giống đực/giống cái' or 'giống đực/giống cái/giống trung')
output = output .. '\n! ' .. (mfonly and 'giống đực/giống cái' or 'giống đực/giống cái/giống trung')
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. conv[8]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. conv[9]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. conv[10]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. conv[11]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. conv[12]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
output = output .. conv[13]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
output = output .. conv[14]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_n(data)
local conv = {
{"nom_sg_n"},
{"gen_sg_n"},
{"dat_sg_n"},
{"acc_sg_n"},
{"abl_sg_n"},
{"voc_sg_n"},
{"loc_sg_n"},
{"nom_pl_n"},
{"gen_pl_n"},
{"dat_pl_n"},
{"acc_pl_n"},
{"abl_pl_n"},
{"voc_pl_n"},
{"loc_pl_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" | số ít'
output = output .. '\n|class="separator" rowspan="999"|'
output = output .. '\n!class="outer" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! ' .. 'giống trung'
output = output .. '\n! ' .. 'giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. conv[8]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. conv[9]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. conv[10]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. conv[11]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. conv[12]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
output = output .. conv[13]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
output = output .. conv[14]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_mf_and_n(data)
local conv = {
{"nom_sg_m", "nom_sg_n"},
{"gen_sg_m", "gen_sg_n"},
{"dat_sg_m", "dat_sg_n"},
{"acc_sg_m", "acc_sg_n"},
{"abl_sg_m", "abl_sg_n"},
{"voc_sg_m", "voc_sg_n"},
{"loc_sg_m", "loc_sg_n"},
{"nom_pl_m", "nom_pl_n"},
{"gen_pl_m", "gen_pl_n"},
{"dat_pl_m", "dat_pl_n"},
{"acc_pl_m", "acc_pl_n"},
{"abl_pl_m", "abl_pl_n"},
{"voc_pl_m", "voc_pl_n"},
{"loc_pl_m", "loc_pl_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="2" | số ít'
output = output .. '\n|class="separator" rowspan="999"|'
output = output .. '\n!class="outer" colspan="2" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực/giống cái'
output = output .. '\n! giống trung'
output = output .. '\n! giống đực/giống cái'
output = output .. '\n! giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. conv[8]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. conv[9]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. conv[10]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. conv[11]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. conv[12]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
output = output .. conv[13]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
output = output .. conv[14]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_m_and_f(data)
local conv = {
{"nom_sg_m", "nom_sg_f"},
{"gen_sg_m", "gen_sg_f"},
{"dat_sg_m", "dat_sg_f"},
{"acc_sg_m", "acc_sg_f"},
{"abl_sg_m", "abl_sg_f"},
{"voc_sg_m", "voc_sg_f"},
{"loc_sg_m", "loc_sg_f"},
{"nom_pl_m", "nom_pl_f"},
{"gen_pl_m", "gen_pl_f"},
{"dat_pl_m", "dat_pl_f"},
{"acc_pl_m", "acc_pl_f"},
{"abl_pl_m", "abl_pl_f"},
{"voc_pl_m", "voc_pl_f"},
{"loc_pl_m", "loc_pl_f"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="2" | số ít'
output = output .. '\n|class="separator" rowspan="999"|'
output = output .. '\n!class="outer" colspan="2" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. conv[8]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. conv[9]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. conv[10]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. conv[11]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. conv[12]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
output = output .. conv[13]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
output = output .. conv[14]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
local function make_table_m_and_f_and_n(data)
local conv = {
{"nom_sg_m", "nom_sg_f", "nom_sg_n"},
{"gen_sg_m", "gen_sg_f", "gen_sg_n"},
{"dat_sg_m", "dat_sg_f", "dat_sg_n"},
{"acc_sg_m", "acc_sg_f", "acc_sg_n"},
{"abl_sg_m", "abl_sg_f", "abl_sg_n"},
{"voc_sg_m", "voc_sg_f", "voc_sg_n"},
{"loc_sg_m", "loc_sg_f", "loc_sg_n"},
{"nom_pl_m", "nom_pl_f", "nom_pl_n"},
{"gen_pl_m", "gen_pl_f", "gen_pl_n"},
{"dat_pl_m", "dat_pl_f", "dat_pl_n"},
{"acc_pl_m", "acc_pl_f", "acc_pl_n"},
{"abl_pl_m", "abl_pl_f", "abl_pl_n"},
{"voc_pl_m", "voc_pl_f", "voc_pl_n"},
{"loc_pl_m", "loc_pl_f", "loc_pl_n"},
}
conv = convert(data, conv)
local output = data.title
output = output .. '\n\n'
output = output .. m_inflection_table.make_top{
title = '-',
palette = 'cyan',
class = 'sticky-left-column',
lang = "la",
}
output = output .. '\n!class="outer" | '
output = output .. '\n!class="outer" colspan="3" | số ít'
output = output .. '\n|class="separator" rowspan="999"|'
output = output .. '\n!class="outer" colspan="3" | số nhiều'
output = output .. '\n|-'
output = output .. '\n! '
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n! giống trung'
output = output .. '\n! giống đực'
output = output .. '\n! giống cái'
output = output .. '\n! giống trung'
output = output .. '\n|-'
output = output .. '\n! [[nominative case|danh cách]]'
output = output .. conv[1]
output = output .. conv[8]
output = output .. '\n|-'
output = output .. '\n! [[genitive case|sinh cách]]'
output = output .. conv[2]
output = output .. conv[9]
output = output .. '\n|-'
output = output .. '\n! [[dative case|dữ cách]]'
output = output .. conv[3]
output = output .. conv[10]
output = output .. '\n|-'
output = output .. '\n! [[accusative case|đối cách]]'
output = output .. conv[4]
output = output .. conv[11]
output = output .. '\n|-'
output = output .. '\n! [[ablative case|ly cách]]'
output = output .. conv[5]
output = output .. conv[12]
output = output .. '\n|-'
output = output .. '\n! [[vocative case|hô cách]]'
output = output .. conv[6]
output = output .. conv[13]
if data.loc then
output = output .. '\n|-'
output = output .. '\n! [[locative case|định vị cách]]'
output = output .. conv[7]
output = output .. conv[14]
end
output = output .. '\n' .. m_inflection_table.make_bottom{}
if data.footnotes and data.footnotes ~= '' then
output = output .. '\n' .. data.footnotes
end
return output
end
function export.make_table(data)
local forms, output = data.forms
if not forms.nom_sg_n and not forms.nom_pl_n then
if forms.nom_sg_f or forms.nom_pl_f then
if data.num == "pl" then
output = make_table_m_and_f_pl(data)
elseif data.num == "sg"
then output = make_table_m_and_f_sg(data)
else
output = make_table_m_and_f(data)
end
else
local mfonly = data.noneut and not data.nomf
if data.num == "pl" then
output = make_table_mfn_pl(data, mfonly)
elseif data.num == "sg" then
output = make_table_mfn_sg(data, mfonly)
else
output = make_table_mfn(data, mfonly)
end
end
elseif data.nomf then
if data.num == "pl" then output = make_table_n_pl(data)
elseif data.num == "sg" then output = make_table_n_sg(data)
else output = make_table_n(data) end
elseif not forms.nom_sg_f and not forms.nom_pl_f then
if data.num == "pl" then output = make_table_mf_and_n_pl(data)
elseif data.num == "sg" then output = make_table_mf_and_n_sg(data)
else output = make_table_mf_and_n(data) end
else
if data.num == "pl" then output = make_table_m_and_f_and_n_pl(data)
elseif data.num == "sg" then output = make_table_m_and_f_and_n_sg(data)
else output = make_table_m_and_f_and_n(data) end
end
return output
end
return export
-- For Vim, so we get 4-space tabs
-- vim: set ts=4 sw=4 noet:
onvxvsd27apyi6ceplcvfwjxstn1gs9
Mô đun:headword utilities
828
270803
2561597
2340602
2026-09-08T07:23:23Z
Hiyuune
50834
2561597
Scribunto
text/plain
local export = {}
local affix_module = "Module:affix"
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local fun_is_callable_module = "Module:fun/isCallable"
local headword_module = "Module:headword"
local headword_data_module = "Module:headword/data"
local languages_module = "Module:languages"
local links_module = "Module:links"
local parameters_module = "Module:parameters"
local parse_interface_module = "Module:parse interface"
local parse_utilities_module = "Module:parse utilities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local yesno_module = "Module:yesno"
local dump = mw.dumpObject
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local insert = table.insert
local concat = table.concat
local remove = table.remove
local sort = table.sort
local function deepEquals(...)
deepEquals = require(table_module).deepEquals
return deepEquals(...)
end
local function escape_wikicode(...)
escape_wikicode = require(parse_utilities_module).escape_wikicode
return escape_wikicode(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function is_callable(...)
is_callable = require(fun_is_callable_module)
return is_callable(...)
end
local function parse_inline_modifiers(...)
parse_inline_modifiers = require(parse_utilities_module).parse_inline_modifiers
return parse_inline_modifiers(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function replacement_escape(...)
replacement_escape = require(string_replacement_escape_module)
return replacement_escape(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function term_contains_top_level_html(...)
term_contains_top_level_html = require(parse_utilities_module).term_contains_top_level_html
return term_contains_top_level_html(...)
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 function split_on_comma(val)
if val:find(",") then
return require(parse_interface_module).split_on_comma(val)
else
return {val}
end
end
local function ine(val)
if val == "" then return nil else return val end
end
local param_mods = {
id = {}, -- disabled when `is_head = true`
q = {type = "qualifier"},
qq = {type = "qualifier"},
l = {type = "labels"},
ll = {type = "labels"},
-- [[Module:headword]] expects part references in `.refs`.
ref = {item_dest = "refs", type = "references", store = "insert-flattened"},
}
local optional_param_mods = {
g = {item_dest = "genders", type = "genders"},
alt = {},
lang = {type = "language"},
sc = {type = "script"},
t = {item_dest = "gloss"},
gloss = {},
pos = {},
lit = {},
tr = {},
ts = {},
face = {},
nolinkinfl = {type = "boolean"},
}
local optional_headword_param_mods = {
sc = {type = "script"},
tr = {},
ts = {},
}
--[==[
Parse a single inflection or headword form or list of such forms. In either case, inline modifiers may be attached.
`data` is an object with the following fields:
* `val`: The raw value to parse. Required.
* `paramname`: The name of the parameter from which the value was taken; used in error messages. Required.
* `is_head`: We are parsing a headword parameter (a value which goes into the `heads` field of `data`). This changes
the allowed modifiers, disabling the `id` modifier and only allowing a subset of optional modifiers.
* `frob`: An optional function of one value to apply to the form after inline modifiers have been removed (i.e. to
apply to the `.term` field of the returned object).
* `include_mods`: List of extra inline modifiers to include, besides the default ones (see below). Each list item is
either a string specifying a recognized extra inline modifier (see `optional_param_mods` in the code), or a two-item
list of modifier name and modifier spec, where the spec should follow the syntax for modifier specs in
`parse_inline_modifiers` in [[Module:parse utilities]].
* `exclude_mods`: List of default inline modifiers to not include.
* `splitchar`: If specified, the value in `val` can be a list of forms to parse, separated by the value of `splitchar`
(which is a Lua pattern, as in `parse_inline_modifiers` in [[Module:parse utilities]]). Most commonly, `splitchar` is
a single comma and the values are comma-separated (in this case, splitting will not happen if a space follows the
comma).
* `parse_lang_prefix`: If specified, allow a language prefix to precede a form, and if found, store into the `.lang`
field of the returned object.
* `preserve_splitchar`, `delimiter_key`, `escape_fun`, `unescape_fun`, `pre_normalize_modifiers`: As in
`parse_inline_modifiers` in [[Module:parse utilities]].
Returns an object suitable for storing as one element of one of the lists in `headdata.inflections`, where `headdata`
is the structure passed to [[Module:headword]]. If `splitchar` is specified, howeve, the return value is a list of such
objects.
The following default inline modifiers are currently recognized:
* `q`: Left qualifier.
* `qq`: Right qualifier.
* `l`: Comma-separated list of left labels. No space should follow the comma.
* `ll`: Comma-separated list of right labels. No space should follow the comma.
* `ref`: Reference or references. See {{tl|IPA}} for the syntax.
* `id`: Sense ID, in case there are multiple senses. See {{tl|l}}.
The following are the recognized additional inline modifiers:
* `g`: Comma-separated list of genders.
* `alt`: Display text.
* `lang`: Language code of language of the form, if different from the language of the headword.
* `sc`: Script code of script of the form. Almost never needed.
* `t`: Gloss for the form.
* `gloss`: Gloss for the form (alias for `t`).
* `pos`: Part of speech of the form.
* `lit`: Literal meaning of the form.
* `tr`: Manual transliteration of the form.
* `ts`: Transcription of the form, for languages where the transliteration differs markedly from the pronunciation.
* `face`: Face to display the form in, e.g. {"hypothetical"} for a hypothetical form (unlinkable and displayed in italics).
* `nolinkinfl`: Make the form unlinkable.
]==]
function export.parse_term_with_modifiers(data)
local paramname, val, frob = data.paramname, data.val, data.frob
local function generate_obj(term, parse_err)
if frob then
term = frob(term, parse_err)
end
if data.parse_lang_prefix and term:find(":") then
return require(parse_utilities_module).generate_obj_maybe_parsing_lang_prefix {
term = term,
paramname = paramname,
parse_lang_prefix = true,
parse_err = parse_err,
}
else
return {term = term}
end
end
-- Check for inline modifier, e.g. מרים<tr:Miryem>. But exclude top-level HTML entry with <span ...>,
-- <sup> or similar in it.
if (val:find("<", nil, true) or data.splitchar) and not term_contains_top_level_html(val) and
-- don't parse inline modifiers if is_head and the value begins with a ~ (link modifier syntax)
(not data.is_head or not val:find("^~")) then
local param_mods = param_mods
if data.is_head then
param_mods = shallow_copy(param_mods)
param_mods.id = nil
end
if data.include_mods or data.exclude_mods then
if not data.is_head then
-- already copied when data.is_head
param_mods = shallow_copy(param_mods)
end
if data.include_mods then
local optional_mods = data.is_head and optional_headword_param_mods or optional_param_mods
for _, mod in ipairs(data.include_mods) do
if type(mod) == "table" then
if #mod ~= 2 then
error(("Internal error: Modifier spec %s in `include_mods` should be of length 2"):format(
dump(mod)))
end
local modkey, modvalue = unpack(mod)
param_mods[modkey] = modvalue
elseif not optional_mods[mod] then
error(("Internal error: Unrecognized modifier spec %s in `include_mods`"):format(
dump(mod)))
else
param_mods[mod] = optional_mods[mod]
end
end
end
if data.exclude_mods then
for _, mod in ipairs(data.exclude_mods) do
if not param_mods[mod] then
error(("Internal error: Modifier spec %s in `exclude_mods` not found among existing modifiers"
):format(dump(mod)))
else
param_mods[mod] = nil
end
end
end
end
return parse_inline_modifiers(val, {
paramname = paramname,
param_mods = param_mods,
generate_obj = generate_obj,
splitchar = data.splitchar,
preserve_splitchar = data.preserve_splitchar,
delimiter_key = data.delimiter_key,
escape_fun = data.escape_fun,
unescape_fun = data.unescape_fun,
pre_normalize_modifiers = data.pre_normalize_modifiers,
})
else
local retval = generate_obj(val)
if data.splitchar then
retval = {retval}
end
return retval
end
end
--[==[
Parse a list of inflection forms that may have inline modifiers attached. `data` is an object with the following fields:
* `forms`: The list of raw values to parse. Required.
* `paramname`: The name of the first parameter from which the value was taken; used in error messages. If this is a
two-element list, the first element is the first parameter and the second element is the prefix of the remaining
parameters. Parameter names that are numbers are handled correctly, as are those with \1 in it marking where the
parameter index goes. Required.
* `qualifiers`: If specified, a possibly gappy list of left qualifiers to add to the parsed terms (for compatibility
purposes).
* `splitchar`: As in `parse_term_with_modifiers()`. The resulting per-term lists will be flattened.
* `frob`, `include_mods`, `exclude_mods`, `is_head`, `preserve_splitchar`, `parse_lang_prefix`, `delimiter_key`,
`escape_fun`, `unescape_fun`, `pre_normalize_modifiers`: As in `parse_term_with_modifiers()`.
Returns a list of objects, suitable for storing as one of the lists in `headdata.inflections` (once a label is added),
where `headdata` is the structure passed to [[Module:headword]].
]==]
function export.parse_term_list_with_modifiers(data)
local paramname, forms = data.paramname, data.forms
local qualifiers = data.qualifiers
local first, restpref
if type(paramname) == "table" then
first = paramname[1]
restpref = paramname[2]
else
first = paramname
restpref = paramname
end
local terms = {}
data = shallow_copy(data)
for i, val in ipairs(forms) do
data.paramname = i == 1 and first or type(restpref) == "number" and restpref + i - 1 or
restpref:find("\1", nil, true) and restpref:gsub("\1", tostring(i)) or restpref .. i
data.val = val
local parsed = export.parse_term_with_modifiers(data)
if qualifiers and qualifiers[i] then
if data.splitchar then
for _, term in ipairs(parsed) do
term.q = {qualifiers[i]}
end
else
parsed.q = {qualifiers[i]}
end
end
if data.splitchar then
extend(terms, parsed)
else
terms[i] = parsed
end
end
return terms
end
--[==[
Construct a link to [[Appendix:Glossary]] for `entry`. If `text` is specified, it is the display text; otherwise,
`entry` is used.
]==]
function export.glossary_link(entry, text)
text = text or entry
return "[[Phụ lục:Từ điển thuật ngữ#" .. entry .. "|" .. text .. "]]"
end
function export.replace_glossary_links_in_label(label)
if label:find("<<", nil, true) then
label = label:gsub("<<(.-)|(.-)>>", export.glossary_link):gsub("<<(.-)>>", export.glossary_link)
end
return label
end
function export.insert_fixed_inflection(data)
local headdata, origterm, label = data.headdata, data.originating_term, data.label
local inflobj = data.inflobj or headdata
inflobj.inflections = inflobj.inflections or {}
if not origterm then
insert(inflobj.inflections, {
label = export.replace_glossary_links_in_label(label)
})
else
if origterm.id then
error(("It doesn't make sense to pass in an ID '%s' for label '%s' in conjunction with a term value '%s'"
):format(origterm.id, label, origterm.term))
end
-- Preserve qualifiers, labels, references
origterm.term = nil
origterm.label = export.replace_glossary_links_in_label(label)
insert(inflobj.inflections, origterm)
end
end
--[==[
Insert previously-parsed terms into an `inflections` field. The `inflections` field will be initialized if needed.
`data` is an object with the following fields:
* `headdata`: The headword structure passed to [[Module:headword]]. Required.
* `inflobj`: The object whose `inflections` field the terms are inserted into. Defaults to `headdata`. Only needs
to be set for nested inflections, which are specified for an inflection object rather than the headword data
structure as a whole.
* `terms`: The list of parsed terms. If {nil} or omitted, nothing happens unless `request` is set.
* `label`: The label that the inflections are given; any parts of the label surrounded in `<<...>>` are linked to the
glossary. (If the contents of `<<...>>` contain a `|` in them, they are a two-part link.) Required.
* `no_label`: If the term is {"-"} and there are no other terms, insert a fixed label with this value. Defaults to
{"no "} plus the label.
* `usually_no_label`: If the term is {"-"} and there are other terms, insert a fixed label with this value. Defaults to
{"usually no "} plus the label.
* `accel`: If specified, a full accelerator object to add to the inflections.
* `request`: If specified and no terms are given, insert a label with a request for inflections to be given.
* `enable_auto_translit`: If specified and terms are given, display automatic transliteration of the terms.
The return value indicates whether the inflection exists and how many terms are in it. It is an object with the
following fields:
* `exists`: {"yes"} if one or more terms were specified; {"no"} if the value was given as {"-"}; {"usually no"} if
the first value was given as {"-"} but additional terms were supplied; otherwise {nil}, indicating that the status
is unspecified.
* `numterms`: Number of terms in the inflection. Will be 0 unless `exists` has the value {"yes"} or {"usually no"}.
* `request`: True if no terms were specified but a term request was inserted into the inflection (because
`data.request` was specified). Otherwise {nil}.
]==]
function export.insert_inflection(data)
local headdata, terms, label = data.headdata, data.terms, data.label
local inflobj = data.inflobj or headdata
local retval = {}
local accel = data.accel
if data.accel_form then
if accel then
error("Internal error: can't specify both data.accel and data.accel_form")
end
if headdata.heads then
local lemmas = {}
local lemma_translits = {}
for i, headobj in ipairs(headdata.heads) do
lemmas[i] = headobj.term
if lemmas[i] == "+" then
error("Internal error: If you use data.accel_form, you should have resolved all occurrences of + in heads appropriately")
end
lemma_translits[i] = headobj.tr
end
accel = {
lemma = lemmas,
lemma_translit = lemma_translits,
form = data.accel_form,
}
else
accel = {
form = data.accel_form,
}
end
end
local function insert_cats(cats)
for _, cat in ipairs(cats) do
insert(headdata.categories, cat)
end
end
if terms and terms[1] then
if terms[1].term == "-" then
if terms[2] then
export.insert_fixed_inflection {
headdata = headdata,
inflobj = inflobj,
originating_term = terms[1],
label = data.usually_no_label or "thường không " .. label,
}
remove(terms, 1)
retval.numterms = #terms
retval.exists = "thường không"
if data.usually_no_cats then
insert_cats(data.usually_no_cats)
else
if data.no_cats then
insert_cats(data.no_cats)
end
if data.yes_cats then
insert_cats(data.yes_cats)
end
end
else
export.insert_fixed_inflection {
headdata = headdata,
inflobj = inflobj,
originating_term = terms[1],
label = data.no_label or "không " .. label,
}
retval.numterms = 0
retval.exists = "không"
if data.no_cats then
insert_cats(data.no_cats)
end
return retval
end
else
retval.numterms = #terms
retval.exists = "yes"
if data.yes_cats then
insert_cats(data.yes_cats)
end
end
if data.check_missing then
error("Internal error: check_missing support removed; use checkredlinks=true in [[Module:headword]]")
end
terms.label = export.replace_glossary_links_in_label(label)
if accel then
terms.accel = accel
end
terms.enable_auto_translit = data.enable_auto_translit
inflobj.inflections = inflobj.inflections or {}
insert(inflobj.inflections, terms)
elseif data.request then
inflobj.inflections = inflobj.inflections or {}
insert(inflobj.inflections, {
label = export.replace_glossary_links_in_label(label),
request = true,
})
retval.numterms = 0
-- retval.exists = nil
retval.request = true
else
retval.numterms = 0
-- retval.exists = nil
end
return retval
end
--[==[
Parse raw arguments from `forms` for inline modifiers, and insert the resulting terms (which should not require
significant additional processing) into `headdata.inflections`. `data` is an object with the following fields:
* `forms`: The list of raw values to parse. If {nil} or omitted, nothing happens.
* `headdata`: The headword structure passed to [[Module:headword]]. Required.
* `paramname`: As in `parse_term_list_with_modifiers()`. Required.
* `label`: As in `insert_inflection()`. Required.
* `qualifiers`, `frob`, `include_mods`, `exclude_mods`, `is_head`, `splitchar`, `preserve_splitchar`, `delimiter_key`,
`escape_fun`, `unescape_fun`, `pre_normalize_modifiers`: As in `parse_term_list_with_modifiers()`.
* `accel`: As in `insert_inflection()`.
Return value is as in `insert_inflection()`.
]==]
function export.parse_and_insert_inflection(data)
local forms = data.forms
if forms and forms[1] then
data = shallow_copy(data)
data.forms = forms
data.terms = export.parse_term_list_with_modifiers(data)
return export.insert_inflection(data)
end
return {
numterms = 0
}
end
--[==[
Canonicalize a single term or term object or a list of either into a list of term objects.
]==]
function export.canonicalize_termobj_list(abterms)
if type(abterms) == "string" then
return {{term = abterms}}
elseif abterms.term then
return {abterms}
else
-- Check if already in full list term and return directly if so.
local must_convert = false
for _, term in ipairs(abterms) do
if type(term) == "string" then
must_convert = true
break
end
end
if not must_convert then
return abterms
end
end
local retval = {}
for _, term in ipairs(abterms) do
if type(term) == "string" then
insert(retval, {term = term})
else
insert(retval, term)
end
end
return retval
end
--[==[
Combine two sets of qualifiers or labels. If either is {nil}, just return the other, and if both are {nil}, return
{nil}.
]==]
function export.combine_qualifiers_or_labels(quals1, quals2)
if not quals1 and not quals2 then
return nil
end
if not quals1 then
return quals2
end
if not quals2 then
return quals1
end
local combined = shallow_copy(quals1)
for _, note in ipairs(quals2) do
insert_if_not(combined, note)
end
return combined
end
--[==[
Combine the qualifiers, labels, references and ID's of two term objects. `destobj` is the "destination term object" into
which the combined properties are written, and `srcobj` is the "source object" into which the properties are merged.
`destobj` is side-effected (but the lists inside of `destobj` are not); if this is undesirable, make sure to
shallow-copy `destobj` first. If both objects have values for a given qualifier, label or reference, the values of
`destobj` come first. If both objects have a value for `id`, the values must match or an error is thrown; otherwise,
the resulting value of `id` comes from whichever one is defined.
'''NOTE:''' This may not be the correct behavior when deduplicating a list of term objects. See
`insert_termobj_combining_duplicates` for a different approach.
]==]
function export.combine_termobj_qualifiers_labels(destobj, srcobj)
destobj.q = export.combine_qualifiers_or_labels(destobj.q, srcobj.q)
destobj.qq = export.combine_qualifiers_or_labels(destobj.qq, srcobj.qq)
destobj.l = export.combine_qualifiers_or_labels(destobj.l, srcobj.l)
destobj.ll = export.combine_qualifiers_or_labels(destobj.ll, srcobj.ll)
destobj.refs = export.combine_qualifiers_or_labels(destobj.refs, srcobj.refs)
if destobj.id and srcobj.id and destobj.id ~= srcobj.id then
-- FIXME: We probably want to pass in an error function
error(("Can't specify two different ID's %s and %s when combining objects"):format(srcobj.id, destobj.id))
end
destobj.id = destobj.id or srcobj.id
return destobj
end
function export.termobj_has_qualifiers_or_labels(obj)
return obj.q and obj.q[1] or obj.qq and obj.qq[1] or obj.l and obj.l[1] or obj.ll and obj.ll[1] or
obj.refs and obj.refs[1]
end
local function one_ancillary_property_equal(prop1, prop2)
local prop1_is_nil = not prop1 or not prop1[1]
local prop2_is_nil = not prop2 or not prop2[1]
if prop1_is_nil and prop2_is_nil then
return true
end
if prop1_is_nil or prop2_is_nil then
return false
end
return deepEquals(prop1, prop2)
end
function export.termobj_ancillary_properties_equal(obj1, obj2)
return one_ancillary_property_equal(obj1.q, obj2.q) and
one_ancillary_property_equal(obj1.qq, obj2.qq) and
one_ancillary_property_equal(obj1.l, obj2.l) and
one_ancillary_property_equal(obj1.ll, obj2.ll) and
one_ancillary_property_equal(obj1.refs, obj2.refs) and
obj1.id == obj2.id
end
function export.convert_termobj_to_formobj(termobj)
local formobj = {
form = termobj.term,
translit = termobj.tr,
}
local footnotes
local function mods_to_footnote(mod_prefix, mod_vals)
if mod_vals and mod_vals[1] then
footnotes = footnotes or {}
for _, val in ipairs(mod_vals) do
insert(footnotes, "[" .. mod_prefix .. ":" .. val .. "]")
end
end
end
mods_to_footnote("q", termobj.q)
mods_to_footnote("qq", termobj.qq)
mods_to_footnote("l", termobj.l)
mods_to_footnote("ll", termobj.ll)
mods_to_footnote("ref", termobj.refs)
mods_to_footnote("id", termobj.id and {termobj.id} or nil)
formobj.footnotes = footnotes
return formobj
end
local recognized_multi_mods = {
q = "q",
qq = "qq",
l = "l",
ll = "ll",
ref = "refs",
}
local recognized_single_mods = {
id = "id",
}
function export.add_footnote_to_termobj(termobj, footnote)
local stripped_footnote = footnote:match("^%[(.*)%]$")
if not stripped_footnote then
error("Internal error: Footnote should be surrounded by brackets at this stage: " .. footnote)
end
local prefix, rest = stripped_footnote:match("^([a-z]+):(.+)$")
local field, is_multi
if prefix then
if recognized_multi_mods[prefix] then
field = recognized_multi_mods[prefix]
is_multi = true
elseif recognized_single_mods[prefix] then
field = recognized_single_mods[prefix]
is_multi = false
end
end
if not field then
rest = stripped_footnote
field = "l"
is_multi = true
end
if is_multi then
if not termobj[field] then
termobj[field] = {}
end
insert(termobj[field], rest)
else
if termobj[field] and termobj[field] ~= rest then
error(("Can't set two values for '%s': '%s' and '%s'"):format(field, termobj[field], rest))
end
termobj[field] = rest
end
end
function export.convert_formobj_to_termobj(formobj)
local termobj = {
term = formobj.form,
tr = formobj.translit,
}
if formobj.footnotes then
for _, footnote in ipairs(formobj.footnotes) do
export.add_footnote_to_termobj(termobj, footnote)
end
end
return termobj
end
local function extract_termobj_field_modifiers(fieldval)
return fieldval:match("^([*+]?)(.*)$")
end
function export.remove_termobj_field_modifiers(termobj)
local function remove_field_modifiers(field)
if termobj[field] and termobj[field][1] then
local any_field_modifiers = false
for _, val in ipairs(termobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if field_mods ~= "" then
any_field_modifiers = true
break
end
end
local new_field = {}
if any_field_modifiers then
for _, val in ipairs(termobj[field]) do
local _, field_without_mods = extract_termobj_field_modifiers(val)
insert_if_not(new_field, field_without_mods)
end
termobj[field] = new_field
end
end
end
remove_field_modifiers("q")
remove_field_modifiers("qq")
remove_field_modifiers("l")
remove_field_modifiers("ll")
remove_field_modifiers("refs")
end
function export.insert_termobj_combining_duplicates(destobjs, termobj)
for _, destobj in ipairs(destobjs) do
if destobj.term == termobj.term and destobj.tr == termobj.tr then
-- Form already present; maybe combine footnotes.
local function combine_field_values(field)
if termobj[field] and termobj[field][1] then
-- Check to see if there are existing values with *; if so, remove them.
if destobj[field] and destobj[field][1] then
local any_values_with_asterisk = false
for _, val in ipairs(destobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if field_mods:find("%*") then
any_values_with_asterisk = true
break
end
end
if any_values_with_asterisk then
local filtered_values = {}
for _, val in ipairs(destobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if not field_mods:find("%*") then
insert(filtered_values, val)
end
end
if filtered_values[1] then
destobj[field] = filtered_values
else
destobj[field] = nil
end
end
end
local any_footnotes_with_plus = false
for _, val in ipairs(termobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if field_mods:find("%+") then
any_footnotes_with_plus = true
break
end
end
if any_footnotes_with_plus then
if not destobj[field] then
destobj[field] = {}
else
destobj[field] = shallow_copy(destobj[field])
end
for _, val in ipairs(termobj[field]) do
local already_seen = false
local field_mods, field_without_mods = extract_termobj_field_modifiers(val)
if field_mods:find("%+") then
for _, existing_val in ipairs(destobj[field]) do
local _, existing_field_without_mods =
extract_termobj_field_modifiers(existing_val)
if existing_field_without_mods == field_without_mods then
already_seen = true
break
end
end
if not already_seen then
insert(destobj[field], val)
end
end
end
end
end
end
combine_field_values("q")
combine_field_values("qq")
combine_field_values("l")
combine_field_values("ll")
combine_field_values("refs")
if destobj.id and termobj.id and destobj.id ~= termobj.id then
-- FIXME: We probably want to pass in an error function
error(("Can't specify two different ID's %s and %s when combining objects"):format(termobj.id, destobj.id))
end
destobj.id = destobj.id or termobj.id
return
end
end
insert(destobjs, termobj)
end
export.allowed_special_indicators = {
["first"] = true,
["first-second"] = true,
["first-last"] = true,
["second"] = true,
["last"] = true,
["each"] = true,
["+"] = true, -- requests the default behavior with preposition handling
}
--[==[
Check for special indicators (values such as {"+first"} or {"+first-last"} that are used in a `pl`, `f`, etc. argument
and indicate how to inflect a multiword term). If `form` is such an indicator, the return value is `form` minus
the initial `+` sign; otherwise, if form begins with a `+` sign, an error is thrown; otherwise the return value is nil.
]==]
function export.get_special_indicator(form, noerror)
if form:find("^%+") then
form = form:gsub("^%+", "")
if not export.allowed_special_indicators[form] then
if noerror then
return nil
end
local indicators = {}
for indic, _ in pairs(export.allowed_special_indicators) do
insert(indicators, "+" .. indic)
end
sort(indicators)
error("Special inflection indicator beginning with '+' can only be " ..
mw.text.listToText(indicators) .. ": +" .. form)
end
return form
end
return nil
end
local function add_endings(bases, endings)
local retval = {}
if type(bases) ~= "table" then
bases = {bases}
end
if type(endings) ~= "table" then
endings = {endings}
end
for _, base in ipairs(bases) do
for _, ending in ipairs(endings) do
insert(retval, base .. ending)
end
end
return retval
end
--[==[
Inflect a possibly multiword or hyphenated term `form` using the function `inflect`, which is a function of one argument
that is called on a single word to inflect and should return either the inflected word or a list of inflected words.
`special` indicates how to inflect the multiword term and should be e.g. {"first"} to inflect only the first word,
{"first-last"} to inflect the first and last words, {"each"} to inflect each word, etc. See `allowed_special_indicators`
above for the possibilities. If `special` is `+`, or is omitted and the term is multiword (i.e. containing a space
character), and `prepositions` is supplied, the function checks for multiword or hyphenated terms containing the
prepositions in `prepositions`, e.g. Italian [[senso di marcia]] or [[medaglia d'oro]] or Portuguese
[[tartaruga-do-mar]]. If such a term is found, only the first word is inflected. Otherwise, the default is
{"first-last"}. `prepositions` is a list of Lua patterns matching prepositions. The patterns will automatically have the
separator character (space or hyphen) added to the left side but not the right side, so they should contain a space
character (which will automatically be converted to the appropriate separator) on the right side unless the preposition
is joined on the right side with an apostrophe. Examples of preposition patterns for Italian are {"di "}, {"sull'"} and
{"d?all[oae] "} (which matches {"dallo "}, {"dalle "}, {"alla "}, etc.).
The return value is always either a list of inflected multiword or hyphenated terms, or nil if `special` is omitted
and `form` is not multiword. (If `special` is specified and `form` is not multiword or hyphenated, an error results.)
]==]
function export.handle_multiword(form, special, inflect, prepositions, sep)
sep = sep or form:find(" ") and " " or "%-"
local raw_sep = sep == " " and " " or "-"
-- Used to add regex version of separator in the replacement portion of ugsub() or :gsub()
local sep_replacement = sep == " " and " " or "%%-"
-- Given a Lua pattern, replace space with the appropriate separator.
local function hack_re(re)
if sep == " " then
return re
end
return (re:gsub(" ", sep_replacement))
end
if special == "first" then
local first, rest = form:match(hack_re("^(.-)( .*)$"))
if not first then
error("Special indicator 'first' can only be used with a multiword term: " .. form)
end
return add_endings(inflect(first), rest)
elseif special == "second" then
local first, second, rest = form:match(hack_re("^([^ ]+ )([^ ]+)( .*)$"))
if not first then
error("Special indicator 'second' can only be used with a term with three or more words: " .. form)
end
return add_endings(add_endings({first}, inflect(second)), rest)
elseif special == "first-second" then
local first, space, second, rest = form:match(hack_re("^([^ ]+)( )([^ ]+)( .*)$"))
if not first then
error("Special indicator 'first-second' can only be used with a term with three or more words: " .. form)
end
return add_endings(add_endings(add_endings(inflect(first), space), inflect(second)), rest)
elseif special == "each" then
local terms = split(form, sep)
if #terms < 2 then
error("Special indicator 'each' can only be used with a multiword term: " .. form)
end
for i, term in ipairs(terms) do
terms[i] = inflect(term)
if i > 1 then
terms[i] = add_endings(raw_sep, terms[i])
end
end
local result = ""
for _, term in ipairs(terms) do
result = add_endings(result, term)
end
return result
elseif special == "first-last" then
local first, middle, last = form:match(hack_re("^(.-)( .* )(.-)$"))
if not first then
first, middle, last = form:match(hack_re("^(.-)( )(.*)$"))
end
if not first then
error("Special indicator 'first-last' can only be used with a multiword term: " .. form)
end
return add_endings(add_endings(inflect(first), middle), inflect(last))
elseif special == "last" then
local rest, last = form:match(hack_re("^(.* )(.-)$"))
if not rest then
error("Special indicator 'last' can only be used with a multiword term: " .. form)
end
return add_endings(rest, inflect(last))
elseif special and special ~= "+" then
error("Unrecognized special=" .. special)
end
-- Only do default behavior if special indicator '+' explicitly given or separator is space; otherwise we will
-- break existing behavior with hyphenated words.
if (special == "+" or sep == " ") and form:find(sep) then
if prepositions then
-- check for prepositions in the middle of the word; do it this way so we can handle
-- more than one word before the preposition (and usually inflect each word)
for _, prep in ipairs(prepositions) do
local first, space_prep_rest = umatch(form, hack_re("^(.-)( " .. prep .. ".*)$"))
if first then
return add_endings(inflect(first), space_prep_rest)
end
end
end
-- multiword or hyphenated expressions default to first-last; we need to pass in the separator to avoid
-- problems with multiword terms containing hyphens in the individual words
return export.handle_multiword(form, "first-last", inflect, prepositions, sep)
end
return nil
end
local function link_hyphen_split_component(word, data)
if data.link_hyphen_split_component then
return data.link_hyphen_split_component(word)
else
return "[[" .. word .. "]]"
end
end
-- Default function to split a word on apostrophes. Don't split apostrophes at the beginning or end of a word (e.g.
-- [['ndrangheta]] or [[po']]). Handle multiple apostrophes correctly, e.g. [[l'altr'ieri]] -> [[l']][altr']][[ieri]].
function export.default_split_apostrophe(word, data)
local apostrophe_parts = split(word, "'", true, true)
local linked_apostrophe_parts = {}
local apostrophes_at_beginning = ""
local i = 1
-- Apostrophes at beginning get attached to the first word after (which will always exist but may
-- be blank if the word consists only of apostrophes).
while i < #apostrophe_parts do -- <, not <=, in case the word consists only of apostrophes
local apostrophe_part = apostrophe_parts[i]
i = i + 1
if apostrophe_part == "" then
apostrophes_at_beginning = apostrophes_at_beginning .. "'"
else
break
end
end
apostrophe_parts[i] = apostrophes_at_beginning .. apostrophe_parts[i]
-- Now, do the remaining parts. A blank part indicates more than one apostrophe in a row; we join
-- all of them to the preceding word.
while i <= #apostrophe_parts do
local apostrophe_part = apostrophe_parts[i]
if apostrophe_part == "" then
linked_apostrophe_parts[#linked_apostrophe_parts] =
linked_apostrophe_parts[#linked_apostrophe_parts] .. "'"
elseif i == #apostrophe_parts then
insert(linked_apostrophe_parts, apostrophe_part)
else
insert(linked_apostrophe_parts, apostrophe_part .. "'")
end
i = i + 1
end
for j, tolink in ipairs(linked_apostrophe_parts) do
linked_apostrophe_parts[j] = link_hyphen_split_component(tolink, data)
end
return concat(linked_apostrophe_parts)
end
--[=[
Auto-add links to a word that should not have spaces but may have hyphens and/or apostrophes. We split off final
punctuation, then split on hyphens if `data.split_hyphen` is given, and also split on apostrophes if
`data.split_apostrophe` is given. We only split on hyphens if they are in the middle of the word, not at the beginning
or end (hyphens at the beginning or end indicate suffixes or prefixes, respectively). `include_hyphen_prefixes`, if
given, is a set of prefixes (not including the final hyphen) where we should include the final hyphen in the prefix.
Hence, e.g. if "anti" is in the set, a Portuguese word like [[anti-herói]] "anti-hero" will be split [[anti-]][[herói]]
(whereas a word like [[código-fonte]] "source code" will be split as [[código]]-[[fonte]]).
If `data.split_apostrophe` is specified, we split on apostrophes unless `data.no_split_apostrophe_words` is given and
the word is in the specified set, such as French [[c'est]] and [[quelqu'un]]. If `data.split_apostrophe` is true, the
default algorithm applies, which splits on all apostrophes except those at the beginning and end of a word (as in
Italian [['ndrangheta]] or [[po']]), and includes the apostrophe in the link to its left (so we auto-split French
[[l'eau]] as [[l']][[eau]] and [[l'altr'ieri]] as [[l']][altr']][[ieri]]). If `data.split_apostrophe` is specified
but not `true`, it should be a function of one argument that does custom apostrophe-splitting. The argument is the word
to split, and the return value should be the split and linked word.
]=]
local function add_single_word_links(space_word, data, term_has_spaces)
local space_word_no_punct, punct
local punct_pattern = data.punctuation
if punct_pattern and is_callable(punct_pattern) then
space_word_no_punct, punct = punct_pattern(space_word)
else
if punct_pattern == nil then
punct_pattern = "[,;:?!]"
end
space_word_no_punct, punct = umatch(space_word, "^(.*)(" .. punct_pattern .. ")$")
end
space_word_no_punct = space_word_no_punct or space_word
punct = punct or ""
local words
if space_word_no_punct:sub(1, 1) == "-" or space_word_no_punct:sub(-1) == "-" then
-- don't split prefixes and suffixes
words = {space_word_no_punct}
else
local splitter
if term_has_spaces then
splitter = data.split_hyphen_when_space
else
splitter = data.split_hyphen_when_no_space
end
if is_callable(splitter) then
words = splitter(space_word_no_punct)
if type(words) == "string" then
return words .. punct
end
end
end
if not words then
local split_hyphen
if term_has_spaces then
split_hyphen = data.split_hyphen_when_space
else
split_hyphen = data.split_hyphen_when_no_space
if split_hyphen == nil then -- default to true; use `false` to avoid this
split_hyphen = true
end
end
if split_hyphen then
words = split(space_word_no_punct, "-", true, true)
else
words = {space_word_no_punct}
end
end
local linked_words = {}
for j, word in ipairs(words) do
if j < #words and data.include_hyphen_prefixes and data.include_hyphen_prefixes[word] then
word = "[[" .. word .. "-]]"
elseif j > 1 and data.include_hyphen_suffixes and data.include_hyphen_suffixes[word] then
word = "[[-" .. word .. "]]"
else
-- Don't split on apostrophes if the word is in `no_split_apostrophe_words`.
if (not data.no_split_apostrophe_words or not data.no_split_apostrophe_words[word]) and
data.split_apostrophe and word:find("'", nil, true) then
if data.split_apostrophe == true then
word = export.default_split_apostrophe(word, data)
else -- custom apostrophe splitter/linker
word = data.split_apostrophe(word)
end
elseif word ~= "" then -- avoid -[[]]- (e.g. f--k)
word = link_hyphen_split_component(word, data)
end
if j < #words then
word = word .. "-"
end
end
insert(linked_words, word)
end
return concat(linked_words) .. punct
end
--[=[
Auto-add links to a multiword term. `data` contains fields customizing how to do this. By default we proceed as follows:
(1) If the term already has embedded links in it, they are left unchanged.
(2) Otherwise, if there are spaces present, we split on spaces and link each word separately.
(3) If a given space-separated component ends in punctuation (defaulting to [,;:?!]), it is separated off, the remainder
of the algorithm run, and the punctuation pasted back on.
(4) If there are hyphens in a given space-separated component, we may link each hyphenated term separately depending
on the settings in `data`. Normally the hyphens are not included in the linked terms, but this can be overridden
for specific prefixes and/or suffixes. By default, if there are spaces in the multiword term, we do not link
hyphenated components (because of cases like "boire du petit-lait" where "petit-lait" should be linked as a whole),
but do so otherwise (e.g. for "avant-avant-hier"); this can overridden for cases like "croyez-le ou non".
Cases where only some of the hyphens should be split can always be handled by explicitly specifying the head (e.g.
"Nord-Pas-de-Calais" given as head=[[Nord]]-[[Pas-de-Calais]]).
(5) If there are apostrophes in a given component, we may link each apostrophe-separated term separately depending
on the settings in `data`, including the apostrophe in the link to its left (so we split "de l'eau" as
"[[de]] [[l']][[eau]]").
The settings in `data` are as follows:
`split_hyphen_when_no_space`: Whether to split on hyphens when the term has no spaces. Defaults to true if set to `nil`.
This can be a function of one argument, to implement a custom splitting algorithm for hyphen-separated terms. If
this returns [FIXME: FINISH ME ...]
If `data.split_apostrophe` is specified, we split on apostrophes unless `data.no_split_apostrophe_words` is given and
the word is in the specified set, such as French [[c'est]] and [[quelqu'un]]. If `data.split_apostrophe` is true, the
default algorithm applies, which splits on all apostrophes except those at the beginning and end of a word (as in
Italian [['ndrangheta]] or [[po']]), and includes the apostrophe in the link to its left (so we auto-split French
[[l'eau]] as [[l']][[eau]] and [[l'altr'ieri]] as [[l']][altr']][[ieri]]). If `data.split_apostrophe` is specified
but not `true`, it should be a function of one argument that does custom apostrophe-splitting. The argument is the word
to split, and the return value should be the split and linked word.
We don't always split on hyphens because of cases like "boire du petit-lait" where "petit-lait" should be linked as a
whole, but provide the option to do it for cases like "croyez-le ou non". If there's no space, however, then it makes
sense to split on hyphens by `no_split_apostrophe_words` and `include_hyphen_prefixes` allow for special-case handling
of particular words and are as described in the comment above add_single_word_links().
]=]
function export.add_links_to_multiword_term(term, data)
if term:match("[%[%]]") then
return term
end
local words = split(term, " ", true, true)
local term_has_spaces = #words > 1
local linked_words = {}
for _, word in ipairs(words) do
insert(linked_words, add_single_word_links(word, data, term_has_spaces))
end
local retval = concat(linked_words, " ")
-- If we ended up with a single link consisting of the entire term,
-- remove the link.
return retval:match("^%[%[([^%[%]]*)%]%]$") or retval
end
local function canonicalize_begin_end_spec(spec)
local from, to = spec:match("^(.-):(.*)$")
if not from then
from = spec
to = ""
end
return from, to
end
--[==[
Given a `linked_term` that is the output of add_links_to_multiword_term(), apply modifications as given in
`modifier_spec` to change the link destination of subterms (normally single-word non-lemma forms; sometimes
collections of adjacent words). This is usually used to link non-lemma forms to their corresponding lemma, but can
also be used to replace a span of adjacent separately-linked words to a single multiword lemma. The format of
`modifier_spec` is one or more semicolon-separated subterm specs, where each such spec is of the form
SUBTERM:DEST, where SUBTERM is one or more words in the `linked_term` but without brackets in them, and DEST is the
corresponding link destination to link the subterm to. Any occurrence of ~ in DEST is replaced with SUBTERM.
Alternatively, a single modifier spec can be of the form BEGIN[FROM:TO], which is equivalent to writing
BEGINFROM:BEGINTO (see example below).
For example, given the source phrase [[il bue che dice cornuto all'asino]] "the pot calling the kettle black"
(literally "the ox that calls the donkey horned/cuckolded"), the result of calling add_links_to_multiword_term()
is [[il]] [[bue]] [[che]] [[dice]] [[cornuto]] [[all']][[asino]]. With a modifier_spec of 'dice:dire', the result
is [[il]] [[bue]] [[che]] [[dire|dice]] [[cornuto]] [[all']][[asino]]. Here, based on the modifier spec, the
non-lemma form [[dice]] is replaced with the two-part link [[dire|dice]].
Another example: given the source phrase [[chi semina vento raccoglie tempesta]] "sow the wind, reap the whirlwind"
(literally (he) who sows wind gathers [the] tempest"). The result of calling add_links_to_multiword_term() is
[[chi]] [[semina]] [[vento]] [[raccoglie]] [[tempesta]], and with a modifier_spec of 'semina:~re; raccoglie:~re',
the result is [[chi]] [[seminare|semina]] [[vento]] [[raccogliere|raccoglie]] [[tempesta]]. Here we use the ~
notation to stand for the non-lemma form in the destination link.
A more complex example is [[se non hai altri moccoli puoi andare a letto al buio]], which becomes
[[se]] [[non]] [[hai]] [[altri]] [[moccoli]] [[puoi]] [[andare]] [[a]] [[letto]] [[al]] [[buio]] after calling
add_links_to_multiword_term(). With the following modifier_spec:
'hai:avere; altr[i:o]; moccol[i:o]; puoi: potere; andare a letto:~; al buio:~', the result of applying the spec is
[[se]] [[non]] [[avere|hai]] [[altro|altri]] [[moccolo|moccoli]] [[potere|puoi]] [[andare a letto]] [[al buio]].
Here, we rely on the alternative notation mentioned above for e.g. 'altr[i:o]', which is equivalent to 'altri:altro',
and link multiword subterms using e.g. 'andare a letto:~'. (The code knows how to handle multiword subexpressions
properly, and if the link text and destination are the same, only a single-part link is formed.)
]==]
function export.apply_link_modifiers(linked_term, modifier_spec, lang)
local split_modspecs = split(modifier_spec, "%s*;%s*")
for j, modspec in ipairs(split_modspecs) do
local id
if modspec:find("<") then
local rest
rest, id = modspec:match("^(.*)<id:(.-)>$")
if rest then
modspec = rest
end
end
local subterm, dest, otherlang
local begin_spec, rest, end_spec = modspec:match("^%[(.-)%]([^:]*)%[(.-)%]$")
if begin_spec then
local begin_from, begin_to = canonicalize_begin_end_spec(begin_spec)
local end_from, end_to = canonicalize_begin_end_spec(end_spec)
subterm = begin_from .. rest .. end_from
dest = begin_to .. rest .. end_to
end
if not subterm then
rest, end_spec = modspec:match("^([^:]*)%[(.-)%]$")
if rest then
local end_from, end_to = canonicalize_begin_end_spec(end_spec)
subterm = rest .. end_from
dest = rest .. end_to
end
end
if not subterm then
begin_spec, rest = modspec:match("^%[(.-)%]([^:]*)$")
if begin_spec then
local begin_from, begin_to = canonicalize_begin_end_spec(begin_spec)
subterm = begin_from .. rest
dest = begin_to .. rest
end
end
if not subterm then
subterm, dest = modspec:match("^(.-)%s*:%s*(.*)$")
if subterm and subterm ~= "^" and subterm ~= "$" then
local langdest
-- Parse off an initial language code (e.g. 'en:Higgs', 'la:minūtia' or 'grc:σκατός'). Also handle
-- Wikipedia prefixes ('w:Abatemarco' or 'w:it:Colle Val d'Elsa').
otherlang, langdest = dest:match("^([A-Za-z0-9._-]+):([^ ].*)$")
if otherlang == "w" then
local foreign_wikipedia, foreign_term = langdest:match("^([A-Za-z0-9._-]+):([^ ].*)$")
if foreign_wikipedia then
otherlang = otherlang .. ":" .. foreign_wikipedia
langdest = foreign_term
end
dest = ("%s:%s"):format(otherlang, langdest)
otherlang = nil
elseif otherlang then
otherlang = get_lang(otherlang, true, "allow etym")
dest = langdest
end
end
end
if not subterm then
if modspec == "?" or modspec == "!" then
subterm = "$"
dest = modspec
elseif modspec == "..." or modspec == "...?" then
subterm = "$"
dest = " " .. modspec
elseif modspec:find("^[A-Z]$") then
-- X, Y, etc. by themselves are unlinked, to help with snowclones
subterm = modspec
dest = "_"
else
subterm = modspec
dest = "~"
end
end
if subterm == "^" then
linked_term = dest:gsub("_", " ") .. linked_term
elseif subterm == "$" then
linked_term = linked_term .. dest:gsub("_", " ")
else
if subterm:find("[", nil, true) then
error(("Subterm '%s' in modifier spec '%s' cannot have brackets in it"):format(
escape_wikicode(subterm), escape_wikicode(modspec)))
end
local escaped_subterm = pattern_escape(subterm)
local subterm_re = "%[%[" .. escaped_subterm:gsub("(%%?[ ',%-])", "%%]*%1%%[*") .. "%]%]"
local expanded_dest
if dest:find("~", nil, true) then
expanded_dest = dest:gsub("~", replacement_escape(subterm))
else
expanded_dest = dest
end
if otherlang then
expanded_dest = expanded_dest .. "#" .. otherlang:getCanonicalName()
end
local subterm_replacement
if expanded_dest == "_" then
subterm_replacement = subterm
if id then
error("Can't supply <id:...> with an unlinked subterm")
end
if otherlang then
error("Can't supply prefixed language with an unlinked subterm")
end
elseif id or otherlang then
if id and expanded_dest:find("[", nil, true) then
error("Can't supply <id:...> with destination with embedded brackets")
end
subterm_replacement = require(links_module).language_link {
lang = otherlang or lang,
term = expanded_dest,
alt = subterm,
id = id,
}
elseif expanded_dest:find("[", nil, true) then
-- Use the destination directly if it has brackets in it (e.g. to put brackets around parts of a word).
subterm_replacement = expanded_dest
elseif expanded_dest == subterm then
subterm_replacement = "[[" .. subterm .. "]]"
else
subterm_replacement = "[[" .. expanded_dest .. "|" .. subterm .. "]]"
end
local escaped_subterm_replacement = replacement_escape(subterm_replacement)
local replaced_linked_term = ugsub(linked_term, subterm_re, escaped_subterm_replacement)
if replaced_linked_term == linked_term then
mw.log(("Attempted to replace %s with %s in %s"):format(subterm_re, escaped_subterm_replacement, linked_term))
error(("Subterm '%s' could not be located in %slinked expression %s, or replacement same as subterm"):format(
subterm, j > 1 and "intermediate " or "", escape_wikicode(linked_term)))
else
linked_term = replaced_linked_term
end
end
end
return linked_term
end
local inflection_to_cats = {
plural = {
filter_plpos = function(plpos)
-- plurals also occur with determiners, adjectives etc. and we don't want to generate categories like
-- 'countable determiners', 'countable adjectives', etc. Note that the passed-in `plpos` has `proper nouns`
-- converted to `nouns`.
return plpos == "nouns"
end,
yes_cats = {"countable PLPOS"},
no_cats = {"uncountable PLPOS"},
},
comparative = {
yes_cats = {"comparable PLPOS"},
no_cats = {"uncomparable PLPOS"},
},
["female equivalent"] = {
yes_cats = {"PLPOS with other-gender equivalents"},
},
["male equivalent"] = {
yes_cats = {"PLPOS with other-gender equivalents"},
},
}
local Headdata = {}
function Headdata:get_canonicalized_plpos()
return (self.pos_category:gsub("proper noun", "noun"))
end
function Headdata:canonicalize_category(category)
if type(category) ~= "string" then
return category
end
if category:find("PLPOS") then
local plpos = self:get_canonicalized_plpos()
category = category:gsub("PLPOS", plpos)
end
return self.langfullname .. " " .. category
end
function Headdata:canonicalize_categories(categories)
if not categories then
return categories
end
local canon_cats = {}
for _, cat in ipairs(categories) do
insert(canon_cats, self:canonicalize_category(cat))
end
return canon_cats
end
--[==[
Insert a category into the `categories` list in the headword `data` structure. `category` is normally a string naming
the category, which will have the language prepended to it and any occurrences of `PLPOS` in the string replaced with
the actual plural part of speech (with some canonicalization; specifically, `proper nouns` is converted to `nouns` when
replacing `PLPOS`). Alternatively, `category` can be a table of the form accepted by `format_categories()` in
[[Module:utilities]]. This can be used, for example, to specify a sort key or sort base or to insert a category that
does not have the language prepended to it. The structure has the following fields:
* `cat` (the full category name, not further processed);
* `lang` (an optional language, overriding the overall headword language);
* `sort_key` (optional sort key);
* `sort_base` (optional sort base);
* `sc` (optional overriding script).
]==]
function Headdata:insert_category(category)
insert(self.categories, self:canonicalize_category(category))
end
--[==[
Validate the genders in `genders` (a list of gender spec objects, as produced by {type = "genders"} in
[[Module:parameters]] and accepted by [[Module:gender and number]]), checking that all specified genders are in the list
given in `valid_genders`. Optional `props` controls how the validation happens. In particular, unless `props.no_augment`
is given, then for any gender beginning with `m`, if a corresponding gender beginning with `f` occurs, analogous genders
beginning with `mf`, `mfbysense` and `mfequiv` are also allowed. For example, if `m-d` (masculine dual) and `f-d`
(feminine dual) both occur, genders `mf-d`, `mfbysense-d` and `mfequiv-d` are also allowed. If a disallowed gender is
given, an error occurs, giving the disallowed gender along with the list of all allowed genders.
]==]
function Headdata:validate_genders(genders, valid_genders, props)
if not genders then
return
end
props = props or {}
local gender_type, no_augment = props.gender_type, props.no_augment
gender_type = gender_type or "headword"
local valid_gender_set = require(table_module).listToSet(valid_genders)
local augmented_gender_set
if no_augment then
augmented_gender_set = valid_gender_set
else
augmented_gender_set = {}
for g, _ in pairs(valid_gender_set) do
augmented_gender_set[g] = true
if g:find("^m") and not g:find("^mf") and valid_gender_set[g:gsub("^m", "f")] then
augmented_gender_set[g:gsub("^m", "mf")] = true
augmented_gender_set[g:gsub("^m", "mfbysense")] = true
augmented_gender_set[g:gsub("^m", "mfequiv")] = true
end
end
end
for _, gspec in ipairs(genders) do
local g = gspec.spec
if not augmented_gender_set[g] then
local valid_gender_list = {}
for valid_g, _ in pairs(augmented_gender_set) do
insert(valid_gender_list, valid_g)
end
table.sort(valid_gender_list)
error(("Invalid %s gender: %s; expected one of %s"):format(gender_type, g,
mw.text.listToText(valid_gender_list)))
end
end
end
--[==[
Parse an inflection specified in `field`, the name of a parameter holding an inflection. If the parameter is numeric,
the field should be given as a number (as with the `params` structure passed to [[Module:parameters]]), not a string
containing the representation of a number. The field can specify multiple comma-separated terms, and each term can have
associated inline modifiers that will be parsed (unless there is top-level HTML in the parameter, i.e. HTML not
contained inside an inline modifier, e.g. as may be generated by using {{tl|l}} or similar template inside a parameter).
This is a wrapper around the top-level `parse_term_with_modifiers()` function. `props` is an optional structure
containing additional properties, including all additional properties documented for the top-level
`parse_term_with_modifiers()` function.
If the parameter in `field` is unspecified, the return value of this function will be an empty list, not {nil}, so it
is always safe to iterate over the return value.
By default, the allowed modifiers are the same as for `parse_term_with_modifiers()`, except that (normally) the
`<tr:...>` modifier will be allowed if `include_tr` was specified in the original call to `process_headword()`, and
likewise `<sc:...>` will be allowed if `include_sc` was specified in the original call to `process_headword()`. If you
pass in your own `include_mods` list of additional allowed modifiers, it will (normally) automatically be augmented with
{"tr"} and/or {"sc"} if `include_tr` and/or `include_sc` was specified when calling `process_headword()`. To disable
automatic augmentation of the {"tr"} and {"sc"} modifiers (whether or not you specify an `include_mods` property),
specify {no_augment_include_mods = true} in `props`.
]==]
function Headdata:parse_inflection(field, props)
local val = self.process_props.args[field]
if not val then
return {}
end
props = props and shallow_copy(props) or {}
local include_mods = props.include_mods
local data = self.process_props.data
if not props.no_augment_include_mods and (data.include_tr or data.include_sc) then
include_mods = include_mods and shallow_copy(include_mods) or {}
if data.include_tr then
insert_if_not(include_mods, "tr")
end
if data.include_sc then
insert_if_not(include_mods, "sc")
end
end
props.val = val
props.paramname = field
props.splitchar = props.splitchar or ","
props.include_mods = include_mods
return export.parse_term_with_modifiers(props) or {}
end
--[==[
Insert previously-parsed terms into the `inflections` of the headword `data` structure. This is a wrapper around
the top-level `insert_inflection()` function. `terms` is the list of parsed terms. (If {nil}, nothing happens unless
`request` is set in `props`.) `label` is the the label that the inflections are given; any parts of the label surrounded
in `<<...>>` are linked to the glossary. (If the contents of `<<...>>` contain a `|` in them, they are a two-part link.)
`props` is an optional structure containing additional properties, including all additional properties documented for
the top-level `insert_inflection()` function.
Unless `no_augment_cats` is given in `props`, certain labels automatically trigger the insertion of additional
categories in specific circumstances. This is controlled by the `inflection_to_cats` structure in
[[Module:headword utilities]]. For example, if the part of speech is {"nouns"} or {"proper nouns"} and the label (after
removing any links and `<<...>>` glossary specs) is {"plural"}, an additional category
<code><var>lang</var> countable nouns</code> will be added if a plural value is given (i.e. the value is not {"-"}). If
the value is {"-"} (which indicates that there is no plural and triggers the insertion of the fixed inflection label
{"no plural"}), <code><var>lang</var> uncountable nouns</code> will be inserted instead, and if both {"-"} and a value
are given (which triggers the insertion of the {"usually no plural"} fixed inflection label), both categories are added.
Similar categories are inserted when a comparative is given (with a label {"comparative"}), and if the label is
{"female equivalent"} or {"male equivalent"} and the value is not {"-"}, a category such as
<code><var>lang</var> nouns with other-gender equivalents</code> is inserted.
]==]
function Headdata:insert_inflection(terms, label, props)
props = props and shallow_copy(props) or {}
if not props.no_augment_cats then
local bare_label = label
if bare_label:find("[[", nil, true) then
bare_label = require(links_module).remove_links(bare_label)
end
if bare_label:find("<<", nil, true) then
bare_label = bare_label:gsub("<<.-|(.-)>>", "%1"):gsub("<<(.-)>>", "%1")
end
local cats = inflection_to_cats[bare_label]
if cats then
if not cats.filter_plpos or cats.filter_plpos(self:get_canonicalized_plpos()) then
if props.yes_cats == nil then
props.yes_cats = self:canonicalize_categories(cats.yes_cats)
end
if props.usually_yes_cats == nil then
props.usually_yes_cats = self:canonicalize_categories(cats.usually_yes_cats)
end
if props.no_cats == nil then
props.no_cats = self:canonicalize_categories(cats.no_cats)
end
end
end
end
props.headdata = self
props.terms = terms
props.label = label
return export.insert_inflection(props)
end
--[==[
Insert a "fixed" inflection (a label without associated values) into the `inflections` table of the headword `data`
structure, labeled according to `label` (which can have glossary links in it specified using `<<...>>`, exactly as for
`:insert_inflection()`). An example label (from {{tl|mn-noun}} in [[Module:mn-headword]]) is {"hidden-g declension"},
specifying that the noun belongs to the hidden-''g'' declension. This is a direct wrapper around the top-level function
`insert_fixed_inflection()`; see that function for more details on optional `props`.
]==]
function Headdata:insert_fixed_inflection(label, props)
props = props and shallow_copy(props) or {}
props.headdata = self
props.label = label
export.insert_fixed_inflection(props)
end
--[==[
Parse the inflection(s) specified in `field` and insert them into the `inflections` table of the headword `data`
structure, labeled according to `label`. This is equivalent to calling {terms = data:parse_inflection(field, props)}
followed by {return data:insert_inflection(terms, label, props)} and behaves the same as the combination of those two
functions. See their documentation for more details.
]==]
function Headdata:parse_and_insert_inflection(field, label, props)
local terms = self:parse_inflection(field, props)
return self:insert_inflection(terms, label, props)
end
-- Generate an inflection that may be specified explicitly or defaulted (which involves looping over the specified or
-- defaulted heads and determining the script of each one, since the formation of the default depends on the script).
-- `data` is the data object passed into the POS handler. `terms` is the list of terms to process. Those where the term
-- itself is not `+` will be returned unchanged, while those where the term is `+` will be handled by generating the
-- appropriate inflections from the headwords using `make_inflection` (which is passed three arguments, `head`, `tr` and
-- `sccode`, i.e. the script code of `head`) and should return two values, term and translit, either of which can be
-- nil. A nil head will be ignored, and otherwise the qualifiers/labels/etc. specified on the `+` term will be combined
-- with the qualifiers/labels/etc. specified on the head. The return value is a list of inflections where no requests
-- for the default inflection remain.
function Headdata:resolve_special(terms, handle_special, props)
props = props or {}
local infls = {}
local is_special = props.is_special or function(infl) return infl.term == "+" end
for _, termobj in ipairs(terms) do
if not is_special(termobj) then
insert(infls, termobj)
else
for _, headobj in ipairs(self.heads) do
local head = headobj.term or self.pagename
local head_no_links
if props.with_links then
head = head:find("%[") and head or require(headword_module).add_multiword_links(head, not headobj.term)
head_no_links = require(links_module).remove_links(head)
else
head = require(links_module).remove_links(head)
head_no_links = head
end
local newterms = handle_special {
head = head,
tr = headobj.tr,
infl = termobj,
sc = self.lang:findBestScript(head_no_links),
}
if newterms then
newterms = export.canonicalize_termobj_list(newterms)
for _, newterm in ipairs(newterms) do
if not props.no_combine_handle_special_retval_with_origin then
export.combine_termobj_qualifiers_labels(newterm, termobj)
end
if not props.no_combine_handle_special_retval_with_head then
export.combine_termobj_qualifiers_labels(newterm, headobj)
end
insert(infls, newterm)
end
end
end
end
end
return infls
end
--[==[
Add the current page to a tracking page named `Wiktionary:Tracking/``lang``-headword/``page```, where ``lang`` is the
language code of the current language. For example, if the current language is `mak` and `page` is {"redundant-lon"},
the current page will get added to the tracking page `Wiktionary:Tracking/mak-headword/redundant-lon`. All pages added
to that tracking page can be seen by going to [[Special:WhatLinksHere/Wiktionary:Tracking/mak-headword/redundant-lon]].
This is typically used to track issues occurring in user-specified parameters that do not rise to the level of errors
(e.g. redundant parameters, deprecated usages or other dispreferred values).
]==]
function Headdata:track(page)
return require(debug_track_module)(self.langcode .. "-headword/" .. page)
end
local boolean_param = {type = "boolean"}
--[==[
Process an arbitrary headword in an arbitrary language, handling generic and language-specific arguments and calling
`full_headword()` in [[Module:headword]]. This is intended for use in implementing headword modules (e.g.
[[Module:uz-headword]] for Uzbek, [[Module:mn-headword]] for Uzbek, [[Module:gsw-headword]] for Alemannic German, etc.)
and provides a general implementation of such modules. On input, `data` is an object with the following fields:
* `lang`: The language object of the language being handled. '''Required.'''
* `frame`: The frame object passed into the `show()` function of your module, which implements headword-handling for
all parts of speech in the module, including a generic POS-handling template (e.g. {{tl|uz-head}} or {{tl|mn-head}}),
which allows arbitrary parts of speech to be handled. '''Required.'''
* `pos_functions`: A table listing, for each part of speech requiring special handling, the extra parameters (if any)
that the part of speech accepts, and a function to handle those parameters. See examples below. '''Required.'''
* `head_in_1`: If true, explicit headwords are specified in {{para|1}} (or {{para|2}} for generic POS templates such
as {{tl|mn-head}}) instead of in {{para|head}}.
* `include_tr`: If true, allow explicit transliteration to be specified. The transliteration(s) for the headword(s)
themselves is/are specified in {{para|tr}} or through the {{cd|<tr:...>}} inline modifier on headwords, and
transliterations of inflections are specified through the {{cd|<tr:...>}} inline modifier. This should generally be
given when a headword for the language may be in a script other than Latin.
* `include_sc`: If true, allow an explicit script code to be specified. The overall script code for the headword(s)
themselves can be specified using {{para|sc}}, and per-headword or per-inflection script codes are specified using the
{{cd|<sc:...>}} inline modifier. This should generally be given when a language supports multiple scripts.
* `augment_params`: A callback function to add extra generic parameters that apply to all parts of speech. This should
not be used to add part-of-speech-specific parameters; those are handled through the appropriate setting in
`pos_functions`. See below for the format of the argument passed in. This function is called after initializing the
`params` table and just before adding part-of-speech-specific parameters (from `pos_functions`) to this table. Thus,
it can override any generic parameters but may itself be overridden by a part-of-speech-specific parameter.
* `augment_headdata`: A callback function to modify the `headdata` object passed to `full_headword()` in
[[Module:headword]]. This should not be used to for part-of-speech-specific parameter handling; this is handled
through the appropriate setting in `pos_functions`. See below for the format of the argument passed in. This can be
used, for example, to override the value of a generic setting in `headdata` (e.g. [[Module:uz-headword]] uses this to
mark non-Latin terms as variant forms by setting `headdata.var`, being careful not to override a value already set by
the user) or to handle extra generic parameters added through the `augment_params` callback. This function is called
after initializing the `headdata` table with all information taken from generic parameters, and just before calling
the appropriate part-of-speech-specific handler function in `pos_functions`. Thus, it can override any value set
during generic parameter processing but may itself be overridden by a part-of-speech-specific handler.
* `force_cat`: If true, add the headword to the appropriate categories even on non-mainspace pages. This can be used for
testing category handling in sample template calls on userspace test pages or template documentation pages. It should
not be set in production code.
* `enable_auto_translit`: If true, turn on automatic transliteration of inflections at a global level (i.e. applying to
all inflections). This has no effect on headwords, which are automatically transliterated by default if in a non-Latin
script and automatic transliteration is available for the language. You can also set this value for particular
inflections in the `insert_inflection()` function.
The `augment_params` callback is passed a single argument, a table with the following fields:
* `params`: The parameters object itself, of the format accepted by `process()` in [[Module:parameters]]. This object
should be side-effected as necessary.
* `poscat`: The canonicalized part of speech of the headword being processed. This comes either from the invocation
parameter {{para|1}} to `process_headword` (for specific part-of-speech templates such as {{tl|uz-noun}}) or from the
template parameter {{para|1}} passed to a generic part-of-speech template such as {{tl|uz-head}}. It is always
canonicalized to full form and pluralized (e.g. `pcl` will be converted to `particles`).
* `indexing_poscat`: The canonicalized part of speech of the headword used to index into `pos_functions`. This is the
same as `poscat` for specific part-of-speech templates such as {{tl|uz-noun}}, but has the value {"head"} for generic
part-of-speech templates such as {{tl|uz-head}}.
* `generic_pos_template`: True if a a generic POS templates like {{tl|uz-head}} or {{tl|mn-head}} was used. (This is
signaled by omitting the invocation parameter {{para|1}} to `process_headword`.)
* `head_param`: The parameter holding the explicit headword. If `head_in_1` was specified (as for Mongolian headword
templates), this has the value {2} for generic POS templates like {{tl|mn-head}} and {1} for specific POS templates
like {{tl|mn-noun}}. Otherwise, it has the value {"head"}.
The `augment_headdata` callback is passed a single argument, a table with the following fields:
* `headdata`: The headdata object itself, i.e. the object that will be passed to `full_headword()` in
[[Module:headword]]. It should be side-effected as necessary.
* `args`: The parsed arguments table holding all the user-specified arguments.
* `indexing_poscat`, `generic_pos_template`, `head_param`: Same as for the `augment_params` callback.
Note that other information on the headword can be found in the `process_props` field of `headdata`. (For example, the
table in this field contains all of the above fields except for `headdata` itself.)
The `pos_functions` table contains an entry for each part of speech needing special handling, where the key is the
canonical plural part of speech (e.g. {"adverbs"} or {"proper nouns"}). The value associated with each key is a table
containing two fields, `params` and `func`. `params` is a table containing extra parameters to add to the overall
`params` object passed to the `process()` function in [[Module:parameters]]. `func` is a function of two arguments,
normally called `data` (the headword data structure `headdata`) and `args` (the processed arguments table). A simple
example, as used to handle verbs for Mongolian, is
{
pos_functions["verbs"] = {
params = {
caus = true,
pass = true,
},
func = function(data, args)
data:parse_and_insert_inflection("caus", "causative")
data:parse_and_insert_inflection("pass", "passive")
end
}
}
The `params` structure sets two extra user-specifiable parameters {{para|caus}} and {{para|pass}}, and the `func`
handler processes those parameters. Note how this is done by calling methods on the headword `data` structure. Each
such parameter can have multiple comma-separated values, and each value can have inline modifiers attached to it to
specify further properties of the value.
These methods are implemented through a metatable set on the headword `data` structure, which is removed before calling
`full_headword()` in [[Module:headword]]. The methods access extra information related to headword processing (such as
the `args` table) that is stored in the `process_props` field of the headword `data` strucuture. This field is also
removed prior to calling `full_headword()`.
The methods available on the headword `data` structure are as follows. Each one also has its own documentation.
* {parse_inflection(field, props)}: Parse value(s) specified in `field` (a user-specified parameter in the `args` table)
and return a list of term objects. Optional `props` specifies additional properties controlling the parsing.
* {insert_inflection(terms, label, props)}: Insert the terms in `terms` (a list of term objects as returned by
`parse_inflection()`) into the `inflections` list in the headword `data` structure, giving the inflection the label as
specified in `label`. Optional `props` specifies additional properties controlling the parsing.
* {parse_and_insert_inflection(field, label, props)}: A combination of `parse_inflection()` and `insert_inflection()`,
if no further processing of the parsed values needs to be done before insertion.
* {insert_fixed_inflection(label, props)}: Insert a "fixed" inflection (a label without associated values) into the
`inflections` table. An example (from {{tl|mn-noun}} in [[Module:mn-headword]]) is {"hidden-g declension"}, specifying
that the noun belongs to the hidden-''g'' declension.
* {resolve_special(terms, handle_special, props)}: Resolve "special" indicators as specified by the user in an inflection
parameter. A typical example is {"+"}, requesting a default value. `terms` is the list of parsed term objects and
`handle_special` is a handler function to process special indicators and convert them to their actual values.
* {validate_genders(genders, valid_genders, props)}: Validate that the user-specified genders in `genders` all belong to
the list given in `valid_genders`, throwing an error if not.
* {insert_category(category)}: Insert a category into the `categories` list in the headword `data` structure. `category`
is normally a string naming the category, which will have the language prepended to it and any occurrences of `PLPOS`
in the string replaced with the actual plural part of speech.
]==]
function export.process_headword(data)
local lang, frame, pos_functions, head_in_1, include_tr, include_sc, force_cat, enable_auto_translit,
augment_params, augment_headdata =
data.lang, data.frame, data.pos_functions, data.head_in_1, data.include_tr, data.include_sc, data.force_cat,
data.enable_auto_translit, data.augment_params, data.augment_headdata
local langcode = lang:getCode()
local iparams = {
[1] = true,
def = true,
}
local iargs = require(parameters_module).process(frame.args, iparams)
local parargs = frame:getParent().args
local poscat = iargs[1]
local generic_pos_template = not poscat
if generic_pos_template then
poscat = ine(parargs[1]) or
mw.title.getCurrentTitle().fullText == ("Template:%s-head"):format(langcode) and "interjection" or
error("Part of speech must be specified in 1=")
poscat = require(headword_module).canonicalize_pos(poscat)
end
local head_param = head_in_1 and (generic_pos_template and 2 or 1) or "head"
local indexing_poscat = generic_pos_template and "head" or poscat
local params = {
[head_param] = {template_default = iargs.def},
head2 = {replaced_by = false, instead = ("use comma-separated |%s="):format(head_param)},
id = true,
sort = true,
cat = true,
nolink = boolean_param,
nolinkhead = {type = "boolean", alias_of = "nolink"},
suffix = boolean_param,
nosuffix = boolean_param,
clitic = true,
addlpos = true,
var = {type = "boolean", allow = {"both"}},
json = boolean_param,
pagename = true, -- for testing
}
if include_sc then
params.sc = {type = "script"}
end
if include_tr then
params.tr = true
params.tr2 = {replaced_by = false, instead = "use comma-separated |tr= or <tr:...> inline modifier on head"}
end
if generic_pos_template then
params[1] = {required = true} -- required but ignored as already processed above
end
if augment_params then
augment_params {
params = params,
poscat = poscat,
indexing_poscat = indexing_poscat,
generic_pos_template = generic_pos_template,
head_param = head_param,
}
end
if pos_functions[indexing_poscat] then
for key, val in pairs(pos_functions[indexing_poscat].params) do
params[key] = val
end
end
local args = require("Module:parameters").process(parargs, params)
local pagename = args.pagename or mw.loadData(headword_data_module).pagename
local namespace = mw.loadData(headword_data_module).page.namespace
local sc = args.sc or lang:findBestScript(pagename)
local headdata = {
lang = lang,
langcode = langcode,
langfullcode = lang:getFullCode(),
langname = lang:getCanonicalName(),
langfullname = lang:getFullName(),
process_props = {
args = args,
namespace = namespace,
data = data,
indexing_poscat = indexing_poscat,
generic_pos_template = generic_pos_template,
head_param = head_param,
is_suffix = false,
},
pos_category = poscat,
orig_poscat = poscat, -- preserve user-specified poscat in case pos_category is changed to 'suffixes'
categories = {},
inflections = {enable_auto_translit = enable_auto_translit},
pagename = pagename,
sc = sc,
id = args.id,
sort_key = args.sort,
force_cat_output = force_cat,
no_redundant_head_cat = true,
-- No redundant script cat unless the user explicitly gave sc=
no_script_code_cat = not args.sc,
var = args.var,
}
setmetatable(headdata, {__index = Headdata})
local extra_term_mods = {}
if include_tr then
insert(extra_term_mods, "tr")
end
if include_sc then
insert(extra_term_mods, "sc")
end
if not extra_term_mods[1] then
extra_term_mods = nil
end
local trs = args.tr and split_on_comma(args.tr) or {}
local num_trs = #trs
local heads = args[head_param] and export.parse_term_with_modifiers {
val = args[head_param],
paramname = head_param,
splitchar = ",",
is_head = true,
include_mods = extra_term_mods,
} or {}
local num_heads = #heads
if num_heads > 0 and num_trs > 0 and num_heads ~= num_trs then
error(("%s head%s specified explicitly but %s translit%s; they must match; use '+' to stand for the default head (the pagename) or no manual translit"):format(
num_heads, num_heads > 1 and "s" or "", num_trs, num_trs > 1 and "s" or ""))
end
-- Be careful here not to overwrite user_specified_heads if it's empty so we can later check user_specified_heads
-- to see if the user provided any heads.
if num_heads == 0 and num_trs > 0 then
heads = {}
for i = 1, num_trs do
heads[i] = {term = "+"}
end
end
if not heads[1] then
heads = {{term = "+"}}
end
for i, headobj in ipairs(heads) do
if headobj.tr and trs[i] then
if headobj.tr ~= trs[i] then
error(("Saw two different translits '%s' and '%s' for head #%s"):format(
headobj.tr, trs[i], i))
end
else
headobj.tr = headobj.tr or trs[i]
end
if headobj.tr == "+" then
headobj.tr = nil
end
if headobj.term == "+" then
headobj.term = args.nolink and pagename or nil
if headobj.term and namespace == "Reconstruction" then
headobj.term = "*" .. headobj.term
end
end
end
headdata.heads = heads
local function pagename_is_suffix()
if sc:getCode() == "Latn" then
-- shortcut Latin terms to avoid unnecessarily loading [[Module:affix]]
return pagename:find("^%-") and not pagename:find("%-$")
else
local affix_type, _, _, _ = require(affix_module).parse_term_for_affixes(pagename, lang, sc)
return affix_type == "suffix"
end
end
local clitic_label
if args.clitic then
clitic_label = require(yesno_module)(args.clitic, args.clitic)
end
if clitic_label == true then
clitic_label = "clitic"
end
if clitic_label then
headdata:insert_category("clitics")
headdata:insert_fixed_inflection(clitic_label)
elseif args.suffix or (
not args.nosuffix and pagename_is_suffix() and poscat ~= "suffixes" and poscat ~= "suffix forms"
) then
headdata.process_props.is_suffix = true
local function handle_suffix_pos(pos, is_first)
local form_type = pos:match("^(.*) forms$")
local actual_poscat
if form_type then
headdata:insert_category(("%s suffix forms"):format(form_type))
headdata:insert_fixed_inflection(form_type .. " suffix form")
else
local singular_pos = require(en_utilities_module).singularize(pos)
headdata:insert_category(("%s-forming suffixes"):format(singular_pos))
headdata:insert_fixed_inflection(singular_pos .. "-forming suffix")
end
local postype = require(headword_module).pos_lemma_or_nonlemma(pos)
if not postype then
error(("Unrecognized canonicalized part of speech '%s' in addlpos=, cannot determine whether lemma or non-lemma form"):format(
pos
))
end
actual_poscat = postype == "lemma" and "suffixes" or "suffix forms"
if is_first then
headdata.pos_category = actual_poscat
elseif headdata.pos_category ~= actual_poscat then
error(("Cannot mix suffixes and suffix forms using addlpos=; '%s' is a %s while overall POS '%s' is a %s; use separate POS headers for the two"):
format(pos, actual_poscat, poscat, headdata.pos_category))
end
end
handle_suffix_pos(poscat, true)
if args.addlpos then
for _, addlpos in ipairs(split(args.addlpos, "%s*,%s*")) do
addlpos = require(headword_module).canonicalize_pos(addlpos)
handle_suffix_pos(addlpos, false)
end
end
end
if args.cat then
for _, cat in ipairs(split_on_comma(args.cat)) do
headdata:insert_category(cat)
end
end
if augment_headdata then
augment_headdata {
headdata = headdata,
args = args,
indexing_poscat = indexing_poscat,
head_param = head_param,
generic_pos_template = generic_pos_template,
}
end
if pos_functions[indexing_poscat] then
pos_functions[indexing_poscat].func(headdata, args)
end
setmetatable(headdata, nil)
if args.json then
return require("Module:JSON").toJSON(headdata)
end
headdata.process_props = nil
return require(headword_module).full_headword(headdata)
end
return export
f6nbrfl10dfgl4zslojzvvhos3v95co
2561598
2561597
2026-09-08T07:24:04Z
Hiyuune
50834
2561598
Scribunto
text/plain
local export = {}
local affix_module = "Module:affix"
local debug_track_module = "Module:debug/track"
local en_utilities_module = "Module:en-utilities"
local fun_is_callable_module = "Module:fun/isCallable"
local headword_module = "Module:headword"
local headword_data_module = "Module:headword/data"
local languages_module = "Module:languages"
local links_module = "Module:links"
local parameters_module = "Module:parameters"
local parse_interface_module = "Module:parse interface"
local parse_utilities_module = "Module:parse utilities"
local string_pattern_escape_module = "Module:string/patternEscape"
local string_replacement_escape_module = "Module:string/replacementEscape"
local string_utilities_module = "Module:string utilities"
local table_module = "Module:table"
local yesno_module = "Module:yesno"
local dump = mw.dumpObject
local unpack = unpack or table.unpack -- Lua 5.2 compatibility
local insert = table.insert
local concat = table.concat
local remove = table.remove
local sort = table.sort
local function deepEquals(...)
deepEquals = require(table_module).deepEquals
return deepEquals(...)
end
local function escape_wikicode(...)
escape_wikicode = require(parse_utilities_module).escape_wikicode
return escape_wikicode(...)
end
local function extend(...)
extend = require(table_module).extend
return extend(...)
end
local function get_lang(...)
get_lang = require(languages_module).getByCode
return get_lang(...)
end
local function insert_if_not(...)
insert_if_not = require(table_module).insertIfNot
return insert_if_not(...)
end
local function is_callable(...)
is_callable = require(fun_is_callable_module)
return is_callable(...)
end
local function parse_inline_modifiers(...)
parse_inline_modifiers = require(parse_utilities_module).parse_inline_modifiers
return parse_inline_modifiers(...)
end
local function pattern_escape(...)
pattern_escape = require(string_pattern_escape_module)
return pattern_escape(...)
end
local function replacement_escape(...)
replacement_escape = require(string_replacement_escape_module)
return replacement_escape(...)
end
local function shallow_copy(...)
shallow_copy = require(table_module).shallowCopy
return shallow_copy(...)
end
local function split(...)
split = require(string_utilities_module).split
return split(...)
end
local function term_contains_top_level_html(...)
term_contains_top_level_html = require(parse_utilities_module).term_contains_top_level_html
return term_contains_top_level_html(...)
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 function split_on_comma(val)
if val:find(",") then
return require(parse_interface_module).split_on_comma(val)
else
return {val}
end
end
local function ine(val)
if val == "" then return nil else return val end
end
local param_mods = {
id = {}, -- disabled when `is_head = true`
q = {type = "qualifier"},
qq = {type = "qualifier"},
l = {type = "labels"},
ll = {type = "labels"},
-- [[Module:headword]] expects part references in `.refs`.
ref = {item_dest = "refs", type = "references", store = "insert-flattened"},
}
local optional_param_mods = {
g = {item_dest = "genders", type = "genders"},
alt = {},
lang = {type = "language"},
sc = {type = "script"},
t = {item_dest = "gloss"},
gloss = {},
pos = {},
lit = {},
tr = {},
ts = {},
face = {},
nolinkinfl = {type = "boolean"},
}
local optional_headword_param_mods = {
sc = {type = "script"},
tr = {},
ts = {},
}
--[==[
Parse a single inflection or headword form or list of such forms. In either case, inline modifiers may be attached.
`data` is an object with the following fields:
* `val`: The raw value to parse. Required.
* `paramname`: The name of the parameter from which the value was taken; used in error messages. Required.
* `is_head`: We are parsing a headword parameter (a value which goes into the `heads` field of `data`). This changes
the allowed modifiers, disabling the `id` modifier and only allowing a subset of optional modifiers.
* `frob`: An optional function of one value to apply to the form after inline modifiers have been removed (i.e. to
apply to the `.term` field of the returned object).
* `include_mods`: List of extra inline modifiers to include, besides the default ones (see below). Each list item is
either a string specifying a recognized extra inline modifier (see `optional_param_mods` in the code), or a two-item
list of modifier name and modifier spec, where the spec should follow the syntax for modifier specs in
`parse_inline_modifiers` in [[Module:parse utilities]].
* `exclude_mods`: List of default inline modifiers to not include.
* `splitchar`: If specified, the value in `val` can be a list of forms to parse, separated by the value of `splitchar`
(which is a Lua pattern, as in `parse_inline_modifiers` in [[Module:parse utilities]]). Most commonly, `splitchar` is
a single comma and the values are comma-separated (in this case, splitting will not happen if a space follows the
comma).
* `parse_lang_prefix`: If specified, allow a language prefix to precede a form, and if found, store into the `.lang`
field of the returned object.
* `preserve_splitchar`, `delimiter_key`, `escape_fun`, `unescape_fun`, `pre_normalize_modifiers`: As in
`parse_inline_modifiers` in [[Module:parse utilities]].
Returns an object suitable for storing as one element of one of the lists in `headdata.inflections`, where `headdata`
is the structure passed to [[Module:headword]]. If `splitchar` is specified, howeve, the return value is a list of such
objects.
The following default inline modifiers are currently recognized:
* `q`: Left qualifier.
* `qq`: Right qualifier.
* `l`: Comma-separated list of left labels. No space should follow the comma.
* `ll`: Comma-separated list of right labels. No space should follow the comma.
* `ref`: Reference or references. See {{tl|IPA}} for the syntax.
* `id`: Sense ID, in case there are multiple senses. See {{tl|l}}.
The following are the recognized additional inline modifiers:
* `g`: Comma-separated list of genders.
* `alt`: Display text.
* `lang`: Language code of language of the form, if different from the language of the headword.
* `sc`: Script code of script of the form. Almost never needed.
* `t`: Gloss for the form.
* `gloss`: Gloss for the form (alias for `t`).
* `pos`: Part of speech of the form.
* `lit`: Literal meaning of the form.
* `tr`: Manual transliteration of the form.
* `ts`: Transcription of the form, for languages where the transliteration differs markedly from the pronunciation.
* `face`: Face to display the form in, e.g. {"hypothetical"} for a hypothetical form (unlinkable and displayed in italics).
* `nolinkinfl`: Make the form unlinkable.
]==]
function export.parse_term_with_modifiers(data)
local paramname, val, frob = data.paramname, data.val, data.frob
local function generate_obj(term, parse_err)
if frob then
term = frob(term, parse_err)
end
if data.parse_lang_prefix and term:find(":") then
return require(parse_utilities_module).generate_obj_maybe_parsing_lang_prefix {
term = term,
paramname = paramname,
parse_lang_prefix = true,
parse_err = parse_err,
}
else
return {term = term}
end
end
-- Check for inline modifier, e.g. מרים<tr:Miryem>. But exclude top-level HTML entry with <span ...>,
-- <sup> or similar in it.
if (val:find("<", nil, true) or data.splitchar) and not term_contains_top_level_html(val) and
-- don't parse inline modifiers if is_head and the value begins with a ~ (link modifier syntax)
(not data.is_head or not val:find("^~")) then
local param_mods = param_mods
if data.is_head then
param_mods = shallow_copy(param_mods)
param_mods.id = nil
end
if data.include_mods or data.exclude_mods then
if not data.is_head then
-- already copied when data.is_head
param_mods = shallow_copy(param_mods)
end
if data.include_mods then
local optional_mods = data.is_head and optional_headword_param_mods or optional_param_mods
for _, mod in ipairs(data.include_mods) do
if type(mod) == "table" then
if #mod ~= 2 then
error(("Internal error: Modifier spec %s in `include_mods` should be of length 2"):format(
dump(mod)))
end
local modkey, modvalue = unpack(mod)
param_mods[modkey] = modvalue
elseif not optional_mods[mod] then
error(("Internal error: Unrecognized modifier spec %s in `include_mods`"):format(
dump(mod)))
else
param_mods[mod] = optional_mods[mod]
end
end
end
if data.exclude_mods then
for _, mod in ipairs(data.exclude_mods) do
if not param_mods[mod] then
error(("Internal error: Modifier spec %s in `exclude_mods` not found among existing modifiers"
):format(dump(mod)))
else
param_mods[mod] = nil
end
end
end
end
return parse_inline_modifiers(val, {
paramname = paramname,
param_mods = param_mods,
generate_obj = generate_obj,
splitchar = data.splitchar,
preserve_splitchar = data.preserve_splitchar,
delimiter_key = data.delimiter_key,
escape_fun = data.escape_fun,
unescape_fun = data.unescape_fun,
pre_normalize_modifiers = data.pre_normalize_modifiers,
})
else
local retval = generate_obj(val)
if data.splitchar then
retval = {retval}
end
return retval
end
end
--[==[
Parse a list of inflection forms that may have inline modifiers attached. `data` is an object with the following fields:
* `forms`: The list of raw values to parse. Required.
* `paramname`: The name of the first parameter from which the value was taken; used in error messages. If this is a
two-element list, the first element is the first parameter and the second element is the prefix of the remaining
parameters. Parameter names that are numbers are handled correctly, as are those with \1 in it marking where the
parameter index goes. Required.
* `qualifiers`: If specified, a possibly gappy list of left qualifiers to add to the parsed terms (for compatibility
purposes).
* `splitchar`: As in `parse_term_with_modifiers()`. The resulting per-term lists will be flattened.
* `frob`, `include_mods`, `exclude_mods`, `is_head`, `preserve_splitchar`, `parse_lang_prefix`, `delimiter_key`,
`escape_fun`, `unescape_fun`, `pre_normalize_modifiers`: As in `parse_term_with_modifiers()`.
Returns a list of objects, suitable for storing as one of the lists in `headdata.inflections` (once a label is added),
where `headdata` is the structure passed to [[Module:headword]].
]==]
function export.parse_term_list_with_modifiers(data)
local paramname, forms = data.paramname, data.forms
local qualifiers = data.qualifiers
local first, restpref
if type(paramname) == "table" then
first = paramname[1]
restpref = paramname[2]
else
first = paramname
restpref = paramname
end
local terms = {}
data = shallow_copy(data)
for i, val in ipairs(forms) do
data.paramname = i == 1 and first or type(restpref) == "number" and restpref + i - 1 or
restpref:find("\1", nil, true) and restpref:gsub("\1", tostring(i)) or restpref .. i
data.val = val
local parsed = export.parse_term_with_modifiers(data)
if qualifiers and qualifiers[i] then
if data.splitchar then
for _, term in ipairs(parsed) do
term.q = {qualifiers[i]}
end
else
parsed.q = {qualifiers[i]}
end
end
if data.splitchar then
extend(terms, parsed)
else
terms[i] = parsed
end
end
return terms
end
--[==[
Construct a link to [[Appendix:Glossary]] for `entry`. If `text` is specified, it is the display text; otherwise,
`entry` is used.
]==]
function export.glossary_link(entry, text)
text = text or entry
return "[[Phụ lục:Từ điển thuật ngữ#" .. entry .. "|" .. text .. "]]"
end
function export.replace_glossary_links_in_label(label)
if label:find("<<", nil, true) then
label = label:gsub("<<(.-)|(.-)>>", export.glossary_link):gsub("<<(.-)>>", export.glossary_link)
end
return label
end
function export.insert_fixed_inflection(data)
local headdata, origterm, label = data.headdata, data.originating_term, data.label
local inflobj = data.inflobj or headdata
inflobj.inflections = inflobj.inflections or {}
if not origterm then
insert(inflobj.inflections, {
label = export.replace_glossary_links_in_label(label)
})
else
if origterm.id then
error(("It doesn't make sense to pass in an ID '%s' for label '%s' in conjunction with a term value '%s'"
):format(origterm.id, label, origterm.term))
end
-- Preserve qualifiers, labels, references
origterm.term = nil
origterm.label = export.replace_glossary_links_in_label(label)
insert(inflobj.inflections, origterm)
end
end
--[==[
Insert previously-parsed terms into an `inflections` field. The `inflections` field will be initialized if needed.
`data` is an object with the following fields:
* `headdata`: The headword structure passed to [[Module:headword]]. Required.
* `inflobj`: The object whose `inflections` field the terms are inserted into. Defaults to `headdata`. Only needs
to be set for nested inflections, which are specified for an inflection object rather than the headword data
structure as a whole.
* `terms`: The list of parsed terms. If {nil} or omitted, nothing happens unless `request` is set.
* `label`: The label that the inflections are given; any parts of the label surrounded in `<<...>>` are linked to the
glossary. (If the contents of `<<...>>` contain a `|` in them, they are a two-part link.) Required.
* `no_label`: If the term is {"-"} and there are no other terms, insert a fixed label with this value. Defaults to
{"no "} plus the label.
* `usually_no_label`: If the term is {"-"} and there are other terms, insert a fixed label with this value. Defaults to
{"usually no "} plus the label.
* `accel`: If specified, a full accelerator object to add to the inflections.
* `request`: If specified and no terms are given, insert a label with a request for inflections to be given.
* `enable_auto_translit`: If specified and terms are given, display automatic transliteration of the terms.
The return value indicates whether the inflection exists and how many terms are in it. It is an object with the
following fields:
* `exists`: {"yes"} if one or more terms were specified; {"no"} if the value was given as {"-"}; {"usually no"} if
the first value was given as {"-"} but additional terms were supplied; otherwise {nil}, indicating that the status
is unspecified.
* `numterms`: Number of terms in the inflection. Will be 0 unless `exists` has the value {"yes"} or {"usually no"}.
* `request`: True if no terms were specified but a term request was inserted into the inflection (because
`data.request` was specified). Otherwise {nil}.
]==]
function export.insert_inflection(data)
local headdata, terms, label = data.headdata, data.terms, data.label
local inflobj = data.inflobj or headdata
local retval = {}
local accel = data.accel
if data.accel_form then
if accel then
error("Internal error: can't specify both data.accel and data.accel_form")
end
if headdata.heads then
local lemmas = {}
local lemma_translits = {}
for i, headobj in ipairs(headdata.heads) do
lemmas[i] = headobj.term
if lemmas[i] == "+" then
error("Internal error: If you use data.accel_form, you should have resolved all occurrences of + in heads appropriately")
end
lemma_translits[i] = headobj.tr
end
accel = {
lemma = lemmas,
lemma_translit = lemma_translits,
form = data.accel_form,
}
else
accel = {
form = data.accel_form,
}
end
end
local function insert_cats(cats)
for _, cat in ipairs(cats) do
insert(headdata.categories, cat)
end
end
if terms and terms[1] then
if terms[1].term == "-" then
if terms[2] then
export.insert_fixed_inflection {
headdata = headdata,
inflobj = inflobj,
originating_term = terms[1],
label = data.usually_no_label or "thường không " .. label,
}
remove(terms, 1)
retval.numterms = #terms
retval.exists = "thường không"
if data.usually_no_cats then
insert_cats(data.usually_no_cats)
else
if data.no_cats then
insert_cats(data.no_cats)
end
if data.yes_cats then
insert_cats(data.yes_cats)
end
end
else
export.insert_fixed_inflection {
headdata = headdata,
inflobj = inflobj,
originating_term = terms[1],
label = data.no_label or "không " .. label,
}
retval.numterms = 0
retval.exists = "không"
if data.no_cats then
insert_cats(data.no_cats)
end
return retval
end
else
retval.numterms = #terms
retval.exists = "yes"
if data.yes_cats then
insert_cats(data.yes_cats)
end
end
if data.check_missing then
error("Internal error: check_missing support removed; use checkredlinks=true in [[Module:headword]]")
end
terms.label = export.replace_glossary_links_in_label(label)
if accel then
terms.accel = accel
end
terms.enable_auto_translit = data.enable_auto_translit
inflobj.inflections = inflobj.inflections or {}
insert(inflobj.inflections, terms)
elseif data.request then
inflobj.inflections = inflobj.inflections or {}
insert(inflobj.inflections, {
label = export.replace_glossary_links_in_label(label),
request = true,
})
retval.numterms = 0
-- retval.exists = nil
retval.request = true
else
retval.numterms = 0
-- retval.exists = nil
end
return retval
end
--[==[
Parse raw arguments from `forms` for inline modifiers, and insert the resulting terms (which should not require
significant additional processing) into `headdata.inflections`. `data` is an object with the following fields:
* `forms`: The list of raw values to parse. If {nil} or omitted, nothing happens.
* `headdata`: The headword structure passed to [[Module:headword]]. Required.
* `paramname`: As in `parse_term_list_with_modifiers()`. Required.
* `label`: As in `insert_inflection()`. Required.
* `qualifiers`, `frob`, `include_mods`, `exclude_mods`, `is_head`, `splitchar`, `preserve_splitchar`, `delimiter_key`,
`escape_fun`, `unescape_fun`, `pre_normalize_modifiers`: As in `parse_term_list_with_modifiers()`.
* `accel`: As in `insert_inflection()`.
Return value is as in `insert_inflection()`.
]==]
function export.parse_and_insert_inflection(data)
local forms = data.forms
if forms and forms[1] then
data = shallow_copy(data)
data.forms = forms
data.terms = export.parse_term_list_with_modifiers(data)
return export.insert_inflection(data)
end
return {
numterms = 0
}
end
--[==[
Canonicalize a single term or term object or a list of either into a list of term objects.
]==]
function export.canonicalize_termobj_list(abterms)
if type(abterms) == "string" then
return {{term = abterms}}
elseif abterms.term then
return {abterms}
else
-- Check if already in full list term and return directly if so.
local must_convert = false
for _, term in ipairs(abterms) do
if type(term) == "string" then
must_convert = true
break
end
end
if not must_convert then
return abterms
end
end
local retval = {}
for _, term in ipairs(abterms) do
if type(term) == "string" then
insert(retval, {term = term})
else
insert(retval, term)
end
end
return retval
end
--[==[
Combine two sets of qualifiers or labels. If either is {nil}, just return the other, and if both are {nil}, return
{nil}.
]==]
function export.combine_qualifiers_or_labels(quals1, quals2)
if not quals1 and not quals2 then
return nil
end
if not quals1 then
return quals2
end
if not quals2 then
return quals1
end
local combined = shallow_copy(quals1)
for _, note in ipairs(quals2) do
insert_if_not(combined, note)
end
return combined
end
--[==[
Combine the qualifiers, labels, references and ID's of two term objects. `destobj` is the "destination term object" into
which the combined properties are written, and `srcobj` is the "source object" into which the properties are merged.
`destobj` is side-effected (but the lists inside of `destobj` are not); if this is undesirable, make sure to
shallow-copy `destobj` first. If both objects have values for a given qualifier, label or reference, the values of
`destobj` come first. If both objects have a value for `id`, the values must match or an error is thrown; otherwise,
the resulting value of `id` comes from whichever one is defined.
'''NOTE:''' This may not be the correct behavior when deduplicating a list of term objects. See
`insert_termobj_combining_duplicates` for a different approach.
]==]
function export.combine_termobj_qualifiers_labels(destobj, srcobj)
destobj.q = export.combine_qualifiers_or_labels(destobj.q, srcobj.q)
destobj.qq = export.combine_qualifiers_or_labels(destobj.qq, srcobj.qq)
destobj.l = export.combine_qualifiers_or_labels(destobj.l, srcobj.l)
destobj.ll = export.combine_qualifiers_or_labels(destobj.ll, srcobj.ll)
destobj.refs = export.combine_qualifiers_or_labels(destobj.refs, srcobj.refs)
if destobj.id and srcobj.id and destobj.id ~= srcobj.id then
-- FIXME: We probably want to pass in an error function
error(("Can't specify two different ID's %s and %s when combining objects"):format(srcobj.id, destobj.id))
end
destobj.id = destobj.id or srcobj.id
return destobj
end
function export.termobj_has_qualifiers_or_labels(obj)
return obj.q and obj.q[1] or obj.qq and obj.qq[1] or obj.l and obj.l[1] or obj.ll and obj.ll[1] or
obj.refs and obj.refs[1]
end
local function one_ancillary_property_equal(prop1, prop2)
local prop1_is_nil = not prop1 or not prop1[1]
local prop2_is_nil = not prop2 or not prop2[1]
if prop1_is_nil and prop2_is_nil then
return true
end
if prop1_is_nil or prop2_is_nil then
return false
end
return deepEquals(prop1, prop2)
end
function export.termobj_ancillary_properties_equal(obj1, obj2)
return one_ancillary_property_equal(obj1.q, obj2.q) and
one_ancillary_property_equal(obj1.qq, obj2.qq) and
one_ancillary_property_equal(obj1.l, obj2.l) and
one_ancillary_property_equal(obj1.ll, obj2.ll) and
one_ancillary_property_equal(obj1.refs, obj2.refs) and
obj1.id == obj2.id
end
function export.convert_termobj_to_formobj(termobj)
local formobj = {
form = termobj.term,
translit = termobj.tr,
}
local footnotes
local function mods_to_footnote(mod_prefix, mod_vals)
if mod_vals and mod_vals[1] then
footnotes = footnotes or {}
for _, val in ipairs(mod_vals) do
insert(footnotes, "[" .. mod_prefix .. ":" .. val .. "]")
end
end
end
mods_to_footnote("q", termobj.q)
mods_to_footnote("qq", termobj.qq)
mods_to_footnote("l", termobj.l)
mods_to_footnote("ll", termobj.ll)
mods_to_footnote("ref", termobj.refs)
mods_to_footnote("id", termobj.id and {termobj.id} or nil)
formobj.footnotes = footnotes
return formobj
end
local recognized_multi_mods = {
q = "q",
qq = "qq",
l = "l",
ll = "ll",
ref = "refs",
}
local recognized_single_mods = {
id = "id",
}
function export.add_footnote_to_termobj(termobj, footnote)
local stripped_footnote = footnote:match("^%[(.*)%]$")
if not stripped_footnote then
error("Internal error: Footnote should be surrounded by brackets at this stage: " .. footnote)
end
local prefix, rest = stripped_footnote:match("^([a-z]+):(.+)$")
local field, is_multi
if prefix then
if recognized_multi_mods[prefix] then
field = recognized_multi_mods[prefix]
is_multi = true
elseif recognized_single_mods[prefix] then
field = recognized_single_mods[prefix]
is_multi = false
end
end
if not field then
rest = stripped_footnote
field = "l"
is_multi = true
end
if is_multi then
if not termobj[field] then
termobj[field] = {}
end
insert(termobj[field], rest)
else
if termobj[field] and termobj[field] ~= rest then
error(("Can't set two values for '%s': '%s' and '%s'"):format(field, termobj[field], rest))
end
termobj[field] = rest
end
end
function export.convert_formobj_to_termobj(formobj)
local termobj = {
term = formobj.form,
tr = formobj.translit,
}
if formobj.footnotes then
for _, footnote in ipairs(formobj.footnotes) do
export.add_footnote_to_termobj(termobj, footnote)
end
end
return termobj
end
local function extract_termobj_field_modifiers(fieldval)
return fieldval:match("^([*+]?)(.*)$")
end
function export.remove_termobj_field_modifiers(termobj)
local function remove_field_modifiers(field)
if termobj[field] and termobj[field][1] then
local any_field_modifiers = false
for _, val in ipairs(termobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if field_mods ~= "" then
any_field_modifiers = true
break
end
end
local new_field = {}
if any_field_modifiers then
for _, val in ipairs(termobj[field]) do
local _, field_without_mods = extract_termobj_field_modifiers(val)
insert_if_not(new_field, field_without_mods)
end
termobj[field] = new_field
end
end
end
remove_field_modifiers("q")
remove_field_modifiers("qq")
remove_field_modifiers("l")
remove_field_modifiers("ll")
remove_field_modifiers("refs")
end
function export.insert_termobj_combining_duplicates(destobjs, termobj)
for _, destobj in ipairs(destobjs) do
if destobj.term == termobj.term and destobj.tr == termobj.tr then
-- Form already present; maybe combine footnotes.
local function combine_field_values(field)
if termobj[field] and termobj[field][1] then
-- Check to see if there are existing values with *; if so, remove them.
if destobj[field] and destobj[field][1] then
local any_values_with_asterisk = false
for _, val in ipairs(destobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if field_mods:find("%*") then
any_values_with_asterisk = true
break
end
end
if any_values_with_asterisk then
local filtered_values = {}
for _, val in ipairs(destobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if not field_mods:find("%*") then
insert(filtered_values, val)
end
end
if filtered_values[1] then
destobj[field] = filtered_values
else
destobj[field] = nil
end
end
end
local any_footnotes_with_plus = false
for _, val in ipairs(termobj[field]) do
local field_mods, _ = extract_termobj_field_modifiers(val)
if field_mods:find("%+") then
any_footnotes_with_plus = true
break
end
end
if any_footnotes_with_plus then
if not destobj[field] then
destobj[field] = {}
else
destobj[field] = shallow_copy(destobj[field])
end
for _, val in ipairs(termobj[field]) do
local already_seen = false
local field_mods, field_without_mods = extract_termobj_field_modifiers(val)
if field_mods:find("%+") then
for _, existing_val in ipairs(destobj[field]) do
local _, existing_field_without_mods =
extract_termobj_field_modifiers(existing_val)
if existing_field_without_mods == field_without_mods then
already_seen = true
break
end
end
if not already_seen then
insert(destobj[field], val)
end
end
end
end
end
end
combine_field_values("q")
combine_field_values("qq")
combine_field_values("l")
combine_field_values("ll")
combine_field_values("refs")
if destobj.id and termobj.id and destobj.id ~= termobj.id then
-- FIXME: We probably want to pass in an error function
error(("Can't specify two different ID's %s and %s when combining objects"):format(termobj.id, destobj.id))
end
destobj.id = destobj.id or termobj.id
return
end
end
insert(destobjs, termobj)
end
export.allowed_special_indicators = {
["first"] = true,
["first-second"] = true,
["first-last"] = true,
["second"] = true,
["last"] = true,
["each"] = true,
["+"] = true, -- requests the default behavior with preposition handling
}
--[==[
Check for special indicators (values such as {"+first"} or {"+first-last"} that are used in a `pl`, `f`, etc. argument
and indicate how to inflect a multiword term). If `form` is such an indicator, the return value is `form` minus
the initial `+` sign; otherwise, if form begins with a `+` sign, an error is thrown; otherwise the return value is nil.
]==]
function export.get_special_indicator(form, noerror)
if form:find("^%+") then
form = form:gsub("^%+", "")
if not export.allowed_special_indicators[form] then
if noerror then
return nil
end
local indicators = {}
for indic, _ in pairs(export.allowed_special_indicators) do
insert(indicators, "+" .. indic)
end
sort(indicators)
error("Special inflection indicator beginning with '+' can only be " ..
mw.text.listToText(indicators) .. ": +" .. form)
end
return form
end
return nil
end
local function add_endings(bases, endings)
local retval = {}
if type(bases) ~= "table" then
bases = {bases}
end
if type(endings) ~= "table" then
endings = {endings}
end
for _, base in ipairs(bases) do
for _, ending in ipairs(endings) do
insert(retval, base .. ending)
end
end
return retval
end
--[==[
Inflect a possibly multiword or hyphenated term `form` using the function `inflect`, which is a function of one argument
that is called on a single word to inflect and should return either the inflected word or a list of inflected words.
`special` indicates how to inflect the multiword term and should be e.g. {"first"} to inflect only the first word,
{"first-last"} to inflect the first and last words, {"each"} to inflect each word, etc. See `allowed_special_indicators`
above for the possibilities. If `special` is `+`, or is omitted and the term is multiword (i.e. containing a space
character), and `prepositions` is supplied, the function checks for multiword or hyphenated terms containing the
prepositions in `prepositions`, e.g. Italian [[senso di marcia]] or [[medaglia d'oro]] or Portuguese
[[tartaruga-do-mar]]. If such a term is found, only the first word is inflected. Otherwise, the default is
{"first-last"}. `prepositions` is a list of Lua patterns matching prepositions. The patterns will automatically have the
separator character (space or hyphen) added to the left side but not the right side, so they should contain a space
character (which will automatically be converted to the appropriate separator) on the right side unless the preposition
is joined on the right side with an apostrophe. Examples of preposition patterns for Italian are {"di "}, {"sull'"} and
{"d?all[oae] "} (which matches {"dallo "}, {"dalle "}, {"alla "}, etc.).
The return value is always either a list of inflected multiword or hyphenated terms, or nil if `special` is omitted
and `form` is not multiword. (If `special` is specified and `form` is not multiword or hyphenated, an error results.)
]==]
function export.handle_multiword(form, special, inflect, prepositions, sep)
sep = sep or form:find(" ") and " " or "%-"
local raw_sep = sep == " " and " " or "-"
-- Used to add regex version of separator in the replacement portion of ugsub() or :gsub()
local sep_replacement = sep == " " and " " or "%%-"
-- Given a Lua pattern, replace space with the appropriate separator.
local function hack_re(re)
if sep == " " then
return re
end
return (re:gsub(" ", sep_replacement))
end
if special == "first" then
local first, rest = form:match(hack_re("^(.-)( .*)$"))
if not first then
error("Special indicator 'first' can only be used with a multiword term: " .. form)
end
return add_endings(inflect(first), rest)
elseif special == "second" then
local first, second, rest = form:match(hack_re("^([^ ]+ )([^ ]+)( .*)$"))
if not first then
error("Special indicator 'second' can only be used with a term with three or more words: " .. form)
end
return add_endings(add_endings({first}, inflect(second)), rest)
elseif special == "first-second" then
local first, space, second, rest = form:match(hack_re("^([^ ]+)( )([^ ]+)( .*)$"))
if not first then
error("Special indicator 'first-second' can only be used with a term with three or more words: " .. form)
end
return add_endings(add_endings(add_endings(inflect(first), space), inflect(second)), rest)
elseif special == "each" then
local terms = split(form, sep)
if #terms < 2 then
error("Special indicator 'each' can only be used with a multiword term: " .. form)
end
for i, term in ipairs(terms) do
terms[i] = inflect(term)
if i > 1 then
terms[i] = add_endings(raw_sep, terms[i])
end
end
local result = ""
for _, term in ipairs(terms) do
result = add_endings(result, term)
end
return result
elseif special == "first-last" then
local first, middle, last = form:match(hack_re("^(.-)( .* )(.-)$"))
if not first then
first, middle, last = form:match(hack_re("^(.-)( )(.*)$"))
end
if not first then
error("Special indicator 'first-last' can only be used with a multiword term: " .. form)
end
return add_endings(add_endings(inflect(first), middle), inflect(last))
elseif special == "last" then
local rest, last = form:match(hack_re("^(.* )(.-)$"))
if not rest then
error("Special indicator 'last' can only be used with a multiword term: " .. form)
end
return add_endings(rest, inflect(last))
elseif special and special ~= "+" then
error("Unrecognized special=" .. special)
end
-- Only do default behavior if special indicator '+' explicitly given or separator is space; otherwise we will
-- break existing behavior with hyphenated words.
if (special == "+" or sep == " ") and form:find(sep) then
if prepositions then
-- check for prepositions in the middle of the word; do it this way so we can handle
-- more than one word before the preposition (and usually inflect each word)
for _, prep in ipairs(prepositions) do
local first, space_prep_rest = umatch(form, hack_re("^(.-)( " .. prep .. ".*)$"))
if first then
return add_endings(inflect(first), space_prep_rest)
end
end
end
-- multiword or hyphenated expressions default to first-last; we need to pass in the separator to avoid
-- problems with multiword terms containing hyphens in the individual words
return export.handle_multiword(form, "first-last", inflect, prepositions, sep)
end
return nil
end
local function link_hyphen_split_component(word, data)
if data.link_hyphen_split_component then
return data.link_hyphen_split_component(word)
else
return "[[" .. word .. "]]"
end
end
-- Default function to split a word on apostrophes. Don't split apostrophes at the beginning or end of a word (e.g.
-- [['ndrangheta]] or [[po']]). Handle multiple apostrophes correctly, e.g. [[l'altr'ieri]] -> [[l']][altr']][[ieri]].
function export.default_split_apostrophe(word, data)
local apostrophe_parts = split(word, "'", true, true)
local linked_apostrophe_parts = {}
local apostrophes_at_beginning = ""
local i = 1
-- Apostrophes at beginning get attached to the first word after (which will always exist but may
-- be blank if the word consists only of apostrophes).
while i < #apostrophe_parts do -- <, not <=, in case the word consists only of apostrophes
local apostrophe_part = apostrophe_parts[i]
i = i + 1
if apostrophe_part == "" then
apostrophes_at_beginning = apostrophes_at_beginning .. "'"
else
break
end
end
apostrophe_parts[i] = apostrophes_at_beginning .. apostrophe_parts[i]
-- Now, do the remaining parts. A blank part indicates more than one apostrophe in a row; we join
-- all of them to the preceding word.
while i <= #apostrophe_parts do
local apostrophe_part = apostrophe_parts[i]
if apostrophe_part == "" then
linked_apostrophe_parts[#linked_apostrophe_parts] =
linked_apostrophe_parts[#linked_apostrophe_parts] .. "'"
elseif i == #apostrophe_parts then
insert(linked_apostrophe_parts, apostrophe_part)
else
insert(linked_apostrophe_parts, apostrophe_part .. "'")
end
i = i + 1
end
for j, tolink in ipairs(linked_apostrophe_parts) do
linked_apostrophe_parts[j] = link_hyphen_split_component(tolink, data)
end
return concat(linked_apostrophe_parts)
end
--[=[
Auto-add links to a word that should not have spaces but may have hyphens and/or apostrophes. We split off final
punctuation, then split on hyphens if `data.split_hyphen` is given, and also split on apostrophes if
`data.split_apostrophe` is given. We only split on hyphens if they are in the middle of the word, not at the beginning
or end (hyphens at the beginning or end indicate suffixes or prefixes, respectively). `include_hyphen_prefixes`, if
given, is a set of prefixes (not including the final hyphen) where we should include the final hyphen in the prefix.
Hence, e.g. if "anti" is in the set, a Portuguese word like [[anti-herói]] "anti-hero" will be split [[anti-]][[herói]]
(whereas a word like [[código-fonte]] "source code" will be split as [[código]]-[[fonte]]).
If `data.split_apostrophe` is specified, we split on apostrophes unless `data.no_split_apostrophe_words` is given and
the word is in the specified set, such as French [[c'est]] and [[quelqu'un]]. If `data.split_apostrophe` is true, the
default algorithm applies, which splits on all apostrophes except those at the beginning and end of a word (as in
Italian [['ndrangheta]] or [[po']]), and includes the apostrophe in the link to its left (so we auto-split French
[[l'eau]] as [[l']][[eau]] and [[l'altr'ieri]] as [[l']][altr']][[ieri]]). If `data.split_apostrophe` is specified
but not `true`, it should be a function of one argument that does custom apostrophe-splitting. The argument is the word
to split, and the return value should be the split and linked word.
]=]
local function add_single_word_links(space_word, data, term_has_spaces)
local space_word_no_punct, punct
local punct_pattern = data.punctuation
if punct_pattern and is_callable(punct_pattern) then
space_word_no_punct, punct = punct_pattern(space_word)
else
if punct_pattern == nil then
punct_pattern = "[,;:?!]"
end
space_word_no_punct, punct = umatch(space_word, "^(.*)(" .. punct_pattern .. ")$")
end
space_word_no_punct = space_word_no_punct or space_word
punct = punct or ""
local words
if space_word_no_punct:sub(1, 1) == "-" or space_word_no_punct:sub(-1) == "-" then
-- don't split prefixes and suffixes
words = {space_word_no_punct}
else
local splitter
if term_has_spaces then
splitter = data.split_hyphen_when_space
else
splitter = data.split_hyphen_when_no_space
end
if is_callable(splitter) then
words = splitter(space_word_no_punct)
if type(words) == "string" then
return words .. punct
end
end
end
if not words then
local split_hyphen
if term_has_spaces then
split_hyphen = data.split_hyphen_when_space
else
split_hyphen = data.split_hyphen_when_no_space
if split_hyphen == nil then -- default to true; use `false` to avoid this
split_hyphen = true
end
end
if split_hyphen then
words = split(space_word_no_punct, "-", true, true)
else
words = {space_word_no_punct}
end
end
local linked_words = {}
for j, word in ipairs(words) do
if j < #words and data.include_hyphen_prefixes and data.include_hyphen_prefixes[word] then
word = "[[" .. word .. "-]]"
elseif j > 1 and data.include_hyphen_suffixes and data.include_hyphen_suffixes[word] then
word = "[[-" .. word .. "]]"
else
-- Don't split on apostrophes if the word is in `no_split_apostrophe_words`.
if (not data.no_split_apostrophe_words or not data.no_split_apostrophe_words[word]) and
data.split_apostrophe and word:find("'", nil, true) then
if data.split_apostrophe == true then
word = export.default_split_apostrophe(word, data)
else -- custom apostrophe splitter/linker
word = data.split_apostrophe(word)
end
elseif word ~= "" then -- avoid -[[]]- (e.g. f--k)
word = link_hyphen_split_component(word, data)
end
if j < #words then
word = word .. "-"
end
end
insert(linked_words, word)
end
return concat(linked_words) .. punct
end
--[=[
Auto-add links to a multiword term. `data` contains fields customizing how to do this. By default we proceed as follows:
(1) If the term already has embedded links in it, they are left unchanged.
(2) Otherwise, if there are spaces present, we split on spaces and link each word separately.
(3) If a given space-separated component ends in punctuation (defaulting to [,;:?!]), it is separated off, the remainder
of the algorithm run, and the punctuation pasted back on.
(4) If there are hyphens in a given space-separated component, we may link each hyphenated term separately depending
on the settings in `data`. Normally the hyphens are not included in the linked terms, but this can be overridden
for specific prefixes and/or suffixes. By default, if there are spaces in the multiword term, we do not link
hyphenated components (because of cases like "boire du petit-lait" where "petit-lait" should be linked as a whole),
but do so otherwise (e.g. for "avant-avant-hier"); this can overridden for cases like "croyez-le ou non".
Cases where only some of the hyphens should be split can always be handled by explicitly specifying the head (e.g.
"Nord-Pas-de-Calais" given as head=[[Nord]]-[[Pas-de-Calais]]).
(5) If there are apostrophes in a given component, we may link each apostrophe-separated term separately depending
on the settings in `data`, including the apostrophe in the link to its left (so we split "de l'eau" as
"[[de]] [[l']][[eau]]").
The settings in `data` are as follows:
`split_hyphen_when_no_space`: Whether to split on hyphens when the term has no spaces. Defaults to true if set to `nil`.
This can be a function of one argument, to implement a custom splitting algorithm for hyphen-separated terms. If
this returns [FIXME: FINISH ME ...]
If `data.split_apostrophe` is specified, we split on apostrophes unless `data.no_split_apostrophe_words` is given and
the word is in the specified set, such as French [[c'est]] and [[quelqu'un]]. If `data.split_apostrophe` is true, the
default algorithm applies, which splits on all apostrophes except those at the beginning and end of a word (as in
Italian [['ndrangheta]] or [[po']]), and includes the apostrophe in the link to its left (so we auto-split French
[[l'eau]] as [[l']][[eau]] and [[l'altr'ieri]] as [[l']][altr']][[ieri]]). If `data.split_apostrophe` is specified
but not `true`, it should be a function of one argument that does custom apostrophe-splitting. The argument is the word
to split, and the return value should be the split and linked word.
We don't always split on hyphens because of cases like "boire du petit-lait" where "petit-lait" should be linked as a
whole, but provide the option to do it for cases like "croyez-le ou non". If there's no space, however, then it makes
sense to split on hyphens by `no_split_apostrophe_words` and `include_hyphen_prefixes` allow for special-case handling
of particular words and are as described in the comment above add_single_word_links().
]=]
function export.add_links_to_multiword_term(term, data)
if term:match("[%[%]]") then
return term
end
local words = split(term, " ", true, true)
local term_has_spaces = #words > 1
local linked_words = {}
for _, word in ipairs(words) do
insert(linked_words, add_single_word_links(word, data, term_has_spaces))
end
local retval = concat(linked_words, " ")
-- If we ended up with a single link consisting of the entire term,
-- remove the link.
return retval:match("^%[%[([^%[%]]*)%]%]$") or retval
end
local function canonicalize_begin_end_spec(spec)
local from, to = spec:match("^(.-):(.*)$")
if not from then
from = spec
to = ""
end
return from, to
end
--[==[
Given a `linked_term` that is the output of add_links_to_multiword_term(), apply modifications as given in
`modifier_spec` to change the link destination of subterms (normally single-word non-lemma forms; sometimes
collections of adjacent words). This is usually used to link non-lemma forms to their corresponding lemma, but can
also be used to replace a span of adjacent separately-linked words to a single multiword lemma. The format of
`modifier_spec` is one or more semicolon-separated subterm specs, where each such spec is of the form
SUBTERM:DEST, where SUBTERM is one or more words in the `linked_term` but without brackets in them, and DEST is the
corresponding link destination to link the subterm to. Any occurrence of ~ in DEST is replaced with SUBTERM.
Alternatively, a single modifier spec can be of the form BEGIN[FROM:TO], which is equivalent to writing
BEGINFROM:BEGINTO (see example below).
For example, given the source phrase [[il bue che dice cornuto all'asino]] "the pot calling the kettle black"
(literally "the ox that calls the donkey horned/cuckolded"), the result of calling add_links_to_multiword_term()
is [[il]] [[bue]] [[che]] [[dice]] [[cornuto]] [[all']][[asino]]. With a modifier_spec of 'dice:dire', the result
is [[il]] [[bue]] [[che]] [[dire|dice]] [[cornuto]] [[all']][[asino]]. Here, based on the modifier spec, the
non-lemma form [[dice]] is replaced with the two-part link [[dire|dice]].
Another example: given the source phrase [[chi semina vento raccoglie tempesta]] "sow the wind, reap the whirlwind"
(literally (he) who sows wind gathers [the] tempest"). The result of calling add_links_to_multiword_term() is
[[chi]] [[semina]] [[vento]] [[raccoglie]] [[tempesta]], and with a modifier_spec of 'semina:~re; raccoglie:~re',
the result is [[chi]] [[seminare|semina]] [[vento]] [[raccogliere|raccoglie]] [[tempesta]]. Here we use the ~
notation to stand for the non-lemma form in the destination link.
A more complex example is [[se non hai altri moccoli puoi andare a letto al buio]], which becomes
[[se]] [[non]] [[hai]] [[altri]] [[moccoli]] [[puoi]] [[andare]] [[a]] [[letto]] [[al]] [[buio]] after calling
add_links_to_multiword_term(). With the following modifier_spec:
'hai:avere; altr[i:o]; moccol[i:o]; puoi: potere; andare a letto:~; al buio:~', the result of applying the spec is
[[se]] [[non]] [[avere|hai]] [[altro|altri]] [[moccolo|moccoli]] [[potere|puoi]] [[andare a letto]] [[al buio]].
Here, we rely on the alternative notation mentioned above for e.g. 'altr[i:o]', which is equivalent to 'altri:altro',
and link multiword subterms using e.g. 'andare a letto:~'. (The code knows how to handle multiword subexpressions
properly, and if the link text and destination are the same, only a single-part link is formed.)
]==]
function export.apply_link_modifiers(linked_term, modifier_spec, lang)
local split_modspecs = split(modifier_spec, "%s*;%s*")
for j, modspec in ipairs(split_modspecs) do
local id
if modspec:find("<") then
local rest
rest, id = modspec:match("^(.*)<id:(.-)>$")
if rest then
modspec = rest
end
end
local subterm, dest, otherlang
local begin_spec, rest, end_spec = modspec:match("^%[(.-)%]([^:]*)%[(.-)%]$")
if begin_spec then
local begin_from, begin_to = canonicalize_begin_end_spec(begin_spec)
local end_from, end_to = canonicalize_begin_end_spec(end_spec)
subterm = begin_from .. rest .. end_from
dest = begin_to .. rest .. end_to
end
if not subterm then
rest, end_spec = modspec:match("^([^:]*)%[(.-)%]$")
if rest then
local end_from, end_to = canonicalize_begin_end_spec(end_spec)
subterm = rest .. end_from
dest = rest .. end_to
end
end
if not subterm then
begin_spec, rest = modspec:match("^%[(.-)%]([^:]*)$")
if begin_spec then
local begin_from, begin_to = canonicalize_begin_end_spec(begin_spec)
subterm = begin_from .. rest
dest = begin_to .. rest
end
end
if not subterm then
subterm, dest = modspec:match("^(.-)%s*:%s*(.*)$")
if subterm and subterm ~= "^" and subterm ~= "$" then
local langdest
-- Parse off an initial language code (e.g. 'en:Higgs', 'la:minūtia' or 'grc:σκατός'). Also handle
-- Wikipedia prefixes ('w:Abatemarco' or 'w:it:Colle Val d'Elsa').
otherlang, langdest = dest:match("^([A-Za-z0-9._-]+):([^ ].*)$")
if otherlang == "w" then
local foreign_wikipedia, foreign_term = langdest:match("^([A-Za-z0-9._-]+):([^ ].*)$")
if foreign_wikipedia then
otherlang = otherlang .. ":" .. foreign_wikipedia
langdest = foreign_term
end
dest = ("%s:%s"):format(otherlang, langdest)
otherlang = nil
elseif otherlang then
otherlang = get_lang(otherlang, true, "allow etym")
dest = langdest
end
end
end
if not subterm then
if modspec == "?" or modspec == "!" then
subterm = "$"
dest = modspec
elseif modspec == "..." or modspec == "...?" then
subterm = "$"
dest = " " .. modspec
elseif modspec:find("^[A-Z]$") then
-- X, Y, etc. by themselves are unlinked, to help with snowclones
subterm = modspec
dest = "_"
else
subterm = modspec
dest = "~"
end
end
if subterm == "^" then
linked_term = dest:gsub("_", " ") .. linked_term
elseif subterm == "$" then
linked_term = linked_term .. dest:gsub("_", " ")
else
if subterm:find("[", nil, true) then
error(("Subterm '%s' in modifier spec '%s' cannot have brackets in it"):format(
escape_wikicode(subterm), escape_wikicode(modspec)))
end
local escaped_subterm = pattern_escape(subterm)
local subterm_re = "%[%[" .. escaped_subterm:gsub("(%%?[ ',%-])", "%%]*%1%%[*") .. "%]%]"
local expanded_dest
if dest:find("~", nil, true) then
expanded_dest = dest:gsub("~", replacement_escape(subterm))
else
expanded_dest = dest
end
if otherlang then
expanded_dest = expanded_dest .. "#" .. otherlang:getCanonicalName()
end
local subterm_replacement
if expanded_dest == "_" then
subterm_replacement = subterm
if id then
error("Can't supply <id:...> with an unlinked subterm")
end
if otherlang then
error("Can't supply prefixed language with an unlinked subterm")
end
elseif id or otherlang then
if id and expanded_dest:find("[", nil, true) then
error("Can't supply <id:...> with destination with embedded brackets")
end
subterm_replacement = require(links_module).language_link {
lang = otherlang or lang,
term = expanded_dest,
alt = subterm,
id = id,
}
elseif expanded_dest:find("[", nil, true) then
-- Use the destination directly if it has brackets in it (e.g. to put brackets around parts of a word).
subterm_replacement = expanded_dest
elseif expanded_dest == subterm then
subterm_replacement = "[[" .. subterm .. "]]"
else
subterm_replacement = "[[" .. expanded_dest .. "|" .. subterm .. "]]"
end
local escaped_subterm_replacement = replacement_escape(subterm_replacement)
local replaced_linked_term = ugsub(linked_term, subterm_re, escaped_subterm_replacement)
if replaced_linked_term == linked_term then
mw.log(("Attempted to replace %s with %s in %s"):format(subterm_re, escaped_subterm_replacement, linked_term))
error(("Subterm '%s' could not be located in %slinked expression %s, or replacement same as subterm"):format(
subterm, j > 1 and "intermediate " or "", escape_wikicode(linked_term)))
else
linked_term = replaced_linked_term
end
end
end
return linked_term
end
local inflection_to_cats = {
plural = {
filter_plpos = function(plpos)
-- plurals also occur with determiners, adjectives etc. and we don't want to generate categories like
-- 'countable determiners', 'countable adjectives', etc. Note that the passed-in `plpos` has `proper nouns`
-- converted to `nouns`.
return plpos == "nouns"
end,
yes_cats = {"countable PLPOS"},
no_cats = {"uncountable PLPOS"},
},
comparative = {
yes_cats = {"comparable PLPOS"},
no_cats = {"uncomparable PLPOS"},
},
["female equivalent"] = {
yes_cats = {"PLPOS with other-gender equivalents"},
},
["male equivalent"] = {
yes_cats = {"PLPOS with other-gender equivalents"},
},
}
local Headdata = {}
function Headdata:get_canonicalized_plpos()
return (self.pos_category:gsub("proper noun", "noun"))
end
function Headdata:canonicalize_category(category)
if type(category) ~= "string" then
return category
end
if category:find("PLPOS") then
local plpos = self:get_canonicalized_plpos()
category = category:gsub("PLPOS", plpos)
end
return self.langfullname .. " " .. category
end
function Headdata:canonicalize_categories(categories)
if not categories then
return categories
end
local canon_cats = {}
for _, cat in ipairs(categories) do
insert(canon_cats, self:canonicalize_category(cat))
end
return canon_cats
end
--[==[
Insert a category into the `categories` list in the headword `data` structure. `category` is normally a string naming
the category, which will have the language prepended to it and any occurrences of `PLPOS` in the string replaced with
the actual plural part of speech (with some canonicalization; specifically, `proper nouns` is converted to `nouns` when
replacing `PLPOS`). Alternatively, `category` can be a table of the form accepted by `format_categories()` in
[[Module:utilities]]. This can be used, for example, to specify a sort key or sort base or to insert a category that
does not have the language prepended to it. The structure has the following fields:
* `cat` (the full category name, not further processed);
* `lang` (an optional language, overriding the overall headword language);
* `sort_key` (optional sort key);
* `sort_base` (optional sort base);
* `sc` (optional overriding script).
]==]
function Headdata:insert_category(category)
insert(self.categories, self:canonicalize_category(category))
end
--[==[
Validate the genders in `genders` (a list of gender spec objects, as produced by {type = "genders"} in
[[Module:parameters]] and accepted by [[Module:gender and number]]), checking that all specified genders are in the list
given in `valid_genders`. Optional `props` controls how the validation happens. In particular, unless `props.no_augment`
is given, then for any gender beginning with `m`, if a corresponding gender beginning with `f` occurs, analogous genders
beginning with `mf`, `mfbysense` and `mfequiv` are also allowed. For example, if `m-d` (masculine dual) and `f-d`
(feminine dual) both occur, genders `mf-d`, `mfbysense-d` and `mfequiv-d` are also allowed. If a disallowed gender is
given, an error occurs, giving the disallowed gender along with the list of all allowed genders.
]==]
function Headdata:validate_genders(genders, valid_genders, props)
if not genders then
return
end
props = props or {}
local gender_type, no_augment = props.gender_type, props.no_augment
gender_type = gender_type or "headword"
local valid_gender_set = require(table_module).listToSet(valid_genders)
local augmented_gender_set
if no_augment then
augmented_gender_set = valid_gender_set
else
augmented_gender_set = {}
for g, _ in pairs(valid_gender_set) do
augmented_gender_set[g] = true
if g:find("^m") and not g:find("^mf") and valid_gender_set[g:gsub("^m", "f")] then
augmented_gender_set[g:gsub("^m", "mf")] = true
augmented_gender_set[g:gsub("^m", "mfbysense")] = true
augmented_gender_set[g:gsub("^m", "mfequiv")] = true
end
end
end
for _, gspec in ipairs(genders) do
local g = gspec.spec
if not augmented_gender_set[g] then
local valid_gender_list = {}
for valid_g, _ in pairs(augmented_gender_set) do
insert(valid_gender_list, valid_g)
end
table.sort(valid_gender_list)
error(("Invalid %s gender: %s; expected one of %s"):format(gender_type, g,
mw.text.listToText(valid_gender_list)))
end
end
end
--[==[
Parse an inflection specified in `field`, the name of a parameter holding an inflection. If the parameter is numeric,
the field should be given as a number (as with the `params` structure passed to [[Module:parameters]]), not a string
containing the representation of a number. The field can specify multiple comma-separated terms, and each term can have
associated inline modifiers that will be parsed (unless there is top-level HTML in the parameter, i.e. HTML not
contained inside an inline modifier, e.g. as may be generated by using {{tl|l}} or similar template inside a parameter).
This is a wrapper around the top-level `parse_term_with_modifiers()` function. `props` is an optional structure
containing additional properties, including all additional properties documented for the top-level
`parse_term_with_modifiers()` function.
If the parameter in `field` is unspecified, the return value of this function will be an empty list, not {nil}, so it
is always safe to iterate over the return value.
By default, the allowed modifiers are the same as for `parse_term_with_modifiers()`, except that (normally) the
`<tr:...>` modifier will be allowed if `include_tr` was specified in the original call to `process_headword()`, and
likewise `<sc:...>` will be allowed if `include_sc` was specified in the original call to `process_headword()`. If you
pass in your own `include_mods` list of additional allowed modifiers, it will (normally) automatically be augmented with
{"tr"} and/or {"sc"} if `include_tr` and/or `include_sc` was specified when calling `process_headword()`. To disable
automatic augmentation of the {"tr"} and {"sc"} modifiers (whether or not you specify an `include_mods` property),
specify {no_augment_include_mods = true} in `props`.
]==]
function Headdata:parse_inflection(field, props)
local val = self.process_props.args[field]
if not val then
return {}
end
props = props and shallow_copy(props) or {}
local include_mods = props.include_mods
local data = self.process_props.data
if not props.no_augment_include_mods and (data.include_tr or data.include_sc) then
include_mods = include_mods and shallow_copy(include_mods) or {}
if data.include_tr then
insert_if_not(include_mods, "tr")
end
if data.include_sc then
insert_if_not(include_mods, "sc")
end
end
props.val = val
props.paramname = field
props.splitchar = props.splitchar or ","
props.include_mods = include_mods
return export.parse_term_with_modifiers(props) or {}
end
--[==[
Insert previously-parsed terms into the `inflections` of the headword `data` structure. This is a wrapper around
the top-level `insert_inflection()` function. `terms` is the list of parsed terms. (If {nil}, nothing happens unless
`request` is set in `props`.) `label` is the the label that the inflections are given; any parts of the label surrounded
in `<<...>>` are linked to the glossary. (If the contents of `<<...>>` contain a `|` in them, they are a two-part link.)
`props` is an optional structure containing additional properties, including all additional properties documented for
the top-level `insert_inflection()` function.
Unless `no_augment_cats` is given in `props`, certain labels automatically trigger the insertion of additional
categories in specific circumstances. This is controlled by the `inflection_to_cats` structure in
[[Module:headword utilities]]. For example, if the part of speech is {"nouns"} or {"proper nouns"} and the label (after
removing any links and `<<...>>` glossary specs) is {"plural"}, an additional category
<code><var>lang</var> countable nouns</code> will be added if a plural value is given (i.e. the value is not {"-"}). If
the value is {"-"} (which indicates that there is no plural and triggers the insertion of the fixed inflection label
{"no plural"}), <code><var>lang</var> uncountable nouns</code> will be inserted instead, and if both {"-"} and a value
are given (which triggers the insertion of the {"usually no plural"} fixed inflection label), both categories are added.
Similar categories are inserted when a comparative is given (with a label {"comparative"}), and if the label is
{"female equivalent"} or {"male equivalent"} and the value is not {"-"}, a category such as
<code><var>lang</var> nouns with other-gender equivalents</code> is inserted.
]==]
function Headdata:insert_inflection(terms, label, props)
props = props and shallow_copy(props) or {}
if not props.no_augment_cats then
local bare_label = label
if bare_label:find("[[", nil, true) then
bare_label = require(links_module).remove_links(bare_label)
end
if bare_label:find("<<", nil, true) then
bare_label = bare_label:gsub("<<.-|(.-)>>", "%1"):gsub("<<(.-)>>", "%1")
end
local cats = inflection_to_cats[bare_label]
if cats then
if not cats.filter_plpos or cats.filter_plpos(self:get_canonicalized_plpos()) then
if props.yes_cats == nil then
props.yes_cats = self:canonicalize_categories(cats.yes_cats)
end
if props.usually_yes_cats == nil then
props.usually_yes_cats = self:canonicalize_categories(cats.usually_yes_cats)
end
if props.no_cats == nil then
props.no_cats = self:canonicalize_categories(cats.no_cats)
end
end
end
end
props.headdata = self
props.terms = terms
props.label = label
return export.insert_inflection(props)
end
--[==[
Insert a "fixed" inflection (a label without associated values) into the `inflections` table of the headword `data`
structure, labeled according to `label` (which can have glossary links in it specified using `<<...>>`, exactly as for
`:insert_inflection()`). An example label (from {{tl|mn-noun}} in [[Module:mn-headword]]) is {"hidden-g declension"},
specifying that the noun belongs to the hidden-''g'' declension. This is a direct wrapper around the top-level function
`insert_fixed_inflection()`; see that function for more details on optional `props`.
]==]
function Headdata:insert_fixed_inflection(label, props)
props = props and shallow_copy(props) or {}
props.headdata = self
props.label = label
export.insert_fixed_inflection(props)
end
--[==[
Parse the inflection(s) specified in `field` and insert them into the `inflections` table of the headword `data`
structure, labeled according to `label`. This is equivalent to calling {terms = data:parse_inflection(field, props)}
followed by {return data:insert_inflection(terms, label, props)} and behaves the same as the combination of those two
functions. See their documentation for more details.
]==]
function Headdata:parse_and_insert_inflection(field, label, props)
local terms = self:parse_inflection(field, props)
return self:insert_inflection(terms, label, props)
end
-- Generate an inflection that may be specified explicitly or defaulted (which involves looping over the specified or
-- defaulted heads and determining the script of each one, since the formation of the default depends on the script).
-- `data` is the data object passed into the POS handler. `terms` is the list of terms to process. Those where the term
-- itself is not `+` will be returned unchanged, while those where the term is `+` will be handled by generating the
-- appropriate inflections from the headwords using `make_inflection` (which is passed three arguments, `head`, `tr` and
-- `sccode`, i.e. the script code of `head`) and should return two values, term and translit, either of which can be
-- nil. A nil head will be ignored, and otherwise the qualifiers/labels/etc. specified on the `+` term will be combined
-- with the qualifiers/labels/etc. specified on the head. The return value is a list of inflections where no requests
-- for the default inflection remain.
function Headdata:resolve_special(terms, handle_special, props)
props = props or {}
local infls = {}
local is_special = props.is_special or function(infl) return infl.term == "+" end
for _, termobj in ipairs(terms) do
if not is_special(termobj) then
insert(infls, termobj)
else
for _, headobj in ipairs(self.heads) do
local head = headobj.term or self.pagename
local head_no_links
if props.with_links then
head = head:find("%[") and head or require(headword_module).add_multiword_links(head, not headobj.term)
head_no_links = require(links_module).remove_links(head)
else
head = require(links_module).remove_links(head)
head_no_links = head
end
local newterms = handle_special {
head = head,
tr = headobj.tr,
infl = termobj,
sc = self.lang:findBestScript(head_no_links),
}
if newterms then
newterms = export.canonicalize_termobj_list(newterms)
for _, newterm in ipairs(newterms) do
if not props.no_combine_handle_special_retval_with_origin then
export.combine_termobj_qualifiers_labels(newterm, termobj)
end
if not props.no_combine_handle_special_retval_with_head then
export.combine_termobj_qualifiers_labels(newterm, headobj)
end
insert(infls, newterm)
end
end
end
end
end
return infls
end
--[==[
Add the current page to a tracking page named `Wiktionary:Tracking/``lang``-headword/``page```, where ``lang`` is the
language code of the current language. For example, if the current language is `mak` and `page` is {"redundant-lon"},
the current page will get added to the tracking page `Wiktionary:Tracking/mak-headword/redundant-lon`. All pages added
to that tracking page can be seen by going to [[Special:WhatLinksHere/Wiktionary:Tracking/mak-headword/redundant-lon]].
This is typically used to track issues occurring in user-specified parameters that do not rise to the level of errors
(e.g. redundant parameters, deprecated usages or other dispreferred values).
]==]
function Headdata:track(page)
return require(debug_track_module)(self.langcode .. "-headword/" .. page)
end
local boolean_param = {type = "boolean"}
--[==[
Process an arbitrary headword in an arbitrary language, handling generic and language-specific arguments and calling
`full_headword()` in [[Module:headword]]. This is intended for use in implementing headword modules (e.g.
[[Module:uz-headword]] for Uzbek, [[Module:mn-headword]] for Uzbek, [[Module:gsw-headword]] for Alemannic German, etc.)
and provides a general implementation of such modules. On input, `data` is an object with the following fields:
* `lang`: The language object of the language being handled. '''Required.'''
* `frame`: The frame object passed into the `show()` function of your module, which implements headword-handling for
all parts of speech in the module, including a generic POS-handling template (e.g. {{tl|uz-head}} or {{tl|mn-head}}),
which allows arbitrary parts of speech to be handled. '''Required.'''
* `pos_functions`: A table listing, for each part of speech requiring special handling, the extra parameters (if any)
that the part of speech accepts, and a function to handle those parameters. See examples below. '''Required.'''
* `head_in_1`: If true, explicit headwords are specified in {{para|1}} (or {{para|2}} for generic POS templates such
as {{tl|mn-head}}) instead of in {{para|head}}.
* `include_tr`: If true, allow explicit transliteration to be specified. The transliteration(s) for the headword(s)
themselves is/are specified in {{para|tr}} or through the {{cd|<tr:...>}} inline modifier on headwords, and
transliterations of inflections are specified through the {{cd|<tr:...>}} inline modifier. This should generally be
given when a headword for the language may be in a script other than Latin.
* `include_sc`: If true, allow an explicit script code to be specified. The overall script code for the headword(s)
themselves can be specified using {{para|sc}}, and per-headword or per-inflection script codes are specified using the
{{cd|<sc:...>}} inline modifier. This should generally be given when a language supports multiple scripts.
* `augment_params`: A callback function to add extra generic parameters that apply to all parts of speech. This should
not be used to add part-of-speech-specific parameters; those are handled through the appropriate setting in
`pos_functions`. See below for the format of the argument passed in. This function is called after initializing the
`params` table and just before adding part-of-speech-specific parameters (from `pos_functions`) to this table. Thus,
it can override any generic parameters but may itself be overridden by a part-of-speech-specific parameter.
* `augment_headdata`: A callback function to modify the `headdata` object passed to `full_headword()` in
[[Module:headword]]. This should not be used to for part-of-speech-specific parameter handling; this is handled
through the appropriate setting in `pos_functions`. See below for the format of the argument passed in. This can be
used, for example, to override the value of a generic setting in `headdata` (e.g. [[Module:uz-headword]] uses this to
mark non-Latin terms as variant forms by setting `headdata.var`, being careful not to override a value already set by
the user) or to handle extra generic parameters added through the `augment_params` callback. This function is called
after initializing the `headdata` table with all information taken from generic parameters, and just before calling
the appropriate part-of-speech-specific handler function in `pos_functions`. Thus, it can override any value set
during generic parameter processing but may itself be overridden by a part-of-speech-specific handler.
* `force_cat`: If true, add the headword to the appropriate categories even on non-mainspace pages. This can be used for
testing category handling in sample template calls on userspace test pages or template documentation pages. It should
not be set in production code.
* `enable_auto_translit`: If true, turn on automatic transliteration of inflections at a global level (i.e. applying to
all inflections). This has no effect on headwords, which are automatically transliterated by default if in a non-Latin
script and automatic transliteration is available for the language. You can also set this value for particular
inflections in the `insert_inflection()` function.
The `augment_params` callback is passed a single argument, a table with the following fields:
* `params`: The parameters object itself, of the format accepted by `process()` in [[Module:parameters]]. This object
should be side-effected as necessary.
* `poscat`: The canonicalized part of speech of the headword being processed. This comes either from the invocation
parameter {{para|1}} to `process_headword` (for specific part-of-speech templates such as {{tl|uz-noun}}) or from the
template parameter {{para|1}} passed to a generic part-of-speech template such as {{tl|uz-head}}. It is always
canonicalized to full form and pluralized (e.g. `pcl` will be converted to `particles`).
* `indexing_poscat`: The canonicalized part of speech of the headword used to index into `pos_functions`. This is the
same as `poscat` for specific part-of-speech templates such as {{tl|uz-noun}}, but has the value {"head"} for generic
part-of-speech templates such as {{tl|uz-head}}.
* `generic_pos_template`: True if a a generic POS templates like {{tl|uz-head}} or {{tl|mn-head}} was used. (This is
signaled by omitting the invocation parameter {{para|1}} to `process_headword`.)
* `head_param`: The parameter holding the explicit headword. If `head_in_1` was specified (as for Mongolian headword
templates), this has the value {2} for generic POS templates like {{tl|mn-head}} and {1} for specific POS templates
like {{tl|mn-noun}}. Otherwise, it has the value {"head"}.
The `augment_headdata` callback is passed a single argument, a table with the following fields:
* `headdata`: The headdata object itself, i.e. the object that will be passed to `full_headword()` in
[[Module:headword]]. It should be side-effected as necessary.
* `args`: The parsed arguments table holding all the user-specified arguments.
* `indexing_poscat`, `generic_pos_template`, `head_param`: Same as for the `augment_params` callback.
Note that other information on the headword can be found in the `process_props` field of `headdata`. (For example, the
table in this field contains all of the above fields except for `headdata` itself.)
The `pos_functions` table contains an entry for each part of speech needing special handling, where the key is the
canonical plural part of speech (e.g. {"adverbs"} or {"proper nouns"}). The value associated with each key is a table
containing two fields, `params` and `func`. `params` is a table containing extra parameters to add to the overall
`params` object passed to the `process()` function in [[Module:parameters]]. `func` is a function of two arguments,
normally called `data` (the headword data structure `headdata`) and `args` (the processed arguments table). A simple
example, as used to handle verbs for Mongolian, is
{
pos_functions["verbs"] = {
params = {
caus = true,
pass = true,
},
func = function(data, args)
data:parse_and_insert_inflection("caus", "causative")
data:parse_and_insert_inflection("pass", "passive")
end
}
}
The `params` structure sets two extra user-specifiable parameters {{para|caus}} and {{para|pass}}, and the `func`
handler processes those parameters. Note how this is done by calling methods on the headword `data` structure. Each
such parameter can have multiple comma-separated values, and each value can have inline modifiers attached to it to
specify further properties of the value.
These methods are implemented through a metatable set on the headword `data` structure, which is removed before calling
`full_headword()` in [[Module:headword]]. The methods access extra information related to headword processing (such as
the `args` table) that is stored in the `process_props` field of the headword `data` strucuture. This field is also
removed prior to calling `full_headword()`.
The methods available on the headword `data` structure are as follows. Each one also has its own documentation.
* {parse_inflection(field, props)}: Parse value(s) specified in `field` (a user-specified parameter in the `args` table)
and return a list of term objects. Optional `props` specifies additional properties controlling the parsing.
* {insert_inflection(terms, label, props)}: Insert the terms in `terms` (a list of term objects as returned by
`parse_inflection()`) into the `inflections` list in the headword `data` structure, giving the inflection the label as
specified in `label`. Optional `props` specifies additional properties controlling the parsing.
* {parse_and_insert_inflection(field, label, props)}: A combination of `parse_inflection()` and `insert_inflection()`,
if no further processing of the parsed values needs to be done before insertion.
* {insert_fixed_inflection(label, props)}: Insert a "fixed" inflection (a label without associated values) into the
`inflections` table. An example (from {{tl|mn-noun}} in [[Module:mn-headword]]) is {"hidden-g declension"}, specifying
that the noun belongs to the hidden-''g'' declension.
* {resolve_special(terms, handle_special, props)}: Resolve "special" indicators as specified by the user in an inflection
parameter. A typical example is {"+"}, requesting a default value. `terms` is the list of parsed term objects and
`handle_special` is a handler function to process special indicators and convert them to their actual values.
* {validate_genders(genders, valid_genders, props)}: Validate that the user-specified genders in `genders` all belong to
the list given in `valid_genders`, throwing an error if not.
* {insert_category(category)}: Insert a category into the `categories` list in the headword `data` structure. `category`
is normally a string naming the category, which will have the language prepended to it and any occurrences of `PLPOS`
in the string replaced with the actual plural part of speech.
]==]
function export.process_headword(data)
local lang, frame, pos_functions, head_in_1, include_tr, include_sc, force_cat, enable_auto_translit,
augment_params, augment_headdata =
data.lang, data.frame, data.pos_functions, data.head_in_1, data.include_tr, data.include_sc, data.force_cat,
data.enable_auto_translit, data.augment_params, data.augment_headdata
local langcode = lang:getCode()
local iparams = {
[1] = true,
def = true,
}
local iargs = require(parameters_module).process(frame.args, iparams)
local parargs = frame:getParent().args
local poscat = iargs[1]
local generic_pos_template = not poscat
if generic_pos_template then
poscat = ine(parargs[1]) or
mw.title.getCurrentTitle().fullText == ("Bản_mẫu:%s-head"):format(langcode) and "interjection" or
error("Part of speech must be specified in 1=")
poscat = require(headword_module).canonicalize_pos(poscat)
end
local head_param = head_in_1 and (generic_pos_template and 2 or 1) or "head"
local indexing_poscat = generic_pos_template and "head" or poscat
local params = {
[head_param] = {template_default = iargs.def},
head2 = {replaced_by = false, instead = ("use comma-separated |%s="):format(head_param)},
id = true,
sort = true,
cat = true,
nolink = boolean_param,
nolinkhead = {type = "boolean", alias_of = "nolink"},
suffix = boolean_param,
nosuffix = boolean_param,
clitic = true,
addlpos = true,
var = {type = "boolean", allow = {"both"}},
json = boolean_param,
pagename = true, -- for testing
}
if include_sc then
params.sc = {type = "script"}
end
if include_tr then
params.tr = true
params.tr2 = {replaced_by = false, instead = "use comma-separated |tr= or <tr:...> inline modifier on head"}
end
if generic_pos_template then
params[1] = {required = true} -- required but ignored as already processed above
end
if augment_params then
augment_params {
params = params,
poscat = poscat,
indexing_poscat = indexing_poscat,
generic_pos_template = generic_pos_template,
head_param = head_param,
}
end
if pos_functions[indexing_poscat] then
for key, val in pairs(pos_functions[indexing_poscat].params) do
params[key] = val
end
end
local args = require("Module:parameters").process(parargs, params)
local pagename = args.pagename or mw.loadData(headword_data_module).pagename
local namespace = mw.loadData(headword_data_module).page.namespace
local sc = args.sc or lang:findBestScript(pagename)
local headdata = {
lang = lang,
langcode = langcode,
langfullcode = lang:getFullCode(),
langname = lang:getCanonicalName(),
langfullname = lang:getFullName(),
process_props = {
args = args,
namespace = namespace,
data = data,
indexing_poscat = indexing_poscat,
generic_pos_template = generic_pos_template,
head_param = head_param,
is_suffix = false,
},
pos_category = poscat,
orig_poscat = poscat, -- preserve user-specified poscat in case pos_category is changed to 'suffixes'
categories = {},
inflections = {enable_auto_translit = enable_auto_translit},
pagename = pagename,
sc = sc,
id = args.id,
sort_key = args.sort,
force_cat_output = force_cat,
no_redundant_head_cat = true,
-- No redundant script cat unless the user explicitly gave sc=
no_script_code_cat = not args.sc,
var = args.var,
}
setmetatable(headdata, {__index = Headdata})
local extra_term_mods = {}
if include_tr then
insert(extra_term_mods, "tr")
end
if include_sc then
insert(extra_term_mods, "sc")
end
if not extra_term_mods[1] then
extra_term_mods = nil
end
local trs = args.tr and split_on_comma(args.tr) or {}
local num_trs = #trs
local heads = args[head_param] and export.parse_term_with_modifiers {
val = args[head_param],
paramname = head_param,
splitchar = ",",
is_head = true,
include_mods = extra_term_mods,
} or {}
local num_heads = #heads
if num_heads > 0 and num_trs > 0 and num_heads ~= num_trs then
error(("%s head%s specified explicitly but %s translit%s; they must match; use '+' to stand for the default head (the pagename) or no manual translit"):format(
num_heads, num_heads > 1 and "s" or "", num_trs, num_trs > 1 and "s" or ""))
end
-- Be careful here not to overwrite user_specified_heads if it's empty so we can later check user_specified_heads
-- to see if the user provided any heads.
if num_heads == 0 and num_trs > 0 then
heads = {}
for i = 1, num_trs do
heads[i] = {term = "+"}
end
end
if not heads[1] then
heads = {{term = "+"}}
end
for i, headobj in ipairs(heads) do
if headobj.tr and trs[i] then
if headobj.tr ~= trs[i] then
error(("Saw two different translits '%s' and '%s' for head #%s"):format(
headobj.tr, trs[i], i))
end
else
headobj.tr = headobj.tr or trs[i]
end
if headobj.tr == "+" then
headobj.tr = nil
end
if headobj.term == "+" then
headobj.term = args.nolink and pagename or nil
if headobj.term and namespace == "Reconstruction" then
headobj.term = "*" .. headobj.term
end
end
end
headdata.heads = heads
local function pagename_is_suffix()
if sc:getCode() == "Latn" then
-- shortcut Latin terms to avoid unnecessarily loading [[Module:affix]]
return pagename:find("^%-") and not pagename:find("%-$")
else
local affix_type, _, _, _ = require(affix_module).parse_term_for_affixes(pagename, lang, sc)
return affix_type == "suffix"
end
end
local clitic_label
if args.clitic then
clitic_label = require(yesno_module)(args.clitic, args.clitic)
end
if clitic_label == true then
clitic_label = "clitic"
end
if clitic_label then
headdata:insert_category("clitics")
headdata:insert_fixed_inflection(clitic_label)
elseif args.suffix or (
not args.nosuffix and pagename_is_suffix() and poscat ~= "suffixes" and poscat ~= "suffix forms"
) then
headdata.process_props.is_suffix = true
local function handle_suffix_pos(pos, is_first)
local form_type = pos:match("^(.*) forms$")
local actual_poscat
if form_type then
headdata:insert_category(("%s suffix forms"):format(form_type))
headdata:insert_fixed_inflection(form_type .. " suffix form")
else
local singular_pos = require(en_utilities_module).singularize(pos)
headdata:insert_category(("%s-forming suffixes"):format(singular_pos))
headdata:insert_fixed_inflection(singular_pos .. "-forming suffix")
end
local postype = require(headword_module).pos_lemma_or_nonlemma(pos)
if not postype then
error(("Unrecognized canonicalized part of speech '%s' in addlpos=, cannot determine whether lemma or non-lemma form"):format(
pos
))
end
actual_poscat = postype == "lemma" and "suffixes" or "suffix forms"
if is_first then
headdata.pos_category = actual_poscat
elseif headdata.pos_category ~= actual_poscat then
error(("Cannot mix suffixes and suffix forms using addlpos=; '%s' is a %s while overall POS '%s' is a %s; use separate POS headers for the two"):
format(pos, actual_poscat, poscat, headdata.pos_category))
end
end
handle_suffix_pos(poscat, true)
if args.addlpos then
for _, addlpos in ipairs(split(args.addlpos, "%s*,%s*")) do
addlpos = require(headword_module).canonicalize_pos(addlpos)
handle_suffix_pos(addlpos, false)
end
end
end
if args.cat then
for _, cat in ipairs(split_on_comma(args.cat)) do
headdata:insert_category(cat)
end
end
if augment_headdata then
augment_headdata {
headdata = headdata,
args = args,
indexing_poscat = indexing_poscat,
head_param = head_param,
generic_pos_template = generic_pos_template,
}
end
if pos_functions[indexing_poscat] then
pos_functions[indexing_poscat].func(headdata, args)
end
setmetatable(headdata, nil)
if args.json then
return require("Module:JSON").toJSON(headdata)
end
headdata.process_props = nil
return require(headword_module).full_headword(headdata)
end
return export
achb80jw2tehess4s6verih6kqykqo7
Mô đun:languages/canonical names
828
273923
2561565
2561337
2026-09-08T02:44:29Z
Hiyuune
50834
2561565
Scribunto
text/plain
return {
["Aba"] = "utp",
["Abai Sungai"] = "abf",
["Abenlen Ayta"] = "abp",
["Abipon"] = "axb",
["Abishira"] = "ash",
["Abom"] = "aob",
["Abu"] = "ado",
["Abu' Arapesh"] = "aah",
["Abua"] = "abn",
["Abun"] = "kgr",
["Abung"] = "abl",
["Abureni"] = "mgj",
["Abé"] = "aba",
["Ache"] = "yif",
["Aché"] = "guq",
["Acroá"] = "acs",
["Adabe"] = "adb",
["Adai"] = "xad",
["Adamorobe Sign Language"] = "ads",
["Adang"] = "adn",
["Adangbe"] = "adq",
["Adap"] = "adp",
["Adasen"] = "tiu",
["Adele"] = "ade",
["Adhola"] = "adh",
["Adioukrou"] = "adj",
["Adithinngithigh"] = "dth",
["Adonara"] = "adr",
["Aduge"] = "adu",
["Aeka"] = "aez",
["Aekyom"] = "awi",
["Aequian"] = "xae",
["Afghan Sign Language"] = "afg",
["Afitti"] = "aft",
["Afra"] = "ulf",
["Afrihili"] = "afh",
["Afro-Seminole Creole"] = "afs",
["Agarabi"] = "agd",
["Agariya"] = "agi",
["Agavotaguerra"] = "avo",
["Aghu"] = "ahh",
["Aghu Tharrnggala"] = "gtu",
["Agi"] = "aif",
["Agob"] = "kit",
["Agoi"] = "ibm",
["Aguano"] = "aga",
["Aguaruna"] = "agr",
["Aguna"] = "aug",
["Agusan Manobo"] = "msm",
["Agutaynen"] = "agn",
["Agwagwune"] = "yay",
["Ahanta"] = "aha",
["Ahirani"] = "ahr",
["Ahwai"] = "nfd",
["Ai-Cham"] = "aih",
["Aighon"] = "aix",
["Aikanã"] = "tba",
["Aiklep"] = "mwg",
["Aimele"] = "ail",
["Ainbai"] = "aic",
["Aiome"] = "aki",
["Airoran"] = "air",
["Aisi"] = "mmq",
["Aiwoo"] = "nfl",
["Aja"] = "aja",
["Ajagua"] = "sai-ajg",
["Ajawa"] = "ajw",
["Ajyíninka Apurucayali"] = "cpc",
["Ak"] = "akq",
["Aka (Central Africa)"] = "axk",
["Aka (Sudan)"] = "soh",
["Aka-Bea"] = "abj",
["Aka-Cari"] = "aci",
["Aka-Kol"] = "aky",
["Aka-Kora"] = "ack",
["Akar-Bale"] = "acl",
["Akatek"] = "knj",
["Ake"] = "aik",
["Akebu"] = "keu",
["Akei"] = "tsr",
["Akeu"] = "aeu",
["Akolet"] = "akt",
["Akoye"] = "miw",
["Akpa"] = "akf",
["Akpes"] = "ibe",
["Akrukay"] = "afi",
["Akuku"] = "ayk",
["Akum"] = "aku",
["Akurio"] = "ako",
["Akuwagel"] = "bey",
["Akwa"] = "akw",
["Akyaung Ari"] = "nqy",
["Al-Sayyid Bedouin Sign Language"] = "syy",
["Alabat Island Agta"] = "dul",
["Alacatlatzala Mixtec"] = "mim",
["Alago"] = "ala",
["Alapmunte"] = "apv",
["Alas-Kluet Batak"] = "btz",
["Alazapa"] = "nai-ala",
["Albanian Sign Language"] = "sqk",
["Alege"] = "alf",
["Algerian Sign Language"] = "asp",
["Ali"] = "aiy",
["Alladian"] = "ald",
["Alngith"] = "aid",
["Alo Phola"] = "ypo",
["Alor"] = "aol",
["Aloápam Zapotec"] = "zaq",
["Alu"] = "mte",
["Alugu"] = "aub",
["Tiếng Alune"] = "alp",
["Alungul"] = "aus-alu",
["Aluo"] = "yna",
["Alur"] = "alz",
["Alutiiq"] = "ems",
["Alviri-Vidari"] = "avd",
["Alyawarr"] = "aly",
["Amahai"] = "amq",
["Amanayé"] = "ama",
["Amara"] = "aie",
["Amarakaeri"] = "amr",
["Amarizana"] = "awd-ama",
["Amasi"] = "alv-ama",
["Amatlán Zapotec"] = "zpo",
["Amba"] = "rwm",
["Ambakich"] = "aew",
["Ambala Ayta"] = "abc",
["Ambelau"] = "amv",
["Ambele"] = "ael",
["Amblong"] = "alm",
["Ambo"] = "amb",
["Ambul"] = "apo",
["Amele"] = "aey",
["Amganad Ifugao"] = "ifa",
["Ami"] = "amy",
["Ammonite"] = "sem-amm",
["Amo"] = "amo",
["Amol"] = "alx",
["Amoltepec Mixtec"] = "mbz",
["Amondawa"] = "adw",
["Amorite"] = "sem-amo",
["Ampanang"] = "apg",
["Ampari Dogon"] = "aqd",
["Amri Karbi"] = "ajz",
["Amto"] = "amt",
["Ana Tinga Dogon"] = "dti",
["Anakalangu"] = "akg",
["Anam"] = "pda",
["Anambé"] = "aan",
["Anamgura"] = "imi",
["Anasi"] = "bpo",
["Ancient Ligurian"] = "xlg",
["Ancient North Arabian"] = "xna",
["Ancient Zapotec"] = "xzp",
["Andai"] = "afd",
["Andajin"] = "ajn",
["Andaman Creole Hindi"] = "hca",
["Andaqui"] = "ana",
["Andarum"] = "aod",
["Andegerebinha"] = "adg",
["Andh"] = "anr",
["Andio"] = "bzb",
["Andjingith"] = "aus-and",
["Andoa"] = "anb",
["Andoque"] = "ano",
["Andoquero"] = "sai-and",
["Andra-Hus"] = "anx",
["Aneityum"] = "aty",
["Anem"] = "anz",
["Aneme Wake"] = "aby",
["Anfillo"] = "myo",
["Tiếng Angaataha"] = "agm",
["Angaité"] = "aqt",
["Angal"] = "age",
["Angal Enen"] = "aoe",
["Angal Heneng"] = "akh",
["Angevin"] = "roa-ang",
["Angkamuthi"] = "avm",
["Angkola Batak"] = "akb",
["Angloromani"] = "rme",
["Angor"] = "agg",
["Angoram"] = "aog",
["Angosturas Tunebo"] = "tnd",
["Anguthimri"] = "awg",
["Ani Phowa"] = "ypn",
["Animere"] = "anf",
["Anindilyakwa"] = "aoi",
["Anjam"] = "boj",
["Anmatyerre"] = "amx",
["Anong"] = "nun",
["Anor"] = "anj",
["Anserma"] = "ans",
["Ansus"] = "and",
["Antakarinya"] = "ant",
["Antigua and Barbuda Creole English"] = "aig",
["Anu"] = "anl",
["Anufo"] = "cko",
["Anus"] = "auq",
["Anuta"] = "aud",
["Anyin Morofo"] = "mtb",
["Aoheng"] = "pni",
["Aore"] = "aor",
["Ap Ma"] = "kbx",
["Apalachee"] = "xap",
["Apali"] = "ena",
["Apasco-Apoala Mixtec"] = "mip",
["Apiaká"] = "api",
["Apma"] = "app",
["Apolista"] = "awd-apo",
["Aproumu Aizi"] = "ahp",
["Apurinã"] = "apu",
["Arabana"] = "ard",
["Arabela"] = "arl",
["Aralle-Tabulahan"] = "atq",
["Arammba"] = "stk",
["Aranama-Tamique"] = "xrt",
["Arandai"] = "jbj",
["Araona"] = "aro",
["Arapaso"] = "arj",
["Arara-Karo"] = "arr",
["Ararandewára"] = "xaj",
["Arawum"] = "awm",
["Arbore"] = "arv",
["Are"] = "mwc",
["Areba"] = "aea",
["Argentine Sign Language"] = "aed",
["Arguni"] = "agf",
["Arhâ"] = "aqr",
["Arhö"] = "aok",
["Aribwatsa"] = "laz",
["Aribwaung"] = "ylu",
["Arifama-Miniafia"] = "aai",
["Arigidi"] = "aqg",
["Arikapú"] = "ark",
["Arikara"] = "ari",
["Arikem"] = "ait",
["Aringa"] = "luc",
["Armazic"] = "xrm",
["Armenian Sign Language"] = "aen",
["Arop-Lokep"] = "apr",
["Arop-Sissano"] = "aps",
["Arosi"] = "aia",
["Arritinngithigh"] = "rrt",
["Arta"] = "atz",
["Arua"] = "aru",
["Aruamu"] = "msy",
["Aruek"] = "aur",
["Aruop"] = "lsr",
["Arutani"] = "atx",
["Aruá"] = "arx",
["As"] = "asz",
["Asaro'o"] = "mtv",
["Ashe"] = "ahs",
["Asháninka"] = "cni",
["Ashéninka Perené"] = "prq",
["Asilulu"] = "asl",
["Asoa"] = "asv",
["Assangori"] = "sjg",
["Asu"] = "aum",
["Asue Awyu"] = "psa",
["Asunción Mixtepec Zapotec"] = "zoo",
["Ata"] = "atm",
["Ata Manobo"] = "atd",
["Atakapa"] = "aqp",
["Atampaya"] = "amz",
["Atanques"] = "cba-ata",
["Atatláhuca Mixtec"] = "mib",
["Ateso"] = "teo",
["Ati"] = "atk",
["Atohwaim"] = "aqm",
["Atong (Cameroon)"] = "ato",
["Atorada"] = "aox",
["Atsam"] = "cch",
["Atsugewi"] = "atw",
["Attié"] = "ati",
["Au"] = "avt",
["Aulua"] = "aul",
["Aurá"] = "aux",
["Aushi"] = "auh",
["Aushiri"] = "avs",
["Auslan"] = "asf",
["Austral"] = "aut",
["Australian Aboriginal Sign Language"] = "asw",
["Austrian Sign Language"] = "asq",
["Austronesian Mari"] = "hob",
["Auwe"] = "smf",
["Auyana"] = "auy",
["Auye"] = "auu",
["Auyokawa"] = "auo",
["Avau"] = "avb",
["Avava"] = "tmb",
["Avikam"] = "avi",
["Avá-Canoeiro"] = "avv",
["Awa (New Guinea)"] = "awb",
["Awa-Cuaiquer"] = "kwi",
["Awabakal"] = "awk",
["Awak"] = "awo",
["Awar"] = "aya",
["Awara"] = "awx",
["Awbono"] = "awh",
["Awera"] = "awr",
["Awetí"] = "awe",
["Awngthim"] = "gwm",
["Awtuw"] = "kmn",
["Awun"] = "aww",
["Awutu"] = "afu",
["Awyi"] = "auw",
["Axamb"] = "ahb",
["Ayabadhu"] = "ayd",
["Ayautla Mazatec"] = "vmy",
["Ayerrerenge"] = "axe",
["Ayi"] = "ayq",
["Ayizi"] = "yyz",
["Ayizo"] = "ayb",
["Ayomán"] = "sai-ayo",
["Ayoquesco Zapotec"] = "zaf",
["Ayoreo"] = "ayo",
["Ayu"] = "ayu",
["Ayutla Mixtec"] = "miy",
["Azha"] = "aza",
["Azhe"] = "yiz",
["Baa"] = "kwb",
["Baan"] = "bvj",
["Baangi"] = "bqx",
["Baba"] = "bbw",
["Babango"] = "bbm",
["Babanki"] = "bbk",
["Babine-Witsuwit'en"] = "bcr",
["Babole"] = "bvx",
["Bada"] = "bhz",
["Badeshi"] = "bdz",
["Badimaya"] = "bia",
["Badyara"] = "pbp",
["Baeggu"] = "bvd",
["Baelelea"] = "bvc",
["Baenan"] = "sai-bae",
["Baetora"] = "btr",
["Bafanji"] = "bfj",
["Bafaw"] = "bwt",
["Bafia"] = "ksf",
["Bafut"] = "bfd",
["Baga Kaloum"] = "bqf",
["Baga Koga"] = "bgo",
["Baga Manduri"] = "bmd",
["Baga Pokur"] = "bcg",
["Baga Sitemu"] = "bsp",
["Baga Sobané"] = "bsv",
["Bagheli"] = "bfy",
["Bagirmi"] = "bmi",
["Bago-Kusuntu"] = "bqg",
["Bagri"] = "bgq",
["Bagupi"] = "bpi",
["Bagusa"] = "bqb",
["Baha"] = "yha",
["Baham"] = "bdw",
["Bahamian Creole"] = "bah",
["Baharna Arabic"] = "abv",
["Bahau"] = "bhv",
["Bahinemo"] = "bjh",
["Bahonsuai"] = "bsu",
["Bai"] = "bdj",
["Baibai"] = "bbf",
["Baikeno"] = "bkx",
["Baima"] = "bqh",
["Baimak"] = "bmx",
["Bainouk-Gunyaamolo"] = "bcz",
["Bainouk-Samik"] = "bcb",
["Baissa Fali"] = "fah",
["Bajan"] = "bjs",
["Bajelani"] = "bjm",
["Baka"] = "bkc",
["Bakairí"] = "bkq",
["Bakoko"] = "bkh",
["Bakole"] = "kme",
["Bakpinka"] = "bbs",
["Bakulung"] = "bbu",
["Tiếng Bakumpai"] = "bkr",
["Bakwé"] = "bjw",
["Balaesang"] = "bls",
["Balangao"] = "blw",
["Balangingi"] = "sse",
["Balau"] = "blg",
["Baldemu"] = "bdn",
["Bali"] = "bcp",
["Baliledo"] = "poz-bal",
["Balinese Malay"] = "mhp",
["Balo"] = "bqo",
["Baloi"] = "biz",
["Balong"] = "bnt-bal",
["Baluan-Pam"] = "blq",
["Bamako Sign Language"] = "bog",
["Bamali"] = "bbq",
["Bambalang"] = "bmo",
["Bambam"] = "ptu",
["Bambili-Bambui"] = "baw",
["Bamenyam"] = "bce",
["Bamu"] = "bcf",
["Bamukumbit"] = "bqt",
["Bamunka"] = "bvm",
["Bamwe"] = "bmg",
["Ban Khor Sign Language"] = "bfk",
["Banam Bay"] = "vrt",
["Banao Itneg"] = "bjx",
["Banaro"] = "byz",
["Banda"] = "bnd",
["Banda Malay"] = "bpq",
["Banda-Bambari"] = "liy",
["Banda-Banda"] = "bpd",
["Banda-Mbrès"] = "bqk",
["Banda-Ndélé"] = "bfl",
["Banda-Yangere"] = "yaj",
["Bandi"] = "bza",
["Bandial"] = "bqj",
["Bangala"] = "bxg",
["Bangandu"] = "bgf",
["Bangba"] = "bbe",
["Bangime"] = "dba",
["Bangka"] = "mfb",
["Bangru"] = "sit-ban",
["Bangubangu"] = "bnx",
["Bangwinji"] = "bsj",
["Baniva"] = "bvv",
["Baniwa"] = "bwi",
["Banka"] = "bxw",
["Bankan Tey Dogon"] = "dbw",
["Banoni"] = "bcm",
["Bantik"] = "bnq",
["Baraamu"] = "brd",
["Baram Kayan"] = "kys",
["Barama"] = "bbg",
["Barambu"] = "brm",
["Baramu"] = "bmz",
["Barapasi"] = "brp",
["Baras"] = "brs",
["Barasana"] = "bsn",
["Barbareño"] = "boi",
["Barclayville Grebo"] = "gry",
["Bardi"] = "bcj",
["Barein"] = "bva",
["Bargam"] = "mlp",
["Bariai"] = "bch",
["Bariji"] = "bjc",
["Barikanchi"] = "bxo",
["Barngarla"] = "bjb",
["Barok"] = "bjk",
["Barranbinya"] = "aus-bra",
["Barro Negro Tunebo"] = "tbn",
["Barrow Point"] = "bpt",
["Baruga"] = "bjz",
["Barunggam"] = "aus-brm",
["Baruya"] = "byr",
["Barwe"] = "bwg",
["Barí"] = "mot",
["Basa"] = "bzw",
["Basa-Gumna"] = "bsl",
["Basa-Gurmana"] = "buj",
["Basap"] = "bdb",
["Bashkardi"] = "bsg",
["Bassa-Kontagora"] = "bsr",
["Bassossi"] = "bsi",
["Bata"] = "bta",
["Bataan Ayta"] = "ayt",
["Batanga"] = "bnm",
["Bateri"] = "btv",
["Bathari"] = "bhm",
["Bati (Cameroon)"] = "btc",
["Bati (Indonesia)"] = "bvt",
["Batu"] = "btu",
["Batui"] = "zbt",
["Bau"] = "bbd",
["Bauchi"] = "bsf",
["Baure"] = "brg",
["Bauria"] = "bge",
["Bauro"] = "bxa",
["Bauwaki"] = "bwk",
["Bauzi"] = "bvz",
["Bawm Chin"] = "bgr",
["Bay Miwok"] = "mkq",
["Bayali"] = "bjy",
["Baybayanon"] = "bvy",
["Baygo"] = "byg",
["Bayogoula"] = "nai-bay",
["Bayono"] = "byl",
["Bayot"] = "bda",
["Bayungu"] = "bxj",
["Bazigar"] = "bfr",
["Baïnounk Gubëeher"] = "alv-bgu",
["Beami"] = "beo",
["Beba"] = "bfp",
["Bebe"] = "bzv",
["Bebele"] = "beb",
["Bebeli"] = "bek",
["Bebil"] = "bxp",
["Bedik"] = "tnr",
["Bedoanas"] = "bed",
["Beeke"] = "bkf",
["Beele"] = "bxq",
["Beembe"] = "beq",
["Beezen"] = "bnz",
["Befang"] = "bby",
["Begbere-Ejar"] = "bqv",
["Bekati'"] = "bei",
["Bekwarra"] = "bkv",
["Bekwel"] = "bkw",
["Belait"] = "beg",
["Belanda Bor"] = "bxb",
["Belanda Viri"] = "bvi",
["Belizean Creole"] = "bzj",
["Bembe"] = "bmb",
["Ben Tey"] = "dbt",
["Bena"] = "yun",
["Benabena"] = "bef",
["Bende"] = "bdp",
["Bendi"] = "bct",
["Beneraf"] = "bnv",
["Beng"] = "nhb",
["Benga"] = "bng",
["Benggoi"] = "bgy",
["Bengkala Sign Language"] = "bqy",
["Bentong"] = "bnu",
["Benyadu'"] = "byd",
["Beothuk"] = "bue",
["Bepour"] = "bie",
["Bera"] = "brf",
["Berakou"] = "bxv",
["Berau Malay"] = "bve",
["Berawan"] = "lod",
["Bergish"] = "gmw-bgh",
["Berinomo"] = "bit",
["Berom"] = "bom",
["Berta"] = "wti",
["Berti"] = "byt",
["Besme"] = "bes",
["Besoa"] = "bep",
["Betaf"] = "bfe",
["Bete"] = "byf",
["Bete-Bendi"] = "btt",
["Betoi"] = "sai-bet",
["Bhalay"] = "bhx",
["Bharia"] = "bha",
["Bhaya"] = "bhe",
["Bhele"] = "bhy",
["Bhilali"] = "bhi",
["Bhoti Kinnauri"] = "nes",
["Biafada"] = "bif",
["Biage"] = "bdf",
["Biak"] = "bhw",
["Biali"] = "beh",
["Bian Marind"] = "bpv",
["Biangai"] = "big",
["Biao"] = "byk",
["Biao Mon"] = "bmt",
["Biao-Jiao Mien"] = "bje",
["Bibaali"] = "bcn",
["Bibbulman"] = "xbp",
["Bidiyo"] = "bid",
["Bidyara"] = "bym",
["Bidyogo"] = "bjg",
["Biem"] = "bmc",
["Bierebo"] = "bnk",
["Bieria"] = "brj",
["Biete"] = "biu",
["Big Nambas"] = "nmb",
["Biga"] = "bhc",
["Bigambal"] = "xbe",
["Bikaru"] = "bic",
["Bikya"] = "byb",
["Bila"] = "bip",
["Bilakura"] = "bql",
["Bilba"] = "bpz",
["Bilbil"] = "brz",
["Bile"] = "bil",
["Biliau"] = "bcu",
["Biloxi"] = "bll",
["Bilur"] = "bxf",
["Bimin"] = "bhl",
["Bimoba"] = "bim",
["Bina"] = "bmn",
["Binahari"] = "bxz",
["Binandere"] = "bhg",
["Binawa"] = "byj",
["Bindal"] = "xbd",
["Bine"] = "bon",
["Binji"] = "bpj",
["Binongan Itneg"] = "itb",
["Bintauna"] = "bne",
["Bintulu"] = "bny",
["Binumarien"] = "bjr",
["Bipi"] = "biq",
["Birgid"] = "brk",
["Biri"] = "bzr",
["Biritai"] = "bqq",
["Birri"] = "bvq",
["Birrpayi"] = "xbj",
["Birwa"] = "brl",
["Biseni"] = "ije",
["Bishuo"] = "bwh",
["Bisis"] = "bnw",
["Bisorio"] = "bir",
["Bitare"] = "brt",
["Bitur"] = "mcc",
["Biwat"] = "bwm",
["Biyo"] = "byo",
["Biyom"] = "bpm",
["Blablanga"] = "blp",
["Black Speech"] = "art-bsp",
["Blafe"] = "bfh",
["Bo"] = "bgl",
["Bo-Rukul"] = "mae",
["Bo-Ung"] = "mux",
["Boano (Maluku)"] = "bzn",
["Boano (Sulawesi)"] = "bzl",
["Bobongko"] = "bgb",
["Bobot"] = "bty",
["Bodo (Central Africa)"] = "boy",
["Bofi"] = "bff",
["Boga"] = "bvw",
["Bogaya"] = "boq",
["Boguru"] = "bqu",
["Boikin"] = "bzf",
["Bokha"] = "ybk",
["Bokoto"] = "bdt",
["Bokyi"] = "bky",
["Bolak"] = "art-blk",
["Bolango"] = "bld",
["Bole"] = "bol",
["Bolgo"] = "bvo",
["Bolia"] = "bli",
["Tiếng Bolinao"] = "smk",
["Bolivian Sign Language"] = "bvl",
["Bolon"] = "bof",
["Bolondo"] = "bzm",
["Bolongan"] = "blj",
["Bom"] = "bmf",
["Boma Nkuu"] = "bnt-bon",
["Boma Yumu"] = "bnt-boy",
["Bomboli"] = "bml",
["Bomboma"] = "bws",
["Bomitaba"] = "zmx",
["Bomwali"] = "bmw",
["Bon Gula"] = "glc",
["Bondei"] = "bou",
["Tiếng Kulango Bondoukou"] = "kzc",
["Bondum Dom Dogon"] = "dbu",
["Bonerate"] = "bna",
["Bonggi"] = "bdg",
["Bonggo"] = "bpg",
["Bongili"] = "bui",
["Bongo"] = "bot",
["Bongu"] = "bpu",
["Bonjo"] = "bok",
["Bonkeng"] = "bvg",
["Bonkiman"] = "bop",
["Bookan"] = "bnb",
["Boor"] = "bvf",
["Bora"] = "boa",
["Border Kuna"] = "kvn",
["Borei"] = "gai",
["Boro"] = "xxb",
["Borong"] = "ksr",
["Boruca"] = "brn",
["Boselewa"] = "bwf",
["Bosngun"] = "bqs",
["Bote-Majhi"] = "bmj",
["Tiếng Kulango Bouna"] = "nku",
["Bourbonnais-Berrichon"] = "roa-bbn",
["Bozaba"] = "bzo",
["Bragat"] = "aof",
["Brazilian Sign Language"] = "bzs",
["Brek Karen"] = "kvl",
["Brem"] = "buq",
["Bribri"] = "bzd",
["British Sign Language"] = "bfi",
["Brokskat"] = "bkk",
["Broome Pearling Lugger Pidgin"] = "bpl",
["Brunei Bisaya"] = "bsb",
["Bruny Island"] = "xpz",
["Bu"] = "jid",
["Bu-Nao Bunu"] = "bwx",
["Bua"] = "bub",
["Bualkhaw Chin"] = "cbl",
["Buamu"] = "box",
["Bubi"] = "buw",
["Bubia"] = "bbx",
["Budibud"] = "btp",
["Budong-Budong"] = "bdx",
["Budu"] = "buu",
["Buduma"] = "bdm",
["Budza"] = "bja",
["Buena Vista Yokuts"] = "nai-bvy",
["Buglere"] = "sab",
["Bugun"] = "bgg",
["Buhutu"] = "bxh",
["Bujhyal"] = "byh",
["Bukar-Sadung Bidayuh"] = "sdo",
["Bukat"] = "bvk",
["Bukawa"] = "buk",
["Bukit Malay"] = "bvu",
["Bukitan"] = "bkn",
["Buksa"] = "tkb",
["Bukusu"] = "bxk",
["Bulgarian Sign Language"] = "bqn",
["Bulgebi"] = "bmp",
["Buli (Ghana)"] = "bwu",
["Buli (Indonesia)"] = "bzq",
["Bulu (Cameroon)"] = "bum",
["Bulu (New Guinea)"] = "bjl",
["Bum"] = "bmv",
["Bumaji"] = "byp",
["Bumbita Arapesh"] = "aon",
["Bun"] = "buv",
["Buna"] = "bvn",
["Bunaba"] = "bck",
["Bunak"] = "bfn",
["Bunama"] = "bdd",
["Bundeli"] = "bns",
["Bung"] = "bqd",
["Bungain"] = "but",
["Bunganditj"] = "xbg",
["Bungu"] = "wun",
["Bunoge"] = "dgb",
["Buol"] = "blf",
["Bura"] = "bwr",
["Burak"] = "bys",
["Buraka"] = "bkg",
["Burarra"] = "bvr",
["Burate"] = "bti",
["Burduna"] = "bxn",
["Bure"] = "bvh",
["Burgundian"] = "gem-bur",
["Burmeso"] = "bzu",
["Buru (Indonesia)"] = "mhs",
["Buru (Nigeria)"] = "bqw",
["Burui"] = "bry",
["Burumakok"] = "aip",
["Burun"] = "bdi",
["Burusu"] = "bqr",
["Buruwai"] = "asi",
["Busam"] = "bxs",
["Busami"] = "bsm",
["Busang Kayan"] = "bfg",
["Bushoong"] = "buf",
["Buso"] = "bso",
["Busoa"] = "bup",
["Busuu"] = "bju",
["Butbut Kalinga"] = "kyb",
["Butchulla"] = "xby",
["Butmas-Tur"] = "bnr",
["Buwal"] = "bhs",
["Buyeo"] = "xpy",
["Buyu"] = "byi",
["Buyuan Jino"] = "jiy",
["Bwa"] = "bww",
["Bwaidoka"] = "bwd",
["Bwala"] = "bnt-bwa",
["Bwanabwana"] = "tte",
["Bwatoo"] = "bwa",
["Bwela"] = "bwl",
["Bwile"] = "bwc",
["Bwisi"] = "bwz",
["Byangsi"] = "bee",
["Byep"] = "mkk",
["Bädi Kanum"] = "khd",
["Caac"] = "msq",
["Cabiyarí"] = "cbb",
["Cabécar"] = "cjp",
["Cacaloxtepec Mixtec"] = "miu",
["Cacaopera"] = "ccr",
["Cacua"] = "cbv",
["Cacán"] = "sai-cac",
["Caddo"] = "cad",
["Cafundó"] = "ccd",
["Cahuarano"] = "cah",
["Caka"] = "ckx",
["Cakchiquel-Quiché Mixed Language"] = "ckz",
["Cakfem-Mushere"] = "cky",
["Calabrian Greek"] = "grk-cal",
["Callawalla"] = "caw",
["Calusa"] = "nai-cal",
["Caluyanun"] = "clu",
["Caló"] = "rmq",
["Camarines Norte Agta"] = "abd",
["Cameroon Mambila"] = "mcu",
["Cameroon Pidgin"] = "wes",
["Campalagian"] = "cml",
["Camsá"] = "kbh",
["Camtho"] = "cmt",
["Candoshi-Shapra"] = "cbu",
["Canichana"] = "caz",
["Cao Miao"] = "cov",
["Capiznon"] = "cps",
["Caquinte"] = "cot",
["Cara"] = "cfd",
["Carabayo"] = "cby",
["Caramanta"] = "crf",
["Caranqui"] = "sai-caq",
["Carapana"] = "cbc",
["Carian"] = "xcr",
["Cariay"] = "awd-kar",
["Carijona"] = "cbd",
["Carolina Algonquian"] = "crr",
["Carolinian"] = "cal",
["Carpathian Romani"] = "rmc",
["Cashibo-Cacataibo"] = "cbr",
["Cashinahua"] = "cbs",
["Casiguran Dumagat Agta"] = "dgc",
["Casuarina Coast Asmat"] = "asc",
["Catacao"] = "sai-cat",
["Catalan Sign Language"] = "csc",
["Catuquinaru"] = "sai-ctq",
["Catío Chibcha"] = "cba-cat",
["Cauca"] = "cca",
["Cavere"] = "awd-cav",
["Cavineña"] = "cav",
["Cayubaba"] = "cyb",
["Cayuse"] = "xcy",
["Cazcan"] = "azc-caz",
["Cañari"] = "sai-cnr",
["Cebaara Senoufo"] = "sef",
["Cemuhî"] = "cam",
["Cen"] = "cen",
["Central Asmat"] = "cns",
["Central Awyu"] = "awu",
["Central Bontoc"] = "lbk",
["Central Cagayan Agta"] = "agt",
["Central Grebo"] = "grv",
["Central Huishui Hmong"] = "hmc",
["Central Maewo"] = "mwo",
["Central Mahuatlán Zapoteco"] = "zam",
["Central Malay"] = "pse",
["Central Masela"] = "mxz",
["Central Mashan Hmong"] = "hmm",
["Central Melanau"] = "mel",
["Central Ojibwa"] = "ojc",
["Central Palawano"] = "plc",
["Central Pame"] = "pbs",
["Central Pomo"] = "poo",
["Central Sierra Miwok"] = "csm",
["Central Subanen"] = "syb",
["Central Tagbanwa"] = "tgt",
["Central Tarahumara"] = "tar",
["Central Teke"] = "nzu",
["Central Tunebo"] = "tuf",
["Centúúm"] = "cet",
["Cerma"] = "cme",
["Ch'olti'"] = "myn-chl",
["Chaap Wuurong"] = "tjw",
["Chadian Sign Language"] = "cds",
["Chaha"] = "sem-cha",
["Chairel"] = "sit-cha",
["Chakali"] = "cli",
["Chala"] = "cll",
["Chali"] = "tgf",
["Chamacoco"] = "ceg",
["Chamba Daka"] = "ccg",
["Chamba Leko"] = "ndi",
["Chambri"] = "can",
["Champenois"] = "roa-cha",
["Chang"] = "nbc",
["Changriwa"] = "cga",
["Chaná"] = "sai-chn",
["Chané"] = "caj",
["Chapacura"] = "sai-chp",
["Chara"] = "cra",
["Charrua"] = "sai-chr",
["Chaudangsi"] = "cdn",
["Chayahuita"] = "cbt",
["Chazumba Mixtec"] = "xtb",
["Che"] = "ruk",
["Cheke Holo"] = "mrn",
["Chemakum"] = "xch",
["Chenapian"] = "cjn",
["Chepya"] = "ycp",
["Cherepon"] = "cpn",
["Chesu"] = "ych",
["Chetco-Tolowa"] = "ctc",
["Chhintange"] = "ctn",
["Chhulung"] = "cur",
["Chiangmai Sign Language"] = "csd",
["Chiapanec"] = "cip",
["Chichicapan Zapotec"] = "zpv",
["Chichimeca-Jonaz"] = "pei",
["Chichonyi-Chidzihana-Chikauma"] = "coh",
["Chicomuceltec"] = "cob",
["Chiduruma"] = "dug",
["Chigmecatitlán Mixtec"] = "mii",
["Chilean Sign Language"] = "csg",
["Chilisso"] = "clh",
["Chiltepec Chinantec"] = "csa",
["Chimalapa Zoque"] = "zoh",
["Chimariko"] = "cid",
["Chimila"] = "cbg",
["Chimwiini"] = "bnt-cmw",
["Chinbon Chin"] = "cnb",
["Chinese Pidgin English"] = "cpi",
["Chinese Sign Language"] = "csl",
["Chipaya"] = "cap",
["Chiquihuitlán Mazatec"] = "maq",
["Chiquimulilla"] = "nai-chi",
["Chiquitano"] = "cax",
["Chirino"] = "sai-chi",
["Chiripá"] = "nhd",
["Chitimacha"] = "ctm",
["Chitkuli Kinnauri"] = "cik",
["Chitwania Tharu"] = "the",
["Choapan Zapotec"] = "zpc",
["Chochotec"] = "coz",
["Chokri Naga"] = "nri",
["Chokwe"] = "cjk",
["Cholón"] = "cht",
["Chono"] = "sai-cno",
["Chopi"] = "cce",
["Chuabo"] = "chw",
["Chuanqiandian Cluster Miao"] = "cqd",
["Chuave"] = "cjv",
["Chug"] = "cvg",
["Chuj"] = "cac",
["Chuka"] = "cuh",
["Chukwa"] = "cuw",
["Chumburung"] = "ncu",
["Churuya"] = "sai-chu",
["Chácobo"] = "cao",
["Ci Gbe"] = "cib",
["Cibak"] = "ckl",
["Cicipu"] = "awc",
["Ciguayo"] = "nai-cig",
["Cinamiguin Manobo"] = "mkx",
["Cinda-Regi-Tiyal"] = "cdr",
["Cineni"] = "cie",
["Cinta Larga"] = "cin",
["Cishingini"] = "asg",
["Citak"] = "txt",
["Ciwogai"] = "tgd",
["Tiếng Gael cổ điển"] = "ghc",
["Classical Guaraní"] = "gn-cls",
["Classical Mandaic"] = "myz",
["Classical Newar"] = "nwc",
["Classical Quechua"] = "qwc",
["Coahuilteco"] = "xcw",
["Coast Miwok"] = "csi",
["Coastal Konjo"] = "kjc",
["Coatecas Altas Zapotec"] = "zca",
["Coatepec Nahuatl"] = "naz",
["Coatlán Mixe"] = "mco",
["Coatlán Zapotec"] = "zps",
["Coatzospan Mixtec"] = "miz",
["Cocopa"] = "coc",
["Cocos Islands Malay"] = "coa",
["Coeruna"] = "sai-coe",
["Cogui"] = "kog",
["Col"] = "liw",
["Colombian Sign Language"] = "csn",
["Colonia Tovar German"] = "gct",
["Columbia-Wenatchi"] = "col",
["Colán"] = "sai-col",
["Comaltepec Chinantec"] = "cco",
["Comechingon"] = "sai-cmg",
["Comecrudo"] = "xcm",
["Communicationssprache"] = "art-com",
["Como Karim"] = "cfg",
["Con"] = "cno",
["Coos"] = "csz",
["Copainalá Zoque"] = "zoc",
["Copallén"] = "sai-cop",
["Coquille"] = "coq",
["Cora"] = "crn",
["Cori"] = "cry",
["Coroado Puri"] = "sai-crd",
["Cosoleacaque Nahuatl"] = "nhk",
["Costa Rican Sign Language"] = "csr",
["Cotabato Manobo"] = "mta",
["Cotoname"] = "xcn",
["Coyaima"] = "coy",
["Coyotepec Popoloca"] = "pbf",
["Coyutla Totonac"] = "toc",
["Crimean Gothic"] = "gme-cgo",
["Croatian Sign Language"] = "csq",
["Cruzeño"] = "crz",
["Cuban Sign Language"] = "csf",
["Cubeo"] = "cub",
["Cueva"] = "sai-cva",
["Cuiba"] = "cui",
["Cuitlatec"] = "cuy",
["Culina"] = "cul",
["Tiếng Culli"] = "sai-cul",
["Cun"] = "cuq",
["Cung"] = "cug",
["Curonian"] = "xcu",
["Curripaco"] = "kpc",
["Cutchi-Swahili"] = "ccl",
["Cuvok"] = "cuv",
["Cuyamecalco Mixtec"] = "xtu",
["Cwi Bwamu"] = "bwy",
["Czech Sign Language"] = "cse",
["Da'a Kaili"] = "kzf",
["Daai Chin"] = "dao",
["Daantanai'"] = "lni",
["Daba"] = "dbq",
["Dabe"] = "dbe",
["Dadanitic"] = "sem-dad",
["Dadi Dadi"] = "dda",
["Dadiya"] = "dbd",
["Daga"] = "dgz",
["Dagaari Dioula"] = "dgd",
["Dagik"] = "dec",
["Dagoman"] = "dgn",
["Daho-Doo"] = "das",
["Dai"] = "dij",
["Dair"] = "drb",
["Dairi Batak"] = "btd",
["Dakaka"] = "bpa",
["Dakka"] = "dkk",
["Daloa Bété"] = "bev",
["Dama (Nigeria)"] = "dmm",
["Dama (Sierra Leone)"] = "dmn-dam",
["Damakawa"] = "dam",
["Damal"] = "uhn",
["Dampelas"] = "dms",
["Danaru"] = "dnr",
["Dandami Maria"] = "daq",
["Dangaura Tharu"] = "thl",
["Danish Sign Language"] = "dsl",
["Dano"] = "aso",
["Dao"] = "daz",
["Daonda"] = "dnd",
["Dar Fur Daju"] = "daj",
["Dar Sila Daju"] = "dau",
["Darai"] = "dry",
["Darkinjung"] = "xda",
["Darlong"] = "dln",
["Darmiya"] = "drd",
["Daro-Matu Melanau"] = "dro",
["Darumbal"] = "xgm",
["Dass"] = "dot",
["Datooga"] = "tcc",
["Daungwurrung"] = "dgw",
["Davawenyo"] = "daw",
["Dawawa"] = "dww",
["Dawera-Daweloor"] = "ddw",
["Day"] = "dai",
["Dayi"] = "dax",
["Dazaga"] = "dzg",
["Deccani"] = "dcc",
["Dedua"] = "ded",
["Defaka"] = "afn",
["Defi Gbe"] = "gbh",
["Deg"] = "mzw",
["Degenan"] = "dge",
["Dehwari"] = "deh",
["Dek"] = "dek",
["Dela-Oenale"] = "row",
["Delo"] = "ntr",
["Delta Yokuts"] = "nai-dly",
["Dem"] = "dem",
["Dema"] = "dmx",
["Demisa"] = "dei",
["Demta"] = "dmy",
["Tiếng Dena'ina"] = "tfn",
["Dendi"] = "ddn",
["Dengese"] = "dez",
["Dengka"] = "dnk",
["Deno"] = "dbb",
["Denya"] = "anv",
["Dení"] = "dny",
["Desano"] = "des",
["Dewas Rai"] = "dwz",
["Dewoin"] = "dee",
["Dezfuli"] = "def",
["Dghwede"] = "dgh",
["Dhaiso"] = "dhs",
["Dhalandji"] = "dhl",
["Dhao"] = "nfa",
["Dhofari Arabic"] = "adf",
["Dhudhuroa"] = "ddr",
["Dhungaloo"] = "dhx",
["Dhurga"] = "dhu",
["Dhuwal"] = "dwu",
["Dhuwaya"] = "dwy",
["Dia"] = "dia",
["Dibiyaso"] = "dby",
["Dibo"] = "dio",
["Dicamay Agta"] = "duy",
["Didinga"] = "did",
["Digo"] = "dig",
["Tiếng Dii"] = "dur",
["Dijim-Bwilim"] = "cfa",
["Dilling"] = "dil",
["Dima"] = "jma",
["Dimbong"] = "dii",
["Dinapigue Agta"] = "phi-din",
["Dineor"] = "mrx",
["Ding"] = "diz",
["Diodio"] = "ddi",
["Diri"] = "dwa",
["Dirim"] = "dir",
["Disa"] = "dsi",
["Diuwe"] = "diy",
["Diuxi-Tilantongo Mixtec"] = "xtd",
["Dixon Reef"] = "dix",
["Djadjawurrung"] = "dja",
["Djambarrpuyngu"] = "djr",
["Djangun"] = "djf",
["Djauan"] = "djn",
["Djawi"] = "djw",
["Djimini"] = "dyi",
["Djinba"] = "djb",
["Djiwarli"] = "djl",
["Dobel"] = "kvo",
["Dobu"] = "dob",
["Doe"] = "doe",
["Doga"] = "dgg",
["Doghoro"] = "dgx",
["Dogoso"] = "dgs",
["Dogosé"] = "dos",
["Dogul Dom"] = "dbg",
["Doka"] = "dbi",
["Doko-Uyanga"] = "uya",
["Dom"] = "doa",
["Dominican Sign Language"] = "doq",
["Dompo"] = "doy",
["Domu"] = "dof",
["Domung"] = "dev",
["Dondo"] = "dok",
["Dong"] = "doh",
["Dongo"] = "doo",
["Dongotono"] = "ddd",
["Dongshanba Lalo"] = "yik",
["Donno So Dogon"] = "dds",
["Doondo"] = "dde",
["Dorasque"] = "cba-dor",
["Dori'o"] = "dor",
["Dorig"] = "wwo",
["Doromu-Koki"] = "kqc",
["Dorze"] = "doz",
["Doso"] = "dol",
["Dothraki"] = "art-dtk",
["Doura"] = "don",
["Doutai"] = "tds",
["Doyayo"] = "dow",
["Drehu"] = "dhv",
["Duala"] = "dua",
["Duano"] = "dup",
["Duau"] = "dva",
["Dubu"] = "dmu",
["Dugun"] = "ndu",
["Duguri"] = "dbm",
["Dugwor"] = "dme",
["Duhwa"] = "kbz",
["Duit"] = "cba-dui",
["Duke"] = "nke",
["Dulbu"] = "dbo",
["Duli"] = "duz",
["Duma"] = "dma",
["Dumaitic"] = "sem-dum",
["Dumbea"] = "duf",
["Dumpas"] = "dmv",
["Dumun"] = "dui",
["Duna"] = "duc",
["Dungmali"] = "raa",
["Dungu"] = "dbv",
["Dura"] = "drq",
["Duri"] = "mvp",
["Duriankere"] = "dbn",
["Dusner"] = "dsn",
["Dusun Deyah"] = "dun",
["Dusun Malang"] = "duq",
["Dutch Sign Language"] = "dse",
["Duupa"] = "dae",
["Duvle"] = "duv",
["Duwai"] = "dbp",
["Duwet"] = "gve",
["Dwang"] = "nnu",
["Dyaabugay"] = "dyy",
["Dyaberdyaber"] = "dyb",
["Dyan"] = "dya",
["Dyangadi"] = "dyn",
["Dyugun"] = "dyd",
["Dza"] = "jen",
["Dzando"] = "dzn",
["Dzao Min"] = "bpn",
["Dzodinka"] = "add",
["Dâw"] = "kwa",
["E'ma Buyang"] = "yzg",
["Early Modern Korean"] = "ko-ear",
["Early Tripuri"] = "xtr",
["East Damar"] = "dmr",
["East Franconian"] = "vmf",
["East Kewa"] = "kjs",
["East Limba"] = "lma",
["East Makian"] = "mky",
["East Masela"] = "vme",
["East Nyala"] = "nle",
["East Tarangan"] = "tre",
["Eastern Bolivian Guaraní"] = "gui",
["Eastern Durango Nahuatl"] = "azd",
["Eastern Gurung"] = "ggn",
["Eastern Highland Chatino"] = "cly",
["Eastern Highland Otomi"] = "otm",
["Eastern Huasteca Nahuatl"] = "nhe",
["Eastern Huishui Hmong"] = "hme",
["Eastern Karaboro"] = "xrb",
["Eastern Keres"] = "kee",
["Eastern Lalu"] = "yit",
["Tiếng Maninkakan Đông"] = "emk",
["Eastern Meohang"] = "emg",
["Eastern Muria"] = "emu",
["Eastern Ngad'a"] = "nea",
["Eastern Nisu"] = "nos",
["Eastern Penan"] = "pez",
["Eastern Pomo"] = "peb",
["Eastern Qiandong Miao"] = "hmq",
["Eastern Subanun"] = "sfe",
["Eastern Tawbuid"] = "bnj",
["Eastern Xiangxi Miao"] = "muq",
["Eastern Xwla Gbe"] = "gbx",
["Ebira"] = "igb",
["Ecuadorian Sign Language"] = "ecs",
["Ede Cabe"] = "cbj",
["Ede Ije"] = "ijj",
["Edera Awyu"] = "awy",
["Edolo"] = "etr",
["Edomite"] = "xdm",
["Edopi"] = "dbf",
["Efutop"] = "ofu",
["Egyptian Sign Language"] = "esl",
["Ejamat"] = "eja",
["Ekajuk"] = "eka",
["Ekari"] = "ekg",
["Ekele"] = "khy",
["Eki"] = "eki",
["Ekit"] = "eke",
["Ekpeye"] = "ekp",
["El Alto Zapotec"] = "zpp",
["El Hugeirat"] = "elh",
["Eleme"] = "elm",
["Elepi"] = "ele",
["Elip"] = "ekm",
["Elkei"] = "elk",
["Eloi"] = "art-elo",
["Elotepec Zapotec"] = "zte",
["Eloyi"] = "afo",
["Elseng"] = "mrf",
["Elu"] = "elu",
["Emae"] = "mmw",
["Emai"] = "ema",
["Eman"] = "emn",
["Embaloh"] = "emb",
["Emberá-Baudó"] = "bdc",
["Emberá-Catío"] = "cto",
["Emem"] = "enr",
["Emerillon"] = "eme",
["Emplawas"] = "emw",
["Enawené-Nawé"] = "unk",
["Ende"] = "end",
["Enga"] = "enq",
["Enggano"] = "eno",
["Enlhet"] = "enl",
["Enrekang"] = "ptt",
["Enu"] = "enu",
["Enwan"] = "env",
["Enwang"] = "enw",
["Enxet"] = "enx",
["Enya"] = "gey",
["Epena"] = "sja",
["Epi-Olmec"] = "xep",
["Epigraphic Mayan"] = "emy",
["Erave"] = "kjy",
["Ere"] = "twp",
["Erie"] = "iro-ere",
["Eritai"] = "ert",
["Erokwanas"] = "erw",
["Erre"] = "err",
["Erromintxela"] = "emx",
["Eruwa"] = "erh",
["Ese Ejja"] = "ese",
["Eshtehardi"] = "esh",
["Eskayan"] = "esy",
["Esmeralda"] = "sai-esm",
["Esselen"] = "esq",
["Estado de México Otomi"] = "ots",
["Estonian Sign Language"] = "eso",
["Esuma"] = "esm",
["Etchemin"] = "etc",
["Etebi"] = "etb",
["Eten"] = "etx",
["Eteocypriot"] = "ecy",
["Ethiopian Sign Language"] = "eth",
["Etkywan"] = "ich",
["Eton (Cameroon)"] = "eto",
["Eton (Vanuatu)"] = "etn",
["Etulo"] = "utr",
["Evant"] = "bzz",
["Ewage-Notu"] = "nou",
["Ewarhuyana"] = "sai-ewa",
["Ewondo"] = "ewo",
["Extremaduran"] = "ext",
["Eyak"] = "eya",
["Ezaa"] = "eza",
["Fagani"] = "faf",
["Faire Atta"] = "azt",
["Faita"] = "faj",
["Faiwol"] = "fai",
["Fakkanci"] = "gel",
["Fali"] = "fli",
["Fam"] = "fam",
["Fanamaket"] = "bjp",
["Fang (Beboid)"] = "fak",
["Fania"] = "fni",
["Fas"] = "fqs",
["Fasu"] = "faa",
["Fataleka"] = "far",
["Fataluku"] = "ddg",
["Fayu"] = "fau",
["Fedan"] = "pdn",
["Fembe"] = "agl",
["Fer"] = "kah",
["Feroge"] = "fer",
["Filomena Mata-Coahuitlán Totonac"] = "tlp",
["Finisterre Yau"] = "yuw",
["Finnish Sign Language"] = "fse",
["Finnish-Swedish Sign Language"] = "fss",
["Finongan"] = "fag",
["Fipa"] = "fip",
["Firan"] = "fir",
["Fiwaga"] = "fiw",
["Flemish Sign Language"] = "vgt",
["Flinders Island"] = "fln",
["Foau"] = "flh",
["Foia Foia"] = "ffi",
["Folopa"] = "ppo",
["Foma"] = "fom",
["Fongoro"] = "fgr",
["Foodo"] = "fod",
["Forak"] = "frq",
["Fordata"] = "frd",
["Fore"] = "for",
["Forest Nenets"] = "yrk-for",
["Fortsenal"] = "frt",
["French Belgian Sign Language"] = "sfb",
["French Sign Language"] = "fsl",
["Fuliiru"] = "flr",
["Fulniô"] = "fun",
["Fum"] = "fum",
["Fungwa"] = "ula",
["Furu"] = "fuu",
["Futuna-Aniwa"] = "fut",
["Fuyug"] = "fuy",
["Fwe"] = "fwe",
["Fwâi"] = "fwa",
["Fyam"] = "pym",
["Fyer"] = "fie",
["Ga'anda"] = "gqa",
["Ga'dang"] = "gdg",
["Gaa"] = "ttb",
["Gaam"] = "tbi",
["Gabadi"] = "kbt",
["Gabi"] = "gbw",
["Gabrielino-Fernandeño"] = "xgf",
["Gadang"] = "gdk",
["Gade"] = "ged",
["Gadjerawang"] = "gdh",
["Gadsup"] = "gaj",
["Gafat"] = "gft",
["Gagadu"] = "gbu",
["Gagnoa Bété"] = "btg",
["Gaikundi"] = "gbf",
["Gaina"] = "gcn",
["Gal"] = "gap",
["Galambu"] = "glo",
["Galela"] = "gbi",
["Galeya"] = "gar",
["Galice"] = "gce",
["Galindian"] = "xgl",
["Gallaecian"] = "cel-gal",
["Galoli"] = "gal",
["Gambera"] = "gma",
["Gamela"] = "sai-gam",
["Gamkonora"] = "gak",
["Gamo-Ningi"] = "bte",
["Gana"] = "gnq",
["Ganang"] = "gne",
["Gane"] = "gzn",
["Ganggalida"] = "gcd",
["Ganglau"] = "ggl",
["Gangte"] = "gnb",
["Gangulu"] = "gnl",
["Gants"] = "gao",
["Ganzi"] = "gnz",
["Gao"] = "gga",
["Gapapaiwa"] = "pwg",
["Garawa"] = "wrk",
["Garingbal"] = "xgi",
["Garus"] = "gyb",
["Garza"] = "xgr",
["Gashowu"] = "nai-gsy",
["Gavak"] = "dmc",
["Gavar"] = "gou",
["Gavião do Jiparaná"] = "gvo",
["Gayo"] = "gay",
["Gayón"] = "sai-gay",
["Gbagyi"] = "gbr",
["Gban"] = "ggu",
["Gbanu"] = "gbv",
["Gbanziri"] = "gbg",
["Gbari"] = "gby",
["Gbaya"] = "gba",
["Gbaya-Bossangoa"] = "gbp",
["Gbaya-Bozoum"] = "gbq",
["Gbaya-Mbodomo"] = "gmm",
["Gbayi"] = "gyg",
["Gbesi Gbe"] = "gbs",
["Gbii"] = "ggb",
["Gbin"] = "xgb",
["Gboloo Grebo"] = "gec",
["Gciriku"] = "diu",
["Gcwi"] = "gwj",
["Ge"] = "hmj",
["Gebe"] = "gei",
["Gedaged"] = "gdd",
["Geji"] = "gji",
["Gela"] = "nlg",
["Gelao"] = "gio",
["Gele'"] = "sbc",
["Geme"] = "geq",
["Gende"] = "gaf",
["Gengle"] = "geg",
["Gepo"] = "ygp",
["Gera"] = "gew",
["German Sign Language"] = "gsg",
["Geruma"] = "gea",
["Geser-Gorom"] = "ges",
["Gey"] = "guv",
["Ghanaian Sign Language"] = "gse",
["Ghandruk Sign Language"] = "gds",
["Ghanongga"] = "ghn",
["Ghari"] = "gri",
["Ghayavi"] = "bmk",
["Ghera"] = "ghr",
["Ghulfan"] = "ghl",
["Giangan"] = "bgi",
["Gibanawa"] = "gib",
["Gidar"] = "gid",
["Gikyode"] = "acd",
["Gilima"] = "gix",
["Gimi (Austronesian)"] = "gip",
["Gimme"] = "kmp",
["Gimnime"] = "gmn",
["Ginuman"] = "gnm",
["Girawa"] = "bbr",
["Githabul"] = "gih",
["Gitua"] = "ggt",
["Giyug"] = "giy",
["Gizrra"] = "tof",
["Glaro-Twabo"] = "glr",
["Glavda"] = "glw",
["Glio-Oubi"] = "oub",
["Gnau"] = "gnu",
["Goa'uld"] = "art-gld",
["Goaria"] = "gig",
["Gobasi"] = "goi",
["Gobu"] = "gox",
["Godié"] = "god",
["Godwari"] = "gdx",
["Goemai"] = "ank",
["Gogo"] = "gog",
["Gogodala"] = "ggw",
["Gokana"] = "gkn",
["Gokhy"] = "sit-gkh",
["Gola"] = "gol",
["Golin"] = "gvf",
["Golpa"] = "lja",
["Gondi"] = "gon",
["Gongduk"] = "goe",
["Gonja"] = "gjn",
["Goo"] = "gov",
["Gor"] = "gqr",
["Gorakor"] = "goc",
["Gorap"] = "goq",
["Goreng"] = "xgg",
["Gorovu"] = "grq",
["Gottscheerish"] = "gmw-gts",
["Goundo"] = "goy",
["Gowlan"] = "goj",
["Gowro"] = "gwf",
["Gozarkhani"] = "goz",
["Grangali"] = "nli",
["Grass Koiari"] = "kbk",
["Grebo"] = "grb",
["Greek Sign Language"] = "gss",
["Green Gelao"] = "giq",
["Green Hmong"] = "hnj",
["Grenadian Creole English"] = "gcl",
["Gresi"] = "grs",
["Groma"] = "gro",
["Gros Ventre"] = "ats",
["Gua"] = "gwx",
["Guahibo"] = "guh",
["Guambiano"] = "gum",
["Guamo"] = "sai-gmo",
["Guanano"] = "gvc",
["Guatemalan Sign Language"] = "gsm",
["Guató"] = "gta",
["Guayabero"] = "guo",
["Guazacapán"] = "nai-guz",
["Gudang"] = "xgd",
["Gudanji"] = "nji",
["Gude"] = "gde",
["Gudu"] = "gdu",
["Guduf-Gava"] = "gdf",
["Guerrero Nahuatl"] = "ngu",
["Guevea de Humboldt Zapotec"] = "zpg",
["Gugadj"] = "ggd",
["Gugu Badhun"] = "gdc",
["Gugu Warra"] = "wrw",
["Guhu-Samane"] = "ghs",
["Guianese Creole"] = "gcr",
["Guiberoua Bété"] = "bet",
["Guinau"] = "awd-gnu",
["Guinea-Bissau Sign Language"] = "lgs",
["Guinean Sign Language"] = "gus",
["Guiqiong"] = "gqi",
["Gula"] = "glu",
["Gula'alaa"] = "gmb",
["Gule"] = "gly",
["Gullah"] = "gul",
["Gumalu"] = "gmu",
["Gumatj"] = "gnn",
["Gumawana"] = "gvs",
["Gundi"] = "gdi",
["Gunditjmara"] = "gjm",
["Gundungurra"] = "xrd",
["Gungabula"] = "gyf",
["Gungu"] = "rub",
["Guntai"] = "gnt",
["Gunu"] = "yas",
["Gunwinggu"] = "gup",
["Gunya"] = "gyy",
["Gupa-Abawa"] = "gpa",
["Gupapuyngu"] = "guf",
["Guragone"] = "gge",
["Guramalum"] = "grz",
["Gureng Gureng"] = "gnr",
["Gurgula"] = "ggg",
["Guriaso"] = "grx",
["Gurindji"] = "gue",
["Gurjar Apabhramsa"] = "inc-gup",
["Gurmana"] = "gvm",
["Guro"] = "goa",
["Guruntum"] = "grd",
["Gusan"] = "gsn",
["Gusii"] = "guz",
["Gusilay"] = "gsl",
["Guwa"] = "xgw",
["Guwamu"] = "gwu",
["Guwar"] = "aus-guw",
["Guya"] = "gka",
["Guyanese Creole English"] = "gyn",
["Guyani"] = "gvy",
["Guébie"] = "gie",
["Gvoko"] = "ngs",
["Gwa"] = "gwb",
["Gwahatike"] = "dah",
["Gwak"] = "jgk",
["Gwamhi-Wuri"] = "bga",
["Gwandara"] = "gwn",
["Gwara"] = "alv-gwa",
["Gweda"] = "grw",
["Gweno"] = "gwe",
["Gwere"] = "gwr",
["Gyalsumdo"] = "gyo",
["Gyele"] = "gyi",
["Gyem"] = "gye",
["Güenoa"] = "sai-gue",
["Habu"] = "hbu",
["Hadothi"] = "hoj",
["Hadrami"] = "xhd",
["Hadza"] = "hts",
["Haeke"] = "aek",
["Hahon"] = "hah",
["Haigwai"] = "hgw",
["Hainyaxo Bozo"] = "bzx",
["Haiphong Sign Language"] = "haf",
["Haitian Vodoun Culture Language"] = "hvc",
["Haiǁom"] = "hgm",
["Haji"] = "hji",
["Hakö"] = "hao",
["Halang Doan"] = "hld",
["Halia"] = "hla",
["Hamap"] = "hmu",
["Hamba"] = "hba",
["Hamtai"] = "hmt",
["Hanga"] = "hag",
["Hanga Hundi"] = "wos",
["Hanoi Sign Language"] = "hab",
["Harami"] = "xha",
["Haraza"] = "nub-har",
["Haruai"] = "tmd",
["Haruku"] = "hrk",
["Harzani"] = "hrz",
["Hasaitic"] = "sem-has",
["Hasha"] = "ybj",
["Tiếng Ả Rập Hassaniya"] = "mey",
["Tiếng Hatam"] = "had",
["Hausa Sign Language"] = "hsl",
["Haveke"] = "hvk",
["Havu"] = "hav",
["Hawai'i Pidgin Sign Language"] = "hps",
["Hawaiian Creole"] = "hwc",
["Haya"] = "hay",
["Hdi"] = "xed",
["Hehe"] = "heh",
["Helong"] = "heg",
["Helu"] = "elu-prk",
["Hema"] = "nix",
["Hemba"] = "hem",
["Herdé"] = "hed",
["Hermit"] = "llf",
["Hewa"] = "ham",
["Heyo"] = "auk",
["Hibito"] = "hib",
["Hidatsa"] = "hid",
["Highland Konjo"] = "kjk",
["Highland Oaxaca Chontal"] = "chd",
["Highland Puebla Nahuatl"] = "azz",
["Hijuk"] = "hij",
["Himarimã"] = "hir",
["Himyaritic"] = "sem-him",
["Hismaic"] = "sem-his",
["Hitchiti"] = "nai-hit",
["Hitu"] = "htu",
["Hixkaryana"] = "hix",
["Hlepho Phowa"] = "yhl",
["Hlersu"] = "hle",
["Hmar"] = "hmr",
["Hmong Dô"] = "hmv",
["Hmong Shua"] = "hmz",
["Hmwaveke"] = "mrk",
["Ho Chi Minh City Sign Language"] = "hos",
["Hobyót"] = "hoh",
["Hoia Hoia"] = "hhi",
["Holikachuk"] = "hoi",
["Holma"] = "hod",
["Holoholo"] = "hoo",
["Holu"] = "hol",
["Homa"] = "hom",
["Honduran Lenca"] = "len",
["Honduras Sign Language"] = "hds",
["Hone"] = "juh",
["Hong Kong Sign Language"] = "hks",
["Honi"] = "how",
["Horned Miao"] = "hrm",
["Horo"] = "hor",
["Horom"] = "hoe",
["Hote"] = "hot",
["Hoti"] = "hti",
["Hovongan"] = "hov",
["Hoyahoya"] = "hhy",
["Hrangkhol"] = "hra",
["Hruso"] = "hru",
["Huachipaeri"] = "hug",
["Huambisa"] = "hub",
["Huaorani"] = "auc",
["Huarijio"] = "var",
["Huaulu"] = "hud",
["Huautla Mazatec"] = "mau",
["Huave"] = "huv",
["Huaxcaleca Nahuatl"] = "nhq",
["Huba"] = "hbb",
["Huehuetla Tepehua"] = "tee",
["Huetar"] = "cba-hue",
["Huichol"] = "hch",
["Huilliche"] = "huh",
["Huitepec Mixtec"] = "mxs",
["Hukumina"] = "huw",
["Hula"] = "hul",
["Huli"] = "hui",
["Hulung"] = "huk",
["Humene"] = "huf",
["Hun"] = "uth",
["Hunde"] = "hke",
["Hungana"] = "hum",
["Hungarian Sign Language"] = "hsh",
["Hungworo"] = "nat",
["Hunjara-Kaina Ke"] = "hkk",
["Hunnic"] = "xhc",
["Hupla"] = "hap",
["Hutterisch"] = "geh",
["Hwana"] = "hwo",
["Hya"] = "hya",
["Hän"] = "haa",
["Hértevin"] = "hrt",
["I-Wak"] = "iwk",
["Iamalele"] = "yml",
["Iatmul"] = "ian",
["Iau"] = "tmu",
["Ibali Teke"] = "tek",
["Ibani"] = "iby",
["Iberian"] = "xib",
["Iboko"] = "bkp",
["Ibu"] = "ibu",
["Icelandic Sign Language"] = "icl",
["Iceve-Maci"] = "bec",
["Idakho-Isukha-Tiriki"] = "ida",
["Idaté"] = "idt",
["Idere"] = "ide",
["Idesa"] = "ids",
["Idi"] = "idi",
["Idoma"] = "idu",
["Idon"] = "idc",
["Idun"] = "ldb",
["Iduna"] = "viv",
["Ifo"] = "iff",
["Igana"] = "igg",
["Igede"] = "ige",
["Ignaciano"] = "ign",
["Igo"] = "ahl",
["Iguta"] = "nar",
["Igwe"] = "igw",
["Iha"] = "ihp",
["Ihievbe"] = "ihi",
["Ija-Zuba"] = "vki",
["Ik"] = "ikx",
["Ika"] = "ikk",
["Ikaranggal"] = "ikr",
["Ikizu"] = "ikz",
["Iko"] = "iki",
["Ikobi-Mena"] = "meb",
["Ikoma"] = "ntk",
["Ikpeng"] = "txi",
["Ikpeshi"] = "ikp",
["Iku-Gora-Ankwa"] = "ikv",
["Ikulu"] = "ikl",
["Ikwo"] = "iqw",
["Ila"] = "ilb",
["Ile Ape"] = "ila",
["Ilgar"] = "ilg",
["Ili'uun"] = "ilu",
["Ilianen Manobo"] = "mbi",
["Illyrian"] = "xil",
["Ilongot"] = "ilk",
["Ilue"] = "ilv",
["Ilwana"] = "mlk",
["Imbongu"] = "imo",
["Imonda"] = "imn",
["Imroing"] = "imr",
["Inabaknon"] = "abx",
["Inapang"] = "mzu",
["Indanga"] = "bnt-ind",
["Indian Sign Language"] = "ins",
["Indonesian Bajau"] = "bdl",
["Indonesian Sign Language"] = "inl",
["Indri"] = "idr",
["Indus Valley Language"] = "xiv",
["Inebu One"] = "oin",
["Ineseño"] = "inz",
["Inga"] = "inb",
["Inlaod Itneg"] = "iti",
["Inoke-Yate"] = "ino",
["Inonhan"] = "loc",
["Inpui Naga"] = "nkf",
["International Sign"] = "ils",
["Inuinnaqtun"] = "esx-inq",
["Inuit Sign Language"] = "iks",
["Inuktun"] = "esx-ink",
["Ipai"] = "nai-ipa",
["Ipalapa Amuzgo"] = "azm",
["Ipiko"] = "ipo",
["Ipili"] = "ipi",
["Ipulo"] = "ass",
["Iquito"] = "iqu",
["Ir"] = "irr",
["Irantxe"] = "irn",
["Iranun"] = "ill",
["Irarutu"] = "irh",
["Iraya"] = "iry",
["Iresim"] = "ire",
["Iriga Bicolano"] = "bto",
["Irish Sign Language"] = "isg",
["Isabi"] = "isa",
["Isanzu"] = "isn",
["Isarog Agta"] = "agk",
["Isaurian"] = "und-isa",
["Isconahua"] = "isc",
["Isebe"] = "igo",
["Isinai"] = "inn",
["Isirawa"] = "srl",
["Islander Creole English"] = "icr",
["Israeli Sign Language"] = "isr",
["Isthmus Mixe"] = "mir",
["Isu"] = "isu",
["Isubu"] = "szv",
["Italian Sign Language"] = "ise",
["Itawit"] = "itv",
["Iteri"] = "itr",
["Itik"] = "itx",
["Ito"] = "itw",
["Itundujia Mixtec"] = "mce",
["Itzá"] = "itz",
["Iwal"] = "kbm",
["Iwam"] = "iwm",
["Iwur"] = "iwo",
["Ixcatec"] = "ixc",
["Ixcatlán Mazatec"] = "mzi",
["Ixtayutla Mixtec"] = "vmj",
["Ixtenco Otomi"] = "otz",
["Iyayu"] = "iya",
["Iyive"] = "uiv",
["Iyo"] = "nca",
["Iyo'wujwa Chorote"] = "crq",
["Iyojwa'ja Chorote"] = "crt",
["Izere"] = "izr",
["Izi"] = "izz",
["Izi-Ezaa-Ikwo-Mgbo"] = "izi",
["Izora"] = "cbo",
["Iñapari"] = "inp",
["Jabem"] = "jae",
["Jabutí"] = "jbt",
["Jad"] = "jda",
["Jadgali"] = "jdg",
["Jahanka"] = "jad",
["Jair Awyu"] = "awv",
["Jakati"] = "jat",
["Jalapa de Díaz Mazatec"] = "maj",
["Jalkunan"] = "bxl",
["Jamaican Country Sign Language"] = "jcs",
["Jamaican Sign Language"] = "jls",
["Jambi Malay"] = "jax",
["Jamiltepec Mixtec"] = "mxt",
["Jaminjung"] = "djd",
["Jamsay"] = "djm",
["Jamtish"] = "gmq-jmk",
["Jandavra"] = "jnd",
["Janday"] = "jan",
["Jangkang"] = "djo",
["Jangshung"] = "jna",
["Janji"] = "jni",
["Japanese Sign Language"] = "jsl",
["Japrería"] = "jru",
["Jara"] = "jaf",
["Jaru"] = "ddj",
["Jassic"] = "ysc",
["Jawe"] = "jaz",
["Jaya"] = "jyy",
["Jebero"] = "jeb",
["Jeikó"] = "sai-jko",
["Jenaama Bozo"] = "bze",
["Jeng"] = "jeg",
["Jere"] = "jer",
["Jeri Kuo"] = "jek",
["Jerung"] = "jee",
["Jhankot Sign Language"] = "jhs",
["Jiamao"] = "jio",
["Jiba"] = "juo",
["Jibu"] = "jib",
["Jilbe"] = "jie",
["Jili"] = "mgi",
["Jilim"] = "jil",
["Jimi"] = "jmi",
["Jimjimen"] = "jim",
["Jina"] = "jia",
["Jingulu"] = "jig",
["Jiongnai Bunu"] = "pnu",
["Jirajara"] = "sai-jrj",
["Jiru"] = "jrr",
["Jita"] = "jit",
["Joba"] = "job",
["Jofotek-Bromnya"] = "jbr",
["Jola-Fonyi"] = "dyo",
["Jola-Kasa"] = "csk",
["Jonkor Bourmataguil"] = "jeu",
["Jordanian Sign Language"] = "jos",
["Jorá"] = "jor",
["Jowulu"] = "jow",
["Ju"] = "juu",
["Jumla Sign Language"] = "jus",
["Jumli"] = "jml",
["Jungle Inga"] = "inj",
["Juquila Mixe"] = "mxq",
["Jur Modo"] = "bex",
["Jurúna"] = "jur",
["Jutiapa"] = "nai-jtp",
["Juwal"] = "mwb",
["Juxtlahuaca Mixtec"] = "vmc",
["Jwira-Pepesa"] = "jwi",
["Júma"] = "jua",
["Kaamba"] = "xku",
["Kaan"] = "ldl",
["Kaang Chin"] = "ckn",
["Kaansa"] = "gna",
["Kaapor Sign Language"] = "uks",
["Kaba"] = "ksp",
["Kabalai"] = "kvf",
["Kabatei"] = "xkp",
["Kabba-Laka"] = "lap",
["Kabishiana"] = "tup-kab",
["Kabola"] = "klz",
["Kabore One"] = "onk",
["Kabras"] = "lkb",
["Kaburi"] = "uka",
["Kabutra"] = "kbu",
["Kabwa"] = "cwa",
["Kabwari"] = "kcw",
["Kachari"] = "xac",
["Kacipo-Balesi"] = "koe",
["Kaco'"] = "xkk",
["Kadai"] = "kzd",
["Kadara"] = "kad",
["Kadaru"] = "kdu",
["Kadiwéu"] = "kbc",
["Kado"] = "kdv",
["Kadugli"] = "xtc",
["Kaduo"] = "ktp",
["Kaera"] = "jka",
["Kafoa"] = "kpu",
["Kagan Kalagan"] = "kll",
["Kagate"] = "syw",
["Kagoma"] = "kdm",
["Kagoro"] = "xkg",
["Kagulu"] = "kki",
["Kahe"] = "hka",
["Kahua"] = "agw",
["Kaian"] = "kct",
["Kaibobo"] = "kzb",
["Kaidipang"] = "kzp",
["Kaiep"] = "kbw",
["Kaike"] = "kzq",
["Kaiku"] = "kkq",
["Kaimbulawa"] = "zka",
["Kaimbé"] = "xai",
["Kairak"] = "ckr",
["Kairiru"] = "kxa",
["Kairui-Midiki"] = "krd",
["Kais"] = "kzm",
["Kaivi"] = "kce",
["Kaiwá"] = "kgk",
["Kaiy"] = "tcq",
["Kajakse"] = "ckq",
["Kajali"] = "xkj",
["Kajaman"] = "kag",
["Kakabe"] = "kke",
["Kakanda"] = "kka",
["Kakihum"] = "kxe",
["Kako"] = "kkj",
["Kakwa"] = "keo",
["Kala"] = "kcl",
["Kala Lagaw Ya"] = "mwp",
["Kalaamaya"] = "lkm",
["Kalabakan"] = "kve",
["Kalabari"] = "ijn",
["Kalabra"] = "kzz",
["Kalagan"] = "kqe",
["Kalaktang Monpa"] = "kkf",
["Kalam"] = "kmh",
["Kalamsé"] = "knz",
["Kalanadi"] = "wkl",
["Kalanga"] = "kck",
["Kalapuya"] = "kyl",
["Kalarko"] = "kba",
["Kalasuri"] = "xme-kls",
["Kalenjin"] = "kln",
["Kalinago"] = "crb",
["Kalkatungu"] = "ktg",
["Kalou"] = "ywa",
["Kaluli"] = "bco",
["Kalumpang"] = "kli",
["Kam"] = "kdx",
["Kamakan"] = "vkm",
["Kamang"] = "woi",
["Kamano"] = "kbq",
["Kamantan"] = "kci",
["Kamar"] = "keq",
["Kamara"] = "jmr",
["Kamarian"] = "kzx",
["Kamaru"] = "kgx",
["Kamasa"] = "klp",
["Kamasau"] = "kms",
["Kamayurá"] = "kay",
["Kamba"] = "kam",
["Kambaira"] = "kyy",
["Kamberataro"] = "kbv",
["Kamberau"] = "irx",
["Kambiwá"] = "xbw",
["Kami"] = "kmi",
["Kamkata-viri"] = "bsh",
["Kamo"] = "kcq",
["Kamoro"] = "kgq",
["Kamu"] = "xmu",
["Kamwe"] = "hig",
["Kanakuru"] = "kna",
["Kanamari"] = "knm",
["Kanashi"] = "xns",
["Kanasi"] = "soq",
["Kandas"] = "kqw",
["Kandawo"] = "gam",
["Kande"] = "kbs",
["Kang"] = "kyp",
["Kanga"] = "kcp",
["Kanggape"] = "igm",
["Kango"] = "kty",
["Kango-Sua"] = "kzy",
["Kaniet"] = "ktk",
["Kanikkaran"] = "kev",
["Kaningdon-Nindem"] = "kdp",
["Kaningi"] = "kzo",
["Kaningra"] = "knr",
["Kaninuwa"] = "wat",
["Kanite"] = "kmu",
["Kanjari"] = "kft",
["Kanju"] = "kbe",
["Kanowit"] = "kxn",
["Kanoé"] = "kxo",
["Kansa"] = "ksk",
["Kantosi"] = "xkt",
["Kanu"] = "khx",
["Kanufi"] = "kni",
["Kanyok"] = "kny",
["Kao"] = "kax",
["Kaonde"] = "kqn",
["Kap"] = "ykm",
["Kapauri"] = "khp",
["Kapin"] = "tbx",
["Kapinawá"] = "xpn",
["Kapriman"] = "dju",
["Kaptiau"] = "kbi",
["Kapya"] = "klo",
["Kara (New Guinea)"] = "leu",
["Kara (Tanzania)"] = "reg",
["Karadjeri"] = "gbd",
["Karaga Mandaya"] = "mry",
["Karami"] = "xar",
["Karamojong"] = "kdj",
["Karang"] = "kzr",
["Karanga"] = "kth",
["Karankawa"] = "zkk",
["Karas"] = "kgv",
["Karawa"] = "xrw",
["Kare (Africa)"] = "kbn",
["Kare (New Guinea)"] = "kmf",
["Karey"] = "kyd",
["Kari"] = "kbj",
["Karingani"] = "kgn",
["Karipuna"] = "kuq",
["Karipúna"] = "kgm",
["Karipúna Creole French"] = "kmv",
["Kariya"] = "kil",
["Kariyarra"] = "vka",
["Karkar-Yuri"] = "yuj",
["Karkin"] = "krb",
["Karko"] = "kko",
["Karnai"] = "bbv",
["Karo Batak"] = "btx",
["Karok"] = "kyh",
["Karolanos"] = "kyn",
["Karon"] = "krx",
["Karon Dori"] = "kgw",
["Karore"] = "xkx",
["Karranga"] = "xrq",
["Karuwali"] = "rxw",
["Kasanga"] = "ccj",
["Kasem"] = "xsm",
["Kasiguranin"] = "ksn",
["Kaska"] = "kkz",
["Kaskean"] = "zsk",
["Kaskihá"] = "gva",
["Kassite"] = "und-kas",
["Kassonke"] = "kao",
["Kasua"] = "khs",
["Kataang"] = "kgd",
["Katabaga"] = "ktq",
["Katawixi"] = "xat",
["Katembri"] = "sai-kat",
["Kathlamet"] = "nai-kat",
["Kathoriya Tharu"] = "tkt",
["Kathu"] = "ykt",
["Katkari"] = "kfu",
["Katla"] = "kcr",
["Kato"] = "ktw",
["Katso"] = "kaf",
["Katukina"] = "knt",
["Kaulong"] = "pss",
["Kaur"] = "vkk",
["Kaure"] = "bpp",
["Kauwera"] = "xau",
["Kawacha"] = "kcb",
["Kawaiisu"] = "xaw",
["Kawe"] = "kgb",
["Kawishana"] = "awd-kaw",
["Kaxararí"] = "ktx",
["Kaxuyana"] = "kbb",
["Kaya"] = "zra",
["Kayabí"] = "kyz",
["Kayagar"] = "kyt",
["Kayan Mahakam"] = "xay",
["Kayan River Kayan"] = "xkn",
["Kayardild"] = "gyd",
["Kayeli"] = "kzl",
["Kaytetye"] = "gbb",
["Kayupulau"] = "kzu",
["Kazukuru"] = "kzk",
["Ke'o"] = "xxk",
["Keak"] = "keh",
["Keapara"] = "khz",
["Kedang"] = "ksx",
["Keder"] = "kdy",
["Kehu"] = "khh",
["Kei"] = "kei",
["Keiga"] = "kec",
["Kein"] = "bmh",
["Keiyo"] = "eyo",
["Kela-Yela"] = "kel",
["Kelabit"] = "kzi",
["Keley-I Kallahan"] = "ify",
["Keliko"] = "kbo",
["Kelo"] = "xel",
["Kelon"] = "kyo",
["Kemak"] = "kem",
["Kembayan"] = "xem",
["Kemberano"] = "bzp",
["Kembra"] = "xkw",
["Kemezung"] = "dmo",
["Kemi Sami"] = "sjk",
["Kemiehua"] = "kfj",
["Kemtuik"] = "kmt",
["Kenaboi"] = "xbn",
["Kenati"] = "gat",
["Kendayan"] = "knx",
["Kendeje"] = "klf",
["Kendem"] = "kvm",
["Kenga"] = "kyq",
["Keningau Murut"] = "kxi",
["Keninjal"] = "knl",
["Kenswei Nsei"] = "ndb",
["Kenyan Sign Language"] = "xki",
["Kenyi"] = "lke",
["Keoru-Ahia"] = "xeu",
["Kepkiriwát"] = "kpn",
["Kepo'"] = "kuk",
["Kera"] = "ker",
["Kerak"] = "hhr",
["Kereho"] = "xke",
["Kerewe"] = "ked",
["Kerewo"] = "kxz",
["Kerinci"] = "kvr",
["Kesawai"] = "xes",
["Ketangalan"] = "kae",
["Kete"] = "kcv",
["Ketengban"] = "xte",
["Ketum"] = "ktt",
["Kewa"] = "kew",
["Keyagana"] = "kyg",
["Kgalagadi"] = "xkv",
["Khana"] = "ogo",
["Khandeshi"] = "khn",
["Khao"] = "xao",
["Kharam Naga"] = "kfw",
["Kharia Thar"] = "ksy",
["Khayo"] = "lko",
["Khe"] = "kqg",
["Khehek"] = "tlx",
["Khetrani"] = "xhe",
["Khezha Naga"] = "nkh",
["Khirwar"] = "kwx",
["Khisa"] = "kqm",
["Khlor"] = "llo",
["Khlula"] = "ykl",
["Khoibu Naga"] = "nkb",
["Khoini"] = "xkc",
["Kholok"] = "ktc",
["Khumi Chin"] = "cnk",
["Khwe"] = "xuu",
["Kibala"] = "blv",
["Kibena"] = "bez",
["Kibet"] = "kie",
["Kibiri"] = "prm",
["Kichwa"] = "qwe-kch",
["Kikami"] = "kcu",
["Kilit"] = "xme-klt",
["Kilivila"] = "kij",
["Kiliwa"] = "klb",
["Kilmeri"] = "kih",
["Kimaama"] = "kig",
["Kimaragang"] = "kqr",
["Kimbu"] = "kiv",
["Kimki"] = "sbt",
["Kimré"] = "kqp",
["Kinabalian"] = "cbw",
["Kinalakna"] = "kco",
["Kinga"] = "zga",
["Kings River Yokuts"] = "nai-kry",
["Kinikinao"] = "gqn",
["Kinuku"] = "kkd",
["Kioko"] = "ues",
["Kiong"] = "kkm",
["Kiorr"] = "xko",
["Kipfokomo"] = "pkb",
["Kipsigis"] = "sgc",
["Kiput"] = "kyi",
["Kir-Balar"] = "kkr",
["Kire"] = "geb",
["Kirfi"] = "kks",
["Kirikiri"] = "kiy",
["Kirya-Konzel"] = "fkk",
["Kis"] = "kis",
["Kisa"] = "lks",
["Kisankasa"] = "kqh",
["Kisar"] = "kje",
["Kisi"] = "kiz",
["Kita Maninkakan"] = "mwk",
["Kitanemuk"] = "azc-ktn",
["Kitembo"] = "tbt",
["Kitja"] = "gia",
["Kitsai"] = "kii",
["Kiunum"] = "wei",
["Kla"] = "lda",
["Klamath-Modoc"] = "kla",
["Klao"] = "klu",
["Klias River Kadazan"] = "kqt",
["Ko"] = "fuj",
["Koasati"] = "cku",
["Koba"] = "kpd",
["Kobiana"] = "kcj",
["Kobol"] = "kgu",
["Kochila Tharu"] = "thq",
["Kodaku"] = "ksz",
["Kodeoha"] = "vko",
["Kodi"] = "kod",
["Kodia"] = "kwp",
["Koenoem"] = "kcs",
["Kofa"] = "kso",
["Kofei"] = "kpi",
["Kofyar"] = "kwl",
["Kohin"] = "kkx",
["Kohumono"] = "bcs",
["Koi"] = "kkt",
["Koireng"] = "nkd",
["Koitabu"] = "kqi",
["Koiwat"] = "kxt",
["Kok-Nar"] = "gko",
["Kok-Paponk"] = "okg",
["Kokata"] = "ktd",
["Koke"] = "kou",
["Koko-Bera"] = "kkp",
["Kokoda"] = "xod",
["Kokola"] = "kzn",
["Kokota"] = "kkk",
["Kol (Cameroon)"] = "biw",
["Kol (New Guinea)"] = "kol",
["Kola"] = "kvv",
["Kolbila"] = "klc",
["Kolibugan Subanon"] = "skn",
["Kolom"] = "klm",
["Koluwawa"] = "klx",
["Kom (India)"] = "kmm",
["Koma"] = "kmy",
["Komba"] = "kpf",
["Kombai"] = "tyn",
["Kombio"] = "xbi",
["Komering"] = "kge",
["Kominimung"] = "xoi",
["Kompane"] = "kvp",
["Komyandaret"] = "kzv",
["Kon Keu"] = "kkn",
["Konai"] = "kxw",
["Konda"] = "knd",
["Koneraw"] = "kdw",
["Konkomba"] = "xon",
["Konni"] = "kma",
["Kono (Guinea)"] = "knu",
["Kono (Nigeria)"] = "klk",
["Kono (Sierra Leone)"] = "kno",
["Konomala"] = "koa",
["Konomihu"] = "nai-knm",
["Konongo"] = "kcz",
["Konyak Naga"] = "nbe",
["Konyanka Maninka"] = "mku",
["Konzo"] = "koo",
["Kopar"] = "xop",
["Kopkaka"] = "opk",
["Korafe-Yegha"] = "kpr",
["Korak"] = "koz",
["Korana"] = "kqz",
["Korandje"] = "kcy",
["Korean Sign Language"] = "kvk",
["Koreguaje"] = "coe",
["Koresh-e Rostam"] = "okh",
["Korlai Creole Portuguese"] = "vkp",
["Koro (India)"] = "jkr",
["Koro (New Guinea)"] = "kxr",
["Koro (Vanuatu)"] = "krf",
["Koro (West Africa)"] = "kfo",
["Koromfé"] = "kfz",
["Koromira"] = "kqj",
["Koronadal Blaan"] = "bpr",
["Koroni"] = "xkq",
["Korop"] = "krp",
["Koropó"] = "xxr",
["Koroshi"] = "ktl",
["Korowai"] = "khe",
["Korubo"] = "xor",
["Korupun-Sela"] = "kpq",
["Kosadle"] = "kiq",
["Kosarek Yale"] = "kkl",
["Kosena"] = "kze",
["Koshin"] = "kid",
["Kota (Gabon)"] = "koq",
["Kota Bangun Kutai Malay"] = "mqg",
["Kota Marudu Talantang"] = "grm",
["Kota Marudu Tinagas"] = "ktr",
["Kotafon Gbe"] = "kqk",
["Koti"] = "eko",
["Kou"] = "snz",
["Kouya"] = "kyf",
["Kovai"] = "kqb",
["Kove"] = "kvc",
["Kowaki"] = "xow",
["Kowiai"] = "kwh",
["Koy Sanjaq Surat"] = "kqd",
["Koyaga"] = "kga",
["Koyo"] = "koh",
["Koyra Chiini"] = "khq",
["Koyukon"] = "koy",
["Kpagua"] = "kuw",
["Kpala"] = "kpl",
["Kpan"] = "kpk",
["Kpasam"] = "pbn",
["Kpati"] = "koc",
["Kpatili"] = "kym",
["Kpee"] = "cpo",
["Kpelle"] = "kpe",
["Kpessi"] = "kef",
["Kplang"] = "kph",
["Krache"] = "kye",
["Krahô"] = "xra",
["Krenak"] = "kqq",
["Krevinian"] = "zkv",
["Kreye"] = "xre",
["Krikati-Timbira"] = "xri",
["Krim"] = "krm",
["Krisa"] = "ksi",
["Kristang"] = "mcm",
["Krobu"] = "kxb",
["Krongo"] = "kgo",
["Kua"] = "tyu",
["Kua-nsi"] = "ykn",
["Kuamasi"] = "yku",
["Kuan"] = "uan",
["Kuanhua"] = "xnh",
["Kube"] = "kgf",
["Kubi"] = "kof",
["Kubo"] = "jko",
["Kubu"] = "kvb",
["Kucong"] = "lkc",
["Kudu-Camo"] = "kov",
["Kugama"] = "kow",
["Kugbo"] = "kes",
["Kugu-Muminh"] = "xmh",
["Kui (Indonesia)"] = "kvd",
["Kuijau"] = "dkr",
["Kuikúro"] = "kui",
["Kujarge"] = "vkj",
["Kuk"] = "kfn",
["Kukatja"] = "kux",
["Kukele"] = "kez",
["Kukkuzi"] = "urj-kuk",
["Kuku-Mangk"] = "xmq",
["Kuku-Mu'inh"] = "xmp",
["Kuku-Thaypan"] = "typ",
["Kuku-Ugbanh"] = "ugb",
["Kuku-Uwanh"] = "uwa",
["Kuku-Yalanji"] = "gvn",
["Kula"] = "tpg",
["Kulaal"] = "glj",
["Kulere"] = "kul",
["Kulfa"] = "kxj",
["Kulina"] = "xpk",
["Kulisusu"] = "vkl",
["Kulon"] = "uon",
["Kulung"] = "kle",
["Kumak"] = "nee",
["Kumalu"] = "ksl",
["Kumam"] = "kdi",
["Kuman"] = "kue",
["Kumaoni"] = "kfy",
["Kumba"] = "ksm",
["Kumbainggar"] = "kgs",
["Kumbaran"] = "wkb",
["Kumhali"] = "kra",
["Kumu"] = "kmw",
["Kumukio"] = "kuo",
["Kunama"] = "kun",
["Kunbarlang"] = "wlg",
["Kunda"] = "kdn",
["Kunduvadi"] = "wku",
["Kung"] = "kfl",
["Kungarakany"] = "ggk",
["Kungardutyi"] = "gdt",
["Kunggari"] = "kgl",
["Kungkari"] = "lku",
["Kuni"] = "kse",
["Kuni-Boazi"] = "kvg",
["Kunimaipa"] = "kup",
["Kunja"] = "pep",
["Kunjen"] = "kjn",
["Kunyi"] = "njx",
["Kunza"] = "kuz",
["Kuot"] = "kto",
["Kupa"] = "kug",
["Kupang Malay"] = "mkn",
["Kupsabiny"] = "kpz",
["Kur"] = "kuv",
["Kura Ede Nago"] = "nqk",
["Kurama"] = "krh",
["Kuranko"] = "knk",
["Kuri"] = "nbn",
["Kuria"] = "kuj",
["Kurmukar"] = "kfv",
["Kurnai"] = "unn",
["Kurrama"] = "vku",
["Kurti"] = "ktm",
["Kurtjar"] = "gdj",
["Kurudu"] = "kjr",
["Kuruáya"] = "kyr",
["Kusaal"] = "kus",
["Kusaghe"] = "ksg",
["Kustenau"] = "awd-kus",
["Kusu"] = "ksv",
["Kusunda"] = "kgg",
["Kuthant"] = "xut",
["Kutto"] = "kpa",
["Kutu"] = "kdc",
["Kuturmi"] = "khj",
["Kuuk Thaayorre"] = "thd",
["Kuuk Yak"] = "uky",
["Kuuku-Ya'u"] = "kuy",
["Kuvale"] = "olu",
["Kuwaa"] = "blh",
["Kuwaataay"] = "cwt",
["Kuwani"] = "paa-kwn",
["Kwa'"] = "bko",
["Kwaami"] = "ksq",
["Kwadi"] = "kwz",
["Kwaio"] = "kwd",
["Kwaja"] = "kdz",
["Kwak"] = "kwq",
["Kwakum"] = "kwu",
["Kwalhioqua-Tlatskanai"] = "qwt",
["Kwama"] = "kmq",
["Kwambi"] = "kwm",
["Kwamera"] = "tnk",
["Kwami"] = "ktf",
["Kwamtim One"] = "okk",
["Kwang"] = "kvi",
["Kwanga"] = "kwj",
["Kwangali"] = "kwn",
["Kwanka"] = "bij",
["Kwara'ae"] = "kwf",
["Kwasio"] = "nmg",
["Kwaya"] = "kya",
["Kwaza"] = "xwa",
["Kwegu"] = "xwg",
["Kwer"] = "kwr",
["Kwerba"] = "kwe",
["Kwerba Mamberamo"] = "xwr",
["Kwere"] = "cwe",
["Kwerisa"] = "kkb",
["Kwese"] = "kws",
["Kwesten"] = "kwt",
["Kwini"] = "gww",
["Kwinsu"] = "kuc",
["Kwoma"] = "kmo",
["Kwomtari"] = "kwo",
["Kyak"] = "bka",
["Kyaka"] = "kyc",
["Kyan-Karyaw Naga"] = "nqq",
["Kyenele"] = "kql",
["Kyenga"] = "tye",
["Kyerung"] = "kgy",
["Kélé"] = "keb",
["Kómnzo"] = "paa-kom",
["La'bi"] = "lbi",
["Laal"] = "gdm",
["Laba"] = "lau",
["Label"] = "lbb",
["Labir"] = "jku",
["Labo"] = "mwi",
["Labo Phowa"] = "ypb",
["Labu"] = "lbu",
["Labuk-Kinabatangan Kadazan"] = "dtb",
["Lacandon"] = "lac",
["Lachi"] = "lbt",
["Lachiguiri Zapotec"] = "zpa",
["Lachixío Zapotec"] = "zpl",
["Ladji-Ladji"] = "llj",
["Laeko-Libuat"] = "lkl",
["Lafofa"] = "laf",
["Laghu"] = "lgb",
["Laghuu"] = "lgh",
["Lagwan"] = "kot",
["Laha (Indonesia)"] = "lhh",
["Tiếng La Ha"] = "lha",
["Lahanan"] = "lhn",
["Lahu Shi"] = "lhi",
["Lahul Lohar"] = "lhl",
["Laimbue"] = "lmx",
["Laitu Chin"] = "clj",
["Laiyolo"] = "lji",
["Laka"] = "lak",
["Lake Miwok"] = "lmw",
["Lakha"] = "lkh",
["Lakkia"] = "lbc",
["Lakon"] = "lkn",
["Lakondê"] = "lkd",
["Lakota Dida"] = "dic",
["Lala (New Guinea)"] = "nrz",
["Lala (South Africa)"] = "bnt-lal",
["Lala-Bisa"] = "leb",
["Lala-Roba"] = "lla",
["Lalana Chinantec"] = "cnl",
["Lamaholot"] = "slp",
["Lamalera"] = "lmr",
["Lamang"] = "hia",
["Lamatuka"] = "lmq",
["Lamba"] = "lam",
["Lambichhong"] = "lmh",
["Lambya"] = "lai",
["Lame"] = "bma",
["Lamenu"] = "lmu",
["Lamet"] = "lbn",
["Lamja-Dengsa-Tola"] = "ldh",
["Lamma"] = "lev",
["Lamnso'"] = "lns",
["Lamogai"] = "lmg",
["Lampung Api"] = "ljp",
["Lamu"] = "llh",
["Lamu-Lamu"] = "lby",
["Lanas Lobu"] = "ruu",
["Landoma"] = "ldm",
["Lang'e"] = "yne",
["Langam"] = "lnm",
["Langbashe"] = "lna",
["Langi"] = "lag",
["Langnian Buyang"] = "yln",
["Lango (Sudan)"] = "lno",
["Lango (Uganda)"] = "laj",
["Lanima"] = "lnw",
["Lao Naga"] = "nlq",
["Laopang"] = "lbg",
["Laos Sign Language"] = "lso",
["Lapaguía-Guivini Zapotec"] = "ztl",
["Lapine"] = "art-lap",
["Lapuyan Subanun"] = "laa",
["Laragia"] = "lrg",
["Larantuka Malay"] = "lrt",
["Lardil"] = "lbz",
["Larevat"] = "lrv",
["Larike-Wakasihu"] = "alo",
["Laro"] = "lro",
["Larteh"] = "lar",
["Laru"] = "lan",
["Lasgerdi"] = "lsa",
["Lasi"] = "lss",
["Latu"] = "ltu",
["Latvian Sign Language"] = "lsl",
["Lau"] = "llu",
["Laua"] = "luf",
["Lauan"] = "llx",
["Lauje"] = "law",
["Laura"] = "lur",
["Laurentian"] = "lre",
["Lavatbura-Lamusong"] = "lbv",
["Lawangan"] = "lbx",
["Lawu"] = "lwu",
["Lawunuia"] = "tgi",
["Laze"] = "tbq-laz",
["Lealao Chinantec"] = "cle",
["Leco"] = "lec",
["Ledo Kaili"] = "lew",
["Leelau"] = "ldk",
["Lefa"] = "lfa",
["Lega-Mwenga"] = "lgm",
["Lega-Shabunda"] = "lea",
["Legbo"] = "agb",
["Legenyem"] = "lcc",
["Lehali"] = "tql",
["Lehalurup"] = "urr",
["Leinong Naga"] = "lzn",
["Leipon"] = "lek",
["Lela"] = "dri",
["Lelak"] = "llk",
["Lele (Chad)"] = "lln",
["Lele (Congo)"] = "lel",
["Lele (Guinea)"] = "llc",
["Lele (New Guinea)"] = "lle",
["Lelepa"] = "lpa",
["Lembena"] = "leq",
["Lemerig"] = "lrz",
["Lemio"] = "lei",
["Lemolang"] = "ley",
["Lemoro"] = "ldj",
["Lenakel"] = "tnl",
["Lendu"] = "led",
["Lengilu"] = "lgi",
["Lengo"] = "lgr",
["Lengola"] = "lej",
["Lenje"] = "leh",
["Lenkau"] = "ler",
["Lenyima"] = "ldg",
["Lepki"] = "lpe",
["Lere"] = "gnh",
["Lese"] = "les",
["Lesing-Gelimi"] = "let",
["Letemboi"] = "nms",
["Leti (Cameroon)"] = "leo",
["Leti (Indonesia)"] = "lti",
["Levuka"] = "lvu",
["Lewo Eleng"] = "lwe",
["Lewotobi"] = "lwt",
["Leyigha"] = "ayi",
["Lhokpu"] = "lhp",
["Li'o"] = "ljl",
["Liana-Seti"] = "ste",
["Liangmai Naga"] = "njn",
["Liberian Kreyol"] = "lir",
["Libinza"] = "liz",
["Libon Bikol"] = "lbl",
["Liburnian"] = "xli",
["Libyan Sign Language"] = "lbs",
["Ligbi"] = "lig",
["Ligenza"] = "lgz",
["Lihir"] = "lih",
["Lika"] = "lik",
["Liki"] = "lio",
["Likila"] = "lie",
["Likuba"] = "kxx",
["Likum"] = "lib",
["Likwala"] = "kwc",
["Lilau"] = "lll",
["Limassa"] = "bme",
["Limbu"] = "lif",
["Limi"] = "ylm",
["Limilngan"] = "lmc",
["Linear A"] = "lab",
["Lingkhim"] = "lii",
["Lingua Franca Nova"] = "lfn",
["Linngithigh"] = "lnj",
["Lipo"] = "lpo",
["Lisabata-Nuniali"] = "lcs",
["Lisela"] = "lcl",
["Lish"] = "lsh",
["Lishán Didán"] = "trg",
["Lithuanian Sign Language"] = "lls",
["Little Swanport"] = "aus-lsw",
["Litzlitz"] = "lzl",
["Lizu"] = "sit-liz",
["Lo-Toga"] = "lht",
["Loarki"] = "lrk",
["Lobala"] = "loq",
["Logo"] = "log",
["Logol"] = "lof",
["Logooli"] = "rag",
["Logorik"] = "liu",
["Lokaa"] = "yaz",
["Loko"] = "lok",
["Lokoya"] = "lky",
["Lola"] = "lcd",
["Lolak"] = "llq",
["Lole"] = "llg",
["Lolo"] = "llb",
["Loloda"] = "loa",
["Lolopo"] = "ycl",
["Lomaiviti"] = "lmv",
["Lomakka"] = "loi",
["Lombi"] = "lmi",
["Lombo"] = "loo",
["Lomwe"] = "ngl",
["Loncong"] = "lce",
["Long Phuri Naga"] = "lpn",
["Long Wat"] = "ttw",
["Longgu"] = "lgu",
["Longto"] = "wok",
["Longuda"] = "lnu",
["Loniu"] = "los",
["Lonwolwol"] = "crc",
["Loo"] = "ldo",
["Lopa"] = "lop",
["Lope"] = "yiu",
["Lopi"] = "lov",
["Lopit"] = "lpx",
["Lorang"] = "lrn",
["Lorediakarkar"] = "lnn",
["Lote"] = "uvl",
["Lotud"] = "dtr",
["Lotuko"] = "lot",
["Loun"] = "lox",
["Loup A"] = "xlo",
["Loup B"] = "xlb",
["Lovono"] = "vnk",
["Lower Burdekin"] = "xbb",
["Lower Chehalis"] = "cea",
["Lower Grand Valley Dani"] = "dni",
["Lower Nossob"] = "nsb",
["Lower Southern Aranda"] = "axl",
["Lower Ta'oih"] = "tto",
["Lowland Oaxaca Chontal"] = "clo",
["Lowland Tarahumara"] = "tac",
["Loxicha Zapotec"] = "ztp",
["Lozi"] = "loz",
["Luang"] = "lex",
["Luba-Kasai"] = "lua",
["Lubila"] = "kcc",
["Lubu"] = "lcf",
["Lubuagan Kalinga"] = "knb",
["Luchazi"] = "lch",
["Lufu"] = "ldq",
["Lugbara"] = "lgg",
["Luguru"] = "ruf",
["Luhu"] = "lcq",
["Luimbi"] = "lum",
["Luiseño"] = "lui",
["Lule"] = "ule",
["Lule Sami"] = "smj",
["Lumba-Yakkha"] = "luu",
["Lumbee"] = "lmz",
["Lumun"] = "lmd",
["Lun Bawang"] = "lnd",
["Luna"] = "luj",
["Lunda"] = "lun",
["Lungga"] = "lga",
["Luo"] = "luo",
["Luopohe Hmong"] = "hml",
["Luri (Nigeria)"] = "ldd",
["Lusengo"] = "lse",
["Lusi"] = "khl",
["Lusitanian"] = "xls",
["Lutachoni"] = "lts",
["Lutos"] = "ndy",
["Luvale"] = "lue",
["Luwati"] = "luv",
["Luwo"] = "lwo",
["Luyana"] = "lyn",
["Lwalu"] = "lwa",
["Lwel"] = "lvl",
["Lyélé"] = "lee",
["Tiếng Láadan"] = "ldn",
["Láá Láá Bwamu"] = "bwj",
["Ma"] = "msj",
["Ma Manda"] = "skc",
["Ma'di"] = "mhi",
["Ma'ya"] = "slz",
["Maba"] = "mqa",
["Mabaale"] = "mmz",
["Mabaka Valley Kalinga"] = "kkg",
["Mabire"] = "muj",
["Maca"] = "mca",
["Macaguaje"] = "mcl",
["Macaguán"] = "mbn",
["Macanese"] = "mzs",
["Macau Pidgin Portuguese"] = "crp-mpp",
["Machame"] = "jmc",
["Machiguenga"] = "mcb",
["Machinere"] = "mpd",
["Machinga"] = "mvw",
["Macoris"] = "nai-mac",
["Macuna"] = "myy",
["Mada (Cameroon)"] = "mxu",
["Mada (Nigeria)"] = "mda",
["Madagascar Sign Language"] = "mzc",
["Madak"] = "mmx",
["Maden"] = "xmx",
["Madhi Madhi"] = "dmd",
["Madi"] = "grg",
["Madngele"] = "zml",
["Madukayang Kalinga"] = "kmd",
["Mae"] = "mme",
["Maek"] = "hmk",
["Maeng Itneg"] = "itt",
["Mafa"] = "maf",
["Mafea"] = "mkv",
["Mag-Anchi Ayta"] = "sgb",
["Mag-Indi Ayta"] = "blx",
["Magadhi Prakrit"] = "inc-mgd",
["Magahat"] = "mtw",
["Magdalena Peñasco Mixtec"] = "xtm",
["Magiyi"] = "gmg",
["Magoma"] = "gmx",
["Magɨ"] = "gkd",
["Mahican"] = "mjy",
["Mahongwe"] = "mhb",
["Mahou"] = "mxx",
["Tiếng Maia"] = "sks",
["Maiadomu"] = "mzz",
["Maiani"] = "tnh",
["Maii"] = "mmm",
["Mailu"] = "mgu",
["Maindo"] = "cwb",
["Mairasi"] = "zrs",
["Maisin"] = "mbq",
["Maiwa (Indonesia)"] = "wmm",
["Maiwa (New Guinea)"] = "mti",
["Maiwala"] = "mum",
["Majera"] = "xmj",
["Majhi"] = "mjz",
["Majhwar"] = "mmj",
["Mak (China)"] = "mkg",
["Mak (Nigeria)"] = "pbl",
["Makaa"] = "mcp",
["Makah"] = "myh",
["Makalero"] = "mjb",
["Makasae"] = "mkz",
["Makassar Malay"] = "mfp",
["Makayam"] = "aup",
["Makhuwa"] = "vmw",
["Makhuwa-Marrevone"] = "xmc",
["Makhuwa-Meetto"] = "mgh",
["Makhuwa-Moniga"] = "mhm",
["Makhuwa-Saka"] = "xsq",
["Makhuwa-Shirima"] = "vmk",
["Maklew"] = "mgf",
["Makolkol"] = "zmh",
["Makonde"] = "kde",
["Maku"] = "xak",
["Maku'a"] = "lva",
["Makuri Naga"] = "jmn",
["Makuráp"] = "mpu",
["Makwe"] = "ymk",
["Makyan Naga"] = "umn",
["Mal Paharia"] = "mkb",
["Mala (New Guinea)"] = "ped",
["Mala (Nigeria)"] = "ruy",
["Malaccan Creole Malay"] = "ccm",
["Malalamai"] = "mmt",
["Malalí"] = "sai-mal",
["Malango"] = "mln",
["Malas"] = "mkr",
["Malasanga"] = "mqz",
["Malawi Lomwe"] = "lon",
["Malawian Sign Language"] = "lws",
["Malayic Dayak"] = "xdy",
["Malaynon"] = "mlz",
["Malaysian Sign Language"] = "xml",
["Malba Birifor"] = "bfo",
["Male"] = "mdc",
["Maleu-Kilenge"] = "mgl",
["Malfaxal"] = "mlx",
["Malgana"] = "vml",
["Malgbe"] = "mxf",
["Mali"] = "gcc",
["Malibu"] = "sai-mlb",
["Malila"] = "mgq",
["Malimba"] = "mzd",
["Malimpung"] = "mli",
["Malol"] = "mbk",
["Maltese Sign Language"] = "mdl",
["Malua Bay"] = "mll",
["Malvi"] = "mup",
["Maléku Jaíka"] = "gut",
["Mam"] = "mam",
["Mama"] = "mma",
["Mamaa"] = "mhf",
["Mamaindé"] = "wmd",
["Mamanwa"] = "mmn",
["Tiếng Senoufo Mamara"] = "myk",
["Mamasa"] = "mqj",
["Mambae"] = "mgm",
["Mambai"] = "mcs",
["Mamboru"] = "mvd",
["Mambwe-Lungu"] = "mgr",
["Mamuju"] = "mqx",
["Mamulique"] = "emm",
["Mamusi"] = "kdf",
["Mamvu"] = "mdi",
["Man Met"] = "mml",
["Manado Malay"] = "xmm",
["Manam"] = "mva",
["Manambu"] = "mle",
["Manangba"] = "nmm",
["Manangkari"] = "znk",
["Manao"] = "awd-man",
["Manda (Australia)"] = "zma",
["Manda (Tanzania)"] = "mgs",
["Mandaic"] = "mid",
["Mandailing Batak"] = "btm",
["Mandalorian"] = "art-man",
["Mandan"] = "mhq",
["Mandandanyi"] = "zmk",
["Mandar"] = "mdr",
["Mandari"] = "mqu",
["Mander"] = "mqr",
["Mandingo"] = "man",
["Mandjak"] = "mfv",
["Mandobo Atas"] = "aax",
["Mandobo Bawah"] = "bwp",
["Manem"] = "jet",
["Mangala"] = "mem",
["Mangarayi"] = "mpc",
["Mangarevan"] = "mrv",
["Mangayat"] = "myj",
["Mangbetu"] = "mdj",
["Mangbutu"] = "mdk",
["Mangerr"] = "zme",
["Mangga Buang"] = "mmo",
["Tiếng Mango"] = "mge",
["Mangole"] = "mqc",
["Mangseng"] = "mbh",
["Manigri-Kambolé Ede Nago"] = "xkb",
["Manikion"] = "mnx",
["Manipa"] = "mqp",
["Mankiyali"] = "nlm",
["Manna-Dora"] = "mju",
["Manombai"] = "woo",
["Mansoanka"] = "msw",
["Manta"] = "myg",
["Mantsi"] = "nty",
["Manusela"] = "wha",
["Manya"] = "mzj",
["Manyawa"] = "mny",
["Manza"] = "mzv",
["Mao Naga"] = "nbi",
["Mape"] = "mlh",
["Mapena"] = "mnm",
["Mapia"] = "mpy",
["Mapidian"] = "mpw",
["Mapoyo"] = "mcg",
["Mapun"] = "sjm",
["Mara"] = "mec",
["Mara Chin"] = "mrh",
["Marachi"] = "lri",
["Maraghei"] = "vmh",
["Maragus"] = "mrs",
["Maram Naga"] = "nma",
["Marama"] = "lrm",
["Maranungku"] = "zmr",
["Mararit"] = "mgb",
["Maratino"] = "sai-mar",
["Marawan"] = "awd-mar",
["Marba"] = "mpg",
["Marenje"] = "vmr",
["Marfa"] = "mvu",
["Margany"] = "zmc",
["Marghi South"] = "mfm",
["Margi"] = "mrt",
["Maria"] = "mds",
["Mariaté"] = "awd-mrt",
["Maridan"] = "zmd",
["Maridjabin"] = "zmj",
["Marik"] = "dad",
["Marimanindji"] = "zmm",
["Marind"] = "mrz",
["Maring"] = "mbw",
["Maringarr"] = "zmt",
["Marino"] = "mrb",
["Mariri"] = "mqi",
["Maritime Sign Language"] = "nsr",
["Maritsauá"] = "msp",
["Mariyedi"] = "zmy",
["Marka"] = "rkm",
["Markweeta"] = "enb",
["Maroon Spirit Language"] = "cpe-mar",
["Marovo"] = "mvo",
["Marrgu"] = "mhg",
["Marriammu"] = "xru",
["Marrithiyel"] = "mfr",
["Martha's Vineyard Sign Language"] = "mre",
["Marti Ke"] = "zmg",
["Martu Wangka"] = "mpj",
["Marúbo"] = "mzr",
["Masaba"] = "myx",
["Masadiit Itneg"] = "tis",
["Masakará"] = "sai-msk",
["Masalit"] = "mls",
["Masana"] = "mcn",
["Masbate Sorsogon"] = "bks",
["Mashco Piro"] = "cuj",
["Mashi"] = "mho",
["Masimasi"] = "ism",
["Masiwang"] = "bnf",
["Maslam"] = "msv",
["Masmaje"] = "mes",
["Massachusett"] = "wam",
["Massalat"] = "mdg",
["Massep"] = "mvs",
["Matagalpa"] = "mtn",
["Matanawi"] = "sai-mat",
["Matbat"] = "xmt",
["Matengo"] = "mgv",
["Matepi"] = "mqe",
["Matigsalug Manobo"] = "mbt",
["Matipuhy"] = "mzo",
["Matlatzinca"] = "mat",
["Mato"] = "met",
["Mato Grosso Arára"] = "axg",
["Matsés"] = "mcf",
["Mattole"] = "mvb",
["Matukar"] = "mjk",
["Matumbi"] = "mgw",
["Matya Samo"] = "stj",
["Matís"] = "mpq",
["Mauritian Sign Language"] = "lsy",
["Mauwake"] = "mhl",
["Mawa"] = "mcw",
["Mawak"] = "mjj",
["Mawan"] = "mcz",
["Mawayana"] = "mzx",
["Mawchi"] = "mke",
["Mawes"] = "mgk",
["Maxakalí"] = "mbl",
["Maxi Gbe"] = "mxl",
["Maya Samo"] = "sym",
["Mayaguduna"] = "xmy",
["Mayangna"] = "yan",
["Mayawali"] = "yxa",
["Maybrat"] = "ayz",
["Mayeka"] = "myc",
["Mayi-Thakurti"] = "xyt",
["Maykulan"] = "mnt",
["Maynas"] = "sai-mys",
["Mayo"] = "mfy",
["Mayogo"] = "mdm",
["Mayoyao Ifugao"] = "ifu",
["Maypure"] = "awd-mpr",
["Mazagway"] = "dkx",
["Mazaltepec Zapotec"] = "zpy",
["Mazatlán Mazatec"] = "vmz",
["Mazatlán Mixe"] = "mzl",
["Mba"] = "mfc",
["Mbala"] = "mdp",
["Mbalanhu"] = "lnb",
["Mbandja"] = "zmz",
["Mbangala"] = "mxg",
["Mbangi"] = "mgn",
["Mbangwe"] = "zmn",
["Mbara (Australia)"] = "mvl",
["Mbara (Chad)"] = "mpk",
["Mbariman-Gudhinma"] = "zmv",
["Mbati"] = "mdn",
["Mbato"] = "gwa",
["Mbay"] = "myb",
["Mbe"] = "mfo",
["Mbe'"] = "mtk",
["Mbelime"] = "mql",
["Mbere"] = "mdt",
["Mbesa"] = "zms",
["Mbiywom"] = "aus-mbi",
["Mbo (Cameroon)"] = "mbo",
["Mbo (Congo)"] = "zmw",
["Mboi"] = "moi",
["Mboko"] = "mdu",
["Mbole"] = "mdq",
["Mbonga"] = "xmb",
["Mbongno"] = "bgu",
["Mbosi"] = "mdw",
["Mbowe"] = "mxo",
["Mbre"] = "mka",
["Mbu'"] = "muc",
["Mbudum"] = "xmd",
["Mbugu"] = "mhd",
["Mbugwe"] = "mgz",
["Mbuko"] = "mqb",
["Mbukushu"] = "mhw",
["Mbula"] = "mna",
["Mbula-Bwazza"] = "mbu",
["Mbule"] = "mlb",
["Mbulungish"] = "mbv",
["Mbum"] = "mdd",
["Mbunda"] = "mck",
["Mbunga"] = "mgy",
["Mburku"] = "bbt",
["Mbuun"] = "zmp",
["Mbwela"] = "mfu",
["Mea"] = "meg",
["Mebu"] = "mjn",
["Mecayapan Nahuatl"] = "nhx",
["Medebur"] = "mjm",
["Medefaidrin"] = "dmf",
["Mednyj Aleut"] = "mud",
["Mefele"] = "mfj",
["Megam"] = "mef",
["Mehek"] = "nux",
["Mehináku"] = "mmh",
["Mekeo"] = "mek",
["Mekmek"] = "mvk",
["Mekwei"] = "msf",
["Mekéns"] = "skf",
["Mel-Khaonh"] = "hkn",
["Mele-Fila"] = "mxe",
["Mendalam Kayan"] = "xkd",
["Mengaka"] = "xmg",
["Mengen"] = "mee",
["Menien"] = "sai-men",
["Menka"] = "mea",
["Menya"] = "mcr",
["Meoswar"] = "mvx",
["Mer"] = "mnu",
["Meramera"] = "mxm",
["Merei"] = "lmb",
["Merey"] = "meq",
["Merlav"] = "mrm",
["Meroitic"] = "xmr",
["Meru"] = "mer",
["Mese"] = "mci",
["Mesme"] = "zim",
["Mesmes"] = "mys",
["Meta'"] = "mgo",
["Metlatónoc Mixtec"] = "mxv",
["Mewari"] = "mtr",
["Mewati"] = "wtm",
["Mexican Sign Language"] = "mfs",
["Meyah"] = "mej",
["Mezontla Popoloca"] = "pbe",
["Mfinu"] = "zmf",
["Mfumte"] = "nfu",
["Mgbo"] = "gmz",
["Mian"] = "mpt",
["Miani"] = "pla",
["Micha"] = "yiq",
["Michif"] = "crg",
["Michigamea"] = "cmm",
["Michoacán Nahuatl"] = "ncl",
["Mid Grand Valley Dani"] = "dnt",
["Mid-Southern Banda"] = "bjo",
["Middle Assamese"] = "inc-mas",
["Middle Bengali"] = "inc-mbn",
["Tiếng Cornwall trung đại"] = "cnx",
["Middle Kannada"] = "dra-mkn",
["Middle Median"] = "xme-mid",
["Middle Newar"] = "nwx",
["Tiếng Na Uy trung đại"] = "gmq-mno",
["Middle Watut"] = "mpl",
["Midob"] = "mei",
["Migaama"] = "mmy",
["Migabac"] = "mpp",
["Miji"] = "sjl",
["Miju"] = "mxj",
["Mikasuki"] = "mik",
["Milang"] = "und-mil",
["Mili"] = "ymh",
["Millcayac"] = "sai-mil",
["Miltu"] = "mlj",
["Miluk"] = "iml",
["Milyan"] = "imy",
["Mimi of Decorse"] = "und-mmd",
["Mimi of Nachtigal"] = "und-mmn",
["Mina"] = "hna",
["Minaean"] = "inm",
["Minang"] = "xrg",
["Minanibai"] = "mcv",
["Minaveha"] = "mvn",
["Minderico"] = "drc",
["Mindiri"] = "mpn",
["Mingang Doso"] = "mko",
["Mingo"] = "iro-min",
["Minica Huitoto"] = "hto",
["Minidien"] = "wii",
["Minigir"] = "vmg",
["Minjungbal"] = "xjb",
["Minkin"] = "xxm",
["Minoan"] = "omn",
["Minokok"] = "mqq",
["Miraya Bikol"] = "rbl",
["Mire"] = "mvh",
["Miriti"] = "mmv",
["Miriwoong Sign Language"] = "rsm",
["Miriwung"] = "mep",
["Mirpur Panjabi"] = "pmu",
["Misantla Totonac"] = "tlc",
["Miship"] = "mjs",
["Misima-Paneati"] = "mpx",
["Mitlatongo Mixtec"] = "vmm",
["Mittu"] = "mwu",
["Mituku"] = "zmq",
["Miu"] = "mpo",
["Miwa"] = "vmi",
["Mixed Great Andamanese"] = "gac",
["Mixifore"] = "mfg",
["Mixtepec Mixtec"] = "mix",
["Mixtepec Zapotec"] = "zpm",
["Miya"] = "mkf",
["Miyobe"] = "soy",
["Mlap"] = "kja",
["Mlomp"] = "mlo",
["Mmaala"] = "mmu",
["Mmani"] = "buy",
["Mmen"] = "bfm",
["Mo"] = "wkd",
["Mo'da"] = "gbn",
["Moabite"] = "obm",
["Moba"] = "mfq",
["Mobilian"] = "mod",
["Mobumrin Aizi"] = "ahm",
["Mocana"] = "sai-mcn",
["Mochi"] = "old",
["Mochica"] = "omc",
["Mocho"] = "mhc",
["Mocoví"] = "moc",
["Modang"] = "mxd",
["Modole"] = "mqo",
["Moere"] = "mvq",
["Mofu-Gudur"] = "mif",
["Mogum"] = "mou",
["Moi (Congo)"] = "mow",
["Moi (Indonesia)"] = "mxn",
["Moikodi"] = "mkp",
["Moingi"] = "mwz",
["Mojave"] = "mov",
["Moji"] = "ymi",
["Mok"] = "mqt",
["Mokerang"] = "mft",
["Mokole"] = "mkl",
["Mokpwe"] = "bri",
["Molale"] = "mbe",
["Moldova Sign Language"] = "vsi",
["Molengue"] = "bxc",
["Molima"] = "mox",
["Molmo One"] = "aun",
["Molo"] = "zmo",
["Molof"] = "msl",
["Moloko"] = "mlw",
["Mom Jango"] = "ver",
["Moma"] = "myl",
["Momare"] = "msz",
["Mombo Dogon"] = "dmb",
["Mombum"] = "mso",
["Momina"] = "mmb",
["Momuna"] = "mqf",
["Monastic Sign Language"] = "mzg",
["Mondropolon"] = "npn",
["Mondé"] = "mnd",
["Mongol"] = "mgt",
["Mongolian Sign Language"] = "msr",
["Moni"] = "mnz",
["Monimbo"] = "mom",
["Mono (California)"] = "mnr",
["Mono (Cameroon)"] = "mru",
["Mono (Congo)"] = "mnh",
["Monsang Naga"] = "nmh",
["Montagnais"] = "moe",
["Montana Salish"] = "fla",
["Montol"] = "mtl",
["Monumbo"] = "mxk",
["Monzombo"] = "moj",
["Moo"] = "gwg",
["Mopan Maya"] = "mop",
["Mor (Austronesian)"] = "mhz",
["Mor (Papuan)"] = "moq",
["Moraid"] = "msg",
["Moran"] = "sit-mor",
["Morawa"] = "mze",
["Morelos Nahuatl"] = "nhm",
["Morerebi"] = "xmo",
["Moresada"] = "msx",
["Mori Atas"] = "mzq",
["Mori Bawah"] = "xmz",
["Morigi"] = "mdb",
["Moroccan Sign Language"] = "xms",
["Morom"] = "bdo",
["Moronene"] = "mqn",
["Morori"] = "mok",
["Morouas"] = "mrp",
["Mortlockese"] = "mrl",
["Moru"] = "mgd",
["Mosimo"] = "mqv",
["Moskona"] = "mtj",
["Motembo"] = "tmv",
["Mouk-Aria"] = "mwh",
["Mount Iraya Agta"] = "atl",
["Mount Iriga Agta"] = "agz",
["Mountain Koiari"] = "kpx",
["Mouwase"] = "jmw",
["Movima"] = "mzp",
["Moyadan Itneg"] = "ity",
["Mozambican Sign Language"] = "mzy",
["Mpalitjanh"] = "xpj",
["Mpiemo"] = "mcx",
["Mpiin"] = "bnt-mpi",
["Mpinda"] = "pnd",
["Mpongmpong"] = "mgg",
["Mpoto"] = "mpa",
["Mpotovoro"] = "mvt",
["Mpuono"] = "bnt-mpu",
["Mpur"] = "akc",
["Mro Chin"] = "cmr",
["Mru"] = "mro",
["Mser"] = "kqx",
["Mualang"] = "mtd",
["Mubami"] = "tsx",
["Mubi"] = "mub",
["Mucuchí"] = "sai-muc",
["Muda"] = "ymd",
["Muduapa"] = "wiv",
["Muellama"] = "sai-mue",
["Mufian"] = "aoj",
["Muher"] = "sem-mhr",
["Muinane"] = "bmr",
["Mukha-Dora"] = "mmk",
["Mukulu"] = "moz",
["Mulaha"] = "mfw",
["Mulam"] = "mlm",
["Mulao"] = "giu",
["Mullukmulluk"] = "mpb",
["Muluridyi"] = "vmu",
["Mum"] = "kqa",
["Mumuye"] = "mzm",
["Mundang"] = "mua",
["Mundani"] = "mnf",
["Mundat"] = "mmf",
["Mundolinco"] = "art-mun",
["Mundurukú"] = "myu",
["Mungaka"] = "mhk",
["Mungbam"] = "mij",
["Mungkip"] = "mpv",
["Muniche"] = "myr",
["Munit"] = "mtc",
["Mur Pano"] = "tkv",
["Muratayak"] = "asx",
["Murik (Malaysia)"] = "mxr",
["Murik (New Guinea)"] = "mtf",
["Murkim"] = "rmh",
["Murrinh-Patha"] = "mwf",
["Murui Huitoto"] = "huu",
["Murupi"] = "mqw",
["Muruwari"] = "zmu",
["Musan"] = "mmp",
["Musar"] = "mmi",
["Musasa"] = "smm",
["Musey"] = "mse",
["Musgu"] = "mug",
["Muskum"] = "mje",
["Musom"] = "msu",
["Mussau-Emira"] = "emi",
["Mutu"] = "tuc",
["Muya"] = "mvm",
["Muyang"] = "muy",
["Muyuw"] = "myw",
["Muzi"] = "ymz",
["Muzo"] = "sai-muz",
["Mvanip"] = "mcj",
["Mvuba"] = "mxh",
["Mwaghavul"] = "sur",
["Mwali Comorian"] = "wlc",
["Mwani"] = "wmw",
["Mwatebu"] = "mwa",
["Mwera"] = "mwe",
["Mwimbi-Muthambi"] = "mws",
["Mysian"] = "yms",
["Mzieme Naga"] = "nme",
["Mághdì"] = "gmd",
["Mün Chin"] = "mwq",
["Mündü"] = "muh",
["N'Ko"] = "nqo",
["Na"] = "nbt",
["Na'vi"] = "art-nav",
["Naaba"] = "nao",
["Naba"] = "mne",
["Nabak"] = "naf",
["Nabi"] = "mty",
["Nachering"] = "ncd",
["Nadruvian"] = "ndf",
["Nadëb"] = "mbj",
["Nafi"] = "srf",
["Nafri"] = "nxx",
["Naga Pidgin"] = "nag",
["Nagarchal"] = "nbg",
["Nage"] = "nxe",
["Nagtipunan Agta"] = "phi-nag",
["Nagu"] = "ngr",
["Nagumi"] = "ngv",
["Nahali"] = "nlx",
["Nahari"] = "nhh",
["Nahavaq"] = "sns",
["Nai"] = "bio",
["Najdi Arabic"] = "ars",
["Naka'ela"] = "nae",
["Nakai"] = "nkj",
["Nakame"] = "nib",
["Nakanai"] = "nak",
["Nakara"] = "nck",
["Nake"] = "nbk",
["Naki"] = "mff",
["Nakwi"] = "nax",
["Nalca"] = "nlc",
["Nali"] = "nss",
["Nalik"] = "nal",
["Nalu"] = "naj",
["Nalögo"] = "nlz",
["Namakura"] = "nmk",
["Namat"] = "nkm",
["Nambo"] = "ncm",
["Nambya"] = "nmq",
["Namia"] = "nnm",
["Namiae"] = "nvm",
["Namibian Sign Language"] = "nbs",
["Namla"] = "naa",
["Namo"] = "mxw",
["Namonuito"] = "nmt",
["Namosi-Naitasiri-Serua"] = "bwb",
["Namuyi"] = "nmy",
["Nancere"] = "nnc",
["Nande"] = "nnb",
["Nandi"] = "niq",
["Nanerigé Sénoufo"] = "sen",
["Nanga Dama Dogon"] = "nzz",
["Nanti"] = "cox",
["Nanticoke"] = "nnt",
["Nanubae"] = "afk",
["Naolan"] = "nai-nao",
["Napu"] = "npy",
["Nar Phu"] = "npa",
["Nara"] = "nrb",
["Narak"] = "nac",
["Narango"] = "nrg",
["Narau"] = "nxu",
["Narim"] = "loh",
["Naro"] = "nhr",
["Narom"] = "nrm",
["Narragansett"] = "xnt",
["Narungga"] = "nnr",
["Naruo"] = "ylo",
["Nasal"] = "nsy",
["Nasarian"] = "nvh",
["Nasioi"] = "nas",
["Nasu"] = "ywq",
["Natagaimas"] = "nts",
["Natchez"] = "ncz",
["Nathembo"] = "nte",
["Natioro"] = "nti",
["Natú"] = "sai-nat",
["Natügu"] = "ntu",
["Nauete"] = "nxa",
["Nauna"] = "ncn",
["Nauo"] = "nwo",
["Navarro-Aragonese"] = "roa-oan",
["Navut"] = "nsw",
["Nawaru"] = "nwr",
["Nawathinehena"] = "nwa",
["Nawdm"] = "nmz",
["Nawuri"] = "naw",
["Nayi"] = "noz",
["Ncane"] = "ncr",
["Nchumbulu"] = "nlu",
["Nda'nda'"] = "nnz",
["Ndai"] = "gke",
["Ndaka"] = "ndk",
["Ndali"] = "ndh",
["Ndam"] = "ndm",
["Ndamba"] = "ndj",
["Ndambomo"] = "nxo",
["Ndasa"] = "nda",
["Nde-Gbite"] = "ned",
["Nde-Nsele-Nta"] = "ndd",
["Ndemli"] = "nml",
["Ndendeule"] = "dne",
["Ndengereko"] = "ndg",
["Nding"] = "eli",
["Ndjébbana"] = "djj",
["Ndo"] = "ndp",
["Ndobo"] = "ndw",
["Ndoe"] = "nbb",
["Ndolo"] = "ndl",
["Ndom"] = "nqm",
["Ndombe"] = "ndq",
["Ndoola"] = "ndr",
["Ndrulo"] = "dno",
["Nduga"] = "ndx",
["Ndumu"] = "nmd",
["Ndunda"] = "nuh",
["Ndunga"] = "ndt",
["Ndut"] = "ndv",
["Ndyuka-Trio Pidgin"] = "njt",
["Ndzwani Comorian"] = "wni",
["Nedebang"] = "nec",
["Nefamese"] = "nef",
["Negeri Sembilan Malay"] = "zmi",
["Nehan"] = "nsn",
["Nek"] = "nif",
["Nekgini"] = "nkg",
["Neko"] = "nej",
["Neku"] = "nek",
["Neme"] = "nex",
["Nemi"] = "nem",
["Nen"] = "nqn",
["Nend"] = "anh",
["Nengone"] = "nen",
["Neo"] = "neu",
["Nepalese Sign Language"] = "nsp",
["Nepali Kurux"] = "kxl",
["Nete"] = "net",
["Neve'ei"] = "vnm",
["Neverver"] = "lgk",
["New Caledonian Javanese"] = "jas",
["New River Shasta"] = "nai-nrs",
["New Zealand Sign Language"] = "nzs",
["Neyo"] = "ney",
["Nez Perce"] = "nez",
["Nga La"] = "hlt",
["Ngaanyatjarra"] = "ntj",
["Ngadjunmaya"] = "nju",
["Ngadjuri"] = "jui",
["Ngaing"] = "nnf",
["Ngaju"] = "nij",
["Ngala"] = "nud",
["Ngalakan"] = "nig",
["Ngalkbun"] = "ngk",
["Ngamambo"] = "nbv",
["Ngamini"] = "nmv",
["Ngamo"] = "nbh",
["Ngan'gityemerri"] = "nam",
["Nganakarti"] = "xnk",
["Ngandi"] = "nid",
["Ngando (Central African Republic)"] = "ngd",
["Ngando (Congo)"] = "nxd",
["Ngandyera"] = "nne",
["Ngangam"] = "gng",
["Ngantangarra"] = "ntg",
["Nganyaywana"] = "nyx",
["Ngardi"] = "rxd",
["Ngarigu"] = "xni",
["Ngarinman"] = "nbj",
["Ngarinyin"] = "ung",
["Ngarla"] = "nrk",
["Ngarluma"] = "nrl",
["Ngarrindjeri"] = "nay",
["Ngasa"] = "nsg",
["Ngatik Men's Creole"] = "ngm",
["Ngawn Chin"] = "cnw",
["Ngawun"] = "nxn",
["Ngazidja Comorian"] = "zdj",
["Ngbaka"] = "nga",
["Ngbaka Ma'bo"] = "nbm",
["Ngbaka Manza"] = "ngg",
["Ngbee"] = "jgb",
["Ngbinda"] = "nbd",
["Ngbundu"] = "nuu",
["Ngelima"] = "agh",
["Ngemba"] = "nge",
["Ngen"] = "gnj",
["Ngendelengo"] = "nql",
["Ngeq"] = "ngt",
["Ngete"] = "nnn",
["Nggem"] = "nbq",
["Nggwahyi"] = "ngx",
["Ngie"] = "ngj",
["Ngile"] = "jle",
["Ngindo"] = "nnq",
["Ngiti"] = "niy",
["Ngizim"] = "ngi",
["Ngkoth"] = "aus-ngk",
["Ngkâlmpw Kanum"] = "kcd",
["Ngochang"] = "tbq-ngo",
["Ngom"] = "nra",
["Ngombale"] = "nla",
["Ngombe (Central African Republic)"] = "nmj",
["Ngong"] = "nnx",
["Ngongo"] = "noq",
["Ngoni"] = "ngo",
["Ngoreme"] = "ngq",
["Ngoshie"] = "nsh",
["Ngul"] = "nlo",
["Ngulu"] = "ngp",
["Nguluwan"] = "nuw",
["Ngumbi"] = "nui",
["Ngunawal"] = "xul",
["Ngundi"] = "ndn",
["Ngundu"] = "nue",
["Ngungwel"] = "ngz",
["Ngurmbur"] = "nrx",
["Ngwaba"] = "ngw",
["Ngwe"] = "nwe",
["Ngwo"] = "ngn",
["Ngäbere"] = "gym",
["Nhanda"] = "nha",
["Nhirrpi"] = "hrp",
["Nhuwala"] = "nhf",
["Nicaraguan Creole"] = "bzk",
["Nicaraguan Sign Language"] = "ncs",
["Nicola"] = "ath-nic",
["Niellim"] = "nie",
["Nigeria Mambila"] = "mzk",
["Nigerian Pidgin"] = "pcm",
["Nigerian Sign Language"] = "nsi",
["Nihali"] = "nll",
["Nii"] = "nii",
["Niksek"] = "gbe",
["Nila"] = "nil",
["Nilamba"] = "nim",
["Nimadi"] = "noe",
["Nimanbur"] = "nmp",
["Nimbari"] = "nmr",
["Nimboran"] = "nir",
["Nimi"] = "nis",
["Nimo"] = "niw",
["Nimoa"] = "nmw",
["Ninam"] = "shb",
["Nindi"] = "nxi",
["Ningera"] = "nby",
["Ninggerum"] = "nxr",
["Ningil"] = "niz",
["Ninia Yali"] = "nlk",
["Ninzo"] = "nin",
["Nipsan"] = "nps",
["Nisa"] = "njs",
["Nisenan"] = "nsz",
["Nisi"] = "yso",
["Niuafo'ou"] = "num",
["Niuatoputapu"] = "nkp",
["Niwer Mil"] = "hrc",
["Njalgulgule"] = "njl",
["Njebi"] = "nzb",
["Njen"] = "njj",
["Njerep"] = "njr",
["Njyem"] = "njy",
["Nkami"] = "nkq",
["Nkangala"] = "nkn",
["Nkem-Nkum"] = "isi",
["Nkhumbi"] = "khu",
["Nkongho"] = "nkc",
["Nkoroo"] = "nkx",
["Nkoya"] = "nka",
["Nkukoli"] = "nbo",
["Nkutu"] = "nkw",
["Nnam"] = "nbp",
["Nocamán"] = "nom",
["Nocte Naga"] = "njb",
["Noiri"] = "noi",
["Nokuku"] = "nkk",
["Nomaande"] = "lem",
["Nomane"] = "nof",
["Nomatsiguenga"] = "not",
["Nomlaki"] = "nol",
["Nomu"] = "noh",
["Nonuya"] = "noj",
["Nooksack"] = "nok",
["Noone"] = "nhu",
["Nopala Chatino"] = "cya",
["Norn"] = "nrn",
["Norra"] = "nrr",
["North Ambrym"] = "mmg",
["North Asmat"] = "nks",
["North Awyu"] = "yir",
["North Babar"] = "bcd",
["North Boma"] = "boh",
["North Central Mixe"] = "neq",
["North Fali"] = "fll",
["North Giziga"] = "gis",
["North Mofu"] = "mfk",
["North Muyu"] = "kti",
["North Nuaulu"] = "nni",
["North Tairora"] = "tbg",
["North Tanna"] = "tnn",
["North Wahgi"] = "whg",
["North Watut"] = "una",
["Northeast Kiwai"] = "kiw",
["Northeast Maidu"] = "nmu",
["Northeast Pashayi"] = "aee",
["Northeastern Dinka"] = "dip",
["Northeastern Pomo"] = "pef",
["Northern Alta"] = "aqn",
["Northern Bontoc"] = "rbk",
["Northern Ghale"] = "ghh",
["Northern Grebo"] = "gbo",
["Northern Guiyang Hmong"] = "huj",
["Northern Haida"] = "hdn",
["Northern Huishui Hmong"] = "hmi",
["Northern Kalapuya"] = "nrt",
["Northern Kam"] = "doc",
["Northern Kankanay"] = "xnn",
["Northern Kissi"] = "kqs",
["Northern Lorung"] = "lbr",
["Northern Mashan Hmong"] = "hmp",
["Northern Muji"] = "ymx",
["Northern Ngbandi"] = "ngb",
["Northern Nuni"] = "nuv",
["Northern Oaxaca Nahuatl"] = "nhy",
["Northern Ohlone"] = "cst",
["Northern One"] = "onr",
["Northern Pame"] = "pmq",
["Northern Pinghua"] = "cnp",
["Northern Pomo"] = "pej",
["Northern Puebla Nahuatl"] = "ncj",
["Northern Pumi"] = "pmi",
["Northern Qiandong Miao"] = "hea",
["Northern Rengma Naga"] = "nnl",
["Northern Sierra Miwok"] = "nsq",
["Northern Subanen"] = "stb",
["Northern Tarahumara"] = "thh",
["Northern Tidong"] = "ntd",
["Northern Tlaxiaco Mixtec"] = "xtn",
["Northern Toussian"] = "tsp",
["Northern Tutchone"] = "ttm",
["Northern Valley Yokuts"] = "nai-nvy",
["Northwest Maidu"] = "mjd",
["Northwest Oaxaca Mixtec"] = "mxa",
["Northwest Pashayi"] = "glh",
["Northwestern Dinka"] = "diw",
["Northwestern Fars"] = "faz",
["Northwestern Tamang"] = "tmk",
["Norwegian Sign Language"] = "nsl",
["Notre"] = "bly",
["Notsi"] = "ncf",
["Nottoway"] = "ntw",
["Nottoway-Meherrin"] = "nwy",
["Noxilo"] = "art-nox",
["Noy"] = "noy",
["Nsari"] = "asj",
["Nsenga"] = "nse",
["Nshi"] = "nsc",
["Nsong"] = "soo",
["Nsongo"] = "nsx",
["Ntomba"] = "nto",
["Ntra'ngith"] = "dgt",
["Nuguria"] = "nur",
["Nuk"] = "noc",
["Nukak Makú"] = "mbr",
["Nukna"] = "klt",
["Nukuini"] = "nuc",
["Nukumanu"] = "nuq",
["Nukunu"] = "nnv",
["Nukunul"] = "xnu",
["Nukuoro"] = "nkr",
["Numana"] = "nbr",
["Numanggang"] = "nop",
["Numbami"] = "sij",
["Nume"] = "tgs",
["Numee"] = "kdk",
["Nungali"] = "nug",
["Nunggubuyu"] = "nuy",
["Nungon"] = "paa-nun",
["Nungu"] = "rin",
["Nupbikha"] = "npb",
["Nusa Laut"] = "nul",
["Nusu"] = "nuf",
["Nutabe"] = "cba-nut",
["Nyabwa"] = "nwb",
["Nyaheun"] = "nev",
["Nyakyusa"] = "nyy",
["Nyali"] = "nlj",
["Nyam"] = "nmi",
["Nyamal"] = "nly",
["Nyambo"] = "now",
["Nyamusa-Molo"] = "nwm",
["Nyamwanga"] = "mwn",
["Nyamwezi"] = "nym",
["Nyaneka"] = "nyk",
["Nyang'i"] = "nyp",
["Nyanga (Congo)"] = "nyj",
["Nyanga (Togo)"] = "ayg",
["Nyanga-li"] = "nyc",
["Nyangatom"] = "nnj",
["Nyangbo"] = "nyb",
["Nyangga"] = "nny",
["Nyangumarta"] = "nna",
["Nyankole"] = "nyn",
["Nyaturu"] = "rim",
["Nyawaygi"] = "nyt",
["Nyemba"] = "nba",
["Nyengo"] = "nye",
["Nyenkha"] = "neh",
["Nyigina"] = "nyh",
["Nyiha"] = "nih",
["Nyika"] = "nkt",
["Nyimang"] = "nyi",
["Nyindrou"] = "lid",
["Nyindu"] = "nyg",
["Nyiyaparli"] = "xny",
["Nyokon"] = "nvo",
["Nyole (Kenya)"] = "nyd",
["Nyole (Uganda)"] = "nuj",
["Nyong"] = "muo",
["Nyulnyul"] = "nyv",
["Nyungwe"] = "nyu",
["Nyâlayu"] = "yly",
["Nzakambay"] = "nzy",
["Nzakara"] = "nzk",
["Nzanyi"] = "nja",
["Nzima"] = "nzi",
["Nüpode Huitoto"] = "hux",
["O'chi'chi'"] = "xoc",
["Obanliku"] = "bzy",
["Obispeño"] = "obi",
["Oblo"] = "obl",
["Obo Manobo"] = "obo",
["Obokuitai"] = "afz",
["Obolo"] = "ann",
["Obulom"] = "obu",
["Ocotepec Mixtec"] = "mie",
["Ocotlán Zapotec"] = "zac",
["Od"] = "odk",
["Odiai"] = "bhf",
["Odoodee"] = "kkc",
["Odual"] = "odu",
["Odut"] = "oda",
["Ofayé"] = "opy",
["Ofo"] = "ofo",
["Ogbah"] = "ogc",
["Ogbia"] = "ogb",
["Ogbogolo"] = "ogg",
["Ogea"] = "eri",
["Oirata"] = "oia",
["Okiek"] = "oki",
["Oko-Eni-Osayen"] = "oks",
["Oko-Juwoi"] = "okj",
["Okobo"] = "okb",
["Okodia"] = "okd",
["Okolod"] = "kqv",
["Okpamheri"] = "opa",
["Okpe (Northwestern Edo)"] = "okx",
["Okpe (Southwestern Edo)"] = "oke",
["Okpela"] = "atg",
["Oksapmin"] = "opm",
["Oku"] = "oku",
["Okwanuchu"] = "nai-okw",
["Old Avar"] = "oav",
["Old Hungarian"] = "ohu",
["Old Kamta"] = "inc-ork",
["Old Kentish Sign Language"] = "okl",
["Old Manipuri"] = "omp",
["Old Punjabi"] = "inc-opa",
["Old Tati"] = "xme-ott",
["Old Tibetan"] = "otb",
["Tiếng Wales cổ"] = "owl",
["Olekha"] = "ole",
["Ollari"] = "gdb",
["Olo"] = "ong",
["Oloma"] = "olm",
["Olrat"] = "olr",
["Olu'bo"] = "lul",
["Olulumo-Ikom"] = "iko",
["Oluta Popoluca"] = "plo",
["Olutsotso"] = "lto",
["Omagua"] = "omg",
["Omba"] = "omb",
["Ombamba"] = "mbm",
["Ombo"] = "oml",
["Ometepec Nahuatl"] = "nht",
["Omi"] = "omi",
["Omotik"] = "omt",
["Omurano"] = "omu",
["Ong"] = "oog",
["Onin"] = "oni",
["Onjob"] = "onj",
["Ono"] = "ons",
["Onobasulu"] = "onn",
["Onondaga"] = "ono",
["Ontenu"] = "ont",
["Ontong Java"] = "ojv",
["Oorlams"] = "oor",
["Opao"] = "opo",
["Opata"] = "opt",
["Opuuo"] = "lgn",
["Opón"] = "sai-opo",
["Oraon Sadri"] = "sdr",
["Orejón"] = "ore",
["Oring"] = "org",
["Orizaba Nahuatl"] = "nlv",
["Orléanais"] = "roa-orl",
["Oro"] = "orx",
["Oro Win"] = "orw",
["Oroha"] = "ora",
["Orokaiva"] = "okv",
["Oroko"] = "bdu",
["Orokolo"] = "oro",
["Orowe"] = "bpk",
["Oruma"] = "orr",
["Orya"] = "ury",
["Osamayi"] = "syx",
["Ososo"] = "oso",
["Ot Danum"] = "otd",
["Otank"] = "uta",
["Oti"] = "oti",
["Otomaco"] = "sai-oto",
["Ottawa"] = "otw",
["Ouma"] = "oum",
["Oune"] = "oue",
["Owa"] = "stn",
["Owenia"] = "wsr",
["Owiniga"] = "owi",
["Oy"] = "oyb",
["Oya'oya"] = "oyy",
["Ozolotepec Zapotec"] = "zao",
["Pa"] = "ppt",
["Pa Di"] = "pdi",
["Pa'a"] = "pqa",
["Paama"] = "pma",
["Paasaal"] = "sig",
["Pacahuara"] = "pcp",
["Padoe"] = "pdo",
["Paeonian"] = "ine-pae",
["Pagi"] = "pgi",
["Pagibete"] = "pae",
["Pahanan Agta"] = "apf",
["Pahi"] = "lgt",
["Pahlavani"] = "phv",
["Pai Tavytera"] = "pta",
["Pai-lang"] = "tbq-plg",
["Paicî"] = "pri",
["Paikoneka"] = "awd-pai",
["Paipai"] = "ppi",
["Pajapan Nahuatl"] = "nhp",
["Pak-Tong"] = "pkg",
["Pakanha"] = "pkn",
["Pakistan Sign Language"] = "pks",
["Paku Karen"] = "kpp",
["Pal"] = "abw",
["Palaka Senoufo"] = "plr",
["Palantla Chinantec"] = "cpa",
["Palawan Batak"] = "bya",
["Paleni"] = "pnl",
["Palewyami"] = "nai-ply",
["Palikur"] = "plu",
["Pallanganmiddang"] = "pmd",
["Palta"] = "sai-pal",
["Palu'e"] = "ple",
["Paluan"] = "plz",
["Palya Bareli"] = "bpx",
["Pam"] = "pmn",
["Pambia"] = "pmb",
["Pamigua"] = "sai-pam",
["Pamlico"] = "pmk",
["Pamona"] = "pmf",
["Pamosu"] = "hih",
["Pamplona Atta"] = "att",
["Pana (Central Africa)"] = "pnz",
["Pana (West Africa)"] = "pnq",
["Panamanian Sign Language"] = "lsp",
["Panamint"] = "par",
["Panare"] = "pbh",
["Panará"] = "kre",
["Panasuan"] = "psn",
["Panawa"] = "pwb",
["Pande"] = "bkj",
["Pangseng"] = "pgs",
["Pangutaran Sama"] = "slm",
["Pangwa"] = "pbr",
["Panim"] = "pnr",
["Pankararé"] = "pax",
["Pankararú"] = "paz",
["Pankhu"] = "pkh",
["Pannei"] = "pnc",
["Panobo"] = "pno",
["Panyi Bai"] = "bfc",
["Panyjima"] = "pnw",
["Panzaleo"] = "sai-pnz",
["Pao"] = "ppa",
["Papapana"] = "ppn",
["Papar"] = "dpp",
["Papasena"] = "pas",
["Papel"] = "pbo",
["Papi"] = "ppe",
["Papitalai"] = "pat",
["Papora"] = "ppu",
["Papua New Guinean Sign Language"] = "pgz",
["Papuan Malay"] = "pmy",
["Para Naga"] = "pzn",
["Paraguayan Sign Language"] = "pys",
["Parakanã"] = "pak",
["Paranan"] = "prf",
["Paranawát"] = "paf",
["Paratió"] = "sai-par",
["Parawen"] = "prw",
["Pardhan"] = "pch",
["Pardhi"] = "pcl",
["Pare"] = "asa",
["Paredarerme"] = "xpd",
["Pará Arára"] = "aap",
["Pará Gavião"] = "gvp",
["Pasi"] = "psq",
["Pass Valley Yali"] = "yac",
["Passé"] = "awd-pas",
["Patagón"] = "sai-ptg",
["Patamona"] = "pbc",
["Patani"] = "ptn",
["Pataxó Hã-Ha-Hãe"] = "pth",
["Patep"] = "ptp",
["Pathiya"] = "pty",
["Patpatar"] = "gfk",
["Pattani"] = "lae",
["Pattapu"] = "ptq",
["Patwin"] = "pwi",
["Paulohi"] = "plh",
["Paumarí"] = "pad",
["Pauri Bareli"] = "bfb",
["Pauserna"] = "psm",
["Pawaia"] = "pwa",
["Payaguá"] = "sai-pyg",
["Paynamar"] = "pmr",
["Pe"] = "pai",
["Pech"] = "pay",
["Peerapper"] = "xpw",
["Peere"] = "pfe",
["Pei"] = "ppq",
["Pekal"] = "pel",
["Pele-Ata"] = "ata",
["Penang Sign Language"] = "psg",
["Penchal"] = "pek",
["Pendau"] = "ums",
["Penrhyn"] = "pnh",
["Pentlatch"] = "ptw",
["Perai"] = "wet",
["Perema"] = "wom",
["Pericú"] = "nai-per",
["Pero"] = "pip",
["Persian Sign Language"] = "psc",
["Peruvian Sign Language"] = "prl",
["Petapa Zapotec"] = "zpe",
["Petats"] = "pex",
["Peñoles Mixtec"] = "mil",
["Phala"] = "ypa",
["Phana'"] = "phq",
["Phangduwali"] = "phw",
["Phende"] = "pem",
["Philippine Sign Language"] = "psp",
["Philistine"] = "und-phi",
["Phimbi"] = "phm",
["Phola"] = "ypg",
["Pholo"] = "yip",
["Phom"] = "nph",
["Phudagi"] = "phd",
["Phuie"] = "pug",
["Phukha"] = "phh",
["Phuma"] = "ypm",
["Phunoi"] = "pho",
["Phupa"] = "ypp",
["Phupha"] = "yph",
["Phuthi"] = "bnt-phu",
["Phuza"] = "ypz",
["Piamatsina"] = "ptr",
["Piame"] = "pin",
["Piapoco"] = "pio",
["Piaroa"] = "pid",
["Tiếng Pichinglis"] = "fpe",
["Pichis Ashéninka"] = "cpu",
["Pictish"] = "xpi",
["Picuris"] = "nai-pic",
["Pidgin Delaware"] = "dep",
["Pidgin Iha"] = "ihb",
["Pidgin Onin"] = "onx",
["Pijao"] = "pij",
["Pije"] = "piz",
["Pijin"] = "pis",
["Pileni"] = "piv",
["Pima Bajo"] = "pia",
["Pimbwe"] = "piw",
["Pinai-Hagahai"] = "pnn",
["Pingelapese"] = "pif",
["Pini"] = "pii",
["Pinigura"] = "pnv",
["Pinjarup"] = "pnj",
["Pinji"] = "pic",
["Pinotepa Nacional Mixtec"] = "mio",
["Pintiini"] = "pti",
["Pintupi-Luritja"] = "piu",
["Pirahã"] = "myp",
["Piratapuyo"] = "pir",
["Pirlatapa"] = "bxi",
["Piro"] = "pie",
["Pirriya"] = "xpa",
["Pisabo"] = "pig",
["Pisaflores Tepehua"] = "tpp",
["Piscataway"] = "psy",
["Pisidian"] = "xps",
["Pitcairn-Norfolk"] = "pih",
["Pite Sami"] = "sje",
["Piti"] = "pcn",
["Pitta-Pitta"] = "pit",
["Piu"] = "pix",
["Piya-Kwonci"] = "piy",
["Plains Indian Sign Language"] = "psd",
["Plains Miwok"] = "pmw",
["Plapo Krumen"] = "ktj",
["Playero"] = "gob",
["Pochuri Naga"] = "npo",
["Pochutec"] = "xpo",
["Podoko"] = "pbi",
["Pogali"] = "hkh",
["Pogolo"] = "poy",
["Poitevin-Saintongeais"] = "roa-poi",
["Pokangá"] = "pok",
["Poke"] = "pof",
["Pol"] = "pmm",
["Polish Sign Language"] = "pso",
["Polonombauk"] = "plb",
["Pom"] = "pmo",
["Ponam"] = "ncc",
["Pongu"] = "png",
["Ponyo"] = "npg",
["Poqomam"] = "poc",
["Poqomchi'"] = "poh",
["Porohanon"] = "prh",
["Port Sandwich"] = "psw",
["Port Sorell"] = "xpl",
["Port Vato"] = "ptv",
["Portuguese Sign Language"] = "psr",
["Potiguára"] = "pog",
["Poumei Naga"] = "pmx",
["Pouye"] = "bye",
["Powari"] = "pwr",
["Powhatan"] = "pim",
["Poyanáwa"] = "pyn",
["Primitive Irish"] = "pgl",
["Principense"] = "pre",
["Proto-Amuesha-Chamicuro"] = "awd-amc-pro",
["Tiếng Tiểu Á nguyên thủy"] = "ine-ana-pro",
["Proto-Apachean"] = "apa-pro",
["Proto-Arawa"] = "auf-pro",
["Tiếng Armenia nguyên thủy"] = "hyx-pro",
["Proto-Arnhem"] = "aus-arn-pro",
["Proto-Atayalic"] = "map-ata-pro",
["Proto-Batak"] = "btk-pro",
["Proto-Bongo-Bagirmi"] = "csu-bba-pro",
["Proto-Boran"] = "sai-bor-pro",
["Proto-Bua"] = "alv-bua-pro",
["Proto-Bungku-Tolaki"] = "poz-btk-pro",
["Tiếng Miến nguyên thủy"] = "tbq-brm-pro",
["Proto-Caddoan"] = "cdd-pro",
["Proto-Cangin"] = "alv-cng-pro",
["Proto-Central Chadic"] = "cdc-cbm-pro",
["Proto-Central Indo-Aryan"] = "inc-cen-pro",
["Proto-Central Jê"] = "sai-cje-pro",
["Proto-Central New South Wales"] = "aus-cww-pro",
["Proto-Central Sudanic"] = "csu-pro",
["Proto-Central Togo"] = "alv-gtm-pro",
["Proto-Chatino"] = "omq-cha-pro",
["Proto-Chibchan"] = "cba-pro",
["Proto-Chimakuan"] = "chi-pro",
["Proto-Chinookan"] = "nai-ckn-pro",
["Tiếng Chukotka-Kamchatka nguyên thủy"] = "qfa-cka-pro",
["Proto-Chumash"] = "nai-chu-pro",
["Proto-Cupan"] = "azc-cup-pro",
["Proto-Daju"] = "sdv-daj-pro",
["Proto-Daly"] = "aus-dal-pro",
["Proto-Eastern Jebel"] = "sdv-eje-pro",
["Proto-Eastern Oti-Volta"] = "nic-eov-pro",
["Proto-Fali"] = "alv-fli-pro",
["Proto-Grassfields"] = "nic-grf-pro",
["Proto-Great Andamanese"] = "qfa-adm-pro",
["Proto-Guang"] = "alv-gng-pro",
["Proto-Gur"] = "nic-gur-pro",
["Proto-Gurunsi"] = "nic-gns-pro",
["Proto-Halmahera-Cenderawasih"] = "poz-hce-pro",
["Proto-Heiban"] = "alv-hei-pro",
["Proto-Highland East Cushitic"] = "cus-hec-pro",
["Proto-Hmong"] = "hmn-pro",
["Proto-Hrusish"] = "sit-hrs-pro",
["Proto-Huitoto-Ocaina"] = "sai-hoc-pro",
["Proto-Hurro-Urartian"] = "qfa-hur-pro",
["Proto-Idomoid"] = "alv-ido-pro",
["Proto-Igboid"] = "alv-igb-pro",
["Proto-Ijoid"] = "ijo-pro",
["Proto-Iwaidjan"] = "aus-wdj-pro",
["Proto-Jukunoid"] = "nic-jkn-pro",
["Proto-Kadu"] = "qfa-kad-pro",
["Proto-Kalamian"] = "phi-kal-pro",
["Proto-Kalapuyan"] = "nai-klp-pro",
["Proto-Kampa"] = "awd-kmp-pro",
["Proto-Kham"] = "sit-kha-pro",
["Proto-Khoe"] = "khi-kho-pro",
["Proto-Komisenian"] = "ira-kms-pro",
["Proto-Kru"] = "kro-pro",
["Proto-Kuliak"] = "ssa-klk-pro",
["Proto-Kurdish"] = "ku-pro",
["Proto-Kwa"] = "alv-kwa-pro",
["Proto-Lalo"] = "tbq-lal-pro",
["Proto-Lampungic"] = "poz-lgx-pro",
["Proto-Loloish"] = "tbq-lol-pro",
["Proto-Lower Cross River"] = "nic-lcr-pro",
["Proto-Luish"] = "sit-luu-pro",
["Proto-Maidun"] = "nai-mdu-pro",
["Proto-Mangbetu"] = "csu-maa-pro",
["Proto-Masa"] = "cdc-mas-pro",
["Proto-Mazatec"] = "omq-maz-pro",
["Proto-Medo-Parthian"] = "ira-mpr-pro",
["Proto-Mixe-Zoque"] = "nai-miz-pro",
["Proto-Mixtec"] = "omq-mxt-pro",
["Proto-Mumuye"] = "alv-mum-pro",
["Proto-Munji-Yidgha"] = "ira-mny-pro",
["Proto-Na-Dene"] = "xnd-pro",
["Proto-Nawiki"] = "awd-nwk-pro",
["Proto-Nilotic"] = "sdv-nil-pro",
["Proto-North Caucasian"] = "ccn-pro",
["Proto-North Halmahera"] = "paa-nha-pro",
["Proto-North Sarawak"] = "poz-swa-pro",
["Proto-Nubian"] = "nub-pro",
["Proto-Numic"] = "azc-num-pro",
["Proto-Nupoid"] = "alv-nup-pro",
["Proto-Nyima"] = "sdv-nyi-pro",
["Proto-Nyulnyulan"] = "aus-nyu-pro",
["Proto-Ogoni"] = "nic-ogo-pro",
["Proto-Ossetic"] = "os-pro",
["Proto-Oti-Volta"] = "nic-ovo-pro",
["Proto-Oto-Manguean"] = "omq-pro",
["Proto-Oto-Pamean"] = "omq-otp-pro",
["Proto-Otomi"] = "oto-otm-pro",
["Proto-Otomian"] = "oto-pro",
["Proto-Paresi-Waura"] = "awd-prw-pro",
["Proto-Plateau Penutian"] = "nai-plp-pro",
["Proto-Pomeranian"] = "zlw-pom-pro",
["Proto-Pomo"] = "nai-pom-pro",
["Proto-Saka"] = "xsc-sak-pro",
["Proto-Sanglechi-Ishkashimi"] = "ira-sgi-pro",
["Proto-Sara"] = "csu-sar-pro",
["Proto-Siouan-Catawban"] = "nai-sca-pro",
["Proto-Songhay"] = "son-pro",
["Proto-Sotho-Tswana"] = "bnt-sts-pro",
["Proto-South Cushitic"] = "cus-sou-pro",
["Proto-South Sulawesi"] = "poz-ssw-pro",
["Proto-Southern Jê"] = "sai-sje-pro",
["Proto-Sunda-Sulawesi"] = "poz-sus-pro",
["Proto-Ta-Arawak"] = "awd-taa-pro",
["Proto-Takic"] = "azc-tak-pro",
["Proto-Taman"] = "sdv-tmn-pro",
["Proto-Tani"] = "sit-tan-pro",
["Proto-Taranoan"] = "sai-tar-pro",
["Proto-Tatic"] = "xme-ttc-pro",
["Proto-Totozoquean"] = "nai-tot-pro",
["Tiếng Liên New Guinea nguyên thủy"] = "ngf-pro",
["Proto-Tsezian"] = "cau-tsz-pro",
["Proto-Tsimshianic"] = "nai-tsi-pro",
["Proto-Upper Cross River"] = "nic-ucr-pro",
["Proto-Utian"] = "nai-utn-pro",
["Proto-Western Mande"] = "dmn-mdw-pro",
["Proto-Witotoan"] = "sai-wit-pro",
["Proto-Yupik"] = "ypk-pro",
["Proto-Zapotecan"] = "omq-zap-pro",
["Providencia Sign Language"] = "prz",
["Psikye"] = "kvj",
["Puare"] = "pux",
["Pudtol Atta"] = "atp",
["Puebla Mazatec"] = "pbm",
["Puelche"] = "pue",
["Puerto Rican Sign Language"] = "psl",
["Puimei Naga"] = "npu",
["Puiron"] = "sit-prn",
["Pukapukan"] = "pkp",
["Pulabu"] = "pup",
["Puluwat"] = "puw",
["Puma"] = "pum",
["Pumé"] = "yae",
["Punan Aput"] = "pud",
["Punan Bah-Biau"] = "pna",
["Punan Batu"] = "pnm",
["Punan Merah"] = "puf",
["Punan Merap"] = "puc",
["Punan Tubu"] = "puj",
["Punu"] = "puu",
["Puquina"] = "puq",
["Puragi"] = "pru",
["Purari"] = "iar",
["Purepecha"] = "pua",
["Puri"] = "prr",
["Purik"] = "prx",
["Purisimeño"] = "puy",
["Puruborá"] = "pur",
["Puruhá"] = "sai-prh",
["Purukotó"] = "sai-pur",
["Purum"] = "pub",
["Putai"] = "mfl",
["Putoh"] = "put",
["Putukwam"] = "afe",
["Puyo-Paekche"] = "xpp",
["Pwaamei"] = "pme",
["Pwapwa"] = "pop",
["Pyapun"] = "pcw",
["Pye Krumen"] = "pye",
["Pyemmairre"] = "xpb",
["Pyen"] = "pyy",
["Pykobjê"] = "sai-pyk",
["Pyu"] = "pby",
["Páez"] = "pbb",
["Pááfang"] = "pfa",
["Päri"] = "lkr",
["Pémono"] = "pev",
["Pévé"] = "lme",
["Pökoot"] = "pko",
["Q'anjob'al"] = "kjb",
["Q'eqchi"] = "kek",
["Qabiao"] = "laq",
["Qaqet"] = "byx",
["Qatabanian"] = "xqt",
["Qau"] = "gqu",
["Qila Muji"] = "ymq",
["Quebec Sign Language"] = "fcs",
["Querétaro Otomi"] = "otq",
["Quetzaltepec Mixe"] = "pxm",
["Queyu"] = "qvy",
["Quiavicuzas Zapotec"] = "zpj",
["Quileute"] = "qui",
["Quimbaya"] = "sai-qmb",
["Quinigua"] = "nai-qng",
["Quinqui"] = "quq",
["Quioquitani-Quierí Zapotec"] = "ztq",
["Quiotepec Chinantec"] = "chq",
["Quitemo"] = "sai-qtm",
["Rabona"] = "sai-rab",
["Rahambuu"] = "raz",
["Rajah Kabunsuwan Manobo"] = "mqk",
["Raji"] = "rji",
["Rajong"] = "rjg",
["Rakahanga-Manihiki"] = "rkh",
["Ralte"] = "ral",
["Ramandi"] = "tks",
["Ramanos"] = "sai-ram",
["Ramoaaina"] = "rai",
["Ramopa"] = "kjx",
["Rampi"] = "lje",
["Rana Tharu"] = "thr",
["Rang"] = "rax",
["Rangkas"] = "rgk",
["Ranglong"] = "rnl",
["Rao"] = "rao",
["Rapa"] = "ray",
["Rapoisi"] = "kyx",
["Rapting"] = "rpt",
["Rara Bakati'"] = "lra",
["Ratahan"] = "rth",
["Rathawi"] = "rtw",
["Rathwi Bareli"] = "bgd",
["Rawa"] = "rwo",
["Rawat"] = "jnl",
["Rawo"] = "rwa",
["Rayón Zoque"] = "zor",
["Razajerdi"] = "rat",
["Razihi"] = "rzh",
["Reang"] = "ria",
["Red Gelao"] = "gir",
["Reel"] = "atu",
["Rejang Kayan"] = "ree",
["Rema"] = "bow",
["Rembarunga"] = "rmb",
["Rembong"] = "reb",
["Remo"] = "rem",
["Remontado Agta"] = "agv",
["Rempi"] = "rmp",
["Remun"] = "lkj",
["Rennellese"] = "mnv",
["Repanbitip"] = "rpn",
["Rer Bare"] = "rer",
["Rerau"] = "rea",
["Rerep"] = "pgk",
["Reshe"] = "res",
["Resígaro"] = "rgr",
["Retta"] = "ret",
["Reyesano"] = "rey",
["Rhine Franconian"] = "gmw-rfr",
["Riang"] = "ril",
["Riantana"] = "ran",
["Ribun"] = "rir",
["Rigwe"] = "iri",
["Rikbaktsa"] = "rkb",
["Ringgou"] = "rgu",
["Ririo"] = "rri",
["Ritarungo"] = "rit",
["Riung"] = "riu",
["Riverain Sango"] = "snj",
["Rogo"] = "rod",
["Roma"] = "rmm",
["Romani Greek"] = "rge",
["Romanian Sign Language"] = "rms",
["Romano-Serbian"] = "rsb",
["Romanova"] = "rmv",
["Romblomanon"] = "rol",
["Rombo"] = "rof",
["Romkun"] = "rmk",
["Ron"] = "cla",
["Ronga"] = "rng",
["Rongga"] = "ror",
["Rongmei Naga"] = "nbu",
["Rongpo"] = "rnp",
["Ronji"] = "roe",
["Roon"] = "rnn",
["Roria"] = "rga",
["Roro"] = "rro",
["Rotokas"] = "roo",
["Roviana"] = "rug",
["Rudbari"] = "rdb",
["Rufiji"] = "rui",
["Ruga"] = "ruh",
["Rukiga"] = "cgg",
["Ruma"] = "ruz",
["Rumu"] = "klq",
["Runga"] = "rou",
["Rungtu"] = "rtc",
["Rungwa"] = "rnw",
["Russenorsk"] = "crp-rsn",
["Russian Sign Language"] = "rsl",
["Ruuli"] = "ruc",
["Ruwund"] = "rnd",
["Rwa"] = "rwk",
["Rwanda-Rundi"] = "rw",
["Sa"] = "sax",
["Sa'a"] = "apb",
["Sa'ban"] = "snv",
["Sa'och"] = "scq",
["Saafi-Saafi"] = "sav",
["Saam"] = "raq",
["Saamia"] = "lsm",
["Saare"] = "uss",
["Sabah Malay"] = "msi",
["Sabanê"] = "sae",
["Sabaot"] = "spy",
["Sabine"] = "sbv",
["Sabir"] = "pml",
["Sabu"] = "hvn",
["Sacapulteco"] = "quv",
["Saep"] = "spd",
["Safaitic"] = "sem-saf",
["Safaliba"] = "saf",
["Safeyoka"] = "apz",
["Safwa"] = "sbk",
["Sagala"] = "sbm",
["Sagalla"] = "tga",
["Sahaptin"] = "nai-spt",
["Sahu"] = "saj",
["Sajau Basap"] = "sjb",
["Sakachep"] = "sch",
["Sakam"] = "skm",
["Sakao"] = "sku",
["Sakata"] = "skt",
["Sake"] = "sak",
["Sala"] = "shq",
["Salampasu"] = "slx",
["Salas"] = "sgu",
["Salchuq"] = "slq",
["Saleman"] = "sau",
["Saliba (Colombia)"] = "slc",
["Saliba (New Guinea)"] = "sbe",
["Salinan"] = "sln",
["Salt-Yui"] = "sll",
["Saluan"] = "loe",
["Salumá"] = "slj",
["Salvadoran Lenca"] = "nai-sln",
["Salvadoran Sign Language"] = "esn",
["Sam"] = "snx",
["Sama"] = "smd",
["Samaritan Aramaic"] = "sam",
["Samaritan Hebrew"] = "smp",
["Samarokena"] = "tmj",
["Samatao"] = "ysd",
["Samba"] = "smx",
["Sambe"] = "xab",
["Samberigi"] = "ssx",
["Samburu"] = "saq",
["Samoan Plantation Pidgin"] = "cpe-spp",
["Samosa"] = "swm",
["Sampang"] = "rav",
["Samre"] = "sxm",
["Samvedi"] = "smv",
["San Agustín Mixtepec Zapotec"] = "ztm",
["San Baltazar Loxicha Zapotec"] = "zpx",
["San Felipe Otlaltepec Popoloca"] = "pow",
["San Jerónimo Tecóatl Mazatec"] = "maa",
["San Juan Atzingo Popoloca"] = "poe",
["San Juan Colorado Mixtec"] = "mjc",
["San Juan Quiahije Chatino"] = "ctp-san",
["San Juan Teita Mixtec"] = "xtj",
["San Luís Temalacayuca Popoloca"] = "pps",
["San Marcos Tlalcoyalco Popoloca"] = "pls",
["San Miguel Creole French"] = "scf",
["San Miguel Piedras Mixtec"] = "xtp",
["San Miguel el Grande Mixtec"] = "mig",
["San Pablo Güilá Zapotec"] = "ztu",
["San Pedro Amuzgos Amuzgo"] = "azg",
["San Pedro Quiatoni Zapotec"] = "zpf",
["San Vicente Coatlán Zapotec"] = "zpt",
["Sanapaná"] = "spn",
["Sanaviron"] = "sai-san",
["Sandawe"] = "sad",
["Sanga (Congo)"] = "sng",
["Sanga (Nigeria)"] = "xsn",
["Sanggau"] = "scg",
["Sangil"] = "snl",
["Sangkong"] = "sgk",
["Sanglechi"] = "sgy",
["Sangtam Naga"] = "nsa",
["Sangu (Gabon)"] = "snq",
["Sangu (Tanzania)"] = "sbp",
["Sani"] = "ysn",
["Sanie"] = "ysy",
["Saniyo-Hiyewe"] = "sny",
["Sankaran Maninka"] = "msc",
["Sansi"] = "ssi",
["Santa Catarina Albarradas Zapotec"] = "ztn",
["Santa Inés Ahuatempan Popoloca"] = "pca",
["Santa Inés Yatzechi Zapotec"] = "zpn",
["Santa Lucía Monteverde Mixtec"] = "mdv",
["Santa María La Alta Nahuatl"] = "nhz",
["Santa María Quiegolani Zapotec"] = "zpi",
["Santa María Zacatepec Mixtec"] = "mza",
["Santa Teresa Cora"] = "cok",
["Santiago Xanica Zapotec"] = "zpr",
["Santo Domingo Albarradas Zapotec"] = "zas",
["Sanumá"] = "xsu",
["Saparua"] = "spr",
["Sapará"] = "sai-sap",
["Sapo"] = "krn",
["Saponi"] = "spi",
["Sapuan"] = "spu",
["Sapé"] = "spc",
["Sar"] = "mwm",
["Sara"] = "sre",
["Sara Kaba"] = "sbz",
["Sara Kaba Deme"] = "kwg",
["Sara Kaba Náà"] = "kwv",
["Sarangani Blaan"] = "bps",
["Sarangani Manobo"] = "mbs",
["Sarasira"] = "zsa",
["Saraveca"] = "sar",
["Sarli"] = "sdf",
["Sartang"] = "onp",
["Sarua"] = "swy",
["Sarudu"] = "sdu",
["Saruga"] = "sra",
["Sasaru"] = "sxs",
["Tiếng Sassari"] = "sdc",
["Satawalese"] = "stw",
["Sateré-Mawé"] = "mav",
["Sathmar Swabian"] = "gmw-stm",
["Saudi Arabian Sign Language"] = "sdl",
["Sauraseni Apabhramsa"] = "inc-sap",
["Sauri"] = "srt",
["Sause"] = "sao",
["Sausi"] = "ssj",
["Savosavo"] = "svs",
["Sawai"] = "szw",
["Saweru"] = "swr",
["Sawi"] = "saw",
["Sawila"] = "swt",
["Saya"] = "say",
["Sayula Popoluca"] = "pos",
["Scanian"] = "gmq-scy",
["Seba"] = "kdg",
["Seberuang"] = "sbx",
["Sebop"] = "sib",
["Sebuyau"] = "snb",
["Sechura"] = "sai-sec",
["Secoya"] = "sey",
["Sedoa"] = "tvw",
["Seenku"] = "sos",
["Segai"] = "sge",
["Segeju"] = "seg",
["Seget"] = "sbg",
["Sehwi"] = "sfw",
["Seim"] = "sim",
["Seimat"] = "ssg",
["Seit-Kaitetu"] = "hik",
["Sekani"] = "sek",
["Sekapan"] = "skp",
["Sekar"] = "skz",
["Seke"] = "skj",
["Sekele"] = "vaj",
["Seki"] = "syi",
["Seko Padang"] = "skx",
["Seko Tengah"] = "sko",
["Sekpele"] = "lip",
["Selangor Sign Language"] = "kgi",
["Selaru"] = "slu",
["Selayar"] = "sly",
["Selee"] = "snw",
["Selepet"] = "spl",
["Selk'nam"] = "ona",
["Selonian"] = "sxl",
["Selungai Murut"] = "slg",
["Seluwasan"] = "sws",
["Sema"] = "nsm",
["Semandang"] = "sdm",
["Sembakung Murut"] = "sbr",
["Semimi"] = "etz",
["Semnani"] = "smy",
["Sempan"] = "xse",
["Senara Sénoufo"] = "seq",
["Senaya"] = "syn",
["Sene"] = "sej",
["Sengele"] = "szg",
["Senggi"] = "snu",
["Sengo"] = "spk",
["Sengseng"] = "ssz",
["Sensi"] = "sni",
["Sentani"] = "set",
["Senthang Chin"] = "sez",
["Sentinelese"] = "std",
["Sepa (Indonesia)"] = "spb",
["Sepa (New Guinea)"] = "spe",
["Sepen"] = "spm",
["Sepik Iwam"] = "iws",
["Sepik Mari"] = "mbx",
["Sera"] = "sry",
["Sere"] = "swf",
["Serili"] = "sve",
["Seroa"] = "kqu",
["Serrano"] = "ser",
["Seru"] = "szd",
["Serua"] = "srw",
["Serudung Murut"] = "srk",
["Serui-Laut"] = "seu",
["Seta"] = "stf",
["Setaman"] = "stm",
["Seti"] = "sbi",
["Sewa Bay"] = "sew",
["Seychellois Creole"] = "crs",
["Sha"] = "scw",
["Shahmirzadi"] = "srz",
["Shahrudi"] = "shm",
["Shall-Zwall"] = "sha",
["Shama-Sambuga"] = "sqa",
["Shamang"] = "xsh",
["Shambala"] = "ksb",
["Shanenawa"] = "swo",
["Shanga"] = "sho",
["Shangzhai"] = "jih",
["Shaozhou Tuhua"] = "zhx-sht",
["Sharanahua"] = "mcd",
["Shark Bay"] = "ssv",
["Sharwa"] = "swq",
["Shasta"] = "sht",
["Shatt"] = "shj",
["Shau"] = "sqh",
["Shawnee"] = "sjw",
["She"] = "shx",
["Shehri"] = "shv",
["Sheko"] = "she",
["Shelta"] = "sth",
["Shendu"] = "shl",
["Sheni"] = "scv",
["Sherbro"] = "bun",
["Sherdukpen"] = "sdp",
["Shi"] = "shr",
["Shihhi Arabic"] = "ssh",
["Shiki"] = "gua",
["Shilluk"] = "shk",
["Shipibo-Conibo"] = "shp",
["Shixing"] = "sxg",
["Shoo-Minda-Nye"] = "bcv",
["Shoshone"] = "shh",
["Shua"] = "shg",
["Shuar"] = "jiv",
["Shuba"] = "cbq",
["Shumashti"] = "sts",
["Shumcho"] = "scu",
["Shuwa-Zamani"] = "ksa",
["Shwai"] = "shw",
["Sialum"] = "slw",
["Siamou"] = "sif",
["Sian"] = "spg",
["Siane"] = "snp",
["Siang"] = "sya",
["Siar-Lak"] = "sjr",
["Sibe"] = "nco",
["Sibu Melanau"] = "sdx",
["Sicanian"] = "sxc",
["Siculo-Arabic"] = "sqr",
["Sidetic"] = "xsd",
["Sie"] = "erg",
["Sierra Leone Sign Language"] = "sgx",
["Sierra Negra Nahuatl"] = "nsu",
["Sierra de Juárez Zapotec"] = "zaa",
["Sighu"] = "sxe",
["Sihan"] = "snr",
["Sika"] = "ski",
["Sikaiana"] = "sky",
["Sikaritai"] = "tty",
["Sikiana"] = "sik",
["Sikule"] = "skh",
["Sila"] = "slt",
["Silacayoapan Mixtec"] = "mks",
["Sileibi"] = "sbq",
["Silimo"] = "wul",
["Siliput"] = "mkc",
["Silopi"] = "xsp",
["Simaa"] = "sie",
["Simba"] = "sbw",
["Simbali"] = "smg",
["Simbari"] = "smb",
["Simbo"] = "sbb",
["Simeku"] = "smz",
["Simeulue"] = "smr",
["Simte"] = "smt",
["Sinacantán"] = "nai-sin",
["Sinagen"] = "siu",
["Sinasina"] = "sst",
["Sindarin"] = "sjn",
["Sindhi Bhil"] = "sbn",
["Sindihui Mixtec"] = "xts",
["Singa"] = "sgm",
["Singapore Sign Language"] = "sls",
["Singpho"] = "sgp",
["Sinicahua Mixtec"] = "xti",
["Sininkere"] = "skq",
["Sinte Romani"] = "rmo",
["Sinyar"] = "sys",
["Sinúfana"] = "sai-sin",
["Sio"] = "xsi",
["Siona"] = "snn",
["Sipakapense"] = "qum",
["Sira"] = "swj",
["Siri"] = "sir",
["Siriano"] = "sri",
["Sirionó"] = "srq",
["Siroi"] = "ssd",
["Siuslaw"] = "sis",
["Sivandi"] = "siy",
["Siwai"] = "siw",
["Siyin Chin"] = "csy",
["Skagit"] = "ska",
["Skalvian"] = "svx",
["Ske"] = "ske",
["Skou"] = "skv",
["Slavomolisano"] = "svm",
["Slovakian Sign Language"] = "svk",
["Small Flowery Miao"] = "sfm",
["Smärky Kanum"] = "kxq",
["Snohomish"] = "sno",
["So'a"] = "ssq",
["Sobei"] = "sob",
["Sochiapam Chinantec"] = "cso",
["Soga"] = "xog",
["Sok"] = "skk",
["Soko"] = "soc",
["Sokoro"] = "sok",
["Solano"] = "xso",
["Soli"] = "sby",
["Solos"] = "sol",
["Som"] = "smc",
["Somba-Siawari"] = "bmu",
["Somra"] = "ntx",
["Somrai"] = "sor",
["Somray"] = "smu",
["Somyev"] = "kgt",
["Sonaga"] = "ysg",
["Sonde"] = "shc",
["Songe"] = "sop",
["Songomeno"] = "soe",
["Songoora"] = "sod",
["Sonha"] = "soi",
["Sonia"] = "siq",
["Soo"] = "teu",
["Sop"] = "urw",
["Sori-Harengan"] = "sbh",
["Sorkhei"] = "sqo",
["Sorothaptic"] = "sxo",
["Sorsogon Ayta"] = "ays",
["Sos Kundi"] = "sdk",
["Sota Kanum"] = "krz",
["Sou"] = "sqq",
["South African Sign Language"] = "sfs",
["South Awyu"] = "aws",
["South Boma"] = "bnt-sbo",
["South Central Banda"] = "lnl",
["South Central Dinka"] = "dib",
["South Fali"] = "fal",
["South Giziga"] = "giz",
["South Lembata"] = "lmf",
["South Muyu"] = "kts",
["South Nuaulu"] = "nxl",
["South Tairora"] = "omw",
["South Ucayali Ashéninka"] = "cpy",
["South Watut"] = "mcy",
["Southeast Ambrym"] = "tvk",
["Southeast Babar"] = "vbb",
["Southeast Ijo"] = "ijs",
["Southeast Pashayi"] = "psi",
["Southeast Tasmanian"] = "xpf",
["Southeastern Dinka"] = "dks",
["Southeastern Ixtlán Zapotec"] = "zpd",
["Southeastern Nochixtlán Mixtec"] = "mxy",
["Southeastern Pomo"] = "pom",
["Southeastern Puebla Nahuatl"] = "npl",
["Southeastern Tarahumara"] = "tcu",
["Southern Alta"] = "agy",
["Southern Birifor"] = "biv",
["Southern Bobo"] = "bwq",
["Southern Bontoc"] = "obk",
["Southern Catanduanes Bicolano"] = "bln",
["Southern Dagaare"] = "dga",
["Southern Ghale"] = "ghe",
["Southern Grebo"] = "grj",
["Southern Guiyang Hmong"] = "hmy",
["Southern Haida"] = "hax",
["Southern Hindko"] = "hnd",
["Southern Kalapuya"] = "sxk",
["Southern Kalinga"] = "ksc",
["Southern Khanty"] = "kca-sou",
["Southern Kissi"] = "kss",
["Southern Kiwai"] = "kjd",
["Tiếng Xwarin"] = "sdh",
["Southern Lolopo"] = "ysp",
["Southern Lorung"] = "lrr",
["Southern Ma'di"] = "snm",
["Southern Mashan Hmong"] = "hma",
["Southern Muji"] = "ymc",
["Southern Ngbandi"] = "nbw",
["Southern Nisu"] = "nsd",
["Southern Nuni"] = "nnw",
["Southern Ohlone"] = "css",
["Southern One"] = "osu",
["Southern Pame"] = "pmz",
["Southern Pinghua"] = "csp",
["Southern Pomo"] = "peq",
["Southern Puebla Mixtec"] = "mit",
["Southern Puget Sound Salish"] = "slh",
["Southern Pumi"] = "pmj",
["Southern Qiandong Miao"] = "hms",
["Southern Rengma Naga"] = "nre",
["Southern Sama"] = "ssb",
["Southern Sierra Miwok"] = "skd",
["Southern Tidong"] = "itd",
["Southern Tiwa"] = "tix",
["Southern Toussian"] = "wib",
["Southern Tutchone"] = "tce",
["Southern Valley Yokuts"] = "nai-svy",
["Southwest Gbaya"] = "gso",
["Southwest Palawano"] = "plv",
["Southwest Pashayi"] = "psh",
["Southwest Tanna"] = "nwi",
["Southwestern Bontoc"] = "vbk",
["Southwestern Dinka"] = "dik",
["Southwestern Fars"] = "fay",
["Southwestern Guiyang Hmong"] = "hmg",
["Southwestern Huishui Hmong"] = "hmh",
["Southwestern Nisu"] = "nsv",
["Southwestern Tamang"] = "tsf",
["Southwestern Tarahumara"] = "twr",
["Southwestern Tepehuan"] = "tla",
["Southwestern Tlaxiaco Mixtec"] = "meh",
["Sowa"] = "sww",
["Sowanda"] = "sow",
["Soyaltepec Mazatec"] = "vmp",
["Soyaltepec Mixtec"] = "vmq",
["Spanish Sign Language"] = "ssp",
["Spiti Bhoti"] = "spt",
["Spokane"] = "spo",
["Sri Lankan Creole Malay"] = "sci",
["Sri Lankan Sign Language"] = "sqs",
["Stod Bhoti"] = "sbu",
["Stoney"] = "sto",
["Suabo"] = "szp",
["Suarmin"] = "seo",
["Suau"] = "swp",
["Suba"] = "sxb",
["Suba-Simbiti"] = "ssc",
["Subi"] = "xsj",
["Subiya"] = "sbs",
["Subtiaba"] = "sut",
["Sudest"] = "tgo",
["Sudovian"] = "xsv",
["Suena"] = "sue",
["Suga"] = "sgi",
["Suganga"] = "sug",
["Sugut Dusun"] = "kzs",
["Suki"] = "sui",
["Suku"] = "sub",
["Sukuma"] = "suk",
["Sukur"] = "syk",
["Sukurum"] = "zsu",
["Sula"] = "szn",
["Sulka"] = "sua",
["Sulod"] = "srg",
["Suma"] = "sqm",
["Sumariup"] = "siv",
["Sumau"] = "six",
["Tiếng Sumbawa"] = "smw",
["Sumbwa"] = "suw",
["Sumtu Chin"] = "csv",
["Sunam"] = "ssk",
["Sunum"] = "ymn",
["Sunwar"] = "suz",
["Suoy"] = "syo",
["Supyire"] = "spp",
["Sur"] = "tdl",
["Surbakhal"] = "sbj",
["Surigaonon"] = "sgd",
["Sursurunga"] = "sgz",
["Suruahá"] = "swx",
["Surubu"] = "sde",
["Suruí"] = "sru",
["Suruí Do Pará"] = "mdz",
["Susquehannock"] = "sqn",
["Susuami"] = "ssu",
["Suundi"] = "sdj",
["Suwawa"] = "swu",
["Suyá"] = "suy",
["Swabian"] = "swg",
["Swampy Cree"] = "csw",
["Swedish Sign Language"] = "swl",
["Swiss-French Sign Language"] = "ssr",
["Swiss-German Sign Language"] = "sgg",
["Swiss-Italian Sign Language"] = "slf",
["Swo"] = "sox",
["Syenara Senoufo"] = "shz",
["Sácata"] = "sai-sac",
["São Paulo Kaingáng"] = "zkp",
["Sãotomense"] = "cri",
["Sìcìté Sénoufo"] = "sep",
["T'en"] = "tct",
["Tabaa Zapotec"] = "zat",
["Tabancale"] = "sai-tab",
["Tabaru"] = "tby",
["Tabasco Chontal"] = "chf",
["Tabasco Nahuatl"] = "nhc",
["Tabasco Zoque"] = "zoq",
["Tabla"] = "tnm",
["Tabo"] = "knv",
["Tabriak"] = "tzx",
["Tacahua Mixtec"] = "xtt",
["Tacana"] = "tna",
["Tadaksahak"] = "dsq",
["Tae'"] = "rob",
["Tafreshi"] = "xme-taf",
["Tagabawa"] = "bgs",
["Tagakaulu Kalagan"] = "klg",
["Tagbanwa"] = "tbw",
["Tagbu"] = "tbm",
["Tagish"] = "tgx",
["Tagwana Senoufo"] = "tgw",
["Tai"] = "taw",
["Tai Hang Tong"] = "thc",
["Tai Hongjin"] = "tiz",
["Tai Long"] = "thi",
["Tai Thanh"] = "tmm",
["Tai Ya"] = "cuu",
["Taiap"] = "gpn",
["Taikat"] = "aos",
["Tainae"] = "ago",
["Tairuma"] = "uar",
["Taita"] = "dav",
["Taiwan Sign Language"] = "tss",
["Taje"] = "pee",
["Tajio"] = "tdj",
["Tajuasohn"] = "tja",
["Takelma"] = "tkm",
["Takia"] = "tbc",
["Takka Apabhramsa"] = "inc-tak",
["Takua"] = "tkz",
["Takuu"] = "nho",
["Takwane"] = "tke",
["Talaud"] = "tld",
["Taliabu"] = "tlv",
["Talieng"] = "tdf",
["Talinga-Bwisi"] = "tlj",
["Talise"] = "tlr",
["Tallán"] = "sai-tal",
["Talodi"] = "tlo",
["Taloki"] = "tlk",
["Talondo'"] = "tln",
["Talu"] = "yta",
["Tama (Chad)"] = "tma",
["Tama (Colombia)"] = "ten",
["Tamagario"] = "tcg",
["Tamambo"] = "mla",
["Taman (Indonesia)"] = "tmn",
["Taman (Myanmar)"] = "tcl",
["Tamanaku"] = "tmz",
["Tamazola Mixtec"] = "vmx",
["Tambas"] = "tdk",
["Tambora"] = "xxt",
["Tambotalo"] = "tls",
["Tambunan Dusun"] = "kzt",
["Tami"] = "tmy",
["Tamnim Citak"] = "tml",
["Tampias Lobu"] = "low",
["Tampulma"] = "tpm",
["Tanacross"] = "tcb",
["Tanahmerah"] = "tcm",
["Tanapag"] = "tpv",
["Tandaganon"] = "tgn",
["Tandia"] = "tni",
["Tanema"] = "tnx",
["Tangale"] = "tan",
["Tangam"] = "sit-tgm",
["Tanggu"] = "tgu",
["Tangko"] = "tkx",
["Tangsa"] = "nst",
["Tanguat"] = "tbs",
["Tanimuca-Retuarã"] = "tnc",
["Tanjijili"] = "uji",
["Tanudan Kalinga"] = "kml",
["Tanzanian Sign Language"] = "tza",
["Tapachultec"] = "nai-tap",
["Taparita"] = "sai-tpr",
["Tapayuna"] = "sai-tap",
["Tapeba"] = "tbb",
["Tapei"] = "afp",
["Tapieté"] = "tpj",
["Tar Gula"] = "kcm",
["Tarairiú"] = "sai-trr",
["Tarao"] = "tro",
["Taraon"] = "mhu",
["Tareng"] = "tgr",
["Tarjumo"] = "txj",
["Tarok"] = "yer",
["Tarpia"] = "tpf",
["Tartessian"] = "txr",
["Taruma"] = "tdm",
["Tasmate"] = "tmt",
["Tataltepec Chatino"] = "cta",
["Tatana"] = "txx",
["Tataviam"] = "azc-tat",
["Tauade"] = "ttd",
["Taulil"] = "tuh",
["Taupota"] = "tpa",
["Taushiro"] = "trr",
["Tauya"] = "tya",
["Taveta"] = "tvs",
["Tawala"] = "tbo",
["Tawandê"] = "xtw",
["Tawang Monpa"] = "twm",
["Tawasa"] = "nai-taw",
["Taworta"] = "tbp",
["Tawoyan"] = "twy",
["Tawr Chin"] = "tcp",
["Tay Khang"] = "tnu",
["Tayabas Ayta"] = "ayy",
["Tayo"] = "cks",
["Tboli"] = "tbl",
["Tchitchege"] = "tck",
["Tchumbuli"] = "bqa",
["Te'un"] = "tve",
["Teanu"] = "tkw",
["Tebul Sign Language"] = "tsy",
["Tebul Ure Dogon"] = "dtu",
["Tecpatlán Totonac"] = "tcw",
["Tedaga"] = "tuq",
["Tee"] = "tkq",
["Tefaro"] = "tfo",
["Tegali"] = "ras",
["Tehit"] = "kps",
["Tehuelche"] = "teh",
["Teiwa"] = "twe",
["Tejalapan Zapotec"] = "ztt",
["Teke-Fuumu"] = "ifm",
["Teke-Kukuya"] = "kkw",
["Teke-Laali"] = "lli",
["Teke-Tege"] = "teg",
["Teke-Tsaayi"] = "tyi",
["Teke-Tyee"] = "tyx",
["Tektiteko"] = "ttc",
["Tela-Masbuar"] = "tvm",
["Telefol"] = "tlf",
["Teluti"] = "tlt",
["Tembé"] = "tqb",
["Teme"] = "tdo",
["Temein"] = "teq",
["Temi"] = "soz",
["Temne"] = "tem",
["Temoaya Otomi"] = "ott",
["Tempasuk Dusun"] = "tdu",
["Tenango Otomi"] = "otn",
["Tene Kan Dogon"] = "dtk",
["Tenggarong Kutai Malay"] = "vkt",
["Tenino"] = "tqn",
["Tenis"] = "tns",
["Tennet"] = "tex",
["Teojomulco Chatino"] = "omq-teo",
["Teop"] = "tio",
["Teor"] = "tev",
["Tepecano"] = "tep",
["Tepetotutla Chinantec"] = "cnt",
["Tepeuxila Cuicatec"] = "cux",
["Tepo Krumen"] = "ted",
["Teposcolula Mixtec"] = "omq-tel",
["Tequistlatec"] = "nai-teq",
["Tera"] = "ttr",
["Terebu"] = "trb",
["Terei"] = "buo",
["Tereno"] = "ter",
["Tereweng"] = "twg",
["Terik"] = "tec",
["Termanu"] = "twu",
["Ternateño"] = "tmg",
["Tese"] = "keg",
["Teshenawa"] = "twc",
["Tetela"] = "tll",
["Tetelcingo Nahuatl"] = "nhg",
["Tetete"] = "teb",
["Tetun Dili"] = "tdt",
["Teushen"] = "sai-teu",
["Teutila Cuicatec"] = "cut",
["Tewa"] = "tew",
["Texcatepec Otomi"] = "otx",
["Texistepec Popoluca"] = "poq",
["Texmelucan Zapotec"] = "zpz",
["Tezoatlán Mixtec"] = "mxb",
["Tha"] = "thy",
["Thado Chin"] = "tcz",
["Thai Sign Language"] = "tsq",
["Thaiphum Chin"] = "cth",
["Thakali"] = "ths",
["Thamudic"] = "sem-tha",
["Thangmi"] = "thf",
["Thao"] = "ssf",
["Tharaka"] = "thk",
["Tharrgari"] = "dhr",
["Thawa"] = "xtv",
["Thopho"] = "ytp",
["Thu Lao"] = "tyl",
["Thulung"] = "tdh",
["Thurawal"] = "tbh",
["Thuri"] = "thu",
["Tiagbamrin Aizi"] = "ahi",
["Tiale"] = "mnl",
["Tibea"] = "ngy",
["Ticuna"] = "tca",
["Tidaá Mixtec"] = "mtx",
["Tidore"] = "tvo",
["Tiemacèwè Bozo"] = "boo",
["Tiene"] = "tii",
["Tifal"] = "tif",
["Tigak"] = "tgc",
["Tii"] = "txq",
["Tijaltepec Mixtec"] = "xtl",
["Tikar"] = "tik",
["Tikopia"] = "tkp",
["Tilapa Otomi"] = "otl",
["Tillamook"] = "til",
["Tilquiapan Zapotec"] = "zts",
["Tilung"] = "tij",
["Tima"] = "tms",
["Timbe"] = "tim",
["Timor Pidgin"] = "tvy",
["Timote"] = "sai-tim",
["Timucua"] = "tjm",
["Timugon Murut"] = "tih",
["Tinani"] = "lbf",
["Tingui-Boto"] = "tgv",
["Tinigua"] = "tit",
["Tinoc Kallahan"] = "tne",
["Tinputz"] = "tpz",
["Tira"] = "tic",
["Tirahi"] = "tra",
["Tiranige Diga Dogon"] = "tde",
["Tircul"] = "pyx",
["Tiri"] = "cir",
["Tita"] = "tdq",
["Titan"] = "ttv",
["Tiv"] = "tiv",
["Tiéfo"] = "tiq",
["Tiéyaxo Bozo"] = "boz",
["Tjurruru"] = "tju",
["Tlacoatzintepec Chinantec"] = "ctl",
["Tlacolulita Zapotec"] = "zpk",
["Tlahuica"] = "ocu",
["Tlahuitoltepec Mixe"] = "mxp",
["Tlamacazapa Nahuatl"] = "nuz",
["Tlazoyaltepec Mixtec"] = "mqh",
["To"] = "toz",
["To'abaita"] = "mlu",
["Toaripi"] = "tqo",
["Toba"] = "tob",
["Toba Batak"] = "bbc",
["Toba-Maskoy"] = "tmf",
["Tobagonian Creole English"] = "tgh",
["Tobanga"] = "tng",
["Tobati"] = "tti",
["Tobelo"] = "tlb",
["Tobilung"] = "tgb",
["Tobo"] = "tbv",
["Tocantins Asurini"] = "asu",
["Tofanma"] = "tlg",
["Tofin Gbe"] = "tfi",
["Togbo-Vara Banda"] = "tor",
["Togoyo"] = "tgy",
["Tojolabal"] = "toj",
["Toka-Leya"] = "dov",
["Tokano"] = "zuh",
["Tol"] = "jic",
["Tolai"] = "ksd",
["Tolaki"] = "lbw",
["Tolomako"] = "tlm",
["Tolowa"] = "tol",
["Toloza"] = "ytl",
["Tomadino"] = "tdi",
["Tombelala"] = "ttp",
["Tombonuo"] = "txa",
["Tombulu"] = "tom",
["Tomini"] = "txm",
["Tommeginne"] = "xpv",
["Tommo So"] = "dto",
["Tomo Kan Dogon"] = "dtm",
["Tomoip"] = "tqp",
["Tondano"] = "tdn",
["Tonga (Malawi)"] = "tog",
["Tonga (Mozambique)"] = "toh",
["Tonga (Zambia)"] = "toi",
["Tongwe"] = "tny",
["Tonjon"] = "tjn",
["Tonsawang"] = "tnw",
["Tonsea"] = "txs",
["Tontemboan"] = "tnt",
["Toogee"] = "xpx",
["Topoiyo"] = "toy",
["Toposa"] = "toq",
["Toraja-Sa'dan"] = "sda",
["Toram"] = "trj",
["Torau"] = "ttu",
["Toro"] = "tdv",
["Toro So Dogon"] = "dts",
["Toro Tegu Dogon"] = "dtt",
["Toromono"] = "tno",
["Torona"] = "tqr",
["Torres Strait Creole"] = "tcs",
["Torricelli"] = "tei",
["Torricelli Yau"] = "yyu",
["Torá"] = "trz",
["Tosu"] = "sit-tos",
["Totela"] = "ttl",
["Totoli"] = "txe",
["Totomachapan Zapotec"] = "zph",
["Totontepec Mixe"] = "mto",
["Totoro"] = "ttk",
["Touo"] = "tqu",
["Toura"] = "neb",
["Tourangeau"] = "roa-tou",
["Towei"] = "ttn",
["Traveller Danish"] = "rmd",
["Traveller Norwegian"] = "rmg",
["Traveller Scottish"] = "trl",
["Tregami"] = "trm",
["Tremembé"] = "tme",
["Trieng"] = "stg",
["Trimuris"] = "tip",
["Tring"] = "tgq",
["Tringgus"] = "trx",
["Trinidad and Tobago Sign Language"] = "lst",
["Trinidadian Creole English"] = "trf",
["Trinitario"] = "trn",
["Truká"] = "tka",
["Trumai"] = "tpy",
["Ts'ün-Lao"] = "tsl",
["Tsaangi"] = "tsa",
["Tsafiki"] = "cof",
["Tsakwambo"] = "kvz",
["Tsetsaut"] = "txc",
["Tshobdun"] = "sit-tsh",
["Tshwa"] = "hio",
["Tsikimba"] = "kdl",
["Tsimané"] = "cas",
["Tsishingini"] = "tsw",
["Tso"] = "ldp",
["Tsogo"] = "tsv",
["Tsotsitaal"] = "fly",
["Tsum"] = "ttz",
["Tsuvadi"] = "tvd",
["Tsuvan"] = "tsh",
["Tswa"] = "tsc",
["Tswapong"] = "two",
["Tubar"] = "tbu",
["Tucano"] = "tuo",
["Tugen"] = "tuy",
["Tugun"] = "tzn",
["Tugutil"] = "tuj",
["Tukpa"] = "tpq",
["Tukudede"] = "tkd",
["Tukumanféd"] = "tkf",
["Tula"] = "tul",
["Tule-Kaweah Yokuts"] = "nai-tky",
["Tulehu"] = "tlu",
["Tulishi"] = "tey",
["Tulu-Bohuai"] = "rak",
["Tulua"] = "aus-tul",
["Tuma-Irumu"] = "iou",
["Tumak"] = "tmc",
["Tumi"] = "kku",
["Tumleo"] = "tmq",
["Tumshuqese"] = "xtq",
["Tumtum"] = "tbr",
["Tumulung Sisaala"] = "sil",
["Tunen"] = "tvu",
["Tungag"] = "lcm",
["Tunggare"] = "trt",
["Tunia"] = "tug",
["Tunisian Sign Language"] = "tse",
["Tunjung"] = "tjg",
["Tunumiisut"] = "esx-tut",
["Tunzu"] = "dza",
["Tuotomb"] = "ttf",
["Tuparí"] = "tpr",
["Tupinikin"] = "tpk",
["Tupuri"] = "tui",
["Turaka"] = "trh",
["Turi"] = "trd",
["Turiwára"] = "twt",
["Turka"] = "tuz",
["Turkana"] = "tuv",
["Turkish Sign Language"] = "tsm",
["Turks and Caicos Creole English"] = "tch",
["Turumsa"] = "tqm",
["Turung"] = "try",
["Tuscarora"] = "tus",
["Tutelo"] = "tta",
["Tutong"] = "ttg",
["Tutsa Naga"] = "tvt",
["Tutuba"] = "tmi",
["Tututepec Mixtec"] = "mtu",
["Tututni"] = "tuu",
["Tuwali Ifugao"] = "ifk",
["Tuwari"] = "tww",
["Tuxináwa"] = "tux",
["Tuxá"] = "tud",
["Tuyuca"] = "tue",
["Twana"] = "twa",
["Twendi"] = "twn",
["Tyaraity"] = "woa",
["Tyerrernotepanner"] = "xph",
["Tz'utujil"] = "tzj",
["Tzeltal"] = "tzh",
["Tày Tac"] = "tyt",
["Téén"] = "lor",
["Tübatulabal"] = "tub",
["Uab Meto"] = "aoz",
["Uamué"] = "uam",
["Uare"] = "ksj",
["Ubaghara"] = "byc",
["Ubang"] = "uba",
["Ubi"] = "ubi",
["Ubir"] = "ubr",
["Ucayali-Yurúa Ashéninka"] = "cpb",
["Uda"] = "uda",
["Ufim"] = "ufi",
["Ugandan Sign Language"] = "ugn",
["Ughele"] = "uge",
["Uhami"] = "uha",
["Uisai"] = "uis",
["Ujir"] = "udj",
["Ukaan"] = "kcf",
["Ukhwejo"] = "ukh",
["Ukit"] = "umi",
["Ukpe-Bayobiri"] = "ukp",
["Ukpet-Ehom"] = "akd",
["Ukrainian Sign Language"] = "ukl",
["Ukue"] = "uku",
["Ukuriguma"] = "ukg",
["Ukwa"] = "ukq",
["Ukwuani-Aboh-Ndoni"] = "ukw",
["Ulau-Suain"] = "svb",
["Uldeme"] = "udl",
["Ulithian"] = "uli",
["Ulumanda'"] = "ulm",
["Ulwa"] = "ulw",
["Uma"] = "ppk",
["Uma' Lasan"] = "xky",
["Uma' Lung"] = "ulu",
["Umanakaina"] = "gdn",
["Umatilla"] = "uma",
["Umbindhamu"] = "umd",
["Umbu-Ungu"] = "ubu",
["Umbugarla"] = "umr",
["Umbuygamu"] = "umg",
["Umeda"] = "upi",
["Umiida"] = "xud",
["Umiray Dumaget Agta"] = "due",
["Umon"] = "umm",
["Umotína"] = "umo",
["Umpila"] = "ump",
["Una"] = "mtg",
["Unas"] = "art-una",
["Unde Kaili"] = "unz",
["Uneme"] = "une",
["Unggaranggu"] = "xun",
["Unggumi"] = "xgu",
["Tiếng Uni"] = "uni",
["Unserdeutsch"] = "uln",
["Unua"] = "onu",
["Unubahe"] = "unu",
["Uokha"] = "uok",
["Upper Chehalis"] = "cjh",
["Upper Grand Valley Dani"] = "dna",
["Upper Kuskokwim"] = "kuu",
["Upper Necaxa Totonac"] = "tku",
["Upper Tanana"] = "tau",
["Upper Taromi"] = "tov",
["Upper Umpqua"] = "xup",
["Ura (New Guinea)"] = "uro",
["Ura (Vanuatu)"] = "uur",
["Uradhi"] = "urf",
["Urapmin"] = "urm",
["Urarina"] = "ura",
["Urat"] = "urt",
["Urhobo"] = "urh",
["Uri"] = "uvh",
["Urigina"] = "urg",
["Urim"] = "uri",
["Urimo"] = "urx",
["Urningangg"] = "urc",
["Uru"] = "ure",
["Uru-Eu-Wau-Wau"] = "urz",
["Uru-Pa-In"] = "urp",
["Uruangnirin"] = "urn",
["Uruava"] = "urv",
["Uruguayan Sign Language"] = "ugy",
["Urumi"] = "uru",
["Usaghade"] = "usk",
["Usan"] = "wnu",
["Usarufa"] = "usa",
["Usila Chinantec"] = "cuc",
["Uspanteco"] = "usp",
["Utarmbung"] = "omo",
["Ute"] = "ute",
["Utu"] = "utu",
["Uwinymil"] = "aus-uwi",
["Uya"] = "usu",
["Uyajitaya"] = "duk",
["Uzekwe"] = "eze",
["Vaghua"] = "tva",
["Vagla"] = "vag",
["Vai"] = "vai",
["Vaiphei"] = "vap",
["Vale"] = "vae",
["Valencian Sign Language"] = "vsv",
["Valle Nacional Chinantec"] = "cvn",
["Valley Maidu"] = "vmv",
["Valman"] = "van",
["Valpei"] = "vlp",
["Vamale"] = "mkt",
["Vame"] = "mlr",
["Vandalic"] = "xvn",
["Vangunu"] = "mpr",
["Vanimo"] = "vam",
["Vanji"] = "ira-wnj",
["Vanuma"] = "vau",
["Vao"] = "vao",
["Varhadi"] = "vah",
["Varisi"] = "vrs",
["Vayu"] = "vay",
["Veddah"] = "ved",
["Vehes"] = "val",
["Vemgo-Mabas"] = "vem",
["Venezuelan Sign Language"] = "vsl",
["Ventureño"] = "veo",
["Vera'a"] = "vra",
["Vestinian"] = "xvs",
["Vidunda"] = "vid",
["Viemo"] = "vig",
["Vilela"] = "vil",
["Vili"] = "vif",
["Villa Viciosa Agta"] = "dyg",
["Vincentian Creole English"] = "svc",
["Viti"] = "vit",
["Vitou"] = "vto",
["Viya"] = "gev",
["Vlax Romani"] = "rmy",
["Volga German"] = "gmw-vog",
["Vono"] = "kch",
["Voro"] = "vor",
["Vracada Apabhramsa"] = "inc-vra",
["Vumbu"] = "vum",
["Vunapu"] = "vnp",
["Vunjo"] = "vun",
["Vute"] = "vut",
["Wa"] = "wbm",
["Wa'ema"] = "wag",
["Waamwang"] = "wmn",
["Wab"] = "wab",
["Wabo"] = "wbb",
["Waboda"] = "kmx",
["Wadaginam"] = "wdg",
["Waddar"] = "wbq",
["Wadi Wadi"] = "xwd",
["Wadjabangayi"] = "wdy",
["Wadjiginy"] = "wdj",
["Wadjigu"] = "wdu",
["Wae Rana"] = "wrx",
["Waffa"] = "waj",
["Wagawaga"] = "wgb",
["Wagaya"] = "wga",
["Wagdi"] = "wbr",
["Wageman"] = "waq",
["Wahau Kayan"] = "whu",
["Wahau Kenyah"] = "whk",
["Waigali"] = "wbk",
["Waigeo"] = "wgo",
["Waikuri"] = "nai-wai",
["Wailaki"] = "wlk",
["Wailapa"] = "wlr",
["Waima'a"] = "wmh",
["Waimiri-Atroari"] = "atr",
["Wainumá"] = "awd-wai",
["Waioli"] = "wli",
["Waitaká"] = "sai-wai",
["Waja"] = "wja",
["Wajarri"] = "wbv",
["Wajuk"] = "xwj",
["Waka"] = "wav",
["Wakawaka"] = "wkw",
["Wakoná"] = "waf",
["Wala"] = "lgl",
["Walak"] = "wlw",
["Walangama"] = "nlw",
["Wali (Ghana)"] = "wlx",
["Wali (Sudan)"] = "wll",
["Waling"] = "wly",
["Walio"] = "wla",
["Walla Walla"] = "waa",
["Walmajarri"] = "wmt",
["Wam"] = "wmo",
["Wamas"] = "wmc",
["Wambaya"] = "wmb",
["Wambon"] = "wms",
["Wamey"] = "cou",
["Wamin"] = "wmi",
["Wampar"] = "lbq",
["Wampur"] = "waz",
["Wan"] = "wan",
["Wanambre"] = "wnb",
["Wanap"] = "wnp",
["Wanda"] = "wbh",
["Wandala"] = "mfi",
["Wandamen"] = "wad",
["Wandarang"] = "wnd",
["Wandji"] = "wdd",
["Wanga"] = "lwg",
["Wanggamala"] = "wnm",
["Wangganguru"] = "wgg",
["Wanggom"] = "wng",
["Wangkayutyuru"] = "wky",
["Wangkumara"] = "xwk",
["Wanham"] = "sai-wnm",
["Wanji"] = "wbi",
["Wanman"] = "wbt",
["Wannu"] = "jub",
["Wano"] = "wno",
["Wantoat"] = "wnc",
["Wanukaka"] = "wnk",
["Wanyi"] = "wny",
["Wané"] = "hwa",
["Wapan"] = "juk",
["Wapishana"] = "wap",
["Wappo"] = "wao",
["Wara"] = "wbf",
["Warao"] = "wba",
["Warapu"] = "wra",
["Waray Sorsogon"] = "srv",
["Wardandi"] = "wxw",
["Warembori"] = "wsa",
["Wari'"] = "pav",
["Waris"] = "wrs",
["Waritai"] = "wbe",
["Wariyangga"] = "wri",
["Warkay-Bipim"] = "bgv",
["Warlmanpa"] = "wrl",
["Warlpiri"] = "wbp",
["Warluwara"] = "wrb",
["Warnang"] = "wrn",
["Waropen"] = "wrp",
["Warray"] = "wrz",
["Warrgamay"] = "wgy",
["Warrwa"] = "wwr",
["Waru"] = "wru",
["Warumungu"] = "wrm",
["Waruna"] = "wrv",
["Warungu"] = "wrg",
["Warwar Feni"] = "hrw",
["Wasa"] = "wss",
["Wasco-Wishram"] = "wac",
["Wasembo"] = "gsp",
["Washo"] = "was",
["Waskia"] = "wsk",
["Wasu"] = "wsu",
["Watakataui"] = "wtk",
["Watam"] = "wax",
["Wathaurong"] = "wth",
["Watiwa"] = "wtf",
["Watubela"] = "wah",
["Waube"] = "kop",
["Wauja"] = "wau",
["Wauyai"] = "wuy",
["Wawa"] = "www",
["Tiếng Ngõa Hương"] = "wxa",
["Wayoró"] = "wyr",
["Wayumará"] = "sai-way",
["Wedau"] = "wed",
["Weh"] = "weh",
["Welaung"] = "weu",
["Weliki"] = "klh",
["Welsh Romani"] = "rmw",
["Wemale"] = "weo",
["Weme Gbe"] = "wem",
["Wendat"] = "wdt",
["Weri"] = "wer",
["Wersing"] = "kvw",
["West Albay Bikol"] = "fbl",
["West Ambae"] = "nnd",
["West Central Banda"] = "bbp",
["West Damar"] = "drn",
["West Greenlandic Pidgin"] = "crp-gep",
["West Lembata"] = "lmj",
["West Masela"] = "mss",
["West Tarangan"] = "txn",
["West Uvean"] = "uve",
["West-Central Limba"] = "lia",
["Western Arrernte"] = "are",
["Western Bolivian Guaraní"] = "gnw",
["Western Bukidnon Manobo"] = "mbb",
["Western Dani"] = "dnw",
["Western Durango Nahuatl"] = "azn",
["Western Fijian"] = "wyy",
["Western Gurung"] = "gvr",
["Western Jicaque"] = "und-wji",
["Western Juxtlahuaca Mixtec"] = "jmx",
["Western Karaboro"] = "kza",
["Western Keres"] = "kjq",
["Western Krahn"] = "krw",
["Western Lalu"] = "ywl",
["Western Maninkakan"] = "mlq",
["Western Mashan Hmong"] = "hmw",
["Western Meohang"] = "raf",
["Western Muria"] = "mut",
["Western Panjabi"] = "pnb",
["Western Penan"] = "pne",
["Western Sisaala"] = "ssl",
["Western Subanon"] = "suc",
["Western Tawbuid"] = "twb",
["Western Totonac"] = "tqt",
["Western Tunebo"] = "tnb",
["Western Xwla Gbe"] = "xwl",
["Westrobothnian"] = "gmq-bot",
["Weyewa"] = "wew",
["White Lachi"] = "lwh",
["Whitesands"] = "tnp",
["Wiarumus"] = "tua",
["Wichita"] = "wic",
["Wichí Lhamtés Güisnay"] = "mzh",
["Wichí Lhamtés Nocten"] = "mtp",
["Wichí Lhamtés Vejoz"] = "wlv",
["Wik-Epa"] = "wie",
["Wik-Iiyanh"] = "wij",
["Wik-Keyangan"] = "wif",
["Wik-Me'anha"] = "wih",
["Wik-Mungkan"] = "wim",
["Wik-Ngathana"] = "wig",
["Wikalkan"] = "wik",
["Wikngenchera"] = "wua",
["Wilawila"] = "wil",
["Wintu"] = "wnw",
["Winyé"] = "kst",
["Wipi"] = "gdr",
["Wiraféd"] = "wir",
["Wirangu"] = "wgu",
["Wiru"] = "wiu",
["Wirö"] = "wpc",
["Wiwa"] = "mbp",
["Woccon"] = "xwc",
["Wogamusin"] = "wog",
["Wogeo"] = "woc",
["Woi"] = "wbw",
["Wojenaka"] = "jod",
["Wolani"] = "wod",
["Woleaian"] = "woe",
["Womo"] = "wmx",
["Wong-gie"] = "aus-won",
["Wongo"] = "won",
["Woods Cree"] = "cwd",
["Woria"] = "wor",
["Worimi"] = "kda",
["Worodougou"] = "jud",
["Worora"] = "wro",
["Wotapuri-Katarqalai"] = "wsv",
["Woun Meu"] = "noa",
["Wudu"] = "wud",
["Wulguru"] = "aus-wul",
["Wuliwuli"] = "wlu",
["Wulna"] = "wux",
["Wumboko"] = "bqm",
["Wumbvu"] = "wum",
["Wumeng"] = "ywu",
["Wunai Bunu"] = "bwn",
["Wunambal"] = "wub",
["Wurrugu"] = "wur",
["Wusa"] = "yig",
["Wushi"] = "bse",
["Wusi"] = "wsi",
["Wutung"] = "wut",
["Wuvulu-Aua"] = "wuv",
["Wyandot"] = "wya",
["Wára"] = "tci",
["Wãpha"] = "juw",
["Wè Southern"] = "gxx",
["Wè Western"] = "wec",
["Xadani Zapotec"] = "zax",
["Xakriabá"] = "xkr",
["Xanaguía Zapotec"] = "ztg",
["Xaragure"] = "axx",
["Xerénte"] = "xer",
["Xetá"] = "xet",
["Xicotepec de Juárez Totonac"] = "too",
["Xinca"] = "xin",
["Xingú Asuriní"] = "asn",
["Xipaya"] = "xiy",
["Xiri"] = "xii",
["Xiriâna"] = "xir",
["Xishanba Lalo"] = "ywt",
["Xocó"] = "sai-xoc",
["Xokleng"] = "xok",
["Xukurú"] = "xoo",
["Xwela Gbe"] = "xwe",
["Yaa"] = "iyx",
["Yabarana"] = "yar",
["Yabaâna"] = "ybn",
["Yaben"] = "ybm",
["Yabong"] = "ybo",
["Yabula Yabula"] = "yxy",
["Yace"] = "ekr",
["Yafi"] = "wfg",
["Yagara"] = "yxg",
["Yagaria"] = "ygr",
["Yagomi"] = "ygm",
["Yagua"] = "yad",
["Yagwoia"] = "ygw",
["Yahadian"] = "ner",
["Yahang"] = "rhp",
["Yahuna"] = "ynu",
["Yaka"] = "yaf",
["Yakaikeke"] = "ykk",
["Yakoma"] = "yky",
["Yala"] = "yba",
["Yalahatan"] = "jal",
["Yalakalore"] = "xyl",
["Yalarnnga"] = "ylr",
["Yale"] = "nce",
["Yaleba"] = "ylb",
["Yalunka"] = "yal",
["Yalálag Zapotec"] = "zpu",
["Yamap"] = "ymp",
["Yamba"] = "yam",
["Yambes"] = "ymb",
["Yambeta"] = "yat",
["Yamdena"] = "jmd",
["Yameo"] = "yme",
["Yaminahua"] = "yaa",
["Yamongeri"] = "ymg",
["Yan-nhangu"] = "jay",
["Yana"] = "ynn",
["Yanda"] = "yda",
["Yanda Dogon"] = "dym",
["Yandjibara"] = "xyb",
["Yandruwandha"] = "ynd",
["Yangben"] = "yav",
["Yangkaal"] = "aus-ynk",
["Yangkam"] = "bsx",
["Yangman"] = "jng",
["Yango"] = "yng",
["Yangulam"] = "ynl",
["Yangum Dey"] = "yde",
["Yangum Gel"] = "ygl",
["Yangum Mon"] = "ymo",
["Yankunytjatjara"] = "kdd",
["Yanomamö"] = "guu",
["Yanomámi"] = "wca",
["Yansi"] = "yns",
["Yaosakor Asmat"] = "asy",
["Yaouré"] = "yre",
["Yaqay"] = "jaq",
["Yaqui"] = "yaq",
["Yarawata"] = "yrw",
["Yareba"] = "yrb",
["Yareni Zapotec"] = "zae",
["Yarli"] = "yxl",
["Yarluyandi"] = "yry",
["Yarumá"] = "sai-yar",
["Yarí"] = "yri",
["Yasa"] = "yko",
["Yatay"] = "yty",
["Yaul"] = "yla",
["Yaur"] = "jau",
["Yautepec Zapotec"] = "zpb",
["Yavitero"] = "yvt",
["Yawa"] = "yva",
["Yawalapití"] = "yaw",
["Yawanawa"] = "ywn",
["Yawarawarga"] = "yww",
["Yaweyuha"] = "yby",
["Yawijibaya"] = "jbw",
["Yawiyo"] = "ybx",
["Yawuru"] = "ywr",
["Yaygir"] = "xya",
["Yei"] = "jei",
["Yekhee"] = "ets",
["Yekora"] = "ykr",
["Yelmek"] = "jel",
["Yelogu"] = "ylg",
["Yemba"] = "ybb",
["Yemeni Arabic"] = "ayn",
["Yendang"] = "yen",
["Yeni"] = "yei",
["Yeniche"] = "yec",
["Yerakai"] = "yra",
["Yeretuar"] = "gop",
["Yerukula"] = "yeu",
["Yeskwa"] = "yes",
["Yessan-Mayo"] = "yss",
["Yetfa"] = "yet",
["Yeyi"] = "yey",
["Yil"] = "yll",
["Yimas"] = "yee",
["Yimchungru Naga"] = "yim",
["Yinbaw Karen"] = "kvu",
["Yindjilandji"] = "yil",
["Yine"] = "pib",
["Yinggarda"] = "yia",
["Yinhawangka"] = "ywg",
["Yiningayi"] = "ygi",
["Yintale Karen"] = "kvy",
["Yinwum"] = "yxm",
["Yir-Yoront"] = "yiy",
["Yirandali"] = "ljw",
["Yis"] = "yis",
["Yitha Yitha"] = "xth",
["Yoba"] = "yob",
["Yocoboué Dida"] = "gud",
["Yoidik"] = "ydk",
["Yoke"] = "yki",
["Yolngu Sign Language"] = "ygs",
["Yoloxochitl Mixtec"] = "xty",
["Yombe"] = "yom",
["Yopno"] = "yut",
["Yora"] = "mts",
["Yorta Yorta"] = "xyy",
["Younuo Bunu"] = "buh",
["Yout Wam"] = "ytw",
["Yuaga"] = "nua",
["Yucatec Maya Sign Language"] = "msd",
["Yuchi"] = "yuc",
["Yucuañe Mixtec"] = "mvg",
["Yucuna"] = "ycn",
["Yugambal"] = "yub",
["Yugoslavian Sign Language"] = "ysl",
["Yugul"] = "ygu",
["Yuhup"] = "yab",
["Yuki"] = "yuk",
["Yukpa"] = "yup",
["Yukuben"] = "ybl",
["Yulu"] = "yul",
["Yuma"] = "yum",
["Yumana"] = "awd-yum",
["Yupiltepeque"] = "nai-yup",
["Yupua"] = "sai-yup",
["Yuqui"] = "yuq",
["Yuracare"] = "yuz",
["Yuru"] = "ljx",
["Yurumanguí"] = "sai-yur",
["Yurutí"] = "yui",
["Yutanduchi Mixtec"] = "mab",
["Yuwana"] = "yau",
["Yuyu"] = "yxu",
["Zaachila Zapotec"] = "ztx",
["Zabana"] = "kji",
["Zacatlán-Ahuacatlán-Tepetzintla Nahuatl"] = "nhi",
["Zakhring"] = "zkr",
["Zambian Sign Language"] = "zsl",
["Zan Gula"] = "zna",
["Zanaki"] = "zak",
["Zande"] = "zne",
["Zangwal"] = "zah",
["Zaramo"] = "zaj",
["Zari"] = "zaz",
["Zauzou"] = "zal",
["Zazao"] = "jaj",
["Zbu"] = "sit-zbu",
["Zeem"] = "zua",
["Zemba"] = "dhm",
["Zeme Naga"] = "nzm",
["Zemgalian"] = "xzm",
["Zenag"] = "zeg",
["Zenzontepec Chatino"] = "czn",
["Zhang-Zhung"] = "xzh",
["Zhire"] = "zhi",
["Zhoa"] = "zhw",
["Zhár"] = "jjr",
["Zia"] = "zia",
["Zialo"] = "zil",
["Zigula"] = "ziw",
["Zimakani"] = "zik",
["Zimba"] = "zmb",
["Zimbabwe Sign Language"] = "zib",
["Zinza"] = "zin",
["Zipser German"] = "gmw-zps",
["Zire"] = "sih",
["Ziriya"] = "zir",
["Zizilivakan"] = "ziz",
["Zo'é"] = "pto",
["Zokhuo"] = "yzk",
["Zotung Chin"] = "czt",
["Zulgo-Gemzek"] = "gnd",
["Zumaya"] = "zuy",
["Zuni"] = "zun",
["Zuwara"] = "ber-zuw",
["Zyphe"] = "zyp",
["Záparo"] = "zro",
["Biệt ngữ Chinook"] = "chn",
["Không xác định ngôn ngữ"] = "und",
["Ngôn ngữ ký hiệu Mỹ"] = "ase",
["Tiếng 'Are'are"] = "alu",
["Tiếng A Xương"] = "acn",
["Tiếng A'ou"] = "aou",
["Tiếng A-Hmao"] = "hmd",
["Tiếng Aari"] = "aiw",
["Tiếng Aari nguyên thủy"] = "omv-aro-pro",
["Tiếng Aasax"] = "aas",
["Tiếng Abaga"] = "abg",
["Tiếng Abai"] = "poz-abi",
["Tiếng Abanyom"] = "abm",
["Tiếng Abau"] = "aau",
["Tiếng Abaza"] = "abq",
["Tiếng Abidji"] = "abi",
["Tiếng Abinomn"] = "bsa",
["Tiếng Abkhaz"] = "ab",
["Tiếng Abkhaz-Abaza nguyên thủy"] = "cau-abz-pro",
["Tiếng Abon"] = "abo",
["Tiếng Abron"] = "abr",
["Tiếng Abui"] = "abz",
["Tiếng Abure"] = "abu",
["Tiếng Aceh"] = "ace",
["Tiếng Achawa"] = "aca",
["Tiếng Acheron"] = "acz",
["Tiếng Achi"] = "acr",
["Tiếng Acholi"] = "ach",
["Tiếng Achuar"] = "acu",
["Tiếng Achumawi"] = "acv",
["Tiếng Adangme"] = "ada",
["Tiếng Adi"] = "adi",
["Tiếng Adja"] = "ajg",
["Tiếng Adnyamathanha"] = "adt",
["Tiếng Adygea"] = "ady",
["Tiếng Adzera"] = "adz",
["Tiếng Aer"] = "aeq",
["Tiếng Afade"] = "aal",
["Tiếng Afar"] = "aa",
["Tiếng Afrikaans"] = "af",
["Tiếng Agatu"] = "agc",
["Tiếng Agawam"] = "alg-aga",
["Tiếng Aghem"] = "agq",
["Tiếng Aghul"] = "agx",
["Tiếng Aghwan"] = "xag",
["Tiếng Agta Dupaningan"] = "duo",
["Tiếng Aguacateca"] = "agu",
["Tiếng Ahom"] = "aho",
["Tiếng Ahtna"] = "aht",
["Tiếng Ai"] = "eee",
["Tiếng Ai Cập"] = "egy",
["Tiếng Ai Cập bình dân"] = "egx-dem",
["Tiếng Aimol"] = "aim",
["Tiếng Ainu"] = "ain",
["Tiếng Aiton"] = "aio",
["Tiếng Ajië"] = "aji",
["Tiếng Aka-Bo"] = "akm",
["Tiếng Aka-Jeru"] = "akj",
["Tiếng Aka-Kede"] = "akx",
["Tiếng Akan"] = "ak",
["Tiếng Akaselem"] = "aks",
["Tiếng Akawaio"] = "ake",
["Tiếng Akha"] = "ahk",
["Tiếng Akhvakh"] = "akv",
["Tiếng Akkad"] = "akk",
["Tiếng Aklanon"] = "akl",
["Tiếng Akoose"] = "bss",
["Tiếng Akuntsu"] = "aqz",
["Tiếng Alaba-K’abeena"] = "alw",
["Tiếng Alabama"] = "akz",
["Tiếng Alagwa"] = "wbj",
["Tiếng Alak"] = "alk",
["Tiếng Alamblak"] = "amp",
["Tiếng Alangan"] = "alj",
["Tiếng Alawa"] = "alh",
["Tiếng Albani"] = "sq",
["Tiếng Albani nguyên thủy"] = "sqj-pro",
["Tiếng Alchuka"] = "tuw-alk",
["Tiếng Alekano"] = "gah",
["Tiếng Aleut"] = "ale",
["Tiếng Algic nguyên thủy"] = "aql-pro",
["Tiếng Algonquin"] = "alq",
["Tiếng Algonquin nguyên thủy"] = "alg-pro",
["Tiếng Allar"] = "all",
["Tiếng Alsea"] = "aes",
["Tiếng Alumu-Tesu"] = "aab",
["Tiếng Alutor"] = "alr",
["Tiếng Alyentiyak"] = "sai-all",
["Tiếng Ama"] = "amm",
["Tiếng Amahuaca"] = "amc",
["Tiếng Amaimon"] = "ali",
["Tiếng Amal"] = "aad",
["Tiếng Amanab"] = "amn",
["Tiếng Amarasi"] = "aaz",
["Tiếng Ambai"] = "amk",
["Tiếng Ambrak"] = "aag",
["Tiếng Ambulas"] = "abt",
["Tiếng Amdang"] = "amj",
["Tiếng Amhara"] = "am",
["Tiếng Amis"] = "ami",
["Tiếng Amurdag"] = "amg",
["Tiếng Amuzgo"] = "amu",
["Tiếng Anaang"] = "anw",
["Tiếng Anal"] = "anm",
["Tiếng Anauyá"] = "awd-ana",
["Tiếng Andi"] = "ani",
["Tiếng Angami"] = "njm",
["Tiếng Angika"] = "anp",
["Tiếng Angkula"] = "aus-ang",
["Tiếng Angola"] = "aoa",
["Tiếng Anh"] = "en",
["Tiếng Anh Solombala"] = "crp-slb",
["Tiếng Anh cổ"] = "ang",
["Tiếng Anh trung đại"] = "enm",
["Tiếng Anii"] = "blo",
["Tiếng Ankave"] = "aak",
["Tiếng Annobón"] = "fab",
["Tiếng Anuak"] = "anu",
["Tiếng Anuki"] = "aui",
["Tiếng Anyi"] = "any",
["Tiếng Ao"] = "njo",
["Tiếng Apabhramsa"] = "inc-apa",
["Tiếng Apache Tây"] = "apw",
["Tiếng Apache đồng bằng"] = "apk",
["Tiếng Aparaí"] = "apy",
["Tiếng Apatani"] = "apt",
["Tiếng Apinayé"] = "apn",
["Tiếng Aputai"] = "apx",
["Tiếng Aquitani"] = "xaq",
["Tiếng Aragon"] = "an",
["Tiếng Araki"] = "akr",
["Tiếng Arakwal"] = "rkw",
["Tiếng Aram"] = "arc",
["Tiếng Aranadan"] = "aaf",
["Tiếng Arapaho"] = "arp",
["Tiếng Arawak nguyên thủy"] = "awd-pro",
["Tiếng Araweté"] = "awt",
["Tiếng Archi"] = "aqc",
["Tiếng Arem"] = "aem",
["Tiếng Argobba"] = "agj",
["Tiếng Arhuaco"] = "arh",
["Tiếng Ari"] = "aac",
["Tiếng Arin"] = "xrn",
["Tiếng Armenia"] = "hy",
["Tiếng Armenia cổ"] = "xcl",
["Tiếng Armenia trung đại"] = "axm",
["Tiếng Aromania"] = "rup",
["Tiếng Arrernte Đông"] = "aer",
["Tiếng Ashkun"] = "ask",
["Tiếng Ashraaf"] = "cus-ash",
["Tiếng Ashéninka Pajonal"] = "cjo",
["Tiếng Asi"] = "bno",
["Tiếng Askopan"] = "eiv",
["Tiếng Asli nguyên thủy"] = "mkh-asl-pro",
["Tiếng Assam"] = "as",
["Tiếng Assam cận đại"] = "inc-oas",
["Tiếng Assan"] = "xss",
["Tiếng Assiniboine"] = "asb",
["Tiếng Asturias"] = "ast",
["Tiếng Asumboa"] = "aua",
["Tiếng Asur"] = "asr",
["Tiếng Atayal"] = "tay",
["Tiếng Atemble"] = "ate",
["Tiếng Athabasca nguyên thủy"] = "ath-pro",
["Tiếng Athpariya"] = "aph",
["Tiếng Atikamekw"] = "atj",
["Tiếng Atong (Ấn Độ)"] = "aot",
["Tiếng Atsahuaca"] = "atc",
["Tiếng Auhelawa"] = "kud",
["Tiếng Aukan"] = "djk",
["Tiếng Avar"] = "av",
["Tiếng Avar-Andic nguyên thủy"] = "cau-ava-pro",
["Tiếng Avatime"] = "avn",
["Tiếng Avesta"] = "ae",
["Tiếng Avokaya"] = "avu",
["Tiếng Awa (Trung Quốc)"] = "vwa",
["Tiếng Awadh"] = "awa",
["Tiếng Awadh cổ"] = "inc-oaw",
["Tiếng Aweer"] = "bob",
["Tiếng Awing"] = "azo",
["Tiếng Awjila"] = "auj",
["Tiếng Awngi"] = "awn",
["Tiếng Axi"] = "yix",
["Tiếng Ayere"] = "aye",
["Tiếng Aymara"] = "ay",
["Tiếng Azerbaijan"] = "az",
["Tiếng Ba Lan"] = "pl",
["Tiếng Ba Lan cổ"] = "zlw-opl",
["Tiếng Ba Na"] = "bdq",
["Tiếng Ba Tư"] = "fa",
["Tiếng Ba Tư cổ"] = "peo",
["Tiếng Ba Tư trung đại"] = "pal",
["Tiếng Ba Tư-Do Thái"] = "jpr",
["Tiếng Baagandji"] = "drl",
["Tiếng Baatonum"] = "bba",
["Tiếng Babatana"] = "baa",
["Tiếng Babungo"] = "bav",
["Tiếng Babuza"] = "bzg",
["Tiếng Bacama"] = "bcy",
["Tiếng Bactria"] = "xbc",
["Tiếng Badaga"] = "bfq",
["Tiếng Badanchi"] = "bau",
["Tiếng Bade"] = "bde",
["Tiếng Badui"] = "bac",
["Tiếng Bagua"] = "sai-bag",
["Tiếng Bagvalal"] = "kva",
["Tiếng Bahing"] = "bhj",
["Tiếng Bahnar nguyên thủy"] = "mkh-ban-pro",
["Tiếng Bainouk-Gunyuño"] = "bab",
["Tiếng Baiso"] = "bsw",
["Tiếng Bajjika"] = "vjk",
["Tiếng Bakaka"] = "bqz",
["Tiếng Bakhtiari"] = "bqi",
["Tiếng Baki"] = "bki",
["Tiếng Bakung"] = "xkl",
["Tiếng Bala"] = "tuw-bal",
["Tiếng Balanta-Ganja"] = "bjt",
["Tiếng Balanta-Kentohe"] = "ble",
["Tiếng Balantak"] = "blz",
["Tiếng Bali"] = "ban",
["Tiếng Baloch"] = "bal",
["Tiếng Balt-Slav nguyên thủy"] = "ine-bsl-pro",
["Tiếng Balti"] = "bft",
["Tiếng Bambara"] = "bm",
["Tiếng Bambassi"] = "myf",
["Tiếng Bamum"] = "bax",
["Tiếng Bana"] = "bcw",
["Tiếng Bandjalang"] = "bdy",
["Tiếng Banggai"] = "bgz",
["Tiếng Bangi"] = "bni",
["Tiếng Bangolan"] = "bgj",
["Tiếng Banjar"] = "bjn",
["Tiếng Bankon"] = "abb",
["Tiếng Bantawa"] = "bap",
["Tiếng Bantayanon"] = "bfx",
["Tiếng Bantoid nguyên thủy"] = "nic-bod-pro",
["Tiếng Bantu nguyên thủy"] = "bnt-pro",
["Tiếng Banyumas"] = "map-bms",
["Tiếng Baoule"] = "bci",
["Tiếng Barai"] = "bbb",
["Tiếng Barakai"] = "baj",
["Tiếng Bari"] = "bfa",
["Tiếng Barikewa"] = "jbk",
["Tiếng Barombi"] = "bbi",
["Tiếng Baré"] = "bae",
["Tiếng Basaa"] = "bas",
["Tiếng Basay"] = "byq",
["Tiếng Bashkir"] = "ba",
["Tiếng Basketo"] = "bst",
["Tiếng Basque"] = "eu",
["Tiếng Basque nguyên thủy"] = "euq-pro",
["Tiếng Bassa"] = "bsq",
["Tiếng Bassari"] = "bsc",
["Tiếng Batak Simalungun"] = "bts",
["Tiếng Batek"] = "btq",
["Tiếng Bats"] = "bbl",
["Tiếng Batuley"] = "bay",
["Tiếng Bayern"] = "bar",
["Tiếng Beaver"] = "bea",
["Tiếng Bedjond"] = "bjv",
["Tiếng Beja"] = "bej",
["Tiếng Belarus"] = "be",
["Tiếng Belhariya"] = "byw",
["Tiếng Beli"] = "blm",
["Tiếng Bella Coola"] = "blc",
["Tiếng Bellara"] = "brw",
["Tiếng Belnəng"] = "glb",
["Tiếng Bemba"] = "bem",
["Tiếng Bench"] = "bcq",
["Tiếng Bengal"] = "bn",
["Tiếng Bengal cổ"] = "inc-obn",
["Tiếng Benue-Congo nguyên thủy"] = "nic-bco-pro",
["Tiếng Berber Bắc Sahara"] = "mzb",
["Tiếng Berber Tunisia"] = "sds",
["Tiếng Berber nguyên thủy"] = "ber-pro",
["Tiếng Berber-Do Thái"] = "jbe",
["Tiếng Berik"] = "bkl",
["Tiếng Betawi"] = "bew",
["Tiếng Bezhta"] = "kap",
["Tiếng Bhadrawah"] = "bhd",
["Tiếng Bhatri"] = "bgw",
["Tiếng Bhattiyat"] = "bht",
["Tiếng Bhil"] = "bhb",
["Tiếng Bhil Dungra"] = "duh",
["Tiếng Bhnong"] = "mkh-bhn",
["Tiếng Bhojpur"] = "bho",
["Tiếng Bhumij"] = "aav-bhu",
["Tiếng Bhunjia"] = "bhu",
["Tiếng Bidayuh Bau"] = "sne",
["Tiếng Bidayuh Biatah"] = "bth",
["Tiếng Bih"] = "ibh",
["Tiếng Bihari"] = "bh",
["Tiếng Bikol Buhi'non"] = "ubl",
["Tiếng Bilaspur"] = "kfs",
["Tiếng Bilen"] = "byn",
["Tiếng Bilua"] = "blb",
["Tiếng Bima"] = "bhp",
["Tiếng Binukid"] = "bkd",
["Tiếng Birao"] = "brr",
["Tiếng Birgit"] = "btf",
["Tiếng Birhor"] = "biy",
["Tiếng Birjia"] = "bix",
["Tiếng Bisaya Sabah"] = "bsy",
["Tiếng Bishnupriya"] = "bpy",
["Tiếng Bislama"] = "bi",
["Tiếng Bissa"] = "bib",
["Tiếng Bisu"] = "bzi",
["Tiếng Bit"] = "bgk",
["Tiếng Blackfoot"] = "bla",
["Tiếng Blagar"] = "beu",
["Tiếng Blang"] = "blr",
["Tiếng Bod nguyên thủy"] = "sit-bdi-pro",
["Tiếng Bodo (Ấn Độ)"] = "brx",
["Tiếng Bodo Parja"] = "bdv",
["Tiếng Bodo-Garo nguyên thủy"] = "tbq-bdg-pro",
["Tiếng Boghom"] = "bux",
["Tiếng Bokar"] = "sit-bok",
["Tiếng Boko"] = "bqc",
["Tiếng Bokobaru"] = "bus",
["Tiếng Bola"] = "bnp",
["Tiếng Boloki"] = "bkt",
["Tiếng Bomu"] = "bmq",
["Tiếng Bondo"] = "bfw",
["Tiếng Boon"] = "bnl",
["Tiếng Borôro"] = "bor",
["Tiếng Botlikh"] = "bph",
["Tiếng Bourguignon"] = "roa-brg",
["Tiếng Brahui"] = "brh",
["Tiếng Braj"] = "bra",
["Tiếng Breri"] = "brq",
["Tiếng Breton"] = "br",
["Tiếng Breton cổ"] = "obt",
["Tiếng Breton trung đại"] = "xbm",
["Tiếng Britton nguyên thủy"] = "cel-bry-pro",
["Tiếng Brokkat"] = "bro",
["Tiếng Brokpa"] = "sgt",
["Tiếng Bru"] = "bru",
["Tiếng Bru Tây"] = "brv",
["Tiếng Brâu"] = "brb",
["Tiếng Buang Mapos"] = "bzh",
["Tiếng Bube"] = "bvb",
["Tiếng Budukh"] = "bdk",
["Tiếng Bughotu"] = "bgt",
["Tiếng Bugis"] = "bug",
["Tiếng Buhid"] = "bku",
["Tiếng Bukhara"] = "bhh",
["Tiếng Bukiyip"] = "ape",
["Tiếng Bulgar"] = "xbo",
["Tiếng Bulgari"] = "bg",
["Tiếng Bumthang"] = "kjz",
["Tiếng Bungku"] = "bkz",
["Tiếng Bunun"] = "bnn",
["Tiếng Burji"] = "bji",
["Tiếng Burunge"] = "bds",
["Tiếng Burushaski"] = "bsk",
["Tiếng Buryat"] = "bua",
["Tiếng Busa"] = "bqp",
["Tiếng Bushi"] = "buc",
["Tiếng Bussa"] = "dox",
["Tiếng Butuanon"] = "btw",
["Tiếng Bách Tế"] = "pkc",
["Tiếng Bạch Lạp Mã"] = "lay",
["Tiếng Bạch Nam"] = "bfs",
["Tiếng Bạch Trung"] = "bca",
["Tiếng Bạch nguyên thủy"] = "sit-bai-pro",
["Tiếng Bảo An"] = "peh",
["Tiếng Bắc Altai"] = "atv",
["Tiếng Bắc Amami Ōshima"] = "ryn",
["Tiếng Bắc Catanduanes Bikol"] = "cts",
["Tiếng Bắc Emberá"] = "emp",
["Tiếng Bắc Friesland"] = "frr",
["Tiếng Bắc Iroquois nguyên thủy"] = "iro-nor-pro",
["Tiếng Bắc Khanty"] = "kca-nor",
["Tiếng Bắc Mansi"] = "mns-nor",
["Tiếng Bắc Ndebele"] = "nd",
["Tiếng Bắc Nisu"] = "yiv",
["Tiếng Bắc Paiute"] = "pao",
["Tiếng Bắc Sami"] = "se",
["Tiếng Bắc Selkup"] = "sel-nor",
["Tiếng Bắc Slavey"] = "scs",
["Tiếng Bắc Thái"] = "nod",
["Tiếng Bắc Yukaghir"] = "ykg",
["Tiếng Bắc Âu cổ"] = "non",
["Tiếng Bắc Âu nguyên thủy"] = "gmq-pro",
["Tiếng Bố Cam"] = "bbh",
["Tiếng Bố Lưu"] = "ply",
["Tiếng Bố Mang"] = "bvp",
["Tiếng Bố Y"] = "pcc",
["Tiếng Bối-Thái nguyên thủy"] = "qfa-bet-pro",
["Tiếng Bồ Đào Nha"] = "pt",
["Tiếng Bổ trợ Quốc tế"] = "ia",
["Tiếng Ca Dong"] = "kxy",
["Tiếng Ca Tua"] = "kta",
["Tiếng Cahuilla"] = "chl",
["Tiếng Camling"] = "rab",
["Tiếng Camuni"] = "xcc",
["Tiếng Canela"] = "ram",
["Tiếng Cao Câu Ly"] = "zkg",
["Tiếng Capanahua"] = "kaq",
["Tiếng Carib nguyên thủy"] = "sai-car-pro",
["Tiếng Carrier"] = "crx",
["Tiếng Carrier Nam"] = "caf",
["Tiếng Catalan"] = "ca",
["Tiếng Catalan cổ"] = "roa-oca",
["Tiếng Catawba"] = "chc",
["Tiếng Cayuga"] = "cay",
["Tiếng Cebu"] = "ceb",
["Tiếng Celt nguyên thủy"] = "cel-pro",
["Tiếng Celtiberi"] = "xce",
["Tiếng Cerrado nguyên thủy"] = "sai-cer-pro",
["Tiếng Ch'orti'"] = "caa",
["Tiếng Chachi"] = "cbi",
["Tiếng Chagatai"] = "chg",
["Tiếng Chaima"] = "ciy",
["Tiếng Chak"] = "ckh",
["Tiếng Chakma"] = "ccp",
["Tiếng Chamalal"] = "cji",
["Tiếng Chamba"] = "cdh",
["Tiếng Chamicuro"] = "ccc",
["Tiếng Chamorro"] = "ch",
["Tiếng Chantyal"] = "chx",
["Tiếng Chatino cao nguyên Tây"] = "ctp",
["Tiếng Chaura"] = "crv",
["Tiếng Chavacano"] = "cbk",
["Tiếng Chechen"] = "ce",
["Tiếng Chenchu"] = "cde",
["Tiếng Chenoua"] = "cnu",
["Tiếng Chepang"] = "cdm",
["Tiếng Cherokee"] = "chr",
["Tiếng Chetti Moundadan"] = "cty",
["Tiếng Chetti Wayanad"] = "ctt",
["Tiếng Chewong"] = "cwg",
["Tiếng Cheyenne"] = "chy",
["Tiếng Chhattisgarh"] = "hne",
["Tiếng Chibcha"] = "chb",
["Tiếng Chichewa"] = "ny",
["Tiếng Chickasaw"] = "cic",
["Tiếng Chilcotin"] = "clc",
["Tiếng Chin Asho"] = "csh",
["Tiếng Chin Ekai"] = "cey",
["Tiếng Chin Falam"] = "cfm",
["Tiếng Chin Hakha"] = "cnh",
["Tiếng Chin Songlai"] = "csj",
["Tiếng Chin Tedim"] = "ctd",
["Tiếng Chinal"] = "cih",
["Tiếng Chinantec Ojitlán"] = "chj",
["Tiếng Chinantec Ozumacín"] = "chz",
["Tiếng Chinantec Tepinapa"] = "cte",
["Tiếng Chinook"] = "chh",
["Tiếng Chiricahua"] = "apm",
["Tiếng Chiru"] = "cdf",
["Tiếng Chittagong"] = "ctg",
["Tiếng Chiwere"] = "iow",
["Tiếng Chocangacakha"] = "cgk",
["Tiếng Choctaw"] = "cho",
["Tiếng Chodri"] = "cdi",
["Tiếng Chol"] = "ctu",
["Tiếng Chong"] = "cog",
["Tiếng Chu Ru"] = "cje",
["Tiếng Chukot"] = "ckt",
["Tiếng Chulym"] = "clw",
["Tiếng Churah"] = "cdj",
["Tiếng Chuuk"] = "chk",
["Tiếng Chuvan"] = "xcv",
["Tiếng Chuvash"] = "cv",
["Tiếng Châu Đại Dương nguyên thủy"] = "poz-oce-pro",
["Tiếng Chăm Tây"] = "cja",
["Tiếng Chăm cổ"] = "ocm",
["Tiếng Chăm nguyên thủy"] = "cmc-pro",
["Tiếng Chăm Đông"] = "cjm",
["Tiếng Chơ Ro"] = "crw",
["Tiếng Chứt"] = "scb",
["Tiếng Cia-Cia"] = "cia",
["Tiếng Cimbri"] = "cim",
["Tiếng Circassia nguyên thủy"] = "cau-cir-pro",
["Tiếng Co"] = "cua",
["Tiếng Cocama"] = "cod",
["Tiếng Cochimi"] = "coj",
["Tiếng Coeur d'Alene"] = "crd",
["Tiếng Cofán"] = "con",
["Tiếng Comanche"] = "com",
["Tiếng Comoros Maore"] = "swb",
["Tiếng Comox"] = "coo",
["Tiếng Copt"] = "cop",
["Tiếng Cornwall"] = "kw",
["Tiếng Cornwall cổ"] = "oco",
["Tiếng Corse"] = "co",
["Tiếng Cowlitz"] = "cow",
["Tiếng Cree"] = "cr",
["Tiếng Cree Moose"] = "crm",
["Tiếng Cree Đông Bắc"] = "crl",
["Tiếng Cree Đông Nam"] = "crj",
["Tiếng Cree đồng bằng"] = "crk",
["Tiếng Creole Antilles"] = "gcf",
["Tiếng Creole Guinea-Bissau"] = "pov",
["Tiếng Creole Haiti"] = "ht",
["Tiếng Creole Hà Lan Berbice"] = "brc",
["Tiếng Creole Jamaica"] = "jam",
["Tiếng Creole Louisiana"] = "lou",
["Tiếng Creole Mauritius"] = "mfe",
["Tiếng Creole Nghi Lan"] = "ycr",
["Tiếng Creole Réunion"] = "rcf",
["Tiếng Creole quần đảo Virgin"] = "vic",
["Tiếng Crow"] = "cro",
["Tiếng Cuman"] = "qwm",
["Tiếng Cumanagoto"] = "cuo",
["Tiếng Cumbria"] = "xcb",
["Tiếng Cupeño"] = "cup",
["Tiếng Cushit nguyên thủy"] = "cus-pro",
["Tiếng Cuyunon"] = "cyo",
["Tiếng Càn-đà-la"] = "pgd",
["Tiếng Cám"] = "gan",
["Tiếng Cơ Nặc Du Lạc"] = "jiu",
["Tiếng Cơ Tu"] = "ktv",
["Tiếng Cơ Tu Phương"] = "phg",
["Tiếng Cơ Tu Tây"] = "kuf",
["Tiếng Cơ Tu nguyên thủy"] = "mkh-kat-pro",
["Tiếng Cống"] = "cnc",
["Tiếng Cờ Lao Trắng"] = "giw",
["Tiếng Daasanach"] = "dsh",
["Tiếng Dabarre"] = "dbr",
["Tiếng Dacia"] = "xdc",
["Tiếng Dadibi"] = "mps",
["Tiếng Dagara Bắc"] = "dgi",
["Tiếng Dagba"] = "dgk",
["Tiếng Dagbani"] = "dag",
["Tiếng Dahalik"] = "dlk",
["Tiếng Dahalo"] = "dal",
["Tiếng Dakota"] = "dak",
["Tiếng Dakpa"] = "dka",
["Tiếng Dalmatia"] = "dlm",
["Tiếng Dambi"] = "dac",
["Tiếng Damel"] = "dml",
["Tiếng Dan"] = "dnj",
["Tiếng Danau"] = "dnu",
["Tiếng Dangaléat"] = "daa",
["Tiếng Danu"] = "dnv",
["Tiếng Danuwar"] = "dhw",
["Tiếng Dar Daju Daju"] = "djc",
["Tiếng Dargwa"] = "dar",
["Tiếng Dargwa nguyên thủy"] = "cau-drg-pro",
["Tiếng Daur"] = "dta",
["Tiếng Dawro"] = "dwr",
["Tiếng Deg Xinag"] = "ing",
["Tiếng Degema"] = "deg",
["Tiếng Denesuline"] = "chp",
["Tiếng Deori"] = "der",
["Tiếng Desiya"] = "dso",
["Tiếng Dhangu"] = "dhg",
["Tiếng Dhanka"] = "dhn",
["Tiếng Dharug"] = "xdk",
["Tiếng Dhatki"] = "mki",
["Tiếng Dhimal"] = "dhi",
["Tiếng Dhivehi"] = "dv",
["Tiếng Dhodia"] = "dho",
["Tiếng Dhundhar"] = "dhd",
["Tiếng Dibabawon"] = "mbd",
["Tiếng Dieri"] = "dif",
["Tiếng Digan"] = "rom",
["Tiếng Digan Balkan"] = "rmn",
["Tiếng Digan Baltic"] = "rml",
["Tiếng Digan Tavringer"] = "rmu",
["Tiếng Dimasa"] = "dis",
["Tiếng Dime"] = "dim",
["Tiếng Dinka"] = "din",
["Tiếng Dirasha"] = "gdl",
["Tiếng Ditidaht"] = "dtd",
["Tiếng Dizi"] = "mdx",
["Tiếng Dizi nguyên thủy"] = "omv-diz-pro",
["Tiếng Djinang"] = "dji",
["Tiếng Do Thái"] = "he",
["Tiếng Dogri"] = "doi",
["Tiếng Dogri Hindi"] = "dgo",
["Tiếng Dogrib"] = "dgr",
["Tiếng Dolgan"] = "dlg",
["Tiếng Dolpo"] = "dre",
["Tiếng Domaaki"] = "dmk",
["Tiếng Domari"] = "rmt",
["Tiếng Dongolawi"] = "kzh",
["Tiếng Doteli"] = "dty",
["Tiếng Dravida nguyên thủy"] = "dra-pro",
["Tiếng Dubla"] = "dub",
["Tiếng Dukha"] = "trk-dkh",
["Tiếng Dumi"] = "dus",
["Tiếng Duruwa"] = "pci",
["Tiếng Dusun Witu"] = "duw",
["Tiếng Duun"] = "dux",
["Tiếng Duy Ngô Nhĩ"] = "ug",
["Tiếng Duy Ngô Nhĩ cổ"] = "oui",
["Tiếng Dyirbal"] = "dbl",
["Tiếng Dyula"] = "dyu",
["Tiếng Dzala"] = "dzl",
["Tiếng Dzongkha"] = "dz",
["Tiếng Dzuun"] = "dnn",
["Tiếng Ebla"] = "xeb",
["Tiếng Ebrié"] = "ebr",
["Tiếng Ebughu"] = "ebg",
["Tiếng Ede Ica"] = "ica",
["Tiếng Ede Idaca"] = "idd",
["Tiếng Ede Nago"] = "nqg",
["Tiếng Edekiri nguyên thủy"] = "alv-edk-pro",
["Tiếng Edo"] = "bin",
["Tiếng Edoid nguyên thủy"] = "alv-edo-pro",
["Tiếng Efai"] = "efa",
["Tiếng Efate Bắc"] = "llp",
["Tiếng Efate Nam"] = "erk",
["Tiếng Efe"] = "efe",
["Tiếng Efik"] = "efi",
["Tiếng Ega"] = "ega",
["Tiếng Eggon"] = "ego",
["Tiếng Ehueun"] = "ehu",
["Tiếng Eipomek"] = "eip",
["Tiếng Eitiep"] = "eit",
["Tiếng Ejagham"] = "etu",
["Tiếng El Molo"] = "elo",
["Tiếng Elam"] = "elx",
["Tiếng Elymi"] = "xly",
["Tiếng Emberá-Chamí"] = "cmi",
["Tiếng Emberá-Tadó"] = "tdc",
["Tiếng Embu"] = "ebu",
["Tiếng Emilia"] = "egl",
["Tiếng Enets lãnh nguyên"] = "enh",
["Tiếng Enets rừng"] = "enf",
["Tiếng Engenni"] = "enn",
["Tiếng Enisei nguyên thủy"] = "qfa-yen-pro",
["Tiếng Eotile"] = "eot",
["Tiếng Epie"] = "epi",
["Tiếng Eravalla"] = "era",
["Tiếng Erzya"] = "myv",
["Tiếng Esan"] = "ish",
["Tiếng Ese"] = "mcq",
["Tiếng Esimbi"] = "ags",
["Tiếng Eskimo nguyên thủy"] = "esx-esk-pro",
["Tiếng Eskimo-Aleut nguyên thủy"] = "esx-pro",
["Tiếng Estonia"] = "et",
["Tiếng Eteocrete"] = "ecr",
["Tiếng Etrusca"] = "ett",
["Tiếng Even"] = "eve",
["Tiếng Evenk"] = "evn",
["Tiếng Ewe"] = "ee",
["Tiếng Fala"] = "fax",
["Tiếng Falisci"] = "xfa",
["Tiếng Fanagalo"] = "fng",
["Tiếng Fang (Bantu)"] = "fan",
["Tiếng Faroe"] = "fo",
["Tiếng Fe'fe'"] = "fmp",
["Tiếng Fiji"] = "fj",
["Tiếng Finn nguyên thủy"] = "urj-fin-pro",
["Tiếng Flemish Tây"] = "vls",
["Tiếng Fogaha"] = "ber-fog",
["Tiếng Foi"] = "foi",
["Tiếng Fon"] = "fon",
["Tiếng Fox"] = "sac",
["Tiếng Franche-Comté"] = "roa-fcm",
["Tiếng Franco-Provençal"] = "frp",
["Tiếng Franken Trung"] = "gmw-cfr",
["Tiếng Frisia Saterland"] = "stq",
["Tiếng Frisia cổ"] = "ofs",
["Tiếng Friuli"] = "fur",
["Tiếng Fula"] = "ff",
["Tiếng Fur"] = "fvr",
["Tiếng Ga"] = "gaa",
["Tiếng Gabri"] = "gab",
["Tiếng Gadaba Bodo"] = "gbj",
["Tiếng Gaddang"] = "gad",
["Tiếng Gaddi"] = "gbk",
["Tiếng Gael Scotland"] = "gd",
["Tiếng Gagauz"] = "gag",
["Tiếng Gahri"] = "bfu",
["Tiếng Galati"] = "xga",
["Tiếng Galicia"] = "gl",
["Tiếng Galicia-Bồ Đào Nha"] = "roa-opt",
["Tiếng Gallo"] = "roa-gal",
["Tiếng Gallura"] = "sdn",
["Tiếng Galo"] = "adl",
["Tiếng Gamilaraay"] = "kld",
["Tiếng Gamit"] = "gbl",
["Tiếng Gamo"] = "gmv",
["Tiếng Ganza"] = "gza",
["Tiếng Garasia Adiwasi"] = "gas",
["Tiếng Garasia Rajput"] = "gra",
["Tiếng Garhwal"] = "gbm",
["Tiếng Garifuna"] = "cab",
["Tiếng Garo"] = "grt",
["Tiếng Garre"] = "gex",
["Tiếng Gata'"] = "gaq",
["Tiếng Gaul"] = "cel-gau",
["Tiếng Gawar-Bati"] = "gwt",
["Tiếng Gawwada"] = "gwd",
["Tiếng Gayil"] = "gyl",
["Tiếng Gbe Saxwe"] = "sxw",
["Tiếng Gbe Waci"] = "wci",
["Tiếng Gbe nguyên thủy"] = "alv-gbe-pro",
["Tiếng Gbiri-Niragu"] = "grh",
["Tiếng Gedeo"] = "drs",
["Tiếng Gen"] = "gej",
["Tiếng German Tây nguyên thủy"] = "gmw-pro",
["Tiếng German nguyên thủy"] = "gem-pro",
["Tiếng Graeco-Phrygia nguyên thủy"] = "ine-grp-pro",
["Tiếng Geʽez"] = "gez",
["Tiếng Ghadames"] = "gha",
["Tiếng Ghomala'"] = "bbj",
["Tiếng Ghomara"] = "gho",
["Tiếng Ghotuo"] = "aaa",
["Tiếng Gia Rai"] = "jra",
["Tiếng Gikuyu"] = "ki",
["Tiếng Gilak"] = "glk",
["Tiếng Gimi (Goroka)"] = "gim",
["Tiếng Girirra"] = "gii",
["Tiếng Giryama"] = "nyf",
["Tiếng Gitxsan"] = "git",
["Tiếng Giẻ"] = "jeh",
["Tiếng Glosa"] = "igs",
["Tiếng Godoberi"] = "gdo",
["Tiếng Gofa"] = "gof",
["Tiếng Gone Dau"] = "goo",
["Tiếng Gooniyandi"] = "gni",
["Tiếng Goran"] = "hac",
["Tiếng Gorontalo"] = "gor",
["Tiếng Gorowa"] = "gow",
["Tiếng Goth"] = "got",
["Tiếng Gotland"] = "gmq-gut",
["Tiếng Gotland cổ"] = "gmq-ogt",
["Tiếng Greenland"] = "kl",
["Tiếng Gruzia"] = "ka",
["Tiếng Gruzia cổ"] = "oge",
["Tiếng Gruzia-Do Thái"] = "jge",
["Tiếng Gruzia-Zan nguyên thủy"] = "ccs-gzn-pro",
["Tiếng Guajajára"] = "gub",
["Tiếng Guajá"] = "gvj",
["Tiếng Guanche"] = "gnc",
["Tiếng Guarani Mbya"] = "gun",
["Tiếng Guarani Paraguay"] = "gug",
["Tiếng Guaraní"] = "gn",
["Tiếng Guarayu"] = "gyr",
["Tiếng Gujar"] = "gju",
["Tiếng Gujarat"] = "gu",
["Tiếng Gujarat cổ"] = "inc-ogu",
["Tiếng Gujarat trung đại"] = "inc-mgu",
["Tiếng Gulay"] = "gvl",
["Tiếng Gulimancema"] = "gux",
["Tiếng Gumuz"] = "guk",
["Tiếng Gun"] = "guw",
["Tiếng Gurenne"] = "gur",
["Tiếng Guugu Yimidhirr"] = "kky",
["Tiếng Gwichʼin"] = "gwi",
["Tiếng H'Mông Tương Tây Tây"] = "mmr",
["Tiếng H'Mông-Miền nguyên thủy"] = "hmx-pro",
["Tiếng H'roi"] = "hro",
["Tiếng Hachijō"] = "jpx-hcj",
["Tiếng Hadiyya"] = "hdy",
["Tiếng Haida"] = "hai",
["Tiếng Haisla"] = "has",
["Tiếng Hajong"] = "haj",
["Tiếng Halba"] = "hlb",
["Tiếng Halkomelem"] = "hur",
["Tiếng Hamer-Banna"] = "amf",
["Tiếng Hano"] = "lml",
["Tiếng Hanunoo"] = "hnn",
["Tiếng Harari"] = "har",
["Tiếng Harsusi"] = "hss",
["Tiếng Haryanvi"] = "bgc",
["Tiếng Hatti"] = "xht",
["Tiếng Hausa"] = "ha",
["Tiếng Haush"] = "sai-hau",
["Tiếng Havasupai-Walapai-Yavapai"] = "yuf",
["Tiếng Hawaii"] = "haw",
["Tiếng Hazara"] = "haz",
["Tiếng Heiban"] = "hbn",
["Tiếng Heiltsuk"] = "hei",
["Tiếng Hellen nguyên thủy"] = "grk-pro",
["Tiếng Herero"] = "hz",
["Tiếng Hernici"] = "xhr",
["Tiếng Higaonon"] = "mba",
["Tiếng Hiligaynon"] = "hil",
["Tiếng Hindi"] = "hi",
["Tiếng Hindi Fiji"] = "hif",
["Tiếng Hindi cổ"] = "inc-ohi",
["Tiếng Hindko Bắc"] = "hno",
["Tiếng Hinduri"] = "hii",
["Tiếng Hindustan Caribe"] = "hns",
["Tiếng Hinukh"] = "gin",
["Tiếng Hiri Motu"] = "ho",
["Tiếng Hitti"] = "hit",
["Tiếng Hiw"] = "hiw",
["Tiếng Hlai"] = "lic",
["Tiếng Hlai nguyên thủy"] = "qfa-lic-pro",
["Tiếng Ho"] = "hoc",
["Tiếng Hoava"] = "hoa",
["Tiếng Hocak"] = "win",
["Tiếng Holiya"] = "hoy",
["Tiếng Hopi"] = "hop",
["Tiếng Horpa"] = "ero",
["Tiếng Hozo"] = "hoz",
["Tiếng Hpon"] = "hpo",
["Tiếng Hrê"] = "hre",
["Tiếng Hu"] = "huo",
["Tiếng Hulaulá"] = "huy",
["Tiếng Hungary"] = "hu",
["Tiếng Hunsrik"] = "hrx",
["Tiếng Hunzib"] = "huz",
["Tiếng Hupa"] = "hup",
["Tiếng Hupdë"] = "jup",
["Tiếng Hurri"] = "xhu",
["Tiếng Huy"] = "czh",
["Tiếng Hy Lạp"] = "el",
["Tiếng Hy Lạp Cappadocia"] = "cpg",
["Tiếng Hy Lạp Italiot"] = "grk-ita",
["Tiếng Hy Lạp Mariupol"] = "grk-mar",
["Tiếng Hy Lạp Mycenae"] = "gmy",
["Tiếng Hy Lạp Pontos"] = "pnt",
["Tiếng Hy Lạp cổ"] = "grc",
["Tiếng Hyam"] = "jab",
["Tiếng Hà Lan"] = "nl",
["Tiếng Hà Lan Jersey"] = "gmw-jdt",
["Tiếng Hà Lan cổ"] = "odt",
["Tiếng Hà Lan trung đại"] = "dum",
["Tiếng Hà Lăng"] = "hal",
["Tiếng Hà Nhì"] = "hni",
["Tiếng Hán thượng cổ"] = "och",
["Tiếng Hán trung cổ"] = "ltc",
["Tiếng Hán-Tạng nguyên thủy"] = "sit-pro",
["Tiếng Hạ Saxon Hà Lan"] = "nds-nl",
["Tiếng Hạ Sorb"] = "dsb",
["Tiếng Hạ Tanana"] = "taa",
["Tiếng Hạ Đức"] = "nds",
["Tiếng Hạ Đức Mennonite"] = "pdt",
["Tiếng Hạ Đức trung đại"] = "gml",
["Tiếng Hạ Đức tại Đức"] = "nds-de",
["Tiếng Iaai"] = "iai",
["Tiếng Ibaloi"] = "ibl",
["Tiếng Iban"] = "iba",
["Tiếng Ibanag"] = "ibg",
["Tiếng Ibatan"] = "ivb",
["Tiếng Ibibio"] = "ibb",
["Tiếng Ibino"] = "ibn",
["Tiếng Ibuoro"] = "ibr",
["Tiếng Iceland"] = "is",
["Tiếng Ida'an"] = "dbj",
["Tiếng Ido"] = "io",
["Tiếng Idu"] = "clk",
["Tiếng Ifugao Batad"] = "ifb",
["Tiếng Ifè"] = "ife",
["Tiếng Igala"] = "igl",
["Tiếng Igbo"] = "ig",
["Tiếng Ikposo"] = "kpo",
["Tiếng Ikwere"] = "ikw",
["Tiếng Ili Turki"] = "ili",
["Tiếng Ilokano"] = "ilo",
["Tiếng Indo-Bồ Đào Nha"] = "idb",
["Tiếng Indonesia"] = "id",
["Tiếng Indonesia Peranakan"] = "pea",
["Tiếng Ingria"] = "izh",
["Tiếng Ingush"] = "inh",
["Tiếng Inor"] = "ior",
["Tiếng Interlingue"] = "ie",
["Tiếng Intha"] = "int",
["Tiếng Inuit nguyên thủy"] = "esx-inu-pro",
["Tiếng Inuktitut"] = "iu",
["Tiếng Inuktitut Đông Canada"] = "ike",
["Tiếng Inupiaq"] = "ik",
["Tiếng Inuvialuktun"] = "ikt",
["Tiếng Iran nguyên thủy"] = "ira-pro",
["Tiếng Iraqw"] = "irk",
["Tiếng Ireland"] = "ga",
["Tiếng Ireland cổ"] = "sga",
["Tiếng Ireland trung đại"] = "mga",
["Tiếng Iroquois nguyên thủy"] = "iro-pro",
["Tiếng Irula"] = "iru",
["Tiếng Isan"] = "tts",
["Tiếng Ishkashim"] = "isk",
["Tiếng Isnag"] = "isd",
["Tiếng Isoko"] = "iso",
["Tiếng Istria"] = "ist",
["Tiếng Istria Rumani"] = "ruo",
["Tiếng Italic nguyên thủy"] = "itc-pro",
["Tiếng Itaŋikom"] = "bkm",
["Tiếng Itelmen"] = "itl",
["Tiếng Itene"] = "ite",
["Tiếng Itonama"] = "ito",
["Tiếng Itsekiri"] = "its",
["Tiếng Itu Mbon Uzo"] = "itm",
["Tiếng Ivatan"] = "ivv",
["Tiếng Iwaidja"] = "ibd",
["Tiếng Ixil"] = "ixl",
["Tiếng Izon"] = "ijc",
["Tiếng Jacaltec"] = "jac",
["Tiếng Jah Hut"] = "jah",
["Tiếng Jamamadí"] = "jaa",
["Tiếng Japhug"] = "sit-jap",
["Tiếng Jaqaru"] = "jqr",
["Tiếng Jarawa"] = "anq",
["Tiếng Jaunsar"] = "jns",
["Tiếng Java"] = "jv",
["Tiếng Java Caribe"] = "jvn",
["Tiếng Java cổ"] = "kaw",
["Tiếng Javindo"] = "jvd",
["Tiếng Jehai"] = "jhi",
["Tiếng Jeju"] = "jje",
["Tiếng Jemez"] = "tow",
["Tiếng Jicarilla"] = "apj",
["Tiếng Jiiddu"] = "jii",
["Tiếng Jirel"] = "jul",
["Tiếng Jju"] = "kaj",
["Tiếng Jru'"] = "lbo",
["Tiếng Juang"] = "jun",
["Tiếng Jukun Takum"] = "jbu",
["Tiếng Jumaytepeque"] = "nai-jum",
["Tiếng Jumjum"] = "jum",
["Tiếng Juray"] = "juy",
["Tiếng Juǀ'hoan"] = "ktz",
["Tiếng Jylland"] = "jut",
["Tiếng Jê Bắc nguyên thủy"] = "sai-nje-pro",
["Tiếng Jê nguyên thủy"] = "sai-jee-pro",
["Tiếng K'Ho"] = "kpm",
["Tiếng K'iche'"] = "quc",
["Tiếng Kabardia"] = "kbd",
["Tiếng Kabiye"] = "kbp",
["Tiếng Kabuverdianu"] = "kea",
["Tiếng Kabyle"] = "kab",
["Tiếng Kachama-Ganjule"] = "kcx",
["Tiếng Kachin"] = "kac",
["Tiếng Kadar"] = "kej",
["Tiếng Kadazan bờ biển"] = "kzj",
["Tiếng Kadu"] = "zkd",
["Tiếng Kafa"] = "kbr",
["Tiếng Kagayanen"] = "cgc",
["Tiếng Kaikadi"] = "kep",
["Tiếng Kaingang"] = "kgp",
["Tiếng Kaitag"] = "xdq",
["Tiếng Kakabai"] = "kqf",
["Tiếng Kaki Ae"] = "tbd",
["Tiếng Kalam"] = "gwc",
["Tiếng Kalanguya"] = "kak",
["Tiếng Kalao"] = "kly",
["Tiếng Kalash"] = "kls",
["Tiếng Kalinga Limos"] = "kmk",
["Tiếng Kalkot"] = "xka",
["Tiếng Kalmyk"] = "xal",
["Tiếng Kalo Phần Lan"] = "rmf",
["Tiếng Kamarupi Prakrit"] = "inc-kam",
["Tiếng Kamassia"] = "xas",
["Tiếng Kamayo"] = "kyk",
["Tiếng Kambaata"] = "ktb",
["Tiếng Kambera"] = "xbr",
["Tiếng Kamula"] = "xla",
["Tiếng Kanakanavu"] = "xnb",
["Tiếng Kanan"] = "zkn",
["Tiếng Kangean"] = "kkv",
["Tiếng Kangra"] = "xnr",
["Tiếng Kankanaey"] = "kne",
["Tiếng Kannada"] = "kn",
["Tiếng Kannada cổ"] = "dra-okn",
["Tiếng Kannauj"] = "bjj",
["Tiếng Kanuri"] = "kr",
["Tiếng Kapampangan"] = "pam",
["Tiếng Kapingamarangi"] = "kpg",
["Tiếng Kaqchikel"] = "cak",
["Tiếng Karachay-Balkar"] = "krc",
["Tiếng Karaim"] = "kdr",
["Tiếng Karajá"] = "kpj",
["Tiếng Karakalpak"] = "kaa",
["Tiếng Karakhanid"] = "xqa",
["Tiếng Karao"] = "kyj",
["Tiếng Karata"] = "kpt",
["Tiếng Karbi"] = "mjw",
["Tiếng Karekare"] = "kai",
["Tiếng Karelia"] = "krl",
["Tiếng Karen Bwe"] = "bwe",
["Tiếng Karen Geba"] = "kvq",
["Tiếng Karen Geko"] = "ghk",
["Tiếng Karen Mobwa"] = "jkm",
["Tiếng Karen Paku"] = "jkp",
["Tiếng Karen S'gaw"] = "ksw",
["Tiếng Karen Zayein"] = "kxk",
["Tiếng Karen nguyên thủy"] = "kar-pro",
["Tiếng Kari'na"] = "car",
["Tiếng Kariri"] = "kzw",
["Tiếng Karitiâna"] = "ktn",
["Tiếng Karo"] = "kxh",
["Tiếng Kartvelia nguyên thủy"] = "ccs-pro",
["Tiếng Kashaya"] = "kju",
["Tiếng Kashmir"] = "ks",
["Tiếng Kaszëb"] = "csb",
["Tiếng Katang Bắc"] = "ncq",
["Tiếng Kaurna"] = "zku",
["Tiếng Kavalan"] = "ckv",
["Tiếng Kavet"] = "krv",
["Tiếng Kawésqar"] = "alc",
["Tiếng Kayan"] = "pdu",
["Tiếng Kayapó"] = "txu",
["Tiếng Kayort"] = "kyv",
["Tiếng Kazakh"] = "kk",
["Tiếng Kensiu"] = "kns",
["Tiếng Kenyang"] = "ken",
["Tiếng Kerek"] = "krk",
["Tiếng Kerman"] = "xme-ker",
["Tiếng Ket"] = "ket",
["Tiếng Khakas"] = "kjh",
["Tiếng Khalaj"] = "klj",
["Tiếng Khaling"] = "klr",
["Tiếng Kham Gamale"] = "kgj",
["Tiếng Kham Parbate Tây"] = "kjl",
["Tiếng Kham Parbate Đông"] = "kif",
["Tiếng Kham Sheshi"] = "kip",
["Tiếng Khamba"] = "kbg",
["Tiếng Khamti"] = "kht",
["Tiếng Khamyang"] = "ksu",
["Tiếng Khang Gia"] = "kxs",
["Tiếng Khanty"] = "kca",
["Tiếng Kharia"] = "khr",
["Tiếng Khasa Prakrit"] = "inc-kha",
["Tiếng Khasi"] = "kha",
["Tiếng Khasi nguyên thủy"] = "aav-khs-pro",
["Tiếng Khazar"] = "zkz",
["Tiếng Khengkha"] = "xkf",
["Tiếng Khiamniungan"] = "kix",
["Tiếng Khinalug"] = "kjj",
["Tiếng Khiết Đan"] = "zkt",
["Tiếng Khmer"] = "km",
["Tiếng Khmer Surin"] = "kxm",
["Tiếng Khmer cổ"] = "okz",
["Tiếng Khmer nguyên thủy"] = "mkh-kmr-pro",
["Tiếng Khmer trung đại"] = "xhm",
["Tiếng Khoekhoe"] = "naq",
["Tiếng Kholosi"] = "inc-kho",
["Tiếng Khotan"] = "kho",
["Tiếng Khowar"] = "khw",
["Tiếng Khroskyabs"] = "jiq",
["Tiếng Khuen"] = "khf",
["Tiếng Khvarshi"] = "khv",
["Tiếng Khwarezm"] = "xco",
["Tiếng Khách Gia"] = "hak",
["Tiếng Kháng"] = "kjm",
["Tiếng Khùa"] = "xhv",
["Tiếng Khün"] = "kkh",
["Tiếng Khơ Mú"] = "kjg",
["Tiếng Khơ Mú nguyên thủy"] = "mkh-khm-pro",
["Tiếng Khương Bắc"] = "cng",
["Tiếng Khương Nam"] = "qxs",
["Tiếng Khương Đường"] = "cna",
["Tiếng Kickapoo"] = "kic",
["Tiếng Kikai"] = "kzg",
["Tiếng Kili"] = "tuw-kil",
["Tiếng Kim"] = "kia",
["Tiếng Kim Môn"] = "mji",
["Tiếng Kimbundu"] = "kmb",
["Tiếng Kinaray-a"] = "krj",
["Tiếng Kinnaur"] = "kfk",
["Tiếng Kinnaur Harija"] = "kjo",
["Tiếng Kintaq"] = "knq",
["Tiếng Kiowa"] = "kio",
["Tiếng Gilbert"] = "gil",
["Tiếng Kirike"] = "okr",
["Tiếng Kisan"] = "xis",
["Tiếng Kistane"] = "gru",
["Tiếng Kituba"] = "ktu",
["Tiếng Klallam"] = "clm",
["Tiếng Klingon"] = "tlh",
["Tiếng Knaan"] = "czk",
["Tiếng Koalib"] = "kib",
["Tiếng Kobon"] = "kpw",
["Tiếng Koch"] = "kdq",
["Tiếng Koda"] = "cdz",
["Tiếng Kodava"] = "kfa",
["Tiếng Kohistan"] = "mvy",
["Tiếng Koibal"] = "zkb",
["Tiếng Kok Borok"] = "trp",
["Tiếng Kolami"] = "kfb",
["Tiếng Kolhe"] = "ekl",
["Tiếng Koli Kachi"] = "gjk",
["Tiếng Koli Parkar"] = "kvx",
["Tiếng Koli Wadiyara"] = "kxp",
["Tiếng Koman nguyên thủy"] = "ssa-kom-pro",
["Tiếng Komi cổ"] = "urj-koo",
["Tiếng Komi-Permyak"] = "koi",
["Tiếng Komi-Yazva"] = "urj-kya",
["Tiếng Komi-Zyrian"] = "kpv",
["Tiếng Komo"] = "xom",
["Tiếng Komodo"] = "kvh",
["Tiếng Konabéré"] = "bbo",
["Tiếng Konda-Dora"] = "kfc",
["Tiếng Kondekor"] = "gau",
["Tiếng Kongo"] = "kg",
["Tiếng Konkan"] = "kok",
["Tiếng Konobo"] = "kqo",
["Tiếng Konso"] = "kxc",
["Tiếng Koonzime"] = "ozm",
["Tiếng Koore"] = "kqy",
["Tiếng Koraga Korra"] = "kfd",
["Tiếng Koraga Mudu"] = "vmd",
["Tiếng Korku"] = "kfq",
["Tiếng Korwa"] = "kfp",
["Tiếng Koryak"] = "kpy",
["Tiếng Kosrae"] = "kos",
["Tiếng Kota (Ấn Độ)"] = "kfe",
["Tiếng Kotava"] = "avk",
["Tiếng Kott"] = "zko",
["Tiếng Koya"] = "kff",
["Tiếng Kpelle Guinea"] = "gkp",
["Tiếng Kpelle Liberia"] = "xpe",
["Tiếng Kra nguyên thủy"] = "qfa-kra-pro",
["Tiếng Kra-Dai nguyên thủy"] = "qfa-tak-pro",
["Tiếng Kraol"] = "rka",
["Tiếng Kresh"] = "krs",
["Tiếng Krio"] = "kri",
["Tiếng Kriol Úc"] = "rop",
["Tiếng Krung"] = "krr",
["Tiếng Krymchak"] = "jct",
["Tiếng Kryts"] = "kry",
["Tiếng Ktunaxa"] = "kut",
["Tiếng Kubachi"] = "ugh",
["Tiếng Kudiya"] = "kfg",
["Tiếng Kudmal"] = "kyw",
["Tiếng Kui (Ấn Độ)"] = "uki",
["Tiếng Kui Dawik"] = "dwk",
["Tiếng Kuke"] = "ght",
["Tiếng Kuki-Chin nguyên thủy"] = "tbq-kuk-pro",
["Tiếng Kukna"] = "kex",
["Tiếng Kullu"] = "kfx",
["Tiếng Kulon-Pazeh"] = "uun",
["Tiếng Kumbewaha"] = "xks",
["Tiếng Kumeyaay"] = "nai-kum",
["Tiếng Kumyk"] = "kum",
["Tiếng Kumzar"] = "zum",
["Tiếng Kuna"] = "cuk",
["Tiếng Kundal Shahi"] = "shd",
["Tiếng Kunigami"] = "xug",
["Tiếng Kuo"] = "xuo",
["Tiếng Kupia"] = "key",
["Tiếng Kurichiya"] = "kfh",
["Tiếng Kurmanji"] = "kmr",
["Tiếng Kurtokha"] = "xkz",
["Tiếng Kurukh"] = "kru",
["Tiếng Kurumba Alu"] = "xua",
["Tiếng Kurumba Attapady"] = "pkr",
["Tiếng Kurumba Betta"] = "xub",
["Tiếng Kurumba Jennu"] = "xuj",
["Tiếng Kurumba Kannada"] = "kfi",
["Tiếng Kurumba Mullu"] = "kpb",
["Tiếng Kushi"] = "kuh",
["Tiếng Kutch"] = "kfr",
["Tiếng Kutep"] = "kub",
["Tiếng Kuvi"] = "kxv",
["Tiếng Kuy"] = "kdt",
["Tiếng Kven"] = "fkv",
["Tiếng Kw'adza"] = "wka",
["Tiếng Kwak'wala"] = "kwk",
["Tiếng Kwanja"] = "knp",
["Tiếng Kwanyama"] = "kj",
["Tiếng Kwinti"] = "kww",
["Tiếng Kyakala"] = "tuw-kkl",
["Tiếng Kyrgyz"] = "ky",
["Tiếng Kyrgyz Phú Dụ"] = "trk-fyk",
["Tiếng Kâte"] = "kmg",
["Tiếng La Hủ"] = "lhu",
["Tiếng Laalaa"] = "cae",
["Tiếng Ladakh"] = "lbj",
["Tiếng Ladin"] = "lld",
["Tiếng Ladino"] = "lad",
["Tiếng Lahnda"] = "lah",
["Tiếng Lahta"] = "kvt",
["Tiếng Lak"] = "lbe",
["Tiếng Lakalei"] = "lka",
["Tiếng Laki"] = "lki",
["Tiếng Lakota"] = "lkt",
["Tiếng Lama Gur"] = "las",
["Tiếng Lambadi"] = "lmn",
["Tiếng Lamboya"] = "lmy",
["Tiếng Lamkang"] = "lmk",
["Tiếng Lanoh"] = "lnh",
["Tiếng Laomian"] = "lwm",
["Tiếng Lar"] = "lrl",
["Tiếng Lasalimu"] = "llm",
["Tiếng Lashi"] = "lsi",
["Tiếng Latgale"] = "ltg",
["Tiếng Latinh"] = "la",
["Tiếng Latundê"] = "ltn",
["Tiếng Latvia"] = "lv",
["Tiếng Lavukaleve"] = "lvk",
["Tiếng Lawa Tây"] = "lcp",
["Tiếng Lawa Đông"] = "lwl",
["Tiếng Lawi"] = "lvi",
["Tiếng Laya"] = "lya",
["Tiếng Laz"] = "lzz",
["Tiếng Lelemi"] = "lef",
["Tiếng Lemnos"] = "xle",
["Tiếng Lepcha"] = "lep",
["Tiếng Leponti"] = "xlp",
["Tiếng Lewo"] = "lww",
["Tiếng Lezgi"] = "lez",
["Tiếng Lezgi nguyên thủy"] = "cau-lzg-pro",
["Tiếng León"] = "roa-leo",
["Tiếng León cổ"] = "roa-ole",
["Tiếng Lhao Vo"] = "mhx",
["Tiếng Lhomi"] = "lhm",
["Tiếng Liabuku"] = "lix",
["Tiếng Libido"] = "liq",
["Tiếng Liguria"] = "lij",
["Tiếng Lillooet"] = "lil",
["Tiếng Limbum"] = "lmp",
["Tiếng Limburg"] = "li",
["Tiếng Lindu"] = "klw",
["Tiếng Lingala"] = "ln",
["Tiếng Lipan"] = "apl",
["Tiếng Lishana Deni"] = "lsd",
["Tiếng Lishanid Noshan"] = "aij",
["Tiếng Lisu"] = "lis",
["Tiếng Litva"] = "lt",
["Tiếng Litva cổ"] = "olt",
["Tiếng Livonia"] = "liv",
["Tiếng Livvi"] = "olo",
["Tiếng Lobi"] = "lob",
["Tiếng Lodha"] = "lbm",
["Tiếng Logba"] = "lgq",
["Tiếng Lojban"] = "jbo",
["Tiếng Loke"] = "loy",
["Tiếng Lokono"] = "arw",
["Tiếng Loma"] = "lom",
["Tiếng Lomavren"] = "rmi",
["Tiếng Lombard"] = "lmo",
["Tiếng Lorrain"] = "roa-lor",
["Tiếng Lotha Naga"] = "njh",
["Tiếng Lou"] = "loj",
["Tiếng Luba-Katanga"] = "lu",
["Tiếng Lucumí"] = "luq",
["Tiếng Luganda"] = "lg",
["Tiếng Luhya"] = "luy",
["Tiếng Lukpa"] = "dop",
["Tiếng Lumbu"] = "lup",
["Tiếng Lunana"] = "luk",
["Tiếng Lur Bắc"] = "lrc",
["Tiếng Lur Nam"] = "luz",
["Tiếng Lushootseed"] = "lut",
["Tiếng Lutuv"] = "clt",
["Tiếng Luwi"] = "xlu",
["Tiếng Luxembourg"] = "lb",
["Tiếng Lycia"] = "xlc",
["Tiếng Lydia"] = "xld",
["Tiếng Lyngngam"] = "lyg",
["Tiếng Lyydi"] = "lud",
["Tiếng Lào"] = "lo",
["Tiếng Lâm Cao"] = "onb",
["Tiếng Lô Lô"] = "ii",
["Tiếng Lô Lô-Miến nguyên thủy"] = "tbq-lob-pro",
["Tiếng Lư Nhân"] = "sit-lrn",
["Tiếng Lưu Cầu nguyên thủy"] = "jpx-ryu-pro",
["Tiếng Lự"] = "khb",
["Tiếng M'Nông Nam"] = "mnn",
["Tiếng M'Nông Trung"] = "cmo",
["Tiếng M'Nông Đông"] = "mng",
["Tiếng Ma Thoa"] = "nru",
["Tiếng Ma'anyan"] = "mhy",
["Tiếng Maaka"] = "mew",
["Tiếng Maale"] = "mdy",
["Tiếng Maasai"] = "mas",
["Tiếng Maay"] = "ymm",
["Tiếng Mabaan"] = "mfz",
["Tiếng Mabang"] = "mde",
["Tiếng Macedoni cổ đại"] = "xmk",
["Tiếng Macedonia"] = "mk",
["Tiếng Macushi"] = "mbc",
["Tiếng Madura"] = "mad",
["Tiếng Magaha"] = "mag",
["Tiếng Magar Tây"] = "mrd",
["Tiếng Magar Đông"] = "mgp",
["Tiếng Magori"] = "zgr",
["Tiếng Maguindanao"] = "mdh",
["Tiếng Mah Meri"] = "mhe",
["Tiếng Mahal"] = "mjx",
["Tiếng Maithil"] = "mai",
["Tiếng Majang"] = "mpe",
["Tiếng Makassar"] = "mak",
["Tiếng Mal"] = "mlf",
["Tiếng Malagasy"] = "mg",
["Tiếng Malankurava"] = "mjo",
["Tiếng Malapandaram"] = "mjp",
["Tiếng Malarya"] = "mjq",
["Tiếng Malasar"] = "ymr",
["Tiếng Malasar Mala"] = "ima",
["Tiếng Malavedan"] = "mjr",
["Tiếng Malayalam"] = "ml",
["Tiếng Malecite-Passamaquoddy"] = "pqm",
["Tiếng Malta"] = "mt",
["Tiếng Mampruli"] = "maw",
["Tiếng Man"] = "gv",
["Tiếng Manda (Ấn Độ)"] = "mha",
["Tiếng Mandahuaca"] = "mht",
["Tiếng Mandara"] = "tbf",
["Tiếng Mande nguyên thủy"] = "dmn-pro",
["Tiếng Mandi"] = "mjl",
["Tiếng Mandinka"] = "mnk",
["Tiếng Mangas"] = "zns",
["Tiếng Manggarai"] = "mqy",
["Tiếng Mangghuer"] = "xgn-mgr",
["Tiếng Mangghul"] = "mjg-mgr",
["Tiếng Manipur"] = "mni",
["Tiếng Mankanya"] = "knf",
["Tiếng Mannan"] = "mjv",
["Tiếng Mano"] = "mev",
["Tiếng Mansaka"] = "msk",
["Tiếng Mansi nguyên thủy"] = "mns-pro",
["Tiếng Manumanaw"] = "kxf",
["Tiếng Mao Nam"] = "mmd",
["Tiếng Maori"] = "mi",
["Tiếng Mapuche"] = "arn",
["Tiếng Maranao"] = "mrw",
["Tiếng Marathi"] = "mr",
["Tiếng Marathi cổ"] = "omr",
["Tiếng Marau"] = "mvr",
["Tiếng Mari Tây"] = "mrj",
["Tiếng Mari nguyên thủy"] = "chm-pro",
["Tiếng Mari Đông"] = "mhr",
["Tiếng Maria (Ấn Độ)"] = "mrr",
["Tiếng Maricopa"] = "mrc",
["Tiếng Marma"] = "rmz",
["Tiếng Marquises Bắc"] = "mrq",
["Tiếng Marquises Nam"] = "mqm",
["Tiếng Marrucini"] = "umc",
["Tiếng Marshall"] = "mh",
["Tiếng Marsi"] = "ims",
["Tiếng Martuthunira"] = "vma",
["Tiếng Marwar"] = "mwr",
["Tiếng Masbatenyo"] = "msb",
["Tiếng Maskelynes"] = "klv",
["Tiếng Matal"] = "mfh",
["Tiếng Mator"] = "mtm",
["Tiếng Maung"] = "mph",
["Tiếng Maya Yucatán"] = "yua",
["Tiếng Maya nguyên thủy"] = "myn-pro",
["Tiếng Mazahua Michoacán"] = "mmc",
["Tiếng Mazahua Trung"] = "maz",
["Tiếng Mazandaran"] = "mzn",
["Tiếng Mbabaram"] = "vmb",
["Tiếng Mbembe Tigon"] = "nza",
["Tiếng Mbembe sông Cross"] = "mfn",
["Tiếng Me'en"] = "mym",
["Tiếng Me'phaa Acatepec"] = "tpx",
["Tiếng Me'phaa Azoyú"] = "tpc",
["Tiếng Me'phaa Tlacoapa"] = "tpl",
["Tiếng Media cổ"] = "xme-old",
["Tiếng Medumba"] = "byv",
["Tiếng Mehri"] = "gdq",
["Tiếng Melo"] = "mfx",
["Tiếng Melpa"] = "med",
["Tiếng Memon"] = "mby",
["Tiếng Mendankwe-Nkwen"] = "mfd",
["Tiếng Mende"] = "men",
["Tiếng Menominee"] = "mez",
["Tiếng Mentawai"] = "mwv",
["Tiếng Meriam"] = "ulk",
["Tiếng Mesaka"] = "iyo",
["Tiếng Mesqan"] = "mvz",
["Tiếng Messapio"] = "cms",
["Tiếng Meänkieli"] = "fit",
["Tiếng Mi'kmaq"] = "mic",
["Tiếng Miami"] = "mia",
["Tiếng Minangkabau"] = "min",
["Tiếng Mingrelia"] = "xmf",
["Tiếng Minriq"] = "mnq",
["Tiếng Mintil"] = "mzt",
["Tiếng Miranda"] = "mwl",
["Tiếng Mirga"] = "zrg",
["Tiếng Mising"] = "mrg",
["Tiếng Miskito"] = "miq",
["Tiếng Mixtec Alcozauca"] = "xta",
["Tiếng Mixtec Chayuco"] = "mih",
["Tiếng Mixtec Yosondúa"] = "mpm",
["Tiếng Mixtec nguyên thủy"] = "omq-mix-pro",
["Tiếng Miyako"] = "mvi",
["Tiếng Mizo"] = "lus",
["Tiếng Miến Điện"] = "my",
["Tiếng Miến Điện cổ"] = "obr",
["Tiếng Miền nguyên thủy"] = "hmx-mie-pro",
["Tiếng Mlabri"] = "mra",
["Tiếng Mlahsö"] = "lhs",
["Tiếng Mogholi"] = "mhj",
["Tiếng Moglena-Rumani"] = "ruq",
["Tiếng Mohawk"] = "moh",
["Tiếng Mohegan-Pequot"] = "xpq",
["Tiếng Moken"] = "mwt",
["Tiếng Mokil"] = "mkj",
["Tiếng Moklen"] = "mkm",
["Tiếng Moksha"] = "mdf",
["Tiếng Molbog"] = "pwm",
["Tiếng Mongghul"] = "mjg-mgl",
["Tiếng Mongo"] = "lol",
["Tiếng Mongondow"] = "mog",
["Tiếng Mooré"] = "mos",
["Tiếng Mordvin nguyên thủy"] = "urj-mdv-pro",
["Tiếng Moro"] = "mor",
["Tiếng Morokodo"] = "mgc",
["Tiếng Mota"] = "mtt",
["Tiếng Motu"] = "meu",
["Tiếng Mozarab"] = "mxi",
["Tiếng Mpade"] = "mpi",
["Tiếng Mpi"] = "mpz",
["Tiếng Muak Sa-aak"] = "ukk",
["Tiếng Mudburra"] = "dmw",
["Tiếng Muduga"] = "udg",
["Tiếng Muna"] = "mnb",
["Tiếng Munda"] = "unx",
["Tiếng Munda nguyên thủy"] = "mun-pro",
["Tiếng Mundabli"] = "boe",
["Tiếng Mundari"] = "unr",
["Tiếng Munggui"] = "mth",
["Tiếng Munji"] = "mnj",
["Tiếng Munsee"] = "umu",
["Tiếng Muria Viễn Tây"] = "fmu",
["Tiếng Murle"] = "mur",
["Tiếng Mursi"] = "muz",
["Tiếng Muscogee"] = "mus",
["Tiếng Musi"] = "mui",
["Tiếng Muskogee nguyên thủy"] = "nai-mus-pro",
["Tiếng Muthuvan"] = "muv",
["Tiếng Mwan"] = "moa",
["Tiếng Mwotlap"] = "mlv",
["Tiếng Myene"] = "mye",
["Tiếng Mân Bắc"] = "mnp",
["Tiếng Mân Nam"] = "nan",
["Tiếng Mân Trung"] = "czo",
["Tiếng Mân Tuyền Chương"] = "nan-hbl",
["Tiếng Mân nguyên thủy"] = "zhx-min-pro",
["Tiếng Mân Đông"] = "cdo",
["Tiếng Mã Lai"] = "ms",
["Tiếng Mã Lai Ambon"] = "abs",
["Tiếng Mã Lai Baba"] = "mbf",
["Tiếng Mã Lai Bacan"] = "btj",
["Tiếng Mã Lai Brunei"] = "kxd",
["Tiếng Mã Lai Bắc Maluku"] = "max",
["Tiếng Mã Lai Kedah"] = "meo",
["Tiếng Mã Lai Pattani"] = "mfa",
["Tiếng Mã Lai Sarawak"] = "poz-sml",
["Tiếng Mã Lai cổ"] = "omy",
["Tiếng Mã Lai nguyên thủy"] = "poz-mly-pro",
["Tiếng Mã Lai-Chăm nguyên thủy"] = "poz-mcm-pro",
["Tiếng Mã Lai-Sumbawa nguyên thủy"] = "poz-msa-pro",
["Tiếng Mã Lai-Đa Đảo Trung Đông nguyên thủy"] = "poz-cet-pro",
["Tiếng Mã Lai-Đa Đảo nguyên thủy"] = "poz-pro",
["Tiếng Mã Lai-Đa Đảo Đông nguyên thủy"] = "pqe-pro",
["Tiếng Mã Liềng"] = "pkt",
["Tiếng Mãn Châu"] = "mnc",
["Tiếng Mòcheno"] = "mhn",
["Tiếng Môn"] = "mnw",
["Tiếng Môn Thái"] = "mnw-tha",
["Tiếng Môn cổ"] = "omx",
["Tiếng Môn nguyên thủy"] = "mkh-mnc-pro",
["Tiếng Môn trung đại"] = "mkh-mmn",
["Tiếng Môn-Khmer nguyên thủy"] = "mkh-pro",
["Tiếng Mông"] = "hmf",
["Tiếng Mông Cổ"] = "mn",
["Tiếng Mông Cổ Khamnigan"] = "ykh",
["Tiếng Mông Cổ cổ điển"] = "cmg",
["Tiếng Mông Cổ nguyên thủy"] = "xgn-pro",
["Tiếng Mông Cổ trung đại"] = "xng",
["Tiếng Mông Trắng"] = "mww",
["Tiếng Mơ Nâm"] = "moo",
["Tiếng Mường"] = "mtq",
["Tiếng Mạ"] = "cma",
["Tiếng Mảng"] = "zng",
["Tiếng Na Miểu"] = "neo",
["Tiếng Na Uy"] = "no",
["Tiếng Na Uy (Bokmål)"] = "nb",
["Tiếng Na Uy (Nynorsk)"] = "nn",
["Tiếng Nafaanra"] = "nfr",
["Tiếng Naga Chothe"] = "nct",
["Tiếng Naga Maring"] = "nng",
["Tiếng Naga Moyon"] = "nmo",
["Tiếng Naga Thangal"] = "nki",
["Tiếng Naga Trung nguyên thủy"] = "sit-aao-pro",
["Tiếng Nahua nguyên thủy"] = "azc-nah-pro",
["Tiếng Nahuatl"] = "nah",
["Tiếng Nahuatl Temascaltepec"] = "nhv",
["Tiếng Nahuatl cổ điển"] = "nci",
["Tiếng Nakh nguyên thủy"] = "cau-nkh-pro",
["Tiếng Nam Altai"] = "alt",
["Tiếng Nam Amami Ōshima"] = "ams",
["Tiếng Nam Dravida I nguyên thủy"] = "dra-sdo-pro",
["Tiếng Nam Dravida II nguyên thủy"] = "dra-sdt-pro",
["Tiếng Nam Dravida nguyên thủy"] = "dra-sou-pro",
["Tiếng Nam Kolami"] = "nit",
["Tiếng Nam Mansi"] = "mns-sou",
["Tiếng Nam Ndebele"] = "nr",
["Tiếng Nam Sami"] = "sma",
["Tiếng Nam Selkup"] = "sel-sou",
["Tiếng Nam Slavey"] = "xsl",
["Tiếng Nam Thái"] = "sou",
["Tiếng Nam Uzbek"] = "uzs",
["Tiếng Nam Yukaghir"] = "yux",
["Tiếng Nam Á nguyên thủy"] = "aav-pro",
["Tiếng Nam Đảo nguyên thủy"] = "map-pro",
["Tiếng Nam Động"] = "kmc",
["Tiếng Nam Ả Rập cổ"] = "sem-srb",
["Tiếng Nambikwara"] = "nab",
["Tiếng Nanai"] = "gld",
["Tiếng Nankina"] = "nnk",
["Tiếng Napoli"] = "nap",
["Tiếng Naskapi"] = "nsk",
["Tiếng Nateni"] = "ntm",
["Tiếng Naukan"] = "ynk",
["Tiếng Nauru"] = "na",
["Tiếng Navajo"] = "nv",
["Tiếng Ndau"] = "ndc",
["Tiếng Ndogo"] = "ndz",
["Tiếng Ndonga"] = "ng",
["Tiếng Nefusa"] = "jbn",
["Tiếng Negerhollands"] = "dcr",
["Tiếng Negidal"] = "neg",
["Tiếng Nenets lãnh nguyên"] = "yrk-tun",
["Tiếng Nepal"] = "ne",
["Tiếng Newa"] = "new",
["Tiếng Nga"] = "ru",
["Tiếng Nga bồi Taimyr"] = "crp-tpr",
["Tiếng Ngadha"] = "nxg",
["Tiếng Ngalum"] = "szb",
["Tiếng Ngam"] = "nmc",
["Tiếng Ngambay"] = "sba",
["Tiếng Nganasan"] = "nio",
["Tiếng Ngas"] = "anc",
["Tiếng Ngiemboon"] = "nnh",
["Tiếng Ngiyambaa"] = "wyb",
["Tiếng Ngomba"] = "jgo",
["Tiếng Ngombe (Congo)"] = "ngc",
["Tiếng Nguni nguyên thủy"] = "bnt-ngu-pro",
["Tiếng Nguồn"] = "nuo",
["Tiếng Ngô"] = "wuu",
["Tiếng Ngũ Đồn"] = "wuh",
["Tiếng Nha Lang"] = "yrn",
["Tiếng Nheengatu"] = "yrl",
["Tiếng Nhu Nhiên"] = "qfa-xgx-rou",
["Tiếng Nhĩ Tô"] = "ers",
["Tiếng Nhật"] = "ja",
["Tiếng Nhật Bản nguyên thủy"] = "jpx-pro",
["Tiếng Nhật cổ"] = "ojp",
["Tiếng Nias"] = "nia",
["Tiếng Nicobar Car"] = "caq",
["Tiếng Nicobar Nam"] = "nik",
["Tiếng Nicobar Trung"] = "ncb",
["Tiếng Nicobar nguyên thủy"] = "aav-nic-pro",
["Tiếng Niger-Congo nguyên thủy"] = "nic-pro",
["Tiếng Nin-Sahara nguyên thủy"] = "ssa-pro",
["Tiếng Nisga'a"] = "ncg",
["Tiếng Niue"] = "niu",
["Tiếng Nivaclé"] = "cag",
["Tiếng Nivkh"] = "niv",
["Tiếng Nkari"] = "nkz",
["Tiếng Nkonya"] = "nko",
["Tiếng Nobiin"] = "fia",
["Tiếng Nobonob"] = "gaw",
["Tiếng Nogai"] = "nog",
["Tiếng Noon"] = "snf",
["Tiếng Noreia"] = "nrc",
["Tiếng Norman"] = "nrf",
["Tiếng Novgorod cổ"] = "zle-ono",
["Tiếng Novial"] = "nov",
["Tiếng Ntcham"] = "bud",
["Tiếng Nubaca"] = "baf",
["Tiếng Nubi"] = "kcn",
["Tiếng Nubia cổ"] = "onw",
["Tiếng Nuer"] = "nus",
["Tiếng Numidia"] = "nxm",
["Tiếng Nupe"] = "nup",
["Tiếng Nuristan nguyên thủy"] = "iir-nur-pro",
["Tiếng Nuu-chah-nulth"] = "nuk",
["Tiếng Nyah Kur"] = "cbn",
["Tiếng Nyaw"] = "nyw",
["Tiếng Nyeu"] = "nyl",
["Tiếng Nyishi"] = "njz",
["Tiếng Nyoro"] = "nyo",
["Tiếng Nyunga"] = "nys",
["Tiếng Nzadi"] = "nzd",
["Tiếng Nùng"] = "nut",
["Tiếng Nùng Vẻn"] = "enc",
["Tiếng Nǀuu"] = "ngh",
["Tiếng Nạp Tây"] = "nxq",
["Tiếng Nữ Chân"] = "juc",
["Tiếng O'odham"] = "ood",
["Tiếng Ocaina"] = "oca",
["Tiếng Occitan"] = "oc",
["Tiếng Occitan cổ"] = "pro",
["Tiếng Ogbronuagum"] = "ogu",
["Tiếng Oghuz cổ sơ kỳ"] = "trk-eog",
["Tiếng Oirat"] = "xwo",
["Tiếng Ojibwe"] = "oj",
["Tiếng Ojibwe Severn"] = "ojs",
["Tiếng Ojibwe Tây"] = "ojw",
["Tiếng Ojibwe Tây Bắc"] = "ojb",
["Tiếng Ojibwe Đông"] = "ojg",
["Tiếng Okanagan"] = "oka",
["Tiếng Okinawa"] = "ryu",
["Tiếng Okinoerabu"] = "okn",
["Tiếng Olukumi"] = "ulb",
["Tiếng Omaha-Ponca"] = "oma",
["Tiếng Omo nguyên thủy"] = "omv-pro",
["Tiếng Omok"] = "omk",
["Tiếng Oneida"] = "one",
["Tiếng Ongota"] = "bxe",
["Tiếng Oriya"] = "or",
["Tiếng Oriya Adiwasi"] = "ort",
["Tiếng Oriya cổ"] = "inc-oor",
["Tiếng Oriya trung đại"] = "inc-mor",
["Tiếng Orma"] = "orc",
["Tiếng Ormu"] = "orz",
["Tiếng Ormur"] = "oru",
["Tiếng Oroch"] = "oac",
["Tiếng Orok"] = "oaa",
["Tiếng Oromo"] = "om",
["Tiếng Oromo Nam"] = "gax",
["Tiếng Oromo Đông"] = "hae",
["Tiếng Oroqen"] = "orh",
["Tiếng Osage"] = "osa",
["Tiếng Osatu"] = "ost",
["Tiếng Osci"] = "osc",
["Tiếng Osing"] = "osi",
["Tiếng Ossetia"] = "os",
["Tiếng Ossetia cổ"] = "oos",
["Tiếng Otomi Mezquital"] = "ote",
["Tiếng Otoro"] = "otr",
["Tiếng Otuke"] = "otu",
["Tiếng Oyda"] = "oyd",
["Tiếng Pa Kô"] = "pac",
["Tiếng Pa'O"] = "blk",
["Tiếng Paeligni"] = "pgn",
["Tiếng Pagu"] = "pgu",
["Tiếng Pahari Mahasu"] = "bfz",
["Tiếng Paharia Kumarbhag"] = "kmj",
["Tiếng Paharia Sauria"] = "mjt",
["Tiếng Paite"] = "pck",
["Tiếng Paiwan"] = "pwn",
["Tiếng Pakan nguyên thủy"] = "mkh-pkn-pro",
["Tiếng Paku"] = "pku",
["Tiếng Pala"] = "plq",
["Tiếng Palau"] = "pau",
["Tiếng Palaung Ruching"] = "pce",
["Tiếng Palaung Rumai"] = "rbb",
["Tiếng Palaung Shwe"] = "pll",
["Tiếng Palaung nguyên thủy"] = "mkh-pal-pro",
["Tiếng Palawano Brooke's Point"] = "plw",
["Tiếng Palenquero"] = "pln",
["Tiếng Pali"] = "pi",
["Tiếng Paliyan"] = "pcf",
["Tiếng Palor"] = "fap",
["Tiếng Pama-Nyungar nguyên thủy"] = "aus-pam-pro",
["Tiếng Pancana"] = "pnp",
["Tiếng Panchpargania"] = "tdb",
["Tiếng Pangasinan"] = "pag",
["Tiếng Pangwala"] = "pgg",
["Tiếng Paniya"] = "pcg",
["Tiếng Papiamento"] = "pap",
["Tiếng Papuma"] = "ppm",
["Tiếng Parachi"] = "prc",
["Tiếng Paraujano"] = "pbg",
["Tiếng Parauk"] = "prk",
["Tiếng Pareci"] = "pab",
["Tiếng Parenga"] = "pcj",
["Tiếng Parthia"] = "xpr",
["Tiếng Parya"] = "paq",
["Tiếng Pashtun"] = "ps",
["Tiếng Pathan nguyên thủy"] = "ira-pat-pro",
["Tiếng Pauna"] = "pnk",
["Tiếng Pawnee"] = "paw",
["Tiếng Pazeh"] = "pzh",
["Tiếng Pear"] = "pcb",
["Tiếng Pear nguyên thủy"] = "mkh-pea-pro",
["Tiếng Pecheneg"] = "xpc",
["Tiếng Pela"] = "bxd",
["Tiếng Pemon"] = "aoc",
["Tiếng Pengo"] = "peg",
["Tiếng Perm nguyên thủy"] = "urj-prm-pro",
["Tiếng Petjo"] = "pey",
["Tiếng Phai"] = "prt",
["Tiếng Phake"] = "phk",
["Tiếng Phalura"] = "phl",
["Tiếng Phi-Á nguyên thủy"] = "afa-pro",
["Tiếng Philippines nguyên thủy"] = "phi-pro",
["Tiếng Phoenicia"] = "phn",
["Tiếng Phong-Kniang"] = "pnx",
["Tiếng Phrygia"] = "xpg",
["Tiếng Phu Thái"] = "pht",
["Tiếng Phuan"] = "phu",
["Tiếng Pháp"] = "fr",
["Tiếng Pháp cổ"] = "fro",
["Tiếng Pháp trung đại"] = "frm",
["Tiếng Phạn"] = "sa",
["Tiếng Phần Lan"] = "fi",
["Tiếng Phổ Hiền"] = "cpx",
["Tiếng Phổ cổ"] = "prg",
["Tiếng Picard"] = "pcd",
["Tiếng Piceni Bắc"] = "nrp",
["Tiếng Piceni Nam"] = "spx",
["Tiếng Piemonte"] = "pms",
["Tiếng Pilagá"] = "plg",
["Tiếng Pinyin"] = "pny",
["Tiếng Pipil"] = "ppl",
["Tiếng Pitjantjatjara"] = "pjt",
["Tiếng Plateau nguyên thủy"] = "nic-plt-pro",
["Tiếng Pnar"] = "pbv",
["Tiếng Pnar-Khasi-Lyngngam nguyên thủy"] = "aav-pkl-pro",
["Tiếng Pohnpei"] = "pon",
["Tiếng Polabia"] = "pox",
["Tiếng Polci"] = "plj",
["Tiếng Ponosakan"] = "pns",
["Tiếng Popoluca cao nguyên"] = "poi",
["Tiếng Potawatomi"] = "pot",
["Tiếng Pothohar"] = "phr",
["Tiếng Prakrit"] = "pra",
["Tiếng Prakrit Ashoka"] = "inc-ash",
["Tiếng Prakrit Niya"] = "pra-niy",
["Tiếng Prakrit Paisaci"] = "inc-psc",
["Tiếng Prakrit Saurasen"] = "psu",
["Tiếng Prasun"] = "prn",
["Tiếng Pucikwar"] = "apq",
["Tiếng Puinave"] = "pui",
["Tiếng Pumpokol"] = "xpm",
["Tiếng Punic"] = "xpu",
["Tiếng Punjab"] = "pa",
["Tiếng Puroik"] = "suv",
["Tiếng Puyuma"] = "pyu",
["Tiếng Pwo Bắc"] = "pww",
["Tiếng Pwo Phrae"] = "kjt",
["Tiếng Pwo Tây"] = "pwo",
["Tiếng Pwo Đông"] = "kjp",
["Tiếng Pà Thẻn"] = "pha",
["Tiếng Pọng"] = "hnu",
["Tiếng Qashqai"] = "qxq",
["Tiếng Qimant"] = "ahg",
["Tiếng Quan Thoại"] = "cmn",
["Tiếng Quapaw"] = "qua",
["Tiếng Quechua"] = "qu",
["Tiếng Quenya"] = "qya",
["Tiếng Quichuañol"] = "mue",
["Tiếng Quinault"] = "qun",
["Tiếng Quiripi"] = "qyp",
["Tiếng Quảng Lâm"] = "aav-qal",
["Tiếng Quảng Đông"] = "yue",
["Tiếng Quốc tế ngữ"] = "eo",
["Tiếng Ra Glai Bắc"] = "rog",
["Tiếng Ra Glai Cát Gia"] = "roc",
["Tiếng Ra Glai Nam"] = "rgs",
["Tiếng Rabha"] = "rah",
["Tiếng Raetia"] = "xrr",
["Tiếng Rajasthan"] = "raj",
["Tiếng Rajbanshi"] = "rjs",
["Tiếng Rakhine"] = "rki",
["Tiếng Rama"] = "rma",
["Tiếng Rangpur"] = "rkt",
["Tiếng Rapa Nui"] = "rap",
["Tiếng Rarotonga"] = "rar",
["Tiếng Rasawa"] = "rac",
["Tiếng Ratagnon"] = "btn",
["Tiếng Raute"] = "rau",
["Tiếng Ravula"] = "yea",
["Tiếng Rawang"] = "raw",
["Tiếng Rejang"] = "rej",
["Tiếng Reli"] = "rei",
["Tiếng Rendille"] = "rel",
["Tiếng Riang Lai"] = "yin",
["Tiếng Rohingya"] = "rhg",
["Tiếng Romagnol"] = "rgn",
["Tiếng Romansh"] = "rm",
["Tiếng Rotuma"] = "rtm",
["Tiếng Rukai"] = "dru",
["Tiếng Rukai nguyên thủy"] = "dru-pro",
["Tiếng Rumani"] = "ro",
["Tiếng Rungus"] = "drg",
["Tiếng Rusnak"] = "rsk",
["Tiếng Rusyn"] = "rue",
["Tiếng Ruthenia cổ"] = "zle-ort",
["Tiếng Rutul"] = "rut",
["Tiếng Rơ Măm"] = "rmx",
["Tiếng Rơ Ngao"] = "ren",
["Tiếng Saanich"] = "str",
["Tiếng Saaroa"] = "sxr",
["Tiếng Saba"] = "saa",
["Tiếng Sabüm"] = "sbo",
["Tiếng Sadri"] = "sck",
["Tiếng Saek"] = "skb",
["Tiếng Saho"] = "ssy",
["Tiếng Saisiyat"] = "xsy",
["Tiếng Saka-Wakhi nguyên thủy"] = "xsc-skw-pro",
["Tiếng Sakizaya"] = "szy",
["Tiếng Salar"] = "slr",
["Tiếng Salish nguyên thủy"] = "sal-pro",
["Tiếng Sama Trung"] = "sml",
["Tiếng Sambal Botolan"] = "sbl",
["Tiếng Sambali"] = "xsb",
["Tiếng Sambalpur"] = "spv",
["Tiếng Sami Akkala"] = "sia",
["Tiếng Sami Inari"] = "smn",
["Tiếng Sami Kildin"] = "sjd",
["Tiếng Sami Skolt"] = "sms",
["Tiếng Sami Ter"] = "sjt",
["Tiếng Sami Ume"] = "sju",
["Tiếng Sami nguyên thủy"] = "smi-pro",
["Tiếng Samo"] = "smq",
["Tiếng Samo Nam"] = "sbd",
["Tiếng Samoa"] = "sm",
["Tiếng Samogitia"] = "sgs",
["Tiếng Samoyed nguyên thủy"] = "syd-pro",
["Tiếng Samtao"] = "stu",
["Tiếng Sangir"] = "sxn",
["Tiếng Sangisar"] = "sgr",
["Tiếng Sango"] = "sg",
["Tiếng Santal"] = "sat",
["Tiếng Saposa"] = "sps",
["Tiếng Saraiki"] = "skr",
["Tiếng Saramacca"] = "srm",
["Tiếng Sardegna"] = "sc",
["Tiếng Sarikol"] = "srh",
["Tiếng Sarmatia nguyên thủy"] = "xsc-sar-pro",
["Tiếng Sasak"] = "sas",
["Tiếng Saurashtra"] = "saz",
["Tiếng Savi"] = "sdg",
["Tiếng Saxon Transylvania"] = "gmw-tsx",
["Tiếng Saxon cổ"] = "osx",
["Tiếng Scots"] = "sco",
["Tiếng Scots trung đại"] = "gmw-msc",
["Tiếng Scythia nguyên thủy"] = "xsc-pro",
["Tiếng Sebat Bet Gurage"] = "sgw",
["Tiếng Sechelt"] = "sec",
["Tiếng Selkup"] = "sel",
["Tiếng Selkup nguyên thủy"] = "sel-pro",
["Tiếng Semai"] = "sea",
["Tiếng Semaq Beri"] = "szc",
["Tiếng Semelai"] = "sza",
["Tiếng Semit Tây nguyên thủy"] = "sem-wes-pro",
["Tiếng Semit nguyên thủy"] = "sem-pro",
["Tiếng Semnam"] = "ssm",
["Tiếng Sena"] = "seh",
["Tiếng Seneca"] = "see",
["Tiếng Senhaja de Srair"] = "sjs",
["Tiếng Senni Humburi"] = "hmb",
["Tiếng Senni Koyraboro"] = "ses",
["Tiếng Senoufo Nyarafolo"] = "sev",
["Tiếng Serbia-Croatia"] = "sh",
["Tiếng Serer"] = "srr",
["Tiếng Seri"] = "sei",
["Tiếng Seze"] = "sze",
["Tiếng Shabak"] = "sdb",
["Tiếng Shabo"] = "sbf",
["Tiếng Shan"] = "shn",
["Tiếng Shebayo"] = "awd-she",
["Tiếng Shekkacho"] = "moy",
["Tiếng Sherpa"] = "xsr",
["Tiếng Shina"] = "scl",
["Tiếng Shina Kohistan"] = "plk",
["Tiếng Shinasha"] = "bwo",
["Tiếng Sholaga"] = "sle",
["Tiếng Shompen"] = "sii",
["Tiếng Shona"] = "sn",
["Tiếng Shor"] = "cjs",
["Tiếng Shughnan"] = "sgh",
["Tiếng Shughnan-Rushan nguyên thủy"] = "ira-shr-pro",
["Tiếng Shughnan-Yazghulom nguyên thủy"] = "ira-shy-pro",
["Tiếng Shughnan-Yazghulom-Munji nguyên thủy"] = "ira-sym-pro",
["Tiếng Shuswap"] = "shs",
["Tiếng Sicel"] = "scx",
["Tiếng Sicily"] = "scn",
["Tiếng Sidamo"] = "sid",
["Tiếng Sikkim"] = "sip",
["Tiếng Silesia"] = "szl",
["Tiếng Siltʼe"] = "stv",
["Tiếng Sinaugoro"] = "snc",
["Tiếng Sindh"] = "sd",
["Tiếng Sinhala"] = "si",
["Tiếng Sioux nguyên thủy"] = "sio-pro",
["Tiếng Siraya"] = "fos",
["Tiếng Sirenik"] = "ysr",
["Tiếng Sirmaur"] = "srx",
["Tiếng Sissala"] = "sld",
["Tiếng Sissano"] = "sso",
["Tiếng Siwi"] = "siz",
["Tiếng Siwu"] = "akp",
["Tiếng Skepi"] = "skw",
["Tiếng Slav Giáo hội"] = "zls-chs",
["Tiếng Slav Giáo hội cổ"] = "cu",
["Tiếng Slav nguyên thủy"] = "sla-pro",
["Tiếng Slav Đông cổ"] = "orv",
["Tiếng Slovak"] = "sk",
["Tiếng Slovak cổ"] = "zlw-osk",
["Tiếng Slovene"] = "sl",
["Tiếng Slovincia"] = "zlw-slv",
["Tiếng Socotra"] = "sqt",
["Tiếng Sogdia"] = "sog",
["Tiếng Sogdia nguyên thủy"] = "ira-sgc-pro",
["Tiếng Sokna"] = "swn",
["Tiếng Solon"] = "tuw-sol",
["Tiếng Solong"] = "aaw",
["Tiếng Somali"] = "so",
["Tiếng Somali nguyên thủy"] = "cus-som-pro",
["Tiếng Soninke"] = "snk",
["Tiếng Sonsorol"] = "sov",
["Tiếng Sora"] = "srb",
["Tiếng Soran"] = "ckb",
["Tiếng Sotho"] = "st",
["Tiếng Sotho Bắc"] = "nso",
["Tiếng Soyot"] = "trk-soy",
["Tiếng Squamish"] = "squ",
["Tiếng Sranan Tongo"] = "srn",
["Tiếng Stau"] = "ero-tau",
["Tiếng Sumer"] = "sux",
["Tiếng Sunda"] = "su",
["Tiếng Sunda cổ"] = "osn",
["Tiếng Suri"] = "suq",
["Tiếng Surjapur"] = "sjp",
["Tiếng Susu"] = "sus",
["Tiếng Svan"] = "sva",
["Tiếng Swahili"] = "sw",
["Tiếng Swazi"] = "ss",
["Tiếng Sylhet"] = "syl",
["Tiếng Syriac cổ điển"] = "syc",
["Tiếng Sán Chay"] = "mlc",
["Tiếng Séc"] = "cs",
["Tiếng Séc cổ"] = "zlw-ocs",
["Tiếng Sô"] = "sss",
["Tiếng Taabwa"] = "tap",
["Tiếng Tabasaran"] = "tab",
["Tiếng Tachawit"] = "shy",
["Tiếng Tadyawan"] = "tdy",
["Tiếng Tafi"] = "tcd",
["Tiếng Tagal Murut"] = "mvv",
["Tiếng Tagalog"] = "tl",
["Tiếng Tagbanwa Calamian"] = "tbk",
["Tiếng Tagdal"] = "tda",
["Tiếng Tagoi"] = "tag",
["Tiếng Tahiti"] = "ty",
["Tiếng Tahltan"] = "tht",
["Tiếng Tai Loi"] = "tlq",
["Tiếng Tai Tây Nam nguyên thủy"] = "tai-swe-pro",
["Tiếng Taivoan"] = "tvx",
["Tiếng Tajik"] = "tg",
["Tiếng Tal"] = "tal",
["Tiếng Tala"] = "tak",
["Tiếng Talossa"] = "tzl",
["Tiếng Talysh"] = "tly",
["Tiếng Tamang Gorkha Đông"] = "tge",
["Tiếng Tamang Tây"] = "tdg",
["Tiếng Tamang Đông"] = "taj",
["Tiếng Tamazight Maroc chuẩn"] = "zgh",
["Tiếng Tamazight Trung Atlas"] = "tzm",
["Tiếng Tamil"] = "ta",
["Tiếng Tamil cổ"] = "oty",
["Tiếng Tamki"] = "tax",
["Tiếng Tammari"] = "tbz",
["Tiếng Tampuan"] = "tpu",
["Tiếng Tanchangya"] = "tnv",
["Tiếng Tangkhul Naga"] = "nmf",
["Tiếng Tangoa"] = "tgp",
["Tiếng Tangut"] = "txg",
["Tiếng Tanimbili"] = "tbe",
["Tiếng Taos"] = "twf",
["Tiếng Tapirapé"] = "taf",
["Tiếng Tara Baka"] = "bdh",
["Tiếng Tarantino"] = "roa-tar",
["Tiếng Tariana"] = "tae",
["Tiếng Tarifit"] = "rif",
["Tiếng Tasawaq"] = "twq",
["Tiếng Tashelhit"] = "shi",
["Tiếng Tat"] = "ttt",
["Tiếng Tat-Do Thái"] = "jdt",
["Tiếng Tatar"] = "tt",
["Tiếng Tiên Ti"] = "mis-xbi",
["Tiếng Tatar Crưm"] = "crh",
["Tiếng Tatar Siberia"] = "sty",
["Tiếng Tatuyo"] = "tav",
["Tiếng Taungyo"] = "tco",
["Tiếng Tause"] = "tad",
["Tiếng Tausug"] = "tsg",
["Tiếng Tavoy"] = "tvn",
["Tiếng Tay Dọ"] = "tyj",
["Tiếng Tayma"] = "sem-tay",
["Tiếng Taz"] = "zhx-taz",
["Tiếng Taznatit"] = "grr",
["Tiếng Taíno"] = "tnq",
["Tiếng Tchad nguyên thủy"] = "cdc-pro",
["Tiếng Telugu"] = "te",
["Tiếng Telugu cổ"] = "dra-ote",
["Tiếng Tem"] = "kdh",
["Tiếng Temiar"] = "tea",
["Tiếng Temoq"] = "tmo",
["Tiếng Ten'edn"] = "tnz",
["Tiếng Tengger"] = "tes",
["Tiếng Tenharim"] = "pah",
["Tiếng Tepehua Tlachichilco"] = "tpt",
["Tiếng Tepehuan Bắc"] = "ntp",
["Tiếng Tepehuan Đông Nam"] = "stp",
["Tiếng Teressa"] = "tef",
["Tiếng Teribe"] = "tfr",
["Tiếng Ternate"] = "tft",
["Tiếng Tetserret"] = "tez",
["Tiếng Tetum"] = "tet",
["Tiếng Thachanad"] = "thn",
["Tiếng Thavưng"] = "thm",
["Tiếng Thompson"] = "thp",
["Tiếng Thracia"] = "txh",
["Tiếng Thác Bạt"] = "qfa-xgx-tuo",
["Tiếng Thái"] = "th",
["Tiếng Thái Hàng Tổng"] = "tpo",
["Tiếng Thái Lai"] = "tjl",
["Tiếng Thái Na"] = "tdd",
["Tiếng Thái Trắng"] = "twh",
["Tiếng Thái Tống"] = "soa",
["Tiếng Thái nguyên thủy"] = "tai-pro",
["Tiếng Thái Đen"] = "blt",
["Tiếng Thái Đỏ"] = "tyr",
["Tiếng Thát Mai"] = "smh",
["Tiếng Thượng Kinabatangan"] = "dmg",
["Tiếng Thượng Sorb"] = "hsb",
["Tiếng Thổ"] = "tou",
["Tiếng Thổ Dục Hồn"] = "qfa-xgx-tuh",
["Tiếng Thổ Gia Bắc"] = "tji",
["Tiếng Thổ Gia Nam"] = "tjs",
["Tiếng Thổ Nhĩ Kỳ"] = "tr",
["Tiếng Thổ Nhĩ Kỳ Anatolia cổ"] = "trk-oat",
["Tiếng Thổ Nhĩ Kỳ Gagauz Balkan"] = "bgx",
["Tiếng Thổ Nhĩ Kỳ Ottoman"] = "ota",
["Tiếng Thụy Điển"] = "sv",
["Tiếng Thụy Điển cổ"] = "gmq-osw",
["Tiếng Thủy"] = "swi",
["Tiếng Tiang"] = "tbj",
["Tiếng Tigre"] = "tig",
["Tiếng Tigrinya"] = "ti",
["Tiếng Tindi"] = "tin",
["Tiếng Tipai"] = "nai-tip",
["Tiếng Tippera"] = "tpe",
["Tiếng Tiruray"] = "tiy",
["Tiếng Tiwa"] = "lax",
["Tiếng Tiwi"] = "tiw",
["Tiếng Tiên Ti"] = "qfa-xgx-xbi",
["Tiếng Tlapanec Malinaltepec"] = "tcf",
["Tiếng Tlingit"] = "tli",
["Tiếng Tobi"] = "tox",
["Tiếng Tochari A"] = "xto",
["Tiếng Tochari B"] = "txb",
["Tiếng Tochari nguyên thủy"] = "ine-toc-pro",
["Tiếng Tocho"] = "taz",
["Tiếng Toda"] = "tcx",
["Tiếng Tofa"] = "kim",
["Tiếng Tok Pisin"] = "tpi",
["Tiếng Tokelau"] = "tkl",
["Tiếng Toki Pona"] = "tok",
["Tiếng Tokunoshima"] = "tkn",
["Tiếng Toma"] = "tod",
["Tiếng Tonga"] = "to",
["Tiếng Tonkawa"] = "tqw",
["Tiếng Tooro"] = "ttj",
["Tiếng Torwali"] = "trw",
["Tiếng Toto"] = "txo",
["Tiếng Totonac Papantla"] = "top",
["Tiếng Totonac cao nguyên"] = "tos",
["Tiếng Triqui Chicahuaxtla"] = "trs",
["Tiếng Triqui Copala"] = "trc",
["Tiếng Triqui San Martín Itunyoso"] = "trq",
["Tiếng Triqui nguyên thủy"] = "omq-tri-pro",
["Tiếng Trió"] = "tri",
["Tiếng Triều Châu"] = "nan-tws",
["Tiếng Triều Tiên"] = "ko",
["Tiếng Triều Tiên cổ"] = "oko",
["Tiếng Triều Tiên nguyên thủy"] = "qfa-kor-pro",
["Tiếng Triều Tiên trung đại"] = "okm",
["Tiếng Truku"] = "trv",
["Tiếng Trung Bikol"] = "bcl",
["Tiếng Trung Dusun"] = "dtp",
["Tiếng Trung Mansi"] = "mns-cen",
["Tiếng Trung Nahuatl"] = "nhn",
["Tiếng Trung Nahuatl Huasteca"] = "nch",
["Tiếng Trung Nahuatl Puebla"] = "ncx",
["Tiếng Trung Quốc"] = "zh",
["Tiếng Trà Động"] = "cdy",
["Tiếng Trác Ni"] = "cda",
["Tiếng Tráng"] = "za",
["Tiếng Tráng Nông"] = "zhn",
["Tiếng Tráng Tả Giang"] = "zzj",
["Tiếng Tráng Đức Tĩnh"] = "zyg",
["Tiếng Trát Bá"] = "zhb",
["Tiếng Tsakhur"] = "tkr",
["Tiếng Tsakonia"] = "tsd",
["Tiếng Tsamai"] = "tsb",
["Tiếng Tsat"] = "huq",
["Tiếng Tsez"] = "ddo",
["Tiếng Tshangla"] = "tsj",
["Tiếng Tsimshian"] = "tsi",
["Tiếng Tsonga"] = "ts",
["Tiếng Tsou"] = "tsu",
["Tiếng Tsuut'ina"] = "srs",
["Tiếng Tswana"] = "tn",
["Tiếng Tuamotu"] = "pmt",
["Tiếng Tuareg"] = "tmh",
["Tiếng Tukang Besi Bắc"] = "khc",
["Tiếng Tukang Besi Nam"] = "bhq",
["Tiếng Tuki"] = "bag",
["Tiếng Tulu"] = "tcy",
["Tiếng Tumbuka"] = "tum",
["Tiếng Tungus nguyên thủy"] = "tuw-pro",
["Tiếng Tunica"] = "tun",
["Tiếng Tunni"] = "tqq",
["Tiếng Tupi"] = "tpn",
["Tiếng Tupi cổ"] = "tpw",
["Tiếng Tupi nguyên thủy"] = "tup-pro",
["Tiếng Tupi-Guarani nguyên thủy"] = "tup-gua-pro",
["Tiếng Turk Khorasan"] = "kmz",
["Tiếng Turk Khorezm"] = "zkh",
["Tiếng Turk cổ"] = "otk",
["Tiếng Turk nguyên thủy"] = "trk-pro",
["Tiếng Turkmen"] = "tk",
["Tiếng Turoyo"] = "tru",
["Tiếng Tuva"] = "tyv",
["Tiếng Tuvalu"] = "tvl",
["Tiếng Tuwuli"] = "bov",
["Tiếng Tyap"] = "kcg",
["Tiếng Tzotzil"] = "tzo",
["Tiếng Tà Mun"] = "aav-tam",
["Tiếng Tà Ôi Thượng"] = "tth",
["Tiếng Tày"] = "tyz",
["Tiếng Tày Sa Pa"] = "tys",
["Tiếng Tân Aram Assyria"] = "aii",
["Tiếng Tân Aram Bohtan"] = "bhn",
["Tiếng Tân Aram Chaldea"] = "cld",
["Tiếng Tân Aram Do Thái Barzani"] = "bjf",
["Tiếng Tân Aram Tây"] = "amw",
["Tiếng Tây Abenaki"] = "abe",
["Tiếng Tây Ban Nha"] = "es",
["Tiếng Tây Ban Nha cổ"] = "osp",
["Tiếng Tây Bắc Gbaya"] = "gya",
["Tiếng Tây Bắc Kavkaz nguyên thủy"] = "cau-nwc-pro",
["Tiếng Tây Bồi"] = "tas",
["Tiếng Tây Duyên hải Bajau"] = "bdr",
["Tiếng Tây Frisia"] = "fy",
["Tiếng Tây Huasteca Nahuatl"] = "nhw",
["Tiếng Tây Kayah"] = "kyu",
["Tiếng Tây Makian"] = "mqs",
["Tiếng Tây Tạng"] = "bo",
["Tiếng Tây Tạng Kham"] = "khg",
["Tiếng Tây Tạng cổ điển"] = "xct",
["Tiếng Tây Yugur"] = "ybe",
["Tiếng Tích Bá"] = "sjo",
["Tiếng Tơ Đrá"] = "tdr",
["Tiếng Tương"] = "hsn",
["Tiếng Tấn"] = "cjy",
["Tiếng Tứ Thổ"] = "sit-sit",
["Tiếng Tứ Xuyên"] = "zhx-sic",
["Tiếng U"] = "uuu",
["Tiếng Ubangi nguyên thủy"] = "nic-ubg-pro",
["Tiếng Ubykh"] = "uby",
["Tiếng Udi"] = "udi",
["Tiếng Udihe"] = "ude",
["Tiếng Udmurt"] = "udm",
["Tiếng Uduk"] = "udu",
["Tiếng Ugarit"] = "uga",
["Tiếng Ugong"] = "ugo",
["Tiếng Ugria nguyên thủy"] = "urj-ugr-pro",
["Tiếng Ukraina"] = "uk",
["Tiếng Ulch"] = "ulc",
["Tiếng Ullatan"] = "ull",
["Tiếng Umbria"] = "xum",
["Tiếng Umbundu"] = "umb",
["Tiếng Unami"] = "unm",
["Tiếng Uneapa"] = "bbn",
["Tiếng Urak Lawoi'"] = "urk",
["Tiếng Ural nguyên thủy"] = "urj-pro",
["Tiếng Urali"] = "url",
["Tiếng Urartu"] = "xur",
["Tiếng Urdu"] = "ur",
["Tiếng Uripiv-Wala-Rano-Atchin"] = "upv",
["Tiếng Urubú-Kaapor"] = "urb",
["Tiếng Urum"] = "uum",
["Tiếng Ushojo"] = "ush",
["Tiếng Usui"] = "usi",
["Tiếng Ute-Aztec nguyên thủy"] = "azc-pro",
["Tiếng Uvbie"] = "evh",
["Tiếng Uzbek"] = "uz",
["Tiếng Vaagri Booli"] = "vaa",
["Tiếng Vaghri"] = "vgr",
["Tiếng Varli"] = "vav",
["Tiếng Vasavi"] = "vas",
["Tiếng Venda"] = "ve",
["Tiếng Veneti"] = "xve",
["Tiếng Veneto"] = "vec",
["Tiếng Veps"] = "vep",
["Tiếng Vishava"] = "vis",
["Tiếng Việt"] = "vi",
["Tiếng Việt trung cổ"] = "mkh-mvi",
["Tiếng Việt-Mường nguyên thủy"] = "mkh-vie-pro",
["Tiếng Volapük"] = "vo",
["Tiếng Volsci"] = "xvo",
["Tiếng Volta-Congo nguyên thủy"] = "nic-vco-pro",
["Tiếng Volta-Niger nguyên thủy"] = "alv-von-pro",
["Tiếng Vot"] = "vot",
["Tiếng Vurës"] = "msn",
["Tiếng Võro"] = "vro",
["Tiếng Văn ngôn"] = "lzh",
["Tiếng Waama"] = "wwa",
["Tiếng Waata"] = "ssn",
["Tiếng Wagi"] = "fad",
["Tiếng Wahgi"] = "wgi",
["Tiếng Waimaha"] = "bao",
["Tiếng Waiwai"] = "waw",
["Tiếng Wakhi"] = "wbl",
["Tiếng Wales"] = "cy",
["Tiếng Wales trung đại"] = "wlm",
["Tiếng Wallis"] = "wls",
["Tiếng Wallon"] = "wa",
["Tiếng Wambule"] = "wme",
["Tiếng Wancho"] = "nnp",
["Tiếng Waneci"] = "wne",
["Tiếng War-Jaintia"] = "aml",
["Tiếng Waray"] = "war",
["Tiếng Wardaman"] = "wrr",
["Tiếng Warekena"] = "gae",
["Tiếng Warji"] = "wji",
["Tiếng Wastek"] = "hus",
["Tiếng Wawonii"] = "wow",
["Tiếng Wayampi"] = "oym",
["Tiếng Wayana"] = "way",
["Tiếng Wayuu"] = "guc",
["Tiếng Wemba-Wemba"] = "xww",
["Tiếng Wewaw"] = "wea",
["Tiếng Wiradjuri"] = "wrh",
["Tiếng Wiyot"] = "wiy",
["Tiếng Wobé"] = "wob",
["Tiếng Woiwurrung"] = "wyi",
["Tiếng Wolane"] = "wle",
["Tiếng Wolaytta"] = "wal",
["Tiếng Wolio"] = "wlo",
["Tiếng Wolof"] = "wo",
["Tiếng Wotu"] = "wtw",
["Tiếng Wymysorys"] = "wym",
["Tiếng Xamtanga"] = "xan",
["Tiếng Xavante"] = "xav",
["Tiếng Xhosa"] = "xh",
["Tiếng Xinh Mun"] = "puo",
["Tiếng Xtiêng"] = "sti",
["Tiếng Xtiêng Bù Đeh"] = "stt",
["Tiếng Xârâcùù"] = "ane",
["Tiếng Xơ Đăng"] = "sed",
["Tiếng Yaaku"] = "muu",
["Tiếng Yaeyama"] = "rys",
["Tiếng Yaghnob"] = "yai",
["Tiếng Yakan"] = "yka",
["Tiếng Yakima"] = "yak",
["Tiếng Yakkha"] = "ybh",
["Tiếng Yakut"] = "sah",
["Tiếng Yali Angguruk"] = "yli",
["Tiếng Yami"] = "tao",
["Tiếng Yamphu"] = "ybi",
["Tiếng Yanesha'"] = "ame",
["Tiếng Yanyuwa"] = "jao",
["Tiếng Yao (Nam Mĩ)"] = "sai-yao",
["Tiếng Yao (châu Phi)"] = "yao",
["Tiếng Yap"] = "yap",
["Tiếng Yapunda"] = "yev",
["Tiếng Yazghulom"] = "yah",
["Tiếng Ye'kwana"] = "mch",
["Tiếng Yele"] = "yle",
["Tiếng Yemsa"] = "jnj",
["Tiếng Yevan"] = "yej",
["Tiếng Yiddish"] = "yi",
["Tiếng Yidgha"] = "ydg",
["Tiếng Yidiny"] = "yii",
["Tiếng Yindjibarndi"] = "yij",
["Tiếng Yiwom"] = "gek",
["Tiếng Yogad"] = "yog",
["Tiếng Yola"] = "yol",
["Tiếng Yolmo"] = "scp",
["Tiếng Yom"] = "pil",
["Tiếng Yonaguni"] = "yoi",
["Tiếng Yong"] = "yno",
["Tiếng Yongkom"] = "yon",
["Tiếng Yoron"] = "yox",
["Tiếng Yoruba"] = "yo",
["Tiếng Yoruba nguyên thủy"] = "alv-yor-pro",
["Tiếng Yorubo nguyên thủy"] = "alv-yrd-pro",
["Tiếng Yoy"] = "yoy",
["Tiếng Yugh"] = "yug",
["Tiếng Yukaghir nguyên thủy"] = "qfa-yuk-pro",
["Tiếng Yup'ik"] = "esu",
["Tiếng Yupik Trung Siberia"] = "ess",
["Tiếng Yuri"] = "sai-yri",
["Tiếng Yurok"] = "yur",
["Tiếng Yámana"] = "yag",
["Tiếng Zacatepec Chatino"] = "ctz",
["Tiếng Zaghawa"] = "zag",
["Tiếng Zaiwa"] = "atb",
["Tiếng Zangskar"] = "zau",
["Tiếng Zapotec"] = "zap",
["Tiếng Zapotec Cajonos"] = "zad",
["Tiếng Zapotec Isthmus"] = "zai",
["Tiếng Zapotec Mitla"] = "zaw",
["Tiếng Zapotec Rincón"] = "zar",
["Tiếng Zapotec Rincón Nam"] = "zsr",
["Tiếng Zapotec San Juan Guelavía"] = "zab",
["Tiếng Zapotec Yatee"] = "zty",
["Tiếng Zapotec Yatzachi"] = "zav",
["Tiếng Zapotec Zaniza"] = "zpw",
["Tiếng Zapotec Zoogocho"] = "zpq",
["Tiếng Zapotec nguyên thủy"] = "omq-zpc-pro",
["Tiếng Zarma"] = "dje",
["Tiếng Zarphat"] = "zrp",
["Tiếng Zay"] = "zwa",
["Tiếng Zayse-Zergulla"] = "zay",
["Tiếng Zaza"] = "zza",
["Tiếng Zaza-Goran nguyên thủy"] = "ira-zgr-pro",
["Tiếng Zeeland"] = "zea",
["Tiếng Zenaga"] = "zen",
["Tiếng Zirenkel"] = "zrn",
["Tiếng Zoque Francisco León"] = "zos",
["Tiếng Zou"] = "zom",
["Tiếng Zulu"] = "zu",
["Tiếng Zumbun"] = "jmb",
["Tiếng Äynu"] = "aib",
["Tiếng Ê Đê"] = "rad",
["Tiếng Ông Bối nguyên thủy"] = "qfa-onb-pro",
["Tiếng Önge"] = "oon",
["Tiếng Önge nguyên thủy"] = "qfa-ong-pro",
["Tiếng Övdal"] = "ovd",
["Tiếng Ý"] = "it",
["Tiếng Ý-Do Thái"] = "itk",
["Tiếng Đa Đảo hạt nhân nguyên thủy"] = "poz-pnp-pro",
["Tiếng Đa Đảo nguyên thủy"] = "poz-pol-pro",
["Tiếng Đa Đảo Đông nguyên thủy"] = "poz-pep-pro",
["Tiếng Đan Mạch"] = "da",
["Tiếng Đan Mạch cổ"] = "gmq-oda",
["Tiếng Đài Sơn"] = "zhx-tai",
["Tiếng Đông Abenaki"] = "aaq",
["Tiếng Đông Acipa"] = "acp",
["Tiếng Đông Bontoc"] = "ebk",
["Tiếng Đông Bắc Kavkaz nguyên thủy"] = "cau-nec-pro",
["Tiếng Đông Can"] = "dng",
["Tiếng Đông Futuna"] = "fud",
["Tiếng Đông Hương"] = "sce",
["Tiếng Đông Kayah"] = "eky",
["Tiếng Đông Khanty"] = "kca-eas",
["Tiếng Đông Yugur"] = "yuy",
["Tiếng Đường Uông"] = "zhx-twa",
["Tiếng Đại Tây Dương–Congo nguyên thủy"] = "alv-pro",
["Tiếng Độc Long"] = "duu",
["Tiếng Động-Thủy nguyên thủy"] = "qfa-kms-pro",
["Tiếng Đức"] = "de",
["Tiếng Đức Alemanni"] = "gsw",
["Tiếng Đức Pennsylvania"] = "pdc",
["Tiếng Đức cao địa cổ"] = "goh",
["Tiếng Đức cao địa trung đại"] = "gmh",
["Tiếng Đức Đông Trung"] = "gmw-ecg",
["Tiếng Ơ Đu"] = "tyh",
["Tiếng Ưu Miền"] = "ium",
["Tiếng ǃXóõ"] = "nmn",
["Tiếng Ả Rập"] = "ar",
["Tiếng Ả Rập Ai Cập"] = "arz",
["Tiếng Ả Rập Algérie"] = "arq",
["Tiếng Ả Rập Andalusia"] = "xaa",
["Tiếng Ả Rập Bắc Levant"] = "apc",
["Tiếng Ả Rập Bắc Lưỡng Hà"] = "ayp",
["Tiếng Ả Rập Hijazi"] = "acw",
["Tiếng Ả Rập Iraq"] = "acm",
["Tiếng Ả Rập Juba"] = "pga",
["Tiếng Ả Rập Libya"] = "ayl",
["Tiếng Ả Rập Maroc"] = "ary",
["Tiếng Ả Rập Nam Levant"] = "ajp",
["Tiếng Ả Rập Oman"] = "acx",
["Tiếng Ả Rập Sudan"] = "apd",
["Tiếng Ả Rập Síp"] = "acy",
["Tiếng Ả Rập Tajikistan"] = "abh",
["Tiếng Ả Rập Tchad"] = "shu",
["Tiếng Ả Rập Tunisia"] = "aeb",
["Tiếng Ả Rập Uzbekistan"] = "auz",
["Tiếng Ả Rập vùng Vịnh"] = "afb",
["Tiếng Ấn-Arya nguyên thủy"] = "inc-pro",
["Tiếng Ấn-Iran nguyên thủy"] = "iir-pro",
["Tiếng Ấn-Âu nguyên thủy"] = "ine-pro",
["Tiếng Ỹaroamë"] = "yro",
["Àhàn"] = "ahn",
["Áncá"] = "acb",
["Ömie"] = "aom",
["Đa ngữ"] = "mul",
["ǀXam"] = "xam",
["ǁAni"] = "hnh",
["ǁGana"] = "gnk",
["ǁXegwi"] = "xeg",
["ǂHoan"] = "huc",
["ǃKung"] = "khi-kun",
}
fpe19mxq45i4z1a0x1cvidtpl832v0n
2561612
2561565
2026-09-08T08:55:25Z
Hiyuune
50834
2561612
Scribunto
text/plain
return {
["Aba"] = "utp",
["Abai Sungai"] = "abf",
["Abenlen Ayta"] = "abp",
["Abipon"] = "axb",
["Abishira"] = "ash",
["Abom"] = "aob",
["Abu"] = "ado",
["Abu' Arapesh"] = "aah",
["Abua"] = "abn",
["Abun"] = "kgr",
["Abung"] = "abl",
["Abureni"] = "mgj",
["Abé"] = "aba",
["Ache"] = "yif",
["Aché"] = "guq",
["Acroá"] = "acs",
["Adabe"] = "adb",
["Adai"] = "xad",
["Adamorobe Sign Language"] = "ads",
["Adang"] = "adn",
["Adangbe"] = "adq",
["Adap"] = "adp",
["Adasen"] = "tiu",
["Adele"] = "ade",
["Adhola"] = "adh",
["Adioukrou"] = "adj",
["Adithinngithigh"] = "dth",
["Adonara"] = "adr",
["Aduge"] = "adu",
["Aeka"] = "aez",
["Aekyom"] = "awi",
["Aequian"] = "xae",
["Afghan Sign Language"] = "afg",
["Afitti"] = "aft",
["Afra"] = "ulf",
["Afrihili"] = "afh",
["Afro-Seminole Creole"] = "afs",
["Agarabi"] = "agd",
["Agariya"] = "agi",
["Agavotaguerra"] = "avo",
["Aghu"] = "ahh",
["Aghu Tharrnggala"] = "gtu",
["Agi"] = "aif",
["Agob"] = "kit",
["Agoi"] = "ibm",
["Aguano"] = "aga",
["Aguaruna"] = "agr",
["Aguna"] = "aug",
["Agusan Manobo"] = "msm",
["Agutaynen"] = "agn",
["Agwagwune"] = "yay",
["Ahanta"] = "aha",
["Ahirani"] = "ahr",
["Ahwai"] = "nfd",
["Ai-Cham"] = "aih",
["Aighon"] = "aix",
["Aikanã"] = "tba",
["Aiklep"] = "mwg",
["Aimele"] = "ail",
["Ainbai"] = "aic",
["Aiome"] = "aki",
["Airoran"] = "air",
["Aisi"] = "mmq",
["Aiwoo"] = "nfl",
["Aja"] = "aja",
["Ajagua"] = "sai-ajg",
["Ajawa"] = "ajw",
["Ajyíninka Apurucayali"] = "cpc",
["Ak"] = "akq",
["Aka (Central Africa)"] = "axk",
["Aka (Sudan)"] = "soh",
["Aka-Bea"] = "abj",
["Aka-Cari"] = "aci",
["Aka-Kol"] = "aky",
["Aka-Kora"] = "ack",
["Akar-Bale"] = "acl",
["Akatek"] = "knj",
["Ake"] = "aik",
["Akebu"] = "keu",
["Akei"] = "tsr",
["Akeu"] = "aeu",
["Akolet"] = "akt",
["Akoye"] = "miw",
["Akpa"] = "akf",
["Akpes"] = "ibe",
["Akrukay"] = "afi",
["Akuku"] = "ayk",
["Akum"] = "aku",
["Akurio"] = "ako",
["Akuwagel"] = "bey",
["Akwa"] = "akw",
["Akyaung Ari"] = "nqy",
["Al-Sayyid Bedouin Sign Language"] = "syy",
["Alabat Island Agta"] = "dul",
["Alacatlatzala Mixtec"] = "mim",
["Alago"] = "ala",
["Alapmunte"] = "apv",
["Alas-Kluet Batak"] = "btz",
["Alazapa"] = "nai-ala",
["Albanian Sign Language"] = "sqk",
["Alege"] = "alf",
["Algerian Sign Language"] = "asp",
["Ali"] = "aiy",
["Alladian"] = "ald",
["Alngith"] = "aid",
["Alo Phola"] = "ypo",
["Alor"] = "aol",
["Aloápam Zapotec"] = "zaq",
["Alu"] = "mte",
["Alugu"] = "aub",
["Tiếng Alune"] = "alp",
["Alungul"] = "aus-alu",
["Aluo"] = "yna",
["Alur"] = "alz",
["Alutiiq"] = "ems",
["Alviri-Vidari"] = "avd",
["Alyawarr"] = "aly",
["Amahai"] = "amq",
["Amanayé"] = "ama",
["Amara"] = "aie",
["Amarakaeri"] = "amr",
["Amarizana"] = "awd-ama",
["Amasi"] = "alv-ama",
["Amatlán Zapotec"] = "zpo",
["Amba"] = "rwm",
["Ambakich"] = "aew",
["Ambala Ayta"] = "abc",
["Ambelau"] = "amv",
["Ambele"] = "ael",
["Amblong"] = "alm",
["Ambo"] = "amb",
["Ambul"] = "apo",
["Amele"] = "aey",
["Amganad Ifugao"] = "ifa",
["Ami"] = "amy",
["Ammonite"] = "sem-amm",
["Amo"] = "amo",
["Amol"] = "alx",
["Amoltepec Mixtec"] = "mbz",
["Amondawa"] = "adw",
["Amorite"] = "sem-amo",
["Ampanang"] = "apg",
["Ampari Dogon"] = "aqd",
["Amri Karbi"] = "ajz",
["Amto"] = "amt",
["Ana Tinga Dogon"] = "dti",
["Anakalangu"] = "akg",
["Anam"] = "pda",
["Anambé"] = "aan",
["Anamgura"] = "imi",
["Anasi"] = "bpo",
["Ancient Ligurian"] = "xlg",
["Ancient North Arabian"] = "xna",
["Ancient Zapotec"] = "xzp",
["Andai"] = "afd",
["Andajin"] = "ajn",
["Andaman Creole Hindi"] = "hca",
["Andaqui"] = "ana",
["Andarum"] = "aod",
["Andegerebinha"] = "adg",
["Andh"] = "anr",
["Andio"] = "bzb",
["Andjingith"] = "aus-and",
["Andoa"] = "anb",
["Andoque"] = "ano",
["Andoquero"] = "sai-and",
["Andra-Hus"] = "anx",
["Aneityum"] = "aty",
["Anem"] = "anz",
["Aneme Wake"] = "aby",
["Anfillo"] = "myo",
["Tiếng Angaataha"] = "agm",
["Angaité"] = "aqt",
["Angal"] = "age",
["Angal Enen"] = "aoe",
["Angal Heneng"] = "akh",
["Angevin"] = "roa-ang",
["Angkamuthi"] = "avm",
["Angkola Batak"] = "akb",
["Angloromani"] = "rme",
["Angor"] = "agg",
["Angoram"] = "aog",
["Angosturas Tunebo"] = "tnd",
["Anguthimri"] = "awg",
["Ani Phowa"] = "ypn",
["Animere"] = "anf",
["Anindilyakwa"] = "aoi",
["Anjam"] = "boj",
["Anmatyerre"] = "amx",
["Anong"] = "nun",
["Anor"] = "anj",
["Anserma"] = "ans",
["Ansus"] = "and",
["Antakarinya"] = "ant",
["Antigua and Barbuda Creole English"] = "aig",
["Anu"] = "anl",
["Anufo"] = "cko",
["Anus"] = "auq",
["Anuta"] = "aud",
["Anyin Morofo"] = "mtb",
["Aoheng"] = "pni",
["Aore"] = "aor",
["Ap Ma"] = "kbx",
["Apalachee"] = "xap",
["Apali"] = "ena",
["Apasco-Apoala Mixtec"] = "mip",
["Apiaká"] = "api",
["Apma"] = "app",
["Apolista"] = "awd-apo",
["Aproumu Aizi"] = "ahp",
["Apurinã"] = "apu",
["Arabana"] = "ard",
["Arabela"] = "arl",
["Aralle-Tabulahan"] = "atq",
["Arammba"] = "stk",
["Aranama-Tamique"] = "xrt",
["Arandai"] = "jbj",
["Araona"] = "aro",
["Arapaso"] = "arj",
["Arara-Karo"] = "arr",
["Ararandewára"] = "xaj",
["Arawum"] = "awm",
["Arbore"] = "arv",
["Are"] = "mwc",
["Areba"] = "aea",
["Argentine Sign Language"] = "aed",
["Arguni"] = "agf",
["Arhâ"] = "aqr",
["Arhö"] = "aok",
["Aribwatsa"] = "laz",
["Aribwaung"] = "ylu",
["Arifama-Miniafia"] = "aai",
["Arigidi"] = "aqg",
["Arikapú"] = "ark",
["Arikara"] = "ari",
["Arikem"] = "ait",
["Aringa"] = "luc",
["Armazic"] = "xrm",
["Armenian Sign Language"] = "aen",
["Arop-Lokep"] = "apr",
["Arop-Sissano"] = "aps",
["Arosi"] = "aia",
["Arritinngithigh"] = "rrt",
["Arta"] = "atz",
["Arua"] = "aru",
["Aruamu"] = "msy",
["Aruek"] = "aur",
["Aruop"] = "lsr",
["Arutani"] = "atx",
["Aruá"] = "arx",
["As"] = "asz",
["Asaro'o"] = "mtv",
["Ashe"] = "ahs",
["Asháninka"] = "cni",
["Ashéninka Perené"] = "prq",
["Asilulu"] = "asl",
["Asoa"] = "asv",
["Assangori"] = "sjg",
["Asu"] = "aum",
["Asue Awyu"] = "psa",
["Asunción Mixtepec Zapotec"] = "zoo",
["Ata"] = "atm",
["Ata Manobo"] = "atd",
["Atakapa"] = "aqp",
["Atampaya"] = "amz",
["Atanques"] = "cba-ata",
["Atatláhuca Mixtec"] = "mib",
["Ateso"] = "teo",
["Ati"] = "atk",
["Atohwaim"] = "aqm",
["Atong (Cameroon)"] = "ato",
["Atorada"] = "aox",
["Atsam"] = "cch",
["Atsugewi"] = "atw",
["Attié"] = "ati",
["Au"] = "avt",
["Aulua"] = "aul",
["Aurá"] = "aux",
["Aushi"] = "auh",
["Aushiri"] = "avs",
["Auslan"] = "asf",
["Austral"] = "aut",
["Australian Aboriginal Sign Language"] = "asw",
["Austrian Sign Language"] = "asq",
["Austronesian Mari"] = "hob",
["Auwe"] = "smf",
["Auyana"] = "auy",
["Auye"] = "auu",
["Auyokawa"] = "auo",
["Avau"] = "avb",
["Avava"] = "tmb",
["Avikam"] = "avi",
["Avá-Canoeiro"] = "avv",
["Awa (New Guinea)"] = "awb",
["Awa-Cuaiquer"] = "kwi",
["Awabakal"] = "awk",
["Awak"] = "awo",
["Awar"] = "aya",
["Awara"] = "awx",
["Awbono"] = "awh",
["Awera"] = "awr",
["Awetí"] = "awe",
["Awngthim"] = "gwm",
["Awtuw"] = "kmn",
["Awun"] = "aww",
["Awutu"] = "afu",
["Awyi"] = "auw",
["Axamb"] = "ahb",
["Ayabadhu"] = "ayd",
["Ayautla Mazatec"] = "vmy",
["Ayerrerenge"] = "axe",
["Ayi"] = "ayq",
["Ayizi"] = "yyz",
["Ayizo"] = "ayb",
["Ayomán"] = "sai-ayo",
["Ayoquesco Zapotec"] = "zaf",
["Ayoreo"] = "ayo",
["Ayu"] = "ayu",
["Ayutla Mixtec"] = "miy",
["Azha"] = "aza",
["Azhe"] = "yiz",
["Baa"] = "kwb",
["Baan"] = "bvj",
["Baangi"] = "bqx",
["Baba"] = "bbw",
["Babango"] = "bbm",
["Babanki"] = "bbk",
["Babine-Witsuwit'en"] = "bcr",
["Babole"] = "bvx",
["Bada"] = "bhz",
["Badeshi"] = "bdz",
["Badimaya"] = "bia",
["Badyara"] = "pbp",
["Baeggu"] = "bvd",
["Baelelea"] = "bvc",
["Baenan"] = "sai-bae",
["Baetora"] = "btr",
["Bafanji"] = "bfj",
["Bafaw"] = "bwt",
["Bafia"] = "ksf",
["Bafut"] = "bfd",
["Baga Kaloum"] = "bqf",
["Baga Koga"] = "bgo",
["Baga Manduri"] = "bmd",
["Baga Pokur"] = "bcg",
["Baga Sitemu"] = "bsp",
["Baga Sobané"] = "bsv",
["Bagheli"] = "bfy",
["Bagirmi"] = "bmi",
["Bago-Kusuntu"] = "bqg",
["Bagri"] = "bgq",
["Bagupi"] = "bpi",
["Bagusa"] = "bqb",
["Baha"] = "yha",
["Baham"] = "bdw",
["Bahamian Creole"] = "bah",
["Baharna Arabic"] = "abv",
["Bahau"] = "bhv",
["Bahinemo"] = "bjh",
["Bahonsuai"] = "bsu",
["Bai"] = "bdj",
["Baibai"] = "bbf",
["Baikeno"] = "bkx",
["Baima"] = "bqh",
["Baimak"] = "bmx",
["Bainouk-Gunyaamolo"] = "bcz",
["Bainouk-Samik"] = "bcb",
["Baissa Fali"] = "fah",
["Bajan"] = "bjs",
["Bajelani"] = "bjm",
["Baka"] = "bkc",
["Bakairí"] = "bkq",
["Bakoko"] = "bkh",
["Bakole"] = "kme",
["Bakpinka"] = "bbs",
["Bakulung"] = "bbu",
["Tiếng Bakumpai"] = "bkr",
["Bakwé"] = "bjw",
["Balaesang"] = "bls",
["Balangao"] = "blw",
["Balangingi"] = "sse",
["Balau"] = "blg",
["Baldemu"] = "bdn",
["Bali"] = "bcp",
["Baliledo"] = "poz-bal",
["Balinese Malay"] = "mhp",
["Balo"] = "bqo",
["Baloi"] = "biz",
["Balong"] = "bnt-bal",
["Baluan-Pam"] = "blq",
["Bamako Sign Language"] = "bog",
["Bamali"] = "bbq",
["Bambalang"] = "bmo",
["Bambam"] = "ptu",
["Bambili-Bambui"] = "baw",
["Bamenyam"] = "bce",
["Bamu"] = "bcf",
["Bamukumbit"] = "bqt",
["Bamunka"] = "bvm",
["Bamwe"] = "bmg",
["Ban Khor Sign Language"] = "bfk",
["Banam Bay"] = "vrt",
["Banao Itneg"] = "bjx",
["Banaro"] = "byz",
["Banda"] = "bnd",
["Banda Malay"] = "bpq",
["Banda-Bambari"] = "liy",
["Banda-Banda"] = "bpd",
["Banda-Mbrès"] = "bqk",
["Banda-Ndélé"] = "bfl",
["Banda-Yangere"] = "yaj",
["Bandi"] = "bza",
["Bandial"] = "bqj",
["Bangala"] = "bxg",
["Bangandu"] = "bgf",
["Bangba"] = "bbe",
["Bangime"] = "dba",
["Bangka"] = "mfb",
["Bangru"] = "sit-ban",
["Bangubangu"] = "bnx",
["Bangwinji"] = "bsj",
["Baniva"] = "bvv",
["Baniwa"] = "bwi",
["Banka"] = "bxw",
["Bankan Tey Dogon"] = "dbw",
["Banoni"] = "bcm",
["Bantik"] = "bnq",
["Baraamu"] = "brd",
["Baram Kayan"] = "kys",
["Barama"] = "bbg",
["Barambu"] = "brm",
["Baramu"] = "bmz",
["Barapasi"] = "brp",
["Baras"] = "brs",
["Barasana"] = "bsn",
["Barbareño"] = "boi",
["Barclayville Grebo"] = "gry",
["Bardi"] = "bcj",
["Barein"] = "bva",
["Bargam"] = "mlp",
["Bariai"] = "bch",
["Bariji"] = "bjc",
["Barikanchi"] = "bxo",
["Barngarla"] = "bjb",
["Barok"] = "bjk",
["Barranbinya"] = "aus-bra",
["Barro Negro Tunebo"] = "tbn",
["Barrow Point"] = "bpt",
["Baruga"] = "bjz",
["Barunggam"] = "aus-brm",
["Baruya"] = "byr",
["Barwe"] = "bwg",
["Barí"] = "mot",
["Basa"] = "bzw",
["Basa-Gumna"] = "bsl",
["Basa-Gurmana"] = "buj",
["Basap"] = "bdb",
["Bashkardi"] = "bsg",
["Bassa-Kontagora"] = "bsr",
["Bassossi"] = "bsi",
["Bata"] = "bta",
["Bataan Ayta"] = "ayt",
["Batanga"] = "bnm",
["Bateri"] = "btv",
["Bathari"] = "bhm",
["Bati (Cameroon)"] = "btc",
["Bati (Indonesia)"] = "bvt",
["Batu"] = "btu",
["Batui"] = "zbt",
["Bau"] = "bbd",
["Bauchi"] = "bsf",
["Baure"] = "brg",
["Bauria"] = "bge",
["Bauro"] = "bxa",
["Bauwaki"] = "bwk",
["Bauzi"] = "bvz",
["Bawm Chin"] = "bgr",
["Bay Miwok"] = "mkq",
["Bayali"] = "bjy",
["Baybayanon"] = "bvy",
["Baygo"] = "byg",
["Bayogoula"] = "nai-bay",
["Bayono"] = "byl",
["Bayot"] = "bda",
["Bayungu"] = "bxj",
["Bazigar"] = "bfr",
["Baïnounk Gubëeher"] = "alv-bgu",
["Beami"] = "beo",
["Beba"] = "bfp",
["Bebe"] = "bzv",
["Bebele"] = "beb",
["Bebeli"] = "bek",
["Bebil"] = "bxp",
["Bedik"] = "tnr",
["Bedoanas"] = "bed",
["Beeke"] = "bkf",
["Beele"] = "bxq",
["Beembe"] = "beq",
["Beezen"] = "bnz",
["Befang"] = "bby",
["Begbere-Ejar"] = "bqv",
["Bekati'"] = "bei",
["Bekwarra"] = "bkv",
["Bekwel"] = "bkw",
["Belait"] = "beg",
["Belanda Bor"] = "bxb",
["Belanda Viri"] = "bvi",
["Belizean Creole"] = "bzj",
["Bembe"] = "bmb",
["Ben Tey"] = "dbt",
["Bena"] = "yun",
["Benabena"] = "bef",
["Bende"] = "bdp",
["Bendi"] = "bct",
["Beneraf"] = "bnv",
["Beng"] = "nhb",
["Benga"] = "bng",
["Benggoi"] = "bgy",
["Bengkala Sign Language"] = "bqy",
["Bentong"] = "bnu",
["Benyadu'"] = "byd",
["Beothuk"] = "bue",
["Bepour"] = "bie",
["Bera"] = "brf",
["Berakou"] = "bxv",
["Berau Malay"] = "bve",
["Berawan"] = "lod",
["Bergish"] = "gmw-bgh",
["Berinomo"] = "bit",
["Berom"] = "bom",
["Berta"] = "wti",
["Berti"] = "byt",
["Besme"] = "bes",
["Besoa"] = "bep",
["Betaf"] = "bfe",
["Bete"] = "byf",
["Bete-Bendi"] = "btt",
["Betoi"] = "sai-bet",
["Bhalay"] = "bhx",
["Bharia"] = "bha",
["Bhaya"] = "bhe",
["Bhele"] = "bhy",
["Bhilali"] = "bhi",
["Bhoti Kinnauri"] = "nes",
["Biafada"] = "bif",
["Biage"] = "bdf",
["Biak"] = "bhw",
["Biali"] = "beh",
["Bian Marind"] = "bpv",
["Biangai"] = "big",
["Biao"] = "byk",
["Biao Mon"] = "bmt",
["Biao-Jiao Mien"] = "bje",
["Bibaali"] = "bcn",
["Bibbulman"] = "xbp",
["Bidiyo"] = "bid",
["Bidyara"] = "bym",
["Bidyogo"] = "bjg",
["Biem"] = "bmc",
["Bierebo"] = "bnk",
["Bieria"] = "brj",
["Biete"] = "biu",
["Big Nambas"] = "nmb",
["Biga"] = "bhc",
["Bigambal"] = "xbe",
["Bikaru"] = "bic",
["Bikya"] = "byb",
["Bila"] = "bip",
["Bilakura"] = "bql",
["Bilba"] = "bpz",
["Bilbil"] = "brz",
["Bile"] = "bil",
["Biliau"] = "bcu",
["Biloxi"] = "bll",
["Bilur"] = "bxf",
["Bimin"] = "bhl",
["Bimoba"] = "bim",
["Bina"] = "bmn",
["Binahari"] = "bxz",
["Binandere"] = "bhg",
["Binawa"] = "byj",
["Bindal"] = "xbd",
["Bine"] = "bon",
["Binji"] = "bpj",
["Binongan Itneg"] = "itb",
["Bintauna"] = "bne",
["Bintulu"] = "bny",
["Binumarien"] = "bjr",
["Bipi"] = "biq",
["Birgid"] = "brk",
["Biri"] = "bzr",
["Biritai"] = "bqq",
["Birri"] = "bvq",
["Birrpayi"] = "xbj",
["Birwa"] = "brl",
["Biseni"] = "ije",
["Bishuo"] = "bwh",
["Bisis"] = "bnw",
["Bisorio"] = "bir",
["Bitare"] = "brt",
["Bitur"] = "mcc",
["Biwat"] = "bwm",
["Biyo"] = "byo",
["Biyom"] = "bpm",
["Blablanga"] = "blp",
["Black Speech"] = "art-bsp",
["Blafe"] = "bfh",
["Bo"] = "bgl",
["Bo-Rukul"] = "mae",
["Bo-Ung"] = "mux",
["Boano (Maluku)"] = "bzn",
["Boano (Sulawesi)"] = "bzl",
["Bobongko"] = "bgb",
["Bobot"] = "bty",
["Bodo (Central Africa)"] = "boy",
["Bofi"] = "bff",
["Boga"] = "bvw",
["Bogaya"] = "boq",
["Boguru"] = "bqu",
["Boikin"] = "bzf",
["Bokha"] = "ybk",
["Bokoto"] = "bdt",
["Bokyi"] = "bky",
["Bolak"] = "art-blk",
["Bolango"] = "bld",
["Bole"] = "bol",
["Bolgo"] = "bvo",
["Bolia"] = "bli",
["Tiếng Bolinao"] = "smk",
["Bolivian Sign Language"] = "bvl",
["Bolon"] = "bof",
["Bolondo"] = "bzm",
["Bolongan"] = "blj",
["Bom"] = "bmf",
["Boma Nkuu"] = "bnt-bon",
["Boma Yumu"] = "bnt-boy",
["Bomboli"] = "bml",
["Bomboma"] = "bws",
["Bomitaba"] = "zmx",
["Bomwali"] = "bmw",
["Bon Gula"] = "glc",
["Bondei"] = "bou",
["Tiếng Kulango Bondoukou"] = "kzc",
["Bondum Dom Dogon"] = "dbu",
["Bonerate"] = "bna",
["Bonggi"] = "bdg",
["Bonggo"] = "bpg",
["Bongili"] = "bui",
["Bongo"] = "bot",
["Bongu"] = "bpu",
["Bonjo"] = "bok",
["Bonkeng"] = "bvg",
["Bonkiman"] = "bop",
["Bookan"] = "bnb",
["Boor"] = "bvf",
["Bora"] = "boa",
["Border Kuna"] = "kvn",
["Borei"] = "gai",
["Boro"] = "xxb",
["Borong"] = "ksr",
["Boruca"] = "brn",
["Boselewa"] = "bwf",
["Bosngun"] = "bqs",
["Bote-Majhi"] = "bmj",
["Tiếng Kulango Bouna"] = "nku",
["Bourbonnais-Berrichon"] = "roa-bbn",
["Bozaba"] = "bzo",
["Bragat"] = "aof",
["Brazilian Sign Language"] = "bzs",
["Brek Karen"] = "kvl",
["Brem"] = "buq",
["Bribri"] = "bzd",
["British Sign Language"] = "bfi",
["Brokskat"] = "bkk",
["Broome Pearling Lugger Pidgin"] = "bpl",
["Brunei Bisaya"] = "bsb",
["Bruny Island"] = "xpz",
["Bu"] = "jid",
["Bu-Nao Bunu"] = "bwx",
["Bua"] = "bub",
["Bualkhaw Chin"] = "cbl",
["Buamu"] = "box",
["Bubi"] = "buw",
["Bubia"] = "bbx",
["Budibud"] = "btp",
["Budong-Budong"] = "bdx",
["Budu"] = "buu",
["Buduma"] = "bdm",
["Budza"] = "bja",
["Buena Vista Yokuts"] = "nai-bvy",
["Buglere"] = "sab",
["Bugun"] = "bgg",
["Buhutu"] = "bxh",
["Bujhyal"] = "byh",
["Bukar-Sadung Bidayuh"] = "sdo",
["Bukat"] = "bvk",
["Bukawa"] = "buk",
["Bukit Malay"] = "bvu",
["Bukitan"] = "bkn",
["Buksa"] = "tkb",
["Bukusu"] = "bxk",
["Bulgarian Sign Language"] = "bqn",
["Bulgebi"] = "bmp",
["Buli (Ghana)"] = "bwu",
["Buli (Indonesia)"] = "bzq",
["Bulu (Cameroon)"] = "bum",
["Bulu (New Guinea)"] = "bjl",
["Bum"] = "bmv",
["Bumaji"] = "byp",
["Bumbita Arapesh"] = "aon",
["Bun"] = "buv",
["Buna"] = "bvn",
["Bunaba"] = "bck",
["Bunak"] = "bfn",
["Bunama"] = "bdd",
["Bundeli"] = "bns",
["Bung"] = "bqd",
["Bungain"] = "but",
["Bunganditj"] = "xbg",
["Bungu"] = "wun",
["Bunoge"] = "dgb",
["Buol"] = "blf",
["Bura"] = "bwr",
["Burak"] = "bys",
["Buraka"] = "bkg",
["Burarra"] = "bvr",
["Burate"] = "bti",
["Burduna"] = "bxn",
["Bure"] = "bvh",
["Burgundian"] = "gem-bur",
["Burmeso"] = "bzu",
["Buru (Indonesia)"] = "mhs",
["Buru (Nigeria)"] = "bqw",
["Burui"] = "bry",
["Burumakok"] = "aip",
["Burun"] = "bdi",
["Burusu"] = "bqr",
["Buruwai"] = "asi",
["Busam"] = "bxs",
["Busami"] = "bsm",
["Busang Kayan"] = "bfg",
["Bushoong"] = "buf",
["Buso"] = "bso",
["Busoa"] = "bup",
["Busuu"] = "bju",
["Butbut Kalinga"] = "kyb",
["Butchulla"] = "xby",
["Butmas-Tur"] = "bnr",
["Buwal"] = "bhs",
["Buyeo"] = "xpy",
["Buyu"] = "byi",
["Buyuan Jino"] = "jiy",
["Bwa"] = "bww",
["Bwaidoka"] = "bwd",
["Bwala"] = "bnt-bwa",
["Bwanabwana"] = "tte",
["Bwatoo"] = "bwa",
["Bwela"] = "bwl",
["Bwile"] = "bwc",
["Bwisi"] = "bwz",
["Byangsi"] = "bee",
["Byep"] = "mkk",
["Bädi Kanum"] = "khd",
["Caac"] = "msq",
["Cabiyarí"] = "cbb",
["Cabécar"] = "cjp",
["Cacaloxtepec Mixtec"] = "miu",
["Cacaopera"] = "ccr",
["Cacua"] = "cbv",
["Cacán"] = "sai-cac",
["Caddo"] = "cad",
["Cafundó"] = "ccd",
["Cahuarano"] = "cah",
["Caka"] = "ckx",
["Cakchiquel-Quiché Mixed Language"] = "ckz",
["Cakfem-Mushere"] = "cky",
["Calabrian Greek"] = "grk-cal",
["Callawalla"] = "caw",
["Calusa"] = "nai-cal",
["Caluyanun"] = "clu",
["Caló"] = "rmq",
["Camarines Norte Agta"] = "abd",
["Cameroon Mambila"] = "mcu",
["Cameroon Pidgin"] = "wes",
["Campalagian"] = "cml",
["Camsá"] = "kbh",
["Camtho"] = "cmt",
["Candoshi-Shapra"] = "cbu",
["Canichana"] = "caz",
["Cao Miao"] = "cov",
["Capiznon"] = "cps",
["Caquinte"] = "cot",
["Cara"] = "cfd",
["Carabayo"] = "cby",
["Caramanta"] = "crf",
["Caranqui"] = "sai-caq",
["Carapana"] = "cbc",
["Carian"] = "xcr",
["Cariay"] = "awd-kar",
["Carijona"] = "cbd",
["Carolina Algonquian"] = "crr",
["Carolinian"] = "cal",
["Carpathian Romani"] = "rmc",
["Cashibo-Cacataibo"] = "cbr",
["Cashinahua"] = "cbs",
["Casiguran Dumagat Agta"] = "dgc",
["Casuarina Coast Asmat"] = "asc",
["Catacao"] = "sai-cat",
["Catalan Sign Language"] = "csc",
["Catuquinaru"] = "sai-ctq",
["Catío Chibcha"] = "cba-cat",
["Cauca"] = "cca",
["Cavere"] = "awd-cav",
["Cavineña"] = "cav",
["Cayubaba"] = "cyb",
["Cayuse"] = "xcy",
["Cazcan"] = "azc-caz",
["Cañari"] = "sai-cnr",
["Cebaara Senoufo"] = "sef",
["Cemuhî"] = "cam",
["Cen"] = "cen",
["Central Asmat"] = "cns",
["Central Awyu"] = "awu",
["Central Bontoc"] = "lbk",
["Central Cagayan Agta"] = "agt",
["Central Grebo"] = "grv",
["Central Huishui Hmong"] = "hmc",
["Central Maewo"] = "mwo",
["Central Mahuatlán Zapoteco"] = "zam",
["Central Malay"] = "pse",
["Central Masela"] = "mxz",
["Central Mashan Hmong"] = "hmm",
["Central Melanau"] = "mel",
["Central Ojibwa"] = "ojc",
["Central Palawano"] = "plc",
["Central Pame"] = "pbs",
["Central Pomo"] = "poo",
["Central Sierra Miwok"] = "csm",
["Central Subanen"] = "syb",
["Central Tagbanwa"] = "tgt",
["Central Tarahumara"] = "tar",
["Central Teke"] = "nzu",
["Central Tunebo"] = "tuf",
["Centúúm"] = "cet",
["Cerma"] = "cme",
["Ch'olti'"] = "myn-chl",
["Chaap Wuurong"] = "tjw",
["Chadian Sign Language"] = "cds",
["Chaha"] = "sem-cha",
["Chairel"] = "sit-cha",
["Chakali"] = "cli",
["Chala"] = "cll",
["Chali"] = "tgf",
["Chamacoco"] = "ceg",
["Chamba Daka"] = "ccg",
["Chamba Leko"] = "ndi",
["Chambri"] = "can",
["Champenois"] = "roa-cha",
["Chang"] = "nbc",
["Changriwa"] = "cga",
["Chaná"] = "sai-chn",
["Chané"] = "caj",
["Chapacura"] = "sai-chp",
["Chara"] = "cra",
["Charrua"] = "sai-chr",
["Chaudangsi"] = "cdn",
["Chayahuita"] = "cbt",
["Chazumba Mixtec"] = "xtb",
["Che"] = "ruk",
["Cheke Holo"] = "mrn",
["Chemakum"] = "xch",
["Chenapian"] = "cjn",
["Chepya"] = "ycp",
["Cherepon"] = "cpn",
["Chesu"] = "ych",
["Chetco-Tolowa"] = "ctc",
["Chhintange"] = "ctn",
["Chhulung"] = "cur",
["Chiangmai Sign Language"] = "csd",
["Chiapanec"] = "cip",
["Chichicapan Zapotec"] = "zpv",
["Chichimeca-Jonaz"] = "pei",
["Chichonyi-Chidzihana-Chikauma"] = "coh",
["Chicomuceltec"] = "cob",
["Chiduruma"] = "dug",
["Chigmecatitlán Mixtec"] = "mii",
["Chilean Sign Language"] = "csg",
["Chilisso"] = "clh",
["Chiltepec Chinantec"] = "csa",
["Chimalapa Zoque"] = "zoh",
["Chimariko"] = "cid",
["Chimila"] = "cbg",
["Chimwiini"] = "bnt-cmw",
["Chinbon Chin"] = "cnb",
["Chinese Pidgin English"] = "cpi",
["Chinese Sign Language"] = "csl",
["Chipaya"] = "cap",
["Chiquihuitlán Mazatec"] = "maq",
["Chiquimulilla"] = "nai-chi",
["Chiquitano"] = "cax",
["Chirino"] = "sai-chi",
["Chiripá"] = "nhd",
["Chitimacha"] = "ctm",
["Chitkuli Kinnauri"] = "cik",
["Chitwania Tharu"] = "the",
["Choapan Zapotec"] = "zpc",
["Chochotec"] = "coz",
["Chokri Naga"] = "nri",
["Chokwe"] = "cjk",
["Cholón"] = "cht",
["Chono"] = "sai-cno",
["Chopi"] = "cce",
["Chuabo"] = "chw",
["Chuanqiandian Cluster Miao"] = "cqd",
["Chuave"] = "cjv",
["Chug"] = "cvg",
["Chuj"] = "cac",
["Chuka"] = "cuh",
["Chukwa"] = "cuw",
["Chumburung"] = "ncu",
["Churuya"] = "sai-chu",
["Chácobo"] = "cao",
["Ci Gbe"] = "cib",
["Cibak"] = "ckl",
["Cicipu"] = "awc",
["Ciguayo"] = "nai-cig",
["Cinamiguin Manobo"] = "mkx",
["Cinda-Regi-Tiyal"] = "cdr",
["Cineni"] = "cie",
["Cinta Larga"] = "cin",
["Cishingini"] = "asg",
["Citak"] = "txt",
["Ciwogai"] = "tgd",
["Tiếng Gael cổ điển"] = "ghc",
["Classical Guaraní"] = "gn-cls",
["Classical Mandaic"] = "myz",
["Classical Newar"] = "nwc",
["Classical Quechua"] = "qwc",
["Coahuilteco"] = "xcw",
["Coast Miwok"] = "csi",
["Coastal Konjo"] = "kjc",
["Coatecas Altas Zapotec"] = "zca",
["Coatepec Nahuatl"] = "naz",
["Coatlán Mixe"] = "mco",
["Coatlán Zapotec"] = "zps",
["Coatzospan Mixtec"] = "miz",
["Cocopa"] = "coc",
["Cocos Islands Malay"] = "coa",
["Coeruna"] = "sai-coe",
["Cogui"] = "kog",
["Col"] = "liw",
["Colombian Sign Language"] = "csn",
["Colonia Tovar German"] = "gct",
["Columbia-Wenatchi"] = "col",
["Colán"] = "sai-col",
["Comaltepec Chinantec"] = "cco",
["Comechingon"] = "sai-cmg",
["Comecrudo"] = "xcm",
["Communicationssprache"] = "art-com",
["Como Karim"] = "cfg",
["Con"] = "cno",
["Coos"] = "csz",
["Copainalá Zoque"] = "zoc",
["Copallén"] = "sai-cop",
["Coquille"] = "coq",
["Cora"] = "crn",
["Cori"] = "cry",
["Coroado Puri"] = "sai-crd",
["Cosoleacaque Nahuatl"] = "nhk",
["Costa Rican Sign Language"] = "csr",
["Cotabato Manobo"] = "mta",
["Cotoname"] = "xcn",
["Coyaima"] = "coy",
["Coyotepec Popoloca"] = "pbf",
["Coyutla Totonac"] = "toc",
["Crimean Gothic"] = "gme-cgo",
["Croatian Sign Language"] = "csq",
["Cruzeño"] = "crz",
["Cuban Sign Language"] = "csf",
["Cubeo"] = "cub",
["Cueva"] = "sai-cva",
["Cuiba"] = "cui",
["Cuitlatec"] = "cuy",
["Culina"] = "cul",
["Tiếng Culli"] = "sai-cul",
["Cun"] = "cuq",
["Cung"] = "cug",
["Curonian"] = "xcu",
["Curripaco"] = "kpc",
["Cutchi-Swahili"] = "ccl",
["Cuvok"] = "cuv",
["Cuyamecalco Mixtec"] = "xtu",
["Cwi Bwamu"] = "bwy",
["Czech Sign Language"] = "cse",
["Da'a Kaili"] = "kzf",
["Daai Chin"] = "dao",
["Daantanai'"] = "lni",
["Daba"] = "dbq",
["Dabe"] = "dbe",
["Dadanitic"] = "sem-dad",
["Dadi Dadi"] = "dda",
["Dadiya"] = "dbd",
["Daga"] = "dgz",
["Dagaari Dioula"] = "dgd",
["Dagik"] = "dec",
["Dagoman"] = "dgn",
["Daho-Doo"] = "das",
["Dai"] = "dij",
["Dair"] = "drb",
["Dairi Batak"] = "btd",
["Dakaka"] = "bpa",
["Dakka"] = "dkk",
["Daloa Bété"] = "bev",
["Dama (Nigeria)"] = "dmm",
["Dama (Sierra Leone)"] = "dmn-dam",
["Damakawa"] = "dam",
["Damal"] = "uhn",
["Dampelas"] = "dms",
["Danaru"] = "dnr",
["Dandami Maria"] = "daq",
["Dangaura Tharu"] = "thl",
["Danish Sign Language"] = "dsl",
["Dano"] = "aso",
["Dao"] = "daz",
["Daonda"] = "dnd",
["Dar Fur Daju"] = "daj",
["Dar Sila Daju"] = "dau",
["Darai"] = "dry",
["Darkinjung"] = "xda",
["Darlong"] = "dln",
["Darmiya"] = "drd",
["Daro-Matu Melanau"] = "dro",
["Darumbal"] = "xgm",
["Dass"] = "dot",
["Datooga"] = "tcc",
["Daungwurrung"] = "dgw",
["Davawenyo"] = "daw",
["Dawawa"] = "dww",
["Dawera-Daweloor"] = "ddw",
["Day"] = "dai",
["Dayi"] = "dax",
["Dazaga"] = "dzg",
["Deccani"] = "dcc",
["Dedua"] = "ded",
["Defaka"] = "afn",
["Defi Gbe"] = "gbh",
["Deg"] = "mzw",
["Degenan"] = "dge",
["Dehwari"] = "deh",
["Dek"] = "dek",
["Dela-Oenale"] = "row",
["Delo"] = "ntr",
["Delta Yokuts"] = "nai-dly",
["Dem"] = "dem",
["Dema"] = "dmx",
["Demisa"] = "dei",
["Demta"] = "dmy",
["Tiếng Dena'ina"] = "tfn",
["Dendi"] = "ddn",
["Dengese"] = "dez",
["Dengka"] = "dnk",
["Deno"] = "dbb",
["Denya"] = "anv",
["Dení"] = "dny",
["Desano"] = "des",
["Dewas Rai"] = "dwz",
["Dewoin"] = "dee",
["Dezfuli"] = "def",
["Dghwede"] = "dgh",
["Dhaiso"] = "dhs",
["Dhalandji"] = "dhl",
["Dhao"] = "nfa",
["Dhofari Arabic"] = "adf",
["Dhudhuroa"] = "ddr",
["Dhungaloo"] = "dhx",
["Dhurga"] = "dhu",
["Dhuwal"] = "dwu",
["Dhuwaya"] = "dwy",
["Dia"] = "dia",
["Dibiyaso"] = "dby",
["Dibo"] = "dio",
["Dicamay Agta"] = "duy",
["Didinga"] = "did",
["Digo"] = "dig",
["Tiếng Dii"] = "dur",
["Dijim-Bwilim"] = "cfa",
["Dilling"] = "dil",
["Dima"] = "jma",
["Dimbong"] = "dii",
["Dinapigue Agta"] = "phi-din",
["Dineor"] = "mrx",
["Ding"] = "diz",
["Diodio"] = "ddi",
["Diri"] = "dwa",
["Dirim"] = "dir",
["Disa"] = "dsi",
["Diuwe"] = "diy",
["Diuxi-Tilantongo Mixtec"] = "xtd",
["Dixon Reef"] = "dix",
["Djadjawurrung"] = "dja",
["Djambarrpuyngu"] = "djr",
["Djangun"] = "djf",
["Djauan"] = "djn",
["Djawi"] = "djw",
["Djimini"] = "dyi",
["Djinba"] = "djb",
["Djiwarli"] = "djl",
["Dobel"] = "kvo",
["Dobu"] = "dob",
["Doe"] = "doe",
["Doga"] = "dgg",
["Doghoro"] = "dgx",
["Dogoso"] = "dgs",
["Dogosé"] = "dos",
["Dogul Dom"] = "dbg",
["Doka"] = "dbi",
["Doko-Uyanga"] = "uya",
["Dom"] = "doa",
["Dominican Sign Language"] = "doq",
["Dompo"] = "doy",
["Domu"] = "dof",
["Domung"] = "dev",
["Dondo"] = "dok",
["Dong"] = "doh",
["Dongo"] = "doo",
["Dongotono"] = "ddd",
["Dongshanba Lalo"] = "yik",
["Donno So Dogon"] = "dds",
["Doondo"] = "dde",
["Dorasque"] = "cba-dor",
["Dori'o"] = "dor",
["Dorig"] = "wwo",
["Doromu-Koki"] = "kqc",
["Dorze"] = "doz",
["Doso"] = "dol",
["Dothraki"] = "art-dtk",
["Doura"] = "don",
["Doutai"] = "tds",
["Doyayo"] = "dow",
["Drehu"] = "dhv",
["Duala"] = "dua",
["Duano"] = "dup",
["Duau"] = "dva",
["Dubu"] = "dmu",
["Dugun"] = "ndu",
["Duguri"] = "dbm",
["Dugwor"] = "dme",
["Duhwa"] = "kbz",
["Duit"] = "cba-dui",
["Duke"] = "nke",
["Dulbu"] = "dbo",
["Duli"] = "duz",
["Duma"] = "dma",
["Dumaitic"] = "sem-dum",
["Dumbea"] = "duf",
["Dumpas"] = "dmv",
["Dumun"] = "dui",
["Duna"] = "duc",
["Dungmali"] = "raa",
["Dungu"] = "dbv",
["Dura"] = "drq",
["Duri"] = "mvp",
["Duriankere"] = "dbn",
["Dusner"] = "dsn",
["Dusun Deyah"] = "dun",
["Dusun Malang"] = "duq",
["Dutch Sign Language"] = "dse",
["Duupa"] = "dae",
["Duvle"] = "duv",
["Duwai"] = "dbp",
["Duwet"] = "gve",
["Dwang"] = "nnu",
["Dyaabugay"] = "dyy",
["Dyaberdyaber"] = "dyb",
["Dyan"] = "dya",
["Dyangadi"] = "dyn",
["Dyugun"] = "dyd",
["Dza"] = "jen",
["Dzando"] = "dzn",
["Dzao Min"] = "bpn",
["Dzodinka"] = "add",
["Dâw"] = "kwa",
["E'ma Buyang"] = "yzg",
["Early Modern Korean"] = "ko-ear",
["Early Tripuri"] = "xtr",
["East Damar"] = "dmr",
["East Franconian"] = "vmf",
["East Kewa"] = "kjs",
["East Limba"] = "lma",
["East Makian"] = "mky",
["East Masela"] = "vme",
["East Nyala"] = "nle",
["East Tarangan"] = "tre",
["Eastern Bolivian Guaraní"] = "gui",
["Eastern Durango Nahuatl"] = "azd",
["Eastern Gurung"] = "ggn",
["Eastern Highland Chatino"] = "cly",
["Eastern Highland Otomi"] = "otm",
["Eastern Huasteca Nahuatl"] = "nhe",
["Eastern Huishui Hmong"] = "hme",
["Eastern Karaboro"] = "xrb",
["Eastern Keres"] = "kee",
["Eastern Lalu"] = "yit",
["Tiếng Maninkakan Đông"] = "emk",
["Eastern Meohang"] = "emg",
["Eastern Muria"] = "emu",
["Eastern Ngad'a"] = "nea",
["Eastern Nisu"] = "nos",
["Eastern Penan"] = "pez",
["Eastern Pomo"] = "peb",
["Eastern Qiandong Miao"] = "hmq",
["Eastern Subanun"] = "sfe",
["Eastern Tawbuid"] = "bnj",
["Eastern Xiangxi Miao"] = "muq",
["Eastern Xwla Gbe"] = "gbx",
["Ebira"] = "igb",
["Ecuadorian Sign Language"] = "ecs",
["Ede Cabe"] = "cbj",
["Ede Ije"] = "ijj",
["Edera Awyu"] = "awy",
["Edolo"] = "etr",
["Edomite"] = "xdm",
["Edopi"] = "dbf",
["Efutop"] = "ofu",
["Egyptian Sign Language"] = "esl",
["Ejamat"] = "eja",
["Ekajuk"] = "eka",
["Ekari"] = "ekg",
["Ekele"] = "khy",
["Eki"] = "eki",
["Ekit"] = "eke",
["Ekpeye"] = "ekp",
["El Alto Zapotec"] = "zpp",
["El Hugeirat"] = "elh",
["Eleme"] = "elm",
["Elepi"] = "ele",
["Elip"] = "ekm",
["Elkei"] = "elk",
["Eloi"] = "art-elo",
["Elotepec Zapotec"] = "zte",
["Eloyi"] = "afo",
["Elseng"] = "mrf",
["Elu"] = "elu",
["Emae"] = "mmw",
["Emai"] = "ema",
["Eman"] = "emn",
["Embaloh"] = "emb",
["Emberá-Baudó"] = "bdc",
["Emberá-Catío"] = "cto",
["Emem"] = "enr",
["Emerillon"] = "eme",
["Emplawas"] = "emw",
["Enawené-Nawé"] = "unk",
["Ende"] = "end",
["Enga"] = "enq",
["Enggano"] = "eno",
["Enlhet"] = "enl",
["Enrekang"] = "ptt",
["Enu"] = "enu",
["Enwan"] = "env",
["Enwang"] = "enw",
["Enxet"] = "enx",
["Enya"] = "gey",
["Epena"] = "sja",
["Epi-Olmec"] = "xep",
["Epigraphic Mayan"] = "emy",
["Erave"] = "kjy",
["Ere"] = "twp",
["Erie"] = "iro-ere",
["Eritai"] = "ert",
["Erokwanas"] = "erw",
["Erre"] = "err",
["Erromintxela"] = "emx",
["Eruwa"] = "erh",
["Ese Ejja"] = "ese",
["Eshtehardi"] = "esh",
["Eskayan"] = "esy",
["Esmeralda"] = "sai-esm",
["Esselen"] = "esq",
["Estado de México Otomi"] = "ots",
["Estonian Sign Language"] = "eso",
["Esuma"] = "esm",
["Etchemin"] = "etc",
["Etebi"] = "etb",
["Eten"] = "etx",
["Eteocypriot"] = "ecy",
["Ethiopian Sign Language"] = "eth",
["Etkywan"] = "ich",
["Eton (Cameroon)"] = "eto",
["Eton (Vanuatu)"] = "etn",
["Etulo"] = "utr",
["Evant"] = "bzz",
["Ewage-Notu"] = "nou",
["Ewarhuyana"] = "sai-ewa",
["Ewondo"] = "ewo",
["Extremaduran"] = "ext",
["Eyak"] = "eya",
["Ezaa"] = "eza",
["Fagani"] = "faf",
["Faire Atta"] = "azt",
["Faita"] = "faj",
["Faiwol"] = "fai",
["Fakkanci"] = "gel",
["Fali"] = "fli",
["Fam"] = "fam",
["Fanamaket"] = "bjp",
["Fang (Beboid)"] = "fak",
["Fania"] = "fni",
["Fas"] = "fqs",
["Fasu"] = "faa",
["Fataleka"] = "far",
["Fataluku"] = "ddg",
["Fayu"] = "fau",
["Fedan"] = "pdn",
["Fembe"] = "agl",
["Fer"] = "kah",
["Feroge"] = "fer",
["Filomena Mata-Coahuitlán Totonac"] = "tlp",
["Finisterre Yau"] = "yuw",
["Finnish Sign Language"] = "fse",
["Finnish-Swedish Sign Language"] = "fss",
["Finongan"] = "fag",
["Fipa"] = "fip",
["Firan"] = "fir",
["Fiwaga"] = "fiw",
["Flemish Sign Language"] = "vgt",
["Flinders Island"] = "fln",
["Foau"] = "flh",
["Foia Foia"] = "ffi",
["Folopa"] = "ppo",
["Foma"] = "fom",
["Fongoro"] = "fgr",
["Foodo"] = "fod",
["Forak"] = "frq",
["Fordata"] = "frd",
["Fore"] = "for",
["Forest Nenets"] = "yrk-for",
["Fortsenal"] = "frt",
["French Belgian Sign Language"] = "sfb",
["French Sign Language"] = "fsl",
["Fuliiru"] = "flr",
["Fulniô"] = "fun",
["Fum"] = "fum",
["Fungwa"] = "ula",
["Furu"] = "fuu",
["Futuna-Aniwa"] = "fut",
["Fuyug"] = "fuy",
["Fwe"] = "fwe",
["Fwâi"] = "fwa",
["Fyam"] = "pym",
["Fyer"] = "fie",
["Ga'anda"] = "gqa",
["Ga'dang"] = "gdg",
["Gaa"] = "ttb",
["Gaam"] = "tbi",
["Gabadi"] = "kbt",
["Gabi"] = "gbw",
["Gabrielino-Fernandeño"] = "xgf",
["Gadang"] = "gdk",
["Gade"] = "ged",
["Gadjerawang"] = "gdh",
["Gadsup"] = "gaj",
["Gafat"] = "gft",
["Gagadu"] = "gbu",
["Gagnoa Bété"] = "btg",
["Gaikundi"] = "gbf",
["Gaina"] = "gcn",
["Gal"] = "gap",
["Galambu"] = "glo",
["Galela"] = "gbi",
["Galeya"] = "gar",
["Galice"] = "gce",
["Galindian"] = "xgl",
["Gallaecian"] = "cel-gal",
["Galoli"] = "gal",
["Gambera"] = "gma",
["Gamela"] = "sai-gam",
["Gamkonora"] = "gak",
["Gamo-Ningi"] = "bte",
["Gana"] = "gnq",
["Ganang"] = "gne",
["Gane"] = "gzn",
["Ganggalida"] = "gcd",
["Ganglau"] = "ggl",
["Gangte"] = "gnb",
["Gangulu"] = "gnl",
["Gants"] = "gao",
["Ganzi"] = "gnz",
["Gao"] = "gga",
["Gapapaiwa"] = "pwg",
["Garawa"] = "wrk",
["Garingbal"] = "xgi",
["Garus"] = "gyb",
["Garza"] = "xgr",
["Gashowu"] = "nai-gsy",
["Gavak"] = "dmc",
["Gavar"] = "gou",
["Gavião do Jiparaná"] = "gvo",
["Gayo"] = "gay",
["Gayón"] = "sai-gay",
["Gbagyi"] = "gbr",
["Gban"] = "ggu",
["Gbanu"] = "gbv",
["Gbanziri"] = "gbg",
["Gbari"] = "gby",
["Gbaya"] = "gba",
["Gbaya-Bossangoa"] = "gbp",
["Gbaya-Bozoum"] = "gbq",
["Gbaya-Mbodomo"] = "gmm",
["Gbayi"] = "gyg",
["Gbesi Gbe"] = "gbs",
["Gbii"] = "ggb",
["Gbin"] = "xgb",
["Gboloo Grebo"] = "gec",
["Gciriku"] = "diu",
["Gcwi"] = "gwj",
["Ge"] = "hmj",
["Gebe"] = "gei",
["Gedaged"] = "gdd",
["Geji"] = "gji",
["Gela"] = "nlg",
["Gelao"] = "gio",
["Gele'"] = "sbc",
["Geme"] = "geq",
["Gende"] = "gaf",
["Gengle"] = "geg",
["Gepo"] = "ygp",
["Gera"] = "gew",
["German Sign Language"] = "gsg",
["Geruma"] = "gea",
["Geser-Gorom"] = "ges",
["Gey"] = "guv",
["Ghanaian Sign Language"] = "gse",
["Ghandruk Sign Language"] = "gds",
["Ghanongga"] = "ghn",
["Ghari"] = "gri",
["Ghayavi"] = "bmk",
["Ghera"] = "ghr",
["Ghulfan"] = "ghl",
["Giangan"] = "bgi",
["Gibanawa"] = "gib",
["Gidar"] = "gid",
["Gikyode"] = "acd",
["Gilima"] = "gix",
["Gimi (Austronesian)"] = "gip",
["Gimme"] = "kmp",
["Gimnime"] = "gmn",
["Ginuman"] = "gnm",
["Girawa"] = "bbr",
["Githabul"] = "gih",
["Gitua"] = "ggt",
["Giyug"] = "giy",
["Gizrra"] = "tof",
["Glaro-Twabo"] = "glr",
["Glavda"] = "glw",
["Glio-Oubi"] = "oub",
["Gnau"] = "gnu",
["Goa'uld"] = "art-gld",
["Goaria"] = "gig",
["Gobasi"] = "goi",
["Gobu"] = "gox",
["Godié"] = "god",
["Godwari"] = "gdx",
["Goemai"] = "ank",
["Gogo"] = "gog",
["Gogodala"] = "ggw",
["Gokana"] = "gkn",
["Gokhy"] = "sit-gkh",
["Gola"] = "gol",
["Golin"] = "gvf",
["Golpa"] = "lja",
["Gondi"] = "gon",
["Gongduk"] = "goe",
["Gonja"] = "gjn",
["Goo"] = "gov",
["Gor"] = "gqr",
["Gorakor"] = "goc",
["Gorap"] = "goq",
["Goreng"] = "xgg",
["Gorovu"] = "grq",
["Gottscheerish"] = "gmw-gts",
["Goundo"] = "goy",
["Gowlan"] = "goj",
["Gowro"] = "gwf",
["Gozarkhani"] = "goz",
["Grangali"] = "nli",
["Grass Koiari"] = "kbk",
["Grebo"] = "grb",
["Greek Sign Language"] = "gss",
["Green Gelao"] = "giq",
["Green Hmong"] = "hnj",
["Grenadian Creole English"] = "gcl",
["Gresi"] = "grs",
["Groma"] = "gro",
["Gros Ventre"] = "ats",
["Gua"] = "gwx",
["Guahibo"] = "guh",
["Guambiano"] = "gum",
["Guamo"] = "sai-gmo",
["Guanano"] = "gvc",
["Guatemalan Sign Language"] = "gsm",
["Guató"] = "gta",
["Guayabero"] = "guo",
["Guazacapán"] = "nai-guz",
["Gudang"] = "xgd",
["Gudanji"] = "nji",
["Gude"] = "gde",
["Gudu"] = "gdu",
["Guduf-Gava"] = "gdf",
["Guerrero Nahuatl"] = "ngu",
["Guevea de Humboldt Zapotec"] = "zpg",
["Gugadj"] = "ggd",
["Gugu Badhun"] = "gdc",
["Gugu Warra"] = "wrw",
["Guhu-Samane"] = "ghs",
["Guianese Creole"] = "gcr",
["Guiberoua Bété"] = "bet",
["Guinau"] = "awd-gnu",
["Guinea-Bissau Sign Language"] = "lgs",
["Guinean Sign Language"] = "gus",
["Guiqiong"] = "gqi",
["Gula"] = "glu",
["Gula'alaa"] = "gmb",
["Gule"] = "gly",
["Gullah"] = "gul",
["Gumalu"] = "gmu",
["Gumatj"] = "gnn",
["Gumawana"] = "gvs",
["Gundi"] = "gdi",
["Gunditjmara"] = "gjm",
["Gundungurra"] = "xrd",
["Gungabula"] = "gyf",
["Gungu"] = "rub",
["Guntai"] = "gnt",
["Gunu"] = "yas",
["Gunwinggu"] = "gup",
["Gunya"] = "gyy",
["Gupa-Abawa"] = "gpa",
["Gupapuyngu"] = "guf",
["Guragone"] = "gge",
["Guramalum"] = "grz",
["Gureng Gureng"] = "gnr",
["Gurgula"] = "ggg",
["Guriaso"] = "grx",
["Gurindji"] = "gue",
["Gurjar Apabhramsa"] = "inc-gup",
["Gurmana"] = "gvm",
["Guro"] = "goa",
["Guruntum"] = "grd",
["Gusan"] = "gsn",
["Gusii"] = "guz",
["Gusilay"] = "gsl",
["Guwa"] = "xgw",
["Guwamu"] = "gwu",
["Guwar"] = "aus-guw",
["Guya"] = "gka",
["Guyanese Creole English"] = "gyn",
["Guyani"] = "gvy",
["Guébie"] = "gie",
["Gvoko"] = "ngs",
["Gwa"] = "gwb",
["Gwahatike"] = "dah",
["Gwak"] = "jgk",
["Gwamhi-Wuri"] = "bga",
["Gwandara"] = "gwn",
["Gwara"] = "alv-gwa",
["Gweda"] = "grw",
["Gweno"] = "gwe",
["Gwere"] = "gwr",
["Gyalsumdo"] = "gyo",
["Gyele"] = "gyi",
["Gyem"] = "gye",
["Güenoa"] = "sai-gue",
["Habu"] = "hbu",
["Hadothi"] = "hoj",
["Hadrami"] = "xhd",
["Hadza"] = "hts",
["Haeke"] = "aek",
["Hahon"] = "hah",
["Haigwai"] = "hgw",
["Hainyaxo Bozo"] = "bzx",
["Haiphong Sign Language"] = "haf",
["Haitian Vodoun Culture Language"] = "hvc",
["Haiǁom"] = "hgm",
["Haji"] = "hji",
["Hakö"] = "hao",
["Halang Doan"] = "hld",
["Halia"] = "hla",
["Hamap"] = "hmu",
["Hamba"] = "hba",
["Hamtai"] = "hmt",
["Hanga"] = "hag",
["Hanga Hundi"] = "wos",
["Hanoi Sign Language"] = "hab",
["Harami"] = "xha",
["Haraza"] = "nub-har",
["Haruai"] = "tmd",
["Haruku"] = "hrk",
["Harzani"] = "hrz",
["Hasaitic"] = "sem-has",
["Hasha"] = "ybj",
["Tiếng Ả Rập Hassaniya"] = "mey",
["Tiếng Hatam"] = "had",
["Hausa Sign Language"] = "hsl",
["Haveke"] = "hvk",
["Havu"] = "hav",
["Hawai'i Pidgin Sign Language"] = "hps",
["Hawaiian Creole"] = "hwc",
["Haya"] = "hay",
["Hdi"] = "xed",
["Hehe"] = "heh",
["Helong"] = "heg",
["Helu"] = "elu-prk",
["Hema"] = "nix",
["Hemba"] = "hem",
["Herdé"] = "hed",
["Hermit"] = "llf",
["Hewa"] = "ham",
["Heyo"] = "auk",
["Hibito"] = "hib",
["Hidatsa"] = "hid",
["Highland Konjo"] = "kjk",
["Highland Oaxaca Chontal"] = "chd",
["Highland Puebla Nahuatl"] = "azz",
["Hijuk"] = "hij",
["Himarimã"] = "hir",
["Himyaritic"] = "sem-him",
["Hismaic"] = "sem-his",
["Hitchiti"] = "nai-hit",
["Hitu"] = "htu",
["Hixkaryana"] = "hix",
["Hlepho Phowa"] = "yhl",
["Hlersu"] = "hle",
["Hmar"] = "hmr",
["Hmong Dô"] = "hmv",
["Hmong Shua"] = "hmz",
["Hmwaveke"] = "mrk",
["Ho Chi Minh City Sign Language"] = "hos",
["Hobyót"] = "hoh",
["Hoia Hoia"] = "hhi",
["Holikachuk"] = "hoi",
["Holma"] = "hod",
["Holoholo"] = "hoo",
["Holu"] = "hol",
["Homa"] = "hom",
["Honduran Lenca"] = "len",
["Honduras Sign Language"] = "hds",
["Hone"] = "juh",
["Hong Kong Sign Language"] = "hks",
["Honi"] = "how",
["Horned Miao"] = "hrm",
["Horo"] = "hor",
["Horom"] = "hoe",
["Hote"] = "hot",
["Hoti"] = "hti",
["Hovongan"] = "hov",
["Hoyahoya"] = "hhy",
["Hrangkhol"] = "hra",
["Hruso"] = "hru",
["Huachipaeri"] = "hug",
["Huambisa"] = "hub",
["Huaorani"] = "auc",
["Huarijio"] = "var",
["Huaulu"] = "hud",
["Huautla Mazatec"] = "mau",
["Huave"] = "huv",
["Huaxcaleca Nahuatl"] = "nhq",
["Huba"] = "hbb",
["Huehuetla Tepehua"] = "tee",
["Huetar"] = "cba-hue",
["Huichol"] = "hch",
["Huilliche"] = "huh",
["Huitepec Mixtec"] = "mxs",
["Hukumina"] = "huw",
["Hula"] = "hul",
["Huli"] = "hui",
["Hulung"] = "huk",
["Humene"] = "huf",
["Hun"] = "uth",
["Hunde"] = "hke",
["Hungana"] = "hum",
["Hungarian Sign Language"] = "hsh",
["Hungworo"] = "nat",
["Hunjara-Kaina Ke"] = "hkk",
["Hunnic"] = "xhc",
["Hupla"] = "hap",
["Hutterisch"] = "geh",
["Hwana"] = "hwo",
["Hya"] = "hya",
["Hän"] = "haa",
["Hértevin"] = "hrt",
["I-Wak"] = "iwk",
["Iamalele"] = "yml",
["Iatmul"] = "ian",
["Iau"] = "tmu",
["Ibali Teke"] = "tek",
["Ibani"] = "iby",
["Iberian"] = "xib",
["Iboko"] = "bkp",
["Ibu"] = "ibu",
["Icelandic Sign Language"] = "icl",
["Iceve-Maci"] = "bec",
["Idakho-Isukha-Tiriki"] = "ida",
["Idaté"] = "idt",
["Idere"] = "ide",
["Idesa"] = "ids",
["Idi"] = "idi",
["Idoma"] = "idu",
["Idon"] = "idc",
["Idun"] = "ldb",
["Iduna"] = "viv",
["Ifo"] = "iff",
["Igana"] = "igg",
["Igede"] = "ige",
["Ignaciano"] = "ign",
["Igo"] = "ahl",
["Iguta"] = "nar",
["Igwe"] = "igw",
["Iha"] = "ihp",
["Ihievbe"] = "ihi",
["Ija-Zuba"] = "vki",
["Ik"] = "ikx",
["Ika"] = "ikk",
["Ikaranggal"] = "ikr",
["Ikizu"] = "ikz",
["Iko"] = "iki",
["Ikobi-Mena"] = "meb",
["Ikoma"] = "ntk",
["Ikpeng"] = "txi",
["Ikpeshi"] = "ikp",
["Iku-Gora-Ankwa"] = "ikv",
["Ikulu"] = "ikl",
["Ikwo"] = "iqw",
["Ila"] = "ilb",
["Ile Ape"] = "ila",
["Ilgar"] = "ilg",
["Ili'uun"] = "ilu",
["Ilianen Manobo"] = "mbi",
["Illyrian"] = "xil",
["Ilongot"] = "ilk",
["Ilue"] = "ilv",
["Ilwana"] = "mlk",
["Imbongu"] = "imo",
["Imonda"] = "imn",
["Imroing"] = "imr",
["Inabaknon"] = "abx",
["Inapang"] = "mzu",
["Indanga"] = "bnt-ind",
["Indian Sign Language"] = "ins",
["Indonesian Bajau"] = "bdl",
["Indonesian Sign Language"] = "inl",
["Indri"] = "idr",
["Indus Valley Language"] = "xiv",
["Inebu One"] = "oin",
["Ineseño"] = "inz",
["Inga"] = "inb",
["Inlaod Itneg"] = "iti",
["Inoke-Yate"] = "ino",
["Inonhan"] = "loc",
["Inpui Naga"] = "nkf",
["International Sign"] = "ils",
["Inuinnaqtun"] = "esx-inq",
["Inuit Sign Language"] = "iks",
["Inuktun"] = "esx-ink",
["Ipai"] = "nai-ipa",
["Ipalapa Amuzgo"] = "azm",
["Ipiko"] = "ipo",
["Ipili"] = "ipi",
["Ipulo"] = "ass",
["Iquito"] = "iqu",
["Ir"] = "irr",
["Irantxe"] = "irn",
["Iranun"] = "ill",
["Irarutu"] = "irh",
["Iraya"] = "iry",
["Iresim"] = "ire",
["Iriga Bicolano"] = "bto",
["Irish Sign Language"] = "isg",
["Isabi"] = "isa",
["Isanzu"] = "isn",
["Isarog Agta"] = "agk",
["Isaurian"] = "und-isa",
["Isconahua"] = "isc",
["Isebe"] = "igo",
["Isinai"] = "inn",
["Isirawa"] = "srl",
["Islander Creole English"] = "icr",
["Israeli Sign Language"] = "isr",
["Isthmus Mixe"] = "mir",
["Isu"] = "isu",
["Isubu"] = "szv",
["Italian Sign Language"] = "ise",
["Itawit"] = "itv",
["Iteri"] = "itr",
["Itik"] = "itx",
["Ito"] = "itw",
["Itundujia Mixtec"] = "mce",
["Itzá"] = "itz",
["Iwal"] = "kbm",
["Iwam"] = "iwm",
["Iwur"] = "iwo",
["Ixcatec"] = "ixc",
["Ixcatlán Mazatec"] = "mzi",
["Ixtayutla Mixtec"] = "vmj",
["Ixtenco Otomi"] = "otz",
["Iyayu"] = "iya",
["Iyive"] = "uiv",
["Iyo"] = "nca",
["Iyo'wujwa Chorote"] = "crq",
["Iyojwa'ja Chorote"] = "crt",
["Izere"] = "izr",
["Izi"] = "izz",
["Izi-Ezaa-Ikwo-Mgbo"] = "izi",
["Izora"] = "cbo",
["Iñapari"] = "inp",
["Jabem"] = "jae",
["Jabutí"] = "jbt",
["Jad"] = "jda",
["Jadgali"] = "jdg",
["Jahanka"] = "jad",
["Jair Awyu"] = "awv",
["Jakati"] = "jat",
["Jalapa de Díaz Mazatec"] = "maj",
["Jalkunan"] = "bxl",
["Jamaican Country Sign Language"] = "jcs",
["Jamaican Sign Language"] = "jls",
["Jambi Malay"] = "jax",
["Jamiltepec Mixtec"] = "mxt",
["Jaminjung"] = "djd",
["Jamsay"] = "djm",
["Jamtish"] = "gmq-jmk",
["Jandavra"] = "jnd",
["Janday"] = "jan",
["Jangkang"] = "djo",
["Jangshung"] = "jna",
["Janji"] = "jni",
["Japanese Sign Language"] = "jsl",
["Japrería"] = "jru",
["Jara"] = "jaf",
["Jaru"] = "ddj",
["Jassic"] = "ysc",
["Jawe"] = "jaz",
["Jaya"] = "jyy",
["Jebero"] = "jeb",
["Jeikó"] = "sai-jko",
["Jenaama Bozo"] = "bze",
["Jeng"] = "jeg",
["Jere"] = "jer",
["Jeri Kuo"] = "jek",
["Jerung"] = "jee",
["Jhankot Sign Language"] = "jhs",
["Jiamao"] = "jio",
["Jiba"] = "juo",
["Jibu"] = "jib",
["Jilbe"] = "jie",
["Jili"] = "mgi",
["Jilim"] = "jil",
["Jimi"] = "jmi",
["Jimjimen"] = "jim",
["Jina"] = "jia",
["Jingulu"] = "jig",
["Jiongnai Bunu"] = "pnu",
["Jirajara"] = "sai-jrj",
["Jiru"] = "jrr",
["Jita"] = "jit",
["Joba"] = "job",
["Jofotek-Bromnya"] = "jbr",
["Jola-Fonyi"] = "dyo",
["Jola-Kasa"] = "csk",
["Jonkor Bourmataguil"] = "jeu",
["Jordanian Sign Language"] = "jos",
["Jorá"] = "jor",
["Jowulu"] = "jow",
["Ju"] = "juu",
["Jumla Sign Language"] = "jus",
["Jumli"] = "jml",
["Jungle Inga"] = "inj",
["Juquila Mixe"] = "mxq",
["Jur Modo"] = "bex",
["Jurúna"] = "jur",
["Jutiapa"] = "nai-jtp",
["Juwal"] = "mwb",
["Juxtlahuaca Mixtec"] = "vmc",
["Jwira-Pepesa"] = "jwi",
["Júma"] = "jua",
["Kaamba"] = "xku",
["Kaan"] = "ldl",
["Kaang Chin"] = "ckn",
["Kaansa"] = "gna",
["Kaapor Sign Language"] = "uks",
["Kaba"] = "ksp",
["Kabalai"] = "kvf",
["Kabatei"] = "xkp",
["Kabba-Laka"] = "lap",
["Kabishiana"] = "tup-kab",
["Kabola"] = "klz",
["Kabore One"] = "onk",
["Kabras"] = "lkb",
["Kaburi"] = "uka",
["Kabutra"] = "kbu",
["Kabwa"] = "cwa",
["Kabwari"] = "kcw",
["Kachari"] = "xac",
["Kacipo-Balesi"] = "koe",
["Kaco'"] = "xkk",
["Kadai"] = "kzd",
["Kadara"] = "kad",
["Kadaru"] = "kdu",
["Kadiwéu"] = "kbc",
["Kado"] = "kdv",
["Kadugli"] = "xtc",
["Kaduo"] = "ktp",
["Kaera"] = "jka",
["Kafoa"] = "kpu",
["Kagan Kalagan"] = "kll",
["Kagate"] = "syw",
["Kagoma"] = "kdm",
["Kagoro"] = "xkg",
["Kagulu"] = "kki",
["Kahe"] = "hka",
["Kahua"] = "agw",
["Kaian"] = "kct",
["Kaibobo"] = "kzb",
["Kaidipang"] = "kzp",
["Kaiep"] = "kbw",
["Kaike"] = "kzq",
["Kaiku"] = "kkq",
["Kaimbulawa"] = "zka",
["Kaimbé"] = "xai",
["Kairak"] = "ckr",
["Kairiru"] = "kxa",
["Kairui-Midiki"] = "krd",
["Kais"] = "kzm",
["Kaivi"] = "kce",
["Kaiwá"] = "kgk",
["Kaiy"] = "tcq",
["Kajakse"] = "ckq",
["Kajali"] = "xkj",
["Kajaman"] = "kag",
["Kakabe"] = "kke",
["Kakanda"] = "kka",
["Kakihum"] = "kxe",
["Kako"] = "kkj",
["Kakwa"] = "keo",
["Kala"] = "kcl",
["Kala Lagaw Ya"] = "mwp",
["Kalaamaya"] = "lkm",
["Kalabakan"] = "kve",
["Kalabari"] = "ijn",
["Kalabra"] = "kzz",
["Kalagan"] = "kqe",
["Kalaktang Monpa"] = "kkf",
["Kalam"] = "kmh",
["Kalamsé"] = "knz",
["Kalanadi"] = "wkl",
["Kalanga"] = "kck",
["Kalapuya"] = "kyl",
["Kalarko"] = "kba",
["Kalasuri"] = "xme-kls",
["Kalenjin"] = "kln",
["Kalinago"] = "crb",
["Kalkatungu"] = "ktg",
["Kalou"] = "ywa",
["Kaluli"] = "bco",
["Kalumpang"] = "kli",
["Kam"] = "kdx",
["Kamakan"] = "vkm",
["Kamang"] = "woi",
["Kamano"] = "kbq",
["Kamantan"] = "kci",
["Kamar"] = "keq",
["Kamara"] = "jmr",
["Kamarian"] = "kzx",
["Kamaru"] = "kgx",
["Kamasa"] = "klp",
["Kamasau"] = "kms",
["Kamayurá"] = "kay",
["Kamba"] = "kam",
["Kambaira"] = "kyy",
["Kamberataro"] = "kbv",
["Kamberau"] = "irx",
["Kambiwá"] = "xbw",
["Kami"] = "kmi",
["Kamkata-viri"] = "bsh",
["Kamo"] = "kcq",
["Kamoro"] = "kgq",
["Kamu"] = "xmu",
["Kamwe"] = "hig",
["Kanakuru"] = "kna",
["Kanamari"] = "knm",
["Kanashi"] = "xns",
["Kanasi"] = "soq",
["Kandas"] = "kqw",
["Kandawo"] = "gam",
["Kande"] = "kbs",
["Kang"] = "kyp",
["Kanga"] = "kcp",
["Kanggape"] = "igm",
["Kango"] = "kty",
["Kango-Sua"] = "kzy",
["Kaniet"] = "ktk",
["Kanikkaran"] = "kev",
["Kaningdon-Nindem"] = "kdp",
["Kaningi"] = "kzo",
["Kaningra"] = "knr",
["Kaninuwa"] = "wat",
["Kanite"] = "kmu",
["Kanjari"] = "kft",
["Kanju"] = "kbe",
["Kanowit"] = "kxn",
["Kanoé"] = "kxo",
["Kansa"] = "ksk",
["Kantosi"] = "xkt",
["Kanu"] = "khx",
["Kanufi"] = "kni",
["Kanyok"] = "kny",
["Kao"] = "kax",
["Kaonde"] = "kqn",
["Kap"] = "ykm",
["Kapauri"] = "khp",
["Kapin"] = "tbx",
["Kapinawá"] = "xpn",
["Kapriman"] = "dju",
["Kaptiau"] = "kbi",
["Kapya"] = "klo",
["Kara (New Guinea)"] = "leu",
["Kara (Tanzania)"] = "reg",
["Karadjeri"] = "gbd",
["Karaga Mandaya"] = "mry",
["Karami"] = "xar",
["Karamojong"] = "kdj",
["Karang"] = "kzr",
["Karanga"] = "kth",
["Karankawa"] = "zkk",
["Karas"] = "kgv",
["Karawa"] = "xrw",
["Kare (Africa)"] = "kbn",
["Kare (New Guinea)"] = "kmf",
["Karey"] = "kyd",
["Kari"] = "kbj",
["Karingani"] = "kgn",
["Karipuna"] = "kuq",
["Karipúna"] = "kgm",
["Karipúna Creole French"] = "kmv",
["Kariya"] = "kil",
["Kariyarra"] = "vka",
["Karkar-Yuri"] = "yuj",
["Karkin"] = "krb",
["Karko"] = "kko",
["Karnai"] = "bbv",
["Karo Batak"] = "btx",
["Karok"] = "kyh",
["Karolanos"] = "kyn",
["Karon"] = "krx",
["Karon Dori"] = "kgw",
["Karore"] = "xkx",
["Karranga"] = "xrq",
["Karuwali"] = "rxw",
["Kasanga"] = "ccj",
["Kasem"] = "xsm",
["Kasiguranin"] = "ksn",
["Kaska"] = "kkz",
["Kaskean"] = "zsk",
["Kaskihá"] = "gva",
["Kassite"] = "und-kas",
["Kassonke"] = "kao",
["Kasua"] = "khs",
["Kataang"] = "kgd",
["Katabaga"] = "ktq",
["Katawixi"] = "xat",
["Katembri"] = "sai-kat",
["Kathlamet"] = "nai-kat",
["Kathoriya Tharu"] = "tkt",
["Kathu"] = "ykt",
["Katkari"] = "kfu",
["Katla"] = "kcr",
["Kato"] = "ktw",
["Katso"] = "kaf",
["Katukina"] = "knt",
["Kaulong"] = "pss",
["Kaur"] = "vkk",
["Kaure"] = "bpp",
["Kauwera"] = "xau",
["Kawacha"] = "kcb",
["Kawaiisu"] = "xaw",
["Kawe"] = "kgb",
["Kawishana"] = "awd-kaw",
["Kaxararí"] = "ktx",
["Kaxuyana"] = "kbb",
["Kaya"] = "zra",
["Kayabí"] = "kyz",
["Kayagar"] = "kyt",
["Kayan Mahakam"] = "xay",
["Kayan River Kayan"] = "xkn",
["Kayardild"] = "gyd",
["Kayeli"] = "kzl",
["Kaytetye"] = "gbb",
["Kayupulau"] = "kzu",
["Kazukuru"] = "kzk",
["Ke'o"] = "xxk",
["Keak"] = "keh",
["Keapara"] = "khz",
["Kedang"] = "ksx",
["Keder"] = "kdy",
["Kehu"] = "khh",
["Kei"] = "kei",
["Keiga"] = "kec",
["Kein"] = "bmh",
["Keiyo"] = "eyo",
["Kela-Yela"] = "kel",
["Kelabit"] = "kzi",
["Keley-I Kallahan"] = "ify",
["Keliko"] = "kbo",
["Kelo"] = "xel",
["Kelon"] = "kyo",
["Kemak"] = "kem",
["Kembayan"] = "xem",
["Kemberano"] = "bzp",
["Kembra"] = "xkw",
["Kemezung"] = "dmo",
["Kemi Sami"] = "sjk",
["Kemiehua"] = "kfj",
["Kemtuik"] = "kmt",
["Kenaboi"] = "xbn",
["Kenati"] = "gat",
["Kendayan"] = "knx",
["Kendeje"] = "klf",
["Kendem"] = "kvm",
["Kenga"] = "kyq",
["Keningau Murut"] = "kxi",
["Keninjal"] = "knl",
["Kenswei Nsei"] = "ndb",
["Kenyan Sign Language"] = "xki",
["Kenyi"] = "lke",
["Keoru-Ahia"] = "xeu",
["Kepkiriwát"] = "kpn",
["Kepo'"] = "kuk",
["Kera"] = "ker",
["Kerak"] = "hhr",
["Kereho"] = "xke",
["Kerewe"] = "ked",
["Kerewo"] = "kxz",
["Kerinci"] = "kvr",
["Kesawai"] = "xes",
["Ketangalan"] = "kae",
["Kete"] = "kcv",
["Ketengban"] = "xte",
["Ketum"] = "ktt",
["Kewa"] = "kew",
["Keyagana"] = "kyg",
["Kgalagadi"] = "xkv",
["Khana"] = "ogo",
["Khandeshi"] = "khn",
["Khao"] = "xao",
["Kharam Naga"] = "kfw",
["Kharia Thar"] = "ksy",
["Khayo"] = "lko",
["Khe"] = "kqg",
["Khehek"] = "tlx",
["Khetrani"] = "xhe",
["Khezha Naga"] = "nkh",
["Khirwar"] = "kwx",
["Khisa"] = "kqm",
["Khlor"] = "llo",
["Khlula"] = "ykl",
["Khoibu Naga"] = "nkb",
["Khoini"] = "xkc",
["Kholok"] = "ktc",
["Khumi Chin"] = "cnk",
["Khwe"] = "xuu",
["Kibala"] = "blv",
["Kibena"] = "bez",
["Kibet"] = "kie",
["Kibiri"] = "prm",
["Kichwa"] = "qwe-kch",
["Kikami"] = "kcu",
["Kilit"] = "xme-klt",
["Kilivila"] = "kij",
["Kiliwa"] = "klb",
["Kilmeri"] = "kih",
["Kimaama"] = "kig",
["Kimaragang"] = "kqr",
["Kimbu"] = "kiv",
["Kimki"] = "sbt",
["Kimré"] = "kqp",
["Kinabalian"] = "cbw",
["Kinalakna"] = "kco",
["Kinga"] = "zga",
["Kings River Yokuts"] = "nai-kry",
["Kinikinao"] = "gqn",
["Kinuku"] = "kkd",
["Kioko"] = "ues",
["Kiong"] = "kkm",
["Kiorr"] = "xko",
["Kipfokomo"] = "pkb",
["Kipsigis"] = "sgc",
["Kiput"] = "kyi",
["Kir-Balar"] = "kkr",
["Kire"] = "geb",
["Kirfi"] = "kks",
["Kirikiri"] = "kiy",
["Kirya-Konzel"] = "fkk",
["Kis"] = "kis",
["Kisa"] = "lks",
["Kisankasa"] = "kqh",
["Kisar"] = "kje",
["Kisi"] = "kiz",
["Kita Maninkakan"] = "mwk",
["Kitanemuk"] = "azc-ktn",
["Kitembo"] = "tbt",
["Kitja"] = "gia",
["Kitsai"] = "kii",
["Kiunum"] = "wei",
["Kla"] = "lda",
["Klamath-Modoc"] = "kla",
["Klao"] = "klu",
["Klias River Kadazan"] = "kqt",
["Ko"] = "fuj",
["Koasati"] = "cku",
["Koba"] = "kpd",
["Kobiana"] = "kcj",
["Kobol"] = "kgu",
["Kochila Tharu"] = "thq",
["Kodaku"] = "ksz",
["Kodeoha"] = "vko",
["Kodi"] = "kod",
["Kodia"] = "kwp",
["Koenoem"] = "kcs",
["Kofa"] = "kso",
["Kofei"] = "kpi",
["Kofyar"] = "kwl",
["Kohin"] = "kkx",
["Kohumono"] = "bcs",
["Koi"] = "kkt",
["Koireng"] = "nkd",
["Koitabu"] = "kqi",
["Koiwat"] = "kxt",
["Kok-Nar"] = "gko",
["Kok-Paponk"] = "okg",
["Kokata"] = "ktd",
["Koke"] = "kou",
["Koko-Bera"] = "kkp",
["Kokoda"] = "xod",
["Kokola"] = "kzn",
["Kokota"] = "kkk",
["Kol (Cameroon)"] = "biw",
["Kol (New Guinea)"] = "kol",
["Kola"] = "kvv",
["Kolbila"] = "klc",
["Kolibugan Subanon"] = "skn",
["Kolom"] = "klm",
["Koluwawa"] = "klx",
["Kom (India)"] = "kmm",
["Koma"] = "kmy",
["Komba"] = "kpf",
["Kombai"] = "tyn",
["Kombio"] = "xbi",
["Komering"] = "kge",
["Kominimung"] = "xoi",
["Kompane"] = "kvp",
["Komyandaret"] = "kzv",
["Kon Keu"] = "kkn",
["Konai"] = "kxw",
["Konda"] = "knd",
["Koneraw"] = "kdw",
["Konkomba"] = "xon",
["Konni"] = "kma",
["Kono (Guinea)"] = "knu",
["Kono (Nigeria)"] = "klk",
["Kono (Sierra Leone)"] = "kno",
["Konomala"] = "koa",
["Konomihu"] = "nai-knm",
["Konongo"] = "kcz",
["Konyak Naga"] = "nbe",
["Konyanka Maninka"] = "mku",
["Konzo"] = "koo",
["Kopar"] = "xop",
["Kopkaka"] = "opk",
["Korafe-Yegha"] = "kpr",
["Korak"] = "koz",
["Korana"] = "kqz",
["Korandje"] = "kcy",
["Korean Sign Language"] = "kvk",
["Koreguaje"] = "coe",
["Koresh-e Rostam"] = "okh",
["Korlai Creole Portuguese"] = "vkp",
["Koro (India)"] = "jkr",
["Koro (New Guinea)"] = "kxr",
["Koro (Vanuatu)"] = "krf",
["Koro (West Africa)"] = "kfo",
["Koromfé"] = "kfz",
["Koromira"] = "kqj",
["Koronadal Blaan"] = "bpr",
["Koroni"] = "xkq",
["Korop"] = "krp",
["Koropó"] = "xxr",
["Koroshi"] = "ktl",
["Korowai"] = "khe",
["Korubo"] = "xor",
["Korupun-Sela"] = "kpq",
["Kosadle"] = "kiq",
["Kosarek Yale"] = "kkl",
["Kosena"] = "kze",
["Koshin"] = "kid",
["Kota (Gabon)"] = "koq",
["Kota Bangun Kutai Malay"] = "mqg",
["Kota Marudu Talantang"] = "grm",
["Kota Marudu Tinagas"] = "ktr",
["Kotafon Gbe"] = "kqk",
["Koti"] = "eko",
["Kou"] = "snz",
["Kouya"] = "kyf",
["Kovai"] = "kqb",
["Kove"] = "kvc",
["Kowaki"] = "xow",
["Kowiai"] = "kwh",
["Koy Sanjaq Surat"] = "kqd",
["Koyaga"] = "kga",
["Koyo"] = "koh",
["Koyra Chiini"] = "khq",
["Koyukon"] = "koy",
["Kpagua"] = "kuw",
["Kpala"] = "kpl",
["Kpan"] = "kpk",
["Kpasam"] = "pbn",
["Kpati"] = "koc",
["Kpatili"] = "kym",
["Kpee"] = "cpo",
["Kpelle"] = "kpe",
["Kpessi"] = "kef",
["Kplang"] = "kph",
["Krache"] = "kye",
["Krahô"] = "xra",
["Krenak"] = "kqq",
["Krevinian"] = "zkv",
["Kreye"] = "xre",
["Krikati-Timbira"] = "xri",
["Krim"] = "krm",
["Krisa"] = "ksi",
["Kristang"] = "mcm",
["Krobu"] = "kxb",
["Krongo"] = "kgo",
["Kua"] = "tyu",
["Kua-nsi"] = "ykn",
["Kuamasi"] = "yku",
["Kuan"] = "uan",
["Kuanhua"] = "xnh",
["Kube"] = "kgf",
["Kubi"] = "kof",
["Kubo"] = "jko",
["Kubu"] = "kvb",
["Kucong"] = "lkc",
["Kudu-Camo"] = "kov",
["Kugama"] = "kow",
["Kugbo"] = "kes",
["Kugu-Muminh"] = "xmh",
["Kui (Indonesia)"] = "kvd",
["Kuijau"] = "dkr",
["Kuikúro"] = "kui",
["Kujarge"] = "vkj",
["Kuk"] = "kfn",
["Kukatja"] = "kux",
["Kukele"] = "kez",
["Kukkuzi"] = "urj-kuk",
["Kuku-Mangk"] = "xmq",
["Kuku-Mu'inh"] = "xmp",
["Kuku-Thaypan"] = "typ",
["Kuku-Ugbanh"] = "ugb",
["Kuku-Uwanh"] = "uwa",
["Kuku-Yalanji"] = "gvn",
["Kula"] = "tpg",
["Kulaal"] = "glj",
["Kulere"] = "kul",
["Kulfa"] = "kxj",
["Kulina"] = "xpk",
["Kulisusu"] = "vkl",
["Kulon"] = "uon",
["Kulung"] = "kle",
["Kumak"] = "nee",
["Kumalu"] = "ksl",
["Kumam"] = "kdi",
["Kuman"] = "kue",
["Kumaoni"] = "kfy",
["Kumba"] = "ksm",
["Kumbainggar"] = "kgs",
["Kumbaran"] = "wkb",
["Kumhali"] = "kra",
["Kumu"] = "kmw",
["Kumukio"] = "kuo",
["Kunama"] = "kun",
["Kunbarlang"] = "wlg",
["Kunda"] = "kdn",
["Kunduvadi"] = "wku",
["Kung"] = "kfl",
["Kungarakany"] = "ggk",
["Kungardutyi"] = "gdt",
["Kunggari"] = "kgl",
["Kungkari"] = "lku",
["Kuni"] = "kse",
["Kuni-Boazi"] = "kvg",
["Kunimaipa"] = "kup",
["Kunja"] = "pep",
["Kunjen"] = "kjn",
["Kunyi"] = "njx",
["Kunza"] = "kuz",
["Kuot"] = "kto",
["Kupa"] = "kug",
["Kupang Malay"] = "mkn",
["Kupsabiny"] = "kpz",
["Kur"] = "kuv",
["Kura Ede Nago"] = "nqk",
["Kurama"] = "krh",
["Kuranko"] = "knk",
["Kuri"] = "nbn",
["Kuria"] = "kuj",
["Kurmukar"] = "kfv",
["Kurnai"] = "unn",
["Kurrama"] = "vku",
["Kurti"] = "ktm",
["Kurtjar"] = "gdj",
["Kurudu"] = "kjr",
["Kuruáya"] = "kyr",
["Kusaal"] = "kus",
["Kusaghe"] = "ksg",
["Kustenau"] = "awd-kus",
["Kusu"] = "ksv",
["Kusunda"] = "kgg",
["Kuthant"] = "xut",
["Kutto"] = "kpa",
["Kutu"] = "kdc",
["Kuturmi"] = "khj",
["Kuuk Thaayorre"] = "thd",
["Kuuk Yak"] = "uky",
["Kuuku-Ya'u"] = "kuy",
["Kuvale"] = "olu",
["Kuwaa"] = "blh",
["Kuwaataay"] = "cwt",
["Kuwani"] = "paa-kwn",
["Kwa'"] = "bko",
["Kwaami"] = "ksq",
["Kwadi"] = "kwz",
["Kwaio"] = "kwd",
["Kwaja"] = "kdz",
["Kwak"] = "kwq",
["Kwakum"] = "kwu",
["Kwalhioqua-Tlatskanai"] = "qwt",
["Kwama"] = "kmq",
["Kwambi"] = "kwm",
["Kwamera"] = "tnk",
["Kwami"] = "ktf",
["Kwamtim One"] = "okk",
["Kwang"] = "kvi",
["Kwanga"] = "kwj",
["Kwangali"] = "kwn",
["Kwanka"] = "bij",
["Kwara'ae"] = "kwf",
["Kwasio"] = "nmg",
["Kwaya"] = "kya",
["Kwaza"] = "xwa",
["Kwegu"] = "xwg",
["Kwer"] = "kwr",
["Kwerba"] = "kwe",
["Kwerba Mamberamo"] = "xwr",
["Kwere"] = "cwe",
["Kwerisa"] = "kkb",
["Kwese"] = "kws",
["Kwesten"] = "kwt",
["Kwini"] = "gww",
["Kwinsu"] = "kuc",
["Kwoma"] = "kmo",
["Kwomtari"] = "kwo",
["Kyak"] = "bka",
["Kyaka"] = "kyc",
["Kyan-Karyaw Naga"] = "nqq",
["Kyenele"] = "kql",
["Kyenga"] = "tye",
["Kyerung"] = "kgy",
["Kélé"] = "keb",
["Kómnzo"] = "paa-kom",
["La'bi"] = "lbi",
["Laal"] = "gdm",
["Laba"] = "lau",
["Label"] = "lbb",
["Labir"] = "jku",
["Labo"] = "mwi",
["Labo Phowa"] = "ypb",
["Labu"] = "lbu",
["Labuk-Kinabatangan Kadazan"] = "dtb",
["Lacandon"] = "lac",
["Lachi"] = "lbt",
["Lachiguiri Zapotec"] = "zpa",
["Lachixío Zapotec"] = "zpl",
["Ladji-Ladji"] = "llj",
["Laeko-Libuat"] = "lkl",
["Lafofa"] = "laf",
["Laghu"] = "lgb",
["Laghuu"] = "lgh",
["Lagwan"] = "kot",
["Laha (Indonesia)"] = "lhh",
["Tiếng La Ha"] = "lha",
["Lahanan"] = "lhn",
["Lahu Shi"] = "lhi",
["Lahul Lohar"] = "lhl",
["Laimbue"] = "lmx",
["Laitu Chin"] = "clj",
["Laiyolo"] = "lji",
["Laka"] = "lak",
["Lake Miwok"] = "lmw",
["Lakha"] = "lkh",
["Lakkia"] = "lbc",
["Lakon"] = "lkn",
["Lakondê"] = "lkd",
["Lakota Dida"] = "dic",
["Lala (New Guinea)"] = "nrz",
["Lala (South Africa)"] = "bnt-lal",
["Lala-Bisa"] = "leb",
["Lala-Roba"] = "lla",
["Lalana Chinantec"] = "cnl",
["Lamaholot"] = "slp",
["Lamalera"] = "lmr",
["Lamang"] = "hia",
["Lamatuka"] = "lmq",
["Lamba"] = "lam",
["Lambichhong"] = "lmh",
["Lambya"] = "lai",
["Lame"] = "bma",
["Lamenu"] = "lmu",
["Lamet"] = "lbn",
["Lamja-Dengsa-Tola"] = "ldh",
["Lamma"] = "lev",
["Lamnso'"] = "lns",
["Lamogai"] = "lmg",
["Lampung Api"] = "ljp",
["Lamu"] = "llh",
["Lamu-Lamu"] = "lby",
["Lanas Lobu"] = "ruu",
["Landoma"] = "ldm",
["Lang'e"] = "yne",
["Langam"] = "lnm",
["Langbashe"] = "lna",
["Langi"] = "lag",
["Langnian Buyang"] = "yln",
["Lango (Sudan)"] = "lno",
["Lango (Uganda)"] = "laj",
["Lanima"] = "lnw",
["Lao Naga"] = "nlq",
["Laopang"] = "lbg",
["Laos Sign Language"] = "lso",
["Lapaguía-Guivini Zapotec"] = "ztl",
["Lapine"] = "art-lap",
["Lapuyan Subanun"] = "laa",
["Laragia"] = "lrg",
["Larantuka Malay"] = "lrt",
["Lardil"] = "lbz",
["Larevat"] = "lrv",
["Larike-Wakasihu"] = "alo",
["Laro"] = "lro",
["Larteh"] = "lar",
["Laru"] = "lan",
["Lasgerdi"] = "lsa",
["Lasi"] = "lss",
["Latu"] = "ltu",
["Latvian Sign Language"] = "lsl",
["Lau"] = "llu",
["Laua"] = "luf",
["Lauan"] = "llx",
["Lauje"] = "law",
["Laura"] = "lur",
["Laurentian"] = "lre",
["Lavatbura-Lamusong"] = "lbv",
["Lawangan"] = "lbx",
["Lawu"] = "lwu",
["Lawunuia"] = "tgi",
["Laze"] = "tbq-laz",
["Lealao Chinantec"] = "cle",
["Leco"] = "lec",
["Ledo Kaili"] = "lew",
["Leelau"] = "ldk",
["Lefa"] = "lfa",
["Lega-Mwenga"] = "lgm",
["Lega-Shabunda"] = "lea",
["Legbo"] = "agb",
["Legenyem"] = "lcc",
["Lehali"] = "tql",
["Lehalurup"] = "urr",
["Leinong Naga"] = "lzn",
["Leipon"] = "lek",
["Lela"] = "dri",
["Lelak"] = "llk",
["Lele (Chad)"] = "lln",
["Lele (Congo)"] = "lel",
["Lele (Guinea)"] = "llc",
["Lele (New Guinea)"] = "lle",
["Lelepa"] = "lpa",
["Lembena"] = "leq",
["Lemerig"] = "lrz",
["Lemio"] = "lei",
["Lemolang"] = "ley",
["Lemoro"] = "ldj",
["Lenakel"] = "tnl",
["Lendu"] = "led",
["Lengilu"] = "lgi",
["Lengo"] = "lgr",
["Lengola"] = "lej",
["Lenje"] = "leh",
["Lenkau"] = "ler",
["Lenyima"] = "ldg",
["Lepki"] = "lpe",
["Lere"] = "gnh",
["Lese"] = "les",
["Lesing-Gelimi"] = "let",
["Letemboi"] = "nms",
["Leti (Cameroon)"] = "leo",
["Leti (Indonesia)"] = "lti",
["Levuka"] = "lvu",
["Lewo Eleng"] = "lwe",
["Lewotobi"] = "lwt",
["Leyigha"] = "ayi",
["Lhokpu"] = "lhp",
["Li'o"] = "ljl",
["Liana-Seti"] = "ste",
["Liangmai Naga"] = "njn",
["Liberian Kreyol"] = "lir",
["Libinza"] = "liz",
["Libon Bikol"] = "lbl",
["Liburnian"] = "xli",
["Libyan Sign Language"] = "lbs",
["Ligbi"] = "lig",
["Ligenza"] = "lgz",
["Lihir"] = "lih",
["Lika"] = "lik",
["Liki"] = "lio",
["Likila"] = "lie",
["Likuba"] = "kxx",
["Likum"] = "lib",
["Likwala"] = "kwc",
["Lilau"] = "lll",
["Limassa"] = "bme",
["Limbu"] = "lif",
["Limi"] = "ylm",
["Limilngan"] = "lmc",
["Linear A"] = "lab",
["Lingkhim"] = "lii",
["Lingua Franca Nova"] = "lfn",
["Linngithigh"] = "lnj",
["Lipo"] = "lpo",
["Lisabata-Nuniali"] = "lcs",
["Lisela"] = "lcl",
["Lish"] = "lsh",
["Lishán Didán"] = "trg",
["Lithuanian Sign Language"] = "lls",
["Little Swanport"] = "aus-lsw",
["Litzlitz"] = "lzl",
["Lizu"] = "sit-liz",
["Lo-Toga"] = "lht",
["Loarki"] = "lrk",
["Lobala"] = "loq",
["Logo"] = "log",
["Logol"] = "lof",
["Logooli"] = "rag",
["Logorik"] = "liu",
["Lokaa"] = "yaz",
["Loko"] = "lok",
["Lokoya"] = "lky",
["Lola"] = "lcd",
["Lolak"] = "llq",
["Lole"] = "llg",
["Lolo"] = "llb",
["Loloda"] = "loa",
["Lolopo"] = "ycl",
["Lomaiviti"] = "lmv",
["Lomakka"] = "loi",
["Lombi"] = "lmi",
["Lombo"] = "loo",
["Lomwe"] = "ngl",
["Loncong"] = "lce",
["Long Phuri Naga"] = "lpn",
["Long Wat"] = "ttw",
["Longgu"] = "lgu",
["Longto"] = "wok",
["Longuda"] = "lnu",
["Loniu"] = "los",
["Lonwolwol"] = "crc",
["Loo"] = "ldo",
["Lopa"] = "lop",
["Lope"] = "yiu",
["Lopi"] = "lov",
["Lopit"] = "lpx",
["Lorang"] = "lrn",
["Lorediakarkar"] = "lnn",
["Lote"] = "uvl",
["Lotud"] = "dtr",
["Lotuko"] = "lot",
["Loun"] = "lox",
["Loup A"] = "xlo",
["Loup B"] = "xlb",
["Lovono"] = "vnk",
["Lower Burdekin"] = "xbb",
["Lower Chehalis"] = "cea",
["Lower Grand Valley Dani"] = "dni",
["Lower Nossob"] = "nsb",
["Lower Southern Aranda"] = "axl",
["Lower Ta'oih"] = "tto",
["Lowland Oaxaca Chontal"] = "clo",
["Lowland Tarahumara"] = "tac",
["Loxicha Zapotec"] = "ztp",
["Lozi"] = "loz",
["Luang"] = "lex",
["Luba-Kasai"] = "lua",
["Lubila"] = "kcc",
["Lubu"] = "lcf",
["Lubuagan Kalinga"] = "knb",
["Luchazi"] = "lch",
["Lufu"] = "ldq",
["Lugbara"] = "lgg",
["Luguru"] = "ruf",
["Luhu"] = "lcq",
["Luimbi"] = "lum",
["Luiseño"] = "lui",
["Lule"] = "ule",
["Lule Sami"] = "smj",
["Lumba-Yakkha"] = "luu",
["Lumbee"] = "lmz",
["Lumun"] = "lmd",
["Lun Bawang"] = "lnd",
["Luna"] = "luj",
["Lunda"] = "lun",
["Lungga"] = "lga",
["Luo"] = "luo",
["Luopohe Hmong"] = "hml",
["Luri (Nigeria)"] = "ldd",
["Lusengo"] = "lse",
["Lusi"] = "khl",
["Lusitanian"] = "xls",
["Lutachoni"] = "lts",
["Lutos"] = "ndy",
["Luvale"] = "lue",
["Luwati"] = "luv",
["Luwo"] = "lwo",
["Luyana"] = "lyn",
["Lwalu"] = "lwa",
["Lwel"] = "lvl",
["Lyélé"] = "lee",
["Tiếng Láadan"] = "ldn",
["Láá Láá Bwamu"] = "bwj",
["Ma"] = "msj",
["Ma Manda"] = "skc",
["Ma'di"] = "mhi",
["Ma'ya"] = "slz",
["Maba"] = "mqa",
["Mabaale"] = "mmz",
["Mabaka Valley Kalinga"] = "kkg",
["Mabire"] = "muj",
["Maca"] = "mca",
["Macaguaje"] = "mcl",
["Macaguán"] = "mbn",
["Macanese"] = "mzs",
["Macau Pidgin Portuguese"] = "crp-mpp",
["Machame"] = "jmc",
["Machiguenga"] = "mcb",
["Machinere"] = "mpd",
["Machinga"] = "mvw",
["Macoris"] = "nai-mac",
["Macuna"] = "myy",
["Mada (Cameroon)"] = "mxu",
["Mada (Nigeria)"] = "mda",
["Madagascar Sign Language"] = "mzc",
["Madak"] = "mmx",
["Maden"] = "xmx",
["Madhi Madhi"] = "dmd",
["Madi"] = "grg",
["Madngele"] = "zml",
["Madukayang Kalinga"] = "kmd",
["Mae"] = "mme",
["Maek"] = "hmk",
["Maeng Itneg"] = "itt",
["Mafa"] = "maf",
["Mafea"] = "mkv",
["Mag-Anchi Ayta"] = "sgb",
["Mag-Indi Ayta"] = "blx",
["Magadhi Prakrit"] = "inc-mgd",
["Magahat"] = "mtw",
["Magdalena Peñasco Mixtec"] = "xtm",
["Magiyi"] = "gmg",
["Magoma"] = "gmx",
["Magɨ"] = "gkd",
["Mahican"] = "mjy",
["Mahongwe"] = "mhb",
["Mahou"] = "mxx",
["Tiếng Maia"] = "sks",
["Maiadomu"] = "mzz",
["Maiani"] = "tnh",
["Maii"] = "mmm",
["Mailu"] = "mgu",
["Maindo"] = "cwb",
["Mairasi"] = "zrs",
["Maisin"] = "mbq",
["Maiwa (Indonesia)"] = "wmm",
["Maiwa (New Guinea)"] = "mti",
["Maiwala"] = "mum",
["Majera"] = "xmj",
["Majhi"] = "mjz",
["Majhwar"] = "mmj",
["Mak (China)"] = "mkg",
["Mak (Nigeria)"] = "pbl",
["Makaa"] = "mcp",
["Makah"] = "myh",
["Makalero"] = "mjb",
["Makasae"] = "mkz",
["Makassar Malay"] = "mfp",
["Makayam"] = "aup",
["Makhuwa"] = "vmw",
["Makhuwa-Marrevone"] = "xmc",
["Makhuwa-Meetto"] = "mgh",
["Makhuwa-Moniga"] = "mhm",
["Makhuwa-Saka"] = "xsq",
["Makhuwa-Shirima"] = "vmk",
["Maklew"] = "mgf",
["Makolkol"] = "zmh",
["Makonde"] = "kde",
["Maku"] = "xak",
["Maku'a"] = "lva",
["Makuri Naga"] = "jmn",
["Makuráp"] = "mpu",
["Makwe"] = "ymk",
["Makyan Naga"] = "umn",
["Mal Paharia"] = "mkb",
["Mala (New Guinea)"] = "ped",
["Mala (Nigeria)"] = "ruy",
["Malaccan Creole Malay"] = "ccm",
["Malalamai"] = "mmt",
["Malalí"] = "sai-mal",
["Malango"] = "mln",
["Malas"] = "mkr",
["Malasanga"] = "mqz",
["Malawi Lomwe"] = "lon",
["Malawian Sign Language"] = "lws",
["Malayic Dayak"] = "xdy",
["Malaynon"] = "mlz",
["Malaysian Sign Language"] = "xml",
["Malba Birifor"] = "bfo",
["Male"] = "mdc",
["Maleu-Kilenge"] = "mgl",
["Malfaxal"] = "mlx",
["Malgana"] = "vml",
["Malgbe"] = "mxf",
["Mali"] = "gcc",
["Malibu"] = "sai-mlb",
["Malila"] = "mgq",
["Malimba"] = "mzd",
["Malimpung"] = "mli",
["Malol"] = "mbk",
["Maltese Sign Language"] = "mdl",
["Malua Bay"] = "mll",
["Malvi"] = "mup",
["Maléku Jaíka"] = "gut",
["Mam"] = "mam",
["Mama"] = "mma",
["Mamaa"] = "mhf",
["Mamaindé"] = "wmd",
["Mamanwa"] = "mmn",
["Tiếng Senoufo Mamara"] = "myk",
["Mamasa"] = "mqj",
["Mambae"] = "mgm",
["Mambai"] = "mcs",
["Mamboru"] = "mvd",
["Mambwe-Lungu"] = "mgr",
["Mamuju"] = "mqx",
["Mamulique"] = "emm",
["Mamusi"] = "kdf",
["Mamvu"] = "mdi",
["Man Met"] = "mml",
["Manado Malay"] = "xmm",
["Manam"] = "mva",
["Manambu"] = "mle",
["Manangba"] = "nmm",
["Manangkari"] = "znk",
["Manao"] = "awd-man",
["Manda (Australia)"] = "zma",
["Manda (Tanzania)"] = "mgs",
["Mandaic"] = "mid",
["Mandailing Batak"] = "btm",
["Mandalorian"] = "art-man",
["Mandan"] = "mhq",
["Mandandanyi"] = "zmk",
["Mandar"] = "mdr",
["Mandari"] = "mqu",
["Mander"] = "mqr",
["Mandingo"] = "man",
["Mandjak"] = "mfv",
["Mandobo Atas"] = "aax",
["Mandobo Bawah"] = "bwp",
["Manem"] = "jet",
["Mangala"] = "mem",
["Mangarayi"] = "mpc",
["Mangarevan"] = "mrv",
["Mangayat"] = "myj",
["Mangbetu"] = "mdj",
["Mangbutu"] = "mdk",
["Mangerr"] = "zme",
["Mangga Buang"] = "mmo",
["Tiếng Mango"] = "mge",
["Mangole"] = "mqc",
["Mangseng"] = "mbh",
["Manigri-Kambolé Ede Nago"] = "xkb",
["Manikion"] = "mnx",
["Manipa"] = "mqp",
["Mankiyali"] = "nlm",
["Manna-Dora"] = "mju",
["Manombai"] = "woo",
["Mansoanka"] = "msw",
["Manta"] = "myg",
["Mantsi"] = "nty",
["Manusela"] = "wha",
["Manya"] = "mzj",
["Manyawa"] = "mny",
["Manza"] = "mzv",
["Mao Naga"] = "nbi",
["Mape"] = "mlh",
["Mapena"] = "mnm",
["Mapia"] = "mpy",
["Mapidian"] = "mpw",
["Mapoyo"] = "mcg",
["Mapun"] = "sjm",
["Mara"] = "mec",
["Mara Chin"] = "mrh",
["Marachi"] = "lri",
["Maraghei"] = "vmh",
["Maragus"] = "mrs",
["Maram Naga"] = "nma",
["Marama"] = "lrm",
["Maranungku"] = "zmr",
["Mararit"] = "mgb",
["Maratino"] = "sai-mar",
["Marawan"] = "awd-mar",
["Marba"] = "mpg",
["Marenje"] = "vmr",
["Marfa"] = "mvu",
["Margany"] = "zmc",
["Marghi South"] = "mfm",
["Margi"] = "mrt",
["Maria"] = "mds",
["Mariaté"] = "awd-mrt",
["Maridan"] = "zmd",
["Maridjabin"] = "zmj",
["Marik"] = "dad",
["Marimanindji"] = "zmm",
["Marind"] = "mrz",
["Maring"] = "mbw",
["Maringarr"] = "zmt",
["Marino"] = "mrb",
["Mariri"] = "mqi",
["Maritime Sign Language"] = "nsr",
["Maritsauá"] = "msp",
["Mariyedi"] = "zmy",
["Marka"] = "rkm",
["Markweeta"] = "enb",
["Maroon Spirit Language"] = "cpe-mar",
["Marovo"] = "mvo",
["Marrgu"] = "mhg",
["Marriammu"] = "xru",
["Marrithiyel"] = "mfr",
["Martha's Vineyard Sign Language"] = "mre",
["Marti Ke"] = "zmg",
["Martu Wangka"] = "mpj",
["Marúbo"] = "mzr",
["Masaba"] = "myx",
["Masadiit Itneg"] = "tis",
["Masakará"] = "sai-msk",
["Masalit"] = "mls",
["Masana"] = "mcn",
["Masbate Sorsogon"] = "bks",
["Mashco Piro"] = "cuj",
["Mashi"] = "mho",
["Masimasi"] = "ism",
["Masiwang"] = "bnf",
["Maslam"] = "msv",
["Masmaje"] = "mes",
["Massachusett"] = "wam",
["Massalat"] = "mdg",
["Massep"] = "mvs",
["Matagalpa"] = "mtn",
["Matanawi"] = "sai-mat",
["Matbat"] = "xmt",
["Matengo"] = "mgv",
["Matepi"] = "mqe",
["Matigsalug Manobo"] = "mbt",
["Matipuhy"] = "mzo",
["Matlatzinca"] = "mat",
["Mato"] = "met",
["Mato Grosso Arára"] = "axg",
["Matsés"] = "mcf",
["Mattole"] = "mvb",
["Matukar"] = "mjk",
["Matumbi"] = "mgw",
["Matya Samo"] = "stj",
["Matís"] = "mpq",
["Mauritian Sign Language"] = "lsy",
["Mauwake"] = "mhl",
["Mawa"] = "mcw",
["Mawak"] = "mjj",
["Mawan"] = "mcz",
["Mawayana"] = "mzx",
["Mawchi"] = "mke",
["Mawes"] = "mgk",
["Maxakalí"] = "mbl",
["Maxi Gbe"] = "mxl",
["Maya Samo"] = "sym",
["Mayaguduna"] = "xmy",
["Mayangna"] = "yan",
["Mayawali"] = "yxa",
["Maybrat"] = "ayz",
["Mayeka"] = "myc",
["Mayi-Thakurti"] = "xyt",
["Maykulan"] = "mnt",
["Maynas"] = "sai-mys",
["Mayo"] = "mfy",
["Mayogo"] = "mdm",
["Mayoyao Ifugao"] = "ifu",
["Maypure"] = "awd-mpr",
["Mazagway"] = "dkx",
["Mazaltepec Zapotec"] = "zpy",
["Mazatlán Mazatec"] = "vmz",
["Mazatlán Mixe"] = "mzl",
["Mba"] = "mfc",
["Mbala"] = "mdp",
["Mbalanhu"] = "lnb",
["Mbandja"] = "zmz",
["Mbangala"] = "mxg",
["Mbangi"] = "mgn",
["Mbangwe"] = "zmn",
["Mbara (Australia)"] = "mvl",
["Mbara (Chad)"] = "mpk",
["Mbariman-Gudhinma"] = "zmv",
["Mbati"] = "mdn",
["Mbato"] = "gwa",
["Mbay"] = "myb",
["Mbe"] = "mfo",
["Mbe'"] = "mtk",
["Mbelime"] = "mql",
["Mbere"] = "mdt",
["Mbesa"] = "zms",
["Mbiywom"] = "aus-mbi",
["Mbo (Cameroon)"] = "mbo",
["Mbo (Congo)"] = "zmw",
["Mboi"] = "moi",
["Mboko"] = "mdu",
["Mbole"] = "mdq",
["Mbonga"] = "xmb",
["Mbongno"] = "bgu",
["Mbosi"] = "mdw",
["Mbowe"] = "mxo",
["Mbre"] = "mka",
["Mbu'"] = "muc",
["Mbudum"] = "xmd",
["Mbugu"] = "mhd",
["Mbugwe"] = "mgz",
["Mbuko"] = "mqb",
["Mbukushu"] = "mhw",
["Mbula"] = "mna",
["Mbula-Bwazza"] = "mbu",
["Mbule"] = "mlb",
["Mbulungish"] = "mbv",
["Mbum"] = "mdd",
["Mbunda"] = "mck",
["Mbunga"] = "mgy",
["Mburku"] = "bbt",
["Mbuun"] = "zmp",
["Mbwela"] = "mfu",
["Mea"] = "meg",
["Mebu"] = "mjn",
["Mecayapan Nahuatl"] = "nhx",
["Medebur"] = "mjm",
["Medefaidrin"] = "dmf",
["Mednyj Aleut"] = "mud",
["Mefele"] = "mfj",
["Megam"] = "mef",
["Mehek"] = "nux",
["Mehináku"] = "mmh",
["Mekeo"] = "mek",
["Mekmek"] = "mvk",
["Mekwei"] = "msf",
["Mekéns"] = "skf",
["Mel-Khaonh"] = "hkn",
["Mele-Fila"] = "mxe",
["Mendalam Kayan"] = "xkd",
["Mengaka"] = "xmg",
["Mengen"] = "mee",
["Menien"] = "sai-men",
["Menka"] = "mea",
["Menya"] = "mcr",
["Meoswar"] = "mvx",
["Mer"] = "mnu",
["Meramera"] = "mxm",
["Merei"] = "lmb",
["Merey"] = "meq",
["Merlav"] = "mrm",
["Meroitic"] = "xmr",
["Meru"] = "mer",
["Mese"] = "mci",
["Mesme"] = "zim",
["Mesmes"] = "mys",
["Meta'"] = "mgo",
["Metlatónoc Mixtec"] = "mxv",
["Mewari"] = "mtr",
["Mewati"] = "wtm",
["Mexican Sign Language"] = "mfs",
["Meyah"] = "mej",
["Mezontla Popoloca"] = "pbe",
["Mfinu"] = "zmf",
["Mfumte"] = "nfu",
["Mgbo"] = "gmz",
["Mian"] = "mpt",
["Miani"] = "pla",
["Micha"] = "yiq",
["Michif"] = "crg",
["Michigamea"] = "cmm",
["Michoacán Nahuatl"] = "ncl",
["Mid Grand Valley Dani"] = "dnt",
["Mid-Southern Banda"] = "bjo",
["Middle Assamese"] = "inc-mas",
["Middle Bengali"] = "inc-mbn",
["Tiếng Cornwall trung đại"] = "cnx",
["Middle Kannada"] = "dra-mkn",
["Middle Median"] = "xme-mid",
["Middle Newar"] = "nwx",
["Tiếng Na Uy trung đại"] = "gmq-mno",
["Middle Watut"] = "mpl",
["Midob"] = "mei",
["Migaama"] = "mmy",
["Migabac"] = "mpp",
["Miji"] = "sjl",
["Miju"] = "mxj",
["Mikasuki"] = "mik",
["Milang"] = "und-mil",
["Mili"] = "ymh",
["Millcayac"] = "sai-mil",
["Miltu"] = "mlj",
["Miluk"] = "iml",
["Milyan"] = "imy",
["Mimi of Decorse"] = "und-mmd",
["Mimi of Nachtigal"] = "und-mmn",
["Mina"] = "hna",
["Minaean"] = "inm",
["Minang"] = "xrg",
["Minanibai"] = "mcv",
["Minaveha"] = "mvn",
["Minderico"] = "drc",
["Mindiri"] = "mpn",
["Mingang Doso"] = "mko",
["Mingo"] = "iro-min",
["Minica Huitoto"] = "hto",
["Minidien"] = "wii",
["Minigir"] = "vmg",
["Minjungbal"] = "xjb",
["Minkin"] = "xxm",
["Minoan"] = "omn",
["Minokok"] = "mqq",
["Miraya Bikol"] = "rbl",
["Mire"] = "mvh",
["Miriti"] = "mmv",
["Miriwoong Sign Language"] = "rsm",
["Miriwung"] = "mep",
["Mirpur Panjabi"] = "pmu",
["Misantla Totonac"] = "tlc",
["Miship"] = "mjs",
["Misima-Paneati"] = "mpx",
["Mitlatongo Mixtec"] = "vmm",
["Mittu"] = "mwu",
["Mituku"] = "zmq",
["Miu"] = "mpo",
["Miwa"] = "vmi",
["Mixed Great Andamanese"] = "gac",
["Mixifore"] = "mfg",
["Mixtepec Mixtec"] = "mix",
["Mixtepec Zapotec"] = "zpm",
["Miya"] = "mkf",
["Miyobe"] = "soy",
["Mlap"] = "kja",
["Mlomp"] = "mlo",
["Mmaala"] = "mmu",
["Mmani"] = "buy",
["Mmen"] = "bfm",
["Mo"] = "wkd",
["Mo'da"] = "gbn",
["Moabite"] = "obm",
["Moba"] = "mfq",
["Mobilian"] = "mod",
["Mobumrin Aizi"] = "ahm",
["Mocana"] = "sai-mcn",
["Mochi"] = "old",
["Mochica"] = "omc",
["Mocho"] = "mhc",
["Mocoví"] = "moc",
["Modang"] = "mxd",
["Modole"] = "mqo",
["Moere"] = "mvq",
["Mofu-Gudur"] = "mif",
["Mogum"] = "mou",
["Moi (Congo)"] = "mow",
["Moi (Indonesia)"] = "mxn",
["Moikodi"] = "mkp",
["Moingi"] = "mwz",
["Mojave"] = "mov",
["Moji"] = "ymi",
["Mok"] = "mqt",
["Mokerang"] = "mft",
["Mokole"] = "mkl",
["Mokpwe"] = "bri",
["Molale"] = "mbe",
["Moldova Sign Language"] = "vsi",
["Molengue"] = "bxc",
["Molima"] = "mox",
["Molmo One"] = "aun",
["Molo"] = "zmo",
["Molof"] = "msl",
["Moloko"] = "mlw",
["Mom Jango"] = "ver",
["Moma"] = "myl",
["Momare"] = "msz",
["Mombo Dogon"] = "dmb",
["Mombum"] = "mso",
["Momina"] = "mmb",
["Momuna"] = "mqf",
["Monastic Sign Language"] = "mzg",
["Mondropolon"] = "npn",
["Mondé"] = "mnd",
["Mongol"] = "mgt",
["Mongolian Sign Language"] = "msr",
["Moni"] = "mnz",
["Monimbo"] = "mom",
["Mono (California)"] = "mnr",
["Mono (Cameroon)"] = "mru",
["Mono (Congo)"] = "mnh",
["Monsang Naga"] = "nmh",
["Montagnais"] = "moe",
["Montana Salish"] = "fla",
["Montol"] = "mtl",
["Monumbo"] = "mxk",
["Monzombo"] = "moj",
["Moo"] = "gwg",
["Mopan Maya"] = "mop",
["Mor (Austronesian)"] = "mhz",
["Mor (Papuan)"] = "moq",
["Moraid"] = "msg",
["Moran"] = "sit-mor",
["Morawa"] = "mze",
["Morelos Nahuatl"] = "nhm",
["Morerebi"] = "xmo",
["Moresada"] = "msx",
["Mori Atas"] = "mzq",
["Mori Bawah"] = "xmz",
["Morigi"] = "mdb",
["Moroccan Sign Language"] = "xms",
["Morom"] = "bdo",
["Moronene"] = "mqn",
["Morori"] = "mok",
["Morouas"] = "mrp",
["Mortlockese"] = "mrl",
["Moru"] = "mgd",
["Mosimo"] = "mqv",
["Moskona"] = "mtj",
["Motembo"] = "tmv",
["Mouk-Aria"] = "mwh",
["Mount Iraya Agta"] = "atl",
["Mount Iriga Agta"] = "agz",
["Mountain Koiari"] = "kpx",
["Mouwase"] = "jmw",
["Movima"] = "mzp",
["Moyadan Itneg"] = "ity",
["Mozambican Sign Language"] = "mzy",
["Mpalitjanh"] = "xpj",
["Mpiemo"] = "mcx",
["Mpiin"] = "bnt-mpi",
["Mpinda"] = "pnd",
["Mpongmpong"] = "mgg",
["Mpoto"] = "mpa",
["Mpotovoro"] = "mvt",
["Mpuono"] = "bnt-mpu",
["Mpur"] = "akc",
["Mro Chin"] = "cmr",
["Mru"] = "mro",
["Mser"] = "kqx",
["Mualang"] = "mtd",
["Mubami"] = "tsx",
["Mubi"] = "mub",
["Mucuchí"] = "sai-muc",
["Muda"] = "ymd",
["Muduapa"] = "wiv",
["Muellama"] = "sai-mue",
["Mufian"] = "aoj",
["Muher"] = "sem-mhr",
["Muinane"] = "bmr",
["Mukha-Dora"] = "mmk",
["Mukulu"] = "moz",
["Mulaha"] = "mfw",
["Mulam"] = "mlm",
["Mulao"] = "giu",
["Mullukmulluk"] = "mpb",
["Muluridyi"] = "vmu",
["Mum"] = "kqa",
["Mumuye"] = "mzm",
["Mundang"] = "mua",
["Mundani"] = "mnf",
["Mundat"] = "mmf",
["Mundolinco"] = "art-mun",
["Mundurukú"] = "myu",
["Mungaka"] = "mhk",
["Mungbam"] = "mij",
["Mungkip"] = "mpv",
["Muniche"] = "myr",
["Munit"] = "mtc",
["Mur Pano"] = "tkv",
["Muratayak"] = "asx",
["Murik (Malaysia)"] = "mxr",
["Murik (New Guinea)"] = "mtf",
["Murkim"] = "rmh",
["Murrinh-Patha"] = "mwf",
["Murui Huitoto"] = "huu",
["Murupi"] = "mqw",
["Muruwari"] = "zmu",
["Musan"] = "mmp",
["Musar"] = "mmi",
["Musasa"] = "smm",
["Musey"] = "mse",
["Musgu"] = "mug",
["Muskum"] = "mje",
["Musom"] = "msu",
["Mussau-Emira"] = "emi",
["Mutu"] = "tuc",
["Muya"] = "mvm",
["Muyang"] = "muy",
["Muyuw"] = "myw",
["Muzi"] = "ymz",
["Muzo"] = "sai-muz",
["Mvanip"] = "mcj",
["Mvuba"] = "mxh",
["Mwaghavul"] = "sur",
["Mwali Comorian"] = "wlc",
["Mwani"] = "wmw",
["Mwatebu"] = "mwa",
["Mwera"] = "mwe",
["Mwimbi-Muthambi"] = "mws",
["Mysian"] = "yms",
["Mzieme Naga"] = "nme",
["Mághdì"] = "gmd",
["Mün Chin"] = "mwq",
["Mündü"] = "muh",
["N'Ko"] = "nqo",
["Na"] = "nbt",
["Na'vi"] = "art-nav",
["Naaba"] = "nao",
["Naba"] = "mne",
["Nabak"] = "naf",
["Nabi"] = "mty",
["Nachering"] = "ncd",
["Nadruvian"] = "ndf",
["Nadëb"] = "mbj",
["Nafi"] = "srf",
["Nafri"] = "nxx",
["Naga Pidgin"] = "nag",
["Nagarchal"] = "nbg",
["Nage"] = "nxe",
["Nagtipunan Agta"] = "phi-nag",
["Nagu"] = "ngr",
["Nagumi"] = "ngv",
["Nahali"] = "nlx",
["Nahari"] = "nhh",
["Nahavaq"] = "sns",
["Nai"] = "bio",
["Najdi Arabic"] = "ars",
["Naka'ela"] = "nae",
["Nakai"] = "nkj",
["Nakame"] = "nib",
["Nakanai"] = "nak",
["Nakara"] = "nck",
["Nake"] = "nbk",
["Naki"] = "mff",
["Nakwi"] = "nax",
["Nalca"] = "nlc",
["Nali"] = "nss",
["Nalik"] = "nal",
["Nalu"] = "naj",
["Nalögo"] = "nlz",
["Namakura"] = "nmk",
["Namat"] = "nkm",
["Nambo"] = "ncm",
["Nambya"] = "nmq",
["Namia"] = "nnm",
["Namiae"] = "nvm",
["Namibian Sign Language"] = "nbs",
["Namla"] = "naa",
["Namo"] = "mxw",
["Namonuito"] = "nmt",
["Namosi-Naitasiri-Serua"] = "bwb",
["Namuyi"] = "nmy",
["Nancere"] = "nnc",
["Nande"] = "nnb",
["Nandi"] = "niq",
["Nanerigé Sénoufo"] = "sen",
["Nanga Dama Dogon"] = "nzz",
["Nanti"] = "cox",
["Nanticoke"] = "nnt",
["Nanubae"] = "afk",
["Naolan"] = "nai-nao",
["Napu"] = "npy",
["Nar Phu"] = "npa",
["Nara"] = "nrb",
["Narak"] = "nac",
["Narango"] = "nrg",
["Narau"] = "nxu",
["Narim"] = "loh",
["Naro"] = "nhr",
["Narom"] = "nrm",
["Narragansett"] = "xnt",
["Narungga"] = "nnr",
["Naruo"] = "ylo",
["Nasal"] = "nsy",
["Nasarian"] = "nvh",
["Nasioi"] = "nas",
["Nasu"] = "ywq",
["Natagaimas"] = "nts",
["Natchez"] = "ncz",
["Nathembo"] = "nte",
["Natioro"] = "nti",
["Natú"] = "sai-nat",
["Natügu"] = "ntu",
["Nauete"] = "nxa",
["Nauna"] = "ncn",
["Nauo"] = "nwo",
["Navarro-Aragonese"] = "roa-oan",
["Navut"] = "nsw",
["Nawaru"] = "nwr",
["Nawathinehena"] = "nwa",
["Nawdm"] = "nmz",
["Nawuri"] = "naw",
["Nayi"] = "noz",
["Ncane"] = "ncr",
["Nchumbulu"] = "nlu",
["Nda'nda'"] = "nnz",
["Ndai"] = "gke",
["Ndaka"] = "ndk",
["Ndali"] = "ndh",
["Ndam"] = "ndm",
["Ndamba"] = "ndj",
["Ndambomo"] = "nxo",
["Ndasa"] = "nda",
["Nde-Gbite"] = "ned",
["Nde-Nsele-Nta"] = "ndd",
["Ndemli"] = "nml",
["Ndendeule"] = "dne",
["Ndengereko"] = "ndg",
["Nding"] = "eli",
["Ndjébbana"] = "djj",
["Ndo"] = "ndp",
["Ndobo"] = "ndw",
["Ndoe"] = "nbb",
["Ndolo"] = "ndl",
["Ndom"] = "nqm",
["Ndombe"] = "ndq",
["Ndoola"] = "ndr",
["Ndrulo"] = "dno",
["Nduga"] = "ndx",
["Ndumu"] = "nmd",
["Ndunda"] = "nuh",
["Ndunga"] = "ndt",
["Ndut"] = "ndv",
["Ndyuka-Trio Pidgin"] = "njt",
["Ndzwani Comorian"] = "wni",
["Nedebang"] = "nec",
["Nefamese"] = "nef",
["Negeri Sembilan Malay"] = "zmi",
["Nehan"] = "nsn",
["Nek"] = "nif",
["Nekgini"] = "nkg",
["Neko"] = "nej",
["Neku"] = "nek",
["Neme"] = "nex",
["Nemi"] = "nem",
["Nen"] = "nqn",
["Nend"] = "anh",
["Nengone"] = "nen",
["Neo"] = "neu",
["Nepalese Sign Language"] = "nsp",
["Nepali Kurux"] = "kxl",
["Nete"] = "net",
["Neve'ei"] = "vnm",
["Neverver"] = "lgk",
["New Caledonian Javanese"] = "jas",
["New River Shasta"] = "nai-nrs",
["New Zealand Sign Language"] = "nzs",
["Neyo"] = "ney",
["Nez Perce"] = "nez",
["Nga La"] = "hlt",
["Ngaanyatjarra"] = "ntj",
["Ngadjunmaya"] = "nju",
["Ngadjuri"] = "jui",
["Ngaing"] = "nnf",
["Ngaju"] = "nij",
["Ngala"] = "nud",
["Ngalakan"] = "nig",
["Ngalkbun"] = "ngk",
["Ngamambo"] = "nbv",
["Ngamini"] = "nmv",
["Ngamo"] = "nbh",
["Ngan'gityemerri"] = "nam",
["Nganakarti"] = "xnk",
["Ngandi"] = "nid",
["Ngando (Central African Republic)"] = "ngd",
["Ngando (Congo)"] = "nxd",
["Ngandyera"] = "nne",
["Ngangam"] = "gng",
["Ngantangarra"] = "ntg",
["Nganyaywana"] = "nyx",
["Ngardi"] = "rxd",
["Ngarigu"] = "xni",
["Ngarinman"] = "nbj",
["Ngarinyin"] = "ung",
["Ngarla"] = "nrk",
["Ngarluma"] = "nrl",
["Ngarrindjeri"] = "nay",
["Ngasa"] = "nsg",
["Ngatik Men's Creole"] = "ngm",
["Ngawn Chin"] = "cnw",
["Ngawun"] = "nxn",
["Ngazidja Comorian"] = "zdj",
["Ngbaka"] = "nga",
["Ngbaka Ma'bo"] = "nbm",
["Ngbaka Manza"] = "ngg",
["Ngbee"] = "jgb",
["Ngbinda"] = "nbd",
["Ngbundu"] = "nuu",
["Ngelima"] = "agh",
["Ngemba"] = "nge",
["Ngen"] = "gnj",
["Ngendelengo"] = "nql",
["Ngeq"] = "ngt",
["Ngete"] = "nnn",
["Nggem"] = "nbq",
["Nggwahyi"] = "ngx",
["Ngie"] = "ngj",
["Ngile"] = "jle",
["Ngindo"] = "nnq",
["Ngiti"] = "niy",
["Ngizim"] = "ngi",
["Ngkoth"] = "aus-ngk",
["Ngkâlmpw Kanum"] = "kcd",
["Ngochang"] = "tbq-ngo",
["Ngom"] = "nra",
["Ngombale"] = "nla",
["Ngombe (Central African Republic)"] = "nmj",
["Ngong"] = "nnx",
["Ngongo"] = "noq",
["Ngoni"] = "ngo",
["Ngoreme"] = "ngq",
["Ngoshie"] = "nsh",
["Ngul"] = "nlo",
["Ngulu"] = "ngp",
["Nguluwan"] = "nuw",
["Ngumbi"] = "nui",
["Ngunawal"] = "xul",
["Ngundi"] = "ndn",
["Ngundu"] = "nue",
["Ngungwel"] = "ngz",
["Ngurmbur"] = "nrx",
["Ngwaba"] = "ngw",
["Ngwe"] = "nwe",
["Ngwo"] = "ngn",
["Ngäbere"] = "gym",
["Nhanda"] = "nha",
["Nhirrpi"] = "hrp",
["Nhuwala"] = "nhf",
["Nicaraguan Creole"] = "bzk",
["Nicaraguan Sign Language"] = "ncs",
["Nicola"] = "ath-nic",
["Niellim"] = "nie",
["Nigeria Mambila"] = "mzk",
["Nigerian Pidgin"] = "pcm",
["Nigerian Sign Language"] = "nsi",
["Nihali"] = "nll",
["Nii"] = "nii",
["Niksek"] = "gbe",
["Nila"] = "nil",
["Nilamba"] = "nim",
["Nimadi"] = "noe",
["Nimanbur"] = "nmp",
["Nimbari"] = "nmr",
["Nimboran"] = "nir",
["Nimi"] = "nis",
["Nimo"] = "niw",
["Nimoa"] = "nmw",
["Ninam"] = "shb",
["Nindi"] = "nxi",
["Ningera"] = "nby",
["Ninggerum"] = "nxr",
["Ningil"] = "niz",
["Ninia Yali"] = "nlk",
["Ninzo"] = "nin",
["Nipsan"] = "nps",
["Nisa"] = "njs",
["Nisenan"] = "nsz",
["Nisi"] = "yso",
["Niuafo'ou"] = "num",
["Niuatoputapu"] = "nkp",
["Niwer Mil"] = "hrc",
["Njalgulgule"] = "njl",
["Njebi"] = "nzb",
["Njen"] = "njj",
["Njerep"] = "njr",
["Njyem"] = "njy",
["Nkami"] = "nkq",
["Nkangala"] = "nkn",
["Nkem-Nkum"] = "isi",
["Nkhumbi"] = "khu",
["Nkongho"] = "nkc",
["Nkoroo"] = "nkx",
["Nkoya"] = "nka",
["Nkukoli"] = "nbo",
["Nkutu"] = "nkw",
["Nnam"] = "nbp",
["Nocamán"] = "nom",
["Nocte Naga"] = "njb",
["Noiri"] = "noi",
["Nokuku"] = "nkk",
["Nomaande"] = "lem",
["Nomane"] = "nof",
["Nomatsiguenga"] = "not",
["Nomlaki"] = "nol",
["Nomu"] = "noh",
["Nonuya"] = "noj",
["Nooksack"] = "nok",
["Noone"] = "nhu",
["Nopala Chatino"] = "cya",
["Norn"] = "nrn",
["Norra"] = "nrr",
["North Ambrym"] = "mmg",
["North Asmat"] = "nks",
["North Awyu"] = "yir",
["North Babar"] = "bcd",
["North Boma"] = "boh",
["North Central Mixe"] = "neq",
["North Fali"] = "fll",
["North Giziga"] = "gis",
["North Mofu"] = "mfk",
["North Muyu"] = "kti",
["North Nuaulu"] = "nni",
["North Tairora"] = "tbg",
["North Tanna"] = "tnn",
["North Wahgi"] = "whg",
["North Watut"] = "una",
["Northeast Kiwai"] = "kiw",
["Northeast Maidu"] = "nmu",
["Northeast Pashayi"] = "aee",
["Northeastern Dinka"] = "dip",
["Northeastern Pomo"] = "pef",
["Northern Alta"] = "aqn",
["Northern Bontoc"] = "rbk",
["Northern Ghale"] = "ghh",
["Northern Grebo"] = "gbo",
["Northern Guiyang Hmong"] = "huj",
["Northern Haida"] = "hdn",
["Northern Huishui Hmong"] = "hmi",
["Northern Kalapuya"] = "nrt",
["Northern Kam"] = "doc",
["Northern Kankanay"] = "xnn",
["Northern Kissi"] = "kqs",
["Northern Lorung"] = "lbr",
["Northern Mashan Hmong"] = "hmp",
["Northern Muji"] = "ymx",
["Northern Ngbandi"] = "ngb",
["Northern Nuni"] = "nuv",
["Northern Oaxaca Nahuatl"] = "nhy",
["Northern Ohlone"] = "cst",
["Northern One"] = "onr",
["Northern Pame"] = "pmq",
["Northern Pinghua"] = "cnp",
["Northern Pomo"] = "pej",
["Northern Puebla Nahuatl"] = "ncj",
["Northern Pumi"] = "pmi",
["Northern Qiandong Miao"] = "hea",
["Northern Rengma Naga"] = "nnl",
["Northern Sierra Miwok"] = "nsq",
["Northern Subanen"] = "stb",
["Northern Tarahumara"] = "thh",
["Northern Tidong"] = "ntd",
["Northern Tlaxiaco Mixtec"] = "xtn",
["Northern Toussian"] = "tsp",
["Northern Tutchone"] = "ttm",
["Northern Valley Yokuts"] = "nai-nvy",
["Northwest Maidu"] = "mjd",
["Northwest Oaxaca Mixtec"] = "mxa",
["Northwest Pashayi"] = "glh",
["Northwestern Dinka"] = "diw",
["Northwestern Fars"] = "faz",
["Northwestern Tamang"] = "tmk",
["Norwegian Sign Language"] = "nsl",
["Notre"] = "bly",
["Notsi"] = "ncf",
["Nottoway"] = "ntw",
["Nottoway-Meherrin"] = "nwy",
["Noxilo"] = "art-nox",
["Noy"] = "noy",
["Nsari"] = "asj",
["Nsenga"] = "nse",
["Nshi"] = "nsc",
["Nsong"] = "soo",
["Nsongo"] = "nsx",
["Ntomba"] = "nto",
["Ntra'ngith"] = "dgt",
["Nuguria"] = "nur",
["Nuk"] = "noc",
["Nukak Makú"] = "mbr",
["Nukna"] = "klt",
["Nukuini"] = "nuc",
["Nukumanu"] = "nuq",
["Nukunu"] = "nnv",
["Nukunul"] = "xnu",
["Nukuoro"] = "nkr",
["Numana"] = "nbr",
["Numanggang"] = "nop",
["Numbami"] = "sij",
["Nume"] = "tgs",
["Numee"] = "kdk",
["Nungali"] = "nug",
["Nunggubuyu"] = "nuy",
["Nungon"] = "paa-nun",
["Nungu"] = "rin",
["Nupbikha"] = "npb",
["Nusa Laut"] = "nul",
["Nusu"] = "nuf",
["Nutabe"] = "cba-nut",
["Nyabwa"] = "nwb",
["Nyaheun"] = "nev",
["Nyakyusa"] = "nyy",
["Nyali"] = "nlj",
["Nyam"] = "nmi",
["Nyamal"] = "nly",
["Nyambo"] = "now",
["Nyamusa-Molo"] = "nwm",
["Nyamwanga"] = "mwn",
["Nyamwezi"] = "nym",
["Nyaneka"] = "nyk",
["Nyang'i"] = "nyp",
["Nyanga (Congo)"] = "nyj",
["Nyanga (Togo)"] = "ayg",
["Nyanga-li"] = "nyc",
["Nyangatom"] = "nnj",
["Nyangbo"] = "nyb",
["Nyangga"] = "nny",
["Nyangumarta"] = "nna",
["Nyankole"] = "nyn",
["Nyaturu"] = "rim",
["Nyawaygi"] = "nyt",
["Nyemba"] = "nba",
["Nyengo"] = "nye",
["Nyenkha"] = "neh",
["Nyigina"] = "nyh",
["Nyiha"] = "nih",
["Nyika"] = "nkt",
["Nyimang"] = "nyi",
["Nyindrou"] = "lid",
["Nyindu"] = "nyg",
["Nyiyaparli"] = "xny",
["Nyokon"] = "nvo",
["Nyole (Kenya)"] = "nyd",
["Nyole (Uganda)"] = "nuj",
["Nyong"] = "muo",
["Nyulnyul"] = "nyv",
["Nyungwe"] = "nyu",
["Nyâlayu"] = "yly",
["Nzakambay"] = "nzy",
["Nzakara"] = "nzk",
["Nzanyi"] = "nja",
["Nzima"] = "nzi",
["Nüpode Huitoto"] = "hux",
["O'chi'chi'"] = "xoc",
["Obanliku"] = "bzy",
["Obispeño"] = "obi",
["Oblo"] = "obl",
["Obo Manobo"] = "obo",
["Obokuitai"] = "afz",
["Obolo"] = "ann",
["Obulom"] = "obu",
["Ocotepec Mixtec"] = "mie",
["Ocotlán Zapotec"] = "zac",
["Od"] = "odk",
["Odiai"] = "bhf",
["Odoodee"] = "kkc",
["Odual"] = "odu",
["Odut"] = "oda",
["Ofayé"] = "opy",
["Ofo"] = "ofo",
["Ogbah"] = "ogc",
["Ogbia"] = "ogb",
["Ogbogolo"] = "ogg",
["Ogea"] = "eri",
["Oirata"] = "oia",
["Okiek"] = "oki",
["Oko-Eni-Osayen"] = "oks",
["Oko-Juwoi"] = "okj",
["Okobo"] = "okb",
["Okodia"] = "okd",
["Okolod"] = "kqv",
["Okpamheri"] = "opa",
["Okpe (Northwestern Edo)"] = "okx",
["Okpe (Southwestern Edo)"] = "oke",
["Okpela"] = "atg",
["Oksapmin"] = "opm",
["Oku"] = "oku",
["Okwanuchu"] = "nai-okw",
["Old Avar"] = "oav",
["Old Hungarian"] = "ohu",
["Old Kamta"] = "inc-ork",
["Old Kentish Sign Language"] = "okl",
["Old Manipuri"] = "omp",
["Old Punjabi"] = "inc-opa",
["Old Tati"] = "xme-ott",
["Old Tibetan"] = "otb",
["Tiếng Wales cổ"] = "owl",
["Olekha"] = "ole",
["Ollari"] = "gdb",
["Olo"] = "ong",
["Oloma"] = "olm",
["Olrat"] = "olr",
["Olu'bo"] = "lul",
["Olulumo-Ikom"] = "iko",
["Oluta Popoluca"] = "plo",
["Olutsotso"] = "lto",
["Omagua"] = "omg",
["Omba"] = "omb",
["Ombamba"] = "mbm",
["Ombo"] = "oml",
["Ometepec Nahuatl"] = "nht",
["Omi"] = "omi",
["Omotik"] = "omt",
["Omurano"] = "omu",
["Ong"] = "oog",
["Onin"] = "oni",
["Onjob"] = "onj",
["Ono"] = "ons",
["Onobasulu"] = "onn",
["Onondaga"] = "ono",
["Ontenu"] = "ont",
["Ontong Java"] = "ojv",
["Oorlams"] = "oor",
["Opao"] = "opo",
["Opata"] = "opt",
["Opuuo"] = "lgn",
["Opón"] = "sai-opo",
["Oraon Sadri"] = "sdr",
["Orejón"] = "ore",
["Oring"] = "org",
["Orizaba Nahuatl"] = "nlv",
["Orléanais"] = "roa-orl",
["Oro"] = "orx",
["Oro Win"] = "orw",
["Oroha"] = "ora",
["Orokaiva"] = "okv",
["Oroko"] = "bdu",
["Orokolo"] = "oro",
["Orowe"] = "bpk",
["Oruma"] = "orr",
["Orya"] = "ury",
["Osamayi"] = "syx",
["Ososo"] = "oso",
["Ot Danum"] = "otd",
["Otank"] = "uta",
["Oti"] = "oti",
["Otomaco"] = "sai-oto",
["Ottawa"] = "otw",
["Ouma"] = "oum",
["Oune"] = "oue",
["Owa"] = "stn",
["Owenia"] = "wsr",
["Owiniga"] = "owi",
["Oy"] = "oyb",
["Oya'oya"] = "oyy",
["Ozolotepec Zapotec"] = "zao",
["Pa"] = "ppt",
["Pa Di"] = "pdi",
["Pa'a"] = "pqa",
["Paama"] = "pma",
["Paasaal"] = "sig",
["Pacahuara"] = "pcp",
["Padoe"] = "pdo",
["Paeonian"] = "ine-pae",
["Pagi"] = "pgi",
["Pagibete"] = "pae",
["Pahanan Agta"] = "apf",
["Pahi"] = "lgt",
["Pahlavani"] = "phv",
["Pai Tavytera"] = "pta",
["Pai-lang"] = "tbq-plg",
["Paicî"] = "pri",
["Paikoneka"] = "awd-pai",
["Paipai"] = "ppi",
["Pajapan Nahuatl"] = "nhp",
["Pak-Tong"] = "pkg",
["Pakanha"] = "pkn",
["Pakistan Sign Language"] = "pks",
["Paku Karen"] = "kpp",
["Pal"] = "abw",
["Palaka Senoufo"] = "plr",
["Palantla Chinantec"] = "cpa",
["Palawan Batak"] = "bya",
["Paleni"] = "pnl",
["Palewyami"] = "nai-ply",
["Palikur"] = "plu",
["Pallanganmiddang"] = "pmd",
["Palta"] = "sai-pal",
["Palu'e"] = "ple",
["Paluan"] = "plz",
["Palya Bareli"] = "bpx",
["Pam"] = "pmn",
["Pambia"] = "pmb",
["Pamigua"] = "sai-pam",
["Pamlico"] = "pmk",
["Pamona"] = "pmf",
["Pamosu"] = "hih",
["Pamplona Atta"] = "att",
["Pana (Central Africa)"] = "pnz",
["Pana (West Africa)"] = "pnq",
["Panamanian Sign Language"] = "lsp",
["Panamint"] = "par",
["Panare"] = "pbh",
["Panará"] = "kre",
["Panasuan"] = "psn",
["Panawa"] = "pwb",
["Pande"] = "bkj",
["Pangseng"] = "pgs",
["Pangutaran Sama"] = "slm",
["Pangwa"] = "pbr",
["Panim"] = "pnr",
["Pankararé"] = "pax",
["Pankararú"] = "paz",
["Pankhu"] = "pkh",
["Pannei"] = "pnc",
["Panobo"] = "pno",
["Panyi Bai"] = "bfc",
["Panyjima"] = "pnw",
["Panzaleo"] = "sai-pnz",
["Pao"] = "ppa",
["Papapana"] = "ppn",
["Papar"] = "dpp",
["Papasena"] = "pas",
["Papel"] = "pbo",
["Papi"] = "ppe",
["Papitalai"] = "pat",
["Papora"] = "ppu",
["Papua New Guinean Sign Language"] = "pgz",
["Papuan Malay"] = "pmy",
["Para Naga"] = "pzn",
["Paraguayan Sign Language"] = "pys",
["Parakanã"] = "pak",
["Paranan"] = "prf",
["Paranawát"] = "paf",
["Paratió"] = "sai-par",
["Parawen"] = "prw",
["Pardhan"] = "pch",
["Pardhi"] = "pcl",
["Pare"] = "asa",
["Paredarerme"] = "xpd",
["Pará Arára"] = "aap",
["Pará Gavião"] = "gvp",
["Pasi"] = "psq",
["Pass Valley Yali"] = "yac",
["Passé"] = "awd-pas",
["Patagón"] = "sai-ptg",
["Patamona"] = "pbc",
["Patani"] = "ptn",
["Pataxó Hã-Ha-Hãe"] = "pth",
["Patep"] = "ptp",
["Pathiya"] = "pty",
["Patpatar"] = "gfk",
["Pattani"] = "lae",
["Pattapu"] = "ptq",
["Patwin"] = "pwi",
["Paulohi"] = "plh",
["Paumarí"] = "pad",
["Pauri Bareli"] = "bfb",
["Pauserna"] = "psm",
["Pawaia"] = "pwa",
["Payaguá"] = "sai-pyg",
["Paynamar"] = "pmr",
["Pe"] = "pai",
["Pech"] = "pay",
["Peerapper"] = "xpw",
["Peere"] = "pfe",
["Pei"] = "ppq",
["Pekal"] = "pel",
["Pele-Ata"] = "ata",
["Penang Sign Language"] = "psg",
["Penchal"] = "pek",
["Pendau"] = "ums",
["Penrhyn"] = "pnh",
["Pentlatch"] = "ptw",
["Perai"] = "wet",
["Perema"] = "wom",
["Pericú"] = "nai-per",
["Pero"] = "pip",
["Persian Sign Language"] = "psc",
["Peruvian Sign Language"] = "prl",
["Petapa Zapotec"] = "zpe",
["Petats"] = "pex",
["Peñoles Mixtec"] = "mil",
["Phala"] = "ypa",
["Phana'"] = "phq",
["Phangduwali"] = "phw",
["Phende"] = "pem",
["Philippine Sign Language"] = "psp",
["Philistine"] = "und-phi",
["Phimbi"] = "phm",
["Phola"] = "ypg",
["Pholo"] = "yip",
["Phom"] = "nph",
["Phudagi"] = "phd",
["Phuie"] = "pug",
["Phukha"] = "phh",
["Phuma"] = "ypm",
["Phunoi"] = "pho",
["Phupa"] = "ypp",
["Phupha"] = "yph",
["Phuthi"] = "bnt-phu",
["Phuza"] = "ypz",
["Piamatsina"] = "ptr",
["Piame"] = "pin",
["Piapoco"] = "pio",
["Piaroa"] = "pid",
["Tiếng Pichinglis"] = "fpe",
["Pichis Ashéninka"] = "cpu",
["Pictish"] = "xpi",
["Picuris"] = "nai-pic",
["Pidgin Delaware"] = "dep",
["Pidgin Iha"] = "ihb",
["Pidgin Onin"] = "onx",
["Pijao"] = "pij",
["Pije"] = "piz",
["Pijin"] = "pis",
["Pileni"] = "piv",
["Pima Bajo"] = "pia",
["Pimbwe"] = "piw",
["Pinai-Hagahai"] = "pnn",
["Pingelapese"] = "pif",
["Pini"] = "pii",
["Pinigura"] = "pnv",
["Pinjarup"] = "pnj",
["Pinji"] = "pic",
["Pinotepa Nacional Mixtec"] = "mio",
["Pintiini"] = "pti",
["Pintupi-Luritja"] = "piu",
["Pirahã"] = "myp",
["Piratapuyo"] = "pir",
["Pirlatapa"] = "bxi",
["Piro"] = "pie",
["Pirriya"] = "xpa",
["Pisabo"] = "pig",
["Pisaflores Tepehua"] = "tpp",
["Piscataway"] = "psy",
["Pisidian"] = "xps",
["Pitcairn-Norfolk"] = "pih",
["Pite Sami"] = "sje",
["Piti"] = "pcn",
["Pitta-Pitta"] = "pit",
["Piu"] = "pix",
["Piya-Kwonci"] = "piy",
["Plains Indian Sign Language"] = "psd",
["Plains Miwok"] = "pmw",
["Plapo Krumen"] = "ktj",
["Playero"] = "gob",
["Pochuri Naga"] = "npo",
["Pochutec"] = "xpo",
["Podoko"] = "pbi",
["Pogali"] = "hkh",
["Pogolo"] = "poy",
["Poitevin-Saintongeais"] = "roa-poi",
["Pokangá"] = "pok",
["Poke"] = "pof",
["Pol"] = "pmm",
["Polish Sign Language"] = "pso",
["Polonombauk"] = "plb",
["Pom"] = "pmo",
["Ponam"] = "ncc",
["Pongu"] = "png",
["Ponyo"] = "npg",
["Poqomam"] = "poc",
["Poqomchi'"] = "poh",
["Porohanon"] = "prh",
["Port Sandwich"] = "psw",
["Port Sorell"] = "xpl",
["Port Vato"] = "ptv",
["Portuguese Sign Language"] = "psr",
["Potiguára"] = "pog",
["Poumei Naga"] = "pmx",
["Pouye"] = "bye",
["Powari"] = "pwr",
["Powhatan"] = "pim",
["Poyanáwa"] = "pyn",
["Primitive Irish"] = "pgl",
["Principense"] = "pre",
["Proto-Amuesha-Chamicuro"] = "awd-amc-pro",
["Tiếng Tiểu Á nguyên thủy"] = "ine-ana-pro",
["Proto-Apachean"] = "apa-pro",
["Proto-Arawa"] = "auf-pro",
["Tiếng Armenia nguyên thủy"] = "hyx-pro",
["Proto-Arnhem"] = "aus-arn-pro",
["Proto-Atayalic"] = "map-ata-pro",
["Proto-Batak"] = "btk-pro",
["Proto-Bongo-Bagirmi"] = "csu-bba-pro",
["Proto-Boran"] = "sai-bor-pro",
["Proto-Bua"] = "alv-bua-pro",
["Proto-Bungku-Tolaki"] = "poz-btk-pro",
["Tiếng Miến nguyên thủy"] = "tbq-brm-pro",
["Proto-Caddoan"] = "cdd-pro",
["Proto-Cangin"] = "alv-cng-pro",
["Proto-Central Chadic"] = "cdc-cbm-pro",
["Proto-Central Indo-Aryan"] = "inc-cen-pro",
["Proto-Central Jê"] = "sai-cje-pro",
["Proto-Central New South Wales"] = "aus-cww-pro",
["Proto-Central Sudanic"] = "csu-pro",
["Proto-Central Togo"] = "alv-gtm-pro",
["Proto-Chatino"] = "omq-cha-pro",
["Proto-Chibchan"] = "cba-pro",
["Proto-Chimakuan"] = "chi-pro",
["Proto-Chinookan"] = "nai-ckn-pro",
["Tiếng Chukotka-Kamchatka nguyên thủy"] = "qfa-cka-pro",
["Proto-Chumash"] = "nai-chu-pro",
["Proto-Cupan"] = "azc-cup-pro",
["Proto-Daju"] = "sdv-daj-pro",
["Proto-Daly"] = "aus-dal-pro",
["Proto-Eastern Jebel"] = "sdv-eje-pro",
["Proto-Eastern Oti-Volta"] = "nic-eov-pro",
["Proto-Fali"] = "alv-fli-pro",
["Proto-Grassfields"] = "nic-grf-pro",
["Proto-Great Andamanese"] = "qfa-adm-pro",
["Proto-Guang"] = "alv-gng-pro",
["Proto-Gur"] = "nic-gur-pro",
["Proto-Gurunsi"] = "nic-gns-pro",
["Proto-Halmahera-Cenderawasih"] = "poz-hce-pro",
["Proto-Heiban"] = "alv-hei-pro",
["Proto-Highland East Cushitic"] = "cus-hec-pro",
["Proto-Hmong"] = "hmn-pro",
["Proto-Hrusish"] = "sit-hrs-pro",
["Proto-Huitoto-Ocaina"] = "sai-hoc-pro",
["Proto-Hurro-Urartian"] = "qfa-hur-pro",
["Proto-Idomoid"] = "alv-ido-pro",
["Proto-Igboid"] = "alv-igb-pro",
["Proto-Ijoid"] = "ijo-pro",
["Proto-Iwaidjan"] = "aus-wdj-pro",
["Proto-Jukunoid"] = "nic-jkn-pro",
["Proto-Kadu"] = "qfa-kad-pro",
["Proto-Kalamian"] = "phi-kal-pro",
["Proto-Kalapuyan"] = "nai-klp-pro",
["Proto-Kampa"] = "awd-kmp-pro",
["Proto-Kham"] = "sit-kha-pro",
["Proto-Khoe"] = "khi-kho-pro",
["Proto-Komisenian"] = "ira-kms-pro",
["Proto-Kru"] = "kro-pro",
["Proto-Kuliak"] = "ssa-klk-pro",
["Proto-Kurdish"] = "ku-pro",
["Proto-Kwa"] = "alv-kwa-pro",
["Proto-Lalo"] = "tbq-lal-pro",
["Proto-Lampungic"] = "poz-lgx-pro",
["Tiếng Lô Lô nguyên thủy"] = "tbq-lol-pro",
["Proto-Lower Cross River"] = "nic-lcr-pro",
["Proto-Luish"] = "sit-luu-pro",
["Proto-Maidun"] = "nai-mdu-pro",
["Proto-Mangbetu"] = "csu-maa-pro",
["Proto-Masa"] = "cdc-mas-pro",
["Proto-Mazatec"] = "omq-maz-pro",
["Proto-Medo-Parthian"] = "ira-mpr-pro",
["Proto-Mixe-Zoque"] = "nai-miz-pro",
["Proto-Mixtec"] = "omq-mxt-pro",
["Proto-Mumuye"] = "alv-mum-pro",
["Proto-Munji-Yidgha"] = "ira-mny-pro",
["Proto-Na-Dene"] = "xnd-pro",
["Proto-Nawiki"] = "awd-nwk-pro",
["Proto-Nilotic"] = "sdv-nil-pro",
["Proto-North Caucasian"] = "ccn-pro",
["Proto-North Halmahera"] = "paa-nha-pro",
["Proto-North Sarawak"] = "poz-swa-pro",
["Proto-Nubian"] = "nub-pro",
["Proto-Numic"] = "azc-num-pro",
["Proto-Nupoid"] = "alv-nup-pro",
["Proto-Nyima"] = "sdv-nyi-pro",
["Proto-Nyulnyulan"] = "aus-nyu-pro",
["Proto-Ogoni"] = "nic-ogo-pro",
["Proto-Ossetic"] = "os-pro",
["Proto-Oti-Volta"] = "nic-ovo-pro",
["Proto-Oto-Manguean"] = "omq-pro",
["Proto-Oto-Pamean"] = "omq-otp-pro",
["Proto-Otomi"] = "oto-otm-pro",
["Proto-Otomian"] = "oto-pro",
["Proto-Paresi-Waura"] = "awd-prw-pro",
["Proto-Plateau Penutian"] = "nai-plp-pro",
["Proto-Pomeranian"] = "zlw-pom-pro",
["Proto-Pomo"] = "nai-pom-pro",
["Proto-Saka"] = "xsc-sak-pro",
["Proto-Sanglechi-Ishkashimi"] = "ira-sgi-pro",
["Proto-Sara"] = "csu-sar-pro",
["Proto-Siouan-Catawban"] = "nai-sca-pro",
["Proto-Songhay"] = "son-pro",
["Proto-Sotho-Tswana"] = "bnt-sts-pro",
["Proto-South Cushitic"] = "cus-sou-pro",
["Proto-South Sulawesi"] = "poz-ssw-pro",
["Proto-Southern Jê"] = "sai-sje-pro",
["Proto-Sunda-Sulawesi"] = "poz-sus-pro",
["Proto-Ta-Arawak"] = "awd-taa-pro",
["Proto-Takic"] = "azc-tak-pro",
["Proto-Taman"] = "sdv-tmn-pro",
["Proto-Tani"] = "sit-tan-pro",
["Proto-Taranoan"] = "sai-tar-pro",
["Proto-Tatic"] = "xme-ttc-pro",
["Proto-Totozoquean"] = "nai-tot-pro",
["Tiếng Liên New Guinea nguyên thủy"] = "ngf-pro",
["Proto-Tsezian"] = "cau-tsz-pro",
["Proto-Tsimshianic"] = "nai-tsi-pro",
["Proto-Upper Cross River"] = "nic-ucr-pro",
["Proto-Utian"] = "nai-utn-pro",
["Proto-Western Mande"] = "dmn-mdw-pro",
["Proto-Witotoan"] = "sai-wit-pro",
["Proto-Yupik"] = "ypk-pro",
["Proto-Zapotecan"] = "omq-zap-pro",
["Providencia Sign Language"] = "prz",
["Psikye"] = "kvj",
["Puare"] = "pux",
["Pudtol Atta"] = "atp",
["Puebla Mazatec"] = "pbm",
["Puelche"] = "pue",
["Puerto Rican Sign Language"] = "psl",
["Puimei Naga"] = "npu",
["Puiron"] = "sit-prn",
["Pukapukan"] = "pkp",
["Pulabu"] = "pup",
["Puluwat"] = "puw",
["Puma"] = "pum",
["Pumé"] = "yae",
["Punan Aput"] = "pud",
["Punan Bah-Biau"] = "pna",
["Punan Batu"] = "pnm",
["Punan Merah"] = "puf",
["Punan Merap"] = "puc",
["Punan Tubu"] = "puj",
["Punu"] = "puu",
["Puquina"] = "puq",
["Puragi"] = "pru",
["Purari"] = "iar",
["Purepecha"] = "pua",
["Puri"] = "prr",
["Purik"] = "prx",
["Purisimeño"] = "puy",
["Puruborá"] = "pur",
["Puruhá"] = "sai-prh",
["Purukotó"] = "sai-pur",
["Purum"] = "pub",
["Putai"] = "mfl",
["Putoh"] = "put",
["Putukwam"] = "afe",
["Puyo-Paekche"] = "xpp",
["Pwaamei"] = "pme",
["Pwapwa"] = "pop",
["Pyapun"] = "pcw",
["Pye Krumen"] = "pye",
["Pyemmairre"] = "xpb",
["Pyen"] = "pyy",
["Pykobjê"] = "sai-pyk",
["Pyu"] = "pby",
["Páez"] = "pbb",
["Pááfang"] = "pfa",
["Päri"] = "lkr",
["Pémono"] = "pev",
["Pévé"] = "lme",
["Pökoot"] = "pko",
["Q'anjob'al"] = "kjb",
["Q'eqchi"] = "kek",
["Qabiao"] = "laq",
["Qaqet"] = "byx",
["Qatabanian"] = "xqt",
["Qau"] = "gqu",
["Qila Muji"] = "ymq",
["Quebec Sign Language"] = "fcs",
["Querétaro Otomi"] = "otq",
["Quetzaltepec Mixe"] = "pxm",
["Queyu"] = "qvy",
["Quiavicuzas Zapotec"] = "zpj",
["Quileute"] = "qui",
["Quimbaya"] = "sai-qmb",
["Quinigua"] = "nai-qng",
["Quinqui"] = "quq",
["Quioquitani-Quierí Zapotec"] = "ztq",
["Quiotepec Chinantec"] = "chq",
["Quitemo"] = "sai-qtm",
["Rabona"] = "sai-rab",
["Rahambuu"] = "raz",
["Rajah Kabunsuwan Manobo"] = "mqk",
["Raji"] = "rji",
["Rajong"] = "rjg",
["Rakahanga-Manihiki"] = "rkh",
["Ralte"] = "ral",
["Ramandi"] = "tks",
["Ramanos"] = "sai-ram",
["Ramoaaina"] = "rai",
["Ramopa"] = "kjx",
["Rampi"] = "lje",
["Rana Tharu"] = "thr",
["Rang"] = "rax",
["Rangkas"] = "rgk",
["Ranglong"] = "rnl",
["Rao"] = "rao",
["Rapa"] = "ray",
["Rapoisi"] = "kyx",
["Rapting"] = "rpt",
["Rara Bakati'"] = "lra",
["Ratahan"] = "rth",
["Rathawi"] = "rtw",
["Rathwi Bareli"] = "bgd",
["Rawa"] = "rwo",
["Rawat"] = "jnl",
["Rawo"] = "rwa",
["Rayón Zoque"] = "zor",
["Razajerdi"] = "rat",
["Razihi"] = "rzh",
["Reang"] = "ria",
["Red Gelao"] = "gir",
["Reel"] = "atu",
["Rejang Kayan"] = "ree",
["Rema"] = "bow",
["Rembarunga"] = "rmb",
["Rembong"] = "reb",
["Remo"] = "rem",
["Remontado Agta"] = "agv",
["Rempi"] = "rmp",
["Remun"] = "lkj",
["Rennellese"] = "mnv",
["Repanbitip"] = "rpn",
["Rer Bare"] = "rer",
["Rerau"] = "rea",
["Rerep"] = "pgk",
["Reshe"] = "res",
["Resígaro"] = "rgr",
["Retta"] = "ret",
["Reyesano"] = "rey",
["Rhine Franconian"] = "gmw-rfr",
["Riang"] = "ril",
["Riantana"] = "ran",
["Ribun"] = "rir",
["Rigwe"] = "iri",
["Rikbaktsa"] = "rkb",
["Ringgou"] = "rgu",
["Ririo"] = "rri",
["Ritarungo"] = "rit",
["Riung"] = "riu",
["Riverain Sango"] = "snj",
["Rogo"] = "rod",
["Roma"] = "rmm",
["Romani Greek"] = "rge",
["Romanian Sign Language"] = "rms",
["Romano-Serbian"] = "rsb",
["Romanova"] = "rmv",
["Romblomanon"] = "rol",
["Rombo"] = "rof",
["Romkun"] = "rmk",
["Ron"] = "cla",
["Ronga"] = "rng",
["Rongga"] = "ror",
["Rongmei Naga"] = "nbu",
["Rongpo"] = "rnp",
["Ronji"] = "roe",
["Roon"] = "rnn",
["Roria"] = "rga",
["Roro"] = "rro",
["Rotokas"] = "roo",
["Roviana"] = "rug",
["Rudbari"] = "rdb",
["Rufiji"] = "rui",
["Ruga"] = "ruh",
["Rukiga"] = "cgg",
["Ruma"] = "ruz",
["Rumu"] = "klq",
["Runga"] = "rou",
["Rungtu"] = "rtc",
["Rungwa"] = "rnw",
["Russenorsk"] = "crp-rsn",
["Russian Sign Language"] = "rsl",
["Ruuli"] = "ruc",
["Ruwund"] = "rnd",
["Rwa"] = "rwk",
["Rwanda-Rundi"] = "rw",
["Sa"] = "sax",
["Sa'a"] = "apb",
["Sa'ban"] = "snv",
["Sa'och"] = "scq",
["Saafi-Saafi"] = "sav",
["Saam"] = "raq",
["Saamia"] = "lsm",
["Saare"] = "uss",
["Sabah Malay"] = "msi",
["Sabanê"] = "sae",
["Sabaot"] = "spy",
["Sabine"] = "sbv",
["Sabir"] = "pml",
["Sabu"] = "hvn",
["Sacapulteco"] = "quv",
["Saep"] = "spd",
["Safaitic"] = "sem-saf",
["Safaliba"] = "saf",
["Safeyoka"] = "apz",
["Safwa"] = "sbk",
["Sagala"] = "sbm",
["Sagalla"] = "tga",
["Sahaptin"] = "nai-spt",
["Sahu"] = "saj",
["Sajau Basap"] = "sjb",
["Sakachep"] = "sch",
["Sakam"] = "skm",
["Sakao"] = "sku",
["Sakata"] = "skt",
["Sake"] = "sak",
["Sala"] = "shq",
["Salampasu"] = "slx",
["Salas"] = "sgu",
["Salchuq"] = "slq",
["Saleman"] = "sau",
["Saliba (Colombia)"] = "slc",
["Saliba (New Guinea)"] = "sbe",
["Salinan"] = "sln",
["Salt-Yui"] = "sll",
["Saluan"] = "loe",
["Salumá"] = "slj",
["Salvadoran Lenca"] = "nai-sln",
["Salvadoran Sign Language"] = "esn",
["Sam"] = "snx",
["Sama"] = "smd",
["Samaritan Aramaic"] = "sam",
["Samaritan Hebrew"] = "smp",
["Samarokena"] = "tmj",
["Samatao"] = "ysd",
["Samba"] = "smx",
["Sambe"] = "xab",
["Samberigi"] = "ssx",
["Samburu"] = "saq",
["Samoan Plantation Pidgin"] = "cpe-spp",
["Samosa"] = "swm",
["Sampang"] = "rav",
["Samre"] = "sxm",
["Samvedi"] = "smv",
["San Agustín Mixtepec Zapotec"] = "ztm",
["San Baltazar Loxicha Zapotec"] = "zpx",
["San Felipe Otlaltepec Popoloca"] = "pow",
["San Jerónimo Tecóatl Mazatec"] = "maa",
["San Juan Atzingo Popoloca"] = "poe",
["San Juan Colorado Mixtec"] = "mjc",
["San Juan Quiahije Chatino"] = "ctp-san",
["San Juan Teita Mixtec"] = "xtj",
["San Luís Temalacayuca Popoloca"] = "pps",
["San Marcos Tlalcoyalco Popoloca"] = "pls",
["San Miguel Creole French"] = "scf",
["San Miguel Piedras Mixtec"] = "xtp",
["San Miguel el Grande Mixtec"] = "mig",
["San Pablo Güilá Zapotec"] = "ztu",
["San Pedro Amuzgos Amuzgo"] = "azg",
["San Pedro Quiatoni Zapotec"] = "zpf",
["San Vicente Coatlán Zapotec"] = "zpt",
["Sanapaná"] = "spn",
["Sanaviron"] = "sai-san",
["Sandawe"] = "sad",
["Sanga (Congo)"] = "sng",
["Sanga (Nigeria)"] = "xsn",
["Sanggau"] = "scg",
["Sangil"] = "snl",
["Sangkong"] = "sgk",
["Sanglechi"] = "sgy",
["Sangtam Naga"] = "nsa",
["Sangu (Gabon)"] = "snq",
["Sangu (Tanzania)"] = "sbp",
["Sani"] = "ysn",
["Sanie"] = "ysy",
["Saniyo-Hiyewe"] = "sny",
["Sankaran Maninka"] = "msc",
["Sansi"] = "ssi",
["Santa Catarina Albarradas Zapotec"] = "ztn",
["Santa Inés Ahuatempan Popoloca"] = "pca",
["Santa Inés Yatzechi Zapotec"] = "zpn",
["Santa Lucía Monteverde Mixtec"] = "mdv",
["Santa María La Alta Nahuatl"] = "nhz",
["Santa María Quiegolani Zapotec"] = "zpi",
["Santa María Zacatepec Mixtec"] = "mza",
["Santa Teresa Cora"] = "cok",
["Santiago Xanica Zapotec"] = "zpr",
["Santo Domingo Albarradas Zapotec"] = "zas",
["Sanumá"] = "xsu",
["Saparua"] = "spr",
["Sapará"] = "sai-sap",
["Sapo"] = "krn",
["Saponi"] = "spi",
["Sapuan"] = "spu",
["Sapé"] = "spc",
["Sar"] = "mwm",
["Sara"] = "sre",
["Sara Kaba"] = "sbz",
["Sara Kaba Deme"] = "kwg",
["Sara Kaba Náà"] = "kwv",
["Sarangani Blaan"] = "bps",
["Sarangani Manobo"] = "mbs",
["Sarasira"] = "zsa",
["Saraveca"] = "sar",
["Sarli"] = "sdf",
["Sartang"] = "onp",
["Sarua"] = "swy",
["Sarudu"] = "sdu",
["Saruga"] = "sra",
["Sasaru"] = "sxs",
["Tiếng Sassari"] = "sdc",
["Satawalese"] = "stw",
["Sateré-Mawé"] = "mav",
["Sathmar Swabian"] = "gmw-stm",
["Saudi Arabian Sign Language"] = "sdl",
["Sauraseni Apabhramsa"] = "inc-sap",
["Sauri"] = "srt",
["Sause"] = "sao",
["Sausi"] = "ssj",
["Savosavo"] = "svs",
["Sawai"] = "szw",
["Saweru"] = "swr",
["Sawi"] = "saw",
["Sawila"] = "swt",
["Saya"] = "say",
["Sayula Popoluca"] = "pos",
["Scanian"] = "gmq-scy",
["Seba"] = "kdg",
["Seberuang"] = "sbx",
["Sebop"] = "sib",
["Sebuyau"] = "snb",
["Sechura"] = "sai-sec",
["Secoya"] = "sey",
["Sedoa"] = "tvw",
["Seenku"] = "sos",
["Segai"] = "sge",
["Segeju"] = "seg",
["Seget"] = "sbg",
["Sehwi"] = "sfw",
["Seim"] = "sim",
["Seimat"] = "ssg",
["Seit-Kaitetu"] = "hik",
["Sekani"] = "sek",
["Sekapan"] = "skp",
["Sekar"] = "skz",
["Seke"] = "skj",
["Sekele"] = "vaj",
["Seki"] = "syi",
["Seko Padang"] = "skx",
["Seko Tengah"] = "sko",
["Sekpele"] = "lip",
["Selangor Sign Language"] = "kgi",
["Selaru"] = "slu",
["Selayar"] = "sly",
["Selee"] = "snw",
["Selepet"] = "spl",
["Selk'nam"] = "ona",
["Selonian"] = "sxl",
["Selungai Murut"] = "slg",
["Seluwasan"] = "sws",
["Sema"] = "nsm",
["Semandang"] = "sdm",
["Sembakung Murut"] = "sbr",
["Semimi"] = "etz",
["Semnani"] = "smy",
["Sempan"] = "xse",
["Senara Sénoufo"] = "seq",
["Senaya"] = "syn",
["Sene"] = "sej",
["Sengele"] = "szg",
["Senggi"] = "snu",
["Sengo"] = "spk",
["Sengseng"] = "ssz",
["Sensi"] = "sni",
["Sentani"] = "set",
["Senthang Chin"] = "sez",
["Sentinelese"] = "std",
["Sepa (Indonesia)"] = "spb",
["Sepa (New Guinea)"] = "spe",
["Sepen"] = "spm",
["Sepik Iwam"] = "iws",
["Sepik Mari"] = "mbx",
["Sera"] = "sry",
["Sere"] = "swf",
["Serili"] = "sve",
["Seroa"] = "kqu",
["Serrano"] = "ser",
["Seru"] = "szd",
["Serua"] = "srw",
["Serudung Murut"] = "srk",
["Serui-Laut"] = "seu",
["Seta"] = "stf",
["Setaman"] = "stm",
["Seti"] = "sbi",
["Sewa Bay"] = "sew",
["Seychellois Creole"] = "crs",
["Sha"] = "scw",
["Shahmirzadi"] = "srz",
["Shahrudi"] = "shm",
["Shall-Zwall"] = "sha",
["Shama-Sambuga"] = "sqa",
["Shamang"] = "xsh",
["Shambala"] = "ksb",
["Shanenawa"] = "swo",
["Shanga"] = "sho",
["Shangzhai"] = "jih",
["Shaozhou Tuhua"] = "zhx-sht",
["Sharanahua"] = "mcd",
["Shark Bay"] = "ssv",
["Sharwa"] = "swq",
["Shasta"] = "sht",
["Shatt"] = "shj",
["Shau"] = "sqh",
["Shawnee"] = "sjw",
["She"] = "shx",
["Shehri"] = "shv",
["Sheko"] = "she",
["Shelta"] = "sth",
["Shendu"] = "shl",
["Sheni"] = "scv",
["Sherbro"] = "bun",
["Sherdukpen"] = "sdp",
["Shi"] = "shr",
["Shihhi Arabic"] = "ssh",
["Shiki"] = "gua",
["Shilluk"] = "shk",
["Shipibo-Conibo"] = "shp",
["Shixing"] = "sxg",
["Shoo-Minda-Nye"] = "bcv",
["Shoshone"] = "shh",
["Shua"] = "shg",
["Shuar"] = "jiv",
["Shuba"] = "cbq",
["Shumashti"] = "sts",
["Shumcho"] = "scu",
["Shuwa-Zamani"] = "ksa",
["Shwai"] = "shw",
["Sialum"] = "slw",
["Siamou"] = "sif",
["Sian"] = "spg",
["Siane"] = "snp",
["Siang"] = "sya",
["Siar-Lak"] = "sjr",
["Sibe"] = "nco",
["Sibu Melanau"] = "sdx",
["Sicanian"] = "sxc",
["Siculo-Arabic"] = "sqr",
["Sidetic"] = "xsd",
["Sie"] = "erg",
["Sierra Leone Sign Language"] = "sgx",
["Sierra Negra Nahuatl"] = "nsu",
["Sierra de Juárez Zapotec"] = "zaa",
["Sighu"] = "sxe",
["Sihan"] = "snr",
["Sika"] = "ski",
["Sikaiana"] = "sky",
["Sikaritai"] = "tty",
["Sikiana"] = "sik",
["Sikule"] = "skh",
["Sila"] = "slt",
["Silacayoapan Mixtec"] = "mks",
["Sileibi"] = "sbq",
["Silimo"] = "wul",
["Siliput"] = "mkc",
["Silopi"] = "xsp",
["Simaa"] = "sie",
["Simba"] = "sbw",
["Simbali"] = "smg",
["Simbari"] = "smb",
["Simbo"] = "sbb",
["Simeku"] = "smz",
["Simeulue"] = "smr",
["Simte"] = "smt",
["Sinacantán"] = "nai-sin",
["Sinagen"] = "siu",
["Sinasina"] = "sst",
["Sindarin"] = "sjn",
["Sindhi Bhil"] = "sbn",
["Sindihui Mixtec"] = "xts",
["Singa"] = "sgm",
["Singapore Sign Language"] = "sls",
["Singpho"] = "sgp",
["Sinicahua Mixtec"] = "xti",
["Sininkere"] = "skq",
["Sinte Romani"] = "rmo",
["Sinyar"] = "sys",
["Sinúfana"] = "sai-sin",
["Sio"] = "xsi",
["Siona"] = "snn",
["Sipakapense"] = "qum",
["Sira"] = "swj",
["Siri"] = "sir",
["Siriano"] = "sri",
["Sirionó"] = "srq",
["Siroi"] = "ssd",
["Siuslaw"] = "sis",
["Sivandi"] = "siy",
["Siwai"] = "siw",
["Siyin Chin"] = "csy",
["Skagit"] = "ska",
["Skalvian"] = "svx",
["Ske"] = "ske",
["Skou"] = "skv",
["Slavomolisano"] = "svm",
["Slovakian Sign Language"] = "svk",
["Small Flowery Miao"] = "sfm",
["Smärky Kanum"] = "kxq",
["Snohomish"] = "sno",
["So'a"] = "ssq",
["Sobei"] = "sob",
["Sochiapam Chinantec"] = "cso",
["Soga"] = "xog",
["Sok"] = "skk",
["Soko"] = "soc",
["Sokoro"] = "sok",
["Solano"] = "xso",
["Soli"] = "sby",
["Solos"] = "sol",
["Som"] = "smc",
["Somba-Siawari"] = "bmu",
["Somra"] = "ntx",
["Somrai"] = "sor",
["Somray"] = "smu",
["Somyev"] = "kgt",
["Sonaga"] = "ysg",
["Sonde"] = "shc",
["Songe"] = "sop",
["Songomeno"] = "soe",
["Songoora"] = "sod",
["Sonha"] = "soi",
["Sonia"] = "siq",
["Soo"] = "teu",
["Sop"] = "urw",
["Sori-Harengan"] = "sbh",
["Sorkhei"] = "sqo",
["Sorothaptic"] = "sxo",
["Sorsogon Ayta"] = "ays",
["Sos Kundi"] = "sdk",
["Sota Kanum"] = "krz",
["Sou"] = "sqq",
["South African Sign Language"] = "sfs",
["South Awyu"] = "aws",
["South Boma"] = "bnt-sbo",
["South Central Banda"] = "lnl",
["South Central Dinka"] = "dib",
["South Fali"] = "fal",
["South Giziga"] = "giz",
["South Lembata"] = "lmf",
["South Muyu"] = "kts",
["South Nuaulu"] = "nxl",
["South Tairora"] = "omw",
["South Ucayali Ashéninka"] = "cpy",
["South Watut"] = "mcy",
["Southeast Ambrym"] = "tvk",
["Southeast Babar"] = "vbb",
["Southeast Ijo"] = "ijs",
["Southeast Pashayi"] = "psi",
["Southeast Tasmanian"] = "xpf",
["Southeastern Dinka"] = "dks",
["Southeastern Ixtlán Zapotec"] = "zpd",
["Southeastern Nochixtlán Mixtec"] = "mxy",
["Southeastern Pomo"] = "pom",
["Southeastern Puebla Nahuatl"] = "npl",
["Southeastern Tarahumara"] = "tcu",
["Southern Alta"] = "agy",
["Southern Birifor"] = "biv",
["Southern Bobo"] = "bwq",
["Southern Bontoc"] = "obk",
["Southern Catanduanes Bicolano"] = "bln",
["Southern Dagaare"] = "dga",
["Southern Ghale"] = "ghe",
["Southern Grebo"] = "grj",
["Southern Guiyang Hmong"] = "hmy",
["Southern Haida"] = "hax",
["Southern Hindko"] = "hnd",
["Southern Kalapuya"] = "sxk",
["Southern Kalinga"] = "ksc",
["Southern Khanty"] = "kca-sou",
["Southern Kissi"] = "kss",
["Southern Kiwai"] = "kjd",
["Tiếng Xwarin"] = "sdh",
["Southern Lolopo"] = "ysp",
["Southern Lorung"] = "lrr",
["Southern Ma'di"] = "snm",
["Southern Mashan Hmong"] = "hma",
["Southern Muji"] = "ymc",
["Southern Ngbandi"] = "nbw",
["Southern Nisu"] = "nsd",
["Southern Nuni"] = "nnw",
["Southern Ohlone"] = "css",
["Southern One"] = "osu",
["Southern Pame"] = "pmz",
["Southern Pinghua"] = "csp",
["Southern Pomo"] = "peq",
["Southern Puebla Mixtec"] = "mit",
["Southern Puget Sound Salish"] = "slh",
["Southern Pumi"] = "pmj",
["Southern Qiandong Miao"] = "hms",
["Southern Rengma Naga"] = "nre",
["Southern Sama"] = "ssb",
["Southern Sierra Miwok"] = "skd",
["Southern Tidong"] = "itd",
["Southern Tiwa"] = "tix",
["Southern Toussian"] = "wib",
["Southern Tutchone"] = "tce",
["Southern Valley Yokuts"] = "nai-svy",
["Southwest Gbaya"] = "gso",
["Southwest Palawano"] = "plv",
["Southwest Pashayi"] = "psh",
["Southwest Tanna"] = "nwi",
["Southwestern Bontoc"] = "vbk",
["Southwestern Dinka"] = "dik",
["Southwestern Fars"] = "fay",
["Southwestern Guiyang Hmong"] = "hmg",
["Southwestern Huishui Hmong"] = "hmh",
["Southwestern Nisu"] = "nsv",
["Southwestern Tamang"] = "tsf",
["Southwestern Tarahumara"] = "twr",
["Southwestern Tepehuan"] = "tla",
["Southwestern Tlaxiaco Mixtec"] = "meh",
["Sowa"] = "sww",
["Sowanda"] = "sow",
["Soyaltepec Mazatec"] = "vmp",
["Soyaltepec Mixtec"] = "vmq",
["Spanish Sign Language"] = "ssp",
["Spiti Bhoti"] = "spt",
["Spokane"] = "spo",
["Sri Lankan Creole Malay"] = "sci",
["Sri Lankan Sign Language"] = "sqs",
["Stod Bhoti"] = "sbu",
["Stoney"] = "sto",
["Suabo"] = "szp",
["Suarmin"] = "seo",
["Suau"] = "swp",
["Suba"] = "sxb",
["Suba-Simbiti"] = "ssc",
["Subi"] = "xsj",
["Subiya"] = "sbs",
["Subtiaba"] = "sut",
["Sudest"] = "tgo",
["Sudovian"] = "xsv",
["Suena"] = "sue",
["Suga"] = "sgi",
["Suganga"] = "sug",
["Sugut Dusun"] = "kzs",
["Suki"] = "sui",
["Suku"] = "sub",
["Sukuma"] = "suk",
["Sukur"] = "syk",
["Sukurum"] = "zsu",
["Sula"] = "szn",
["Sulka"] = "sua",
["Sulod"] = "srg",
["Suma"] = "sqm",
["Sumariup"] = "siv",
["Sumau"] = "six",
["Tiếng Sumbawa"] = "smw",
["Sumbwa"] = "suw",
["Sumtu Chin"] = "csv",
["Sunam"] = "ssk",
["Sunum"] = "ymn",
["Sunwar"] = "suz",
["Suoy"] = "syo",
["Supyire"] = "spp",
["Sur"] = "tdl",
["Surbakhal"] = "sbj",
["Surigaonon"] = "sgd",
["Sursurunga"] = "sgz",
["Suruahá"] = "swx",
["Surubu"] = "sde",
["Suruí"] = "sru",
["Suruí Do Pará"] = "mdz",
["Susquehannock"] = "sqn",
["Susuami"] = "ssu",
["Suundi"] = "sdj",
["Suwawa"] = "swu",
["Suyá"] = "suy",
["Swabian"] = "swg",
["Swampy Cree"] = "csw",
["Swedish Sign Language"] = "swl",
["Swiss-French Sign Language"] = "ssr",
["Swiss-German Sign Language"] = "sgg",
["Swiss-Italian Sign Language"] = "slf",
["Swo"] = "sox",
["Syenara Senoufo"] = "shz",
["Sácata"] = "sai-sac",
["São Paulo Kaingáng"] = "zkp",
["Sãotomense"] = "cri",
["Sìcìté Sénoufo"] = "sep",
["T'en"] = "tct",
["Tabaa Zapotec"] = "zat",
["Tabancale"] = "sai-tab",
["Tabaru"] = "tby",
["Tabasco Chontal"] = "chf",
["Tabasco Nahuatl"] = "nhc",
["Tabasco Zoque"] = "zoq",
["Tabla"] = "tnm",
["Tabo"] = "knv",
["Tabriak"] = "tzx",
["Tacahua Mixtec"] = "xtt",
["Tacana"] = "tna",
["Tadaksahak"] = "dsq",
["Tae'"] = "rob",
["Tafreshi"] = "xme-taf",
["Tagabawa"] = "bgs",
["Tagakaulu Kalagan"] = "klg",
["Tagbanwa"] = "tbw",
["Tagbu"] = "tbm",
["Tagish"] = "tgx",
["Tagwana Senoufo"] = "tgw",
["Tai"] = "taw",
["Tai Hang Tong"] = "thc",
["Tai Hongjin"] = "tiz",
["Tai Long"] = "thi",
["Tai Thanh"] = "tmm",
["Tai Ya"] = "cuu",
["Taiap"] = "gpn",
["Taikat"] = "aos",
["Tainae"] = "ago",
["Tairuma"] = "uar",
["Taita"] = "dav",
["Taiwan Sign Language"] = "tss",
["Taje"] = "pee",
["Tajio"] = "tdj",
["Tajuasohn"] = "tja",
["Takelma"] = "tkm",
["Takia"] = "tbc",
["Takka Apabhramsa"] = "inc-tak",
["Takua"] = "tkz",
["Takuu"] = "nho",
["Takwane"] = "tke",
["Talaud"] = "tld",
["Taliabu"] = "tlv",
["Talieng"] = "tdf",
["Talinga-Bwisi"] = "tlj",
["Talise"] = "tlr",
["Tallán"] = "sai-tal",
["Talodi"] = "tlo",
["Taloki"] = "tlk",
["Talondo'"] = "tln",
["Talu"] = "yta",
["Tama (Chad)"] = "tma",
["Tama (Colombia)"] = "ten",
["Tamagario"] = "tcg",
["Tamambo"] = "mla",
["Taman (Indonesia)"] = "tmn",
["Taman (Myanmar)"] = "tcl",
["Tamanaku"] = "tmz",
["Tamazola Mixtec"] = "vmx",
["Tambas"] = "tdk",
["Tambora"] = "xxt",
["Tambotalo"] = "tls",
["Tambunan Dusun"] = "kzt",
["Tami"] = "tmy",
["Tamnim Citak"] = "tml",
["Tampias Lobu"] = "low",
["Tampulma"] = "tpm",
["Tanacross"] = "tcb",
["Tanahmerah"] = "tcm",
["Tanapag"] = "tpv",
["Tandaganon"] = "tgn",
["Tandia"] = "tni",
["Tanema"] = "tnx",
["Tangale"] = "tan",
["Tangam"] = "sit-tgm",
["Tanggu"] = "tgu",
["Tangko"] = "tkx",
["Tangsa"] = "nst",
["Tanguat"] = "tbs",
["Tanimuca-Retuarã"] = "tnc",
["Tanjijili"] = "uji",
["Tanudan Kalinga"] = "kml",
["Tanzanian Sign Language"] = "tza",
["Tapachultec"] = "nai-tap",
["Taparita"] = "sai-tpr",
["Tapayuna"] = "sai-tap",
["Tapeba"] = "tbb",
["Tapei"] = "afp",
["Tapieté"] = "tpj",
["Tar Gula"] = "kcm",
["Tarairiú"] = "sai-trr",
["Tarao"] = "tro",
["Taraon"] = "mhu",
["Tareng"] = "tgr",
["Tarjumo"] = "txj",
["Tarok"] = "yer",
["Tarpia"] = "tpf",
["Tartessian"] = "txr",
["Taruma"] = "tdm",
["Tasmate"] = "tmt",
["Tataltepec Chatino"] = "cta",
["Tatana"] = "txx",
["Tataviam"] = "azc-tat",
["Tauade"] = "ttd",
["Taulil"] = "tuh",
["Taupota"] = "tpa",
["Taushiro"] = "trr",
["Tauya"] = "tya",
["Taveta"] = "tvs",
["Tawala"] = "tbo",
["Tawandê"] = "xtw",
["Tawang Monpa"] = "twm",
["Tawasa"] = "nai-taw",
["Taworta"] = "tbp",
["Tawoyan"] = "twy",
["Tawr Chin"] = "tcp",
["Tay Khang"] = "tnu",
["Tayabas Ayta"] = "ayy",
["Tayo"] = "cks",
["Tboli"] = "tbl",
["Tchitchege"] = "tck",
["Tchumbuli"] = "bqa",
["Te'un"] = "tve",
["Teanu"] = "tkw",
["Tebul Sign Language"] = "tsy",
["Tebul Ure Dogon"] = "dtu",
["Tecpatlán Totonac"] = "tcw",
["Tedaga"] = "tuq",
["Tee"] = "tkq",
["Tefaro"] = "tfo",
["Tegali"] = "ras",
["Tehit"] = "kps",
["Tehuelche"] = "teh",
["Teiwa"] = "twe",
["Tejalapan Zapotec"] = "ztt",
["Teke-Fuumu"] = "ifm",
["Teke-Kukuya"] = "kkw",
["Teke-Laali"] = "lli",
["Teke-Tege"] = "teg",
["Teke-Tsaayi"] = "tyi",
["Teke-Tyee"] = "tyx",
["Tektiteko"] = "ttc",
["Tela-Masbuar"] = "tvm",
["Telefol"] = "tlf",
["Teluti"] = "tlt",
["Tembé"] = "tqb",
["Teme"] = "tdo",
["Temein"] = "teq",
["Temi"] = "soz",
["Temne"] = "tem",
["Temoaya Otomi"] = "ott",
["Tempasuk Dusun"] = "tdu",
["Tenango Otomi"] = "otn",
["Tene Kan Dogon"] = "dtk",
["Tenggarong Kutai Malay"] = "vkt",
["Tenino"] = "tqn",
["Tenis"] = "tns",
["Tennet"] = "tex",
["Teojomulco Chatino"] = "omq-teo",
["Teop"] = "tio",
["Teor"] = "tev",
["Tepecano"] = "tep",
["Tepetotutla Chinantec"] = "cnt",
["Tepeuxila Cuicatec"] = "cux",
["Tepo Krumen"] = "ted",
["Teposcolula Mixtec"] = "omq-tel",
["Tequistlatec"] = "nai-teq",
["Tera"] = "ttr",
["Terebu"] = "trb",
["Terei"] = "buo",
["Tereno"] = "ter",
["Tereweng"] = "twg",
["Terik"] = "tec",
["Termanu"] = "twu",
["Ternateño"] = "tmg",
["Tese"] = "keg",
["Teshenawa"] = "twc",
["Tetela"] = "tll",
["Tetelcingo Nahuatl"] = "nhg",
["Tetete"] = "teb",
["Tetun Dili"] = "tdt",
["Teushen"] = "sai-teu",
["Teutila Cuicatec"] = "cut",
["Tewa"] = "tew",
["Texcatepec Otomi"] = "otx",
["Texistepec Popoluca"] = "poq",
["Texmelucan Zapotec"] = "zpz",
["Tezoatlán Mixtec"] = "mxb",
["Tha"] = "thy",
["Thado Chin"] = "tcz",
["Thai Sign Language"] = "tsq",
["Thaiphum Chin"] = "cth",
["Thakali"] = "ths",
["Thamudic"] = "sem-tha",
["Thangmi"] = "thf",
["Thao"] = "ssf",
["Tharaka"] = "thk",
["Tharrgari"] = "dhr",
["Thawa"] = "xtv",
["Thopho"] = "ytp",
["Thu Lao"] = "tyl",
["Thulung"] = "tdh",
["Thurawal"] = "tbh",
["Thuri"] = "thu",
["Tiagbamrin Aizi"] = "ahi",
["Tiale"] = "mnl",
["Tibea"] = "ngy",
["Ticuna"] = "tca",
["Tidaá Mixtec"] = "mtx",
["Tidore"] = "tvo",
["Tiemacèwè Bozo"] = "boo",
["Tiene"] = "tii",
["Tifal"] = "tif",
["Tigak"] = "tgc",
["Tii"] = "txq",
["Tijaltepec Mixtec"] = "xtl",
["Tikar"] = "tik",
["Tikopia"] = "tkp",
["Tilapa Otomi"] = "otl",
["Tillamook"] = "til",
["Tilquiapan Zapotec"] = "zts",
["Tilung"] = "tij",
["Tima"] = "tms",
["Timbe"] = "tim",
["Timor Pidgin"] = "tvy",
["Timote"] = "sai-tim",
["Timucua"] = "tjm",
["Timugon Murut"] = "tih",
["Tinani"] = "lbf",
["Tingui-Boto"] = "tgv",
["Tinigua"] = "tit",
["Tinoc Kallahan"] = "tne",
["Tinputz"] = "tpz",
["Tira"] = "tic",
["Tirahi"] = "tra",
["Tiranige Diga Dogon"] = "tde",
["Tircul"] = "pyx",
["Tiri"] = "cir",
["Tita"] = "tdq",
["Titan"] = "ttv",
["Tiv"] = "tiv",
["Tiéfo"] = "tiq",
["Tiéyaxo Bozo"] = "boz",
["Tjurruru"] = "tju",
["Tlacoatzintepec Chinantec"] = "ctl",
["Tlacolulita Zapotec"] = "zpk",
["Tlahuica"] = "ocu",
["Tlahuitoltepec Mixe"] = "mxp",
["Tlamacazapa Nahuatl"] = "nuz",
["Tlazoyaltepec Mixtec"] = "mqh",
["To"] = "toz",
["To'abaita"] = "mlu",
["Toaripi"] = "tqo",
["Toba"] = "tob",
["Toba Batak"] = "bbc",
["Toba-Maskoy"] = "tmf",
["Tobagonian Creole English"] = "tgh",
["Tobanga"] = "tng",
["Tobati"] = "tti",
["Tobelo"] = "tlb",
["Tobilung"] = "tgb",
["Tobo"] = "tbv",
["Tocantins Asurini"] = "asu",
["Tofanma"] = "tlg",
["Tofin Gbe"] = "tfi",
["Togbo-Vara Banda"] = "tor",
["Togoyo"] = "tgy",
["Tojolabal"] = "toj",
["Toka-Leya"] = "dov",
["Tokano"] = "zuh",
["Tol"] = "jic",
["Tolai"] = "ksd",
["Tolaki"] = "lbw",
["Tolomako"] = "tlm",
["Tolowa"] = "tol",
["Toloza"] = "ytl",
["Tomadino"] = "tdi",
["Tombelala"] = "ttp",
["Tombonuo"] = "txa",
["Tombulu"] = "tom",
["Tomini"] = "txm",
["Tommeginne"] = "xpv",
["Tommo So"] = "dto",
["Tomo Kan Dogon"] = "dtm",
["Tomoip"] = "tqp",
["Tondano"] = "tdn",
["Tonga (Malawi)"] = "tog",
["Tonga (Mozambique)"] = "toh",
["Tonga (Zambia)"] = "toi",
["Tongwe"] = "tny",
["Tonjon"] = "tjn",
["Tonsawang"] = "tnw",
["Tonsea"] = "txs",
["Tontemboan"] = "tnt",
["Toogee"] = "xpx",
["Topoiyo"] = "toy",
["Toposa"] = "toq",
["Toraja-Sa'dan"] = "sda",
["Toram"] = "trj",
["Torau"] = "ttu",
["Toro"] = "tdv",
["Toro So Dogon"] = "dts",
["Toro Tegu Dogon"] = "dtt",
["Toromono"] = "tno",
["Torona"] = "tqr",
["Torres Strait Creole"] = "tcs",
["Torricelli"] = "tei",
["Torricelli Yau"] = "yyu",
["Torá"] = "trz",
["Tosu"] = "sit-tos",
["Totela"] = "ttl",
["Totoli"] = "txe",
["Totomachapan Zapotec"] = "zph",
["Totontepec Mixe"] = "mto",
["Totoro"] = "ttk",
["Touo"] = "tqu",
["Toura"] = "neb",
["Tourangeau"] = "roa-tou",
["Towei"] = "ttn",
["Traveller Danish"] = "rmd",
["Traveller Norwegian"] = "rmg",
["Traveller Scottish"] = "trl",
["Tregami"] = "trm",
["Tremembé"] = "tme",
["Trieng"] = "stg",
["Trimuris"] = "tip",
["Tring"] = "tgq",
["Tringgus"] = "trx",
["Trinidad and Tobago Sign Language"] = "lst",
["Trinidadian Creole English"] = "trf",
["Trinitario"] = "trn",
["Truká"] = "tka",
["Trumai"] = "tpy",
["Ts'ün-Lao"] = "tsl",
["Tsaangi"] = "tsa",
["Tsafiki"] = "cof",
["Tsakwambo"] = "kvz",
["Tsetsaut"] = "txc",
["Tshobdun"] = "sit-tsh",
["Tshwa"] = "hio",
["Tsikimba"] = "kdl",
["Tsimané"] = "cas",
["Tsishingini"] = "tsw",
["Tso"] = "ldp",
["Tsogo"] = "tsv",
["Tsotsitaal"] = "fly",
["Tsum"] = "ttz",
["Tsuvadi"] = "tvd",
["Tsuvan"] = "tsh",
["Tswa"] = "tsc",
["Tswapong"] = "two",
["Tubar"] = "tbu",
["Tucano"] = "tuo",
["Tugen"] = "tuy",
["Tugun"] = "tzn",
["Tugutil"] = "tuj",
["Tukpa"] = "tpq",
["Tukudede"] = "tkd",
["Tukumanféd"] = "tkf",
["Tula"] = "tul",
["Tule-Kaweah Yokuts"] = "nai-tky",
["Tulehu"] = "tlu",
["Tulishi"] = "tey",
["Tulu-Bohuai"] = "rak",
["Tulua"] = "aus-tul",
["Tuma-Irumu"] = "iou",
["Tumak"] = "tmc",
["Tumi"] = "kku",
["Tumleo"] = "tmq",
["Tumshuqese"] = "xtq",
["Tumtum"] = "tbr",
["Tumulung Sisaala"] = "sil",
["Tunen"] = "tvu",
["Tungag"] = "lcm",
["Tunggare"] = "trt",
["Tunia"] = "tug",
["Tunisian Sign Language"] = "tse",
["Tunjung"] = "tjg",
["Tunumiisut"] = "esx-tut",
["Tunzu"] = "dza",
["Tuotomb"] = "ttf",
["Tuparí"] = "tpr",
["Tupinikin"] = "tpk",
["Tupuri"] = "tui",
["Turaka"] = "trh",
["Turi"] = "trd",
["Turiwára"] = "twt",
["Turka"] = "tuz",
["Turkana"] = "tuv",
["Turkish Sign Language"] = "tsm",
["Turks and Caicos Creole English"] = "tch",
["Turumsa"] = "tqm",
["Turung"] = "try",
["Tuscarora"] = "tus",
["Tutelo"] = "tta",
["Tutong"] = "ttg",
["Tutsa Naga"] = "tvt",
["Tutuba"] = "tmi",
["Tututepec Mixtec"] = "mtu",
["Tututni"] = "tuu",
["Tuwali Ifugao"] = "ifk",
["Tuwari"] = "tww",
["Tuxináwa"] = "tux",
["Tuxá"] = "tud",
["Tuyuca"] = "tue",
["Twana"] = "twa",
["Twendi"] = "twn",
["Tyaraity"] = "woa",
["Tyerrernotepanner"] = "xph",
["Tz'utujil"] = "tzj",
["Tzeltal"] = "tzh",
["Tày Tac"] = "tyt",
["Téén"] = "lor",
["Tübatulabal"] = "tub",
["Uab Meto"] = "aoz",
["Uamué"] = "uam",
["Uare"] = "ksj",
["Ubaghara"] = "byc",
["Ubang"] = "uba",
["Ubi"] = "ubi",
["Ubir"] = "ubr",
["Ucayali-Yurúa Ashéninka"] = "cpb",
["Uda"] = "uda",
["Ufim"] = "ufi",
["Ugandan Sign Language"] = "ugn",
["Ughele"] = "uge",
["Uhami"] = "uha",
["Uisai"] = "uis",
["Ujir"] = "udj",
["Ukaan"] = "kcf",
["Ukhwejo"] = "ukh",
["Ukit"] = "umi",
["Ukpe-Bayobiri"] = "ukp",
["Ukpet-Ehom"] = "akd",
["Ukrainian Sign Language"] = "ukl",
["Ukue"] = "uku",
["Ukuriguma"] = "ukg",
["Ukwa"] = "ukq",
["Ukwuani-Aboh-Ndoni"] = "ukw",
["Ulau-Suain"] = "svb",
["Uldeme"] = "udl",
["Ulithian"] = "uli",
["Ulumanda'"] = "ulm",
["Ulwa"] = "ulw",
["Uma"] = "ppk",
["Uma' Lasan"] = "xky",
["Uma' Lung"] = "ulu",
["Umanakaina"] = "gdn",
["Umatilla"] = "uma",
["Umbindhamu"] = "umd",
["Umbu-Ungu"] = "ubu",
["Umbugarla"] = "umr",
["Umbuygamu"] = "umg",
["Umeda"] = "upi",
["Umiida"] = "xud",
["Umiray Dumaget Agta"] = "due",
["Umon"] = "umm",
["Umotína"] = "umo",
["Umpila"] = "ump",
["Una"] = "mtg",
["Unas"] = "art-una",
["Unde Kaili"] = "unz",
["Uneme"] = "une",
["Unggaranggu"] = "xun",
["Unggumi"] = "xgu",
["Tiếng Uni"] = "uni",
["Unserdeutsch"] = "uln",
["Unua"] = "onu",
["Unubahe"] = "unu",
["Uokha"] = "uok",
["Upper Chehalis"] = "cjh",
["Upper Grand Valley Dani"] = "dna",
["Upper Kuskokwim"] = "kuu",
["Upper Necaxa Totonac"] = "tku",
["Upper Tanana"] = "tau",
["Upper Taromi"] = "tov",
["Upper Umpqua"] = "xup",
["Ura (New Guinea)"] = "uro",
["Ura (Vanuatu)"] = "uur",
["Uradhi"] = "urf",
["Urapmin"] = "urm",
["Urarina"] = "ura",
["Urat"] = "urt",
["Urhobo"] = "urh",
["Uri"] = "uvh",
["Urigina"] = "urg",
["Urim"] = "uri",
["Urimo"] = "urx",
["Urningangg"] = "urc",
["Uru"] = "ure",
["Uru-Eu-Wau-Wau"] = "urz",
["Uru-Pa-In"] = "urp",
["Uruangnirin"] = "urn",
["Uruava"] = "urv",
["Uruguayan Sign Language"] = "ugy",
["Urumi"] = "uru",
["Usaghade"] = "usk",
["Usan"] = "wnu",
["Usarufa"] = "usa",
["Usila Chinantec"] = "cuc",
["Uspanteco"] = "usp",
["Utarmbung"] = "omo",
["Ute"] = "ute",
["Utu"] = "utu",
["Uwinymil"] = "aus-uwi",
["Uya"] = "usu",
["Uyajitaya"] = "duk",
["Uzekwe"] = "eze",
["Vaghua"] = "tva",
["Vagla"] = "vag",
["Vai"] = "vai",
["Vaiphei"] = "vap",
["Vale"] = "vae",
["Valencian Sign Language"] = "vsv",
["Valle Nacional Chinantec"] = "cvn",
["Valley Maidu"] = "vmv",
["Valman"] = "van",
["Valpei"] = "vlp",
["Vamale"] = "mkt",
["Vame"] = "mlr",
["Vandalic"] = "xvn",
["Vangunu"] = "mpr",
["Vanimo"] = "vam",
["Vanji"] = "ira-wnj",
["Vanuma"] = "vau",
["Vao"] = "vao",
["Varhadi"] = "vah",
["Varisi"] = "vrs",
["Vayu"] = "vay",
["Veddah"] = "ved",
["Vehes"] = "val",
["Vemgo-Mabas"] = "vem",
["Venezuelan Sign Language"] = "vsl",
["Ventureño"] = "veo",
["Vera'a"] = "vra",
["Vestinian"] = "xvs",
["Vidunda"] = "vid",
["Viemo"] = "vig",
["Vilela"] = "vil",
["Vili"] = "vif",
["Villa Viciosa Agta"] = "dyg",
["Vincentian Creole English"] = "svc",
["Viti"] = "vit",
["Vitou"] = "vto",
["Viya"] = "gev",
["Vlax Romani"] = "rmy",
["Volga German"] = "gmw-vog",
["Vono"] = "kch",
["Voro"] = "vor",
["Vracada Apabhramsa"] = "inc-vra",
["Vumbu"] = "vum",
["Vunapu"] = "vnp",
["Vunjo"] = "vun",
["Vute"] = "vut",
["Wa"] = "wbm",
["Wa'ema"] = "wag",
["Waamwang"] = "wmn",
["Wab"] = "wab",
["Wabo"] = "wbb",
["Waboda"] = "kmx",
["Wadaginam"] = "wdg",
["Waddar"] = "wbq",
["Wadi Wadi"] = "xwd",
["Wadjabangayi"] = "wdy",
["Wadjiginy"] = "wdj",
["Wadjigu"] = "wdu",
["Wae Rana"] = "wrx",
["Waffa"] = "waj",
["Wagawaga"] = "wgb",
["Wagaya"] = "wga",
["Wagdi"] = "wbr",
["Wageman"] = "waq",
["Wahau Kayan"] = "whu",
["Wahau Kenyah"] = "whk",
["Waigali"] = "wbk",
["Waigeo"] = "wgo",
["Waikuri"] = "nai-wai",
["Wailaki"] = "wlk",
["Wailapa"] = "wlr",
["Waima'a"] = "wmh",
["Waimiri-Atroari"] = "atr",
["Wainumá"] = "awd-wai",
["Waioli"] = "wli",
["Waitaká"] = "sai-wai",
["Waja"] = "wja",
["Wajarri"] = "wbv",
["Wajuk"] = "xwj",
["Waka"] = "wav",
["Wakawaka"] = "wkw",
["Wakoná"] = "waf",
["Wala"] = "lgl",
["Walak"] = "wlw",
["Walangama"] = "nlw",
["Wali (Ghana)"] = "wlx",
["Wali (Sudan)"] = "wll",
["Waling"] = "wly",
["Walio"] = "wla",
["Walla Walla"] = "waa",
["Walmajarri"] = "wmt",
["Wam"] = "wmo",
["Wamas"] = "wmc",
["Wambaya"] = "wmb",
["Wambon"] = "wms",
["Wamey"] = "cou",
["Wamin"] = "wmi",
["Wampar"] = "lbq",
["Wampur"] = "waz",
["Wan"] = "wan",
["Wanambre"] = "wnb",
["Wanap"] = "wnp",
["Wanda"] = "wbh",
["Wandala"] = "mfi",
["Wandamen"] = "wad",
["Wandarang"] = "wnd",
["Wandji"] = "wdd",
["Wanga"] = "lwg",
["Wanggamala"] = "wnm",
["Wangganguru"] = "wgg",
["Wanggom"] = "wng",
["Wangkayutyuru"] = "wky",
["Wangkumara"] = "xwk",
["Wanham"] = "sai-wnm",
["Wanji"] = "wbi",
["Wanman"] = "wbt",
["Wannu"] = "jub",
["Wano"] = "wno",
["Wantoat"] = "wnc",
["Wanukaka"] = "wnk",
["Wanyi"] = "wny",
["Wané"] = "hwa",
["Wapan"] = "juk",
["Wapishana"] = "wap",
["Wappo"] = "wao",
["Wara"] = "wbf",
["Warao"] = "wba",
["Warapu"] = "wra",
["Waray Sorsogon"] = "srv",
["Wardandi"] = "wxw",
["Warembori"] = "wsa",
["Wari'"] = "pav",
["Waris"] = "wrs",
["Waritai"] = "wbe",
["Wariyangga"] = "wri",
["Warkay-Bipim"] = "bgv",
["Warlmanpa"] = "wrl",
["Warlpiri"] = "wbp",
["Warluwara"] = "wrb",
["Warnang"] = "wrn",
["Waropen"] = "wrp",
["Warray"] = "wrz",
["Warrgamay"] = "wgy",
["Warrwa"] = "wwr",
["Waru"] = "wru",
["Warumungu"] = "wrm",
["Waruna"] = "wrv",
["Warungu"] = "wrg",
["Warwar Feni"] = "hrw",
["Wasa"] = "wss",
["Wasco-Wishram"] = "wac",
["Wasembo"] = "gsp",
["Washo"] = "was",
["Waskia"] = "wsk",
["Wasu"] = "wsu",
["Watakataui"] = "wtk",
["Watam"] = "wax",
["Wathaurong"] = "wth",
["Watiwa"] = "wtf",
["Watubela"] = "wah",
["Waube"] = "kop",
["Wauja"] = "wau",
["Wauyai"] = "wuy",
["Wawa"] = "www",
["Tiếng Ngõa Hương"] = "wxa",
["Wayoró"] = "wyr",
["Wayumará"] = "sai-way",
["Wedau"] = "wed",
["Weh"] = "weh",
["Welaung"] = "weu",
["Weliki"] = "klh",
["Welsh Romani"] = "rmw",
["Wemale"] = "weo",
["Weme Gbe"] = "wem",
["Wendat"] = "wdt",
["Weri"] = "wer",
["Wersing"] = "kvw",
["West Albay Bikol"] = "fbl",
["West Ambae"] = "nnd",
["West Central Banda"] = "bbp",
["West Damar"] = "drn",
["West Greenlandic Pidgin"] = "crp-gep",
["West Lembata"] = "lmj",
["West Masela"] = "mss",
["West Tarangan"] = "txn",
["West Uvean"] = "uve",
["West-Central Limba"] = "lia",
["Western Arrernte"] = "are",
["Western Bolivian Guaraní"] = "gnw",
["Western Bukidnon Manobo"] = "mbb",
["Western Dani"] = "dnw",
["Western Durango Nahuatl"] = "azn",
["Western Fijian"] = "wyy",
["Western Gurung"] = "gvr",
["Western Jicaque"] = "und-wji",
["Western Juxtlahuaca Mixtec"] = "jmx",
["Western Karaboro"] = "kza",
["Western Keres"] = "kjq",
["Western Krahn"] = "krw",
["Western Lalu"] = "ywl",
["Western Maninkakan"] = "mlq",
["Western Mashan Hmong"] = "hmw",
["Western Meohang"] = "raf",
["Western Muria"] = "mut",
["Western Panjabi"] = "pnb",
["Western Penan"] = "pne",
["Western Sisaala"] = "ssl",
["Western Subanon"] = "suc",
["Western Tawbuid"] = "twb",
["Western Totonac"] = "tqt",
["Western Tunebo"] = "tnb",
["Western Xwla Gbe"] = "xwl",
["Westrobothnian"] = "gmq-bot",
["Weyewa"] = "wew",
["White Lachi"] = "lwh",
["Whitesands"] = "tnp",
["Wiarumus"] = "tua",
["Wichita"] = "wic",
["Wichí Lhamtés Güisnay"] = "mzh",
["Wichí Lhamtés Nocten"] = "mtp",
["Wichí Lhamtés Vejoz"] = "wlv",
["Wik-Epa"] = "wie",
["Wik-Iiyanh"] = "wij",
["Wik-Keyangan"] = "wif",
["Wik-Me'anha"] = "wih",
["Wik-Mungkan"] = "wim",
["Wik-Ngathana"] = "wig",
["Wikalkan"] = "wik",
["Wikngenchera"] = "wua",
["Wilawila"] = "wil",
["Wintu"] = "wnw",
["Winyé"] = "kst",
["Wipi"] = "gdr",
["Wiraféd"] = "wir",
["Wirangu"] = "wgu",
["Wiru"] = "wiu",
["Wirö"] = "wpc",
["Wiwa"] = "mbp",
["Woccon"] = "xwc",
["Wogamusin"] = "wog",
["Wogeo"] = "woc",
["Woi"] = "wbw",
["Wojenaka"] = "jod",
["Wolani"] = "wod",
["Woleaian"] = "woe",
["Womo"] = "wmx",
["Wong-gie"] = "aus-won",
["Wongo"] = "won",
["Woods Cree"] = "cwd",
["Woria"] = "wor",
["Worimi"] = "kda",
["Worodougou"] = "jud",
["Worora"] = "wro",
["Wotapuri-Katarqalai"] = "wsv",
["Woun Meu"] = "noa",
["Wudu"] = "wud",
["Wulguru"] = "aus-wul",
["Wuliwuli"] = "wlu",
["Wulna"] = "wux",
["Wumboko"] = "bqm",
["Wumbvu"] = "wum",
["Wumeng"] = "ywu",
["Wunai Bunu"] = "bwn",
["Wunambal"] = "wub",
["Wurrugu"] = "wur",
["Wusa"] = "yig",
["Wushi"] = "bse",
["Wusi"] = "wsi",
["Wutung"] = "wut",
["Wuvulu-Aua"] = "wuv",
["Wyandot"] = "wya",
["Wára"] = "tci",
["Wãpha"] = "juw",
["Wè Southern"] = "gxx",
["Wè Western"] = "wec",
["Xadani Zapotec"] = "zax",
["Xakriabá"] = "xkr",
["Xanaguía Zapotec"] = "ztg",
["Xaragure"] = "axx",
["Xerénte"] = "xer",
["Xetá"] = "xet",
["Xicotepec de Juárez Totonac"] = "too",
["Xinca"] = "xin",
["Xingú Asuriní"] = "asn",
["Xipaya"] = "xiy",
["Xiri"] = "xii",
["Xiriâna"] = "xir",
["Xishanba Lalo"] = "ywt",
["Xocó"] = "sai-xoc",
["Xokleng"] = "xok",
["Xukurú"] = "xoo",
["Xwela Gbe"] = "xwe",
["Yaa"] = "iyx",
["Yabarana"] = "yar",
["Yabaâna"] = "ybn",
["Yaben"] = "ybm",
["Yabong"] = "ybo",
["Yabula Yabula"] = "yxy",
["Yace"] = "ekr",
["Yafi"] = "wfg",
["Yagara"] = "yxg",
["Yagaria"] = "ygr",
["Yagomi"] = "ygm",
["Yagua"] = "yad",
["Yagwoia"] = "ygw",
["Yahadian"] = "ner",
["Yahang"] = "rhp",
["Yahuna"] = "ynu",
["Yaka"] = "yaf",
["Yakaikeke"] = "ykk",
["Yakoma"] = "yky",
["Yala"] = "yba",
["Yalahatan"] = "jal",
["Yalakalore"] = "xyl",
["Yalarnnga"] = "ylr",
["Yale"] = "nce",
["Yaleba"] = "ylb",
["Yalunka"] = "yal",
["Yalálag Zapotec"] = "zpu",
["Yamap"] = "ymp",
["Yamba"] = "yam",
["Yambes"] = "ymb",
["Yambeta"] = "yat",
["Yamdena"] = "jmd",
["Yameo"] = "yme",
["Yaminahua"] = "yaa",
["Yamongeri"] = "ymg",
["Yan-nhangu"] = "jay",
["Yana"] = "ynn",
["Yanda"] = "yda",
["Yanda Dogon"] = "dym",
["Yandjibara"] = "xyb",
["Yandruwandha"] = "ynd",
["Yangben"] = "yav",
["Yangkaal"] = "aus-ynk",
["Yangkam"] = "bsx",
["Yangman"] = "jng",
["Yango"] = "yng",
["Yangulam"] = "ynl",
["Yangum Dey"] = "yde",
["Yangum Gel"] = "ygl",
["Yangum Mon"] = "ymo",
["Yankunytjatjara"] = "kdd",
["Yanomamö"] = "guu",
["Yanomámi"] = "wca",
["Yansi"] = "yns",
["Yaosakor Asmat"] = "asy",
["Yaouré"] = "yre",
["Yaqay"] = "jaq",
["Yaqui"] = "yaq",
["Yarawata"] = "yrw",
["Yareba"] = "yrb",
["Yareni Zapotec"] = "zae",
["Yarli"] = "yxl",
["Yarluyandi"] = "yry",
["Yarumá"] = "sai-yar",
["Yarí"] = "yri",
["Yasa"] = "yko",
["Yatay"] = "yty",
["Yaul"] = "yla",
["Yaur"] = "jau",
["Yautepec Zapotec"] = "zpb",
["Yavitero"] = "yvt",
["Yawa"] = "yva",
["Yawalapití"] = "yaw",
["Yawanawa"] = "ywn",
["Yawarawarga"] = "yww",
["Yaweyuha"] = "yby",
["Yawijibaya"] = "jbw",
["Yawiyo"] = "ybx",
["Yawuru"] = "ywr",
["Yaygir"] = "xya",
["Yei"] = "jei",
["Yekhee"] = "ets",
["Yekora"] = "ykr",
["Yelmek"] = "jel",
["Yelogu"] = "ylg",
["Yemba"] = "ybb",
["Yemeni Arabic"] = "ayn",
["Yendang"] = "yen",
["Yeni"] = "yei",
["Yeniche"] = "yec",
["Yerakai"] = "yra",
["Yeretuar"] = "gop",
["Yerukula"] = "yeu",
["Yeskwa"] = "yes",
["Yessan-Mayo"] = "yss",
["Yetfa"] = "yet",
["Yeyi"] = "yey",
["Yil"] = "yll",
["Yimas"] = "yee",
["Yimchungru Naga"] = "yim",
["Yinbaw Karen"] = "kvu",
["Yindjilandji"] = "yil",
["Yine"] = "pib",
["Yinggarda"] = "yia",
["Yinhawangka"] = "ywg",
["Yiningayi"] = "ygi",
["Yintale Karen"] = "kvy",
["Yinwum"] = "yxm",
["Yir-Yoront"] = "yiy",
["Yirandali"] = "ljw",
["Yis"] = "yis",
["Yitha Yitha"] = "xth",
["Yoba"] = "yob",
["Yocoboué Dida"] = "gud",
["Yoidik"] = "ydk",
["Yoke"] = "yki",
["Yolngu Sign Language"] = "ygs",
["Yoloxochitl Mixtec"] = "xty",
["Yombe"] = "yom",
["Yopno"] = "yut",
["Yora"] = "mts",
["Yorta Yorta"] = "xyy",
["Younuo Bunu"] = "buh",
["Yout Wam"] = "ytw",
["Yuaga"] = "nua",
["Yucatec Maya Sign Language"] = "msd",
["Yuchi"] = "yuc",
["Yucuañe Mixtec"] = "mvg",
["Yucuna"] = "ycn",
["Yugambal"] = "yub",
["Yugoslavian Sign Language"] = "ysl",
["Yugul"] = "ygu",
["Yuhup"] = "yab",
["Yuki"] = "yuk",
["Yukpa"] = "yup",
["Yukuben"] = "ybl",
["Yulu"] = "yul",
["Yuma"] = "yum",
["Yumana"] = "awd-yum",
["Yupiltepeque"] = "nai-yup",
["Yupua"] = "sai-yup",
["Yuqui"] = "yuq",
["Yuracare"] = "yuz",
["Yuru"] = "ljx",
["Yurumanguí"] = "sai-yur",
["Yurutí"] = "yui",
["Yutanduchi Mixtec"] = "mab",
["Yuwana"] = "yau",
["Yuyu"] = "yxu",
["Zaachila Zapotec"] = "ztx",
["Zabana"] = "kji",
["Zacatlán-Ahuacatlán-Tepetzintla Nahuatl"] = "nhi",
["Zakhring"] = "zkr",
["Zambian Sign Language"] = "zsl",
["Zan Gula"] = "zna",
["Zanaki"] = "zak",
["Zande"] = "zne",
["Zangwal"] = "zah",
["Zaramo"] = "zaj",
["Zari"] = "zaz",
["Zauzou"] = "zal",
["Zazao"] = "jaj",
["Zbu"] = "sit-zbu",
["Zeem"] = "zua",
["Zemba"] = "dhm",
["Zeme Naga"] = "nzm",
["Zemgalian"] = "xzm",
["Zenag"] = "zeg",
["Zenzontepec Chatino"] = "czn",
["Zhang-Zhung"] = "xzh",
["Zhire"] = "zhi",
["Zhoa"] = "zhw",
["Zhár"] = "jjr",
["Zia"] = "zia",
["Zialo"] = "zil",
["Zigula"] = "ziw",
["Zimakani"] = "zik",
["Zimba"] = "zmb",
["Zimbabwe Sign Language"] = "zib",
["Zinza"] = "zin",
["Zipser German"] = "gmw-zps",
["Zire"] = "sih",
["Ziriya"] = "zir",
["Zizilivakan"] = "ziz",
["Zo'é"] = "pto",
["Zokhuo"] = "yzk",
["Zotung Chin"] = "czt",
["Zulgo-Gemzek"] = "gnd",
["Zumaya"] = "zuy",
["Zuni"] = "zun",
["Zuwara"] = "ber-zuw",
["Zyphe"] = "zyp",
["Záparo"] = "zro",
["Biệt ngữ Chinook"] = "chn",
["Không xác định ngôn ngữ"] = "und",
["Ngôn ngữ ký hiệu Mỹ"] = "ase",
["Tiếng 'Are'are"] = "alu",
["Tiếng A Xương"] = "acn",
["Tiếng A'ou"] = "aou",
["Tiếng A-Hmao"] = "hmd",
["Tiếng Aari"] = "aiw",
["Tiếng Aari nguyên thủy"] = "omv-aro-pro",
["Tiếng Aasax"] = "aas",
["Tiếng Abaga"] = "abg",
["Tiếng Abai"] = "poz-abi",
["Tiếng Abanyom"] = "abm",
["Tiếng Abau"] = "aau",
["Tiếng Abaza"] = "abq",
["Tiếng Abidji"] = "abi",
["Tiếng Abinomn"] = "bsa",
["Tiếng Abkhaz"] = "ab",
["Tiếng Abkhaz-Abaza nguyên thủy"] = "cau-abz-pro",
["Tiếng Abon"] = "abo",
["Tiếng Abron"] = "abr",
["Tiếng Abui"] = "abz",
["Tiếng Abure"] = "abu",
["Tiếng Aceh"] = "ace",
["Tiếng Achawa"] = "aca",
["Tiếng Acheron"] = "acz",
["Tiếng Achi"] = "acr",
["Tiếng Acholi"] = "ach",
["Tiếng Achuar"] = "acu",
["Tiếng Achumawi"] = "acv",
["Tiếng Adangme"] = "ada",
["Tiếng Adi"] = "adi",
["Tiếng Adja"] = "ajg",
["Tiếng Adnyamathanha"] = "adt",
["Tiếng Adygea"] = "ady",
["Tiếng Adzera"] = "adz",
["Tiếng Aer"] = "aeq",
["Tiếng Afade"] = "aal",
["Tiếng Afar"] = "aa",
["Tiếng Afrikaans"] = "af",
["Tiếng Agatu"] = "agc",
["Tiếng Agawam"] = "alg-aga",
["Tiếng Aghem"] = "agq",
["Tiếng Aghul"] = "agx",
["Tiếng Aghwan"] = "xag",
["Tiếng Agta Dupaningan"] = "duo",
["Tiếng Aguacateca"] = "agu",
["Tiếng Ahom"] = "aho",
["Tiếng Ahtna"] = "aht",
["Tiếng Ai"] = "eee",
["Tiếng Ai Cập"] = "egy",
["Tiếng Ai Cập bình dân"] = "egx-dem",
["Tiếng Aimol"] = "aim",
["Tiếng Ainu"] = "ain",
["Tiếng Aiton"] = "aio",
["Tiếng Ajië"] = "aji",
["Tiếng Aka-Bo"] = "akm",
["Tiếng Aka-Jeru"] = "akj",
["Tiếng Aka-Kede"] = "akx",
["Tiếng Akan"] = "ak",
["Tiếng Akaselem"] = "aks",
["Tiếng Akawaio"] = "ake",
["Tiếng Akha"] = "ahk",
["Tiếng Akhvakh"] = "akv",
["Tiếng Akkad"] = "akk",
["Tiếng Aklanon"] = "akl",
["Tiếng Akoose"] = "bss",
["Tiếng Akuntsu"] = "aqz",
["Tiếng Alaba-K’abeena"] = "alw",
["Tiếng Alabama"] = "akz",
["Tiếng Alagwa"] = "wbj",
["Tiếng Alak"] = "alk",
["Tiếng Alamblak"] = "amp",
["Tiếng Alangan"] = "alj",
["Tiếng Alawa"] = "alh",
["Tiếng Albani"] = "sq",
["Tiếng Albani nguyên thủy"] = "sqj-pro",
["Tiếng Alchuka"] = "tuw-alk",
["Tiếng Alekano"] = "gah",
["Tiếng Aleut"] = "ale",
["Tiếng Algic nguyên thủy"] = "aql-pro",
["Tiếng Algonquin"] = "alq",
["Tiếng Algonquin nguyên thủy"] = "alg-pro",
["Tiếng Allar"] = "all",
["Tiếng Alsea"] = "aes",
["Tiếng Alumu-Tesu"] = "aab",
["Tiếng Alutor"] = "alr",
["Tiếng Alyentiyak"] = "sai-all",
["Tiếng Ama"] = "amm",
["Tiếng Amahuaca"] = "amc",
["Tiếng Amaimon"] = "ali",
["Tiếng Amal"] = "aad",
["Tiếng Amanab"] = "amn",
["Tiếng Amarasi"] = "aaz",
["Tiếng Ambai"] = "amk",
["Tiếng Ambrak"] = "aag",
["Tiếng Ambulas"] = "abt",
["Tiếng Amdang"] = "amj",
["Tiếng Amhara"] = "am",
["Tiếng Amis"] = "ami",
["Tiếng Amurdag"] = "amg",
["Tiếng Amuzgo"] = "amu",
["Tiếng Anaang"] = "anw",
["Tiếng Anal"] = "anm",
["Tiếng Anauyá"] = "awd-ana",
["Tiếng Andi"] = "ani",
["Tiếng Angami"] = "njm",
["Tiếng Angika"] = "anp",
["Tiếng Angkula"] = "aus-ang",
["Tiếng Angola"] = "aoa",
["Tiếng Anh"] = "en",
["Tiếng Anh Solombala"] = "crp-slb",
["Tiếng Anh cổ"] = "ang",
["Tiếng Anh trung đại"] = "enm",
["Tiếng Anii"] = "blo",
["Tiếng Ankave"] = "aak",
["Tiếng Annobón"] = "fab",
["Tiếng Anuak"] = "anu",
["Tiếng Anuki"] = "aui",
["Tiếng Anyi"] = "any",
["Tiếng Ao"] = "njo",
["Tiếng Apabhramsa"] = "inc-apa",
["Tiếng Apache Tây"] = "apw",
["Tiếng Apache đồng bằng"] = "apk",
["Tiếng Aparaí"] = "apy",
["Tiếng Apatani"] = "apt",
["Tiếng Apinayé"] = "apn",
["Tiếng Aputai"] = "apx",
["Tiếng Aquitani"] = "xaq",
["Tiếng Aragon"] = "an",
["Tiếng Araki"] = "akr",
["Tiếng Arakwal"] = "rkw",
["Tiếng Aram"] = "arc",
["Tiếng Aranadan"] = "aaf",
["Tiếng Arapaho"] = "arp",
["Tiếng Arawak nguyên thủy"] = "awd-pro",
["Tiếng Araweté"] = "awt",
["Tiếng Archi"] = "aqc",
["Tiếng Arem"] = "aem",
["Tiếng Argobba"] = "agj",
["Tiếng Arhuaco"] = "arh",
["Tiếng Ari"] = "aac",
["Tiếng Arin"] = "xrn",
["Tiếng Armenia"] = "hy",
["Tiếng Armenia cổ"] = "xcl",
["Tiếng Armenia trung đại"] = "axm",
["Tiếng Aromania"] = "rup",
["Tiếng Arrernte Đông"] = "aer",
["Tiếng Ashkun"] = "ask",
["Tiếng Ashraaf"] = "cus-ash",
["Tiếng Ashéninka Pajonal"] = "cjo",
["Tiếng Asi"] = "bno",
["Tiếng Askopan"] = "eiv",
["Tiếng Asli nguyên thủy"] = "mkh-asl-pro",
["Tiếng Assam"] = "as",
["Tiếng Assam cận đại"] = "inc-oas",
["Tiếng Assan"] = "xss",
["Tiếng Assiniboine"] = "asb",
["Tiếng Asturias"] = "ast",
["Tiếng Asumboa"] = "aua",
["Tiếng Asur"] = "asr",
["Tiếng Atayal"] = "tay",
["Tiếng Atemble"] = "ate",
["Tiếng Athabasca nguyên thủy"] = "ath-pro",
["Tiếng Athpariya"] = "aph",
["Tiếng Atikamekw"] = "atj",
["Tiếng Atong (Ấn Độ)"] = "aot",
["Tiếng Atsahuaca"] = "atc",
["Tiếng Auhelawa"] = "kud",
["Tiếng Aukan"] = "djk",
["Tiếng Avar"] = "av",
["Tiếng Avar-Andic nguyên thủy"] = "cau-ava-pro",
["Tiếng Avatime"] = "avn",
["Tiếng Avesta"] = "ae",
["Tiếng Avokaya"] = "avu",
["Tiếng Awa (Trung Quốc)"] = "vwa",
["Tiếng Awadh"] = "awa",
["Tiếng Awadh cổ"] = "inc-oaw",
["Tiếng Aweer"] = "bob",
["Tiếng Awing"] = "azo",
["Tiếng Awjila"] = "auj",
["Tiếng Awngi"] = "awn",
["Tiếng Axi"] = "yix",
["Tiếng Ayere"] = "aye",
["Tiếng Aymara"] = "ay",
["Tiếng Azerbaijan"] = "az",
["Tiếng Ba Lan"] = "pl",
["Tiếng Ba Lan cổ"] = "zlw-opl",
["Tiếng Ba Na"] = "bdq",
["Tiếng Ba Tư"] = "fa",
["Tiếng Ba Tư cổ"] = "peo",
["Tiếng Ba Tư trung đại"] = "pal",
["Tiếng Ba Tư-Do Thái"] = "jpr",
["Tiếng Baagandji"] = "drl",
["Tiếng Baatonum"] = "bba",
["Tiếng Babatana"] = "baa",
["Tiếng Babungo"] = "bav",
["Tiếng Babuza"] = "bzg",
["Tiếng Bacama"] = "bcy",
["Tiếng Bactria"] = "xbc",
["Tiếng Badaga"] = "bfq",
["Tiếng Badanchi"] = "bau",
["Tiếng Bade"] = "bde",
["Tiếng Badui"] = "bac",
["Tiếng Bagua"] = "sai-bag",
["Tiếng Bagvalal"] = "kva",
["Tiếng Bahing"] = "bhj",
["Tiếng Bahnar nguyên thủy"] = "mkh-ban-pro",
["Tiếng Bainouk-Gunyuño"] = "bab",
["Tiếng Baiso"] = "bsw",
["Tiếng Bajjika"] = "vjk",
["Tiếng Bakaka"] = "bqz",
["Tiếng Bakhtiari"] = "bqi",
["Tiếng Baki"] = "bki",
["Tiếng Bakung"] = "xkl",
["Tiếng Bala"] = "tuw-bal",
["Tiếng Balanta-Ganja"] = "bjt",
["Tiếng Balanta-Kentohe"] = "ble",
["Tiếng Balantak"] = "blz",
["Tiếng Bali"] = "ban",
["Tiếng Baloch"] = "bal",
["Tiếng Balt-Slav nguyên thủy"] = "ine-bsl-pro",
["Tiếng Balti"] = "bft",
["Tiếng Bambara"] = "bm",
["Tiếng Bambassi"] = "myf",
["Tiếng Bamum"] = "bax",
["Tiếng Bana"] = "bcw",
["Tiếng Bandjalang"] = "bdy",
["Tiếng Banggai"] = "bgz",
["Tiếng Bangi"] = "bni",
["Tiếng Bangolan"] = "bgj",
["Tiếng Banjar"] = "bjn",
["Tiếng Bankon"] = "abb",
["Tiếng Bantawa"] = "bap",
["Tiếng Bantayanon"] = "bfx",
["Tiếng Bantoid nguyên thủy"] = "nic-bod-pro",
["Tiếng Bantu nguyên thủy"] = "bnt-pro",
["Tiếng Banyumas"] = "map-bms",
["Tiếng Baoule"] = "bci",
["Tiếng Barai"] = "bbb",
["Tiếng Barakai"] = "baj",
["Tiếng Bari"] = "bfa",
["Tiếng Barikewa"] = "jbk",
["Tiếng Barombi"] = "bbi",
["Tiếng Baré"] = "bae",
["Tiếng Basaa"] = "bas",
["Tiếng Basay"] = "byq",
["Tiếng Bashkir"] = "ba",
["Tiếng Basketo"] = "bst",
["Tiếng Basque"] = "eu",
["Tiếng Basque nguyên thủy"] = "euq-pro",
["Tiếng Bassa"] = "bsq",
["Tiếng Bassari"] = "bsc",
["Tiếng Batak Simalungun"] = "bts",
["Tiếng Batek"] = "btq",
["Tiếng Bats"] = "bbl",
["Tiếng Batuley"] = "bay",
["Tiếng Bayern"] = "bar",
["Tiếng Beaver"] = "bea",
["Tiếng Bedjond"] = "bjv",
["Tiếng Beja"] = "bej",
["Tiếng Belarus"] = "be",
["Tiếng Belhariya"] = "byw",
["Tiếng Beli"] = "blm",
["Tiếng Bella Coola"] = "blc",
["Tiếng Bellara"] = "brw",
["Tiếng Belnəng"] = "glb",
["Tiếng Bemba"] = "bem",
["Tiếng Bench"] = "bcq",
["Tiếng Bengal"] = "bn",
["Tiếng Bengal cổ"] = "inc-obn",
["Tiếng Benue-Congo nguyên thủy"] = "nic-bco-pro",
["Tiếng Berber Bắc Sahara"] = "mzb",
["Tiếng Berber Tunisia"] = "sds",
["Tiếng Berber nguyên thủy"] = "ber-pro",
["Tiếng Berber-Do Thái"] = "jbe",
["Tiếng Berik"] = "bkl",
["Tiếng Betawi"] = "bew",
["Tiếng Bezhta"] = "kap",
["Tiếng Bhadrawah"] = "bhd",
["Tiếng Bhatri"] = "bgw",
["Tiếng Bhattiyat"] = "bht",
["Tiếng Bhil"] = "bhb",
["Tiếng Bhil Dungra"] = "duh",
["Tiếng Bhnong"] = "mkh-bhn",
["Tiếng Bhojpur"] = "bho",
["Tiếng Bhumij"] = "aav-bhu",
["Tiếng Bhunjia"] = "bhu",
["Tiếng Bidayuh Bau"] = "sne",
["Tiếng Bidayuh Biatah"] = "bth",
["Tiếng Bih"] = "ibh",
["Tiếng Bihari"] = "bh",
["Tiếng Bikol Buhi'non"] = "ubl",
["Tiếng Bilaspur"] = "kfs",
["Tiếng Bilen"] = "byn",
["Tiếng Bilua"] = "blb",
["Tiếng Bima"] = "bhp",
["Tiếng Binukid"] = "bkd",
["Tiếng Birao"] = "brr",
["Tiếng Birgit"] = "btf",
["Tiếng Birhor"] = "biy",
["Tiếng Birjia"] = "bix",
["Tiếng Bisaya Sabah"] = "bsy",
["Tiếng Bishnupriya"] = "bpy",
["Tiếng Bislama"] = "bi",
["Tiếng Bissa"] = "bib",
["Tiếng Bisu"] = "bzi",
["Tiếng Bit"] = "bgk",
["Tiếng Blackfoot"] = "bla",
["Tiếng Blagar"] = "beu",
["Tiếng Blang"] = "blr",
["Tiếng Bod nguyên thủy"] = "sit-bdi-pro",
["Tiếng Bodo (Ấn Độ)"] = "brx",
["Tiếng Bodo Parja"] = "bdv",
["Tiếng Bodo-Garo nguyên thủy"] = "tbq-bdg-pro",
["Tiếng Boghom"] = "bux",
["Tiếng Bokar"] = "sit-bok",
["Tiếng Boko"] = "bqc",
["Tiếng Bokobaru"] = "bus",
["Tiếng Bola"] = "bnp",
["Tiếng Boloki"] = "bkt",
["Tiếng Bomu"] = "bmq",
["Tiếng Bondo"] = "bfw",
["Tiếng Boon"] = "bnl",
["Tiếng Borôro"] = "bor",
["Tiếng Botlikh"] = "bph",
["Tiếng Bourguignon"] = "roa-brg",
["Tiếng Brahui"] = "brh",
["Tiếng Braj"] = "bra",
["Tiếng Breri"] = "brq",
["Tiếng Breton"] = "br",
["Tiếng Breton cổ"] = "obt",
["Tiếng Breton trung đại"] = "xbm",
["Tiếng Britton nguyên thủy"] = "cel-bry-pro",
["Tiếng Brokkat"] = "bro",
["Tiếng Brokpa"] = "sgt",
["Tiếng Bru"] = "bru",
["Tiếng Bru Tây"] = "brv",
["Tiếng Brâu"] = "brb",
["Tiếng Buang Mapos"] = "bzh",
["Tiếng Bube"] = "bvb",
["Tiếng Budukh"] = "bdk",
["Tiếng Bughotu"] = "bgt",
["Tiếng Bugis"] = "bug",
["Tiếng Buhid"] = "bku",
["Tiếng Bukhara"] = "bhh",
["Tiếng Bukiyip"] = "ape",
["Tiếng Bulgar"] = "xbo",
["Tiếng Bulgari"] = "bg",
["Tiếng Bumthang"] = "kjz",
["Tiếng Bungku"] = "bkz",
["Tiếng Bunun"] = "bnn",
["Tiếng Burji"] = "bji",
["Tiếng Burunge"] = "bds",
["Tiếng Burushaski"] = "bsk",
["Tiếng Buryat"] = "bua",
["Tiếng Busa"] = "bqp",
["Tiếng Bushi"] = "buc",
["Tiếng Bussa"] = "dox",
["Tiếng Butuanon"] = "btw",
["Tiếng Bách Tế"] = "pkc",
["Tiếng Bạch Lạp Mã"] = "lay",
["Tiếng Bạch Nam"] = "bfs",
["Tiếng Bạch Trung"] = "bca",
["Tiếng Bạch nguyên thủy"] = "sit-bai-pro",
["Tiếng Bảo An"] = "peh",
["Tiếng Bắc Altai"] = "atv",
["Tiếng Bắc Amami Ōshima"] = "ryn",
["Tiếng Bắc Catanduanes Bikol"] = "cts",
["Tiếng Bắc Emberá"] = "emp",
["Tiếng Bắc Friesland"] = "frr",
["Tiếng Bắc Iroquois nguyên thủy"] = "iro-nor-pro",
["Tiếng Bắc Khanty"] = "kca-nor",
["Tiếng Bắc Mansi"] = "mns-nor",
["Tiếng Bắc Ndebele"] = "nd",
["Tiếng Bắc Nisu"] = "yiv",
["Tiếng Bắc Paiute"] = "pao",
["Tiếng Bắc Sami"] = "se",
["Tiếng Bắc Selkup"] = "sel-nor",
["Tiếng Bắc Slavey"] = "scs",
["Tiếng Bắc Thái"] = "nod",
["Tiếng Bắc Yukaghir"] = "ykg",
["Tiếng Bắc Âu cổ"] = "non",
["Tiếng Bắc Âu nguyên thủy"] = "gmq-pro",
["Tiếng Bố Cam"] = "bbh",
["Tiếng Bố Lưu"] = "ply",
["Tiếng Bố Mang"] = "bvp",
["Tiếng Bố Y"] = "pcc",
["Tiếng Bối-Thái nguyên thủy"] = "qfa-bet-pro",
["Tiếng Bồ Đào Nha"] = "pt",
["Tiếng Bổ trợ Quốc tế"] = "ia",
["Tiếng Ca Dong"] = "kxy",
["Tiếng Ca Tua"] = "kta",
["Tiếng Cahuilla"] = "chl",
["Tiếng Camling"] = "rab",
["Tiếng Camuni"] = "xcc",
["Tiếng Canela"] = "ram",
["Tiếng Cao Câu Ly"] = "zkg",
["Tiếng Capanahua"] = "kaq",
["Tiếng Carib nguyên thủy"] = "sai-car-pro",
["Tiếng Carrier"] = "crx",
["Tiếng Carrier Nam"] = "caf",
["Tiếng Catalan"] = "ca",
["Tiếng Catalan cổ"] = "roa-oca",
["Tiếng Catawba"] = "chc",
["Tiếng Cayuga"] = "cay",
["Tiếng Cebu"] = "ceb",
["Tiếng Celt nguyên thủy"] = "cel-pro",
["Tiếng Celtiberi"] = "xce",
["Tiếng Cerrado nguyên thủy"] = "sai-cer-pro",
["Tiếng Ch'orti'"] = "caa",
["Tiếng Chachi"] = "cbi",
["Tiếng Chagatai"] = "chg",
["Tiếng Chaima"] = "ciy",
["Tiếng Chak"] = "ckh",
["Tiếng Chakma"] = "ccp",
["Tiếng Chamalal"] = "cji",
["Tiếng Chamba"] = "cdh",
["Tiếng Chamicuro"] = "ccc",
["Tiếng Chamorro"] = "ch",
["Tiếng Chantyal"] = "chx",
["Tiếng Chatino cao nguyên Tây"] = "ctp",
["Tiếng Chaura"] = "crv",
["Tiếng Chavacano"] = "cbk",
["Tiếng Chechen"] = "ce",
["Tiếng Chenchu"] = "cde",
["Tiếng Chenoua"] = "cnu",
["Tiếng Chepang"] = "cdm",
["Tiếng Cherokee"] = "chr",
["Tiếng Chetti Moundadan"] = "cty",
["Tiếng Chetti Wayanad"] = "ctt",
["Tiếng Chewong"] = "cwg",
["Tiếng Cheyenne"] = "chy",
["Tiếng Chhattisgarh"] = "hne",
["Tiếng Chibcha"] = "chb",
["Tiếng Chichewa"] = "ny",
["Tiếng Chickasaw"] = "cic",
["Tiếng Chilcotin"] = "clc",
["Tiếng Chin Asho"] = "csh",
["Tiếng Chin Ekai"] = "cey",
["Tiếng Chin Falam"] = "cfm",
["Tiếng Chin Hakha"] = "cnh",
["Tiếng Chin Songlai"] = "csj",
["Tiếng Chin Tedim"] = "ctd",
["Tiếng Chinal"] = "cih",
["Tiếng Chinantec Ojitlán"] = "chj",
["Tiếng Chinantec Ozumacín"] = "chz",
["Tiếng Chinantec Tepinapa"] = "cte",
["Tiếng Chinook"] = "chh",
["Tiếng Chiricahua"] = "apm",
["Tiếng Chiru"] = "cdf",
["Tiếng Chittagong"] = "ctg",
["Tiếng Chiwere"] = "iow",
["Tiếng Chocangacakha"] = "cgk",
["Tiếng Choctaw"] = "cho",
["Tiếng Chodri"] = "cdi",
["Tiếng Chol"] = "ctu",
["Tiếng Chong"] = "cog",
["Tiếng Chu Ru"] = "cje",
["Tiếng Chukot"] = "ckt",
["Tiếng Chulym"] = "clw",
["Tiếng Churah"] = "cdj",
["Tiếng Chuuk"] = "chk",
["Tiếng Chuvan"] = "xcv",
["Tiếng Chuvash"] = "cv",
["Tiếng Châu Đại Dương nguyên thủy"] = "poz-oce-pro",
["Tiếng Chăm Tây"] = "cja",
["Tiếng Chăm cổ"] = "ocm",
["Tiếng Chăm nguyên thủy"] = "cmc-pro",
["Tiếng Chăm Đông"] = "cjm",
["Tiếng Chơ Ro"] = "crw",
["Tiếng Chứt"] = "scb",
["Tiếng Cia-Cia"] = "cia",
["Tiếng Cimbri"] = "cim",
["Tiếng Circassia nguyên thủy"] = "cau-cir-pro",
["Tiếng Co"] = "cua",
["Tiếng Cocama"] = "cod",
["Tiếng Cochimi"] = "coj",
["Tiếng Coeur d'Alene"] = "crd",
["Tiếng Cofán"] = "con",
["Tiếng Comanche"] = "com",
["Tiếng Comoros Maore"] = "swb",
["Tiếng Comox"] = "coo",
["Tiếng Copt"] = "cop",
["Tiếng Cornwall"] = "kw",
["Tiếng Cornwall cổ"] = "oco",
["Tiếng Corse"] = "co",
["Tiếng Cowlitz"] = "cow",
["Tiếng Cree"] = "cr",
["Tiếng Cree Moose"] = "crm",
["Tiếng Cree Đông Bắc"] = "crl",
["Tiếng Cree Đông Nam"] = "crj",
["Tiếng Cree đồng bằng"] = "crk",
["Tiếng Creole Antilles"] = "gcf",
["Tiếng Creole Guinea-Bissau"] = "pov",
["Tiếng Creole Haiti"] = "ht",
["Tiếng Creole Hà Lan Berbice"] = "brc",
["Tiếng Creole Jamaica"] = "jam",
["Tiếng Creole Louisiana"] = "lou",
["Tiếng Creole Mauritius"] = "mfe",
["Tiếng Creole Nghi Lan"] = "ycr",
["Tiếng Creole Réunion"] = "rcf",
["Tiếng Creole quần đảo Virgin"] = "vic",
["Tiếng Crow"] = "cro",
["Tiếng Cuman"] = "qwm",
["Tiếng Cumanagoto"] = "cuo",
["Tiếng Cumbria"] = "xcb",
["Tiếng Cupeño"] = "cup",
["Tiếng Cushit nguyên thủy"] = "cus-pro",
["Tiếng Cuyunon"] = "cyo",
["Tiếng Càn-đà-la"] = "pgd",
["Tiếng Cám"] = "gan",
["Tiếng Cơ Nặc Du Lạc"] = "jiu",
["Tiếng Cơ Tu"] = "ktv",
["Tiếng Cơ Tu Phương"] = "phg",
["Tiếng Cơ Tu Tây"] = "kuf",
["Tiếng Cơ Tu nguyên thủy"] = "mkh-kat-pro",
["Tiếng Cống"] = "cnc",
["Tiếng Cờ Lao Trắng"] = "giw",
["Tiếng Daasanach"] = "dsh",
["Tiếng Dabarre"] = "dbr",
["Tiếng Dacia"] = "xdc",
["Tiếng Dadibi"] = "mps",
["Tiếng Dagara Bắc"] = "dgi",
["Tiếng Dagba"] = "dgk",
["Tiếng Dagbani"] = "dag",
["Tiếng Dahalik"] = "dlk",
["Tiếng Dahalo"] = "dal",
["Tiếng Dakota"] = "dak",
["Tiếng Dakpa"] = "dka",
["Tiếng Dalmatia"] = "dlm",
["Tiếng Dambi"] = "dac",
["Tiếng Damel"] = "dml",
["Tiếng Dan"] = "dnj",
["Tiếng Danau"] = "dnu",
["Tiếng Dangaléat"] = "daa",
["Tiếng Danu"] = "dnv",
["Tiếng Danuwar"] = "dhw",
["Tiếng Dar Daju Daju"] = "djc",
["Tiếng Dargwa"] = "dar",
["Tiếng Dargwa nguyên thủy"] = "cau-drg-pro",
["Tiếng Daur"] = "dta",
["Tiếng Dawro"] = "dwr",
["Tiếng Deg Xinag"] = "ing",
["Tiếng Degema"] = "deg",
["Tiếng Denesuline"] = "chp",
["Tiếng Deori"] = "der",
["Tiếng Desiya"] = "dso",
["Tiếng Dhangu"] = "dhg",
["Tiếng Dhanka"] = "dhn",
["Tiếng Dharug"] = "xdk",
["Tiếng Dhatki"] = "mki",
["Tiếng Dhimal"] = "dhi",
["Tiếng Dhivehi"] = "dv",
["Tiếng Dhodia"] = "dho",
["Tiếng Dhundhar"] = "dhd",
["Tiếng Dibabawon"] = "mbd",
["Tiếng Dieri"] = "dif",
["Tiếng Digan"] = "rom",
["Tiếng Digan Balkan"] = "rmn",
["Tiếng Digan Baltic"] = "rml",
["Tiếng Digan Tavringer"] = "rmu",
["Tiếng Dimasa"] = "dis",
["Tiếng Dime"] = "dim",
["Tiếng Dinka"] = "din",
["Tiếng Dirasha"] = "gdl",
["Tiếng Ditidaht"] = "dtd",
["Tiếng Dizi"] = "mdx",
["Tiếng Dizi nguyên thủy"] = "omv-diz-pro",
["Tiếng Djinang"] = "dji",
["Tiếng Do Thái"] = "he",
["Tiếng Dogri"] = "doi",
["Tiếng Dogri Hindi"] = "dgo",
["Tiếng Dogrib"] = "dgr",
["Tiếng Dolgan"] = "dlg",
["Tiếng Dolpo"] = "dre",
["Tiếng Domaaki"] = "dmk",
["Tiếng Domari"] = "rmt",
["Tiếng Dongolawi"] = "kzh",
["Tiếng Doteli"] = "dty",
["Tiếng Dravida nguyên thủy"] = "dra-pro",
["Tiếng Dubla"] = "dub",
["Tiếng Dukha"] = "trk-dkh",
["Tiếng Dumi"] = "dus",
["Tiếng Duruwa"] = "pci",
["Tiếng Dusun Witu"] = "duw",
["Tiếng Duun"] = "dux",
["Tiếng Duy Ngô Nhĩ"] = "ug",
["Tiếng Duy Ngô Nhĩ cổ"] = "oui",
["Tiếng Dyirbal"] = "dbl",
["Tiếng Dyula"] = "dyu",
["Tiếng Dzala"] = "dzl",
["Tiếng Dzongkha"] = "dz",
["Tiếng Dzuun"] = "dnn",
["Tiếng Ebla"] = "xeb",
["Tiếng Ebrié"] = "ebr",
["Tiếng Ebughu"] = "ebg",
["Tiếng Ede Ica"] = "ica",
["Tiếng Ede Idaca"] = "idd",
["Tiếng Ede Nago"] = "nqg",
["Tiếng Edekiri nguyên thủy"] = "alv-edk-pro",
["Tiếng Edo"] = "bin",
["Tiếng Edoid nguyên thủy"] = "alv-edo-pro",
["Tiếng Efai"] = "efa",
["Tiếng Efate Bắc"] = "llp",
["Tiếng Efate Nam"] = "erk",
["Tiếng Efe"] = "efe",
["Tiếng Efik"] = "efi",
["Tiếng Ega"] = "ega",
["Tiếng Eggon"] = "ego",
["Tiếng Ehueun"] = "ehu",
["Tiếng Eipomek"] = "eip",
["Tiếng Eitiep"] = "eit",
["Tiếng Ejagham"] = "etu",
["Tiếng El Molo"] = "elo",
["Tiếng Elam"] = "elx",
["Tiếng Elymi"] = "xly",
["Tiếng Emberá-Chamí"] = "cmi",
["Tiếng Emberá-Tadó"] = "tdc",
["Tiếng Embu"] = "ebu",
["Tiếng Emilia"] = "egl",
["Tiếng Enets lãnh nguyên"] = "enh",
["Tiếng Enets rừng"] = "enf",
["Tiếng Engenni"] = "enn",
["Tiếng Enisei nguyên thủy"] = "qfa-yen-pro",
["Tiếng Eotile"] = "eot",
["Tiếng Epie"] = "epi",
["Tiếng Eravalla"] = "era",
["Tiếng Erzya"] = "myv",
["Tiếng Esan"] = "ish",
["Tiếng Ese"] = "mcq",
["Tiếng Esimbi"] = "ags",
["Tiếng Eskimo nguyên thủy"] = "esx-esk-pro",
["Tiếng Eskimo-Aleut nguyên thủy"] = "esx-pro",
["Tiếng Estonia"] = "et",
["Tiếng Eteocrete"] = "ecr",
["Tiếng Etrusca"] = "ett",
["Tiếng Even"] = "eve",
["Tiếng Evenk"] = "evn",
["Tiếng Ewe"] = "ee",
["Tiếng Fala"] = "fax",
["Tiếng Falisci"] = "xfa",
["Tiếng Fanagalo"] = "fng",
["Tiếng Fang (Bantu)"] = "fan",
["Tiếng Faroe"] = "fo",
["Tiếng Fe'fe'"] = "fmp",
["Tiếng Fiji"] = "fj",
["Tiếng Finn nguyên thủy"] = "urj-fin-pro",
["Tiếng Flemish Tây"] = "vls",
["Tiếng Fogaha"] = "ber-fog",
["Tiếng Foi"] = "foi",
["Tiếng Fon"] = "fon",
["Tiếng Fox"] = "sac",
["Tiếng Franche-Comté"] = "roa-fcm",
["Tiếng Franco-Provençal"] = "frp",
["Tiếng Franken Trung"] = "gmw-cfr",
["Tiếng Frisia Saterland"] = "stq",
["Tiếng Frisia cổ"] = "ofs",
["Tiếng Friuli"] = "fur",
["Tiếng Fula"] = "ff",
["Tiếng Fur"] = "fvr",
["Tiếng Ga"] = "gaa",
["Tiếng Gabri"] = "gab",
["Tiếng Gadaba Bodo"] = "gbj",
["Tiếng Gaddang"] = "gad",
["Tiếng Gaddi"] = "gbk",
["Tiếng Gael Scotland"] = "gd",
["Tiếng Gagauz"] = "gag",
["Tiếng Gahri"] = "bfu",
["Tiếng Galati"] = "xga",
["Tiếng Galicia"] = "gl",
["Tiếng Galicia-Bồ Đào Nha"] = "roa-opt",
["Tiếng Gallo"] = "roa-gal",
["Tiếng Gallura"] = "sdn",
["Tiếng Galo"] = "adl",
["Tiếng Gamilaraay"] = "kld",
["Tiếng Gamit"] = "gbl",
["Tiếng Gamo"] = "gmv",
["Tiếng Ganza"] = "gza",
["Tiếng Garasia Adiwasi"] = "gas",
["Tiếng Garasia Rajput"] = "gra",
["Tiếng Garhwal"] = "gbm",
["Tiếng Garifuna"] = "cab",
["Tiếng Garo"] = "grt",
["Tiếng Garre"] = "gex",
["Tiếng Gata'"] = "gaq",
["Tiếng Gaul"] = "cel-gau",
["Tiếng Gawar-Bati"] = "gwt",
["Tiếng Gawwada"] = "gwd",
["Tiếng Gayil"] = "gyl",
["Tiếng Gbe Saxwe"] = "sxw",
["Tiếng Gbe Waci"] = "wci",
["Tiếng Gbe nguyên thủy"] = "alv-gbe-pro",
["Tiếng Gbiri-Niragu"] = "grh",
["Tiếng Gedeo"] = "drs",
["Tiếng Gen"] = "gej",
["Tiếng German Tây nguyên thủy"] = "gmw-pro",
["Tiếng German nguyên thủy"] = "gem-pro",
["Tiếng Graeco-Phrygia nguyên thủy"] = "ine-grp-pro",
["Tiếng Geʽez"] = "gez",
["Tiếng Ghadames"] = "gha",
["Tiếng Ghomala'"] = "bbj",
["Tiếng Ghomara"] = "gho",
["Tiếng Ghotuo"] = "aaa",
["Tiếng Gia Rai"] = "jra",
["Tiếng Gikuyu"] = "ki",
["Tiếng Gilak"] = "glk",
["Tiếng Gimi (Goroka)"] = "gim",
["Tiếng Girirra"] = "gii",
["Tiếng Giryama"] = "nyf",
["Tiếng Gitxsan"] = "git",
["Tiếng Giẻ"] = "jeh",
["Tiếng Glosa"] = "igs",
["Tiếng Godoberi"] = "gdo",
["Tiếng Gofa"] = "gof",
["Tiếng Gone Dau"] = "goo",
["Tiếng Gooniyandi"] = "gni",
["Tiếng Goran"] = "hac",
["Tiếng Gorontalo"] = "gor",
["Tiếng Gorowa"] = "gow",
["Tiếng Goth"] = "got",
["Tiếng Gotland"] = "gmq-gut",
["Tiếng Gotland cổ"] = "gmq-ogt",
["Tiếng Greenland"] = "kl",
["Tiếng Gruzia"] = "ka",
["Tiếng Gruzia cổ"] = "oge",
["Tiếng Gruzia-Do Thái"] = "jge",
["Tiếng Gruzia-Zan nguyên thủy"] = "ccs-gzn-pro",
["Tiếng Guajajára"] = "gub",
["Tiếng Guajá"] = "gvj",
["Tiếng Guanche"] = "gnc",
["Tiếng Guarani Mbya"] = "gun",
["Tiếng Guarani Paraguay"] = "gug",
["Tiếng Guaraní"] = "gn",
["Tiếng Guarayu"] = "gyr",
["Tiếng Gujar"] = "gju",
["Tiếng Gujarat"] = "gu",
["Tiếng Gujarat cổ"] = "inc-ogu",
["Tiếng Gujarat trung đại"] = "inc-mgu",
["Tiếng Gulay"] = "gvl",
["Tiếng Gulimancema"] = "gux",
["Tiếng Gumuz"] = "guk",
["Tiếng Gun"] = "guw",
["Tiếng Gurenne"] = "gur",
["Tiếng Guugu Yimidhirr"] = "kky",
["Tiếng Gwichʼin"] = "gwi",
["Tiếng H'Mông Tương Tây Tây"] = "mmr",
["Tiếng H'Mông-Miền nguyên thủy"] = "hmx-pro",
["Tiếng H'roi"] = "hro",
["Tiếng Hachijō"] = "jpx-hcj",
["Tiếng Hadiyya"] = "hdy",
["Tiếng Haida"] = "hai",
["Tiếng Haisla"] = "has",
["Tiếng Hajong"] = "haj",
["Tiếng Halba"] = "hlb",
["Tiếng Halkomelem"] = "hur",
["Tiếng Hamer-Banna"] = "amf",
["Tiếng Hano"] = "lml",
["Tiếng Hanunoo"] = "hnn",
["Tiếng Harari"] = "har",
["Tiếng Harsusi"] = "hss",
["Tiếng Haryanvi"] = "bgc",
["Tiếng Hatti"] = "xht",
["Tiếng Hausa"] = "ha",
["Tiếng Haush"] = "sai-hau",
["Tiếng Havasupai-Walapai-Yavapai"] = "yuf",
["Tiếng Hawaii"] = "haw",
["Tiếng Hazara"] = "haz",
["Tiếng Heiban"] = "hbn",
["Tiếng Heiltsuk"] = "hei",
["Tiếng Hellen nguyên thủy"] = "grk-pro",
["Tiếng Herero"] = "hz",
["Tiếng Hernici"] = "xhr",
["Tiếng Higaonon"] = "mba",
["Tiếng Hiligaynon"] = "hil",
["Tiếng Hindi"] = "hi",
["Tiếng Hindi Fiji"] = "hif",
["Tiếng Hindi cổ"] = "inc-ohi",
["Tiếng Hindko Bắc"] = "hno",
["Tiếng Hinduri"] = "hii",
["Tiếng Hindustan Caribe"] = "hns",
["Tiếng Hinukh"] = "gin",
["Tiếng Hiri Motu"] = "ho",
["Tiếng Hitti"] = "hit",
["Tiếng Hiw"] = "hiw",
["Tiếng Hlai"] = "lic",
["Tiếng Hlai nguyên thủy"] = "qfa-lic-pro",
["Tiếng Ho"] = "hoc",
["Tiếng Hoava"] = "hoa",
["Tiếng Hocak"] = "win",
["Tiếng Holiya"] = "hoy",
["Tiếng Hopi"] = "hop",
["Tiếng Horpa"] = "ero",
["Tiếng Hozo"] = "hoz",
["Tiếng Hpon"] = "hpo",
["Tiếng Hrê"] = "hre",
["Tiếng Hu"] = "huo",
["Tiếng Hulaulá"] = "huy",
["Tiếng Hungary"] = "hu",
["Tiếng Hunsrik"] = "hrx",
["Tiếng Hunzib"] = "huz",
["Tiếng Hupa"] = "hup",
["Tiếng Hupdë"] = "jup",
["Tiếng Hurri"] = "xhu",
["Tiếng Huy"] = "czh",
["Tiếng Hy Lạp"] = "el",
["Tiếng Hy Lạp Cappadocia"] = "cpg",
["Tiếng Hy Lạp Italiot"] = "grk-ita",
["Tiếng Hy Lạp Mariupol"] = "grk-mar",
["Tiếng Hy Lạp Mycenae"] = "gmy",
["Tiếng Hy Lạp Pontos"] = "pnt",
["Tiếng Hy Lạp cổ"] = "grc",
["Tiếng Hyam"] = "jab",
["Tiếng Hà Lan"] = "nl",
["Tiếng Hà Lan Jersey"] = "gmw-jdt",
["Tiếng Hà Lan cổ"] = "odt",
["Tiếng Hà Lan trung đại"] = "dum",
["Tiếng Hà Lăng"] = "hal",
["Tiếng Hà Nhì"] = "hni",
["Tiếng Hán thượng cổ"] = "och",
["Tiếng Hán trung cổ"] = "ltc",
["Tiếng Hán-Tạng nguyên thủy"] = "sit-pro",
["Tiếng Hạ Saxon Hà Lan"] = "nds-nl",
["Tiếng Hạ Sorb"] = "dsb",
["Tiếng Hạ Tanana"] = "taa",
["Tiếng Hạ Đức"] = "nds",
["Tiếng Hạ Đức Mennonite"] = "pdt",
["Tiếng Hạ Đức trung đại"] = "gml",
["Tiếng Hạ Đức tại Đức"] = "nds-de",
["Tiếng Iaai"] = "iai",
["Tiếng Ibaloi"] = "ibl",
["Tiếng Iban"] = "iba",
["Tiếng Ibanag"] = "ibg",
["Tiếng Ibatan"] = "ivb",
["Tiếng Ibibio"] = "ibb",
["Tiếng Ibino"] = "ibn",
["Tiếng Ibuoro"] = "ibr",
["Tiếng Iceland"] = "is",
["Tiếng Ida'an"] = "dbj",
["Tiếng Ido"] = "io",
["Tiếng Idu"] = "clk",
["Tiếng Ifugao Batad"] = "ifb",
["Tiếng Ifè"] = "ife",
["Tiếng Igala"] = "igl",
["Tiếng Igbo"] = "ig",
["Tiếng Ikposo"] = "kpo",
["Tiếng Ikwere"] = "ikw",
["Tiếng Ili Turki"] = "ili",
["Tiếng Ilokano"] = "ilo",
["Tiếng Indo-Bồ Đào Nha"] = "idb",
["Tiếng Indonesia"] = "id",
["Tiếng Indonesia Peranakan"] = "pea",
["Tiếng Ingria"] = "izh",
["Tiếng Ingush"] = "inh",
["Tiếng Inor"] = "ior",
["Tiếng Interlingue"] = "ie",
["Tiếng Intha"] = "int",
["Tiếng Inuit nguyên thủy"] = "esx-inu-pro",
["Tiếng Inuktitut"] = "iu",
["Tiếng Inuktitut Đông Canada"] = "ike",
["Tiếng Inupiaq"] = "ik",
["Tiếng Inuvialuktun"] = "ikt",
["Tiếng Iran nguyên thủy"] = "ira-pro",
["Tiếng Iraqw"] = "irk",
["Tiếng Ireland"] = "ga",
["Tiếng Ireland cổ"] = "sga",
["Tiếng Ireland trung đại"] = "mga",
["Tiếng Iroquois nguyên thủy"] = "iro-pro",
["Tiếng Irula"] = "iru",
["Tiếng Isan"] = "tts",
["Tiếng Ishkashim"] = "isk",
["Tiếng Isnag"] = "isd",
["Tiếng Isoko"] = "iso",
["Tiếng Istria"] = "ist",
["Tiếng Istria Rumani"] = "ruo",
["Tiếng Italic nguyên thủy"] = "itc-pro",
["Tiếng Itaŋikom"] = "bkm",
["Tiếng Itelmen"] = "itl",
["Tiếng Itene"] = "ite",
["Tiếng Itonama"] = "ito",
["Tiếng Itsekiri"] = "its",
["Tiếng Itu Mbon Uzo"] = "itm",
["Tiếng Ivatan"] = "ivv",
["Tiếng Iwaidja"] = "ibd",
["Tiếng Ixil"] = "ixl",
["Tiếng Izon"] = "ijc",
["Tiếng Jacaltec"] = "jac",
["Tiếng Jah Hut"] = "jah",
["Tiếng Jamamadí"] = "jaa",
["Tiếng Japhug"] = "sit-jap",
["Tiếng Jaqaru"] = "jqr",
["Tiếng Jarawa"] = "anq",
["Tiếng Jaunsar"] = "jns",
["Tiếng Java"] = "jv",
["Tiếng Java Caribe"] = "jvn",
["Tiếng Java cổ"] = "kaw",
["Tiếng Javindo"] = "jvd",
["Tiếng Jehai"] = "jhi",
["Tiếng Jeju"] = "jje",
["Tiếng Jemez"] = "tow",
["Tiếng Jicarilla"] = "apj",
["Tiếng Jiiddu"] = "jii",
["Tiếng Jirel"] = "jul",
["Tiếng Jju"] = "kaj",
["Tiếng Jru'"] = "lbo",
["Tiếng Juang"] = "jun",
["Tiếng Jukun Takum"] = "jbu",
["Tiếng Jumaytepeque"] = "nai-jum",
["Tiếng Jumjum"] = "jum",
["Tiếng Juray"] = "juy",
["Tiếng Juǀ'hoan"] = "ktz",
["Tiếng Jylland"] = "jut",
["Tiếng Jê Bắc nguyên thủy"] = "sai-nje-pro",
["Tiếng Jê nguyên thủy"] = "sai-jee-pro",
["Tiếng K'Ho"] = "kpm",
["Tiếng K'iche'"] = "quc",
["Tiếng Kabardia"] = "kbd",
["Tiếng Kabiye"] = "kbp",
["Tiếng Kabuverdianu"] = "kea",
["Tiếng Kabyle"] = "kab",
["Tiếng Kachama-Ganjule"] = "kcx",
["Tiếng Kachin"] = "kac",
["Tiếng Kadar"] = "kej",
["Tiếng Kadazan bờ biển"] = "kzj",
["Tiếng Kadu"] = "zkd",
["Tiếng Kafa"] = "kbr",
["Tiếng Kagayanen"] = "cgc",
["Tiếng Kaikadi"] = "kep",
["Tiếng Kaingang"] = "kgp",
["Tiếng Kaitag"] = "xdq",
["Tiếng Kakabai"] = "kqf",
["Tiếng Kaki Ae"] = "tbd",
["Tiếng Kalam"] = "gwc",
["Tiếng Kalanguya"] = "kak",
["Tiếng Kalao"] = "kly",
["Tiếng Kalash"] = "kls",
["Tiếng Kalinga Limos"] = "kmk",
["Tiếng Kalkot"] = "xka",
["Tiếng Kalmyk"] = "xal",
["Tiếng Kalo Phần Lan"] = "rmf",
["Tiếng Kamarupi Prakrit"] = "inc-kam",
["Tiếng Kamassia"] = "xas",
["Tiếng Kamayo"] = "kyk",
["Tiếng Kambaata"] = "ktb",
["Tiếng Kambera"] = "xbr",
["Tiếng Kamula"] = "xla",
["Tiếng Kanakanavu"] = "xnb",
["Tiếng Kanan"] = "zkn",
["Tiếng Kangean"] = "kkv",
["Tiếng Kangra"] = "xnr",
["Tiếng Kankanaey"] = "kne",
["Tiếng Kannada"] = "kn",
["Tiếng Kannada cổ"] = "dra-okn",
["Tiếng Kannauj"] = "bjj",
["Tiếng Kanuri"] = "kr",
["Tiếng Kapampangan"] = "pam",
["Tiếng Kapingamarangi"] = "kpg",
["Tiếng Kaqchikel"] = "cak",
["Tiếng Karachay-Balkar"] = "krc",
["Tiếng Karaim"] = "kdr",
["Tiếng Karajá"] = "kpj",
["Tiếng Karakalpak"] = "kaa",
["Tiếng Karakhanid"] = "xqa",
["Tiếng Karao"] = "kyj",
["Tiếng Karata"] = "kpt",
["Tiếng Karbi"] = "mjw",
["Tiếng Karekare"] = "kai",
["Tiếng Karelia"] = "krl",
["Tiếng Karen Bwe"] = "bwe",
["Tiếng Karen Geba"] = "kvq",
["Tiếng Karen Geko"] = "ghk",
["Tiếng Karen Mobwa"] = "jkm",
["Tiếng Karen Paku"] = "jkp",
["Tiếng Karen S'gaw"] = "ksw",
["Tiếng Karen Zayein"] = "kxk",
["Tiếng Karen nguyên thủy"] = "kar-pro",
["Tiếng Kari'na"] = "car",
["Tiếng Kariri"] = "kzw",
["Tiếng Karitiâna"] = "ktn",
["Tiếng Karo"] = "kxh",
["Tiếng Kartvelia nguyên thủy"] = "ccs-pro",
["Tiếng Kashaya"] = "kju",
["Tiếng Kashmir"] = "ks",
["Tiếng Kaszëb"] = "csb",
["Tiếng Katang Bắc"] = "ncq",
["Tiếng Kaurna"] = "zku",
["Tiếng Kavalan"] = "ckv",
["Tiếng Kavet"] = "krv",
["Tiếng Kawésqar"] = "alc",
["Tiếng Kayan"] = "pdu",
["Tiếng Kayapó"] = "txu",
["Tiếng Kayort"] = "kyv",
["Tiếng Kazakh"] = "kk",
["Tiếng Kensiu"] = "kns",
["Tiếng Kenyang"] = "ken",
["Tiếng Kerek"] = "krk",
["Tiếng Kerman"] = "xme-ker",
["Tiếng Ket"] = "ket",
["Tiếng Khakas"] = "kjh",
["Tiếng Khalaj"] = "klj",
["Tiếng Khaling"] = "klr",
["Tiếng Kham Gamale"] = "kgj",
["Tiếng Kham Parbate Tây"] = "kjl",
["Tiếng Kham Parbate Đông"] = "kif",
["Tiếng Kham Sheshi"] = "kip",
["Tiếng Khamba"] = "kbg",
["Tiếng Khamti"] = "kht",
["Tiếng Khamyang"] = "ksu",
["Tiếng Khang Gia"] = "kxs",
["Tiếng Khanty"] = "kca",
["Tiếng Kharia"] = "khr",
["Tiếng Khasa Prakrit"] = "inc-kha",
["Tiếng Khasi"] = "kha",
["Tiếng Khasi nguyên thủy"] = "aav-khs-pro",
["Tiếng Khazar"] = "zkz",
["Tiếng Khengkha"] = "xkf",
["Tiếng Khiamniungan"] = "kix",
["Tiếng Khinalug"] = "kjj",
["Tiếng Khiết Đan"] = "zkt",
["Tiếng Khmer"] = "km",
["Tiếng Khmer Surin"] = "kxm",
["Tiếng Khmer cổ"] = "okz",
["Tiếng Khmer nguyên thủy"] = "mkh-kmr-pro",
["Tiếng Khmer trung đại"] = "xhm",
["Tiếng Khoekhoe"] = "naq",
["Tiếng Kholosi"] = "inc-kho",
["Tiếng Khotan"] = "kho",
["Tiếng Khowar"] = "khw",
["Tiếng Khroskyabs"] = "jiq",
["Tiếng Khuen"] = "khf",
["Tiếng Khvarshi"] = "khv",
["Tiếng Khwarezm"] = "xco",
["Tiếng Khách Gia"] = "hak",
["Tiếng Kháng"] = "kjm",
["Tiếng Khùa"] = "xhv",
["Tiếng Khün"] = "kkh",
["Tiếng Khơ Mú"] = "kjg",
["Tiếng Khơ Mú nguyên thủy"] = "mkh-khm-pro",
["Tiếng Khương Bắc"] = "cng",
["Tiếng Khương Nam"] = "qxs",
["Tiếng Khương Đường"] = "cna",
["Tiếng Kickapoo"] = "kic",
["Tiếng Kikai"] = "kzg",
["Tiếng Kili"] = "tuw-kil",
["Tiếng Kim"] = "kia",
["Tiếng Kim Môn"] = "mji",
["Tiếng Kimbundu"] = "kmb",
["Tiếng Kinaray-a"] = "krj",
["Tiếng Kinnaur"] = "kfk",
["Tiếng Kinnaur Harija"] = "kjo",
["Tiếng Kintaq"] = "knq",
["Tiếng Kiowa"] = "kio",
["Tiếng Gilbert"] = "gil",
["Tiếng Kirike"] = "okr",
["Tiếng Kisan"] = "xis",
["Tiếng Kistane"] = "gru",
["Tiếng Kituba"] = "ktu",
["Tiếng Klallam"] = "clm",
["Tiếng Klingon"] = "tlh",
["Tiếng Knaan"] = "czk",
["Tiếng Koalib"] = "kib",
["Tiếng Kobon"] = "kpw",
["Tiếng Koch"] = "kdq",
["Tiếng Koda"] = "cdz",
["Tiếng Kodava"] = "kfa",
["Tiếng Kohistan"] = "mvy",
["Tiếng Koibal"] = "zkb",
["Tiếng Kok Borok"] = "trp",
["Tiếng Kolami"] = "kfb",
["Tiếng Kolhe"] = "ekl",
["Tiếng Koli Kachi"] = "gjk",
["Tiếng Koli Parkar"] = "kvx",
["Tiếng Koli Wadiyara"] = "kxp",
["Tiếng Koman nguyên thủy"] = "ssa-kom-pro",
["Tiếng Komi cổ"] = "urj-koo",
["Tiếng Komi-Permyak"] = "koi",
["Tiếng Komi-Yazva"] = "urj-kya",
["Tiếng Komi-Zyrian"] = "kpv",
["Tiếng Komo"] = "xom",
["Tiếng Komodo"] = "kvh",
["Tiếng Konabéré"] = "bbo",
["Tiếng Konda-Dora"] = "kfc",
["Tiếng Kondekor"] = "gau",
["Tiếng Kongo"] = "kg",
["Tiếng Konkan"] = "kok",
["Tiếng Konobo"] = "kqo",
["Tiếng Konso"] = "kxc",
["Tiếng Koonzime"] = "ozm",
["Tiếng Koore"] = "kqy",
["Tiếng Koraga Korra"] = "kfd",
["Tiếng Koraga Mudu"] = "vmd",
["Tiếng Korku"] = "kfq",
["Tiếng Korwa"] = "kfp",
["Tiếng Koryak"] = "kpy",
["Tiếng Kosrae"] = "kos",
["Tiếng Kota (Ấn Độ)"] = "kfe",
["Tiếng Kotava"] = "avk",
["Tiếng Kott"] = "zko",
["Tiếng Koya"] = "kff",
["Tiếng Kpelle Guinea"] = "gkp",
["Tiếng Kpelle Liberia"] = "xpe",
["Tiếng Kra nguyên thủy"] = "qfa-kra-pro",
["Tiếng Kra-Dai nguyên thủy"] = "qfa-tak-pro",
["Tiếng Kraol"] = "rka",
["Tiếng Kresh"] = "krs",
["Tiếng Krio"] = "kri",
["Tiếng Kriol Úc"] = "rop",
["Tiếng Krung"] = "krr",
["Tiếng Krymchak"] = "jct",
["Tiếng Kryts"] = "kry",
["Tiếng Ktunaxa"] = "kut",
["Tiếng Kubachi"] = "ugh",
["Tiếng Kudiya"] = "kfg",
["Tiếng Kudmal"] = "kyw",
["Tiếng Kui (Ấn Độ)"] = "uki",
["Tiếng Kui Dawik"] = "dwk",
["Tiếng Kuke"] = "ght",
["Tiếng Kuki-Chin nguyên thủy"] = "tbq-kuk-pro",
["Tiếng Kukna"] = "kex",
["Tiếng Kullu"] = "kfx",
["Tiếng Kulon-Pazeh"] = "uun",
["Tiếng Kumbewaha"] = "xks",
["Tiếng Kumeyaay"] = "nai-kum",
["Tiếng Kumyk"] = "kum",
["Tiếng Kumzar"] = "zum",
["Tiếng Kuna"] = "cuk",
["Tiếng Kundal Shahi"] = "shd",
["Tiếng Kunigami"] = "xug",
["Tiếng Kuo"] = "xuo",
["Tiếng Kupia"] = "key",
["Tiếng Kurichiya"] = "kfh",
["Tiếng Kurmanji"] = "kmr",
["Tiếng Kurtokha"] = "xkz",
["Tiếng Kurukh"] = "kru",
["Tiếng Kurumba Alu"] = "xua",
["Tiếng Kurumba Attapady"] = "pkr",
["Tiếng Kurumba Betta"] = "xub",
["Tiếng Kurumba Jennu"] = "xuj",
["Tiếng Kurumba Kannada"] = "kfi",
["Tiếng Kurumba Mullu"] = "kpb",
["Tiếng Kushi"] = "kuh",
["Tiếng Kutch"] = "kfr",
["Tiếng Kutep"] = "kub",
["Tiếng Kuvi"] = "kxv",
["Tiếng Kuy"] = "kdt",
["Tiếng Kven"] = "fkv",
["Tiếng Kw'adza"] = "wka",
["Tiếng Kwak'wala"] = "kwk",
["Tiếng Kwanja"] = "knp",
["Tiếng Kwanyama"] = "kj",
["Tiếng Kwinti"] = "kww",
["Tiếng Kyakala"] = "tuw-kkl",
["Tiếng Kyrgyz"] = "ky",
["Tiếng Kyrgyz Phú Dụ"] = "trk-fyk",
["Tiếng Kâte"] = "kmg",
["Tiếng La Hủ"] = "lhu",
["Tiếng Laalaa"] = "cae",
["Tiếng Ladakh"] = "lbj",
["Tiếng Ladin"] = "lld",
["Tiếng Ladino"] = "lad",
["Tiếng Lahnda"] = "lah",
["Tiếng Lahta"] = "kvt",
["Tiếng Lak"] = "lbe",
["Tiếng Lakalei"] = "lka",
["Tiếng Laki"] = "lki",
["Tiếng Lakota"] = "lkt",
["Tiếng Lama Gur"] = "las",
["Tiếng Lambadi"] = "lmn",
["Tiếng Lamboya"] = "lmy",
["Tiếng Lamkang"] = "lmk",
["Tiếng Lanoh"] = "lnh",
["Tiếng Laomian"] = "lwm",
["Tiếng Lar"] = "lrl",
["Tiếng Lasalimu"] = "llm",
["Tiếng Lashi"] = "lsi",
["Tiếng Latgale"] = "ltg",
["Tiếng Latinh"] = "la",
["Tiếng Latundê"] = "ltn",
["Tiếng Latvia"] = "lv",
["Tiếng Lavukaleve"] = "lvk",
["Tiếng Lawa Tây"] = "lcp",
["Tiếng Lawa Đông"] = "lwl",
["Tiếng Lawi"] = "lvi",
["Tiếng Laya"] = "lya",
["Tiếng Laz"] = "lzz",
["Tiếng Lelemi"] = "lef",
["Tiếng Lemnos"] = "xle",
["Tiếng Lepcha"] = "lep",
["Tiếng Leponti"] = "xlp",
["Tiếng Lewo"] = "lww",
["Tiếng Lezgi"] = "lez",
["Tiếng Lezgi nguyên thủy"] = "cau-lzg-pro",
["Tiếng León"] = "roa-leo",
["Tiếng León cổ"] = "roa-ole",
["Tiếng Lhao Vo"] = "mhx",
["Tiếng Lhomi"] = "lhm",
["Tiếng Liabuku"] = "lix",
["Tiếng Libido"] = "liq",
["Tiếng Liguria"] = "lij",
["Tiếng Lillooet"] = "lil",
["Tiếng Limbum"] = "lmp",
["Tiếng Limburg"] = "li",
["Tiếng Lindu"] = "klw",
["Tiếng Lingala"] = "ln",
["Tiếng Lipan"] = "apl",
["Tiếng Lishana Deni"] = "lsd",
["Tiếng Lishanid Noshan"] = "aij",
["Tiếng Lisu"] = "lis",
["Tiếng Litva"] = "lt",
["Tiếng Litva cổ"] = "olt",
["Tiếng Livonia"] = "liv",
["Tiếng Livvi"] = "olo",
["Tiếng Lobi"] = "lob",
["Tiếng Lodha"] = "lbm",
["Tiếng Logba"] = "lgq",
["Tiếng Lojban"] = "jbo",
["Tiếng Loke"] = "loy",
["Tiếng Lokono"] = "arw",
["Tiếng Loma"] = "lom",
["Tiếng Lomavren"] = "rmi",
["Tiếng Lombard"] = "lmo",
["Tiếng Lorrain"] = "roa-lor",
["Tiếng Lotha Naga"] = "njh",
["Tiếng Lou"] = "loj",
["Tiếng Luba-Katanga"] = "lu",
["Tiếng Lucumí"] = "luq",
["Tiếng Luganda"] = "lg",
["Tiếng Luhya"] = "luy",
["Tiếng Lukpa"] = "dop",
["Tiếng Lumbu"] = "lup",
["Tiếng Lunana"] = "luk",
["Tiếng Lur Bắc"] = "lrc",
["Tiếng Lur Nam"] = "luz",
["Tiếng Lushootseed"] = "lut",
["Tiếng Lutuv"] = "clt",
["Tiếng Luwi"] = "xlu",
["Tiếng Luxembourg"] = "lb",
["Tiếng Lycia"] = "xlc",
["Tiếng Lydia"] = "xld",
["Tiếng Lyngngam"] = "lyg",
["Tiếng Lyydi"] = "lud",
["Tiếng Lào"] = "lo",
["Tiếng Lâm Cao"] = "onb",
["Tiếng Lô Lô"] = "ii",
["Tiếng Lô Lô-Miến nguyên thủy"] = "tbq-lob-pro",
["Tiếng Lư Nhân"] = "sit-lrn",
["Tiếng Lưu Cầu nguyên thủy"] = "jpx-ryu-pro",
["Tiếng Lự"] = "khb",
["Tiếng M'Nông Nam"] = "mnn",
["Tiếng M'Nông Trung"] = "cmo",
["Tiếng M'Nông Đông"] = "mng",
["Tiếng Ma Thoa"] = "nru",
["Tiếng Ma'anyan"] = "mhy",
["Tiếng Maaka"] = "mew",
["Tiếng Maale"] = "mdy",
["Tiếng Maasai"] = "mas",
["Tiếng Maay"] = "ymm",
["Tiếng Mabaan"] = "mfz",
["Tiếng Mabang"] = "mde",
["Tiếng Macedoni cổ đại"] = "xmk",
["Tiếng Macedonia"] = "mk",
["Tiếng Macushi"] = "mbc",
["Tiếng Madura"] = "mad",
["Tiếng Magaha"] = "mag",
["Tiếng Magar Tây"] = "mrd",
["Tiếng Magar Đông"] = "mgp",
["Tiếng Magori"] = "zgr",
["Tiếng Maguindanao"] = "mdh",
["Tiếng Mah Meri"] = "mhe",
["Tiếng Mahal"] = "mjx",
["Tiếng Maithil"] = "mai",
["Tiếng Majang"] = "mpe",
["Tiếng Makassar"] = "mak",
["Tiếng Mal"] = "mlf",
["Tiếng Malagasy"] = "mg",
["Tiếng Malankurava"] = "mjo",
["Tiếng Malapandaram"] = "mjp",
["Tiếng Malarya"] = "mjq",
["Tiếng Malasar"] = "ymr",
["Tiếng Malasar Mala"] = "ima",
["Tiếng Malavedan"] = "mjr",
["Tiếng Malayalam"] = "ml",
["Tiếng Malecite-Passamaquoddy"] = "pqm",
["Tiếng Malta"] = "mt",
["Tiếng Mampruli"] = "maw",
["Tiếng Man"] = "gv",
["Tiếng Manda (Ấn Độ)"] = "mha",
["Tiếng Mandahuaca"] = "mht",
["Tiếng Mandara"] = "tbf",
["Tiếng Mande nguyên thủy"] = "dmn-pro",
["Tiếng Mandi"] = "mjl",
["Tiếng Mandinka"] = "mnk",
["Tiếng Mangas"] = "zns",
["Tiếng Manggarai"] = "mqy",
["Tiếng Mangghuer"] = "xgn-mgr",
["Tiếng Mangghul"] = "mjg-mgr",
["Tiếng Manipur"] = "mni",
["Tiếng Mankanya"] = "knf",
["Tiếng Mannan"] = "mjv",
["Tiếng Mano"] = "mev",
["Tiếng Mansaka"] = "msk",
["Tiếng Mansi nguyên thủy"] = "mns-pro",
["Tiếng Manumanaw"] = "kxf",
["Tiếng Mao Nam"] = "mmd",
["Tiếng Maori"] = "mi",
["Tiếng Mapuche"] = "arn",
["Tiếng Maranao"] = "mrw",
["Tiếng Marathi"] = "mr",
["Tiếng Marathi cổ"] = "omr",
["Tiếng Marau"] = "mvr",
["Tiếng Mari Tây"] = "mrj",
["Tiếng Mari nguyên thủy"] = "chm-pro",
["Tiếng Mari Đông"] = "mhr",
["Tiếng Maria (Ấn Độ)"] = "mrr",
["Tiếng Maricopa"] = "mrc",
["Tiếng Marma"] = "rmz",
["Tiếng Marquises Bắc"] = "mrq",
["Tiếng Marquises Nam"] = "mqm",
["Tiếng Marrucini"] = "umc",
["Tiếng Marshall"] = "mh",
["Tiếng Marsi"] = "ims",
["Tiếng Martuthunira"] = "vma",
["Tiếng Marwar"] = "mwr",
["Tiếng Masbatenyo"] = "msb",
["Tiếng Maskelynes"] = "klv",
["Tiếng Matal"] = "mfh",
["Tiếng Mator"] = "mtm",
["Tiếng Maung"] = "mph",
["Tiếng Maya Yucatán"] = "yua",
["Tiếng Maya nguyên thủy"] = "myn-pro",
["Tiếng Mazahua Michoacán"] = "mmc",
["Tiếng Mazahua Trung"] = "maz",
["Tiếng Mazandaran"] = "mzn",
["Tiếng Mbabaram"] = "vmb",
["Tiếng Mbembe Tigon"] = "nza",
["Tiếng Mbembe sông Cross"] = "mfn",
["Tiếng Me'en"] = "mym",
["Tiếng Me'phaa Acatepec"] = "tpx",
["Tiếng Me'phaa Azoyú"] = "tpc",
["Tiếng Me'phaa Tlacoapa"] = "tpl",
["Tiếng Media cổ"] = "xme-old",
["Tiếng Medumba"] = "byv",
["Tiếng Mehri"] = "gdq",
["Tiếng Melo"] = "mfx",
["Tiếng Melpa"] = "med",
["Tiếng Memon"] = "mby",
["Tiếng Mendankwe-Nkwen"] = "mfd",
["Tiếng Mende"] = "men",
["Tiếng Menominee"] = "mez",
["Tiếng Mentawai"] = "mwv",
["Tiếng Meriam"] = "ulk",
["Tiếng Mesaka"] = "iyo",
["Tiếng Mesqan"] = "mvz",
["Tiếng Messapio"] = "cms",
["Tiếng Meänkieli"] = "fit",
["Tiếng Mi'kmaq"] = "mic",
["Tiếng Miami"] = "mia",
["Tiếng Minangkabau"] = "min",
["Tiếng Mingrelia"] = "xmf",
["Tiếng Minriq"] = "mnq",
["Tiếng Mintil"] = "mzt",
["Tiếng Miranda"] = "mwl",
["Tiếng Mirga"] = "zrg",
["Tiếng Mising"] = "mrg",
["Tiếng Miskito"] = "miq",
["Tiếng Mixtec Alcozauca"] = "xta",
["Tiếng Mixtec Chayuco"] = "mih",
["Tiếng Mixtec Yosondúa"] = "mpm",
["Tiếng Mixtec nguyên thủy"] = "omq-mix-pro",
["Tiếng Miyako"] = "mvi",
["Tiếng Mizo"] = "lus",
["Tiếng Miến Điện"] = "my",
["Tiếng Miến Điện cổ"] = "obr",
["Tiếng Miền nguyên thủy"] = "hmx-mie-pro",
["Tiếng Mlabri"] = "mra",
["Tiếng Mlahsö"] = "lhs",
["Tiếng Mogholi"] = "mhj",
["Tiếng Moglena-Rumani"] = "ruq",
["Tiếng Mohawk"] = "moh",
["Tiếng Mohegan-Pequot"] = "xpq",
["Tiếng Moken"] = "mwt",
["Tiếng Mokil"] = "mkj",
["Tiếng Moklen"] = "mkm",
["Tiếng Moksha"] = "mdf",
["Tiếng Molbog"] = "pwm",
["Tiếng Mongghul"] = "mjg-mgl",
["Tiếng Mongo"] = "lol",
["Tiếng Mongondow"] = "mog",
["Tiếng Mooré"] = "mos",
["Tiếng Mordvin nguyên thủy"] = "urj-mdv-pro",
["Tiếng Moro"] = "mor",
["Tiếng Morokodo"] = "mgc",
["Tiếng Mota"] = "mtt",
["Tiếng Motu"] = "meu",
["Tiếng Mozarab"] = "mxi",
["Tiếng Mpade"] = "mpi",
["Tiếng Mpi"] = "mpz",
["Tiếng Muak Sa-aak"] = "ukk",
["Tiếng Mudburra"] = "dmw",
["Tiếng Muduga"] = "udg",
["Tiếng Muna"] = "mnb",
["Tiếng Munda"] = "unx",
["Tiếng Munda nguyên thủy"] = "mun-pro",
["Tiếng Mundabli"] = "boe",
["Tiếng Mundari"] = "unr",
["Tiếng Munggui"] = "mth",
["Tiếng Munji"] = "mnj",
["Tiếng Munsee"] = "umu",
["Tiếng Muria Viễn Tây"] = "fmu",
["Tiếng Murle"] = "mur",
["Tiếng Mursi"] = "muz",
["Tiếng Muscogee"] = "mus",
["Tiếng Musi"] = "mui",
["Tiếng Muskogee nguyên thủy"] = "nai-mus-pro",
["Tiếng Muthuvan"] = "muv",
["Tiếng Mwan"] = "moa",
["Tiếng Mwotlap"] = "mlv",
["Tiếng Myene"] = "mye",
["Tiếng Mân Bắc"] = "mnp",
["Tiếng Mân Nam"] = "nan",
["Tiếng Mân Trung"] = "czo",
["Tiếng Mân Tuyền Chương"] = "nan-hbl",
["Tiếng Mân nguyên thủy"] = "zhx-min-pro",
["Tiếng Mân Đông"] = "cdo",
["Tiếng Mã Lai"] = "ms",
["Tiếng Mã Lai Ambon"] = "abs",
["Tiếng Mã Lai Baba"] = "mbf",
["Tiếng Mã Lai Bacan"] = "btj",
["Tiếng Mã Lai Brunei"] = "kxd",
["Tiếng Mã Lai Bắc Maluku"] = "max",
["Tiếng Mã Lai Kedah"] = "meo",
["Tiếng Mã Lai Pattani"] = "mfa",
["Tiếng Mã Lai Sarawak"] = "poz-sml",
["Tiếng Mã Lai cổ"] = "omy",
["Tiếng Mã Lai nguyên thủy"] = "poz-mly-pro",
["Tiếng Mã Lai-Chăm nguyên thủy"] = "poz-mcm-pro",
["Tiếng Mã Lai-Sumbawa nguyên thủy"] = "poz-msa-pro",
["Tiếng Mã Lai-Đa Đảo Trung Đông nguyên thủy"] = "poz-cet-pro",
["Tiếng Mã Lai-Đa Đảo nguyên thủy"] = "poz-pro",
["Tiếng Mã Lai-Đa Đảo Đông nguyên thủy"] = "pqe-pro",
["Tiếng Mã Liềng"] = "pkt",
["Tiếng Mãn Châu"] = "mnc",
["Tiếng Mòcheno"] = "mhn",
["Tiếng Môn"] = "mnw",
["Tiếng Môn Thái"] = "mnw-tha",
["Tiếng Môn cổ"] = "omx",
["Tiếng Môn nguyên thủy"] = "mkh-mnc-pro",
["Tiếng Môn trung đại"] = "mkh-mmn",
["Tiếng Môn-Khmer nguyên thủy"] = "mkh-pro",
["Tiếng Mông"] = "hmf",
["Tiếng Mông Cổ"] = "mn",
["Tiếng Mông Cổ Khamnigan"] = "ykh",
["Tiếng Mông Cổ cổ điển"] = "cmg",
["Tiếng Mông Cổ nguyên thủy"] = "xgn-pro",
["Tiếng Mông Cổ trung đại"] = "xng",
["Tiếng Mông Trắng"] = "mww",
["Tiếng Mơ Nâm"] = "moo",
["Tiếng Mường"] = "mtq",
["Tiếng Mạ"] = "cma",
["Tiếng Mảng"] = "zng",
["Tiếng Na Miểu"] = "neo",
["Tiếng Na Uy"] = "no",
["Tiếng Na Uy (Bokmål)"] = "nb",
["Tiếng Na Uy (Nynorsk)"] = "nn",
["Tiếng Nafaanra"] = "nfr",
["Tiếng Naga Chothe"] = "nct",
["Tiếng Naga Maring"] = "nng",
["Tiếng Naga Moyon"] = "nmo",
["Tiếng Naga Thangal"] = "nki",
["Tiếng Naga Trung nguyên thủy"] = "sit-aao-pro",
["Tiếng Nahua nguyên thủy"] = "azc-nah-pro",
["Tiếng Nahuatl"] = "nah",
["Tiếng Nahuatl Temascaltepec"] = "nhv",
["Tiếng Nahuatl cổ điển"] = "nci",
["Tiếng Nakh nguyên thủy"] = "cau-nkh-pro",
["Tiếng Nam Altai"] = "alt",
["Tiếng Nam Amami Ōshima"] = "ams",
["Tiếng Nam Dravida I nguyên thủy"] = "dra-sdo-pro",
["Tiếng Nam Dravida II nguyên thủy"] = "dra-sdt-pro",
["Tiếng Nam Dravida nguyên thủy"] = "dra-sou-pro",
["Tiếng Nam Kolami"] = "nit",
["Tiếng Nam Mansi"] = "mns-sou",
["Tiếng Nam Ndebele"] = "nr",
["Tiếng Nam Sami"] = "sma",
["Tiếng Nam Selkup"] = "sel-sou",
["Tiếng Nam Slavey"] = "xsl",
["Tiếng Nam Thái"] = "sou",
["Tiếng Nam Uzbek"] = "uzs",
["Tiếng Nam Yukaghir"] = "yux",
["Tiếng Nam Á nguyên thủy"] = "aav-pro",
["Tiếng Nam Đảo nguyên thủy"] = "map-pro",
["Tiếng Nam Động"] = "kmc",
["Tiếng Nam Ả Rập cổ"] = "sem-srb",
["Tiếng Nambikwara"] = "nab",
["Tiếng Nanai"] = "gld",
["Tiếng Nankina"] = "nnk",
["Tiếng Napoli"] = "nap",
["Tiếng Naskapi"] = "nsk",
["Tiếng Nateni"] = "ntm",
["Tiếng Naukan"] = "ynk",
["Tiếng Nauru"] = "na",
["Tiếng Navajo"] = "nv",
["Tiếng Ndau"] = "ndc",
["Tiếng Ndogo"] = "ndz",
["Tiếng Ndonga"] = "ng",
["Tiếng Nefusa"] = "jbn",
["Tiếng Negerhollands"] = "dcr",
["Tiếng Negidal"] = "neg",
["Tiếng Nenets lãnh nguyên"] = "yrk-tun",
["Tiếng Nepal"] = "ne",
["Tiếng Newa"] = "new",
["Tiếng Nga"] = "ru",
["Tiếng Nga bồi Taimyr"] = "crp-tpr",
["Tiếng Ngadha"] = "nxg",
["Tiếng Ngalum"] = "szb",
["Tiếng Ngam"] = "nmc",
["Tiếng Ngambay"] = "sba",
["Tiếng Nganasan"] = "nio",
["Tiếng Ngas"] = "anc",
["Tiếng Ngiemboon"] = "nnh",
["Tiếng Ngiyambaa"] = "wyb",
["Tiếng Ngomba"] = "jgo",
["Tiếng Ngombe (Congo)"] = "ngc",
["Tiếng Nguni nguyên thủy"] = "bnt-ngu-pro",
["Tiếng Nguồn"] = "nuo",
["Tiếng Ngô"] = "wuu",
["Tiếng Ngũ Đồn"] = "wuh",
["Tiếng Nha Lang"] = "yrn",
["Tiếng Nheengatu"] = "yrl",
["Tiếng Nhu Nhiên"] = "qfa-xgx-rou",
["Tiếng Nhĩ Tô"] = "ers",
["Tiếng Nhật"] = "ja",
["Tiếng Nhật Bản nguyên thủy"] = "jpx-pro",
["Tiếng Nhật cổ"] = "ojp",
["Tiếng Nias"] = "nia",
["Tiếng Nicobar Car"] = "caq",
["Tiếng Nicobar Nam"] = "nik",
["Tiếng Nicobar Trung"] = "ncb",
["Tiếng Nicobar nguyên thủy"] = "aav-nic-pro",
["Tiếng Niger-Congo nguyên thủy"] = "nic-pro",
["Tiếng Nin-Sahara nguyên thủy"] = "ssa-pro",
["Tiếng Nisga'a"] = "ncg",
["Tiếng Niue"] = "niu",
["Tiếng Nivaclé"] = "cag",
["Tiếng Nivkh"] = "niv",
["Tiếng Nkari"] = "nkz",
["Tiếng Nkonya"] = "nko",
["Tiếng Nobiin"] = "fia",
["Tiếng Nobonob"] = "gaw",
["Tiếng Nogai"] = "nog",
["Tiếng Noon"] = "snf",
["Tiếng Noreia"] = "nrc",
["Tiếng Norman"] = "nrf",
["Tiếng Novgorod cổ"] = "zle-ono",
["Tiếng Novial"] = "nov",
["Tiếng Ntcham"] = "bud",
["Tiếng Nubaca"] = "baf",
["Tiếng Nubi"] = "kcn",
["Tiếng Nubia cổ"] = "onw",
["Tiếng Nuer"] = "nus",
["Tiếng Numidia"] = "nxm",
["Tiếng Nupe"] = "nup",
["Tiếng Nuristan nguyên thủy"] = "iir-nur-pro",
["Tiếng Nuu-chah-nulth"] = "nuk",
["Tiếng Nyah Kur"] = "cbn",
["Tiếng Nyaw"] = "nyw",
["Tiếng Nyeu"] = "nyl",
["Tiếng Nyishi"] = "njz",
["Tiếng Nyoro"] = "nyo",
["Tiếng Nyunga"] = "nys",
["Tiếng Nzadi"] = "nzd",
["Tiếng Nùng"] = "nut",
["Tiếng Nùng Vẻn"] = "enc",
["Tiếng Nǀuu"] = "ngh",
["Tiếng Nạp Tây"] = "nxq",
["Tiếng Nữ Chân"] = "juc",
["Tiếng O'odham"] = "ood",
["Tiếng Ocaina"] = "oca",
["Tiếng Occitan"] = "oc",
["Tiếng Occitan cổ"] = "pro",
["Tiếng Ogbronuagum"] = "ogu",
["Tiếng Oghuz cổ sơ kỳ"] = "trk-eog",
["Tiếng Oirat"] = "xwo",
["Tiếng Ojibwe"] = "oj",
["Tiếng Ojibwe Severn"] = "ojs",
["Tiếng Ojibwe Tây"] = "ojw",
["Tiếng Ojibwe Tây Bắc"] = "ojb",
["Tiếng Ojibwe Đông"] = "ojg",
["Tiếng Okanagan"] = "oka",
["Tiếng Okinawa"] = "ryu",
["Tiếng Okinoerabu"] = "okn",
["Tiếng Olukumi"] = "ulb",
["Tiếng Omaha-Ponca"] = "oma",
["Tiếng Omo nguyên thủy"] = "omv-pro",
["Tiếng Omok"] = "omk",
["Tiếng Oneida"] = "one",
["Tiếng Ongota"] = "bxe",
["Tiếng Oriya"] = "or",
["Tiếng Oriya Adiwasi"] = "ort",
["Tiếng Oriya cổ"] = "inc-oor",
["Tiếng Oriya trung đại"] = "inc-mor",
["Tiếng Orma"] = "orc",
["Tiếng Ormu"] = "orz",
["Tiếng Ormur"] = "oru",
["Tiếng Oroch"] = "oac",
["Tiếng Orok"] = "oaa",
["Tiếng Oromo"] = "om",
["Tiếng Oromo Nam"] = "gax",
["Tiếng Oromo Đông"] = "hae",
["Tiếng Oroqen"] = "orh",
["Tiếng Osage"] = "osa",
["Tiếng Osatu"] = "ost",
["Tiếng Osci"] = "osc",
["Tiếng Osing"] = "osi",
["Tiếng Ossetia"] = "os",
["Tiếng Ossetia cổ"] = "oos",
["Tiếng Otomi Mezquital"] = "ote",
["Tiếng Otoro"] = "otr",
["Tiếng Otuke"] = "otu",
["Tiếng Oyda"] = "oyd",
["Tiếng Pa Kô"] = "pac",
["Tiếng Pa'O"] = "blk",
["Tiếng Paeligni"] = "pgn",
["Tiếng Pagu"] = "pgu",
["Tiếng Pahari Mahasu"] = "bfz",
["Tiếng Paharia Kumarbhag"] = "kmj",
["Tiếng Paharia Sauria"] = "mjt",
["Tiếng Paite"] = "pck",
["Tiếng Paiwan"] = "pwn",
["Tiếng Pakan nguyên thủy"] = "mkh-pkn-pro",
["Tiếng Paku"] = "pku",
["Tiếng Pala"] = "plq",
["Tiếng Palau"] = "pau",
["Tiếng Palaung Ruching"] = "pce",
["Tiếng Palaung Rumai"] = "rbb",
["Tiếng Palaung Shwe"] = "pll",
["Tiếng Palaung nguyên thủy"] = "mkh-pal-pro",
["Tiếng Palawano Brooke's Point"] = "plw",
["Tiếng Palenquero"] = "pln",
["Tiếng Pali"] = "pi",
["Tiếng Paliyan"] = "pcf",
["Tiếng Palor"] = "fap",
["Tiếng Pama-Nyungar nguyên thủy"] = "aus-pam-pro",
["Tiếng Pancana"] = "pnp",
["Tiếng Panchpargania"] = "tdb",
["Tiếng Pangasinan"] = "pag",
["Tiếng Pangwala"] = "pgg",
["Tiếng Paniya"] = "pcg",
["Tiếng Papiamento"] = "pap",
["Tiếng Papuma"] = "ppm",
["Tiếng Parachi"] = "prc",
["Tiếng Paraujano"] = "pbg",
["Tiếng Parauk"] = "prk",
["Tiếng Pareci"] = "pab",
["Tiếng Parenga"] = "pcj",
["Tiếng Parthia"] = "xpr",
["Tiếng Parya"] = "paq",
["Tiếng Pashtun"] = "ps",
["Tiếng Pathan nguyên thủy"] = "ira-pat-pro",
["Tiếng Pauna"] = "pnk",
["Tiếng Pawnee"] = "paw",
["Tiếng Pazeh"] = "pzh",
["Tiếng Pear"] = "pcb",
["Tiếng Pear nguyên thủy"] = "mkh-pea-pro",
["Tiếng Pecheneg"] = "xpc",
["Tiếng Pela"] = "bxd",
["Tiếng Pemon"] = "aoc",
["Tiếng Pengo"] = "peg",
["Tiếng Perm nguyên thủy"] = "urj-prm-pro",
["Tiếng Petjo"] = "pey",
["Tiếng Phai"] = "prt",
["Tiếng Phake"] = "phk",
["Tiếng Phalura"] = "phl",
["Tiếng Phi-Á nguyên thủy"] = "afa-pro",
["Tiếng Philippines nguyên thủy"] = "phi-pro",
["Tiếng Phoenicia"] = "phn",
["Tiếng Phong-Kniang"] = "pnx",
["Tiếng Phrygia"] = "xpg",
["Tiếng Phu Thái"] = "pht",
["Tiếng Phuan"] = "phu",
["Tiếng Pháp"] = "fr",
["Tiếng Pháp cổ"] = "fro",
["Tiếng Pháp trung đại"] = "frm",
["Tiếng Phạn"] = "sa",
["Tiếng Phần Lan"] = "fi",
["Tiếng Phổ Hiền"] = "cpx",
["Tiếng Phổ cổ"] = "prg",
["Tiếng Picard"] = "pcd",
["Tiếng Piceni Bắc"] = "nrp",
["Tiếng Piceni Nam"] = "spx",
["Tiếng Piemonte"] = "pms",
["Tiếng Pilagá"] = "plg",
["Tiếng Pinyin"] = "pny",
["Tiếng Pipil"] = "ppl",
["Tiếng Pitjantjatjara"] = "pjt",
["Tiếng Plateau nguyên thủy"] = "nic-plt-pro",
["Tiếng Pnar"] = "pbv",
["Tiếng Pnar-Khasi-Lyngngam nguyên thủy"] = "aav-pkl-pro",
["Tiếng Pohnpei"] = "pon",
["Tiếng Polabia"] = "pox",
["Tiếng Polci"] = "plj",
["Tiếng Ponosakan"] = "pns",
["Tiếng Popoluca cao nguyên"] = "poi",
["Tiếng Potawatomi"] = "pot",
["Tiếng Pothohar"] = "phr",
["Tiếng Prakrit"] = "pra",
["Tiếng Prakrit Ashoka"] = "inc-ash",
["Tiếng Prakrit Niya"] = "pra-niy",
["Tiếng Prakrit Paisaci"] = "inc-psc",
["Tiếng Prakrit Saurasen"] = "psu",
["Tiếng Prasun"] = "prn",
["Tiếng Pucikwar"] = "apq",
["Tiếng Puinave"] = "pui",
["Tiếng Pumpokol"] = "xpm",
["Tiếng Punic"] = "xpu",
["Tiếng Punjab"] = "pa",
["Tiếng Puroik"] = "suv",
["Tiếng Puyuma"] = "pyu",
["Tiếng Pwo Bắc"] = "pww",
["Tiếng Pwo Phrae"] = "kjt",
["Tiếng Pwo Tây"] = "pwo",
["Tiếng Pwo Đông"] = "kjp",
["Tiếng Pà Thẻn"] = "pha",
["Tiếng Pọng"] = "hnu",
["Tiếng Qashqai"] = "qxq",
["Tiếng Qimant"] = "ahg",
["Tiếng Quan Thoại"] = "cmn",
["Tiếng Quapaw"] = "qua",
["Tiếng Quechua"] = "qu",
["Tiếng Quenya"] = "qya",
["Tiếng Quichuañol"] = "mue",
["Tiếng Quinault"] = "qun",
["Tiếng Quiripi"] = "qyp",
["Tiếng Quảng Lâm"] = "aav-qal",
["Tiếng Quảng Đông"] = "yue",
["Tiếng Quốc tế ngữ"] = "eo",
["Tiếng Ra Glai Bắc"] = "rog",
["Tiếng Ra Glai Cát Gia"] = "roc",
["Tiếng Ra Glai Nam"] = "rgs",
["Tiếng Rabha"] = "rah",
["Tiếng Raetia"] = "xrr",
["Tiếng Rajasthan"] = "raj",
["Tiếng Rajbanshi"] = "rjs",
["Tiếng Rakhine"] = "rki",
["Tiếng Rama"] = "rma",
["Tiếng Rangpur"] = "rkt",
["Tiếng Rapa Nui"] = "rap",
["Tiếng Rarotonga"] = "rar",
["Tiếng Rasawa"] = "rac",
["Tiếng Ratagnon"] = "btn",
["Tiếng Raute"] = "rau",
["Tiếng Ravula"] = "yea",
["Tiếng Rawang"] = "raw",
["Tiếng Rejang"] = "rej",
["Tiếng Reli"] = "rei",
["Tiếng Rendille"] = "rel",
["Tiếng Riang Lai"] = "yin",
["Tiếng Rohingya"] = "rhg",
["Tiếng Romagnol"] = "rgn",
["Tiếng Romansh"] = "rm",
["Tiếng Rotuma"] = "rtm",
["Tiếng Rukai"] = "dru",
["Tiếng Rukai nguyên thủy"] = "dru-pro",
["Tiếng Rumani"] = "ro",
["Tiếng Rungus"] = "drg",
["Tiếng Rusnak"] = "rsk",
["Tiếng Rusyn"] = "rue",
["Tiếng Ruthenia cổ"] = "zle-ort",
["Tiếng Rutul"] = "rut",
["Tiếng Rơ Măm"] = "rmx",
["Tiếng Rơ Ngao"] = "ren",
["Tiếng Saanich"] = "str",
["Tiếng Saaroa"] = "sxr",
["Tiếng Saba"] = "saa",
["Tiếng Sabüm"] = "sbo",
["Tiếng Sadri"] = "sck",
["Tiếng Saek"] = "skb",
["Tiếng Saho"] = "ssy",
["Tiếng Saisiyat"] = "xsy",
["Tiếng Saka-Wakhi nguyên thủy"] = "xsc-skw-pro",
["Tiếng Sakizaya"] = "szy",
["Tiếng Salar"] = "slr",
["Tiếng Salish nguyên thủy"] = "sal-pro",
["Tiếng Sama Trung"] = "sml",
["Tiếng Sambal Botolan"] = "sbl",
["Tiếng Sambali"] = "xsb",
["Tiếng Sambalpur"] = "spv",
["Tiếng Sami Akkala"] = "sia",
["Tiếng Sami Inari"] = "smn",
["Tiếng Sami Kildin"] = "sjd",
["Tiếng Sami Skolt"] = "sms",
["Tiếng Sami Ter"] = "sjt",
["Tiếng Sami Ume"] = "sju",
["Tiếng Sami nguyên thủy"] = "smi-pro",
["Tiếng Samo"] = "smq",
["Tiếng Samo Nam"] = "sbd",
["Tiếng Samoa"] = "sm",
["Tiếng Samogitia"] = "sgs",
["Tiếng Samoyed nguyên thủy"] = "syd-pro",
["Tiếng Samtao"] = "stu",
["Tiếng Sangir"] = "sxn",
["Tiếng Sangisar"] = "sgr",
["Tiếng Sango"] = "sg",
["Tiếng Santal"] = "sat",
["Tiếng Saposa"] = "sps",
["Tiếng Saraiki"] = "skr",
["Tiếng Saramacca"] = "srm",
["Tiếng Sardegna"] = "sc",
["Tiếng Sarikol"] = "srh",
["Tiếng Sarmatia nguyên thủy"] = "xsc-sar-pro",
["Tiếng Sasak"] = "sas",
["Tiếng Saurashtra"] = "saz",
["Tiếng Savi"] = "sdg",
["Tiếng Saxon Transylvania"] = "gmw-tsx",
["Tiếng Saxon cổ"] = "osx",
["Tiếng Scots"] = "sco",
["Tiếng Scots trung đại"] = "gmw-msc",
["Tiếng Scythia nguyên thủy"] = "xsc-pro",
["Tiếng Sebat Bet Gurage"] = "sgw",
["Tiếng Sechelt"] = "sec",
["Tiếng Selkup"] = "sel",
["Tiếng Selkup nguyên thủy"] = "sel-pro",
["Tiếng Semai"] = "sea",
["Tiếng Semaq Beri"] = "szc",
["Tiếng Semelai"] = "sza",
["Tiếng Semit Tây nguyên thủy"] = "sem-wes-pro",
["Tiếng Semit nguyên thủy"] = "sem-pro",
["Tiếng Semnam"] = "ssm",
["Tiếng Sena"] = "seh",
["Tiếng Seneca"] = "see",
["Tiếng Senhaja de Srair"] = "sjs",
["Tiếng Senni Humburi"] = "hmb",
["Tiếng Senni Koyraboro"] = "ses",
["Tiếng Senoufo Nyarafolo"] = "sev",
["Tiếng Serbia-Croatia"] = "sh",
["Tiếng Serer"] = "srr",
["Tiếng Seri"] = "sei",
["Tiếng Seze"] = "sze",
["Tiếng Shabak"] = "sdb",
["Tiếng Shabo"] = "sbf",
["Tiếng Shan"] = "shn",
["Tiếng Shebayo"] = "awd-she",
["Tiếng Shekkacho"] = "moy",
["Tiếng Sherpa"] = "xsr",
["Tiếng Shina"] = "scl",
["Tiếng Shina Kohistan"] = "plk",
["Tiếng Shinasha"] = "bwo",
["Tiếng Sholaga"] = "sle",
["Tiếng Shompen"] = "sii",
["Tiếng Shona"] = "sn",
["Tiếng Shor"] = "cjs",
["Tiếng Shughnan"] = "sgh",
["Tiếng Shughnan-Rushan nguyên thủy"] = "ira-shr-pro",
["Tiếng Shughnan-Yazghulom nguyên thủy"] = "ira-shy-pro",
["Tiếng Shughnan-Yazghulom-Munji nguyên thủy"] = "ira-sym-pro",
["Tiếng Shuswap"] = "shs",
["Tiếng Sicel"] = "scx",
["Tiếng Sicily"] = "scn",
["Tiếng Sidamo"] = "sid",
["Tiếng Sikkim"] = "sip",
["Tiếng Silesia"] = "szl",
["Tiếng Siltʼe"] = "stv",
["Tiếng Sinaugoro"] = "snc",
["Tiếng Sindh"] = "sd",
["Tiếng Sinhala"] = "si",
["Tiếng Sioux nguyên thủy"] = "sio-pro",
["Tiếng Siraya"] = "fos",
["Tiếng Sirenik"] = "ysr",
["Tiếng Sirmaur"] = "srx",
["Tiếng Sissala"] = "sld",
["Tiếng Sissano"] = "sso",
["Tiếng Siwi"] = "siz",
["Tiếng Siwu"] = "akp",
["Tiếng Skepi"] = "skw",
["Tiếng Slav Giáo hội"] = "zls-chs",
["Tiếng Slav Giáo hội cổ"] = "cu",
["Tiếng Slav nguyên thủy"] = "sla-pro",
["Tiếng Slav Đông cổ"] = "orv",
["Tiếng Slovak"] = "sk",
["Tiếng Slovak cổ"] = "zlw-osk",
["Tiếng Slovene"] = "sl",
["Tiếng Slovincia"] = "zlw-slv",
["Tiếng Socotra"] = "sqt",
["Tiếng Sogdia"] = "sog",
["Tiếng Sogdia nguyên thủy"] = "ira-sgc-pro",
["Tiếng Sokna"] = "swn",
["Tiếng Solon"] = "tuw-sol",
["Tiếng Solong"] = "aaw",
["Tiếng Somali"] = "so",
["Tiếng Somali nguyên thủy"] = "cus-som-pro",
["Tiếng Soninke"] = "snk",
["Tiếng Sonsorol"] = "sov",
["Tiếng Sora"] = "srb",
["Tiếng Soran"] = "ckb",
["Tiếng Sotho"] = "st",
["Tiếng Sotho Bắc"] = "nso",
["Tiếng Soyot"] = "trk-soy",
["Tiếng Squamish"] = "squ",
["Tiếng Sranan Tongo"] = "srn",
["Tiếng Stau"] = "ero-tau",
["Tiếng Sumer"] = "sux",
["Tiếng Sunda"] = "su",
["Tiếng Sunda cổ"] = "osn",
["Tiếng Suri"] = "suq",
["Tiếng Surjapur"] = "sjp",
["Tiếng Susu"] = "sus",
["Tiếng Svan"] = "sva",
["Tiếng Swahili"] = "sw",
["Tiếng Swazi"] = "ss",
["Tiếng Sylhet"] = "syl",
["Tiếng Syriac cổ điển"] = "syc",
["Tiếng Sán Chay"] = "mlc",
["Tiếng Séc"] = "cs",
["Tiếng Séc cổ"] = "zlw-ocs",
["Tiếng Sô"] = "sss",
["Tiếng Taabwa"] = "tap",
["Tiếng Tabasaran"] = "tab",
["Tiếng Tachawit"] = "shy",
["Tiếng Tadyawan"] = "tdy",
["Tiếng Tafi"] = "tcd",
["Tiếng Tagal Murut"] = "mvv",
["Tiếng Tagalog"] = "tl",
["Tiếng Tagbanwa Calamian"] = "tbk",
["Tiếng Tagdal"] = "tda",
["Tiếng Tagoi"] = "tag",
["Tiếng Tahiti"] = "ty",
["Tiếng Tahltan"] = "tht",
["Tiếng Tai Loi"] = "tlq",
["Tiếng Tai Tây Nam nguyên thủy"] = "tai-swe-pro",
["Tiếng Taivoan"] = "tvx",
["Tiếng Tajik"] = "tg",
["Tiếng Tal"] = "tal",
["Tiếng Tala"] = "tak",
["Tiếng Talossa"] = "tzl",
["Tiếng Talysh"] = "tly",
["Tiếng Tamang Gorkha Đông"] = "tge",
["Tiếng Tamang Tây"] = "tdg",
["Tiếng Tamang Đông"] = "taj",
["Tiếng Tamazight Maroc chuẩn"] = "zgh",
["Tiếng Tamazight Trung Atlas"] = "tzm",
["Tiếng Tamil"] = "ta",
["Tiếng Tamil cổ"] = "oty",
["Tiếng Tamki"] = "tax",
["Tiếng Tammari"] = "tbz",
["Tiếng Tampuan"] = "tpu",
["Tiếng Tanchangya"] = "tnv",
["Tiếng Tangkhul Naga"] = "nmf",
["Tiếng Tangoa"] = "tgp",
["Tiếng Tangut"] = "txg",
["Tiếng Tanimbili"] = "tbe",
["Tiếng Taos"] = "twf",
["Tiếng Tapirapé"] = "taf",
["Tiếng Tara Baka"] = "bdh",
["Tiếng Tarantino"] = "roa-tar",
["Tiếng Tariana"] = "tae",
["Tiếng Tarifit"] = "rif",
["Tiếng Tasawaq"] = "twq",
["Tiếng Tashelhit"] = "shi",
["Tiếng Tat"] = "ttt",
["Tiếng Tat-Do Thái"] = "jdt",
["Tiếng Tatar"] = "tt",
["Tiếng Tiên Ti"] = "mis-xbi",
["Tiếng Tatar Crưm"] = "crh",
["Tiếng Tatar Siberia"] = "sty",
["Tiếng Tatuyo"] = "tav",
["Tiếng Taungyo"] = "tco",
["Tiếng Tause"] = "tad",
["Tiếng Tausug"] = "tsg",
["Tiếng Tavoy"] = "tvn",
["Tiếng Tay Dọ"] = "tyj",
["Tiếng Tayma"] = "sem-tay",
["Tiếng Taz"] = "zhx-taz",
["Tiếng Taznatit"] = "grr",
["Tiếng Taíno"] = "tnq",
["Tiếng Tchad nguyên thủy"] = "cdc-pro",
["Tiếng Telugu"] = "te",
["Tiếng Telugu cổ"] = "dra-ote",
["Tiếng Tem"] = "kdh",
["Tiếng Temiar"] = "tea",
["Tiếng Temoq"] = "tmo",
["Tiếng Ten'edn"] = "tnz",
["Tiếng Tengger"] = "tes",
["Tiếng Tenharim"] = "pah",
["Tiếng Tepehua Tlachichilco"] = "tpt",
["Tiếng Tepehuan Bắc"] = "ntp",
["Tiếng Tepehuan Đông Nam"] = "stp",
["Tiếng Teressa"] = "tef",
["Tiếng Teribe"] = "tfr",
["Tiếng Ternate"] = "tft",
["Tiếng Tetserret"] = "tez",
["Tiếng Tetum"] = "tet",
["Tiếng Thachanad"] = "thn",
["Tiếng Thavưng"] = "thm",
["Tiếng Thompson"] = "thp",
["Tiếng Thracia"] = "txh",
["Tiếng Thác Bạt"] = "qfa-xgx-tuo",
["Tiếng Thái"] = "th",
["Tiếng Thái Hàng Tổng"] = "tpo",
["Tiếng Thái Lai"] = "tjl",
["Tiếng Thái Na"] = "tdd",
["Tiếng Thái Trắng"] = "twh",
["Tiếng Thái Tống"] = "soa",
["Tiếng Thái nguyên thủy"] = "tai-pro",
["Tiếng Thái Đen"] = "blt",
["Tiếng Thái Đỏ"] = "tyr",
["Tiếng Thát Mai"] = "smh",
["Tiếng Thượng Kinabatangan"] = "dmg",
["Tiếng Thượng Sorb"] = "hsb",
["Tiếng Thổ"] = "tou",
["Tiếng Thổ Dục Hồn"] = "qfa-xgx-tuh",
["Tiếng Thổ Gia Bắc"] = "tji",
["Tiếng Thổ Gia Nam"] = "tjs",
["Tiếng Thổ Nhĩ Kỳ"] = "tr",
["Tiếng Thổ Nhĩ Kỳ Anatolia cổ"] = "trk-oat",
["Tiếng Thổ Nhĩ Kỳ Gagauz Balkan"] = "bgx",
["Tiếng Thổ Nhĩ Kỳ Ottoman"] = "ota",
["Tiếng Thụy Điển"] = "sv",
["Tiếng Thụy Điển cổ"] = "gmq-osw",
["Tiếng Thủy"] = "swi",
["Tiếng Tiang"] = "tbj",
["Tiếng Tigre"] = "tig",
["Tiếng Tigrinya"] = "ti",
["Tiếng Tindi"] = "tin",
["Tiếng Tipai"] = "nai-tip",
["Tiếng Tippera"] = "tpe",
["Tiếng Tiruray"] = "tiy",
["Tiếng Tiwa"] = "lax",
["Tiếng Tiwi"] = "tiw",
["Tiếng Tiên Ti"] = "qfa-xgx-xbi",
["Tiếng Tlapanec Malinaltepec"] = "tcf",
["Tiếng Tlingit"] = "tli",
["Tiếng Tobi"] = "tox",
["Tiếng Tochari A"] = "xto",
["Tiếng Tochari B"] = "txb",
["Tiếng Tochari nguyên thủy"] = "ine-toc-pro",
["Tiếng Tocho"] = "taz",
["Tiếng Toda"] = "tcx",
["Tiếng Tofa"] = "kim",
["Tiếng Tok Pisin"] = "tpi",
["Tiếng Tokelau"] = "tkl",
["Tiếng Toki Pona"] = "tok",
["Tiếng Tokunoshima"] = "tkn",
["Tiếng Toma"] = "tod",
["Tiếng Tonga"] = "to",
["Tiếng Tonkawa"] = "tqw",
["Tiếng Tooro"] = "ttj",
["Tiếng Torwali"] = "trw",
["Tiếng Toto"] = "txo",
["Tiếng Totonac Papantla"] = "top",
["Tiếng Totonac cao nguyên"] = "tos",
["Tiếng Triqui Chicahuaxtla"] = "trs",
["Tiếng Triqui Copala"] = "trc",
["Tiếng Triqui San Martín Itunyoso"] = "trq",
["Tiếng Triqui nguyên thủy"] = "omq-tri-pro",
["Tiếng Trió"] = "tri",
["Tiếng Triều Châu"] = "nan-tws",
["Tiếng Triều Tiên"] = "ko",
["Tiếng Triều Tiên cổ"] = "oko",
["Tiếng Triều Tiên nguyên thủy"] = "qfa-kor-pro",
["Tiếng Triều Tiên trung đại"] = "okm",
["Tiếng Truku"] = "trv",
["Tiếng Trung Bikol"] = "bcl",
["Tiếng Trung Dusun"] = "dtp",
["Tiếng Trung Mansi"] = "mns-cen",
["Tiếng Trung Nahuatl"] = "nhn",
["Tiếng Trung Nahuatl Huasteca"] = "nch",
["Tiếng Trung Nahuatl Puebla"] = "ncx",
["Tiếng Trung Quốc"] = "zh",
["Tiếng Trà Động"] = "cdy",
["Tiếng Trác Ni"] = "cda",
["Tiếng Tráng"] = "za",
["Tiếng Tráng Nông"] = "zhn",
["Tiếng Tráng Tả Giang"] = "zzj",
["Tiếng Tráng Đức Tĩnh"] = "zyg",
["Tiếng Trát Bá"] = "zhb",
["Tiếng Tsakhur"] = "tkr",
["Tiếng Tsakonia"] = "tsd",
["Tiếng Tsamai"] = "tsb",
["Tiếng Tsat"] = "huq",
["Tiếng Tsez"] = "ddo",
["Tiếng Tshangla"] = "tsj",
["Tiếng Tsimshian"] = "tsi",
["Tiếng Tsonga"] = "ts",
["Tiếng Tsou"] = "tsu",
["Tiếng Tsuut'ina"] = "srs",
["Tiếng Tswana"] = "tn",
["Tiếng Tuamotu"] = "pmt",
["Tiếng Tuareg"] = "tmh",
["Tiếng Tukang Besi Bắc"] = "khc",
["Tiếng Tukang Besi Nam"] = "bhq",
["Tiếng Tuki"] = "bag",
["Tiếng Tulu"] = "tcy",
["Tiếng Tumbuka"] = "tum",
["Tiếng Tungus nguyên thủy"] = "tuw-pro",
["Tiếng Tunica"] = "tun",
["Tiếng Tunni"] = "tqq",
["Tiếng Tupi"] = "tpn",
["Tiếng Tupi cổ"] = "tpw",
["Tiếng Tupi nguyên thủy"] = "tup-pro",
["Tiếng Tupi-Guarani nguyên thủy"] = "tup-gua-pro",
["Tiếng Turk Khorasan"] = "kmz",
["Tiếng Turk Khorezm"] = "zkh",
["Tiếng Turk cổ"] = "otk",
["Tiếng Turk nguyên thủy"] = "trk-pro",
["Tiếng Turkmen"] = "tk",
["Tiếng Turoyo"] = "tru",
["Tiếng Tuva"] = "tyv",
["Tiếng Tuvalu"] = "tvl",
["Tiếng Tuwuli"] = "bov",
["Tiếng Tyap"] = "kcg",
["Tiếng Tzotzil"] = "tzo",
["Tiếng Tà Mun"] = "aav-tam",
["Tiếng Tà Ôi Thượng"] = "tth",
["Tiếng Tày"] = "tyz",
["Tiếng Tày Sa Pa"] = "tys",
["Tiếng Tân Aram Assyria"] = "aii",
["Tiếng Tân Aram Bohtan"] = "bhn",
["Tiếng Tân Aram Chaldea"] = "cld",
["Tiếng Tân Aram Do Thái Barzani"] = "bjf",
["Tiếng Tân Aram Tây"] = "amw",
["Tiếng Tây Abenaki"] = "abe",
["Tiếng Tây Ban Nha"] = "es",
["Tiếng Tây Ban Nha cổ"] = "osp",
["Tiếng Tây Bắc Gbaya"] = "gya",
["Tiếng Tây Bắc Kavkaz nguyên thủy"] = "cau-nwc-pro",
["Tiếng Tây Bồi"] = "tas",
["Tiếng Tây Duyên hải Bajau"] = "bdr",
["Tiếng Tây Frisia"] = "fy",
["Tiếng Tây Huasteca Nahuatl"] = "nhw",
["Tiếng Tây Kayah"] = "kyu",
["Tiếng Tây Makian"] = "mqs",
["Tiếng Tây Tạng"] = "bo",
["Tiếng Tây Tạng Kham"] = "khg",
["Tiếng Tây Tạng cổ điển"] = "xct",
["Tiếng Tây Yugur"] = "ybe",
["Tiếng Tích Bá"] = "sjo",
["Tiếng Tơ Đrá"] = "tdr",
["Tiếng Tương"] = "hsn",
["Tiếng Tấn"] = "cjy",
["Tiếng Tứ Thổ"] = "sit-sit",
["Tiếng Tứ Xuyên"] = "zhx-sic",
["Tiếng U"] = "uuu",
["Tiếng Ubangi nguyên thủy"] = "nic-ubg-pro",
["Tiếng Ubykh"] = "uby",
["Tiếng Udi"] = "udi",
["Tiếng Udihe"] = "ude",
["Tiếng Udmurt"] = "udm",
["Tiếng Uduk"] = "udu",
["Tiếng Ugarit"] = "uga",
["Tiếng Ugong"] = "ugo",
["Tiếng Ugria nguyên thủy"] = "urj-ugr-pro",
["Tiếng Ukraina"] = "uk",
["Tiếng Ulch"] = "ulc",
["Tiếng Ullatan"] = "ull",
["Tiếng Umbria"] = "xum",
["Tiếng Umbundu"] = "umb",
["Tiếng Unami"] = "unm",
["Tiếng Uneapa"] = "bbn",
["Tiếng Urak Lawoi'"] = "urk",
["Tiếng Ural nguyên thủy"] = "urj-pro",
["Tiếng Urali"] = "url",
["Tiếng Urartu"] = "xur",
["Tiếng Urdu"] = "ur",
["Tiếng Uripiv-Wala-Rano-Atchin"] = "upv",
["Tiếng Urubú-Kaapor"] = "urb",
["Tiếng Urum"] = "uum",
["Tiếng Ushojo"] = "ush",
["Tiếng Usui"] = "usi",
["Tiếng Ute-Aztec nguyên thủy"] = "azc-pro",
["Tiếng Uvbie"] = "evh",
["Tiếng Uzbek"] = "uz",
["Tiếng Vaagri Booli"] = "vaa",
["Tiếng Vaghri"] = "vgr",
["Tiếng Varli"] = "vav",
["Tiếng Vasavi"] = "vas",
["Tiếng Venda"] = "ve",
["Tiếng Veneti"] = "xve",
["Tiếng Veneto"] = "vec",
["Tiếng Veps"] = "vep",
["Tiếng Vishava"] = "vis",
["Tiếng Việt"] = "vi",
["Tiếng Việt trung cổ"] = "mkh-mvi",
["Tiếng Việt-Mường nguyên thủy"] = "mkh-vie-pro",
["Tiếng Volapük"] = "vo",
["Tiếng Volsci"] = "xvo",
["Tiếng Volta-Congo nguyên thủy"] = "nic-vco-pro",
["Tiếng Volta-Niger nguyên thủy"] = "alv-von-pro",
["Tiếng Vot"] = "vot",
["Tiếng Vurës"] = "msn",
["Tiếng Võro"] = "vro",
["Tiếng Văn ngôn"] = "lzh",
["Tiếng Waama"] = "wwa",
["Tiếng Waata"] = "ssn",
["Tiếng Wagi"] = "fad",
["Tiếng Wahgi"] = "wgi",
["Tiếng Waimaha"] = "bao",
["Tiếng Waiwai"] = "waw",
["Tiếng Wakhi"] = "wbl",
["Tiếng Wales"] = "cy",
["Tiếng Wales trung đại"] = "wlm",
["Tiếng Wallis"] = "wls",
["Tiếng Wallon"] = "wa",
["Tiếng Wambule"] = "wme",
["Tiếng Wancho"] = "nnp",
["Tiếng Waneci"] = "wne",
["Tiếng War-Jaintia"] = "aml",
["Tiếng Waray"] = "war",
["Tiếng Wardaman"] = "wrr",
["Tiếng Warekena"] = "gae",
["Tiếng Warji"] = "wji",
["Tiếng Wastek"] = "hus",
["Tiếng Wawonii"] = "wow",
["Tiếng Wayampi"] = "oym",
["Tiếng Wayana"] = "way",
["Tiếng Wayuu"] = "guc",
["Tiếng Wemba-Wemba"] = "xww",
["Tiếng Wewaw"] = "wea",
["Tiếng Wiradjuri"] = "wrh",
["Tiếng Wiyot"] = "wiy",
["Tiếng Wobé"] = "wob",
["Tiếng Woiwurrung"] = "wyi",
["Tiếng Wolane"] = "wle",
["Tiếng Wolaytta"] = "wal",
["Tiếng Wolio"] = "wlo",
["Tiếng Wolof"] = "wo",
["Tiếng Wotu"] = "wtw",
["Tiếng Wymysorys"] = "wym",
["Tiếng Xamtanga"] = "xan",
["Tiếng Xavante"] = "xav",
["Tiếng Xhosa"] = "xh",
["Tiếng Xinh Mun"] = "puo",
["Tiếng Xtiêng"] = "sti",
["Tiếng Xtiêng Bù Đeh"] = "stt",
["Tiếng Xârâcùù"] = "ane",
["Tiếng Xơ Đăng"] = "sed",
["Tiếng Yaaku"] = "muu",
["Tiếng Yaeyama"] = "rys",
["Tiếng Yaghnob"] = "yai",
["Tiếng Yakan"] = "yka",
["Tiếng Yakima"] = "yak",
["Tiếng Yakkha"] = "ybh",
["Tiếng Yakut"] = "sah",
["Tiếng Yali Angguruk"] = "yli",
["Tiếng Yami"] = "tao",
["Tiếng Yamphu"] = "ybi",
["Tiếng Yanesha'"] = "ame",
["Tiếng Yanyuwa"] = "jao",
["Tiếng Yao (Nam Mĩ)"] = "sai-yao",
["Tiếng Yao (châu Phi)"] = "yao",
["Tiếng Yap"] = "yap",
["Tiếng Yapunda"] = "yev",
["Tiếng Yazghulom"] = "yah",
["Tiếng Ye'kwana"] = "mch",
["Tiếng Yele"] = "yle",
["Tiếng Yemsa"] = "jnj",
["Tiếng Yevan"] = "yej",
["Tiếng Yiddish"] = "yi",
["Tiếng Yidgha"] = "ydg",
["Tiếng Yidiny"] = "yii",
["Tiếng Yindjibarndi"] = "yij",
["Tiếng Yiwom"] = "gek",
["Tiếng Yogad"] = "yog",
["Tiếng Yola"] = "yol",
["Tiếng Yolmo"] = "scp",
["Tiếng Yom"] = "pil",
["Tiếng Yonaguni"] = "yoi",
["Tiếng Yong"] = "yno",
["Tiếng Yongkom"] = "yon",
["Tiếng Yoron"] = "yox",
["Tiếng Yoruba"] = "yo",
["Tiếng Yoruba nguyên thủy"] = "alv-yor-pro",
["Tiếng Yorubo nguyên thủy"] = "alv-yrd-pro",
["Tiếng Yoy"] = "yoy",
["Tiếng Yugh"] = "yug",
["Tiếng Yukaghir nguyên thủy"] = "qfa-yuk-pro",
["Tiếng Yup'ik"] = "esu",
["Tiếng Yupik Trung Siberia"] = "ess",
["Tiếng Yuri"] = "sai-yri",
["Tiếng Yurok"] = "yur",
["Tiếng Yámana"] = "yag",
["Tiếng Zacatepec Chatino"] = "ctz",
["Tiếng Zaghawa"] = "zag",
["Tiếng Zaiwa"] = "atb",
["Tiếng Zangskar"] = "zau",
["Tiếng Zapotec"] = "zap",
["Tiếng Zapotec Cajonos"] = "zad",
["Tiếng Zapotec Isthmus"] = "zai",
["Tiếng Zapotec Mitla"] = "zaw",
["Tiếng Zapotec Rincón"] = "zar",
["Tiếng Zapotec Rincón Nam"] = "zsr",
["Tiếng Zapotec San Juan Guelavía"] = "zab",
["Tiếng Zapotec Yatee"] = "zty",
["Tiếng Zapotec Yatzachi"] = "zav",
["Tiếng Zapotec Zaniza"] = "zpw",
["Tiếng Zapotec Zoogocho"] = "zpq",
["Tiếng Zapotec nguyên thủy"] = "omq-zpc-pro",
["Tiếng Zarma"] = "dje",
["Tiếng Zarphat"] = "zrp",
["Tiếng Zay"] = "zwa",
["Tiếng Zayse-Zergulla"] = "zay",
["Tiếng Zaza"] = "zza",
["Tiếng Zaza-Goran nguyên thủy"] = "ira-zgr-pro",
["Tiếng Zeeland"] = "zea",
["Tiếng Zenaga"] = "zen",
["Tiếng Zirenkel"] = "zrn",
["Tiếng Zoque Francisco León"] = "zos",
["Tiếng Zou"] = "zom",
["Tiếng Zulu"] = "zu",
["Tiếng Zumbun"] = "jmb",
["Tiếng Äynu"] = "aib",
["Tiếng Ê Đê"] = "rad",
["Tiếng Ông Bối nguyên thủy"] = "qfa-onb-pro",
["Tiếng Önge"] = "oon",
["Tiếng Önge nguyên thủy"] = "qfa-ong-pro",
["Tiếng Övdal"] = "ovd",
["Tiếng Ý"] = "it",
["Tiếng Ý-Do Thái"] = "itk",
["Tiếng Đa Đảo hạt nhân nguyên thủy"] = "poz-pnp-pro",
["Tiếng Đa Đảo nguyên thủy"] = "poz-pol-pro",
["Tiếng Đa Đảo Đông nguyên thủy"] = "poz-pep-pro",
["Tiếng Đan Mạch"] = "da",
["Tiếng Đan Mạch cổ"] = "gmq-oda",
["Tiếng Đài Sơn"] = "zhx-tai",
["Tiếng Đông Abenaki"] = "aaq",
["Tiếng Đông Acipa"] = "acp",
["Tiếng Đông Bontoc"] = "ebk",
["Tiếng Đông Bắc Kavkaz nguyên thủy"] = "cau-nec-pro",
["Tiếng Đông Can"] = "dng",
["Tiếng Đông Futuna"] = "fud",
["Tiếng Đông Hương"] = "sce",
["Tiếng Đông Kayah"] = "eky",
["Tiếng Đông Khanty"] = "kca-eas",
["Tiếng Đông Yugur"] = "yuy",
["Tiếng Đường Uông"] = "zhx-twa",
["Tiếng Đại Tây Dương–Congo nguyên thủy"] = "alv-pro",
["Tiếng Độc Long"] = "duu",
["Tiếng Động-Thủy nguyên thủy"] = "qfa-kms-pro",
["Tiếng Đức"] = "de",
["Tiếng Đức Alemanni"] = "gsw",
["Tiếng Đức Pennsylvania"] = "pdc",
["Tiếng Đức cao địa cổ"] = "goh",
["Tiếng Đức cao địa trung đại"] = "gmh",
["Tiếng Đức Đông Trung"] = "gmw-ecg",
["Tiếng Ơ Đu"] = "tyh",
["Tiếng Ưu Miền"] = "ium",
["Tiếng ǃXóõ"] = "nmn",
["Tiếng Ả Rập"] = "ar",
["Tiếng Ả Rập Ai Cập"] = "arz",
["Tiếng Ả Rập Algérie"] = "arq",
["Tiếng Ả Rập Andalusia"] = "xaa",
["Tiếng Ả Rập Bắc Levant"] = "apc",
["Tiếng Ả Rập Bắc Lưỡng Hà"] = "ayp",
["Tiếng Ả Rập Hijazi"] = "acw",
["Tiếng Ả Rập Iraq"] = "acm",
["Tiếng Ả Rập Juba"] = "pga",
["Tiếng Ả Rập Libya"] = "ayl",
["Tiếng Ả Rập Maroc"] = "ary",
["Tiếng Ả Rập Nam Levant"] = "ajp",
["Tiếng Ả Rập Oman"] = "acx",
["Tiếng Ả Rập Sudan"] = "apd",
["Tiếng Ả Rập Síp"] = "acy",
["Tiếng Ả Rập Tajikistan"] = "abh",
["Tiếng Ả Rập Tchad"] = "shu",
["Tiếng Ả Rập Tunisia"] = "aeb",
["Tiếng Ả Rập Uzbekistan"] = "auz",
["Tiếng Ả Rập vùng Vịnh"] = "afb",
["Tiếng Ấn-Arya nguyên thủy"] = "inc-pro",
["Tiếng Ấn-Iran nguyên thủy"] = "iir-pro",
["Tiếng Ấn-Âu nguyên thủy"] = "ine-pro",
["Tiếng Ỹaroamë"] = "yro",
["Àhàn"] = "ahn",
["Áncá"] = "acb",
["Ömie"] = "aom",
["Đa ngữ"] = "mul",
["ǀXam"] = "xam",
["ǁAni"] = "hnh",
["ǁGana"] = "gnk",
["ǁXegwi"] = "xeg",
["ǂHoan"] = "huc",
["ǃKung"] = "khi-kun",
}
6xblnh4d7bj3a20prh1o99n23wn12pw
Mô đun:zh-glyph/phonetic/list
828
276466
2561588
2089158
2026-09-08T06:34:29Z
Hiyuune
50834
2561588
Scribunto
text/plain
return {
["愛"] = "愛",
["曖"] = "愛",
["僾"] = "愛",
["靉"] = "愛",
["薆"] = "愛",
["璦"] = "愛",
["瞹"] = "愛",
["安"] = "安",
["鞍"] = "安",
["鞌"] = "安",
["侒"] = "安",
["按"] = "安",
["案"] = "安",
["洝"] = "安",
["荌"] = "安",
["晏"] = "安",
["鴳"] = "安",
["騴"] = "安",
["鷃"] = "安",
["頞"] = "安",
["胺"] = "安",
["咹"] = "安",
["卬"] = "卬",
["枊"] = "卬",
["昂"] = "卬",
["仰"] = "卬",
["迎"] = "卬",
["熬"] = "敖",
["敖"] = "敖",
["嗷"] = "敖",
["螯"] = "敖",
["聱"] = "敖",
["驁"] = "敖",
["鰲"] = "敖",
["遨"] = "敖",
["獒"] = "敖",
["滶"] = "敖",
["蔜"] = "敖",
["鷔"] = "敖",
["鼇"] = "敖",
["謷"] = "敖",
["嶅"] = "敖",
["嗸"] = "敖",
["摮"] = "敖",
["嫯"] = "敖",
["鏊"] = "敖",
["傲"] = "敖",
["磝"] = "敖",
["襖"] = "奧",
["懊"] = "奧",
["燠"] = "奧",
["奧"] = "奧",
["墺"] = "奧",
["隩"] = "奧",
["澳"] = "奧",
["噢"] = "奧",
["薁"] = "奧",
["䉛"] = "奧",
["扒"] = "八",
["八"] = "八",
["𩡩"] = "八",
["朳"] = "八",
["玐"] = "八",
["釟"] = "八",
["汃"] = "八",
["巴"] = "巴",
["芭"] = "巴",
["笆"] = "巴",
["豝"] = "巴",
["鈀"] = "巴",
["吧"] = "巴",
["蚆"] = "巴",
["疤"] = "巴",
["把"] = "巴",
["爸"] = "巴",
["弝"] = "巴",
["靶"] = "巴",
["葩"] = "巴",
["舥"] = "巴",
["妑"] = "巴",
["帊"] = "巴",
["琶"] = "巴",
["爬"] = "巴",
["杷"] = "巴",
["跁"] = "巴",
["耙"] = "巴",
["軷"] = "犮",
["韍"] = "犮",
["祓"] = "犮",
["蛂"] = "犮",
["拔"] = "犮",
["菝"] = "犮",
["袚"] = "犮",
["茇"] = "犮",
["盋"] = "犮",
["帗"] = "犮",
["跋"] = "犮",
["魃"] = "犮",
["䣮"] = "犮",
["馛"] = "犮",
["炦"] = "犮",
["颰"] = "犮",
["妭"] = "犮",
["犮"] = "犮",
["胈"] = "犮",
["鈸"] = "犮",
["苃"] = "犮",
["坺"] = "犮",
["髮"] = "犮",
["冹"] = "犮",
["瞂"] = "犮",
["紱"] = "犮",
["黻"] = "犮",
["翇"] = "犮",
["發"] = "癹",
["癹"] = "癹",
["擺"] = "罷",
["犤"] = "罷",
["罷"] = "罷",
["矲"] = "罷",
["羆"] = "罷",
["襬"] = "罷",
["藣"] = "罷",
["壩"] = "霸",
["霸"] = "霸",
["灞"] = "霸",
["欛"] = "霸",
["怕"] = "白",
["帕"] = "白",
["粕"] = "白",
["胉"] = "白",
["泊"] = "白",
["箔"] = "白",
["魄"] = "白",
["皕"] = "白",
["伯"] = "白",
["百"] = "白",
["迫"] = "白",
["敀"] = "白",
["柏"] = "白",
["湐"] = "白",
["拍"] = "白",
["珀"] = "白",
["皛"] = "白",
["洦"] = "白",
["白"] = "白",
["帛"] = "白",
["舶"] = "白",
["鮊"] = "白",
["陌"] = "白",
["帞"] = "白",
["袹"] = "白",
["蛨"] = "白",
["貊"] = "白",
["佰"] = "白",
["銆"] = "白",
["碧"] = "白",
["咟"] = "白",
["拜"] = "拜",
["湃"] = "拜",
["班"] = "班",
["斑"] = "班",
["螌"] = "般",
["般"] = "般",
["媻"] = "般",
["搫"] = "般",
["搬"] = "般",
["盤"] = "般",
["磐"] = "般",
["瘢"] = "般",
["幋"] = "般",
["槃"] = "般",
["縏"] = "般",
["鎜"] = "般",
["鞶"] = "般",
["半"] = "半",
["絆"] = "半",
["靽"] = "半",
["姅"] = "半",
["拌"] = "半",
["拚"] = "半",
["坢"] = "半",
["判"] = "半",
["泮"] = "半",
["頖"] = "半",
["胖"] = "半",
["冸"] = "半",
["牉"] = "半",
["柈"] = "半",
["伴"] = "半",
["叛"] = "半",
["畔"] = "半",
["袢"] = "半",
["袍"] = "勹",
["袌"] = "勹",
["軳"] = "勹",
["抱"] = "勹",
["勽"] = "勹",
["菢"] = "勹",
["勹"] = "勹",
["包"] = "勹",
["胞"] = "勹",
["苞"] = "勹",
["枹"] = "勹",
["飽"] = "勹",
["泡"] = "勹",
["炮"] = "勹",
["皰"] = "勹",
["疱"] = "勹",
["跑"] = "勹",
["咆"] = "勹",
["庖"] = "勹",
["匏"] = "勹",
["刨"] = "勹",
["狍"] = "勹",
["炰"] = "勹",
["鉋"] = "勹",
["瓟"] = "勹",
["颮"] = "勹",
["鞄"] = "勹",
["鮑"] = "勹",
["骲"] = "勹",
["玸"] = "勹",
["雹"] = "勹",
["窇"] = "勹",
["襃"] = "保",
["保"] = "保",
["堡"] = "保",
["褓"] = "保",
["堢"] = "保",
["緥"] = "保",
["葆"] = "保",
["賲"] = "保",
["宲"] = "保",
["椺"] = "保",
["鴇"] = "鴇",
["駂"] = "鴇",
["暴"] = "暴",
["曝"] = "暴",
["瀑"] = "暴",
["虣"] = "暴",
["爆"] = "暴",
["襮"] = "暴",
["嚗"] = "暴",
["謈"] = "暴",
["犦"] = "暴",
["懪"] = "暴",
["捭"] = "卑",
["牌"] = "卑",
["郫"] = "卑",
["蠯"] = "卑",
["猈"] = "卑",
["稗"] = "卑",
["粺"] = "卑",
["𥱼"] = "卑",
["豍"] = "卑",
["箄"] = "卑",
["錍"] = "卑",
["睥"] = "卑",
["渒"] = "卑",
["鼙"] = "卑",
["鞞"] = "卑",
["椑"] = "卑",
["崥"] = "卑",
["髀"] = "卑",
["卑"] = "卑",
["鵯"] = "卑",
["裨"] = "卑",
["痺"] = "卑",
["碑"] = "卑",
["婢"] = "卑",
["諀"] = "卑",
["脾"] = "卑",
["埤"] = "卑",
["陴"] = "卑",
["蜱"] = "卑",
["焷"] = "卑",
["螷"] = "卑",
["庳"] = "卑",
["琕"] = "卑",
["萆"] = "卑",
["綼"] = "卑",
["背"] = "北",
["鄁"] = "北",
["偝"] = "北",
["邶"] = "北",
["苝"] = "北",
["北"] = "北",
["貝"] = "貝",
["狽"] = "貝",
["鋇"] = "貝",
["浿"] = "貝",
["垻"] = "貝",
["敗"] = "貝",
["唄"] = "貝",
["憊"] = "備",
["韛"] = "備",
["備"] = "備",
["俻"] = "備",
["鞴"] = "備",
["糒"] = "備",
["犕"] = "備",
["賁"] = "奔",
["蟦"] = "奔",
["膹"] = "奔",
["橨"] = "奔",
["奔"] = "奔",
["錛"] = "奔",
["噴"] = "奔",
["濆"] = "奔",
["歕"] = "奔",
["獖"] = "奔",
["餴"] = "奔",
["饙"] = "奔",
["僨"] = "奔",
["墳"] = "奔",
["燌"] = "奔",
["豶"] = "奔",
["羵"] = "奔",
["蕡"] = "奔",
["鐼"] = "奔",
["馩"] = "奔",
["轒"] = "奔",
["鼖"] = "奔",
["憤"] = "奔",
["鱝"] = "奔",
["本"] = "本",
["笨"] = "本",
["苯"] = "本",
["翉"] = "本",
["体"] = "本",
["鉢"] = "本",
["缽"] = "本",
["匕"] = "匕",
["庀"] = "匕",
["疕"] = "匕",
["朼"] = "匕",
["牝"] = "匕",
["梐"] = "比",
["狴"] = "比",
["悂"] = "比",
["螕"] = "比",
["鎞"] = "比",
["蓖"] = "比",
["篦"] = "比",
["批"] = "比",
["砒"] = "比",
["鈚"] = "比",
["磇"] = "比",
["媲"] = "比",
["笓"] = "比",
["膍"] = "比",
["陛"] = "比",
["仳"] = "比",
["吡"] = "比",
["紕"] = "比",
["比"] = "比",
["妣"] = "比",
["秕"] = "比",
["沘"] = "比",
["枇"] = "比",
["粊"] = "比",
["庇"] = "比",
["屁"] = "比",
["琵"] = "比",
["毗"] = "比",
["貔"] = "比",
["豼"] = "比",
["蚍"] = "比",
["芘"] = "比",
["肶"] = "比",
["魮"] = "比",
["阰"] = "比",
["坒"] = "比",
["玭"] = "比",
["鄙"] = "啚",
["啚"] = "啚",
["泌"] = "必",
["秘"] = "必",
["毖"] = "必",
["閟"] = "必",
["柲"] = "必",
["鉍"] = "必",
["邲"] = "必",
["覕"] = "必",
["咇"] = "必",
["苾"] = "必",
["馝"] = "必",
["飶"] = "必",
["鴓"] = "必",
["鮅"] = "必",
["必"] = "必",
["珌"] = "必",
["佖"] = "必",
["駜"] = "必",
["怭"] = "必",
["妼"] = "必",
["宓"] = "必",
["樒"] = "必",
["密"] = "必",
["蔤"] = "必",
["滵"] = "必",
["蜜"] = "必",
["謐"] = "必",
["榓"] = "必",
["淧"] = "必",
["瑟"] = "必",
["璱"] = "必",
["飋"] = "必",
["虙"] = "必",
["箅"] = "畀",
["濞"] = "畀",
["畀"] = "畀",
["痹"] = "畀",
["淠"] = "畀",
["嚊"] = "畀",
["鼻"] = "畀",
["襣"] = "畀",
["畢"] = "畢",
["蓽"] = "畢",
["篳"] = "畢",
["蹕"] = "畢",
["韠"] = "畢",
["滭"] = "畢",
["鷝"] = "畢",
["熚"] = "畢",
["彃"] = "畢",
["縪"] = "畢",
["饆"] = "畢",
["鏎"] = "畢",
["罼"] = "畢",
["蔽"] = "敝",
["鄨"] = "敝",
["鷩"] = "敝",
["彆"] = "敝",
["潎"] = "敝",
["斃"] = "敝",
["敝"] = "敝",
["幣"] = "敝",
["弊"] = "敝",
["鱉"] = "敝",
["虌"] = "敝",
["憋"] = "敝",
["瞥"] = "敝",
["鐅"] = "敝",
["嫳"] = "敝",
["撇"] = "敝",
["撆"] = "敝",
["暼"] = "敝",
["蹩"] = "敝",
["襒"] = "敝",
["閉"] = "閉",
["閇"] = "閉",
["嬖"] = "辟",
["薜"] = "辟",
["鐾"] = "辟",
["臂"] = "辟",
["譬"] = "辟",
["避"] = "辟",
["檗"] = "辟",
["擘"] = "辟",
["糪"] = "辟",
["掰"] = "辟",
["繴"] = "辟",
["辟"] = "辟",
["璧"] = "辟",
["鐴"] = "辟",
["躄"] = "辟",
["襞"] = "辟",
["僻"] = "辟",
["癖"] = "辟",
["廦"] = "辟",
["擗"] = "辟",
["躃"] = "辟",
["闢"] = "辟",
["壁"] = "辟",
["鼊"] = "辟",
["霹"] = "辟",
["劈"] = "辟",
["澼"] = "辟",
["憵"] = "辟",
["甓"] = "辟",
["鷿"] = "辟",
["幦"] = "辟",
["斒"] = "扁",
["鯿"] = "扁",
["編"] = "扁",
["揙"] = "扁",
["褊"] = "扁",
["篇"] = "扁",
["偏"] = "扁",
["翩"] = "扁",
["媥"] = "扁",
["扁"] = "扁",
["萹"] = "扁",
["騗"] = "扁",
["騙"] = "扁",
["諞"] = "扁",
["楄"] = "扁",
["蝙"] = "扁",
["甂"] = "扁",
["猵"] = "扁",
["牑"] = "扁",
["蹁"] = "扁",
["匾"] = "扁",
["碥"] = "扁",
["惼"] = "扁",
["糄"] = "扁",
["徧"] = "扁",
["遍"] = "扁",
["頨"] = "扁",
["艑"] = "扁",
["汴"] = "卞",
["卞"] = "卞",
["忭"] = "卞",
["抃"] = "卞",
["犿"] = "卞",
["笇"] = "卞",
["飰"] = "卞",
["鴘"] = "弁",
["弁"] = "弁",
["拚"] = "弁",
["閞"] = "弁",
["昪"] = "弁",
["匥"] = "弁",
["笲"] = "弁",
["軬"] = "弁",
["畚"] = "弁",
["鞭"] = "便",
["鯾"] = "便",
["箯"] = "便",
["便"] = "便",
["緶"] = "便",
["楩"] = "便",
["辬"] = "辡",
["瓣"] = "辡",
["辦"] = "辡",
["辨"] = "辡",
["辡"] = "辡",
["辯"] = "辡",
["辮"] = "辡",
["彪"] = "彪",
["淲"] = "彪",
["滮"] = "彪",
["飆"] = "猋",
["猋"] = "猋",
["贆"] = "猋",
["藨"] = "麃",
["麃"] = "麃",
["臕"] = "麃",
["鑣"] = "麃",
["儦"] = "麃",
["瀌"] = "麃",
["犥"] = "麃",
["皫"] = "麃",
["表"] = "表",
["裱"] = "表",
["俵"] = "表",
["捌"] = "别",
["哵"] = "别",
["別"] = "别",
["莂"] = "别",
["虨"] = "彬",
["彬"] = "彬",
["霦"] = "彬",
["斌"] = "斌",
["贇"] = "斌",
["燹"] = "豩",
["豳"] = "豩",
["蠙"] = "賓",
["賓"] = "賓",
["檳"] = "賓",
["鑌"] = "賓",
["濱"] = "賓",
["顮"] = "賓",
["儐"] = "賓",
["矉"] = "賓",
["擯"] = "賓",
["殯"] = "賓",
["鬢"] = "賓",
["繽"] = "賓",
["嬪"] = "賓",
["薲"] = "賓",
["獱"] = "賓",
["臏"] = "賓",
["髕"] = "賓",
["冫"] = "仌",
["冰"] = "仌",
["砅"] = "仌",
["馮"] = "仌",
["憑"] = "仌",
["浜"] = "兵",
["捠"] = "兵",
["兵"] = "兵",
["更"] = "丙",
["粳"] = "丙",
["埂"] = "丙",
["浭"] = "丙",
["稉"] = "丙",
["梗"] = "丙",
["哽"] = "丙",
["綆"] = "丙",
["鯁"] = "丙",
["挭"] = "丙",
["骾"] = "丙",
["郠"] = "丙",
["硬"] = "丙",
["鞕"] = "丙",
["丙"] = "丙",
["炳"] = "丙",
["邴"] = "丙",
["怲"] = "丙",
["苪"] = "丙",
["蛃"] = "丙",
["昺"] = "丙",
["昞"] = "丙",
["窉"] = "丙",
["柄"] = "丙",
["鈵"] = "丙",
["寎"] = "丙",
["病"] = "丙",
["秉"] = "秉",
["棅"] = "秉",
["燷"] = "禀",
["壈"] = "禀",
["燣"] = "禀",
["顲"] = "禀",
["稟"] = "禀",
["廩"] = "禀",
["懍"] = "禀",
["凜"] = "禀",
["癛"] = "禀",
["檁"] = "禀",
["鵧"] = "并",
["駢"] = "并",
["胼"] = "并",
["骿"] = "并",
["軿"] = "并",
["賆"] = "并",
["跰"] = "并",
["恲"] = "并",
["鮩"] = "并",
["絣"] = "并",
["拼"] = "并",
["迸"] = "并",
["姘"] = "并",
["皏"] = "并",
["併"] = "并",
["并"] = "并",
["栟"] = "并",
["屏"] = "并",
["箳"] = "并",
["餅"] = "并",
["鉼"] = "并",
["摒"] = "并",
["庰"] = "并",
["偋"] = "并",
["艵"] = "并",
["頩"] = "并",
["竮"] = "并",
["瓶"] = "并",
["缾"] = "并",
["蛢"] = "并",
["荓"] = "并",
["郱"] = "并",
["洴"] = "并",
["蓱"] = "并",
["湴"] = "並",
["跰"] = "並",
["並"] = "並",
["竝"] = "並",
["誖"] = "孛",
["悖"] = "孛",
["孛"] = "孛",
["哱"] = "孛",
["馞"] = "孛",
["勃"] = "孛",
["餑"] = "孛",
["郣"] = "孛",
["浡"] = "孛",
["桲"] = "孛",
["挬"] = "孛",
["脖"] = "孛",
["鵓"] = "孛",
["渤"] = "孛",
["綍"] = "孛",
["仆"] = "卜",
["赴"] = "卜",
["訃"] = "卜",
["朴"] = "卜",
["圤"] = "卜",
["卜"] = "卜",
["鳪"] = "卜",
["扑"] = "卜",
["攴"] = "卜",
["肧"] = "不",
["俖"] = "不",
["娝"] = "不",
["痞"] = "不",
["丕"] = "不",
["伾"] = "不",
["秠"] = "不",
["駓"] = "不",
["怌"] = "不",
["豾"] = "不",
["髬"] = "不",
["魾"] = "不",
["鉟"] = "不",
["嚭"] = "不",
["邳"] = "不",
["岯"] = "不",
["否"] = "不",
["抔"] = "不",
["不"] = "不",
["紑"] = "不",
["鴀"] = "不",
["衃"] = "不",
["罘"] = "不",
["芣"] = "不",
["杯"] = "不",
["盃"] = "不",
["桮"] = "不",
["坯"] = "不",
["胚"] = "不",
["荹"] = "步",
["步"] = "步",
["踄"] = "步",
["部"] = "部",
["蔀"] = "部",
["篰"] = "部",
["茬"] = "才",
["材"] = "才",
["才"] = "才",
["財"] = "才",
["鼒"] = "才",
["在"] = "才",
["豺"] = "才",
["采"] = "采",
["睬"] = "采",
["彩"] = "采",
["採"] = "采",
["綵"] = "采",
["寀"] = "采",
["菜"] = "采",
["埰"] = "采",
["棌"] = "采",
["篸"] = "參",
["參"] = "參",
["驂"] = "參",
["傪"] = "參",
["慘"] = "參",
["黲"] = "參",
["謲"] = "參",
["毿"] = "參",
["蔘"] = "參",
["犙"] = "參",
["糝"] = "參",
["槮"] = "參",
["鬖"] = "參",
["摻"] = "參",
["醦"] = "參",
["縿"] = "參",
["穇"] = "參",
["嵾"] = "參",
["磣"] = "參",
["墋"] = "參",
["曑"] = "參",
["瘮"] = "參",
["滲"] = "參",
["餐"] = "粲",
["湌"] = "粲",
["粲"] = "粲",
["燦"] = "粲",
["璨"] = "粲",
["薒"] = "粲",
["殩"] = "粲",
["艙"] = "倉",
["倉"] = "倉",
["蒼"] = "倉",
["滄"] = "倉",
["傖"] = "倉",
["鶬"] = "倉",
["凔"] = "倉",
["槍"] = "倉",
["搶"] = "倉",
["蹌"] = "倉",
["瑲"] = "倉",
["牄"] = "倉",
["嗆"] = "倉",
["創"] = "倉",
["瘡"] = "倉",
["愴"] = "倉",
["鎗"] = "倉",
["遭"] = "曹",
["糟"] = "曹",
["醩"] = "曹",
["傮"] = "曹",
["槽"] = "曹",
["曹"] = "曹",
["螬"] = "曹",
["漕"] = "曹",
["嘈"] = "曹",
["艚"] = "曹",
["褿"] = "曹",
["蓸"] = "曹",
["慒"] = "曹",
["栅"] = "冊",
["冊"] = "冊",
["笧"] = "冊",
["稷"] = "畟",
["畟"] = "畟",
["溭"] = "畟",
["謖"] = "畟",
["叉"] = "叉",
["杈"] = "叉",
["靫"] = "叉",
["汊"] = "叉",
["衩"] = "叉",
["扠"] = "叉",
["釵"] = "叉",
["芆"] = "叉",
["訍"] = "叉",
["偛"] = "臿",
["插"] = "臿",
["鍤"] = "臿",
["臿"] = "臿",
["喢"] = "臿",
["牐"] = "臿",
["歃"] = "臿",
["敮"] = "臿",
["孱"] = "孱",
["潺"] = "孱",
["僝"] = "孱",
["轏"] = "孱",
["樼"] = "孱",
["纏"] = "廛",
["緾"] = "廛",
["躔"] = "廛",
["瀍"] = "廛",
["鄽"] = "廛",
["廛"] = "廛",
["纔"] = "毚",
["讒"] = "毚",
["饞"] = "毚",
["毚"] = "毚",
["欃"] = "毚",
["攙"] = "毚",
["儳"] = "毚",
["酁"] = "毚",
["瀺"] = "毚",
["嚵"] = "毚",
["巉"] = "毚",
["劖"] = "毚",
["艬"] = "毚",
["鑱"] = "毚",
["昌"] = "昌",
["倡"] = "昌",
["猖"] = "昌",
["菖"] = "昌",
["閶"] = "昌",
["鯧"] = "昌",
["裮"] = "昌",
["琩"] = "昌",
["唱"] = "昌",
["張"] = "長",
["餦"] = "長",
["粻"] = "長",
["漲"] = "長",
["長"] = "長",
["脹"] = "長",
["痮"] = "長",
["帳"] = "長",
["賬"] = "長",
["倀"] = "長",
["鼚"] = "長",
["鋹"] = "長",
["悵"] = "長",
["韔"] = "長",
["萇"] = "長",
["瓺"] = "長",
["棖"] = "長",
["掁"] = "長",
["璅"] = "巢",
["繅"] = "巢",
["薻"] = "巢",
["罺"] = "巢",
["摷"] = "巢",
["勦"] = "巢",
["巢"] = "巢",
["轈"] = "巢",
["樔"] = "巢",
["鄛"] = "巢",
["剿"] = "巢",
["漅"] = "巢",
["嘲"] = "朝",
["廟"] = "朝",
["朝"] = "朝",
["潮"] = "朝",
["車"] = "車",
["硨"] = "車",
["厙"] = "車",
["庫"] = "車",
["徹"] = "徹",
["撤"] = "徹",
["澈"] = "徹",
["轍"] = "徹",
["臤"] = "臣",
["掔"] = "臣",
["慳"] = "臣",
["藖"] = "臣",
["堅"] = "臣",
["鋻"] = "臣",
["鰹"] = "臣",
["蜸"] = "臣",
["菣"] = "臣",
["賢"] = "臣",
["礥"] = "臣",
["臔"] = "臣",
["挋"] = "臣",
["臣"] = "臣",
["茞"] = "臣",
["腎"] = "臣",
["頣"] = "臣",
["緊"] = "臣",
["嚚"] = "臣",
["鏗"] = "臣",
["摼"] = "臣",
["硻"] = "臣",
["辴"] = "辰",
["屒"] = "辰",
["振"] = "辰",
["侲"] = "辰",
["桭"] = "辰",
["唇"] = "辰",
["帪"] = "辰",
["賑"] = "辰",
["裖"] = "辰",
["敐"] = "辰",
["震"] = "辰",
["娠"] = "辰",
["蜃"] = "辰",
["辰"] = "辰",
["晨"] = "辰",
["宸"] = "辰",
["鷐"] = "辰",
["麎"] = "辰",
["祳"] = "辰",
["脤"] = "辰",
["鋠"] = "辰",
["磭"] = "辰",
["陙"] = "辰",
["脣"] = "辰",
["漘"] = "辰",
["陳"] = "陳",
["敶"] = "陳",
["陣"] = "陳",
["讖"] = "韱",
["攕"] = "韱",
["櫼"] = "韱",
["懺"] = "韱",
["殲"] = "韱",
["瀸"] = "韱",
["鑯"] = "韱",
["虃"] = "韱",
["籤"] = "韱",
["韯"] = "韱",
["纖"] = "韱",
["孅"] = "韱",
["韱"] = "韱",
["襳"] = "韱",
["稱"] = "爯",
["爯"] = "爯",
["偁"] = "爯",
["蒸"] = "丞",
["烝"] = "丞",
["篜"] = "丞",
["脀"] = "丞",
["拯"] = "丞",
["氶"] = "丞",
["承"] = "丞",
["丞"] = "丞",
["巹"] = "丞",
["成"] = "成",
["城"] = "成",
["誠"] = "成",
["宬"] = "成",
["郕"] = "成",
["筬"] = "成",
["盛"] = "成",
["珹"] = "成",
["晟"] = "成",
["墭"] = "成",
["挰"] = "呈",
["鋥"] = "呈",
["逞"] = "呈",
["裎"] = "呈",
["悜"] = "呈",
["睈"] = "呈",
["呈"] = "呈",
["程"] = "呈",
["酲"] = "呈",
["珵"] = "呈",
["徎"] = "呈",
["郢"] = "呈",
["浧"] = "呈",
["桯"] = "呈",
["鞓"] = "呈",
["壬"] = "呈",
["鐵"] = "呈",
["驖"] = "呈",
["戜"] = "呈",
["乘"] = "乘",
["溗"] = "乘",
["塖"] = "乘",
["騬"] = "乘",
["椉"] = "乘",
["剩"] = "乘",
["嵊"] = "乘",
["尺"] = "尺",
["蚇"] = "尺",
["蠡"] = "彖",
["盠"] = "彖",
["彖"] = "彖",
["墬"] = "彖",
["喙"] = "彖",
["餯"] = "彖",
["剶"] = "彖",
["猭"] = "彖",
["鶨"] = "彖",
["椽"] = "彖",
["篆"] = "彖",
["瑑"] = "彖",
["堟"] = "彖",
["蝝"] = "彖",
["緣"] = "彖",
["櫞"] = "彖",
["掾"] = "彖",
["褖"] = "彖",
["湪"] = "彖",
["浾"] = "赤",
["嚇"] = "赤",
["赦"] = "赤",
["郝"] = "赤",
["赫"] = "赤",
["爀"] = "赤",
["赤"] = "赤",
["烾"] = "赤",
["螫"] = "赤",
["赥"] = "赤",
["捇"] = "赤",
["焃"] = "赤",
["敕"] = "敕",
["勅"] = "敕",
["鷘"] = "敕",
["慗"] = "敕",
["遫"] = "敕",
["統"] = "充",
["充"] = "充",
["珫"] = "充",
["茺"] = "充",
["銃"] = "充",
["樁"] = "舂",
["憃"] = "舂",
["舂"] = "舂",
["摏"] = "舂",
["蹖"] = "舂",
["痋"] = "蟲",
["鉵"] = "蟲",
["赨"] = "蟲",
["爞"] = "蟲",
["蟲"] = "蟲",
["融"] = "蟲",
["瀜"] = "蟲",
["犨"] = "雔",
["犫"] = "雔",
["雔"] = "雔",
["售"] = "雔",
["讎"] = "雔",
["峱"] = "丑",
["紐"] = "丑",
["扭"] = "丑",
["狃"] = "丑",
["鈕"] = "丑",
["忸"] = "丑",
["杻"] = "丑",
["莥"] = "丑",
["羞"] = "丑",
["丑"] = "丑",
["沑"] = "丑",
["粈"] = "丑",
["衄"] = "丑",
["臭"] = "臭",
["殠"] = "臭",
["糗"] = "臭",
["嗅"] = "臭",
["齅"] = "臭",
["聉"] = "出",
["贅"] = "出",
["祟"] = "出",
["出"] = "出",
["茁"] = "出",
["欪"] = "出",
["貀"] = "出",
["袦"] = "出",
["咄"] = "出",
["柮"] = "出",
["拙"] = "出",
["炪"] = "出",
["掘"] = "出",
["鈯"] = "出",
["啒"] = "出",
["淈"] = "出",
["窟"] = "出",
["泏"] = "出",
["堀"] = "出",
["胐"] = "出",
["窋"] = "出",
["絀"] = "出",
["黜"] = "出",
["屈"] = "出",
["趉"] = "出",
["鶌"] = "出",
["詘"] = "出",
["倔"] = "出",
["崛"] = "出",
["煼"] = "芻",
["謅"] = "芻",
["縐"] = "芻",
["鄒"] = "芻",
["騶"] = "芻",
["搊"] = "芻",
["皺"] = "芻",
["篘"] = "芻",
["㑳"] = "芻",
["趍"] = "芻",
["趨"] = "芻",
["芻"] = "芻",
["犓"] = "芻",
["雛"] = "芻",
["鶵"] = "芻",
["媰"] = "芻",
["齺"] = "芻",
["冢"] = "豖",
["塚"] = "豖",
["涿"] = "豖",
["琢"] = "豖",
["啄"] = "豖",
["諑"] = "豖",
["剢"] = "豖",
["瘃"] = "豖",
["豖"] = "豖",
["川"] = "川",
["釧"] = "川",
["巛"] = "川",
["巡"] = "川",
["馴"] = "川",
["紃"] = "川",
["甽"] = "川",
["順"] = "川",
["訓"] = "川",
["舛"] = "舛",
["荈"] = "舛",
["僢"] = "舛",
["舜"] = "舛",
["瞬"] = "舛",
["蕣"] = "舛",
["梁"] = "刅",
["粱"] = "刅",
["刱"] = "刅",
["吹"] = "吹",
["炊"] = "吹",
["焁"] = "吹",
["埵"] = "垂",
["綞"] = "垂",
["涶"] = "垂",
["唾"] = "垂",
["厜"] = "垂",
["腄"] = "垂",
["箠"] = "垂",
["娷"] = "垂",
["諈"] = "垂",
["錘"] = "垂",
["甀"] = "垂",
["硾"] = "垂",
["捶"] = "垂",
["垂"] = "垂",
["陲"] = "垂",
["倕"] = "垂",
["菙"] = "垂",
["睡"] = "垂",
["辤"] = "辭",
["辭"] = "辭",
["些"] = "此",
["跐"] = "此",
["柴"] = "此",
["祡"] = "此",
["茈"] = "此",
["眦"] = "此",
["砦"] = "此",
["寨"] = "此",
["啙"] = "此",
["泚"] = "此",
["玼"] = "此",
["皉"] = "此",
["鮆"] = "此",
["眥"] = "此",
["貲"] = "此",
["髭"] = "此",
["頾"] = "此",
["訾"] = "此",
["鴜"] = "此",
["鈭"] = "此",
["姕"] = "此",
["觜"] = "此",
["紫"] = "此",
["訿"] = "此",
["呰"] = "此",
["嘴"] = "此",
["雌"] = "此",
["此"] = "此",
["佌"] = "此",
["庛"] = "此",
["疵"] = "此",
["骴"] = "此",
["胔"] = "此",
["飺"] = "此",
["齜"] = "此",
["債"] = "朿",
["積"] = "朿",
["刺"] = "朿",
["莿"] = "朿",
["㓨"] = "朿",
["朿"] = "朿",
["漬"] = "朿",
["耫"] = "朿",
["嘖"] = "朿",
["栜"] = "朿",
["梀"] = "朿",
["拺"] = "朿",
["捒"] = "朿",
["幘"] = "朿",
["簀"] = "朿",
["嫧"] = "朿",
["謮"] = "朿",
["責"] = "朿",
["皟"] = "朿",
["憡"] = "朿",
["策"] = "朿",
["筴"] = "朿",
["拺"] = "朿",
["賾"] = "朿",
["鰿"] = "朿",
["擌"] = "朿",
["蹟"] = "朿",
["襀"] = "朿",
["磧"] = "朿",
["洓"] = "朿",
["績"] = "朿",
["勣"] = "朿",
["樍"] = "朿",
["咨"] = "次",
["資"] = "次",
["姿"] = "次",
["粢"] = "次",
["諮"] = "次",
["恣"] = "次",
["澬"] = "次",
["趑"] = "次",
["蠀"] = "次",
["次"] = "次",
["佽"] = "次",
["絘"] = "次",
["薋"] = "次",
["瓷"] = "次",
["茨"] = "次",
["餈"] = "次",
["垐"] = "次",
["楶"] = "次",
["牎"] = "囱",
["窗"] = "囱",
["窓"] = "囱",
["囱"] = "囱",
["總"] = "囱",
["熜"] = "囱",
["傯"] = "囱",
["緫"] = "囱",
["揔"] = "囱",
["偬"] = "囱",
["囪"] = "囱",
["璁"] = "囱",
["驄"] = "囱",
["蔥"] = "囱",
["匆"] = "囱",
["怱"] = "囱",
["葱"] = "囱",
["楤"] = "囱",
["聦"] = "囱",
["繱"] = "囱",
["騘"] = "囱",
["鍯"] = "囱",
["聰"] = "囱",
["愡"] = "囱",
["檧"] = "囱",
["憽"] = "囱",
["幒"] = "囱",
["摐"] = "从",
["鏦"] = "从",
["豵"] = "从",
["嵸"] = "从",
["蓯"] = "从",
["蹤"] = "从",
["縱"] = "从",
["樅"] = "从",
["磫"] = "从",
["熧"] = "从",
["瘲"] = "从",
["暰"] = "从",
["瑽"] = "从",
["從"] = "从",
["从"] = "从",
["慫"] = "从",
["聳"] = "从",
["傱"] = "从",
["躥"] = "竄",
["竄"] = "竄",
["攛"] = "竄",
["鑹"] = "竄",
["嗺"] = "崔",
["催"] = "崔",
["璀"] = "崔",
["皠"] = "崔",
["漼"] = "崔",
["鏙"] = "崔",
["摧"] = "崔",
["崔"] = "崔",
["慛"] = "崔",
["槯"] = "崔",
["繀"] = "崔",
["膗"] = "崔",
["膬"] = "毳",
["毳"] = "毳",
["竁"] = "毳",
["橇"] = "毳",
["荐"] = "存",
["洊"] = "存",
["臶"] = "存",
["栫"] = "存",
["袸"] = "存",
["存"] = "存",
["拵"] = "存",
["村"] = "寸",
["忖"] = "寸",
["刌"] = "寸",
["寸"] = "寸",
["踏"] = "沓",
["濌"] = "沓",
["錔"] = "沓",
["鞜"] = "沓",
["沓"] = "沓",
["涾"] = "沓",
["誻"] = "沓",
["羍"] = "羍",
["達"] = "羍",
["闥"] = "羍",
["撻"] = "羍",
["躂"] = "羍",
["澾"] = "羍",
["薘"] = "羍",
["龖"] = "龖",
["襲"] = "龖",
["馱"] = "大",
["大"] = "大",
["忕"] = "大",
["太"] = "大",
["汰"] = "大",
["汏"] = "大",
["軑"] = "大",
["釱"] = "大",
["达"] = "大",
["杕"] = "大",
["褱"] = "眔",
["鰥"] = "眔",
["鳏"] = "眔",
["嚃"] = "眔",
["眔"] = "眔",
["遝"] = "眔",
["帶"] = "帶",
["蹛"] = "帶",
["艜"] = "帶",
["慸"] = "帶",
["滯"] = "帶",
["懘"] = "帶",
["蔕"] = "帶",
["螮"] = "帶",
["摕"] = "帶",
["僀"] = "帶",
["殢"] = "帶",
["遰"] = "帶",
["墆"] = "帶",
["嵽"] = "帶",
["蒂"] = "帶",
["丹"] = "丹",
["旃"] = "丹",
["栴"] = "丹",
["嚲"] = "單",
["癉"] = "單",
["奲"] = "單",
["驒"] = "單",
["鼉"] = "單",
["磾"] = "單",
["鷤"] = "單",
["觶"] = "單",
["單"] = "單",
["鄲"] = "單",
["殫"] = "單",
["簞"] = "單",
["匰"] = "單",
["襌"] = "單",
["啴"] = "單",
["彈"] = "單",
["貚"] = "單",
["撣"] = "單",
["潬"] = "單",
["僤"] = "單",
["憚"] = "單",
["樿"] = "單",
["燀"] = "單",
["戰"] = "單",
["闡"] = "單",
["繟"] = "單",
["幝"] = "單",
["嘽"] = "單",
["灛"] = "單",
["蟬"] = "單",
["禪"] = "單",
["嬋"] = "單",
["墠"] = "單",
["鱓"] = "單",
["蕇"] = "單",
["皽"] = "旦",
["担"] = "旦",
["胆"] = "旦",
["疸"] = "旦",
["觛"] = "旦",
["亶"] = "旦",
["嬗"] = "旦",
["笪"] = "旦",
["狚"] = "旦",
["旦"] = "旦",
["鴠"] = "旦",
["譠"] = "旦",
["坦"] = "旦",
["但"] = "旦",
["檀"] = "旦",
["壇"] = "旦",
["儃"] = "旦",
["驙"] = "旦",
["袒"] = "旦",
["襢"] = "旦",
["繵"] = "旦",
["膻"] = "旦",
["澶"] = "旦",
["邅"] = "旦",
["鱣"] = "旦",
["饘"] = "旦",
["旜"] = "旦",
["氈"] = "旦",
["鸇"] = "旦",
["顫"] = "旦",
["蟺"] = "旦",
["擅"] = "旦",
["羶"] = "旦",
["呾"] = "旦",
["怛"] = "旦",
["妲"] = "旦",
["靼"] = "旦",
["炟"] = "旦",
["宕"] = "宕",
["菪"] = "宕",
["刀"] = "刀",
["忉"] = "刀",
["魛"] = "刀",
["舠"] = "刀",
["朷"] = "刀",
["叨"] = "刀",
["倒"] = "刀",
["到"] = "刀",
["菿"] = "刀",
["鞀"] = "刀",
["鳭"] = "刀",
["灱"] = "刀",
["菬"] = "刀",
["超"] = "刀",
["怊"] = "刀",
["欩"] = "刀",
["召"] = "刀",
["昭"] = "刀",
["招"] = "刀",
["鉊"] = "刀",
["沼"] = "刀",
["照"] = "刀",
["詔"] = "刀",
["炤"] = "刀",
["弨"] = "刀",
["眧"] = "刀",
["韶"] = "刀",
["佋"] = "刀",
["軺"] = "刀",
["玿"] = "刀",
["柖"] = "刀",
["紹"] = "刀",
["袑"] = "刀",
["綤"] = "刀",
["邵"] = "刀",
["劭"] = "刀",
["卲"] = "刀",
["刁"] = "刀",
["芀"] = "刀",
["貂"] = "刀",
["蛁"] = "刀",
["迢"] = "刀",
["苕"] = "刀",
["髫"] = "刀",
["岧"] = "刀",
["得"] = "得",
["淂"] = "得",
["棏"] = "得",
["登"] = "登",
["璒"] = "登",
["燈"] = "登",
["簦"] = "登",
["蹬"] = "登",
["磴"] = "登",
["鐙"] = "登",
["嶝"] = "登",
["隥"] = "登",
["橙"] = "登",
["凳"] = "登",
["墱"] = "登",
["鼟"] = "登",
["膯"] = "登",
["澄"] = "登",
["鄧"] = "登",
["僜"] = "登",
["覴"] = "登",
["瞪"] = "登",
["憕"] = "登",
["撜"] = "登",
["證"] = "登",
["逖"] = "狄",
["悐"] = "狄",
["狄"] = "狄",
["荻"] = "狄",
["梑"] = "狄",
["櫂"] = "翟",
["濯"] = "翟",
["耀"] = "翟",
["曜"] = "翟",
["燿"] = "翟",
["糶"] = "翟",
["粜"] = "翟",
["嬥"] = "翟",
["藋"] = "翟",
["躍"] = "翟",
["戳"] = "翟",
["擢"] = "翟",
["蠗"] = "翟",
["鸐"] = "翟",
["翟"] = "翟",
["趯"] = "翟",
["籊"] = "翟",
["糴"] = "翟",
["䊮"] = "翟",
["低"] = "氐",
["氐"] = "氐",
["袛"] = "氐",
["羝"] = "氐",
["眡"] = "氐",
["岻"] = "氐",
["奃"] = "氐",
["趆"] = "氐",
["柢"] = "氐",
["邸"] = "氐",
["底"] = "氐",
["詆"] = "氐",
["坻"] = "氐",
["抵"] = "氐",
["牴"] = "氐",
["觝"] = "氐",
["弤"] = "氐",
["軧"] = "氐",
["骶"] = "氐",
["砥"] = "氐",
["胝"] = "氐",
["疷"] = "氐",
["秪"] = "氐",
["泜"] = "氐",
["蚳"] = "氐",
["彽"] = "氐",
["阺"] = "氐",
["貾"] = "氐",
["祗"] = "氐",
["厎"] = "氐",
["茋"] = "氐",
["鴟"] = "氐",
["汦"] = "氐",
["梯"] = "弟",
["睇"] = "弟",
["涕"] = "弟",
["挮"] = "弟",
["鬀"] = "弟",
["剃"] = "弟",
["綈"] = "弟",
["蕛"] = "弟",
["稊"] = "弟",
["苐"] = "弟",
["鵜"] = "弟",
["銻"] = "弟",
["鮷"] = "弟",
["罤"] = "弟",
["弟"] = "弟",
["娣"] = "弟",
["悌"] = "弟",
["第"] = "弟",
["膪"] = "帝",
["揥"] = "帝",
["腣"] = "帝",
["諦"] = "帝",
["偙"] = "帝",
["渧"] = "帝",
["帝"] = "帝",
["楴"] = "帝",
["啼"] = "帝",
["蹄"] = "帝",
["締"] = "帝",
["崹"] = "帝",
["鶙"] = "帝",
["禘"] = "帝",
["啻"] = "帝",
["嫡"] = "帝",
["摘"] = "帝",
["謫"] = "帝",
["讁"] = "帝",
["擿"] = "帝",
["蹢"] = "帝",
["適"] = "帝",
["啇"] = "帝",
["滴"] = "帝",
["鏑"] = "帝",
["甋"] = "帝",
["樀"] = "帝",
["敵"] = "帝",
["典"] = "典",
["錪"] = "典",
["腆"] = "典",
["痶"] = "典",
["淟"] = "典",
["琠"] = "典",
["賟"] = "典",
["晪"] = "典",
["奠"] = "奠",
["鄭"] = "奠",
["擲"] = "奠",
["躑"] = "奠",
["殿"] = "殿",
["澱"] = "殿",
["壂"] = "殿",
["臀"] = "殿",
["盄"] = "弔",
["弔"] = "弔",
["伄"] = "弔",
["曡"] = "疊",
["疊"] = "疊",
["圢"] = "丁",
["町"] = "丁",
["打"] = "丁",
["盯"] = "丁",
["朾"] = "丁",
["丁"] = "丁",
["玎"] = "丁",
["虰"] = "丁",
["揨"] = "丁",
["釘"] = "丁",
["靪"] = "丁",
["仃"] = "丁",
["叮"] = "丁",
["疔"] = "丁",
["頂"] = "丁",
["奵"] = "丁",
["耵"] = "丁",
["酊"] = "丁",
["葶"] = "丁",
["矴"] = "丁",
["訂"] = "丁",
["飣"] = "丁",
["汀"] = "丁",
["艼"] = "丁",
["庁"] = "丁",
["婷"] = "丁",
["停"] = "丁",
["聤"] = "丁",
["渟"] = "丁",
["楟"] = "丁",
["亭"] = "丁",
["鼎"] = "鼎",
["薡"] = "鼎",
["濎"] = "鼎",
["疼"] = "冬",
["冬"] = "冬",
["苳"] = "冬",
["笗"] = "冬",
["炵"] = "冬",
["佟"] = "冬",
["鼕"] = "冬",
["鉖"] = "冬",
["終"] = "冬",
["螽"] = "冬",
["鼨"] = "冬",
["柊"] = "冬",
["鴤"] = "冬",
["泈"] = "冬",
["蔠"] = "冬",
["東"] = "東",
["菄"] = "東",
["鶇"] = "東",
["倲"] = "東",
["涷"] = "東",
["蝀"] = "東",
["凍"] = "東",
["鯟"] = "東",
["崠"] = "東",
["埬"] = "東",
["棟"] = "東",
["兜"] = "兜",
["篼"] = "兜",
["斗"] = "斗",
["抖"] = "斗",
["蚪"] = "斗",
["枓"] = "斗",
["阧"] = "斗",
["斢"] = "斗",
["鈄"] = "斗",
["侸"] = "豆",
["剅"] = "豆",
["郖"] = "豆",
["鬪"] = "豆",
["鋀"] = "豆",
["頭"] = "豆",
["豆"] = "豆",
["逗"] = "豆",
["痘"] = "豆",
["梪"] = "豆",
["脰"] = "豆",
["荳"] = "豆",
["浢"] = "豆",
["餖"] = "豆",
["毭"] = "豆",
["豎"] = "豆",
["裋"] = "豆",
["短"] = "豆",
["鬥"] = "鬥",
["鬭"] = "鬥",
["瑇"] = "毒",
["纛"] = "毒",
["碡"] = "毒",
["毒"] = "毒",
["蝳"] = "毒",
["揣"] = "耑",
["褍"] = "耑",
["惴"] = "耑",
["圌"] = "耑",
["篅"] = "耑",
["瑞"] = "耑",
["端"] = "耑",
["剬"] = "耑",
["偳"] = "耑",
["鍴"] = "耑",
["耑"] = "耑",
["踹"] = "耑",
["湍"] = "耑",
["煓"] = "耑",
["貒"] = "耑",
["諯"] = "耑",
["顓"] = "耑",
["喘"] = "耑",
["遄"] = "耑",
["輲"] = "耑",
["椯"] = "耑",
["歂"] = "耑",
["腨"] = "耑",
["鍛"] = "段",
["腶"] = "段",
["碫"] = "段",
["瑖"] = "段",
["緞"] = "段",
["段"] = "段",
["椴"] = "段",
["毈"] = "段",
["毤"] = "兌",
["蛻"] = "兌",
["娧"] = "兌",
["駾"] = "兌",
["裞"] = "兌",
["兌"] = "兌",
["綐"] = "兌",
["銳"] = "兌",
["帨"] = "兌",
["稅"] = "兌",
["說"] = "兌",
["涚"] = "兌",
["䫄"] = "兌",
["脫"] = "兌",
["侻"] = "兌",
["挩"] = "兌",
["莌"] = "兌",
["梲"] = "兌",
["鮵"] = "兌",
["敓"] = "兌",
["痥"] = "兌",
["悅"] = "兌",
["閱"] = "兌",
["對"] = "對",
["轛"] = "對",
["薱"] = "對",
["濧"] = "對",
["懟"] = "對",
["弴"] = "敦",
["敦"] = "敦",
["錞"] = "敦",
["憝"] = "敦",
["憞"] = "敦",
["譈"] = "敦",
["鐓"] = "敦",
["鷻"] = "敦",
["鶉"] = "敦",
["惇"] = "敦",
["墩"] = "敦",
["驐"] = "敦",
["燉"] = "敦",
["焞"] = "敦",
["啍"] = "敦",
["暾"] = "敦",
["噋"] = "敦",
["諄"] = "敦",
["埻"] = "敦",
["稕"] = "敦",
["醇"] = "敦",
["淳"] = "敦",
["犉"] = "敦",
["躉"] = "屯",
["窀"] = "屯",
["沌"] = "屯",
["盹"] = "屯",
["頓"] = "屯",
["扽"] = "屯",
["黗"] = "屯",
["吨"] = "屯",
["屯"] = "屯",
["飩"] = "屯",
["豘"] = "屯",
["軘"] = "屯",
["坉"] = "屯",
["邨"] = "屯",
["忳"] = "屯",
["芚"] = "屯",
["庉"] = "屯",
["囤"] = "屯",
["迍"] = "屯",
["杶"] = "屯",
["瑃"] = "屯",
["椿"] = "屯",
["偆"] = "屯",
["肫"] = "屯",
["訰"] = "屯",
["純"] = "屯",
["春"] = "屯",
["蠢"] = "屯",
["踳"] = "屯",
["惷"] = "屯",
["蒓"] = "屯",
["賰"] = "屯",
["鬊"] = "屯",
["盾"] = "盾",
["遁"] = "盾",
["循"] = "盾",
["揗"] = "盾",
["楯"] = "盾",
["輴"] = "盾",
["腯"] = "盾",
["鍎"] = "盾",
["多"] = "多",
["哆"] = "多",
["跢"] = "多",
["痑"] = "多",
["爹"] = "多",
["陊"] = "多",
["橠"] = "多",
["袲"] = "多",
["奓"] = "多",
["栘"] = "多",
["黟"] = "多",
["趍"] = "多",
["誃"] = "多",
["簃"] = "多",
["眵"] = "多",
["恀"] = "多",
["侈"] = "多",
["姼"] = "多",
["鉹"] = "多",
["垑"] = "多",
["袳"] = "多",
["卶"] = "多",
["宜"] = "多",
["誼"] = "多",
["竩"] = "多",
["移"] = "多",
["迻"] = "多",
["扅"] = "多",
["拸"] = "多",
["熪"] = "多",
["謻"] = "多",
["蛥"] = "多",
["桗"] = "朵",
["挆"] = "朵",
["朵"] = "朵",
["朶"] = "朵",
["躲"] = "朵",
["剁"] = "朵",
["垛"] = "朵",
["呃"] = "戹",
["阸"] = "戹",
["厄"] = "戹",
["蚅"] = "戹",
["扼"] = "戹",
["軛"] = "戹",
["戹"] = "戹",
["豟"] = "戹",
["呝"] = "戹",
["軶"] = "戹",
["耐"] = "而",
["耏"] = "而",
["而"] = "而",
["鮞"] = "而",
["鴯"] = "而",
["栭"] = "而",
["陑"] = "而",
["峏"] = "而",
["輀"] = "而",
["胹"] = "而",
["洏"] = "而",
["髵"] = "而",
["恧"] = "而",
["掜"] = "兒",
["誽"] = "兒",
["倪"] = "兒",
["蜺"] = "兒",
["霓"] = "兒",
["郳"] = "兒",
["齯"] = "兒",
["婗"] = "兒",
["輗"] = "兒",
["棿"] = "兒",
["猊"] = "兒",
["麑"] = "兒",
["貎"] = "兒",
["鯢"] = "兒",
["兒"] = "兒",
["觬"] = "兒",
["堄"] = "兒",
["晲"] = "兒",
["睨"] = "兒",
["唲"] = "兒",
["隉"] = "兒",
["鶂"] = "兒",
["鬩"] = "兒",
["妳"] = "尔",
["弥"] = "尔",
["尒"] = "尔",
["尔"] = "尔",
["迩"] = "尔",
["你"] = "尔",
["苶"] = "尔",
["佴"] = "耳",
["麛"] = "耳",
["弭"] = "耳",
["渳"] = "耳",
["葞"] = "耳",
["髶"] = "耳",
["聻"] = "耳",
["恥"] = "耳",
["咡"] = "耳",
["誀"] = "耳",
["耳"] = "耳",
["洱"] = "耳",
["駬"] = "耳",
["餌"] = "耳",
["珥"] = "耳",
["衈"] = "耳",
["毦"] = "耳",
["刵"] = "耳",
["眲"] = "耳",
["嬭"] = "爾",
["禰"] = "爾",
["镾"] = "爾",
["薾"] = "爾",
["檷"] = "爾",
["鑈"] = "爾",
["瀰"] = "爾",
["獼"] = "爾",
["瓕"] = "爾",
["彌"] = "爾",
["鸍"] = "爾",
["擟"] = "爾",
["濔"] = "爾",
["壐"] = "爾",
["璽"] = "爾",
["爾"] = "爾",
["邇"] = "爾",
["獮"] = "爾",
["籋"] = "爾",
["膩"] = "二",
["二"] = "二",
["弍"] = "二",
["貳"] = "二",
["樲"] = "二",
["廢"] = "發",
["癈"] = "發",
["橃"] = "發",
["撥"] = "發",
["鱍"] = "發",
["襏"] = "發",
["驋"] = "發",
["鏺"] = "發",
["潑"] = "發",
["醱"] = "發",
["砭"] = "乏",
["貶"] = "乏",
["窆"] = "乏",
["泛"] = "乏",
["姂"] = "乏",
["䒦"] = "乏",
["柉"] = "乏",
["覂"] = "乏",
["眨"] = "乏",
["鴔"] = "乏",
["乏"] = "乏",
["茷"] = "伐",
["筏"] = "伐",
["伐"] = "伐",
["閥"] = "伐",
["垡"] = "伐",
["栰"] = "伐",
["罰"] = "罰",
["藅"] = "罰",
["法"] = "法",
["灋"] = "法",
["皤"] = "番",
["嶓"] = "番",
["番"] = "番",
["播"] = "番",
["譒"] = "番",
["鄱"] = "番",
["潘"] = "番",
["蟠"] = "番",
["磻"] = "番",
["蕃"] = "番",
["轓"] = "番",
["鱕"] = "番",
["鐇"] = "番",
["藩"] = "番",
["籓"] = "番",
["橎"] = "番",
["翻"] = "番",
["幡"] = "番",
["飜"] = "番",
["旛"] = "番",
["繙"] = "番",
["燔"] = "番",
["蹯"] = "番",
["膰"] = "番",
["羳"] = "番",
["鷭"] = "番",
["璠"] = "番",
["襎"] = "番",
["墦"] = "番",
["嵐"] = "凡",
["葻"] = "凡",
["釩"] = "凡",
["汎"] = "凡",
["凡"] = "凡",
["帆"] = "凡",
["颿"] = "凡",
["軓"] = "凡",
["梵"] = "凡",
["芃"] = "凡",
["風"] = "凡",
["飌"] = "凡",
["楓"] = "凡",
["猦"] = "凡",
["偑"] = "凡",
["檒"] = "凡",
["瘋"] = "凡",
["諷"] = "凡",
["堸"] = "凡",
["渢"] = "凡",
["鳳"] = "凡",
["攀"] = "棥",
["襻"] = "棥",
["棥"] = "棥",
["礬"] = "棥",
["樊"] = "棥",
["蠜"] = "棥",
["煩"] = "煩",
["薠"] = "煩",
["繁"] = "緐",
["緐"] = "緐",
["蘩"] = "緐",
["瀿"] = "緐",
["瀪"] = "緐",
["扳"] = "反",
["板"] = "反",
["版"] = "反",
["瓪"] = "反",
["昄"] = "反",
["鈑"] = "反",
["蝂"] = "反",
["眅"] = "反",
["阪"] = "反",
["魬"] = "反",
["粄"] = "反",
["反"] = "反",
["返"] = "反",
["坂"] = "反",
["畈"] = "反",
["販"] = "反",
["汳"] = "反",
["飯"] = "反",
["氾"] = "氾",
["犯"] = "氾",
["範"] = "氾",
["范"] = "氾",
["笵"] = "氾",
["匚"] = "匚",
["匠"] = "匚",
["縍"] = "方",
["榜"] = "方",
["蒡"] = "方",
["牓"] = "方",
["螃"] = "方",
["搒"] = "方",
["舫"] = "方",
["謗"] = "方",
["雱"] = "方",
["磅"] = "方",
["霶"] = "方",
["滂"] = "方",
["鎊"] = "方",
["髈"] = "方",
["彷"] = "方",
["趽"] = "方",
["房"] = "方",
["篣"] = "方",
["騯"] = "方",
["傍"] = "方",
["膀"] = "方",
["旁"] = "方",
["徬"] = "方",
["閍"] = "方",
["祊"] = "方",
["嗙"] = "方",
["方"] = "方",
["汸"] = "方",
["坊"] = "方",
["邡"] = "方",
["枋"] = "方",
["鈁"] = "方",
["蚄"] = "方",
["肪"] = "方",
["鴋"] = "方",
["牥"] = "方",
["昉"] = "方",
["瓬"] = "方",
["放"] = "方",
["倣"] = "方",
["芳"] = "方",
["淓"] = "方",
["妨"] = "方",
["紡"] = "方",
["仿"] = "方",
["髣"] = "方",
["鶭"] = "方",
["訪"] = "方",
["防"] = "方",
["魴"] = "方",
["圮"] = "妃",
["妃"] = "妃",
["啡"] = "非",
["排"] = "非",
["俳"] = "非",
["輫"] = "非",
["悲"] = "非",
["棑"] = "非",
["輩"] = "非",
["裴"] = "非",
["徘"] = "非",
["琲"] = "非",
["痱"] = "非",
["非"] = "非",
["扉"] = "非",
["緋"] = "非",
["猆"] = "非",
["斐"] = "非",
["馡"] = "非",
["騑"] = "非",
["誹"] = "非",
["餥"] = "非",
["匪"] = "非",
["棐"] = "非",
["蜚"] = "非",
["篚"] = "非",
["榧"] = "非",
["鯡"] = "非",
["霏"] = "非",
["菲"] = "非",
["婔"] = "非",
["裶"] = "非",
["悱"] = "非",
["奜"] = "非",
["腓"] = "非",
["陫"] = "非",
["屝"] = "非",
["厞"] = "非",
["翡"] = "非",
["飛"] = "飛",
["騛"] = "飛",
["蜰"] = "肥",
["肥"] = "肥",
["淝"] = "肥",
["萉"] = "肥",
["朏"] = "朏",
["昢"] = "朏",
["扮"] = "分",
["盼"] = "分",
["頒"] = "分",
["朌"] = "分",
["鳻"] = "分",
["份"] = "分",
["汃"] = "分",
["玢"] = "分",
["邠"] = "分",
["攽"] = "分",
["砏"] = "分",
["貧"] = "分",
["湓"] = "分",
["盆"] = "分",
["葐"] = "分",
["坌"] = "分",
["坋"] = "分",
["分"] = "分",
["吩"] = "分",
["粉"] = "分",
["黺"] = "分",
["芬"] = "分",
["紛"] = "分",
["衯"] = "分",
["棻"] = "分",
["氛"] = "分",
["雰"] = "分",
["忿"] = "分",
["魵"] = "分",
["汾"] = "分",
["羒"] = "分",
["枌"] = "分",
["棼"] = "分",
["妢"] = "分",
["梤"] = "分",
["馚"] = "分",
["鼢"] = "分",
["蚡"] = "分",
["弅"] = "分",
["秎"] = "分",
["糞"] = "糞",
["瀵"] = "糞",
["邦"] = "丰",
["梆"] = "丰",
["垹"] = "丰",
["肨"] = "丰",
["蚌"] = "丰",
["玤"] = "丰",
["棒"] = "丰",
["蜯"] = "丰",
["琫"] = "丰",
["菶"] = "丰",
["俸"] = "丰",
["髼"] = "丰",
["蜂"] = "丰",
["韸"] = "丰",
["蓬"] = "丰",
["篷"] = "丰",
["唪"] = "丰",
["埲"] = "丰",
["丰"] = "丰",
["妦"] = "丰",
["仹"] = "丰",
["峯"] = "丰",
["峰"] = "丰",
["鋒"] = "丰",
["烽"] = "丰",
["蠭"] = "丰",
["桻"] = "丰",
["莑"] = "丰",
["夆"] = "丰",
["捧"] = "丰",
["逢"] = "丰",
["縫"] = "丰",
["漨"] = "丰",
["捀"] = "丰",
["奉"] = "丰",
["豐"] = "豐",
["蘴"] = "豐",
["灃"] = "豐",
["寷"] = "豐",
["麷"] = "豐",
["酆"] = "豐",
["幫"] = "封",
["鞤"] = "封",
["封"] = "封",
["葑"] = "封",
["犎"] = "封",
["崶"] = "封",
["湗"] = "封",
["胮"] = "夆",
["逄"] = "夆",
["舽"] = "夆",
["寶"] = "缶",
["珤"] = "缶",
["缶"] = "缶",
["缹"] = "缶",
["趺"] = "夫",
["肤"] = "夫",
["邞"] = "夫",
["鈇"] = "夫",
["衭"] = "夫",
["玞"] = "夫",
["夫"] = "夫",
["鳺"] = "夫",
["扶"] = "夫",
["妋"] = "夫",
["麩"] = "夫",
["蚨"] = "夫",
["芙"] = "夫",
["颫"] = "夫",
["枎"] = "夫",
["敷"] = "旉",
["璷"] = "旉",
["沛"] = "巿",
["芾"] = "巿",
["伂"] = "巿",
["霈"] = "巿",
["旆"] = "巿",
["肺"] = "巿",
["杮"] = "巿",
["巿"] = "巿",
["鄪"] = "弗",
["費"] = "弗",
["砩"] = "弗",
["沸"] = "弗",
["疿"] = "弗",
["茀"] = "弗",
["髴"] = "弗",
["昲"] = "弗",
["靅"] = "弗",
["狒"] = "弗",
["怫"] = "弗",
["胇"] = "弗",
["艴"] = "弗",
["弗"] = "弗",
["紼"] = "弗",
["柫"] = "弗",
["笰"] = "弗",
["拂"] = "弗",
["刜"] = "弗",
["彿"] = "弗",
["佛"] = "弗",
["坲"] = "弗",
["咈"] = "弗",
["炥"] = "弗",
["絥"] = "伏",
["伏"] = "伏",
["垘"] = "伏",
["茯"] = "伏",
["洑"] = "伏",
["栿"] = "伏",
["殍"] = "孚",
["脬"] = "孚",
["捊"] = "孚",
["莩"] = "孚",
["哹"] = "孚",
["浮"] = "孚",
["蜉"] = "孚",
["桴"] = "孚",
["罦"] = "孚",
["琈"] = "孚",
["粰"] = "孚",
["烰"] = "孚",
["艀"] = "孚",
["俘"] = "孚",
["孚"] = "孚",
["孵"] = "孚",
["稃"] = "孚",
["郛"] = "孚",
["筟"] = "孚",
["菔"] = "服",
["服"] = "服",
["鵩"] = "服",
["箙"] = "服",
["棴"] = "服",
["富"] = "畐",
["輻"] = "畐",
["副"] = "畐",
["褔"] = "畐",
["蔔"] = "畐",
["匐"] = "畐",
["逼"] = "畐",
["偪"] = "畐",
["幅"] = "畐",
["楅"] = "畐",
["湢"] = "畐",
["堛"] = "畐",
["愊"] = "畐",
["踾"] = "畐",
["揊"] = "畐",
["稫"] = "畐",
["畐"] = "畐",
["疈"] = "畐",
["腷"] = "畐",
["鶝"] = "畐",
["福"] = "畐",
["蝠"] = "畐",
["葍"] = "畐",
["愎"] = "复",
["鍑"] = "复",
["覆"] = "复",
["復"] = "复",
["椱"] = "复",
["複"] = "复",
["馥"] = "复",
["腹"] = "复",
["輹"] = "复",
["蝮"] = "复",
["蕧"] = "复",
["复"] = "复",
["鰒"] = "复",
["澓"] = "复",
["豧"] = "甫",
["縛"] = "甫",
["逋"] = "甫",
["餔"] = "甫",
["晡"] = "甫",
["庯"] = "甫",
["陠"] = "甫",
["鵏"] = "甫",
["峬"] = "甫",
["誧"] = "甫",
["秿"] = "甫",
["鯆"] = "甫",
["補"] = "甫",
["圃"] = "甫",
["鋪"] = "甫",
["痡"] = "甫",
["浦"] = "甫",
["烳"] = "甫",
["溥"] = "甫",
["悑"] = "甫",
["酺"] = "甫",
["匍"] = "甫",
["蜅"] = "甫",
["脯"] = "甫",
["葡"] = "甫",
["蒱"] = "甫",
["蒲"] = "甫",
["簿"] = "甫",
["捕"] = "甫",
["哺"] = "甫",
["簠"] = "甫",
["甫"] = "甫",
["黼"] = "甫",
["莆"] = "甫",
["俌"] = "甫",
["郙"] = "甫",
["傅"] = "甫",
["搏"] = "甫",
["麱"] = "甫",
["尃"] = "甫",
["榑"] = "甫",
["輔"] = "甫",
["鬴"] = "甫",
["賻"] = "甫",
["博"] = "甫",
["髆"] = "甫",
["鎛"] = "甫",
["猼"] = "甫",
["餺"] = "甫",
["簙"] = "甫",
["鑮"] = "甫",
["欂"] = "甫",
["蒪"] = "甫",
["膊"] = "甫",
["薄"] = "甫",
["礡"] = "甫",
["抪"] = "父",
["布"] = "父",
["佈"] = "父",
["怖"] = "父",
["斧"] = "父",
["父"] = "父",
["蚥"] = "父",
["滏"] = "父",
["釜"] = "父",
["鉜"] = "付",
["跗"] = "付",
["柎"] = "付",
["腑"] = "付",
["俯"] = "付",
["府"] = "付",
["付"] = "付",
["咐"] = "付",
["怤"] = "付",
["泭"] = "付",
["姇"] = "付",
["紨"] = "付",
["拊"] = "付",
["弣"] = "付",
["符"] = "付",
["苻"] = "付",
["坿"] = "付",
["腐"] = "付",
["附"] = "付",
["駙"] = "付",
["鮒"] = "付",
["袝"] = "付",
["蚹"] = "付",
["胕"] = "付",
["阜"] = "阜",
["埠"] = "阜",
["負"] = "負",
["萯"] = "負",
["蝜"] = "負",
["偩"] = "負",
["丐"] = "丐",
["匄"] = "丐",
["訐"] = "干",
["肝"] = "干",
["竿"] = "干",
["干"] = "干",
["奸"] = "干",
["玕"] = "干",
["汗"] = "干",
["迀"] = "干",
["忓"] = "干",
["鳱"] = "干",
["邗"] = "干",
["秆"] = "干",
["矸"] = "干",
["仠"] = "干",
["皯"] = "干",
["衦"] = "干",
["簳"] = "干",
["擀"] = "干",
["旰"] = "干",
["盰"] = "干",
["幹"] = "干",
["杆"] = "干",
["骭"] = "干",
["桿"] = "干",
["趕"] = "干",
["稈"] = "干",
["刊"] = "干",
["靬"] = "干",
["衎"] = "干",
["犴"] = "干",
["豻"] = "干",
["頇"] = "干",
["岸"] = "干",
["鼾"] = "干",
["罕"] = "干",
["焊"] = "干",
["蔊"] = "干",
["虷"] = "干",
["旱"] = "干",
["皔"] = "干",
["釬"] = "干",
["扞"] = "干",
["閈"] = "干",
["馯"] = "干",
["捍"] = "干",
["悍"] = "干",
["銲"] = "干",
["垾"] = "干",
["駻"] = "干",
["睅"] = "干",
["娨"] = "干",
["飦"] = "干",
["赶"] = "干",
["軒"] = "干",
["蓒"] = "干",
["酐"] = "干",
["澣"] = "干",
["紺"] = "甘",
["姏"] = "甘",
["嵌"] = "甘",
["甘"] = "甘",
["柑"] = "甘",
["苷"] = "甘",
["泔"] = "甘",
["坩"] = "甘",
["蚶"] = "甘",
["酣"] = "甘",
["甝"] = "甘",
["魽"] = "甘",
["邯"] = "甘",
["鉗"] = "甘",
["箝"] = "甘",
["黚"] = "甘",
["拑"] = "甘",
["撖"] = "敢",
["澉"] = "敢",
["噉"] = "敢",
["敢"] = "敢",
["橄"] = "敢",
["瞰"] = "敢",
["闞"] = "敢",
["憨"] = "敢",
["譀"] = "敢",
["巖"] = "敢",
["礹"] = "敢",
["豃"] = "敢",
["讝"] = "敢",
["玁"] = "敢",
["嚴"] = "敢",
["儼"] = "敢",
["曮"] = "敢",
["釅"] = "敢",
["乾"] = "倝",
["漧"] = "倝",
["倝"] = "倝",
["榦"] = "倝",
["韓"] = "倝",
["鶾"] = "倝",
["翰"] = "倝",
["瀚"] = "倝",
["螒"] = "倝",
["雗"] = "倝",
["斡"] = "倝",
["岡"] = "岡",
["崗"] = "岡",
["剛"] = "岡",
["掆"] = "岡",
["鋼"] = "岡",
["綱"] = "岡",
["犅"] = "岡",
["堈"] = "岡",
["羔"] = "羔",
["糕"] = "羔",
["餻"] = "羔",
["窯"] = "羔",
["溔"] = "羔",
["高"] = "高",
["膏"] = "高",
["篙"] = "高",
["稿"] = "高",
["稾"] = "高",
["槁"] = "高",
["縞"] = "高",
["暠"] = "高",
["槀"] = "高",
["藁"] = "高",
["燺"] = "高",
["薧"] = "高",
["犒"] = "高",
["蒿"] = "高",
["藃"] = "高",
["豪"] = "高",
["毫"] = "高",
["壕"] = "高",
["濠"] = "高",
["鎬"] = "高",
["滈"] = "高",
["鄗"] = "高",
["鰝"] = "高",
["薃"] = "高",
["搞"] = "高",
["敲"] = "高",
["髇"] = "高",
["嗃"] = "高",
["巐"] = "高",
["歊"] = "高",
["謞"] = "高",
["熇"] = "高",
["碻"] = "高",
["塙"] = "高",
["毃"] = "高",
["翯"] = "高",
["瀥"] = "高",
["睾"] = "皋",
["皋"] = "皋",
["臯"] = "皐",
["橰"] = "皐",
["鷱"] = "皐",
["翱"] = "皐",
["翺"] = "皐",
["噑"] = "皐",
["獋"] = "皐",
["暭"] = "皐",
["夰"] = "夰",
["昦"] = "夰",
["杲"] = "杲",
["菒"] = "杲",
["造"] = "告",
["慥"] = "告",
["艁"] = "告",
["糙"] = "告",
["告"] = "告",
["誥"] = "告",
["郜"] = "告",
["祰"] = "告",
["靠"] = "告",
["浩"] = "告",
["晧"] = "告",
["皓"] = "告",
["窖"] = "告",
["簉"] = "告",
["梏"] = "告",
["硞"] = "告",
["牿"] = "告",
["鵠"] = "告",
["酷"] = "告",
["焅"] = "告",
["嚳"] = "告",
["頶"] = "告",
["戕"] = "戈",
["戈"] = "戈",
["划"] = "戈",
["革"] = "革",
["諽"] = "革",
["緙"] = "革",
["鞂"] = "革",
["隔"] = "鬲",
["膈"] = "鬲",
["搹"] = "鬲",
["鬲"] = "鬲",
["槅"] = "鬲",
["嗝"] = "鬲",
["虉"] = "鬲",
["翮"] = "鬲",
["滆"] = "鬲",
["蒚"] = "鬲",
["鎘"] = "鬲",
["髂"] = "各",
["路"] = "各",
["輅"] = "各",
["賂"] = "各",
["虂"] = "各",
["露"] = "各",
["潞"] = "各",
["鷺"] = "各",
["璐"] = "各",
["簬"] = "各",
["簵"] = "各",
["洛"] = "各",
["駱"] = "各",
["絡"] = "各",
["酪"] = "各",
["烙"] = "各",
["雒"] = "各",
["珞"] = "各",
["硌"] = "各",
["袼"] = "各",
["笿"] = "各",
["鉻"] = "各",
["鮥"] = "各",
["鵅"] = "各",
["挌"] = "各",
["落"] = "各",
["各"] = "各",
["胳"] = "各",
["閣"] = "各",
["格"] = "各",
["擱"] = "各",
["恪"] = "各",
["愙"] = "各",
["貉"] = "各",
["狢"] = "各",
["佫"] = "各",
["略"] = "各",
["茖"] = "各",
["骼"] = "各",
["觡"] = "各",
["蛒"] = "各",
["敋"] = "各",
["客"] = "各",
["喀"] = "各",
["揢"] = "各",
["額"] = "各",
["峉"] = "各",
["頟"] = "各",
["詻"] = "各",
["垎"] = "各",
["楁"] = "各",
["艱"] = "艮",
["齦"] = "艮",
["眼"] = "艮",
["蛝"] = "艮",
["限"] = "艮",
["硍"] = "艮",
["豤"] = "艮",
["詪"] = "艮",
["根"] = "艮",
["跟"] = "艮",
["珢"] = "艮",
["艮"] = "艮",
["茛"] = "艮",
["墾"] = "艮",
["懇"] = "艮",
["垠"] = "艮",
["泿"] = "艮",
["痕"] = "艮",
["拫"] = "艮",
["鞎"] = "艮",
["很"] = "艮",
["恨"] = "艮",
["銀"] = "艮",
["檭"] = "艮",
["烜"] = "亘",
["貆"] = "亘",
["峘"] = "亘",
["狟"] = "亘",
["絙"] = "亘",
["荁"] = "亘",
["宣"] = "亘",
["咺"] = "亘",
["暅"] = "亘",
["桓"] = "亘",
["洹"] = "亘",
["揎"] = "亘",
["愃"] = "亘",
["瑄"] = "亘",
["渲"] = "亘",
["喧"] = "亘",
["萱"] = "亘",
["暄"] = "亘",
["諠"] = "亘",
["翧"] = "亘",
["蝖"] = "亘",
["垣"] = "亘",
["楦"] = "亘",
["唐"] = "庚",
["煻"] = "庚",
["糖"] = "庚",
["搪"] = "庚",
["蓎"] = "庚",
["瑭"] = "庚",
["餹"] = "庚",
["篖"] = "庚",
["螗"] = "庚",
["塘"] = "庚",
["鶶"] = "庚",
["赯"] = "庚",
["磄"] = "庚",
["溏"] = "庚",
["傏"] = "庚",
["鎕"] = "庚",
["榶"] = "庚",
["嵣"] = "庚",
["庚"] = "庚",
["賡"] = "庚",
["鹒"] = "庚",
["康"] = "庚",
["穅"] = "庚",
["糠"] = "庚",
["槺"] = "庚",
["漮"] = "庚",
["躿"] = "庚",
["慷"] = "庚",
["耿"] = "耿",
["褧"] = "耿",
["缸"] = "工",
["篢"] = "工",
["贑"] = "工",
["涳"] = "工",
["江"] = "工",
["肛"] = "工",
["扛"] = "工",
["杠"] = "工",
["豇"] = "工",
["茳"] = "工",
["釭"] = "工",
["矼"] = "工",
["玒"] = "工",
["虹"] = "工",
["腔"] = "工",
["崆"] = "工",
["羫"] = "工",
["控"] = "工",
["椌"] = "工",
["悾"] = "工",
["跫"] = "工",
["啌"] = "工",
["谾"] = "工",
["舡"] = "工",
["缻"] = "工",
["項"] = "工",
["屸"] = "工",
["功"] = "工",
["工"] = "工",
["疘"] = "工",
["魟"] = "工",
["攻"] = "工",
["愩"] = "工",
["碽"] = "工",
["貢"] = "工",
["羾"] = "工",
["空"] = "工",
["箜"] = "工",
["硿"] = "工",
["埪"] = "工",
["鵼"] = "工",
["倥"] = "工",
["鞚"] = "工",
["叿"] = "工",
["嗊"] = "工",
["訌"] = "工",
["紅"] = "工",
["仜"] = "工",
["葒"] = "工",
["渱"] = "工",
["鴻"] = "工",
["汞"] = "工",
["澒"] = "工",
["鞏"] = "工",
["巩"] = "工",
["銎"] = "工",
["恐"] = "工",
["蛩"] = "工",
["筇"] = "工",
["桏"] = "工",
["邛"] = "工",
["弓"] = "弓",
["穹"] = "弓",
["焪"] = "弓",
["芎"] = "弓",
["慃"] = "公",
["袞"] = "公",
["蔉"] = "公",
["滾"] = "公",
["忩"] = "公",
["鬆"] = "公",
["凇"] = "公",
["公"] = "公",
["蚣"] = "公",
["翁"] = "公",
["螉"] = "公",
["蓊"] = "公",
["嗡"] = "公",
["滃"] = "公",
["暡"] = "公",
["勜"] = "公",
["塕"] = "公",
["瓮"] = "公",
["崧"] = "公",
["菘"] = "公",
["硹"] = "公",
["淞"] = "公",
["蜙"] = "公",
["倯"] = "公",
["松"] = "公",
["訟"] = "公",
["頌"] = "公",
["忪"] = "公",
["彸"] = "公",
["衳"] = "公",
["伀"] = "公",
["妐"] = "公",
["炂"] = "公",
["鈆"] = "公",
["肱"] = "厷",
["宏"] = "厷",
["閎"] = "厷",
["吰"] = "厷",
["竑"] = "厷",
["谹"] = "厷",
["翃"] = "厷",
["紘"] = "厷",
["鈜"] = "厷",
["浤"] = "厷",
["耾"] = "厷",
["雄"] = "厷",
["躬"] = "躬",
["匑"] = "躬",
["躳"] = "躬",
["窮"] = "躬",
["藭"] = "躬",
["港"] = "共",
["巷"] = "共",
["衖"] = "共",
["鬨"] = "共",
["烘"] = "共",
["洪"] = "共",
["鉷"] = "共",
["谼"] = "共",
["葓"] = "共",
["哄"] = "共",
["蕻"] = "共",
["恭"] = "共",
["供"] = "共",
["龔"] = "共",
["珙"] = "共",
["共"] = "共",
["髸"] = "共",
["拱"] = "共",
["拲"] = "共",
["蛬"] = "共",
["栱"] = "共",
["輁"] = "共",
["舼"] = "共",
["輂"] = "共",
["溝"] = "冓",
["篝"] = "冓",
["鞲"] = "冓",
["韝"] = "冓",
["褠"] = "冓",
["冓"] = "冓",
["構"] = "冓",
["購"] = "冓",
["媾"] = "冓",
["覯"] = "冓",
["遘"] = "冓",
["煹"] = "冓",
["搆"] = "冓",
["講"] = "冓",
["耩"] = "冓",
["傋"] = "冓",
["斠"] = "冓",
["箇"] = "古",
["個"] = "古",
["居"] = "古",
["橭"] = "古",
["嫴"] = "古",
["姑"] = "古",
["辜"] = "古",
["酤"] = "古",
["蛄"] = "古",
["鴣"] = "古",
["沽"] = "古",
["盬"] = "古",
["古"] = "古",
["罟"] = "古",
["估"] = "古",
["鈷"] = "古",
["詁"] = "古",
["牯"] = "古",
["故"] = "古",
["固"] = "古",
["稒"] = "古",
["痼"] = "古",
["錮"] = "古",
["鯝"] = "古",
["棝"] = "古",
["凅"] = "古",
["枯"] = "古",
["軲"] = "古",
["跍"] = "古",
["骷"] = "古",
["苦"] = "古",
["葫"] = "古",
["餬"] = "古",
["瑚"] = "古",
["湖"] = "古",
["鶘"] = "古",
["猢"] = "古",
["醐"] = "古",
["糊"] = "古",
["箶"] = "古",
["蝴"] = "古",
["胡"] = "古",
["瓳"] = "古",
["怙"] = "古",
["祜"] = "古",
["岵"] = "古",
["婟"] = "古",
["楛"] = "古",
["据"] = "古",
["裾"] = "古",
["琚"] = "古",
["椐"] = "古",
["鶋"] = "古",
["蜛"] = "古",
["崌"] = "古",
["涺"] = "古",
["腒"] = "古",
["鋸"] = "古",
["倨"] = "古",
["踞"] = "古",
["涸"] = "古",
["螸"] = "谷",
["裕"] = "谷",
["容"] = "谷",
["溶"] = "谷",
["鎔"] = "谷",
["蓉"] = "谷",
["傛"] = "谷",
["褣"] = "谷",
["搈"] = "谷",
["瑢"] = "谷",
["嵱"] = "谷",
["熔"] = "谷",
["榕"] = "谷",
["塎"] = "谷",
["谷"] = "谷",
["唂"] = "谷",
["焀"] = "谷",
["俗"] = "谷",
["欲"] = "谷",
["浴"] = "谷",
["鵒"] = "谷",
["峪"] = "谷",
["鋊"] = "谷",
["輍"] = "谷",
["慾"] = "谷",
["股"] = "股",
["羖"] = "股",
["顝"] = "骨",
["滑"] = "骨",
["猾"] = "骨",
["磆"] = "骨",
["螖"] = "骨",
["鶻"] = "骨",
["嗗"] = "骨",
["骨"] = "骨",
["縎"] = "骨",
["愲"] = "骨",
["蓇"] = "骨",
["尳"] = "骨",
["榾"] = "骨",
["搰"] = "骨",
["核"] = "骨",
["皷"] = "鼓",
["鼓"] = "鼓",
["瞽"] = "鼓",
["瓜"] = "瓜",
["坬"] = "瓜",
["窊"] = "瓜",
["畖"] = "瓜",
["搲"] = "瓜",
["攨"] = "瓜",
["孤"] = "瓜",
["苽"] = "瓜",
["胍"] = "瓜",
["泒"] = "瓜",
["呱"] = "瓜",
["觚"] = "瓜",
["柧"] = "瓜",
["罛"] = "瓜",
["軱"] = "瓜",
["菰"] = "瓜",
["箛"] = "瓜",
["狐"] = "瓜",
["弧"] = "瓜",
["碢"] = "冎",
["腡"] = "冎",
["過"] = "冎",
["渦"] = "冎",
["鍋"] = "冎",
["楇"] = "冎",
["瘑"] = "冎",
["緺"] = "冎",
["堝"] = "冎",
["濄"] = "冎",
["鐹"] = "冎",
["薖"] = "冎",
["簻"] = "冎",
["禍"] = "冎",
["窩"] = "冎",
["萵"] = "冎",
["檛"] = "冎",
["膼"] = "冎",
["蝸"] = "冎",
["媧"] = "冎",
["騧"] = "冎",
["冎"] = "冎",
["剮"] = "冎",
["諣"] = "冎",
["歄"] = "冎",
["咼"] = "冎",
["喎"] = "冎",
["箉"] = "枴",
["拐"] = "枴",
["枴"] = "枴",
["袂"] = "夬",
["夬"] = "夬",
["快"] = "夬",
["駃"] = "夬",
["筷"] = "夬",
["炔"] = "夬",
["觖"] = "夬",
["缺"] = "夬",
["蒛"] = "夬",
["吷"] = "夬",
["妜"] = "夬",
["決"] = "夬",
["訣"] = "夬",
["抉"] = "夬",
["玦"] = "夬",
["芵"] = "夬",
["赽"] = "夬",
["鴂"] = "夬",
["鈌"] = "夬",
["决"] = "夬",
["疦"] = "夬",
["蚗"] = "夬",
["趹"] = "夬",
["官"] = "官",
["棺"] = "官",
["倌"] = "官",
["悹"] = "官",
["涫"] = "官",
["管"] = "官",
["琯"] = "官",
["痯"] = "官",
["輨"] = "官",
["錧"] = "官",
["館"] = "官",
["婠"] = "官",
["悺"] = "官",
["逭"] = "官",
["菅"] = "官",
["綰"] = "官",
["捾"] = "官",
["毌"] = "毌",
["貫"] = "毌",
["樌"] = "毌",
["鏆"] = "毌",
["遦"] = "毌",
["慣"] = "毌",
["摜"] = "毌",
["瑻"] = "毌",
["謴"] = "毌",
["觀"] = "雚",
["灌"] = "雚",
["鸛"] = "雚",
["瓘"] = "雚",
["矔"] = "雚",
["懽"] = "雚",
["爟"] = "雚",
["雚"] = "雚",
["罐"] = "雚",
["鑵"] = "雚",
["歡"] = "雚",
["驩"] = "雚",
["貛"] = "雚",
["酄"] = "雚",
["獾"] = "雚",
["讙"] = "雚",
["嚾"] = "雚",
["權"] = "雚",
["顴"] = "雚",
["孉"] = "雚",
["蠸"] = "雚",
["虇"] = "雚",
["勸"] = "雚",
["光"] = "光",
["灮"] = "光",
["洸"] = "光",
["桄"] = "光",
["胱"] = "光",
["垙"] = "光",
["輄"] = "光",
["恍"] = "光",
["茪"] = "光",
["侊"] = "光",
["晃"] = "光",
["幌"] = "光",
["榥"] = "光",
["滉"] = "光",
["觥"] = "光",
["駫"] = "光",
["街"] = "圭",
["鞋"] = "圭",
["娾"] = "圭",
["佳"] = "圭",
["鮭"] = "圭",
["涯"] = "圭",
["崖"] = "圭",
["啀"] = "圭",
["厓"] = "圭",
["捱"] = "圭",
["睚"] = "圭",
["娃"] = "圭",
["洼"] = "圭",
["哇"] = "圭",
["胿"] = "圭",
["溎"] = "圭",
["觟"] = "圭",
["黊"] = "圭",
["蘳"] = "圭",
["蛙"] = "圭",
["窪"] = "圭",
["卦"] = "圭",
["挂"] = "圭",
["掛"] = "圭",
["詿"] = "圭",
["罣"] = "圭",
["絓"] = "圭",
["鼃"] = "圭",
["圭"] = "圭",
["珪"] = "圭",
["邽"] = "圭",
["閨"] = "圭",
["袿"] = "圭",
["窐"] = "圭",
["茥"] = "圭",
["桂"] = "圭",
["筀"] = "圭",
["奎"] = "圭",
["刲"] = "圭",
["蝰"] = "圭",
["楏"] = "圭",
["睳"] = "圭",
["畦"] = "圭",
["眭"] = "圭",
["烓"] = "圭",
["跬"] = "圭",
["恚"] = "圭",
["硅"] = "圭",
["嫢"] = "規",
["規"] = "規",
["槻"] = "規",
["鬹"] = "規",
["摫"] = "規",
["瞡"] = "規",
["窺"] = "規",
["闚"] = "規",
["鬮"] = "龜",
["龜"] = "龜",
["孈"] = "巂",
["纗"] = "巂",
["攜"] = "巂",
["蠵"] = "巂",
["鑴"] = "巂",
["驨"] = "巂",
["酅"] = "巂",
["雟"] = "巂",
["讗"] = "巂",
["觽"] = "巂",
["儶"] = "巂",
["觿"] = "巂",
["欈"] = "巂",
["瓗"] = "巂",
["携"] = "巂",
["睽"] = "癸",
["湀"] = "癸",
["聧"] = "癸",
["藈"] = "癸",
["癸"] = "癸",
["葵"] = "癸",
["鄈"] = "癸",
["楑"] = "癸",
["戣"] = "癸",
["鍨"] = "癸",
["騤"] = "癸",
["揆"] = "癸",
["猤"] = "癸",
["闋"] = "癸",
["謉"] = "鬼",
["瑰"] = "鬼",
["傀"] = "鬼",
["藱"] = "鬼",
["魁"] = "鬼",
["磈"] = "鬼",
["塊"] = "鬼",
["嵬"] = "鬼",
["隗"] = "鬼",
["槐"] = "鬼",
["瘣"] = "鬼",
["廆"] = "鬼",
["溾"] = "鬼",
["螝"] = "鬼",
["褢"] = "鬼",
["騩"] = "鬼",
["愧"] = "鬼",
["媿"] = "鬼",
["聭"] = "鬼",
["餽"] = "鬼",
["鬼"] = "鬼",
["魏"] = "鬼",
["巍"] = "鬼",
["犩"] = "鬼",
["簋"] = "簋",
["孂"] = "簋",
["藬"] = "貴",
["僓"] = "貴",
["頹"] = "貴",
["穨"] = "貴",
["蘈"] = "貴",
["隤"] = "貴",
["墤"] = "貴",
["尵"] = "貴",
["蹪"] = "貴",
["瀢"] = "貴",
["鞼"] = "貴",
["膭"] = "貴",
["憒"] = "貴",
["靧"] = "貴",
["潰"] = "貴",
["繢"] = "貴",
["嬇"] = "貴",
["殨"] = "貴",
["闠"] = "貴",
["簣"] = "貴",
["嘳"] = "貴",
["蕢"] = "貴",
["聵"] = "貴",
["樻"] = "貴",
["䙡"] = "貴",
["匱"] = "貴",
["臾"] = "貴",
["饋"] = "貴",
["櫃"] = "貴",
["遺"] = "貴",
["壝"] = "貴",
["瞶"] = "貴",
["貴"] = "貴",
["郭"] = "郭",
["埻"] = "郭",
["崞"] = "郭",
["椁"] = "郭",
["槨"] = "郭",
["噋"] = "郭",
["廓"] = "郭",
["鞹"] = "郭",
["漷"] = "郭",
["霩"] = "郭",
["裸"] = "果",
["躶"] = "果",
["果"] = "果",
["菓"] = "果",
["猓"] = "果",
["輠"] = "果",
["裹"] = "果",
["蜾"] = "果",
["惈"] = "果",
["粿"] = "果",
["窠"] = "果",
["稞"] = "果",
["課"] = "果",
["髁"] = "果",
["棵"] = "果",
["顆"] = "果",
["堁"] = "果",
["敤"] = "果",
["夥"] = "果",
["婐"] = "果",
["踝"] = "果",
["祼"] = "果",
["該"] = "亥",
["垓"] = "亥",
["賅"] = "亥",
["陔"] = "亥",
["豥"] = "亥",
["荄"] = "亥",
["郂"] = "亥",
["姟"] = "亥",
["絯"] = "亥",
["晐"] = "亥",
["峐"] = "亥",
["侅"] = "亥",
["胲"] = "亥",
["頦"] = "亥",
["奒"] = "亥",
["輆"] = "亥",
["欬"] = "亥",
["硋"] = "亥",
["閡"] = "亥",
["咳"] = "亥",
["孩"] = "亥",
["亥"] = "亥",
["劾"] = "亥",
["痎"] = "亥",
["烗"] = "亥",
["骸"] = "亥",
["駭"] = "亥",
["刻"] = "亥",
["餩"] = "亥",
["核"] = "亥",
["轄"] = "害",
["害"] = "害",
["犗"] = "害",
["幰"] = "害",
["攇"] = "害",
["憲"] = "害",
["瀗"] = "害",
["割"] = "害",
["磍"] = "害",
["瞎"] = "害",
["鎋"] = "害",
["鶷"] = "害",
["縖"] = "害",
["豁"] = "害",
["蜬"] = "函",
["函"] = "函",
["涵"] = "函",
["顄"] = "函",
["圅"] = "函",
["菡"] = "函",
["寒"] = "寒",
["蹇"] = "寒",
["謇"] = "寒",
["搴"] = "寒",
["藆"] = "寒",
["騫"] = "寒",
["褰"] = "寒",
["攐"] = "寒",
["鑳"] = "寒",
["寋"] = "寒",
["鶱"] = "寒",
["厂"] = "厂",
["屵"] = "厂",
["儺"] = "暵",
["臡"] = "暵",
["嘆"] = "暵",
["灘"] = "暵",
["擹"] = "暵",
["攤"] = "暵",
["癱"] = "暵",
["歎"] = "暵",
["難"] = "暵",
["暵"] = "暵",
["熯"] = "暵",
["漢"] = "暵",
["戁"] = "暵",
["薅"] = "好",
["好"] = "好",
["饕"] = "号",
["號"] = "号",
["号"] = "号",
["枵"] = "号",
["呺"] = "号",
["鴞"] = "号",
["昊"] = "昊",
["顥"] = "昊",
["灝"] = "昊",
["科"] = "禾",
["萪"] = "禾",
["蝌"] = "禾",
["犐"] = "禾",
["禾"] = "禾",
["和"] = "禾",
["咊"] = "禾",
["盉"] = "禾",
["龢"] = "禾",
["鉌"] = "禾",
["俰"] = "禾",
["龕"] = "合",
["媕"] = "合",
["頜"] = "合",
["答"] = "合",
["畣"] = "合",
["荅"] = "合",
["嗒"] = "合",
["褡"] = "合",
["撘"] = "合",
["搭"] = "合",
["榙"] = "合",
["佮"] = "合",
["蛤"] = "合",
["鴿"] = "合",
["合"] = "合",
["郃"] = "合",
["匌"] = "合",
["鉿"] = "合",
["閤"] = "合",
["鞈"] = "合",
["韐"] = "合",
["鮯"] = "合",
["哈"] = "合",
["姶"] = "合",
["欱"] = "合",
["盒"] = "合",
["耠"] = "合",
["詥"] = "合",
["塔"] = "合",
["鞳"] = "合",
["劄"] = "合",
["跲"] = "合",
["袷"] = "合",
["餄"] = "合",
["恰"] = "合",
["帢"] = "合",
["洽"] = "合",
["祫"] = "合",
["珨"] = "合",
["烚"] = "合",
["歙"] = "合",
["湁"] = "合",
["拾"] = "合",
["給"] = "合",
["翕"] = "合",
["噏"] = "合",
["潝"] = "合",
["熻"] = "合",
["嬆"] = "合",
["翖"] = "合",
["闟"] = "合",
["愒"] = "曷",
["馤"] = "曷",
["靄"] = "曷",
["餲"] = "曷",
["喝"] = "曷",
["揭"] = "曷",
["偈"] = "曷",
["猲"] = "曷",
["葛"] = "曷",
["輵"] = "曷",
["獦"] = "曷",
["渴"] = "曷",
["嵑"] = "曷",
["暍"] = "曷",
["曷"] = "曷",
["褐"] = "曷",
["鶡"] = "曷",
["毼"] = "曷",
["蝎"] = "曷",
["鞨"] = "曷",
["遏"] = "曷",
["齃"] = "曷",
["堨"] = "曷",
["擖"] = "曷",
["楬"] = "曷",
["朅"] = "曷",
["藒"] = "曷",
["竭"] = "曷",
["碣"] = "曷",
["羯"] = "曷",
["鍻"] = "曷",
["歇"] = "曷",
["蠍"] = "曷",
["謁"] = "曷",
["蓋"] = "盍",
["盖"] = "盍",
["溘"] = "盍",
["搕"] = "盍",
["嗑"] = "盍",
["榼"] = "盍",
["磕"] = "盍",
["瞌"] = "盍",
["盍"] = "盍",
["闔"] = "盍",
["篕"] = "盍",
["熆"] = "盍",
["鰪"] = "盍",
["廅"] = "盍",
["圔"] = "盍",
["饁"] = "盍",
["鶴"] = "寉",
["髉"] = "寉",
["篧"] = "寉",
["榷"] = "寉",
["搉"] = "寉",
["傕"] = "寉",
["確"] = "寉",
["寉"] = "寉",
["蒮"] = "寉",
["嚜"] = "黑",
["嫼"] = "黑",
["墨"] = "黑",
["默"] = "黑",
["纆"] = "黑",
["黑"] = "黑",
["潶"] = "黑",
["亨"] = "亨",
["享"] = "亨",
["烹"] = "亨",
["脝"] = "亨",
["悙"] = "亨",
["哼"] = "亨",
["搄"] = "亙",
["縆"] = "亙",
["絙"] = "亙",
["亙"] = "亙",
["堩"] = "亙",
["恆"] = "亙",
["峘"] = "亙",
["弘"] = "弘",
["鞃"] = "弘",
["苰"] = "弘",
["泓"] = "弘",
["宖"] = "弘",
["紭"] = "弘",
["緱"] = "侯",
["侯"] = "侯",
["喉"] = "侯",
["猴"] = "侯",
["瘊"] = "侯",
["篌"] = "侯",
["糇"] = "侯",
["帿"] = "侯",
["睺"] = "侯",
["矦"] = "侯",
["餱"] = "侯",
["翭"] = "侯",
["葔"] = "侯",
["鄇"] = "侯",
["鍭"] = "侯",
["鯸"] = "侯",
["候"] = "侯",
["堠"] = "侯",
["垢"] = "后",
["詬"] = "后",
["茩"] = "后",
["姤"] = "后",
["銗"] = "后",
["骺"] = "后",
["后"] = "后",
["垕"] = "后",
["郈"] = "后",
["逅"] = "后",
["鲘"] = "后",
["缿"] = "后",
["罅"] = "乎",
["呼"] = "乎",
["軤"] = "乎",
["苸"] = "乎",
["嘑"] = "乎",
["歑"] = "乎",
["謼"] = "乎",
["滹"] = "乎",
["乎"] = "乎",
["虖"] = "乎",
["嫭"] = "乎",
["唬"] = "虍",
["戲"] = "虍",
["巇"] = "虍",
["隵"] = "虍",
["嚱"] = "虍",
["盧"] = "虍",
["鑪"] = "虍",
["壚"] = "虍",
["籚"] = "虍",
["蘆"] = "虍",
["顱"] = "虍",
["髗"] = "虍",
["鱸"] = "虍",
["攎"] = "虍",
["櫨"] = "虍",
["轤"] = "虍",
["黸"] = "虍",
["獹"] = "虍",
["鸕"] = "虍",
["艫"] = "虍",
["纑"] = "虍",
["瀘"] = "虍",
["瓐"] = "虍",
["爐"] = "虍",
["嚧"] = "虍",
["矑"] = "虍",
["罏"] = "虍",
["蠦"] = "虍",
["虜"] = "虍",
["擄"] = "虍",
["艣"] = "虍",
["鐪"] = "虍",
["虖"] = "虍",
["虍"] = "虍",
["雐"] = "虍",
["虎"] = "虍",
["琥"] = "虍",
["萀"] = "虍",
["臚"] = "虍",
["廬"] = "虍",
["驢"] = "虍",
["藘"] = "虍",
["爈"] = "虍",
["櫖"] = "虍",
["儢"] = "虍",
["慮"] = "虍",
["勴"] = "虍",
["鑢"] = "虍",
["濾"] = "虍",
["攄"] = "虍",
["處"] = "虍",
["豦"] = "虍",
["據"] = "虍",
["鐻"] = "虍",
["澽"] = "虍",
["虛"] = "虍",
["墟"] = "虍",
["懅"] = "虍",
["蘧"] = "虍",
["籧"] = "虍",
["醵"] = "虍",
["璩"] = "虍",
["虡"] = "虍",
["遽"] = "虍",
["勮"] = "虍",
["嘘"] = "虍",
["驉"] = "虍",
["歔"] = "虍",
["魖"] = "虍",
["膚"] = "虍",
["虧"] = "虍",
["噱"] = "虍",
["臄"] = "虍",
["劇"] = "虍",
["諕"] = "虍",
["魱"] = "互",
["互"] = "互",
["冱"] = "互",
["枑"] = "互",
["妒"] = "戸",
["雇"] = "戸",
["顧"] = "戸",
["戽"] = "戸",
["戶"] = "戸",
["扈"] = "戸",
["帍"] = "戸",
["昈"] = "戸",
["滬"] = "戸",
["簄"] = "戸",
["齭"] = "戸",
["所"] = "戸",
["鞾"] = "華",
["華"] = "華",
["譁"] = "華",
["樺"] = "華",
["嘩"] = "華",
["驊"] = "華",
["鏵"] = "華",
["崋"] = "華",
["訛"] = "化",
["吪"] = "化",
["鈋"] = "化",
["囮"] = "化",
["魤"] = "化",
["靴"] = "化",
["貨"] = "化",
["花"] = "化",
["化"] = "化",
["杹"] = "化",
["𠤎"] = "化",
["畫"] = "畫",
["澅"] = "畫",
["繣"] = "畫",
["劃"] = "畫",
["嫿"] = "畫",
["瓌"] = "褱",
["櫰"] = "褱",
["褱"] = "褱",
["懷"] = "褱",
["瀤"] = "褱",
["壞"] = "褱",
["蘾"] = "褱",
["寬"] = "萈",
["髖"] = "萈",
["萈"] = "萈",
["臗"] = "萈",
["渙"] = "奐",
["瘓"] = "奐",
["喚"] = "奐",
["煥"] = "奐",
["奐"] = "奐",
["寏"] = "奐",
["換"] = "奐",
["漶"] = "患",
["贃"] = "患",
["患"] = "患",
["槵"] = "患",
["僙"] = "黃",
["廣"] = "黃",
["鄺"] = "黃",
["懬"] = "黃",
["爌"] = "黃",
["曠"] = "黃",
["矌"] = "黃",
["壙"] = "黃",
["纊"] = "黃",
["黃"] = "黃",
["璜"] = "黃",
["潢"] = "黃",
["簧"] = "黃",
["癀"] = "黃",
["鱑"] = "黃",
["獚"] = "黃",
["蟥"] = "黃",
["趪"] = "黃",
["櫎"] = "黃",
["擴"] = "黃",
["瀇"] = "黃",
["獷"] = "黃",
["觵"] = "黃",
["礦"] = "黃",
["鑛"] = "黃",
["穬"] = "黃",
["橫"] = "黃",
["黌"] = "黃",
["鐄"] = "黃",
["嚝"] = "黃",
["彉"] = "黃",
["彍"] = "黃",
["脄"] = "灰",
["盔"] = "灰",
["詼"] = "灰",
["恢"] = "灰",
["灰"] = "灰",
["鬌"] = "隓",
["隋"] = "隓",
["墮"] = "隓",
["媠"] = "隓",
["橢"] = "隓",
["嫷"] = "隓",
["毻"] = "隓",
["堶"] = "隓",
["憜"] = "隓",
["惰"] = "隓",
["嶞"] = "隓",
["髓"] = "隓",
["瀡"] = "隓",
["隨"] = "隓",
["隓"] = "隓",
["隳"] = "隓",
["撱"] = "隓",
["回"] = "回",
["徊"] = "回",
["茴"] = "回",
["洄"] = "回",
["迴"] = "回",
["佪"] = "回",
["蛔"] = "回",
["毀"] = "毀",
["燬"] = "毀",
["檓"] = "毀",
["毇"] = "毀",
["譭"] = "毀",
["卉"] = "卉",
["芔"] = "卉",
["泋"] = "卉",
["櫘"] = "彗",
["彗"] = "彗",
["篲"] = "彗",
["鏏"] = "彗",
["槥"] = "彗",
["轊"] = "彗",
["熭"] = "彗",
["嘒"] = "彗",
["暳"] = "彗",
["嚖"] = "彗",
["慧"] = "彗",
["蔧"] = "彗",
["雪"] = "彗",
["韢"] = "惠",
["繐"] = "惠",
["憓"] = "惠",
["潓"] = "惠",
["惠"] = "惠",
["蟪"] = "惠",
["蕙"] = "惠",
["橞"] = "惠",
["譓"] = "惠",
["鏸"] = "惠",
["穗"] = "惠",
["譮"] = "會",
["會"] = "會",
["儈"] = "會",
["膾"] = "會",
["鱠"] = "會",
["襘"] = "會",
["禬"] = "會",
["檜"] = "會",
["旝"] = "會",
["澮"] = "會",
["鄶"] = "會",
["廥"] = "會",
["鬠"] = "會",
["劊"] = "會",
["獪"] = "會",
["繪"] = "會",
["懀"] = "會",
["薈"] = "會",
["嬒"] = "會",
["瞺"] = "會",
["噲"] = "會",
["璯"] = "會",
["鍲"] = "昏",
["抿"] = "昏",
["緡"] = "昏",
["捪"] = "昏",
["湣"] = "昏",
["昏"] = "昏",
["婚"] = "昏",
["閽"] = "昏",
["惛"] = "昏",
["棔"] = "昏",
["殙"] = "昏",
["溷"] = "圂",
["慁"] = "圂",
["圂"] = "圂",
["火"] = "火",
["邩"] = "火",
["伙"] = "火",
["幗"] = "或",
["慖"] = "或",
["簂"] = "或",
["蔮"] = "或",
["國"] = "或",
["或"] = "或",
["惑"] = "或",
["蜮"] = "或",
["閾"] = "或",
["緎"] = "或",
["淢"] = "或",
["域"] = "或",
["罭"] = "或",
["棫"] = "或",
["琙"] = "或",
["魊"] = "或",
["馘"] = "或",
["聝"] = "或",
["膕"] = "或",
["摑"] = "或",
["漍"] = "或",
["嘓"] = "或",
["蟈"] = "或",
["掝"] = "或",
["彧"] = "或",
["稶"] = "或",
["檴"] = "蒦",
["鱯"] = "蒦",
["護"] = "蒦",
["頀"] = "蒦",
["濩"] = "蒦",
["韄"] = "蒦",
["擭"] = "蒦",
["瓁"] = "蒦",
["劐"] = "蒦",
["穫"] = "蒦",
["鑊"] = "蒦",
["矆"] = "蒦",
["鸌"] = "蒦",
["雘"] = "蒦",
["蠖"] = "蒦",
["臒"] = "蒦",
["嬳"] = "蒦",
["彠"] = "蒦",
["嚄"] = "蒦",
["獲"] = "蒦",
["靃"] = "霍",
["臛"] = "霍",
["籗"] = "霍",
["霍"] = "霍",
["藿"] = "霍",
["攉"] = "霍",
["矐"] = "霍",
["瀖"] = "霍",
["癨"] = "霍",
["繫"] = "毄",
["檕"] = "毄",
["轚"] = "毄",
["蘻"] = "毄",
["罊"] = "毄",
["蟿"] = "毄",
["礊"] = "毄",
["擊"] = "毄",
["墼"] = "毄",
["趿"] = "及",
["鈒"] = "及",
["靸"] = "及",
["馺"] = "及",
["砐"] = "及",
["魥"] = "及",
["扱"] = "及",
["笈"] = "及",
["衱"] = "及",
["极"] = "及",
["昅"] = "及",
["雭"] = "及",
["急"] = "及",
["級"] = "及",
["汲"] = "及",
["芨"] = "及",
["伋"] = "及",
["彶"] = "及",
["及"] = "及",
["岌"] = "及",
["吸"] = "及",
["秸"] = "吉",
["髻"] = "吉",
["夡"] = "吉",
["鴶"] = "吉",
["袺"] = "吉",
["頡"] = "吉",
["劼"] = "吉",
["硈"] = "吉",
["咭"] = "吉",
["黠"] = "吉",
["聐"] = "吉",
["趌"] = "吉",
["結"] = "吉",
["拮"] = "吉",
["桔"] = "吉",
["狤"] = "吉",
["擷"] = "吉",
["襭"] = "吉",
["翓"] = "吉",
["纈"] = "吉",
["吉"] = "吉",
["郆"] = "吉",
["詰"] = "吉",
["蛣"] = "吉",
["佶"] = "吉",
["鮚"] = "吉",
["姞"] = "吉",
["欯"] = "吉",
["恄"] = "吉",
["卪"] = "即",
["癤"] = "即",
["幯"] = "即",
["節"] = "即",
["蝍"] = "即",
["蠞"] = "即",
["堲"] = "即",
["唧"] = "即",
["楖"] = "即",
["揤"] = "即",
["櫛"] = "即",
["瀄"] = "即",
["擳"] = "即",
["即"] = "即",
["鯽"] = "即",
["亟"] = "茍",
["茍"] = "茍",
["殛"] = "茍",
["極"] = "茍",
["嫉"] = "疾",
["疾"] = "疾",
["蒺"] = "疾",
["愱"] = "疾",
["槉"] = "疾",
["棘"] = "棘",
["襋"] = "棘",
["蕀"] = "棘",
["雜"] = "集",
["磼"] = "集",
["囃"] = "集",
["鏶"] = "集",
["穕"] = "集",
["潗"] = "集",
["集"] = "集",
["肌"] = "几",
["飢"] = "几",
["机"] = "几",
["虮"] = "几",
["几"] = "几",
["麂"] = "几",
["改"] = "己",
["跽"] = "己",
["己"] = "己",
["紀"] = "己",
["妀"] = "己",
["記"] = "己",
["杞"] = "己",
["屺"] = "己",
["芑"] = "己",
["邔"] = "己",
["玘"] = "己",
["忌"] = "己",
["鵋"] = "己",
["誋"] = "己",
["梞"] = "己",
["丮"] = "丮",
["谻"] = "丮",
["脊"] = "脊",
["蹐"] = "脊",
["鶺"] = "脊",
["塉"] = "脊",
["瘠"] = "脊",
["膌"] = "脊",
["機"] = "幾",
["譏"] = "幾",
["嘰"] = "幾",
["磯"] = "幾",
["鞿"] = "幾",
["饑"] = "幾",
["禨"] = "幾",
["幾"] = "幾",
["鐖"] = "幾",
["僟"] = "幾",
["璣"] = "幾",
["蟣"] = "幾",
["穖"] = "幾",
["畿"] = "幾",
["戟"] = "戟",
["撠"] = "戟",
["溉"] = "旡",
["槩"] = "旡",
["概"] = "旡",
["摡"] = "旡",
["慨"] = "旡",
["嘅"] = "旡",
["穊"] = "旡",
["暨"] = "旡",
["鱀"] = "旡",
["塈"] = "旡",
["既"] = "旡",
["旡"] = "旡",
["蔇"] = "旡",
["炁"] = "旡",
["櫭"] = "旡",
["曁"] = "旡",
["季"] = "季",
["悸"] = "季",
["痵"] = "季",
["蔡"] = "祭",
["瘵"] = "祭",
["祭"] = "祭",
["際"] = "祭",
["穄"] = "祭",
["鰶"] = "祭",
["傺"] = "祭",
["摖"] = "祭",
["擦"] = "祭",
["攃"] = "祭",
["礤"] = "祭",
["察"] = "祭",
["詧"] = "祭",
["冀"] = "冀",
["驥"] = "冀",
["懻"] = "冀",
["罽"] = "罽",
["瀱"] = "罽",
["蘮"] = "罽",
["繼"] = "繼",
["檵"] = "繼",
["妿"] = "加",
["賀"] = "加",
["迦"] = "加",
["茄"] = "加",
["伽"] = "加",
["枷"] = "加",
["嘉"] = "加",
["加"] = "加",
["笳"] = "加",
["痂"] = "加",
["袈"] = "加",
["跏"] = "加",
["珈"] = "加",
["鴐"] = "加",
["架"] = "加",
["駕"] = "加",
["瘸"] = "加",
["瘞"] = "夾",
["瘱"] = "夾",
["脥"] = "夾",
["浹"] = "夾",
["挾"] = "夾",
["夾"] = "夾",
["郟"] = "夾",
["筴"] = "夾",
["裌"] = "夾",
["鵊"] = "夾",
["狹"] = "夾",
["峽"] = "夾",
["硤"] = "夾",
["陜"] = "夾",
["陿"] = "夾",
["翜"] = "夾",
["梜"] = "夾",
["頰"] = "夾",
["莢"] = "夾",
["鋏"] = "夾",
["蛺"] = "夾",
["唊"] = "夾",
["悏"] = "夾",
["匧"] = "夾",
["愜"] = "夾",
["篋"] = "夾",
["俠"] = "夾",
["綊"] = "夾",
["家"] = "家",
["傢"] = "家",
["幏"] = "家",
["稼"] = "家",
["嫁"] = "家",
["戛"] = "戛",
["嘎"] = "戛",
["笚"] = "甲",
["閘"] = "甲",
["鉀"] = "甲",
["甲"] = "甲",
["胛"] = "甲",
["岬"] = "甲",
["押"] = "甲",
["玾"] = "甲",
["呷"] = "甲",
["匣"] = "甲",
["狎"] = "甲",
["柙"] = "甲",
["翈"] = "甲",
["炠"] = "甲",
["鴨"] = "甲",
["庘"] = "甲",
["葭"] = "叚",
["麚"] = "叚",
["瘕"] = "叚",
["豭"] = "叚",
["貑"] = "叚",
["猳"] = "叚",
["犌"] = "叚",
["假"] = "叚",
["嘏"] = "叚",
["婽"] = "叚",
["椵"] = "叚",
["叚"] = "叚",
["蝦"] = "叚",
["煆"] = "叚",
["霞"] = "叚",
["遐"] = "叚",
["瑕"] = "叚",
["鰕"] = "叚",
["碬"] = "叚",
["蕸"] = "叚",
["赮"] = "叚",
["鍜"] = "叚",
["騢"] = "叚",
["暇"] = "叚",
["殘"] = "戔",
["戔"] = "戔",
["帴"] = "戔",
["虥"] = "戔",
["盞"] = "戔",
["醆"] = "戔",
["琖"] = "戔",
["剗"] = "戔",
["棧"] = "戔",
["輚"] = "戔",
["嶘"] = "戔",
["錢"] = "戔",
["俴"] = "戔",
["籛"] = "戔",
["淺"] = "戔",
["濺"] = "戔",
["踐"] = "戔",
["諓"] = "戔",
["餞"] = "戔",
["賤"] = "戔",
["綫"] = "戔",
["箋"] = "戔",
["牋"] = "戔",
["顅"] = "肩",
["掮"] = "肩",
["肩"] = "肩",
["猏"] = "肩",
["菺"] = "肩",
["鵳"] = "肩",
["姦"] = "姦",
["葌"] = "姦",
["譧"] = "兼",
["賺"] = "兼",
["尲"] = "兼",
["鹻"] = "兼",
["歉"] = "兼",
["槏"] = "兼",
["鰜"] = "兼",
["稴"] = "兼",
["豏"] = "兼",
["甉"] = "兼",
["廉"] = "兼",
["鎌"] = "兼",
["鬑"] = "兼",
["鐮"] = "兼",
["簾"] = "兼",
["薕"] = "兼",
["蠊"] = "兼",
["嬚"] = "兼",
["溓"] = "兼",
["嵰"] = "兼",
["隒"] = "兼",
["熑"] = "兼",
["濂"] = "兼",
["燫"] = "兼",
["兼"] = "兼",
["縑"] = "兼",
["鶼"] = "兼",
["蒹"] = "兼",
["搛"] = "兼",
["謙"] = "兼",
["膁"] = "兼",
["嗛"] = "兼",
["慊"] = "兼",
["傔"] = "兼",
["馦"] = "兼",
["嫌"] = "兼",
["鼸"] = "兼",
["尷"] = "兼",
["藍"] = "監",
["襤"] = "監",
["籃"] = "監",
["懢"] = "監",
["儖"] = "監",
["蘫"] = "監",
["攬"] = "監",
["欖"] = "監",
["覽"] = "監",
["爁"] = "監",
["擥"] = "監",
["灠"] = "監",
["濫"] = "監",
["嚂"] = "監",
["纜"] = "監",
["監"] = "監",
["礛"] = "監",
["鑑"] = "監",
["艦"] = "監",
["檻"] = "監",
["壏"] = "監",
["轞"] = "監",
["鹽"] = "監",
["蘭"] = "柬",
["攔"] = "柬",
["欄"] = "柬",
["瀾"] = "柬",
["讕"] = "柬",
["闌"] = "柬",
["韊"] = "柬",
["幱"] = "柬",
["籣"] = "柬",
["躝"] = "柬",
["爛"] = "柬",
["爤"] = "柬",
["鑭"] = "柬",
["糷"] = "柬",
["斕"] = "柬",
["揀"] = "柬",
["柬"] = "柬",
["暕"] = "柬",
["諫"] = "柬",
["練"] = "柬",
["鍊"] = "柬",
["煉"] = "柬",
["楝"] = "柬",
["萰"] = "柬",
["堜"] = "柬",
["湅"] = "柬",
["襺"] = "繭",
["繭"] = "繭",
["蠒"] = "繭",
["笄"] = "幵",
["枅"] = "幵",
["蚈"] = "幵",
["羿"] = "幵",
["栞"] = "幵",
["雃"] = "幵",
["詽"] = "幵",
["揅"] = "幵",
["幵"] = "幵",
["鳽"] = "幵",
["豣"] = "幵",
["麉"] = "幵",
["趼"] = "幵",
["汧"] = "幵",
["岍"] = "幵",
["研"] = "幵",
["妍"] = "幵",
["訮"] = "幵",
["鈃"] = "幵",
["涀"] = "見",
["莧"] = "見",
["粯"] = "見",
["晛"] = "見",
["筧"] = "見",
["絸"] = "見",
["垷"] = "見",
["挸"] = "見",
["見"] = "見",
["俔"] = "見",
["蜆"] = "見",
["硯"] = "見",
["峴"] = "見",
["哯"] = "見",
["睍"] = "見",
["現"] = "見",
["犍"] = "建",
["騝"] = "建",
["鍵"] = "建",
["揵"] = "建",
["鞬"] = "建",
["腱"] = "建",
["湕"] = "建",
["建"] = "建",
["旔"] = "建",
["楗"] = "建",
["健"] = "建",
["間"] = "閒",
["簡"] = "閒",
["澗"] = "閒",
["鐧"] = "閒",
["蕑"] = "閒",
["覵"] = "閒",
["襉"] = "閒",
["僩"] = "閒",
["鬜"] = "閒",
["癇"] = "閒",
["瞯"] = "閒",
["憪"] = "閒",
["橌"] = "閒",
["撊"] = "閒",
["瀳"] = "薦",
["韉"] = "薦",
["薦"] = "薦",
["畺"] = "畺",
["畕"] = "畺",
["礓"] = "畺",
["繮"] = "畺",
["韁"] = "畺",
["橿"] = "畺",
["薑"] = "畺",
["疆"] = "畺",
["壃"] = "畺",
["僵"] = "畺",
["彊"] = "畺",
["麠"] = "畺",
["贛"] = "夅",
["灨"] = "夅",
["竷"] = "夅",
["戇"] = "夅",
["洚"] = "夅",
["降"] = "夅",
["絳"] = "夅",
["栙"] = "夅",
["夅"] = "夅",
["跭"] = "夅",
["隆"] = "夅",
["癃"] = "夅",
["窿"] = "夅",
["霳"] = "夅",
["烄"] = "交",
["礮"] = "交",
["交"] = "交",
["郊"] = "交",
["茭"] = "交",
["蛟"] = "交",
["鮫"] = "交",
["鵁"] = "交",
["咬"] = "交",
["鉸"] = "交",
["佼"] = "交",
["詨"] = "交",
["絞"] = "交",
["狡"] = "交",
["姣"] = "交",
["筊"] = "交",
["校"] = "交",
["珓"] = "交",
["跤"] = "交",
["頝"] = "交",
["骹"] = "交",
["齩"] = "交",
["洨"] = "交",
["胶"] = "交",
["效"] = "交",
["効"] = "交",
["傚"] = "交",
["皎"] = "交",
["恔"] = "交",
["晈"] = "交",
["窔"] = "交",
["駮"] = "交",
["癄"] = "焦",
["焦"] = "焦",
["蕉"] = "焦",
["鷦"] = "焦",
["僬"] = "焦",
["噍"] = "焦",
["膲"] = "焦",
["鐎"] = "焦",
["蟭"] = "焦",
["燋"] = "焦",
["醮"] = "焦",
["潐"] = "焦",
["趭"] = "焦",
["樵"] = "焦",
["譙"] = "焦",
["憔"] = "焦",
["劁"] = "焦",
["顦"] = "焦",
["嶕"] = "焦",
["撨"] = "焦",
["穛"] = "焦",
["捔"] = "角",
["桷"] = "角",
["角"] = "角",
["埆"] = "角",
["确"] = "角",
["斛"] = "角",
["槲"] = "角",
["蔛"] = "角",
["礉"] = "敫",
["邀"] = "敫",
["憿"] = "敫",
["徼"] = "敫",
["儌"] = "敫",
["璬"] = "敫",
["皦"] = "敫",
["繳"] = "敫",
["敫"] = "敫",
["譥"] = "敫",
["激"] = "敫",
["噭"] = "敫",
["獥"] = "敫",
["鸄"] = "敫",
["墽"] = "敫",
["竅"] = "敫",
["覈"] = "敫",
["燩"] = "敫",
["檄"] = "敫",
["薂"] = "敫",
["皆"] = "皆",
["偕"] = "皆",
["階"] = "皆",
["喈"] = "皆",
["稭"] = "皆",
["堦"] = "皆",
["楷"] = "皆",
["鶛"] = "皆",
["湝"] = "皆",
["蝔"] = "皆",
["鍇"] = "皆",
["揩"] = "皆",
["諧"] = "皆",
["瑎"] = "皆",
["龤"] = "皆",
["孑"] = "孑",
["𨥂"] = "孑",
["劫"] = "劫",
["蜐"] = "劫",
["疀"] = "疌",
["萐"] = "疌",
["箑"] = "疌",
["啑"] = "疌",
["睫"] = "疌",
["婕"] = "疌",
["緁"] = "疌",
["捷"] = "疌",
["疌"] = "疌",
["寁"] = "疌",
["倢"] = "疌",
["崨"] = "疌",
["踕"] = "疌",
["誱"] = "疌",
["徢"] = "疌",
["蜨"] = "疌",
["桀"] = "桀",
["傑"] = "桀",
["榤"] = "桀",
["嵥"] = "桀",
["滐"] = "桀",
["搩"] = "桀",
["謋"] = "桀",
["巀"] = "截",
["截"] = "截",
["蠽"] = "截",
["薢"] = "解",
["解"] = "解",
["檞"] = "解",
["懈"] = "解",
["繲"] = "解",
["廨"] = "解",
["蟹"] = "解",
["獬"] = "解",
["澥"] = "解",
["嶰"] = "解",
["邂"] = "解",
["夆"] = "丯",
["丯"] = "丯",
["瘛"] = "丯",
["觢"] = "丯",
["契"] = "丯",
["栔"] = "丯",
["禊"] = "丯",
["稧"] = "丯",
["楔"] = "丯",
["葜"] = "丯",
["猰"] = "丯",
["窫"] = "丯",
["揳"] = "丯",
["偰"] = "丯",
["潔"] = "丯",
["絜"] = "丯",
["鍥"] = "丯",
["挈"] = "丯",
["蛪"] = "丯",
["齧"] = "丯",
["褉"] = "丯",
["喫"] = "丯",
["妎"] = "介",
["芥"] = "介",
["尬"] = "介",
["界"] = "介",
["介"] = "介",
["疥"] = "介",
["玠"] = "介",
["砎"] = "介",
["魪"] = "介",
["价"] = "介",
["衸"] = "介",
["齘"] = "介",
["骱"] = "介",
["扴"] = "介",
["圿"] = "介",
["忦"] = "介",
["祴"] = "戒",
["駴"] = "戒",
["戒"] = "戒",
["誡"] = "戒",
["悈"] = "戒",
["械"] = "戒",
["裓"] = "戒",
["巾"] = "巾",
["帘"] = "巾",
["貪"] = "今",
["嗿"] = "今",
["僋"] = "今",
["酓"] = "今",
["馠"] = "今",
["谽"] = "今",
["唅"] = "今",
["含"] = "今",
["肣"] = "今",
["頷"] = "今",
["筨"] = "今",
["梒"] = "今",
["鋡"] = "今",
["莟"] = "今",
["琀"] = "今",
["浛"] = "今",
["盦"] = "今",
["韽"] = "今",
["玪"] = "今",
["妗"] = "今",
["欦"] = "今",
["黔"] = "今",
["鈐"] = "今",
["鳹"] = "今",
["雂"] = "今",
["念"] = "今",
["梣"] = "今",
["枔"] = "今",
["岑"] = "今",
["笒"] = "今",
["涔"] = "今",
["侺"] = "今",
["今"] = "今",
["黅"] = "今",
["衿"] = "今",
["衾"] = "今",
["坅"] = "今",
["搇"] = "今",
["琴"] = "今",
["禽"] = "今",
["芩"] = "今",
["庈"] = "今",
["耹"] = "今",
["靲"] = "今",
["擒"] = "今",
["檎"] = "今",
["紟"] = "今",
["吟"] = "今",
["訡"] = "今",
["廞"] = "今",
["陰"] = "今",
["霠"] = "今",
["𩃬"] = "今",
["飲"] = "今",
["蔭"] = "今",
["廕"] = "今",
["矜"] = "今",
["蘄"] = "斤",
["祈"] = "斤",
["頎"] = "斤",
["旂"] = "斤",
["圻"] = "斤",
["蚚"] = "斤",
["岓"] = "斤",
["玂"] = "斤",
["沂"] = "斤",
["掀"] = "斤",
["釿"] = "斤",
["齗"] = "斤",
["听"] = "斤",
["垽"] = "斤",
["斤"] = "斤",
["菦"] = "斤",
["靳"] = "斤",
["劤"] = "斤",
["勁"] = "斤",
["赾"] = "斤",
["芹"] = "斤",
["近"] = "斤",
["斦"] = "斤",
["欣"] = "斤",
["忻"] = "斤",
["昕"] = "斤",
["訢"] = "斤",
["炘"] = "斤",
["邤"] = "斤",
["庍"] = "斤",
["焮"] = "斤",
["淦"] = "金",
["顉"] = "金",
["金"] = "金",
["錦"] = "金",
["欽"] = "金",
["菳"] = "金",
["嶔"] = "金",
["撳"] = "金",
["捦"] = "金",
["鵭"] = "金",
["唫"] = "金",
["鈙"] = "金",
["崟"] = "金",
["趛"] = "金",
["簪"] = "兓",
["撍"] = "兓",
["鐕"] = "兓",
["憯"] = "兓",
["噆"] = "兓",
["朁"] = "兓",
["蠶"] = "兓",
["蚕"] = "兓",
["糣"] = "兓",
["熸"] = "兓",
["鬵"] = "兓",
["灊"] = "兓",
["潛"] = "兓",
["僭"] = "兓",
["兓"] = "兓",
["嶜"] = "兓",
["兂"] = "兓",
["譖"] = "兓",
["葏"] = "津",
["津"] = "津",
["囏"] = "堇",
["螼"] = "堇",
["堇"] = "堇",
["墐"] = "堇",
["𥎊"] = "堇",
["僅"] = "堇",
["瑾"] = "堇",
["覲"] = "堇",
["殣"] = "堇",
["饉"] = "堇",
["廑"] = "堇",
["瘽"] = "堇",
["歏"] = "堇",
["鄞"] = "堇",
["謹"] = "堇",
["槿"] = "堇",
["漌"] = "堇",
["慬"] = "堇",
["勤"] = "堇",
["懃"] = "堇",
["懄"] = "堇",
["濜"] = "盡",
["盡"] = "盡",
["賮"] = "盡",
["燼"] = "盡",
["藎"] = "盡",
["壗"] = "盡",
["璶"] = "盡",
["鄑"] = "晉",
["戩"] = "晉",
["榗"] = "晉",
["晉"] = "晉",
["縉"] = "晉",
["搢"] = "晉",
["瑨"] = "晉",
["璡"] = "進",
["進"] = "進",
["羥"] = "坙",
["俓"] = "坙",
["牼"] = "坙",
["硁"] = "坙",
["誙"] = "坙",
["娙"] = "坙",
["莖"] = "坙",
["痙"] = "坙",
["葝"] = "巠",
["頸"] = "巠",
["勁"] = "巠",
["鑋"] = "巠",
["輕"] = "巠",
["涇"] = "巠",
["經"] = "巠",
["鵛"] = "巠",
["巠"] = "巠",
["剄"] = "巠",
["烴"] = "巠",
["徑"] = "巠",
["逕"] = "巠",
["桱"] = "巠",
["蛵"] = "巠",
["陘"] = "巠",
["鋞"] = "巠",
["脛"] = "巠",
["踁"] = "巠",
["涼"] = "京",
["凉"] = "京",
["椋"] = "京",
["綡"] = "京",
["輬"] = "京",
["諒"] = "京",
["掠"] = "京",
["弶"] = "京",
["京"] = "京",
["麖"] = "京",
["鶁"] = "京",
["景"] = "京",
["鯨"] = "京",
["黥"] = "京",
["勍"] = "京",
["剠"] = "京",
["倞"] = "京",
["影"] = "京",
["璟"] = "京",
["憬"] = "京",
["暻"] = "京",
["澋"] = "京",
["兢"] = "兢",
["殑"] = "兢",
["硎"] = "井",
["耕"] = "井",
["荊"] = "井",
["井"] = "井",
["丼"] = "井",
["妌"] = "井",
["穽"] = "井",
["阱"] = "井",
["汫"] = "井",
["刑"] = "井",
["形"] = "井",
["邢"] = "井",
["鉶"] = "井",
["型"] = "井",
["侀"] = "井",
["滰"] = "竟",
["境"] = "竟",
["竟"] = "竟",
["鏡"] = "竟",
["獍"] = "竟",
["樈"] = "竟",
["璄"] = "竟",
["摬"] = "竟",
["蟼"] = "敬",
["憼"] = "敬",
["驚"] = "敬",
["警"] = "敬",
["儆"] = "敬",
["璥"] = "敬",
["檠"] = "敬",
["敬"] = "敬",
["擎"] = "敬",
["曔"] = "敬",
["誩"] = "誩",
["競"] = "誩",
["苘"] = "冋",
["詗"] = "冋",
["駉"] = "冋",
["坰"] = "冋",
["冋"] = "冋",
["絅"] = "冋",
["扃"] = "冋",
["炯"] = "冋",
["迥"] = "冋",
["泂"] = "冋",
["臩"] = "臦",
["臦"] = "臦",
["艽"] = "丩",
["芁"] = "丩",
["荍"] = "丩",
["叫"] = "丩",
["訆"] = "丩",
["嘂"] = "丩",
["收"] = "丩",
["糾"] = "丩",
["朻"] = "丩",
["丩"] = "丩",
["赳"] = "丩",
["虬"] = "丩",
["虯"] = "丩",
["觓"] = "丩",
["尻"] = "九",
["訄"] = "九",
["艽"] = "九",
["虓"] = "九",
["鳩"] = "九",
["勼"] = "九",
["九"] = "九",
["究"] = "九",
["仇"] = "九",
["鼽"] = "九",
["犰"] = "九",
["叴"] = "九",
["厹"] = "九",
["頄"] = "九",
["朹"] = "九",
["馗"] = "九",
["扏"] = "九",
["訅"] = "九",
["釚"] = "九",
["肍"] = "九",
["軌"] = "九",
["宄"] = "九",
["氿"] = "九",
["匭"] = "九",
["泦"] = "九",
["旭"] = "九",
["畂"] = "久",
["久"] = "久",
["灸"] = "久",
["玖"] = "久",
["疚"] = "久",
["柩"] = "久",
["羑"] = "久",
["臼"] = "臼",
["齨"] = "臼",
["桕"] = "臼",
["舅"] = "臼",
["舊"] = "臼",
["匶"] = "臼",
["閰"] = "臼",
["咎"] = "咎",
["鼛"] = "咎",
["櫜"] = "咎",
["倃"] = "咎",
["綹"] = "咎",
["麔"] = "咎",
["晷"] = "咎",
["厬"] = "咎",
["僦"] = "就",
["就"] = "就",
["鷲"] = "就",
["殧"] = "就",
["噈"] = "就",
["蹴"] = "就",
["廄"] = "廄",
["匓"] = "廄",
["菊"] = "匊",
["鞠"] = "匊",
["掬"] = "匊",
["匊"] = "匊",
["鵴"] = "匊",
["椈"] = "匊",
["諊"] = "匊",
["踘"] = "匊",
["趜"] = "匊",
["蘜"] = "匊",
["鞫"] = "匊",
["巈"] = "匊",
["麴"] = "匊",
["毱"] = "匊",
["驧"] = "匊",
["鋦"] = "局",
["挶"] = "局",
["梮"] = "局",
["局"] = "局",
["跼"] = "局",
["侷"] = "局",
["瞁"] = "狊",
["湨"] = "狊",
["郹"] = "狊",
["狊"] = "狊",
["鶪"] = "狊",
["鼳"] = "狊",
["犑"] = "狊",
["闃"] = "狊",
["柜"] = "巨",
["渠"] = "巨",
["磲"] = "巨",
["蕖"] = "巨",
["蟝"] = "巨",
["璖"] = "巨",
["巨"] = "巨",
["距"] = "巨",
["拒"] = "巨",
["苣"] = "巨",
["炬"] = "巨",
["詎"] = "巨",
["鉅"] = "巨",
["秬"] = "巨",
["粔"] = "巨",
["駏"] = "巨",
["歫"] = "巨",
["矩"] = "巨",
["榘"] = "巨",
["勾"] = "句",
["鉤"] = "句",
["鴝"] = "句",
["句"] = "句",
["夠"] = "句",
["枸"] = "句",
["軥"] = "句",
["狗"] = "句",
["苟"] = "句",
["岣"] = "句",
["笱"] = "句",
["玽"] = "句",
["耇"] = "句",
["豿"] = "句",
["敂"] = "句",
["怐"] = "句",
["雊"] = "句",
["竘"] = "句",
["齁"] = "句",
["呴"] = "句",
["蚼"] = "句",
["豞"] = "句",
["訽"] = "句",
["佝"] = "句",
["拘"] = "句",
["駒"] = "句",
["眗"] = "句",
["跔"] = "句",
["鮈"] = "句",
["痀"] = "句",
["蒟"] = "句",
["絇"] = "句",
["邭"] = "句",
["劬"] = "句",
["朐"] = "句",
["鼩"] = "句",
["斪"] = "句",
["翑"] = "句",
["葋"] = "句",
["姁"] = "句",
["欨"] = "句",
["喣"] = "句",
["煦"] = "句",
["昫"] = "句",
["俱"] = "具",
["椇"] = "具",
["具"] = "具",
["埧"] = "具",
["颶"] = "具",
["瞿"] = "瞿",
["衢"] = "瞿",
["氍"] = "瞿",
["癯"] = "瞿",
["蠷"] = "瞿",
["臞"] = "瞿",
["欋"] = "瞿",
["鸜"] = "瞿",
["灈"] = "瞿",
["躣"] = "瞿",
["忂"] = "瞿",
["戵"] = "瞿",
["鑺"] = "瞿",
["懼"] = "瞿",
["潫"] = "龹",
["豢"] = "龹",
["勬"] = "龹",
["韏"] = "龹",
["眷"] = "龹",
["桊"] = "龹",
["絭"] = "龹",
["觠"] = "龹",
["飬"] = "龹",
["弮"] = "龹",
["拳"] = "龹",
["卷"] = "龹",
["齤"] = "龹",
["券"] = "龹",
["腃"] = "卷",
["卷"] = "卷",
["菤"] = "卷",
["捲"] = "卷",
["埢"] = "卷",
["睠"] = "卷",
["弮"] = "卷",
["犈"] = "卷",
["棬"] = "卷",
["鬈"] = "卷",
["圈"] = "卷",
["蜷"] = "卷",
["踡"] = "卷",
["婘"] = "卷",
["蔨"] = "卷",
["倦"] = "卷",
["淃"] = "卷",
["綣"] = "卷",
["裷"] = "卷",
["隽"] = "雋",
["檇"] = "雋",
["臇"] = "雋",
["嶲"] = "雋",
["鐫"] = "雋",
["雋"] = "雋",
["儁"] = "雋",
["寯"] = "雋",
["鱖"] = "欮",
["蹶"] = "欮",
["厥"] = "欮",
["欮"] = "欮",
["蕨"] = "欮",
["劂"] = "欮",
["瘚"] = "欮",
["蟨"] = "欮",
["蟩"] = "欮",
["橜"] = "欮",
["撅"] = "欮",
["闕"] = "欮",
["橛"] = "欮",
["鷢"] = "欮",
["蹷"] = "欮",
["憠"] = "欮",
["蕝"] = "絕",
["脃"] = "絕",
["脆"] = "絕",
["絕"] = "絕",
["釂"] = "爵",
["皭"] = "爵",
["爝"] = "爵",
["爵"] = "爵",
["嚼"] = "爵",
["穱"] = "爵",
["灂"] = "爵",
["钁"] = "矍",
["攫"] = "矍",
["矍"] = "矍",
["躩"] = "矍",
["玃"] = "矍",
["貜"] = "矍",
["彏"] = "矍",
["戄"] = "矍",
["籰"] = "矍",
["涒"] = "君",
["麏"] = "君",
["莙"] = "君",
["輑"] = "君",
["蜠"] = "君",
["峮"] = "君",
["窘"] = "君",
["僒"] = "君",
["君"] = "君",
["桾"] = "君",
["宭"] = "君",
["鮶"] = "君",
["捃"] = "君",
["群"] = "君",
["羣"] = "君",
["裙"] = "君",
["裠"] = "君",
["帬"] = "君",
["焄"] = "君",
["郡"] = "君",
["揮"] = "軍",
["輝"] = "軍",
["翬"] = "軍",
["暉"] = "軍",
["煇"] = "軍",
["楎"] = "軍",
["瀈"] = "軍",
["韗"] = "軍",
["褌"] = "軍",
["鶤"] = "軍",
["緷"] = "軍",
["睴"] = "軍",
["璭"] = "軍",
["瘒"] = "軍",
["顐"] = "軍",
["諢"] = "軍",
["餫"] = "軍",
["渾"] = "軍",
["琿"] = "軍",
["鼲"] = "軍",
["堚"] = "軍",
["鯶"] = "軍",
["軍"] = "軍",
["皸"] = "軍",
["齳"] = "軍",
["喗"] = "軍",
["葷"] = "軍",
["惲"] = "軍",
["賱"] = "軍",
["運"] = "軍",
["暈"] = "軍",
["鄆"] = "軍",
["諐"] = "侃",
["侃"] = "侃",
["偘"] = "侃",
["笐"] = "亢",
["亢"] = "亢",
["牨"] = "亢",
["苀"] = "亢",
["魧"] = "亢",
["迒"] = "亢",
["邟"] = "亢",
["忼"] = "亢",
["骯"] = "亢",
["抗"] = "亢",
["炕"] = "亢",
["伉"] = "亢",
["閌"] = "亢",
["犺"] = "亢",
["蚢"] = "亢",
["砊"] = "亢",
["阬"] = "亢",
["頏"] = "亢",
["航"] = "亢",
["杭"] = "亢",
["沆"] = "亢",
["肮"] = "亢",
["吭"] = "亢",
["秔"] = "亢",
["坑"] = "亢",
["劥"] = "亢",
["丂"] = "丂",
["攷"] = "丂",
["考"] = "丂",
["烤"] = "丂",
["拷"] = "丂",
["栲"] = "丂",
["洘"] = "丂",
["銬"] = "丂",
["巧"] = "丂",
["朽"] = "丂",
["彀"] = "殻",
["鷇"] = "殻",
["瞉"] = "殻",
["豰"] = "殻",
["瑴"] = "殻",
["愨"] = "殻",
["殼"] = "殻",
["觳"] = "殻",
["嗀"] = "殻",
["穀"] = "殻",
["糓"] = "殻",
["轂"] = "殻",
["榖"] = "殻",
["瀔"] = "殻",
["縠"] = "殻",
["砢"] = "可",
["柯"] = "可",
["菏"] = "可",
["牁"] = "可",
["滒"] = "可",
["哥"] = "可",
["歌"] = "可",
["謌"] = "可",
["鴚"] = "可",
["哿"] = "可",
["舸"] = "可",
["笴"] = "可",
["軻"] = "可",
["珂"] = "可",
["可"] = "可",
["岢"] = "可",
["坷"] = "可",
["蚵"] = "可",
["呵"] = "可",
["訶"] = "可",
["抲"] = "可",
["荷"] = "可",
["何"] = "可",
["河"] = "可",
["苛"] = "可",
["魺"] = "可",
["袔"] = "可",
["阿"] = "可",
["妸"] = "可",
["疴"] = "可",
["鈳"] = "可",
["娿"] = "可",
["痾"] = "可",
["跒"] = "可",
["閜"] = "可",
["克"] = "克",
["剋"] = "克",
["勊"] = "克",
["肯"] = "肯",
["肎"] = "肯",
["吼"] = "孔",
["孔"] = "孔",
["口"] = "口",
["叩"] = "口",
["扣"] = "口",
["釦"] = "口",
["筘"] = "口",
["滱"] = "寇",
["寇"] = "寇",
["簆"] = "寇",
["蔻"] = "寇",
["怪"] = "圣",
["恠"] = "圣",
["圣"] = "圣",
["凷"] = "凷",
["屆"] = "凷",
["款"] = "款",
["欵"] = "款",
["歀"] = "款",
["窾"] = "款",
["夔"] = "夔",
["犪"] = "夔",
["躨"] = "夔",
["昆"] = "昆",
["琨"] = "昆",
["鯤"] = "昆",
["菎"] = "昆",
["崐"] = "昆",
["蜫"] = "昆",
["惃"] = "昆",
["錕"] = "昆",
["猑"] = "昆",
["騉"] = "昆",
["緄"] = "昆",
["輥"] = "昆",
["棍"] = "昆",
["餛"] = "昆",
["混"] = "昆",
["焜"] = "昆",
["倱"] = "昆",
["掍"] = "昆",
["箟"] = "昆",
["硱"] = "困",
["梱"] = "困",
["捆"] = "困",
["綑"] = "困",
["閫"] = "困",
["悃"] = "困",
["稛"] = "困",
["裍"] = "困",
["齫"] = "困",
["困"] = "困",
["涃"] = "困",
["咶"] = "桰",
["話"] = "桰",
["刮"] = "桰",
["鴰"] = "桰",
["趏"] = "桰",
["舌"] = "桰",
["姡"] = "桰",
["頢"] = "桰",
["括"] = "桰",
["活"] = "桰",
["适"] = "桰",
["栝"] = "桰",
["佸"] = "桰",
["髺"] = "桰",
["聒"] = "桰",
["銛"] = "桰",
["葀"] = "桰",
["懖"] = "桰",
["筈"] = "桰",
["萿"] = "桰",
["蛞"] = "桰",
["闊"] = "桰",
["秳"] = "桰",
["莿"] = "剌",
["鵣"] = "剌",
["辣"] = "剌",
["辢"] = "剌",
["剌"] = "剌",
["揧"] = "剌",
["瘌"] = "剌",
["楋"] = "剌",
["蝲"] = "剌",
["來"] = "來",
["萊"] = "來",
["淶"] = "來",
["徠"] = "來",
["崍"] = "來",
["郲"] = "來",
["騋"] = "來",
["猍"] = "來",
["鯠"] = "來",
["鶆"] = "來",
["庲"] = "來",
["棶"] = "來",
["斄"] = "來",
["逨"] = "來",
["麳"] = "來",
["唻"] = "來",
["賚"] = "來",
["睞"] = "來",
["勑"] = "來",
["誺"] = "來",
["倈"] = "來",
["憖"] = "來",
["猌"] = "來",
["麥"] = "來",
["賴"] = "賴",
["籟"] = "賴",
["癩"] = "賴",
["瀨"] = "賴",
["藾"] = "賴",
["攋"] = "賴",
["懶"] = "賴",
["嬾"] = "賴",
["獺"] = "賴",
["牢"] = "牢",
["窂"] = "牢",
["哰"] = "牢",
["勞"] = "勞",
["撈"] = "勞",
["嘮"] = "勞",
["癆"] = "勞",
["簩"] = "勞",
["蟧"] = "勞",
["憥"] = "勞",
["澇"] = "勞",
["僗"] = "勞",
["髝"] = "勞",
["膋"] = "勞",
["犖"] = "勞",
["老"] = "老",
["姥"] = "老",
["栳"] = "老",
["恅"] = "老",
["樂"] = "樂",
["轢"] = "樂",
["濼"] = "樂",
["躒"] = "樂",
["擽"] = "樂",
["爍"] = "樂",
["鑠"] = "樂",
["藥"] = "樂",
["櫟"] = "樂",
["纅"] = "樂",
["礫"] = "樂",
["瓅"] = "樂",
["皪"] = "樂",
["觻"] = "樂",
["嚛"] = "樂",
["摞"] = "畾",
["騾"] = "畾",
["螺"] = "畾",
["蔂"] = "畾",
["虆"] = "畾",
["瘰"] = "畾",
["礌"] = "畾",
["雷"] = "畾",
["擂"] = "畾",
["攂"] = "畾",
["礧"] = "畾",
["儡"] = "畾",
["瓃"] = "畾",
["櫑"] = "畾",
["鑘"] = "畾",
["鐳"] = "畾",
["畾"] = "畾",
["轠"] = "畾",
["罍"] = "畾",
["蕾"] = "畾",
["癗"] = "畾",
["磥"] = "畾",
["累"] = "畾",
["儽"] = "畾",
["樏"] = "畾",
["鸓"] = "畾",
["嫘"] = "畾",
["纍"] = "畾",
["欙"] = "畾",
["纝"] = "畾",
["壘"] = "畾",
["櫐"] = "畾",
["蘽"] = "畾",
["藟"] = "畾",
["讄"] = "畾",
["絫"] = "厽",
["厽"] = "厽",
["垒"] = "厽",
["頛"] = "耒",
["郲"] = "耒",
["耒"] = "耒",
["銇"] = "耒",
["洡"] = "耒",
["誄"] = "耒",
["藞"] = "磊",
["磊"] = "磊",
["蘱"] = "頪",
["纇"] = "頪",
["類"] = "頪",
["頪"] = "頪",
["禷"] = "頪",
["謧"] = "离",
["璃"] = "离",
["離"] = "离",
["縭"] = "离",
["离"] = "离",
["醨"] = "离",
["樆"] = "离",
["褵"] = "离",
["漓"] = "离",
["黐"] = "离",
["籬"] = "离",
["灕"] = "离",
["蘺"] = "离",
["攡"] = "离",
["魑"] = "离",
["螭"] = "离",
["摛"] = "离",
["犛"] = "釐",
["釐"] = "釐",
["嫠"] = "釐",
["剺"] = "釐",
["孷"] = "釐",
["漦"] = "釐",
["氂"] = "釐",
["盠"] = "蠡",
["欚"] = "蠡",
["劙"] = "蠡",
["埋"] = "里",
["霾"] = "里",
["薶"] = "里",
["榸"] = "里",
["厘"] = "里",
["狸"] = "里",
["貍"] = "里",
["梩"] = "里",
["艃"] = "里",
["里"] = "里",
["理"] = "里",
["鯉"] = "里",
["俚"] = "里",
["悝"] = "里",
["娌"] = "里",
["裏"] = "里",
["荲"] = "里",
["體"] = "豊",
["軆"] = "豊",
["禮"] = "豊",
["澧"] = "豊",
["醴"] = "豊",
["豊"] = "豊",
["鱧"] = "豊",
["勒"] = "力",
["肋"] = "力",
["扐"] = "力",
["仂"] = "力",
["艻"] = "力",
["朸"] = "力",
["玏"] = "力",
["泐"] = "力",
["阞"] = "力",
["竻"] = "力",
["力"] = "力",
["屴"] = "力",
["鳨"] = "力",
["涖"] = "立",
["莅"] = "立",
["蒞"] = "立",
["位"] = "立",
["拉"] = "立",
["菈"] = "立",
["颯"] = "立",
["立"] = "立",
["粒"] = "立",
["笠"] = "立",
["砬"] = "立",
["岦"] = "立",
["苙"] = "立",
["鴗"] = "立",
["雴"] = "立",
["泣"] = "立",
["犁"] = "利",
["黎"] = "利",
["莉"] = "利",
["黧"] = "利",
["鯬"] = "利",
["筣"] = "利",
["蔾"] = "利",
["藜"] = "利",
["邌"] = "利",
["瓈"] = "利",
["鵹"] = "利",
["棃"] = "利",
["梨"] = "利",
["蟍"] = "利",
["蜊"] = "利",
["鑗"] = "利",
["利"] = "利",
["痢"] = "利",
["浰"] = "利",
["灑"] = "丽",
["籭"] = "丽",
["躧"] = "丽",
["曬"] = "丽",
["廲"] = "丽",
["驪"] = "丽",
["鱺"] = "丽",
["欐"] = "丽",
["丽"] = "丽",
["麗"] = "丽",
["儷"] = "丽",
["鸝"] = "丽",
["酈"] = "丽",
["孋"] = "丽",
["矖"] = "丽",
["穲"] = "丽",
["邐"] = "丽",
["彲"] = "丽",
["釃"] = "丽",
["襹"] = "丽",
["纚"] = "丽",
["錑"] = "戾",
["戻"] = "戾",
["戾"] = "戾",
["綟"] = "戾",
["唳"] = "戾",
["蜧"] = "戾",
["捩"] = "戾",
["悷"] = "戾",
["淚"] = "戾",
["曃"] = "隶",
["埭"] = "隶",
["逮"] = "隶",
["靆"] = "隶",
["齂"] = "隶",
["棣"] = "隶",
["隸"] = "隶",
["肆"] = "隶",
["蕼"] = "隶",
["肂"] = "隶",
["殔"] = "隶",
["隶"] = "隶",
["栗"] = "栗",
["溧"] = "栗",
["慄"] = "栗",
["鷅"] = "栗",
["凓"] = "栗",
["篥"] = "栗",
["麜"] = "栗",
["瑮"] = "栗",
["塛"] = "栗",
["搮"] = "栗",
["秝"] = "秝",
["歷"] = "秝",
["曆"] = "秝",
["磿"] = "秝",
["靂"] = "秝",
["癧"] = "秝",
["櫪"] = "秝",
["藶"] = "秝",
["瀝"] = "秝",
["攊"] = "秝",
["厤"] = "秝",
["連"] = "連",
["漣"] = "連",
["鰱"] = "連",
["翴"] = "連",
["鏈"] = "連",
["璉"] = "連",
["僆"] = "連",
["摙"] = "連",
["蓮"] = "連",
["嗹"] = "連",
["縺"] = "連",
["剆"] = "良",
["郎"] = "良",
["稂"] = "良",
["桹"] = "良",
["鋃"] = "良",
["硠"] = "良",
["浪"] = "良",
["蜋"] = "良",
["琅"] = "良",
["狼"] = "良",
["欴"] = "良",
["踉"] = "良",
["莨"] = "良",
["艆"] = "良",
["駺"] = "良",
["躴"] = "良",
["筤"] = "良",
["閬"] = "良",
["哴"] = "良",
["蓈"] = "良",
["廊"] = "良",
["榔"] = "良",
["螂"] = "良",
["瑯"] = "良",
["朗"] = "良",
["朖"] = "良",
["誏"] = "良",
["俍"] = "良",
["崀"] = "良",
["埌"] = "良",
["蒗"] = "良",
["娘"] = "良",
["良"] = "良",
["粮"] = "良",
["悢"] = "良",
["倆"] = "兩",
["兩"] = "兩",
["脼"] = "兩",
["緉"] = "兩",
["蜽"] = "兩",
["魎"] = "兩",
["輛"] = "兩",
["糧"] = "量",
["量"] = "量",
["釕"] = "了",
["了"] = "了",
["料"] = "料",
["炓"] = "料",
["簝"] = "尞",
["潦"] = "尞",
["獠"] = "尞",
["轑"] = "尞",
["橑"] = "尞",
["燎"] = "尞",
["繚"] = "尞",
["璙"] = "尞",
["憭"] = "尞",
["爒"] = "尞",
["僚"] = "尞",
["嫽"] = "尞",
["療"] = "尞",
["膫"] = "尞",
["鷯"] = "尞",
["遼"] = "尞",
["撩"] = "尞",
["嘹"] = "尞",
["寮"] = "尞",
["飉"] = "尞",
["竂"] = "尞",
["鐐"] = "尞",
["蟟"] = "尞",
["瞭"] = "尞",
["嶚"] = "尞",
["镽"] = "尞",
["例"] = "列",
["鮤"] = "列",
["栵"] = "列",
["洌"] = "列",
["銐"] = "列",
["峛"] = "列",
["列"] = "列",
["裂"] = "列",
["烈"] = "列",
["冽"] = "列",
["迾"] = "列",
["蛚"] = "列",
["茢"] = "列",
["颲"] = "列",
["鴷"] = "列",
["挒"] = "列",
["姴"] = "列",
["鑞"] = "巤",
["蠟"] = "巤",
["邋"] = "巤",
["臘"] = "巤",
["臈"] = "巤",
["擸"] = "巤",
["擖"] = "巤",
["獵"] = "巤",
["躐"] = "巤",
["鬣"] = "巤",
["儠"] = "巤",
["犣"] = "巤",
["鱲"] = "巤",
["巤"] = "巤",
["獦"] = "巤",
["婪"] = "林",
["惏"] = "林",
["啉"] = "林",
["漤"] = "林",
["醂"] = "林",
["林"] = "林",
["琳"] = "林",
["淋"] = "林",
["痳"] = "林",
["箖"] = "林",
["霖"] = "林",
["菻"] = "林",
["罧"] = "林",
["棽"] = "林",
["綝"] = "林",
["郴"] = "林",
["禁"] = "林",
["襟"] = "林",
["僸"] = "林",
["澿"] = "林",
["噤"] = "林",
["凚"] = "林",
["齽"] = "林",
["潾"] = "粦",
["膦"] = "粦",
["憐"] = "粦",
["燐"] = "粦",
["鄰"] = "粦",
["轔"] = "粦",
["嶙"] = "粦",
["粼"] = "粦",
["磷"] = "粦",
["疄"] = "粦",
["麟"] = "粦",
["鱗"] = "粦",
["璘"] = "粦",
["翷"] = "粦",
["瞵"] = "粦",
["獜"] = "粦",
["驎"] = "粦",
["鏻"] = "粦",
["繗"] = "粦",
["僯"] = "粦",
["橉"] = "粦",
["撛"] = "粦",
["遴"] = "粦",
["粦"] = "粦",
["甐"] = "粦",
["麐"] = "吝",
["吝"] = "吝",
["悋"] = "吝",
["藺"] = "閵",
["閵"] = "閵",
["躪"] = "閵",
["轥"] = "閵",
["棱"] = "夌",
["稜"] = "夌",
["輘"] = "夌",
["倰"] = "夌",
["祾"] = "夌",
["踜"] = "夌",
["凌"] = "夌",
["菱"] = "夌",
["陵"] = "夌",
["綾"] = "夌",
["鯪"] = "夌",
["淩"] = "夌",
["夌"] = "夌",
["蔆"] = "夌",
["崚"] = "夌",
["掕"] = "夌",
["𩜁"] = "夌",
["庱"] = "夌",
["睖"] = "夌",
["靈"] = "霝",
["霛"] = "霝",
["麢"] = "霝",
["霝"] = "霝",
["醽"] = "霝",
["櫺"] = "霝",
["蘦"] = "霝",
["孁"] = "霝",
["龗"] = "霝",
["酃"] = "霝",
["爧"] = "霝",
["欞"] = "霝",
["令"] = "令",
["怜"] = "令",
["零"] = "令",
["魿"] = "令",
["命"] = "令",
["冷"] = "令",
["跉"] = "令",
["嶺"] = "令",
["領"] = "令",
["阾"] = "令",
["柃"] = "令",
["袊"] = "令",
["詅"] = "令",
["旍"] = "令",
["舲"] = "令",
["齡"] = "令",
["囹"] = "令",
["鴒"] = "令",
["蛉"] = "令",
["鈴"] = "令",
["苓"] = "令",
["伶"] = "令",
["泠"] = "令",
["瓴"] = "令",
["拎"] = "令",
["刢"] = "令",
["玲"] = "令",
["聆"] = "令",
["竛"] = "令",
["軨"] = "令",
["笭"] = "令",
["翎"] = "令",
["閝"] = "令",
["鹷"] = "令",
["昤"] = "令",
["駖"] = "令",
["彾"] = "令",
["呤"] = "令",
["狑"] = "令",
["秢"] = "令",
["岭"] = "令",
["紷"] = "令",
["砱"] = "令",
["羚"] = "令",
["姈"] = "令",
["蕶"] = "令",
["澪"] = "令",
["流"] = "流",
["硫"] = "流",
["琉"] = "流",
["旒"] = "流",
["瑬"] = "流",
["裗"] = "流",
["六"] = "六",
["圥"] = "六",
["醪"] = "翏",
["嫪"] = "翏",
["嘐"] = "翏",
["賿"] = "翏",
["顟"] = "翏",
["膠"] = "翏",
["轇"] = "翏",
["摎"] = "翏",
["髎"] = "翏",
["熮"] = "翏",
["廖"] = "翏",
["憀"] = "翏",
["豂"] = "翏",
["漻"] = "翏",
["翏"] = "翏",
["寥"] = "翏",
["蓼"] = "翏",
["鄝"] = "翏",
["鷚"] = "翏",
["繆"] = "翏",
["勠"] = "翏",
["疁"] = "翏",
["飂"] = "翏",
["鏐"] = "翏",
["僇"] = "翏",
["瘳"] = "翏",
["璆"] = "翏",
["謬"] = "翏",
["蟉"] = "翏",
["樛"] = "翏",
["磟"] = "翏",
["戮"] = "翏",
["剹"] = "翏",
["穋"] = "翏",
["驡"] = "龍",
["龐"] = "龍",
["瀧"] = "龍",
["籠"] = "龍",
["豅"] = "龍",
["朧"] = "龍",
["龓"] = "龍",
["聾"] = "龍",
["礱"] = "龍",
["嚨"] = "龍",
["蘢"] = "龍",
["櫳"] = "龍",
["襱"] = "龍",
["瓏"] = "龍",
["曨"] = "龍",
["鸗"] = "龍",
["蠪"] = "龍",
["巃"] = "龍",
["竉"] = "龍",
["攏"] = "龍",
["儱"] = "龍",
["龍"] = "龍",
["躘"] = "龍",
["隴"] = "龍",
["壠"] = "龍",
["壟"] = "龍",
["寵"] = "龍",
["龏"] = "龍",
["樓"] = "婁",
["摟"] = "婁",
["耬"] = "婁",
["僂"] = "婁",
["婁"] = "婁",
["螻"] = "婁",
["髏"] = "婁",
["蔞"] = "婁",
["鞻"] = "婁",
["艛"] = "婁",
["膢"] = "婁",
["廔"] = "婁",
["嘍"] = "婁",
["瞜"] = "婁",
["簍"] = "婁",
["慺"] = "婁",
["鷜"] = "婁",
["褸"] = "婁",
["遱"] = "婁",
["謱"] = "婁",
["嶁"] = "婁",
["甊"] = "婁",
["塿"] = "婁",
["漊"] = "婁",
["鏤"] = "婁",
["瘻"] = "婁",
["擻"] = "婁",
["藪"] = "婁",
["籔"] = "婁",
["氀"] = "婁",
["縷"] = "婁",
["屢"] = "婁",
["數"] = "婁",
["屨"] = "婁",
["窶"] = "婁",
["貗"] = "婁",
["漏"] = "屚",
["瘺"] = "屚",
["屚"] = "屚",
["滷"] = "鹵",
["鹵"] = "鹵",
["樐"] = "鹵",
["蓾"] = "鹵",
["鏀"] = "鹵",
["魯"] = "魯",
["櫓"] = "魯",
["穭"] = "魯",
["灶"] = "圥",
["竈"] = "圥",
["鼀"] = "圥",
["睦"] = "坴",
["坴"] = "坴",
["陸"] = "坴",
["稑"] = "坴",
["鵱"] = "坴",
["鯥"] = "坴",
["淕"] = "坴",
["踛"] = "坴",
["剝"] = "彔",
["龣"] = "彔",
["祿"] = "彔",
["淥"] = "彔",
["睩"] = "彔",
["琭"] = "彔",
["箓"] = "彔",
["碌"] = "彔",
["盝"] = "彔",
["娽"] = "彔",
["彔"] = "彔",
["趢"] = "彔",
["簶"] = "彔",
["綠"] = "彔",
["逯"] = "彔",
["錄"] = "彔",
["醁"] = "彔",
["騄"] = "彔",
["菉"] = "彔",
["籙"] = "彔",
["鄜"] = "鹿",
["鹿"] = "鹿",
["漉"] = "鹿",
["轆"] = "鹿",
["簏"] = "鹿",
["螰"] = "鹿",
["麓"] = "鹿",
["騼"] = "鹿",
["摝"] = "鹿",
["廘"] = "鹿",
["蔍"] = "鹿",
["鏕"] = "鹿",
["櫚"] = "呂",
["閭"] = "呂",
["吕"] = "呂",
["侣"] = "呂",
["梠"] = "呂",
["郘"] = "呂",
["絽"] = "呂",
["莒"] = "呂",
["筥"] = "呂",
["酹"] = "寽",
["脟"] = "寽",
["捋"] = "寽",
["蛶"] = "寽",
["埒"] = "寽",
["鋝"] = "寽",
["浖"] = "寽",
["哷"] = "寽",
["寽"] = "寽",
["玈"] = "旅",
["旅"] = "旅",
["膂"] = "旅",
["祣"] = "旅",
["率"] = "率",
["繂"] = "率",
["膟"] = "率",
["蟀"] = "率",
["蠻"] = "䜌",
["矕"] = "䜌",
["變"] = "䜌",
["鸞"] = "䜌",
["巒"] = "䜌",
["灤"] = "䜌",
["欒"] = "䜌",
["鑾"] = "䜌",
["臠"] = "䜌",
["羉"] = "䜌",
["䜌"] = "䜌",
["灓"] = "䜌",
["圝"] = "䜌",
["曫"] = "䜌",
["孿"] = "䜌",
["彎"] = "䜌",
["灣"] = "䜌",
["攣"] = "䜌",
["孌"] = "䜌",
["戀"] = "䜌",
["㪻"] = "䜌",
["卵"] = "卵",
["關"] = "卵",
["関"] = "卵",
["聯"] = "卵",
["覼"] = "亂",
["亂"] = "亂",
["薍"] = "亂",
["蜦"] = "侖",
["綸"] = "侖",
["論"] = "侖",
["崘"] = "侖",
["掄"] = "侖",
["菕"] = "侖",
["惀"] = "侖",
["睔"] = "侖",
["碖"] = "侖",
["溣"] = "侖",
["倫"] = "侖",
["淪"] = "侖",
["輪"] = "侖",
["侖"] = "侖",
["陯"] = "侖",
["鯩"] = "侖",
["棆"] = "侖",
["踚"] = "侖",
["耣"] = "侖",
["錀"] = "侖",
["羅"] = "羅",
["蘿"] = "羅",
["籮"] = "羅",
["儸"] = "羅",
["饠"] = "羅",
["欏"] = "羅",
["囉"] = "羅",
["鑼"] = "羅",
["邏"] = "羅",
["驘"] = "蠃",
["鸁"] = "蠃",
["蠃"] = "蠃",
["臝"] = "蠃",
["羸"] = "蠃",
["麻"] = "麻",
["痲"] = "麻",
["犘"] = "麻",
["縻"] = "麻",
["醿"] = "麻",
["爢"] = "麻",
["蘼"] = "麻",
["靡"] = "麻",
["摩"] = "麻",
["魔"] = "麻",
["磨"] = "麻",
["劘"] = "麻",
["麽"] = "麻",
["麼"] = "麻",
["塺"] = "麻",
["麾"] = "麻",
["馬"] = "馬",
["碼"] = "馬",
["罵"] = "馬",
["鷌"] = "馬",
["鰢"] = "馬",
["瑪"] = "馬",
["榪"] = "馬",
["傌"] = "馬",
["禡"] = "馬",
["媽"] = "馬",
["買"] = "買",
["蕒"] = "買",
["嘪"] = "買",
["鷶"] = "買",
["賣"] = "買",
["獌"] = "曼",
["鬘"] = "曼",
["謾"] = "曼",
["慢"] = "曼",
["嫚"] = "曼",
["縵"] = "曼",
["曼"] = "曼",
["饅"] = "曼",
["蔓"] = "曼",
["鰻"] = "曼",
["墁"] = "曼",
["鏝"] = "曼",
["槾"] = "曼",
["漫"] = "曼",
["幔"] = "曼",
["蟃"] = "曼",
["厖"] = "尨",
["駹"] = "尨",
["狵"] = "尨",
["尨"] = "尨",
["浝"] = "尨",
["哤"] = "尨",
["牻"] = "尨",
["娏"] = "尨",
["蛖"] = "尨",
["𥆙"] = "尨",
["痝"] = "尨",
["𪁪"] = "尨",
["莽"] = "茻",
["茻"] = "茻",
["蟒"] = "莽",
["漭"] = "莽",
["毛"] = "毛",
["髦"] = "毛",
["旄"] = "毛",
["芼"] = "毛",
["氂"] = "毛",
["枆"] = "毛",
["酕"] = "毛",
["牦"] = "毛",
["耄"] = "毛",
["覒"] = "毛",
["眊"] = "毛",
["耗"] = "毛",
["秏"] = "毛",
["毣"] = "毛",
["堥"] = "矛",
["蓩"] = "矛",
["猱"] = "矛",
["茅"] = "矛",
["罞"] = "矛",
["蝥"] = "矛",
["鶜"] = "矛",
["瞀"] = "矛",
["愗"] = "矛",
["袤"] = "矛",
["雺"] = "矛",
["懋"] = "矛",
["楙"] = "矛",
["矛"] = "矛",
["蟊"] = "矛",
["髳"] = "矛",
["鍪"] = "矛",
["鞪"] = "矛",
["糅"] = "矛",
["腬"] = "矛",
["柔"] = "矛",
["揉"] = "矛",
["蹂"] = "矛",
["鍒"] = "矛",
["騥"] = "矛",
["蝚"] = "矛",
["葇"] = "矛",
["鞣"] = "矛",
["鰇"] = "矛",
["瑈"] = "矛",
["鶔"] = "矛",
["楺"] = "矛",
["煣"] = "矛",
["輮"] = "矛",
["韖"] = "矛",
["敄"] = "矛",
["務"] = "矛",
["鶩"] = "矛",
["騖"] = "矛",
["婺"] = "矛",
["霚"] = "矛",
["嵍"] = "矛",
["霧"] = "矛",
["霿"] = "矛",
["楘"] = "矛",
["卯"] = "卯",
["昴"] = "卯",
["泖"] = "卯",
["茆"] = "卯",
["奅"] = "卯",
["窌"] = "卯",
["聊"] = "卯",
["貿"] = "卯",
["鄮"] = "卯",
["劉"] = "卯",
["留"] = "卯",
["蒥"] = "卯",
["鶹"] = "卯",
["騮"] = "卯",
["榴"] = "卯",
["瑠"] = "卯",
["瘤"] = "卯",
["遛"] = "卯",
["鎦"] = "卯",
["飀"] = "卯",
["鰡"] = "卯",
["嵧"] = "卯",
["餾"] = "卯",
["瀏"] = "卯",
["懰"] = "卯",
["柳"] = "卯",
["珋"] = "卯",
["罶"] = "卯",
["嬼"] = "卯",
["溜"] = "卯",
["霤"] = "卯",
["廇"] = "卯",
["塯"] = "卯",
["媢"] = "冃",
["冃"] = "冃",
["冒"] = "冃",
["帽"] = "冃",
["瑁"] = "冃",
["賵"] = "冃",
["艒"] = "冃",
["萺"] = "冃",
["勗"] = "冃",
["勖"] = "冃",
["貌"] = "皃",
["皃"] = "皃",
["藐"] = "皃",
["邈"] = "皃",
["眉"] = "眉",
["楣"] = "眉",
["嵋"] = "眉",
["湄"] = "眉",
["鶥"] = "眉",
["瑂"] = "眉",
["郿"] = "眉",
["葿"] = "眉",
["媚"] = "眉",
["篃"] = "眉",
["蝞"] = "眉",
["煝"] = "眉",
["美"] = "美",
["渼"] = "美",
["媄"] = "美",
["蔄"] = "門",
["闅"] = "門",
["閩"] = "門",
["蕄"] = "門",
["門"] = "門",
["捫"] = "門",
["悶"] = "門",
["聞"] = "門",
["閿"] = "門",
["問"] = "門",
["蒙"] = "冡",
["冡"] = "冡",
["濛"] = "冡",
["艨"] = "冡",
["朦"] = "冡",
["矇"] = "冡",
["饛"] = "冡",
["檬"] = "冡",
["鸏"] = "冡",
["幪"] = "冡",
["蠓"] = "冡",
["靀"] = "冡",
["曚"] = "冡",
["蘉"] = "夢",
["瞢"] = "夢",
["懜"] = "夢",
["懵"] = "夢",
["甍"] = "夢",
["薨"] = "夢",
["夢"] = "夢",
["鄸"] = "夢",
["謎"] = "米",
["迷"] = "米",
["米"] = "米",
["眯"] = "米",
["洣"] = "米",
["蔝"] = "米",
["麊"] = "米",
["冞"] = "米",
["糜"] = "米",
["敉"] = "米",
["侎"] = "米",
["麋"] = "米",
["蘪"] = "米",
["攗"] = "米",
["羋"] = "羋",
["蝆"] = "羋",
["冟"] = "冖",
["冖"] = "冖",
["冪"] = "冖",
["羃"] = "冖",
["濗"] = "冖",
["鼏"] = "冖",
["覓"] = "覓",
["漞"] = "覓",
["芇"] = "芇",
["蹣"] = "芇",
["瞞"] = "芇",
["顢"] = "芇",
["樠"] = "芇",
["慲"] = "芇",
["鬗"] = "芇",
["滿"] = "芇",
["鏋"] = "芇",
["懣"] = "芇",
["璊"] = "芇",
["綿"] = "綿",
["棉"] = "綿",
["緜"] = "綿",
["矊"] = "綿",
["臱"] = "臱",
["矏"] = "臱",
["櫋"] = "臱",
["籩"] = "臱",
["邊"] = "臱",
["汅"] = "丏",
["沔"] = "丏",
["丏"] = "丏",
["眄"] = "丏",
["麪"] = "丏",
["免"] = "免",
["娩"] = "免",
["勉"] = "免",
["俛"] = "免",
["鮸"] = "免",
["冕"] = "免",
["絻"] = "免",
["婏"] = "免",
["浼"] = "免",
["鞔"] = "免",
["悗"] = "免",
["嬎"] = "免",
["晚"] = "免",
["挽"] = "免",
["輓"] = "免",
["脕"] = "免",
["莬"] = "免",
["蝒"] = "面",
["緬"] = "面",
["湎"] = "面",
["愐"] = "面",
["偭"] = "面",
["勔"] = "面",
["面"] = "面",
["麵"] = "面",
["貓"] = "苗",
["描"] = "苗",
["媌"] = "苗",
["緢"] = "苗",
["苗"] = "苗",
["猫"] = "苗",
["庿"] = "苗",
["礣"] = "蔑",
["蔑"] = "蔑",
["篾"] = "蔑",
["蠛"] = "蔑",
["懱"] = "蔑",
["幭"] = "蔑",
["鱴"] = "蔑",
["衊"] = "蔑",
["瀎"] = "蔑",
["襪"] = "蔑",
["韤"] = "蔑",
["韈"] = "蔑",
["眠"] = "民",
["民"] = "民",
["泯"] = "民",
["怋"] = "民",
["岷"] = "民",
["珉"] = "民",
["罠"] = "民",
["笢"] = "民",
["鈱"] = "民",
["抿"] = "民",
["刡"] = "民",
["敃"] = "民",
["愍"] = "民",
["暋"] = "民",
["蟁"] = "民",
["猛"] = "皿",
["艋"] = "皿",
["蜢"] = "皿",
["皿"] = "皿",
["孟"] = "皿",
["憫"] = "閔",
["閔"] = "閔",
["潣"] = "閔",
["簢"] = "閔",
["燘"] = "閔",
["澠"] = "黽",
["黽"] = "黽",
["僶"] = "黽",
["繩"] = "黽",
["譝"] = "黽",
["憴"] = "黽",
["鱦"] = "黽",
["蠅"] = "黽",
["鄳"] = "黽",
["鼆"] = "黽",
["名"] = "名",
["洺"] = "名",
["眳"] = "名",
["詺"] = "名",
["銘"] = "名",
["茗"] = "名",
["酩"] = "名",
["姳"] = "名",
["莔"] = "明",
["明"] = "明",
["盟"] = "明",
["萌"] = "明",
["奣"] = "明",
["瞑"] = "冥",
["嫇"] = "冥",
["慏"] = "冥",
["冥"] = "冥",
["榠"] = "冥",
["鄍"] = "冥",
["溟"] = "冥",
["螟"] = "冥",
["猽"] = "冥",
["蓂"] = "冥",
["覭"] = "冥",
["暝"] = "冥",
["幎"] = "冥",
["幂"] = "冥",
["塓"] = "冥",
["眛"] = "末",
["沬"] = "末",
["佅"] = "末",
["韎"] = "末",
["帓"] = "末",
["粖"] = "末",
["末"] = "末",
["昩"] = "末",
["秣"] = "末",
["靺"] = "末",
["眜"] = "末",
["抹"] = "末",
["妺"] = "末",
["怽"] = "末",
["沫"] = "末",
["袜"] = "末",
["沒"] = "沒",
["歿"] = "沒",
["莈"] = "沒",
["蟆"] = "莫",
["鬕"] = "莫",
["饃"] = "莫",
["模"] = "莫",
["摸"] = "莫",
["嫫"] = "莫",
["謨"] = "莫",
["膜"] = "莫",
["摹"] = "莫",
["暮"] = "莫",
["慕"] = "莫",
["募"] = "莫",
["墓"] = "莫",
["慔"] = "莫",
["莫"] = "莫",
["寞"] = "莫",
["漠"] = "莫",
["幕"] = "莫",
["鏌"] = "莫",
["瘼"] = "莫",
["鄚"] = "莫",
["瞙"] = "莫",
["嗼"] = "莫",
["塻"] = "莫",
["貘"] = "莫",
["驀"] = "莫",
["牟"] = "牟",
["眸"] = "牟",
["侔"] = "牟",
["蛑"] = "牟",
["麰"] = "牟",
["劺"] = "牟",
["恈"] = "牟",
["鴾"] = "牟",
["某"] = "某",
["謀"] = "某",
["媒"] = "某",
["煤"] = "某",
["腜"] = "某",
["禖"] = "某",
["脢"] = "母",
["挴"] = "母",
["海"] = "母",
["毐"] = "母",
["呣"] = "母",
["拇"] = "母",
["母"] = "母",
["胟"] = "母",
["姆"] = "母",
["畮"] = "母",
["踇"] = "母",
["苺"] = "母",
["莓"] = "母",
["敏"] = "母",
["鰵"] = "母",
["慜"] = "母",
["毋"] = "母",
["梅"] = "母",
["酶"] = "母",
["鋂"] = "母",
["每"] = "母",
["毎"] = "母",
["痗"] = "母",
["晦"] = "母",
["誨"] = "母",
["悔"] = "母",
["霉"] = "母",
["畝"] = "畝",
["畞"] = "畝",
["姥"] = "姥",
["峔"] = "姥",
["瞐"] = "目",
["苜"] = "目",
["目"] = "目",
["木"] = "木",
["沐"] = "木",
["朷"] = "木",
["蚞"] = "木",
["霂"] = "木",
["乃"] = "乃",
["鼐"] = "乃",
["疓"] = "乃",
["奶"] = "乃",
["仍"] = "乃",
["艿"] = "乃",
["辸"] = "乃",
["礽"] = "乃",
["扔"] = "乃",
["芿"] = "乃",
["奈"] = "奈",
["柰"] = "奈",
["渿"] = "奈",
["捺"] = "奈",
["南"] = "南",
["楠"] = "南",
["腩"] = "南",
["湳"] = "南",
["揇"] = "南",
["萳"] = "南",
["罱"] = "南",
["喃"] = "南",
["諵"] = "南",
["獿"] = "夒",
["犪"] = "夒",
["擾"] = "夒",
["腦"] = "匘",
["惱"] = "匘",
["瑙"] = "匘",
["匘"] = "匘",
["碯"] = "匘",
["硇"] = "匘",
["𣳦"] = "匘",
["妠"] = "內",
["內"] = "內",
["笍"] = "內",
["芮"] = "內",
["枘"] = "內",
["汭"] = "內",
["鈉"] = "內",
["蜹"] = "內",
["抐"] = "內",
["納"] = "內",
["衲"] = "內",
["魶"] = "內",
["軜"] = "內",
["蒳"] = "內",
["豽"] = "內",
["肭"] = "內",
["吶"] = "內",
["焫"] = "內",
["訥"] = "內",
["態"] = "能",
["能"] = "能",
["螚"] = "能",
["褦"] = "能",
["泥"] = "尼",
["屔"] = "尼",
["苨"] = "尼",
["坭"] = "尼",
["迡"] = "尼",
["埿"] = "尼",
["旎"] = "尼",
["狔"] = "尼",
["抳"] = "尼",
["尼"] = "尼",
["呢"] = "尼",
["怩"] = "尼",
["柅"] = "尼",
["蚭"] = "尼",
["跜"] = "尼",
["秜"] = "尼",
["痆"] = "尼",
["昵"] = "尼",
["孨"] = "孴",
["孴"] = "孴",
["斥"] = "屰",
["訴"] = "屰",
["泝"] = "屰",
["愬"] = "屰",
["遡"] = "屰",
["塑"] = "屰",
["溯"] = "屰",
["遻"] = "屰",
["柝"] = "屰",
["鶚"] = "屰",
["諤"] = "屰",
["齶"] = "屰",
["鍔"] = "屰",
["遌"] = "屰",
["崿"] = "屰",
["偔"] = "屰",
["堮"] = "屰",
["湂"] = "屰",
["鱷"] = "屰",
["噩"] = "屰",
["咢"] = "屰",
["鑩"] = "屰",
["鄂"] = "屰",
["鰐"] = "屰",
["萼"] = "屰",
["愕"] = "屰",
["顎"] = "屰",
["朔"] = "屰",
["槊"] = "屰",
["蒴"] = "屰",
["坼"] = "屰",
["拆"] = "屰",
["逆"] = "屰",
["屰"] = "屰",
["縌"] = "屰",
["蝷"] = "屰",
["暱"] = "匿",
["慝"] = "匿",
["匿"] = "匿",
["輦"] = "輦",
["鄻"] = "輦",
["攆"] = "輦",
["淰"] = "念",
["唸"] = "念",
["埝"] = "念",
["趝"] = "念",
["諗"] = "念",
["稔"] = "念",
["棯"] = "念",
["腍"] = "念",
["捻"] = "念",
["錜"] = "念",
["敜"] = "念",
["惗"] = "念",
["菍"] = "念",
["島"] = "鳥",
["搗"] = "鳥",
["鵃"] = "鳥",
["瞗"] = "鳥",
["鳥"] = "鳥",
["蔦"] = "鳥",
["窵"] = "鳥",
["甈"] = "臬",
["臬"] = "臬",
["嵲"] = "臬",
["臲"] = "臬",
["闑"] = "臬",
["攝"] = "聶",
["聶"] = "聶",
["鑷"] = "聶",
["躡"] = "聶",
["襵"] = "聶",
["懾"] = "聶",
["囁"] = "聶",
["欇"] = "聶",
["灄"] = "聶",
["顳"] = "聶",
["讘"] = "聶",
["濘"] = "寧",
["獰"] = "寧",
["檸"] = "寧",
["儜"] = "寧",
["薴"] = "寧",
["鬡"] = "寧",
["鑏"] = "寧",
["嬣"] = "寧",
["寍"] = "寧",
["寗"] = "寧",
["甯"] = "寧",
["寧"] = "寧",
["鸋"] = "寧",
["嚀"] = "寧",
["聹"] = "寧",
["嶩"] = "農",
["噥"] = "農",
["鬞"] = "農",
["擃"] = "農",
["齈"] = "農",
["癑"] = "農",
["農"] = "農",
["辳"] = "農",
["憹"] = "農",
["膿"] = "農",
["儂"] = "農",
["濃"] = "農",
["醲"] = "農",
["襛"] = "農",
["穠"] = "農",
["檂"] = "農",
["筭"] = "弄",
["弄"] = "弄",
["梇"] = "弄",
["哢"] = "弄",
["硦"] = "弄",
["拿"] = "女",
["拏"] = "女",
["詉"] = "女",
["蒘"] = "女",
["笯"] = "女",
["挐"] = "女",
["絮"] = "女",
["呶"] = "女",
["怓"] = "女",
["帑"] = "女",
["奴"] = "女",
["砮"] = "女",
["駑"] = "女",
["孥"] = "女",
["努"] = "女",
["弩"] = "女",
["怒"] = "女",
["袽"] = "女",
["帤"] = "女",
["女"] = "女",
["籹"] = "女",
["恕"] = "女",
["如"] = "女",
["茹"] = "女",
["洳"] = "女",
["鴽"] = "女",
["蕠"] = "女",
["汝"] = "女",
["肗"] = "女",
["虐"] = "虐",
["瘧"] = "虐",
["謔"] = "虐",
["庍"] = "派",
["派"] = "派",
["脈"] = "派",
["脉"] = "派",
["衇"] = "派",
["眽"] = "派",
["覛"] = "派",
["霢"] = "派",
["佩"] = "佩",
["珮"] = "佩",
["配"] = "配",
["嶏"] = "配",
["崩"] = "朋",
["堋"] = "朋",
["漰"] = "朋",
["倗"] = "朋",
["朋"] = "朋",
["鵬"] = "朋",
["棚"] = "朋",
["鬅"] = "朋",
["掤"] = "朋",
["淜"] = "朋",
["輣"] = "朋",
["繃"] = "朋",
["弸"] = "朋",
["澎"] = "彭",
["彭"] = "彭",
["膨"] = "彭",
["蟚"] = "彭",
["蟛"] = "彭",
["憉"] = "彭",
["陂"] = "皮",
["詖"] = "皮",
["彼"] = "皮",
["柀"] = "皮",
["佊"] = "皮",
["貱"] = "皮",
["跛"] = "皮",
["披"] = "皮",
["鈹"] = "皮",
["帔"] = "皮",
["鮍"] = "皮",
["耚"] = "皮",
["狓"] = "皮",
["翍"] = "皮",
["旇"] = "皮",
["秛"] = "皮",
["紴"] = "皮",
["皮"] = "皮",
["疲"] = "皮",
["被"] = "皮",
["髲"] = "皮",
["鞁"] = "皮",
["骳"] = "皮",
["波"] = "皮",
["碆"] = "皮",
["菠"] = "皮",
["簸"] = "皮",
["駊"] = "皮",
["頗"] = "皮",
["坡"] = "皮",
["玻"] = "皮",
["破"] = "皮",
["婆"] = "皮",
["蔢"] = "皮",
["匹"] = "匹",
["鴄"] = "匹",
["爿"] = "片",
["片"] = "片",
["沜"] = "片",
["標"] = "票",
["鏢"] = "票",
["瘭"] = "票",
["幖"] = "票",
["熛"] = "票",
["蔈"] = "票",
["膘"] = "票",
["褾"] = "票",
["票"] = "票",
["飄"] = "票",
["漂"] = "票",
["螵"] = "票",
["瞟"] = "票",
["嫖"] = "票",
["旚"] = "票",
["僄"] = "票",
["慓"] = "票",
["彯"] = "票",
["摽"] = "票",
["翲"] = "票",
["嘌"] = "票",
["縹"] = "票",
["醥"] = "票",
["顠"] = "票",
["篻"] = "票",
["剽"] = "票",
["勡"] = "票",
["薸"] = "票",
["瓢"] = "票",
["鰾"] = "票",
["驃"] = "票",
["瀕"] = "頻",
["頻"] = "頻",
["顰"] = "頻",
["蘋"] = "頻",
["嚬"] = "頻",
["臨"] = "品",
["瀶"] = "品",
["品"] = "品",
["俜"] = "甹",
["甹"] = "甹",
["聘"] = "甹",
["娉"] = "甹",
["騁"] = "甹",
["梬"] = "甹",
["平"] = "平",
["怦"] = "平",
["砰"] = "平",
["抨"] = "平",
["閛"] = "平",
["伻"] = "平",
["評"] = "平",
["坪"] = "平",
["苹"] = "平",
["枰"] = "平",
["泙"] = "平",
["蚲"] = "平",
["胓"] = "平",
["匉"] = "平",
["萍"] = "平",
["蓓"] = "咅",
["倍"] = "咅",
["菩"] = "咅",
["掊"] = "咅",
["剖"] = "咅",
["婄"] = "咅",
["踣"] = "咅",
["箁"] = "咅",
["咅"] = "咅",
["部"] = "咅",
["培"] = "咅",
["犃"] = "咅",
["瓿"] = "咅",
["殕"] = "咅",
["醅"] = "咅",
["棓"] = "咅",
["涪"] = "咅",
["賠"] = "咅",
["陪"] = "咅",
["毰"] = "咅",
["焙"] = "咅",
["樸"] = "菐",
["璞"] = "菐",
["墣"] = "菐",
["撲"] = "菐",
["轐"] = "菐",
["獛"] = "菐",
["蹼"] = "菐",
["襆"] = "菐",
["濮"] = "菐",
["纀"] = "菐",
["醭"] = "菐",
["僕"] = "菐",
["菐"] = "菐",
["穙"] = "菐",
["鏷"] = "菐",
["幞"] = "菐",
["譜"] = "普",
["普"] = "普",
["切"] = "七",
["砌"] = "七",
["沏"] = "七",
["七"] = "七",
["柒"] = "七",
["叱"] = "七",
["妻"] = "妻",
["萋"] = "妻",
["淒"] = "妻",
["凄"] = "妻",
["悽"] = "妻",
["鶈"] = "妻",
["郪"] = "妻",
["緀"] = "妻",
["霋"] = "妻",
["棲"] = "妻",
["漆"] = "桼",
["桼"] = "桼",
["膝"] = "桼",
["厀"] = "桼",
["基"] = "其",
["箕"] = "其",
["朞"] = "其",
["稘"] = "其",
["萁"] = "其",
["期"] = "其",
["諅"] = "其",
["其"] = "其",
["錤"] = "其",
["諆"] = "其",
["欺"] = "其",
["娸"] = "其",
["魌"] = "其",
["僛"] = "其",
["唭"] = "其",
["棋"] = "其",
["旗"] = "其",
["淇"] = "其",
["祺"] = "其",
["琪"] = "其",
["騏"] = "其",
["綦"] = "其",
["麒"] = "其",
["蜞"] = "其",
["綨"] = "其",
["蜝"] = "其",
["棊"] = "其",
["碁"] = "其",
["鯕"] = "其",
["踑"] = "其",
["藄"] = "其",
["櫀"] = "其",
["璂"] = "其",
["禥"] = "其",
["惎"] = "其",
["帺"] = "其",
["奇"] = "奇",
["畸"] = "奇",
["剞"] = "奇",
["羇"] = "奇",
["掎"] = "奇",
["攲"] = "奇",
["躸"] = "奇",
["踦"] = "奇",
["寄"] = "奇",
["徛"] = "奇",
["欹"] = "奇",
["崎"] = "奇",
["觭"] = "奇",
["碕"] = "奇",
["綺"] = "奇",
["婍"] = "奇",
["騎"] = "奇",
["琦"] = "奇",
["鵸"] = "奇",
["錡"] = "奇",
["輢"] = "奇",
["齮"] = "奇",
["犄"] = "奇",
["猗"] = "奇",
["椅"] = "奇",
["旖"] = "奇",
["陭"] = "奇",
["檹"] = "奇",
["漪"] = "奇",
["倚"] = "奇",
["畁"] = "畁",
["萆"] = "畁",
["儕"] = "齊",
["麡"] = "齊",
["齋"] = "齊",
["穧"] = "齊",
["擠"] = "齊",
["躋"] = "齊",
["齏"] = "齊",
["齎"] = "齊",
["櫅"] = "齊",
["齌"] = "齊",
["隮"] = "齊",
["賷"] = "齊",
["虀"] = "齊",
["濟"] = "齊",
["癠"] = "齊",
["霽"] = "齊",
["齊"] = "齊",
["臍"] = "齊",
["蠐"] = "齊",
["懠"] = "齊",
["薺"] = "齊",
["鱭"] = "齊",
["嚌"] = "齊",
["劑"] = "齊",
["齍"] = "齊",
["乞"] = "乞",
["盵"] = "乞",
["齕"] = "乞",
["紇"] = "乞",
["籺"] = "乞",
["圪"] = "乞",
["訖"] = "乞",
["吃"] = "乞",
["扢"] = "乞",
["疙"] = "乞",
["屹"] = "乞",
["仡"] = "乞",
["迄"] = "乞",
["釳"] = "乞",
["忔"] = "乞",
["汔"] = "乞",
["矻"] = "乞",
["麧"] = "乞",
["獃"] = "豈",
["剴"] = "豈",
["凱"] = "豈",
["愷"] = "豈",
["塏"] = "豈",
["鎧"] = "豈",
["颽"] = "豈",
["暟"] = "豈",
["闓"] = "豈",
["豈"] = "豈",
["隑"] = "豈",
["皚"] = "豈",
["嵦"] = "豈",
["敳"] = "豈",
["磑"] = "豈",
["螘"] = "豈",
["覬"] = "豈",
["溰"] = "豈",
["顗"] = "豈",
["啓"] = "啓",
["啟"] = "啓",
["棨"] = "啓",
["綮"] = "啓",
["晵"] = "啓",
["闙"] = "啓",
["启"] = "啓",
["愾"] = "气",
["忾"] = "气",
["刏"] = "气",
["汽"] = "气",
["氣"] = "气",
["气"] = "气",
["忥"] = "气",
["餼"] = "气",
["鎎"] = "气",
["熂"] = "气",
["霼"] = "气",
["犔"] = "气",
["楫"] = "咠",
["檝"] = "咠",
["湒"] = "咠",
["咠"] = "咠",
["葺"] = "咠",
["緝"] = "咠",
["諿"] = "咠",
["輯"] = "咠",
["箿"] = "咠",
["蕺"] = "咠",
["戢"] = "咠",
["濈"] = "咠",
["霵"] = "咠",
["揖"] = "咠",
["牽"] = "牽",
["縴"] = "牽",
["厱"] = "僉",
["歛"] = "僉",
["臉"] = "僉",
["醶"] = "僉",
["鹼"] = "僉",
["薟"] = "僉",
["匳"] = "僉",
["獫"] = "僉",
["蘞"] = "僉",
["籢"] = "僉",
["斂"] = "僉",
["瀲"] = "僉",
["撿"] = "僉",
["羷"] = "僉",
["殮"] = "僉",
["簽"] = "僉",
["僉"] = "僉",
["憸"] = "僉",
["譣"] = "僉",
["檢"] = "僉",
["瞼"] = "僉",
["儉"] = "僉",
["顩"] = "僉",
["嬐"] = "僉",
["嶮"] = "僉",
["噞"] = "僉",
["驗"] = "僉",
["險"] = "僉",
["劒"] = "僉",
["劍"] = "僉",
["𩏩"] = "僉",
["遷"] = "遷",
["櫏"] = "遷",
["韆"] = "遷",
["僊"] = "遷",
["躚"] = "遷",
["蹮"] = "遷",
["媊"] = "前",
["煎"] = "前",
["湔"] = "前",
["鬋"] = "前",
["剪"] = "前",
["翦"] = "前",
["譾"] = "前",
["揃"] = "前",
["箭"] = "前",
["葥"] = "前",
["前"] = "前",
["騚"] = "前",
["歬"] = "前",
["虔"] = "虔",
["鰬"] = "虔",
["榩"] = "虔",
["遣"] = "遣",
["繾"] = "遣",
["譴"] = "遣",
["坎"] = "欠",
["扻"] = "欠",
["砍"] = "欠",
["芡"] = "欠",
["欠"] = "欠",
["杴"] = "欠",
["鍁"] = "欠",
["臧"] = "爿",
["牂"] = "爿",
["戕"] = "爿",
["贓"] = "爿",
["藏"] = "爿",
["奘"] = "爿",
["臟"] = "爿",
["將"] = "爿",
["漿"] = "爿",
["鱂"] = "爿",
["蔣"] = "爿",
["螿"] = "爿",
["槳"] = "爿",
["獎"] = "爿",
["醬"] = "爿",
["鏘"] = "爿",
["蹡"] = "爿",
["嶈"] = "爿",
["斨"] = "爿",
["爿"] = "爿",
["牆"] = "爿",
["妝"] = "爿",
["莊"] = "爿",
["裝"] = "爿",
["壯"] = "爿",
["疒"] = "爿",
["床"] = "爿",
["牀"] = "爿",
["狀"] = "爿",
["繈"] = "強",
["襁"] = "強",
["膙"] = "強",
["鏹"] = "強",
["勥"] = "強",
["強"] = "強",
["薔"] = "牆",
["廧"] = "牆",
["蘠"] = "牆",
["嬙"] = "牆",
["檣"] = "牆",
["驕"] = "喬",
["嬌"] = "喬",
["憍"] = "喬",
["穚"] = "喬",
["鷮"] = "喬",
["蕎"] = "喬",
["喬"] = "喬",
["簥"] = "喬",
["撟"] = "喬",
["矯"] = "喬",
["鱎"] = "喬",
["敽"] = "喬",
["蟜"] = "喬",
["譑"] = "喬",
["蹻"] = "喬",
["繑"] = "喬",
["鞽"] = "喬",
["趫"] = "喬",
["嘺"] = "喬",
["橋"] = "喬",
["僑"] = "喬",
["鐈"] = "喬",
["毊"] = "喬",
["轎"] = "喬",
["嶠"] = "喬",
["獢"] = "喬",
["屩"] = "喬",
["虘"] = "且",
["蔖"] = "且",
["摣"] = "且",
["袓"] = "且",
["怚"] = "且",
["罝"] = "且",
["謯"] = "且",
["姐"] = "且",
["抯"] = "且",
["飷"] = "且",
["且"] = "且",
["趄"] = "且",
["笡"] = "且",
["查"] = "且",
["柤"] = "且",
["樝"] = "且",
["皻"] = "且",
["渣"] = "且",
["楂"] = "且",
["苴"] = "且",
["駔"] = "且",
["租"] = "且",
["蒩"] = "且",
["祖"] = "且",
["組"] = "且",
["珇"] = "且",
["靻"] = "且",
["粗"] = "且",
["徂"] = "且",
["殂"] = "且",
["麆"] = "且",
["伹"] = "且",
["蛆"] = "且",
["沮"] = "且",
["咀"] = "且",
["疽"] = "且",
["雎"] = "且",
["狙"] = "且",
["岨"] = "且",
["砠"] = "且",
["坥"] = "且",
["刞"] = "且",
["覰"] = "且",
["覷"] = "且",
["跙"] = "且",
["筯"] = "且",
["菹"] = "且",
["葅"] = "且",
["阻"] = "且",
["俎"] = "且",
["詛"] = "且",
["鉏"] = "且",
["豠"] = "且",
["鋤"] = "且",
["耡"] = "且",
["齟"] = "且",
["助"] = "且",
["霎"] = "妾",
["翣"] = "妾",
["帹"] = "妾",
["接"] = "妾",
["椄"] = "妾",
["菨"] = "妾",
["鯜"] = "妾",
["妾"] = "妾",
["淁"] = "妾",
["踥"] = "妾",
["鋟"] = "侵",
["綅"] = "侵",
["祲"] = "侵",
["埐"] = "侵",
["梫"] = "侵",
["濅"] = "侵",
["浸"] = "侵",
["侵"] = "侵",
["駸"] = "侵",
["寢"] = "侵",
["寑"] = "侵",
["薓"] = "侵",
["轃"] = "秦",
["秦"] = "秦",
["螓"] = "秦",
["臻"] = "秦",
["蓁"] = "秦",
["搸"] = "秦",
["溱"] = "秦",
["榛"] = "秦",
["顈"] = "頃",
["傾"] = "頃",
["頃"] = "頃",
["穎"] = "頃",
["潁"] = "頃",
["熲"] = "頃",
["殸"] = "殸",
["聲"] = "殸",
["謦"] = "殸",
["磬"] = "殸",
["罄"] = "殸",
["馨"] = "殸",
["慶"] = "慶",
["羻"] = "慶",
["丘"] = "丘",
["邱"] = "丘",
["蚯"] = "丘",
["丠"] = "丘",
["鍫"] = "秋",
["篍"] = "秋",
["愀"] = "秋",
["湫"] = "秋",
["揪"] = "秋",
["揫"] = "秋",
["啾"] = "秋",
["鬏"] = "秋",
["秋"] = "秋",
["鰍"] = "秋",
["楸"] = "秋",
["秌"] = "秋",
["鞦"] = "秋",
["鶖"] = "秋",
["萩"] = "秋",
["甃"] = "秋",
["醔"] = "秋",
["愁"] = "秋",
["僽"] = "秋",
["鮂"] = "囚",
["囚"] = "囚",
["泅"] = "囚",
["苬"] = "囚",
["救"] = "求",
["求"] = "求",
["球"] = "求",
["逑"] = "求",
["賕"] = "求",
["蛷"] = "求",
["莍"] = "求",
["殏"] = "求",
["梂"] = "求",
["俅"] = "求",
["脙"] = "求",
["絿"] = "求",
["銶"] = "求",
["毬"] = "求",
["捄"] = "求",
["觩"] = "求",
["摳"] = "區",
["彄"] = "區",
["剾"] = "區",
["謳"] = "區",
["歐"] = "區",
["區"] = "區",
["鷗"] = "區",
["甌"] = "區",
["漚"] = "區",
["瞘"] = "區",
["嘔"] = "區",
["櫙"] = "區",
["膒"] = "區",
["蓲"] = "區",
["醧"] = "區",
["鏂"] = "區",
["毆"] = "區",
["塸"] = "區",
["貙"] = "區",
["樞"] = "區",
["驅"] = "區",
["軀"] = "區",
["嶇"] = "區",
["鰸"] = "區",
["敺"] = "區",
["傴"] = "區",
["嫗"] = "區",
["饇"] = "區",
["陬"] = "取",
["棷"] = "取",
["掫"] = "取",
["緅"] = "取",
["趣"] = "取",
["取"] = "取",
["鯫"] = "取",
["棸"] = "取",
["鄹"] = "取",
["郰"] = "取",
["齱"] = "取",
["菆"] = "取",
["箃"] = "取",
["黀"] = "取",
["驟"] = "取",
["最"] = "取",
["襊"] = "取",
["蕞"] = "取",
["嘬"] = "取",
["諏"] = "取",
["娵"] = "取",
["娶"] = "取",
["聚"] = "取",
["埾"] = "取",
["藂"] = "取",
["叢"] = "取",
["繓"] = "取",
["撮"] = "取",
["佉"] = "去",
["呿"] = "去",
["抾"] = "去",
["弆"] = "去",
["祛"] = "去",
["袪"] = "去",
["阹"] = "去",
["胠"] = "去",
["魼"] = "去",
["去"] = "去",
["麮"] = "去",
["鼁"] = "去",
["砝"] = "去",
["劫"] = "去",
["鉣"] = "去",
["蜐"] = "去",
["怯"] = "去",
["拴"] = "全",
["栓"] = "全",
["跧"] = "全",
["痊"] = "全",
["詮"] = "全",
["荃"] = "全",
["銓"] = "全",
["筌"] = "全",
["輇"] = "全",
["硂"] = "全",
["佺"] = "全",
["駩"] = "全",
["絟"] = "全",
["恮"] = "全",
["峑"] = "全",
["全"] = "全",
["仝"] = "全",
["牷"] = "全",
["線"] = "泉",
["泉"] = "泉",
["葲"] = "泉",
["灥"] = "泉",
["猚"] = "犬",
["畎"] = "犬",
["汱"] = "犬",
["甽"] = "犬",
["犬"] = "犬",
["腳"] = "郤",
["脚"] = "郤",
["卻"] = "郤",
["却"] = "郤",
["谻"] = "郤",
["郤"] = "郤",
["綌"] = "郤",
["菌"] = "囷",
["麇"] = "囷",
["麕"] = "囷",
["囷"] = "囷",
["箘"] = "囷",
["攈"] = "囷",
["嘫"] = "肰",
["然"] = "肰",
["肰"] = "肰",
["繎"] = "肰",
["燃"] = "肰",
["蹨"] = "肰",
["橪"] = "肰",
["撚"] = "肰",
["那"] = "冉",
["挪"] = "冉",
["娜"] = "冉",
["柟"] = "冉",
["抩"] = "冉",
["聃"] = "冉",
["舑"] = "冉",
["坍"] = "冉",
["髯"] = "冉",
["蚺"] = "冉",
["呥"] = "冉",
["冉"] = "冉",
["袡"] = "冉",
["苒"] = "冉",
["姌"] = "冉",
["千"] = "人",
["仟"] = "人",
["芊"] = "人",
["阡"] = "人",
["汘"] = "人",
["迁"] = "人",
["杄"] = "人",
["人"] = "人",
["仁"] = "人",
["朲"] = "人",
["佞"] = "人",
["紝"] = "壬",
["鵀"] = "壬",
["拰"] = "壬",
["賃"] = "壬",
["任"] = "壬",
["壬"] = "壬",
["恁"] = "壬",
["銋"] = "壬",
["荏"] = "壬",
["餁"] = "壬",
["栠"] = "壬",
["袵"] = "壬",
["飪"] = "壬",
["妊"] = "壬",
["衽"] = "壬",
["涊"] = "刃",
["紉"] = "刃",
["忍"] = "刃",
["荵"] = "刃",
["刃"] = "刃",
["認"] = "刃",
["仞"] = "刃",
["軔"] = "刃",
["韌"] = "刃",
["肕"] = "刃",
["牣"] = "刃",
["杒"] = "刃",
["訒"] = "刃",
["涅"] = "日",
["捏"] = "日",
["篞"] = "日",
["衵"] = "日",
["日"] = "日",
["馹"] = "日",
["娀"] = "戎",
["戎"] = "戎",
["茙"] = "戎",
["駥"] = "戎",
["狨"] = "戎",
["絨"] = "戎",
["茸"] = "茸",
["髶"] = "茸",
["搑"] = "茸",
["榵"] = "茸",
["穁"] = "茸",
["宂"] = "冗",
["冗"] = "冗",
["朒"] = "肉",
["肉"] = "肉",
["啂"] = "乳",
["乳"] = "乳",
["耨"] = "辱",
["槈"] = "辱",
["鎒"] = "辱",
["搙"] = "辱",
["褥"] = "辱",
["傉"] = "辱",
["辱"] = "辱",
["縟"] = "辱",
["蓐"] = "辱",
["鄏"] = "辱",
["溽"] = "辱",
["媷"] = "辱",
["嗕"] = "辱",
["陾"] = "耎",
["腝"] = "耎",
["堧"] = "耎",
["稬"] = "耎",
["愞"] = "耎",
["煗"] = "耎",
["餪"] = "耎",
["渜"] = "耎",
["偄"] = "耎",
["瑌"] = "耎",
["軟"] = "耎",
["輭"] = "耎",
["蝡"] = "耎",
["碝"] = "耎",
["耎"] = "耎",
["緛"] = "耎",
["媆"] = "耎",
["甤"] = "甤",
["蕤"] = "甤",
["睿"] = "睿",
["叡"] = "睿",
["璿"] = "睿",
["壡"] = "睿",
["濬"] = "睿",
["撋"] = "閏",
["瞤"] = "閏",
["潤"] = "閏",
["閏"] = "閏",
["若"] = "若",
["婼"] = "若",
["惹"] = "若",
["諾"] = "若",
["蠚"] = "若",
["逽"] = "若",
["蹃"] = "若",
["箬"] = "若",
["楉"] = "若",
["鄀"] = "若",
["嫋"] = "弱",
["弱"] = "弱",
["溺"] = "弱",
["蒻"] = "弱",
["搦"] = "弱",
["愵"] = "弱",
["賽"] = "塞",
["塞"] = "塞",
["簺"] = "塞",
["僿"] = "塞",
["寨"] = "塞",
["三"] = "三",
["弎"] = "三",
["散"] = "散",
["糤"] = "散",
["繖"] = "散",
["饊"] = "散",
["鏾"] = "散",
["潸"] = "散",
["霰"] = "散",
["撒"] = "散",
["桒"] = "桑",
["桑"] = "桑",
["磉"] = "桑",
["顙"] = "桑",
["嗓"] = "桑",
["搡"] = "桑",
["掃"] = "掃",
["埽"] = "掃",
["色"] = "色",
["赩"] = "色",
["濇"] = "嗇",
["嗇"] = "嗇",
["穡"] = "嗇",
["薔"] = "嗇",
["轖"] = "嗇",
["繬"] = "嗇",
["嬙"] = "嗇",
["懎"] = "嗇",
["澀"] = "歰",
["歰"] = "歰",
["澁"] = "歰",
["閷"] = "杀",
["鎩"] = "杀",
["殺"] = "杀",
["蔱"] = "杀",
["摋"] = "杀",
["煞"] = "杀",
["榝"] = "杀",
["刹"] = "杀",
["硰"] = "沙",
["娑"] = "沙",
["挱"] = "沙",
["挲"] = "沙",
["桫"] = "沙",
["渻"] = "沙",
["沙"] = "沙",
["紗"] = "沙",
["砂"] = "沙",
["鯊"] = "沙",
["裟"] = "沙",
["桬"] = "沙",
["髿"] = "沙",
["魦"] = "沙",
["莎"] = "沙",
["莏"] = "沙",
["杉"] = "彡",
["彡"] = "彡",
["衫"] = "彡",
["髟"] = "彡",
["釤"] = "彡",
["䑣"] = "彡",
["彤"] = "彡",
["浵"] = "彡",
["肜"] = "彡",
["山"] = "山",
["疝"] = "山",
["邖"] = "山",
["汕"] = "山",
["訕"] = "山",
["仙"] = "山",
["秈"] = "山",
["苮"] = "山",
["屾"] = "山",
["珊"] = "删",
["跚"] = "删",
["姗"] = "删",
["删"] = "删",
["栅"] = "删",
["羴"] = "羴",
["羼"] = "羴",
["扇"] = "扇",
["煽"] = "扇",
["傓"] = "扇",
["橏"] = "善",
["嫸"] = "善",
["善"] = "善",
["譱"] = "善",
["蟮"] = "善",
["鱔"] = "善",
["僐"] = "善",
["鄯"] = "善",
["墡"] = "善",
["磰"] = "善",
["繕"] = "善",
["膳"] = "善",
["饍"] = "善",
["商"] = "商",
["蔏"] = "商",
["螪"] = "商",
["丄"] = "上",
["上"] = "上",
["當"] = "尚",
["襠"] = "尚",
["鐺"] = "尚",
["簹"] = "尚",
["璫"] = "尚",
["檔"] = "尚",
["儅"] = "尚",
["蟷"] = "尚",
["擋"] = "尚",
["黨"] = "尚",
["讜"] = "尚",
["欓"] = "尚",
["譡"] = "尚",
["闣"] = "尚",
["瓽"] = "尚",
["鏜"] = "尚",
["闛"] = "尚",
["鼞"] = "尚",
["曭"] = "尚",
["儻"] = "尚",
["戃"] = "尚",
["矘"] = "尚",
["爣"] = "尚",
["攩"] = "尚",
["淌"] = "尚",
["倘"] = "尚",
["躺"] = "尚",
["趟"] = "尚",
["堂"] = "尚",
["坣"] = "尚",
["棠"] = "尚",
["糛"] = "尚",
["螳"] = "尚",
["隚"] = "尚",
["橖"] = "尚",
["掌"] = "尚",
["廠"] = "尚",
["敞"] = "尚",
["僘"] = "尚",
["氅"] = "尚",
["常"] = "尚",
["嘗"] = "尚",
["裳"] = "尚",
["徜"] = "尚",
["尚"] = "尚",
["甞"] = "尚",
["鋿"] = "尚",
["嫦"] = "尚",
["償"] = "尚",
["賞"] = "尚",
["瞠"] = "尚",
["撐"] = "尚",
["樘"] = "尚",
["橕"] = "尚",
["牚"] = "尚",
["埫"] = "尚",
["豹"] = "勺",
["趵"] = "勺",
["尥"] = "勺",
["箹"] = "勺",
["杓"] = "勺",
["約"] = "勺",
["扚"] = "勺",
["釣"] = "勺",
["瘹"] = "勺",
["芍"] = "勺",
["酌"] = "勺",
["灼"] = "勺",
["勺"] = "勺",
["彴"] = "勺",
["犳"] = "勺",
["妁"] = "勺",
["汋"] = "勺",
["仢"] = "勺",
["葯"] = "勺",
["礿"] = "勺",
["肑"] = "勺",
["瓝"] = "勺",
["的"] = "勺",
["靮"] = "勺",
["馰"] = "勺",
["玓"] = "勺",
["魡"] = "勺",
["絬"] = "舌",
["舌"] = "舌",
["謝"] = "射",
["榭"] = "射",
["射"] = "射",
["麝"] = "射",
["設"] = "設",
["蔎"] = "設",
["電"] = "申",
["胂"] = "申",
["申"] = "申",
["伸"] = "申",
["呻"] = "申",
["紳"] = "申",
["眒"] = "申",
["柛"] = "申",
["訷"] = "申",
["抻"] = "申",
["神"] = "申",
["朄"] = "申",
["身"] = "身",
["銵"] = "身",
["探"] = "罙",
["棎"] = "罙",
["賝"] = "罙",
["琛"] = "罙",
["穼"] = "罙",
["深"] = "罙",
["宷"] = "宷",
["審"] = "宷",
["瀋"] = "宷",
["嬸"] = "宷",
["昚"] = "昚",
["傄"] = "昚",
["湛"] = "甚",
["媅"] = "甚",
["黮"] = "甚",
["糂"] = "甚",
["堪"] = "甚",
["戡"] = "甚",
["嵁"] = "甚",
["歁"] = "甚",
["勘"] = "甚",
["磡"] = "甚",
["墈"] = "甚",
["偡"] = "甚",
["碪"] = "甚",
["椹"] = "甚",
["揕"] = "甚",
["踸"] = "甚",
["鍖"] = "甚",
["斟"] = "甚",
["諶"] = "甚",
["愖"] = "甚",
["瘎"] = "甚",
["煁"] = "甚",
["甚"] = "甚",
["葚"] = "甚",
["升"] = "升",
["昇"] = "升",
["陞"] = "升",
["抍"] = "升",
["猜"] = "生",
["輤"] = "生",
["綪"] = "生",
["倩"] = "生",
["棈"] = "生",
["蒨"] = "生",
["篟"] = "生",
["生"] = "生",
["牲"] = "生",
["笙"] = "生",
["甥"] = "生",
["鉎"] = "生",
["珄"] = "生",
["鼪"] = "生",
["猩"] = "生",
["狌"] = "生",
["眚"] = "生",
["貹"] = "生",
["崝"] = "生",
["精"] = "生",
["菁"] = "生",
["鶄"] = "生",
["蜻"] = "生",
["鼱"] = "生",
["婧"] = "生",
["睛"] = "生",
["箐"] = "生",
["聙"] = "生",
["旌"] = "生",
["清"] = "生",
["圊"] = "生",
["請"] = "生",
["凊"] = "生",
["䝼"] = "生",
["靚"] = "生",
["情"] = "生",
["晴"] = "生",
["夝"] = "生",
["靜"] = "生",
["靖"] = "生",
["睲"] = "生",
["惺"] = "生",
["性"] = "生",
["姓"] = "生",
["靗"] = "生",
["鯖"] = "生",
["青"] = "生",
["靘"] = "生",
["掅"] = "生",
["胜"] = "生",
["曐"] = "生",
["星"] = "生",
["鮏"] = "生",
["腥"] = "生",
["鯹"] = "生",
["醒"] = "生",
["篂"] = "生",
["省"] = "省",
["渻"] = "省",
["箵"] = "省",
["檉"] = "聖",
["蟶"] = "聖",
["聖"] = "聖",
["聽"] = "聖",
["廳"] = "聖",
["杘"] = "尸",
["尸"] = "尸",
["鳲"] = "尸",
["屍"] = "尸",
["屎"] = "尸",
["眣"] = "失",
["蛈"] = "失",
["迭"] = "失",
["跌"] = "失",
["瓞"] = "失",
["昳"] = "失",
["胅"] = "失",
["軼"] = "失",
["苵"] = "失",
["镻"] = "失",
["詄"] = "失",
["泆"] = "失",
["趃"] = "失",
["柣"] = "失",
["抶"] = "失",
["秩"] = "失",
["帙"] = "失",
["紩"] = "失",
["袠"] = "失",
["翐"] = "失",
["妷"] = "失",
["失"] = "失",
["佚"] = "失",
["劮"] = "失",
["篩"] = "師",
["師"] = "師",
["鰤"] = "師",
["蒒"] = "師",
["獅"] = "師",
["螄"] = "師",
["儑"] = "濕",
["濕"] = "濕",
["漯"] = "濕",
["礘"] = "濕",
["隰"] = "濕",
["溼"] = "濕",
["針"] = "十",
["汁"] = "十",
["卙"] = "十",
["十"] = "十",
["什"] = "十",
["柘"] = "石",
["妬"] = "石",
["蠹"] = "石",
["沰"] = "石",
["拓"] = "石",
["橐"] = "石",
["袥"] = "石",
["驝"] = "石",
["斫"] = "石",
["磭"] = "石",
["磔"] = "石",
["跖"] = "石",
["石"] = "石",
["碩"] = "石",
["祏"] = "石",
["鉐"] = "石",
["鼫"] = "石",
["飤"] = "食",
["食"] = "食",
["蝕"] = "食",
["飾"] = "食",
["飭"] = "食",
["吏"] = "史",
["倳"] = "史",
["剚"] = "史",
["事"] = "史",
["史"] = "史",
["使"] = "史",
["駛"] = "史",
["彘"] = "矢",
["璏"] = "矢",
["薙"] = "矢",
["知"] = "矢",
["蜘"] = "矢",
["智"] = "矢",
["鼅"] = "矢",
["潪"] = "矢",
["踟"] = "矢",
["雉"] = "矢",
["矢"] = "矢",
["痴"] = "矢",
["茌"] = "士",
["士"] = "士",
["仕"] = "士",
["氏"] = "氏",
["衹"] = "氏",
["紙"] = "氏",
["帋"] = "氏",
["扺"] = "氏",
["坁"] = "氏",
["汦"] = "氏",
["忯"] = "氏",
["眂"] = "氏",
["舐"] = "氏",
["芪"] = "氏",
["祇"] = "氏",
["疧"] = "氏",
["軝"] = "氏",
["蚔"] = "氏",
["貰"] = "世",
["跇"] = "世",
["迣"] = "世",
["世"] = "世",
["泄"] = "世",
["枻"] = "世",
["詍"] = "世",
["靾"] = "世",
["袣"] = "世",
["抴"] = "世",
["呭"] = "世",
["勩"] = "世",
["屜"] = "世",
["鰈"] = "世",
["渫"] = "世",
["煠"] = "世",
["喋"] = "世",
["鞢"] = "世",
["殜"] = "世",
["葉"] = "世",
["弽"] = "世",
["韘"] = "世",
["枼"] = "世",
["楪"] = "世",
["揲"] = "世",
["鍱"] = "世",
["偞"] = "世",
["蝶"] = "世",
["牒"] = "世",
["蹀"] = "世",
["諜"] = "世",
["堞"] = "世",
["牃"] = "世",
["褋"] = "世",
["惵"] = "世",
["碟"] = "世",
["屧"] = "世",
["屟"] = "世",
["紲"] = "世",
["齛"] = "世",
["疶"] = "世",
["緤"] = "世",
["媟"] = "世",
["示"] = "示",
["祁"] = "示",
["狋"] = "示",
["視"] = "示",
["眎"] = "示",
["沶"] = "示",
["鞮"] = "是",
["隄"] = "是",
["堤"] = "是",
["鍉"] = "是",
["蝭"] = "是",
["醍"] = "是",
["緹"] = "是",
["提"] = "是",
["瑅"] = "是",
["題"] = "是",
["媞"] = "是",
["褆"] = "是",
["禔"] = "是",
["騠"] = "是",
["趧"] = "是",
["鯷"] = "是",
["踶"] = "是",
["徥"] = "是",
["匙"] = "是",
["是"] = "是",
["諟"] = "是",
["翨"] = "是",
["睼"] = "是",
["寔"] = "是",
["湜"] = "是",
["遈"] = "是",
["噬"] = "筮",
["筮"] = "筮",
["簭"] = "筮",
["澨"] = "筮",
["遾"] = "筮",
["奭"] = "奭",
["襫"] = "奭",
["杽"] = "手",
["手"] = "手",
["守"] = "守",
["狩"] = "守",
["道"] = "首",
["導"] = "首",
["首"] = "首",
["受"] = "受",
["綬"] = "受",
["授"] = "受",
["禱"] = "壽",
["擣"] = "壽",
["檮"] = "壽",
["壔"] = "壽",
["懤"] = "壽",
["濤"] = "壽",
["燾"] = "壽",
["翿"] = "壽",
["幬"] = "壽",
["儔"] = "壽",
["譸"] = "壽",
["籌"] = "壽",
["疇"] = "壽",
["躊"] = "壽",
["燽"] = "壽",
["薵"] = "壽",
["魗"] = "壽",
["醻"] = "壽",
["壽"] = "壽",
["璹"] = "壽",
["鑄"] = "壽",
["獸"] = "嘼",
["嘼"] = "嘼",
["吺"] = "殳",
["祋"] = "殳",
["投"] = "殳",
["骰"] = "殳",
["酘"] = "殳",
["坄"] = "殳",
["殳"] = "殳",
["杸"] = "殳",
["椒"] = "尗",
["茮"] = "尗",
["踧"] = "尗",
["蔋"] = "尗",
["惄"] = "尗",
["戚"] = "尗",
["慼"] = "尗",
["鏚"] = "尗",
["慽"] = "尗",
["磩"] = "尗",
["寂"] = "尗",
["嘁"] = "尗",
["墄"] = "尗",
["摵"] = "尗",
["督"] = "尗",
["錖"] = "尗",
["裻"] = "尗",
["傶"] = "尗",
["蹙"] = "尗",
["槭"] = "尗",
["縬"] = "尗",
["顣"] = "尗",
["敊"] = "尗",
["琡"] = "尗",
["俶"] = "尗",
["埱"] = "尗",
["淑"] = "尗",
["婌"] = "尗",
["尗"] = "尗",
["叔"] = "尗",
["掓"] = "尗",
["菽"] = "尗",
["鮛"] = "尗",
["疋"] = "疋",
["蝑"] = "疋",
["壻"] = "疋",
["婿"] = "疋",
["胥"] = "疋",
["稰"] = "疋",
["楈"] = "疋",
["諝"] = "疋",
["湑"] = "疋",
["揟"] = "疋",
["醑"] = "疋",
["糈"] = "疋",
["楚"] = "疋",
["礎"] = "疋",
["憷"] = "疋",
["齼"] = "疋",
["濋"] = "疋",
["儊"] = "疋",
["綀"] = "疋",
["疎"] = "疋",
["疏"] = "疋",
["蔬"] = "疋",
["梳"] = "疋",
["熟"] = "孰",
["孰"] = "孰",
["塾"] = "孰",
["鼠"] = "鼠",
["癙"] = "鼠",
["襡"] = "蜀",
["噣"] = "蜀",
["斣"] = "蜀",
["歜"] = "蜀",
["斀"] = "蜀",
["孎"] = "蜀",
["濁"] = "蜀",
["鐲"] = "蜀",
["鸀"] = "蜀",
["擉"] = "蜀",
["獨"] = "蜀",
["髑"] = "蜀",
["韣"] = "蜀",
["斸"] = "蜀",
["钃"] = "蜀",
["欘"] = "蜀",
["躅"] = "蜀",
["蠋"] = "蜀",
["燭"] = "蜀",
["囑"] = "蜀",
["矚"] = "蜀",
["屬"] = "蜀",
["属"] = "蜀",
["蠾"] = "蜀",
["觸"] = "蜀",
["臅"] = "蜀",
["觕"] = "蜀",
["蜀"] = "蜀",
["訹"] = "朮",
["怵"] = "朮",
["朮"] = "朮",
["炢"] = "朮",
["術"] = "朮",
["述"] = "朮",
["秫"] = "朮",
["沭"] = "朮",
["蒁"] = "朮",
["涑"] = "束",
["鏉"] = "束",
["摗"] = "束",
["駷"] = "束",
["嗽"] = "束",
["瘶"] = "束",
["欶"] = "束",
["漱"] = "束",
["捒"] = "束",
["悚"] = "束",
["竦"] = "束",
["娕"] = "束",
["梀"] = "束",
["速"] = "束",
["餗"] = "束",
["殐"] = "束",
["遬"] = "束",
["蔌"] = "束",
["樕"] = "束",
["藗"] = "束",
["誎"] = "束",
["束"] = "束",
["褯"] = "庶",
["遮"] = "庶",
["蔗"] = "庶",
["鷓"] = "庶",
["樜"] = "庶",
["蟅"] = "庶",
["嗻"] = "庶",
["鍍"] = "庶",
["度"] = "庶",
["渡"] = "庶",
["庶"] = "庶",
["剫"] = "庶",
["踱"] = "庶",
["喥"] = "庶",
["謶"] = "庶",
["席"] = "庶",
["蓆"] = "庶",
["墌"] = "庶",
["摭"] = "庶",
["蹠"] = "庶",
["涮"] = "刷",
["刷"] = "刷",
["蓑"] = "衰",
["缞"] = "衰",
["衰"] = "衰",
["榱"] = "衰",
["雙"] = "雙",
["艭"] = "雙",
["愯"] = "雙",
["㩳"] = "雙",
["摤"] = "爽",
["磢"] = "爽",
["漺"] = "爽",
["傸"] = "爽",
["鷞"] = "爽",
["騻"] = "爽",
["爽"] = "爽",
["塽"] = "爽",
["樉"] = "爽",
["沝"] = "水",
["水"] = "水",
["私"] = "厶",
["厶"] = "厶",
["司"] = "司",
["伺"] = "司",
["覗"] = "司",
["笥"] = "司",
["詞"] = "司",
["祠"] = "司",
["柌"] = "司",
["嗣"] = "司",
["孠"] = "司",
["飼"] = "司",
["呞"] = "司",
["擨"] = "虒",
["搋"] = "虒",
["鷈"] = "虒",
["謕"] = "虒",
["嗁"] = "虒",
["蹏"] = "虒",
["鼶"] = "虒",
["遞"] = "虒",
["虒"] = "虒",
["榹"] = "虒",
["磃"] = "虒",
["傂"] = "虒",
["螔"] = "虒",
["禠"] = "虒",
["褫"] = "虒",
["篪"] = "虒",
["歋"] = "虒",
["嘶"] = "斯",
["撕"] = "斯",
["斯"] = "斯",
["廝"] = "斯",
["蟴"] = "斯",
["燍"] = "斯",
["鐁"] = "斯",
["凘"] = "斯",
["澌"] = "斯",
["絲"] = "絲",
["蕬"] = "絲",
["鷥"] = "絲",
["巳"] = "巳",
["祀"] = "巳",
["汜"] = "巳",
["戺"] = "巳",
["起"] = "巳",
["熙"] = "巳",
["媐"] = "巳",
["圯"] = "巳",
["异"] = "巳",
["巸"] = "巳",
["訵"] = "四",
["四"] = "四",
["泗"] = "四",
["駟"] = "四",
["柶"] = "四",
["牭"] = "四",
["呬"] = "四",
["等"] = "寺",
["待"] = "寺",
["寺"] = "寺",
["持"] = "寺",
["峙"] = "寺",
["痔"] = "寺",
["跱"] = "寺",
["歭"] = "寺",
["洔"] = "寺",
["畤"] = "寺",
["秲"] = "寺",
["庤"] = "寺",
["時"] = "寺",
["鰣"] = "寺",
["塒"] = "寺",
["蒔"] = "寺",
["榯"] = "寺",
["恃"] = "寺",
["侍"] = "寺",
["詩"] = "寺",
["邿"] = "寺",
["特"] = "寺",
["浨"] = "宋",
["俕"] = "宋",
["宋"] = "宋",
["㮴"] = "叟",
["艘"] = "叟",
["嫂"] = "叟",
["瞍"] = "叟",
["謏"] = "叟",
["叜"] = "叟",
["叟"] = "叟",
["傁"] = "叟",
["廋"] = "叟",
["醙"] = "叟",
["遚"] = "叟",
["餿"] = "叟",
["搜"] = "叟",
["颼"] = "叟",
["溲"] = "叟",
["鎪"] = "叟",
["獀"] = "叟",
["鄋"] = "叟",
["螋"] = "叟",
["騪"] = "叟",
["瘦"] = "叟",
["洬"] = "夙",
["夙"] = "夙",
["素"] = "素",
["傃"] = "素",
["嗉"] = "素",
["膆"] = "素",
["塐"] = "素",
["宿"] = "宿",
["蓿"] = "宿",
["縮"] = "宿",
["樎"] = "宿",
["蹜"] = "宿",
["摍"] = "宿",
["粟"] = "粟",
["憟"] = "粟",
["簫"] = "肅",
["蕭"] = "肅",
["瀟"] = "肅",
["潚"] = "肅",
["彇"] = "肅",
["蟰"] = "肅",
["橚"] = "肅",
["嘯"] = "肅",
["歗"] = "肅",
["熽"] = "肅",
["繡"] = "肅",
["鏽"] = "肅",
["肅"] = "肅",
["鷫"] = "肅",
["驌"] = "肅",
["鱐"] = "肅",
["璛"] = "肅",
["蒜"] = "祘",
["祘"] = "祘",
["纂"] = "算",
["繤"] = "算",
["算"] = "算",
["匴"] = "算",
["篹"] = "算",
["篡"] = "算",
["攥"] = "算",
["隊"] = "遂",
["邃"] = "遂",
["譢"] = "遂",
["遂"] = "遂",
["隧"] = "遂",
["燧"] = "遂",
["襚"] = "遂",
["旞"] = "遂",
["璲"] = "遂",
["檖"] = "遂",
["澻"] = "遂",
["鐆"] = "遂",
["鐩"] = "遂",
["穟"] = "遂",
["墜"] = "遂",
["噦"] = "歲",
["翽"] = "歲",
["鐬"] = "歲",
["濊"] = "歲",
["歲"] = "歲",
["劌"] = "歲",
["顪"] = "歲",
["穢"] = "歲",
["薉"] = "歲",
["獩"] = "歲",
["饖"] = "歲",
["奯"] = "歲",
["孫"] = "孫",
["猻"] = "孫",
["蓀"] = "孫",
["搎"] = "孫",
["遜"] = "孫",
["愻"] = "孫",
["飧"] = "飧",
["蕵"] = "飧",
["隼"] = "隼",
["榫"] = "隼",
["准"] = "隼",
["準"] = "隼",
["索"] = "索",
["溹"] = "索",
["惢"] = "惢",
["蕊"] = "惢",
["蘂"] = "惢",
["繠"] = "惢",
["鎖"] = "瑣",
["瑣"] = "瑣",
["溑"] = "瑣",
["佗"] = "它",
["拕"] = "它",
["它"] = "它",
["蛇"] = "它",
["袉"] = "它",
["鴕"] = "它",
["駝"] = "它",
["紽"] = "它",
["鮀"] = "它",
["陀"] = "它",
["沱"] = "它",
["跎"] = "它",
["詑"] = "它",
["酡"] = "它",
["迱"] = "它",
["舵"] = "它",
["柁"] = "它",
["鉈"] = "它",
["傝"] = "蹋",
["搨"] = "蹋",
["蹹"] = "蹋",
["榻"] = "蹋",
["遢"] = "蹋",
["鰨"] = "蹋",
["毾"] = "蹋",
["塌"] = "蹋",
["溻"] = "蹋",
["蹋"] = "蹋",
["躢"] = "蹋",
["闒"] = "蹋",
["誩"] = "譶",
["譶"] = "譶",
["霅"] = "譶",
["胎"] = "台",
["台"] = "台",
["邰"] = "台",
["鮐"] = "台",
["孡"] = "台",
["苔"] = "台",
["抬"] = "台",
["駘"] = "台",
["炱"] = "台",
["菭"] = "台",
["跆"] = "台",
["殆"] = "台",
["怠"] = "台",
["迨"] = "台",
["紿"] = "台",
["詒"] = "台",
["軩"] = "台",
["咍"] = "台",
["佁"] = "台",
["枲"] = "台",
["辝"] = "台",
["鈶"] = "台",
["笞"] = "台",
["齝"] = "台",
["眙"] = "台",
["治"] = "台",
["始"] = "台",
["怡"] = "台",
["貽"] = "台",
["飴"] = "台",
["瓵"] = "台",
["珆"] = "台",
["懛"] = "臺",
["儓"] = "臺",
["臺"] = "臺",
["擡"] = "臺",
["薹"] = "臺",
["嬯"] = "臺",
["檯"] = "臺",
["籉"] = "臺",
["鷣"] = "覃",
["撢"] = "覃",
["憛"] = "覃",
["潭"] = "覃",
["譚"] = "覃",
["覃"] = "覃",
["鐔"] = "覃",
["藫"] = "覃",
["橝"] = "覃",
["蟫"] = "覃",
["燂"] = "覃",
["醰"] = "覃",
["禫"] = "覃",
["嘾"] = "覃",
["贉"] = "覃",
["瞫"] = "覃",
["蕈"] = "覃",
["鱏"] = "覃",
["簟"] = "覃",
["驔"] = "覃",
["磹"] = "覃",
["曇"] = "曇",
["壜"] = "曇",
["炭"] = "炭",
["湠"] = "炭",
["弢"] = "弢",
["詜"] = "弢",
["掏"] = "匋",
["蜪"] = "匋",
["陶"] = "匋",
["萄"] = "匋",
["啕"] = "匋",
["淘"] = "匋",
["騊"] = "匋",
["匋"] = "匋",
["祹"] = "匋",
["綯"] = "匋",
["替"] = "替",
["暜"] = "替",
["僣"] = "替",
["添"] = "天",
["忝"] = "天",
["悿"] = "天",
["舔"] = "天",
["菾"] = "天",
["天"] = "天",
["吞"] = "天",
["祆"] = "天",
["蚕"] = "天",
["田"] = "田",
["佃"] = "田",
["畋"] = "田",
["畇"] = "田",
["鈿"] = "田",
["沺"] = "田",
["甸"] = "田",
["銛"] = "甜",
["栝"] = "甜",
["餂"] = "甜",
["恬"] = "甜",
["湉"] = "甜",
["甜"] = "甜",
["狧"] = "甜",
["蜓"] = "廷",
["涏"] = "廷",
["綎"] = "廷",
["珽"] = "廷",
["脡"] = "廷",
["侹"] = "廷",
["頲"] = "廷",
["廷"] = "廷",
["庭"] = "廷",
["鼮"] = "廷",
["莛"] = "廷",
["筳"] = "廷",
["霆"] = "廷",
["娗"] = "廷",
["挺"] = "廷",
["艇"] = "廷",
["鋌"] = "廷",
["梃"] = "廷",
["誔"] = "廷",
["鮦"] = "同",
["侗"] = "同",
["恫"] = "同",
["痌"] = "同",
["同"] = "同",
["仝"] = "同",
["銅"] = "同",
["桐"] = "同",
["峒"] = "同",
["硐"] = "同",
["筒"] = "同",
["洞"] = "同",
["烔"] = "同",
["挏"] = "同",
["酮"] = "同",
["鲖"] = "同",
["眮"] = "同",
["衕"] = "同",
["哃"] = "同",
["絧"] = "同",
["姛"] = "同",
["詷"] = "同",
["胴"] = "同",
["駧"] = "同",
["迵"] = "同",
["戙"] = "同",
["禿"] = "禿",
["鵚"] = "禿",
["突"] = "突",
["宊"] = "突",
["揬"] = "突",
["鼵"] = "突",
["葖"] = "突",
["鶟"] = "突",
["堗"] = "突",
["啚"] = "圖",
["圖"] = "圖",
["社"] = "土",
["肚"] = "土",
["土"] = "土",
["吐"] = "土",
["芏"] = "土",
["杜"] = "土",
["靯"] = "土",
["荰"] = "土",
["菟"] = "兔",
["兔"] = "兔",
["鵵"] = "兔",
["梚"] = "兔",
["腿"] = "退",
["退"] = "退",
["褪"] = "退",
["豚"] = "豚",
["遯"] = "豚",
["妥"] = "妥",
["鵎"] = "妥",
["挼"] = "妥",
["骽"] = "妥",
["脮"] = "妥",
["餒"] = "妥",
["浽"] = "妥",
["娞"] = "妥",
["鮾"] = "妥",
["綏"] = "妥",
["荽"] = "妥",
["鋖"] = "妥",
["桵"] = "妥",
["瓦"] = "瓦",
["邷"] = "瓦",
["骫"] = "丸",
["丸"] = "丸",
["紈"] = "丸",
["芄"] = "丸",
["汍"] = "丸",
["肒"] = "丸",
["糲"] = "萬",
["犡"] = "萬",
["噧"] = "萬",
["邁"] = "萬",
["勱"] = "萬",
["蠆"] = "萬",
["厲"] = "萬",
["勵"] = "萬",
["礪"] = "萬",
["蠣"] = "萬",
["蠇"] = "萬",
["癘"] = "萬",
["濿"] = "萬",
["櫔"] = "萬",
["巁"] = "萬",
["贎"] = "萬",
["萬"] = "萬",
["忙"] = "亡",
["芒"] = "亡",
["茫"] = "亡",
["恾"] = "亡",
["吂"] = "亡",
["汒"] = "亡",
["朚"] = "亡",
["邙"] = "亡",
["杗"] = "亡",
["荒"] = "亡",
["肓"] = "亡",
["衁"] = "亡",
["巟"] = "亡",
["詤"] = "亡",
["慌"] = "亡",
["謊"] = "亡",
["喪"] = "亡",
["亡"] = "亡",
["望"] = "亡",
["莣"] = "亡",
["朢"] = "亡",
["鋩"] = "亡",
["硭"] = "亡",
["忘"] = "亡",
["网"] = "亡",
["罔"] = "亡",
["蛧"] = "亡",
["網"] = "亡",
["輞"] = "亡",
["棢"] = "亡",
["惘"] = "亡",
["菵"] = "亡",
["誷"] = "亡",
["魍"] = "亡",
["妄"] = "亡",
["盲"] = "亡",
["蝱"] = "亡",
["虻"] = "亡",
["氓"] = "亡",
["甿"] = "亡",
["皇"] = "王",
["惶"] = "王",
["遑"] = "王",
["堭"] = "王",
["煌"] = "王",
["餭"] = "王",
["騜"] = "王",
["艎"] = "王",
["隍"] = "王",
["湟"] = "王",
["徨"] = "王",
["篁"] = "王",
["蝗"] = "王",
["凰"] = "王",
["偟"] = "王",
["媓"] = "王",
["韹"] = "王",
["葟"] = "王",
["皝"] = "王",
["汪"] = "王",
["尪"] = "王",
["迋"] = "王",
["逛"] = "王",
["誑"] = "王",
["匡"] = "王",
["筐"] = "王",
["框"] = "王",
["眶"] = "王",
["誆"] = "王",
["邼"] = "王",
["恇"] = "王",
["劻"] = "王",
["洭"] = "王",
["軭"] = "王",
["狂"] = "王",
["軖"] = "王",
["鵟"] = "王",
["俇"] = "王",
["王"] = "王",
["蚟"] = "王",
["彺"] = "王",
["旺"] = "王",
["諻"] = "王",
["喤"] = "王",
["瑝"] = "王",
["鍠"] = "王",
["揘"] = "王",
["暀"] = "往",
["誑"] = "往",
["枉"] = "往",
["往"] = "往",
["鮠"] = "危",
["峞"] = "危",
["頠"] = "危",
["詭"] = "危",
["垝"] = "危",
["陒"] = "危",
["觤"] = "危",
["恑"] = "危",
["蛫"] = "危",
["祪"] = "危",
["洈"] = "危",
["姽"] = "危",
["桅"] = "危",
["佹"] = "危",
["跪"] = "危",
["危"] = "危",
["峗"] = "危",
["硊"] = "危",
["卼"] = "危",
["崴"] = "威",
["威"] = "威",
["葳"] = "威",
["隇"] = "威",
["蝛"] = "威",
["鰄"] = "威",
["楲"] = "威",
["矀"] = "微",
["覹"] = "微",
["黴"] = "微",
["薇"] = "微",
["媺"] = "微",
["微"] = "微",
["溦"] = "微",
["癓"] = "微",
["徽"] = "微",
["幑"] = "微",
["禕"] = "韋",
["郼"] = "韋",
["褘"] = "韋",
["諱"] = "韋",
["媁"] = "韋",
["幃"] = "韋",
["違"] = "韋",
["圍"] = "韋",
["韋"] = "韋",
["闈"] = "韋",
["湋"] = "韋",
["鍏"] = "韋",
["潿"] = "韋",
["韙"] = "韋",
["煒"] = "韋",
["暐"] = "韋",
["偉"] = "韋",
["瑋"] = "韋",
["葦"] = "韋",
["椲"] = "韋",
["韡"] = "韋",
["愇"] = "韋",
["緯"] = "韋",
["匯"] = "唯",
["擓"] = "唯",
["淮"] = "唯",
["睢"] = "唯",
["嶉"] = "唯",
["趡"] = "唯",
["踓"] = "唯",
["雖"] = "唯",
["濉"] = "唯",
["倠"] = "唯",
["婎"] = "唯",
["蓶"] = "唯",
["維"] = "唯",
["惟"] = "唯",
["唯"] = "唯",
["濰"] = "唯",
["琟"] = "唯",
["鷕"] = "唯",
["帷"] = "唯",
["鵻"] = "唯",
["譌"] = "爲",
["嬀"] = "爲",
["潙"] = "爲",
["蟡"] = "爲",
["僞"] = "爲",
["噅"] = "爲",
["撝"] = "爲",
["爲"] = "爲",
["鄬"] = "爲",
["蔿"] = "爲",
["儰"] = "爲",
["寪"] = "爲",
["蘤"] = "爲",
["娓"] = "尾",
["尾"] = "尾",
["浘"] = "尾",
["矮"] = "委",
["躷"] = "委",
["捼"] = "委",
["倭"] = "委",
["涹"] = "委",
["踒"] = "委",
["餧"] = "委",
["諉"] = "委",
["痿"] = "委",
["萎"] = "委",
["逶"] = "委",
["覣"] = "委",
["蜲"] = "委",
["委"] = "委",
["緌"] = "委",
["寐"] = "未",
["魅"] = "未",
["鬽"] = "未",
["昧"] = "未",
["妹"] = "未",
["眛"] = "未",
["沬"] = "未",
["未"] = "未",
["味"] = "未",
["鮇"] = "未",
["菋"] = "未",
["煨"] = "畏",
["偎"] = "畏",
["隈"] = "畏",
["椳"] = "畏",
["鰃"] = "畏",
["渨"] = "畏",
["葨"] = "畏",
["揋"] = "畏",
["猥"] = "畏",
["嵔"] = "畏",
["鍡"] = "畏",
["碨"] = "畏",
["腲"] = "畏",
["餵"] = "畏",
["畏"] = "畏",
["喟"] = "胃",
["胃"] = "胃",
["謂"] = "胃",
["媦"] = "胃",
["蝟"] = "胃",
["渭"] = "胃",
["煟"] = "胃",
["緭"] = "胃",
["尉"] = "尉",
["熨"] = "尉",
["慰"] = "尉",
["罻"] = "尉",
["犚"] = "尉",
["蔚"] = "尉",
["螱"] = "尉",
["褽"] = "尉",
["鳚"] = "尉",
["衞"] = "衛",
["讏"] = "衛",
["躛"] = "衛",
["媼"] = "𥁕",
["蝹"] = "𥁕",
["溫"] = "𥁕",
["𥁕"] = "𥁕",
["轀"] = "𥁕",
["薀"] = "𥁕",
["殟"] = "𥁕",
["豱"] = "𥁕",
["縕"] = "𥁕",
["韞"] = "𥁕",
["瘟"] = "𥁕",
["搵"] = "𥁕",
["氳"] = "𥁕",
["熅"] = "𥁕",
["馧"] = "𥁕",
["蒕"] = "𥁕",
["蘊"] = "𥁕",
["褞"] = "𥁕",
["醞"] = "𥁕",
["慍"] = "𥁕",
["膃"] = "𥁕",
["榲"] = "𥁕",
["嗢"] = "𥁕",
["旻"] = "文",
["旼"] = "文",
["汶"] = "文",
["忞"] = "文",
["盿"] = "文",
["枚"] = "文",
["玫"] = "文",
["玟"] = "文",
["文"] = "文",
["紋"] = "文",
["蚊"] = "文",
["雯"] = "文",
["彣"] = "文",
["馼"] = "文",
["鳼"] = "文",
["鼤"] = "文",
["抆"] = "文",
["紊"] = "文",
["莪"] = "我",
["哦"] = "我",
["娥"] = "我",
["峨"] = "我",
["峩"] = "我",
["鵝"] = "我",
["俄"] = "我",
["蛾"] = "我",
["睋"] = "我",
["涐"] = "我",
["誐"] = "我",
["硪"] = "我",
["我"] = "我",
["騀"] = "我",
["餓"] = "我",
["義"] = "我",
["儀"] = "我",
["轙"] = "我",
["檥"] = "我",
["蟻"] = "我",
["艤"] = "我",
["礒"] = "我",
["羛"] = "我",
["議"] = "我",
["犧"] = "我",
["曦"] = "我",
["羲"] = "我",
["巫"] = "巫",
["誣"] = "巫",
["莁"] = "巫",
["鵐"] = "巫",
["握"] = "屋",
["幄"] = "屋",
["偓"] = "屋",
["渥"] = "屋",
["齷"] = "屋",
["楃"] = "屋",
["喔"] = "屋",
["腛"] = "屋",
["媉"] = "屋",
["屋"] = "屋",
["剭"] = "屋",
["烏"] = "烏",
["嗚"] = "烏",
["鰞"] = "烏",
["歍"] = "烏",
["鎢"] = "烏",
["瑦"] = "烏",
["鄔"] = "烏",
["螐"] = "烏",
["隖"] = "烏",
["塢"] = "烏",
["溩"] = "烏",
["吳"] = "吳",
["蜈"] = "吳",
["鋘"] = "吳",
["麌"] = "吳",
["祦"] = "吳",
["誤"] = "吳",
["悞"] = "吳",
["娛"] = "吳",
["虞"] = "吳",
["澞"] = "吳",
["鸆"] = "吳",
["俁"] = "吳",
["噳"] = "吳",
["墲"] = "無",
["橅"] = "無",
["膴"] = "無",
["幠"] = "無",
["鄦"] = "無",
["撫"] = "無",
["無"] = "無",
["瞴"] = "無",
["蕪"] = "無",
["璑"] = "無",
["鷡"] = "無",
["譕"] = "無",
["憮"] = "無",
["舞"] = "無",
["廡"] = "無",
["嫵"] = "無",
["甒"] = "無",
["潕"] = "無",
["儛"] = "無",
["吾"] = "五",
["衙"] = "五",
["鼯"] = "五",
["浯"] = "五",
["珸"] = "五",
["郚"] = "五",
["齬"] = "五",
["鯃"] = "五",
["娪"] = "五",
["梧"] = "五",
["峿"] = "五",
["五"] = "五",
["伍"] = "五",
["寤"] = "五",
["啎"] = "五",
["晤"] = "五",
["悟"] = "五",
["逜"] = "五",
["窹"] = "五",
["捂"] = "五",
["鋙"] = "五",
["語"] = "五",
["圄"] = "五",
["敔"] = "五",
["卸"] = "午",
["汻"] = "午",
["滸"] = "午",
["午"] = "午",
["仵"] = "午",
["旿"] = "午",
["忤"] = "午",
["迕"] = "午",
["杵"] = "午",
["籞"] = "午",
["蘌"] = "午",
["篽"] = "午",
["禦"] = "午",
["許"] = "午",
["御"] = "午",
["賦"] = "武",
["陚"] = "武",
["武"] = "武",
["鵡"] = "武",
["珷"] = "武",
["碔"] = "武",
["娬"] = "武",
["虺"] = "兀",
["豗"] = "兀",
["鼿"] = "兀",
["虫"] = "兀",
["髡"] = "兀",
["軏"] = "兀",
["扤"] = "兀",
["兀"] = "兀",
["杌"] = "兀",
["屼"] = "兀",
["矹"] = "兀",
["脗"] = "勿",
["吻"] = "勿",
["刎"] = "勿",
["伆"] = "勿",
["勽"] = "勿",
["沕"] = "勿",
["忽"] = "勿",
["昒"] = "勿",
["惚"] = "勿",
["匫"] = "勿",
["笏"] = "勿",
["曶"] = "勿",
["淴"] = "勿",
["物"] = "勿",
["勿"] = "勿",
["芴"] = "勿",
["岉"] = "勿",
["茂"] = "戊",
["戊"] = "戊",
["夕"] = "夕",
["汐"] = "夕",
["穸"] = "夕",
["盻"] = "兮",
["兮"] = "兮",
["枍"] = "兮",
["粞"] = "西",
["洒"] = "西",
["西"] = "西",
["卤"] = "西",
["卥"] = "西",
["栖"] = "西",
["茜"] = "西",
["哂"] = "西",
["桸"] = "希",
["郗"] = "希",
["絺"] = "希",
["脪"] = "希",
["瓻"] = "希",
["希"] = "希",
["晞"] = "希",
["莃"] = "希",
["鵗"] = "希",
["稀"] = "希",
["睎"] = "希",
["豨"] = "希",
["悕"] = "希",
["俙"] = "希",
["欷"] = "希",
["浠"] = "希",
["唏"] = "希",
["借"] = "昔",
["唶"] = "昔",
["藉"] = "昔",
["躤"] = "昔",
["蜡"] = "昔",
["齰"] = "昔",
["醋"] = "昔",
["錯"] = "昔",
["措"] = "昔",
["厝"] = "昔",
["逪"] = "昔",
["剒"] = "昔",
["鵲"] = "昔",
["碏"] = "昔",
["踖"] = "昔",
["趞"] = "昔",
["皵"] = "昔",
["舄"] = "昔",
["斮"] = "昔",
["簎"] = "昔",
["諎"] = "昔",
["矠"] = "昔",
["庴"] = "昔",
["籍"] = "昔",
["耤"] = "昔",
["猎"] = "昔",
["昔"] = "昔",
["惜"] = "昔",
["腊"] = "昔",
["焟"] = "昔",
["棤"] = "昔",
["菥"] = "析",
["蜤"] = "析",
["析"] = "析",
["皙"] = "析",
["蜥"] = "析",
["淅"] = "析",
["惁"] = "析",
["晰"] = "析",
["厗"] = "屖",
["屖"] = "屖",
["遟"] = "屖",
["謘"] = "屖",
["稺"] = "屖",
["息"] = "息",
["熄"] = "息",
["媳"] = "息",
["鄎"] = "息",
["瘜"] = "息",
["蒠"] = "息",
["僁"] = "悉",
["悉"] = "悉",
["蟋"] = "悉",
["窸"] = "悉",
["摨"] = "犀",
["犀"] = "犀",
["遲"] = "犀",
["墀"] = "犀",
["橀"] = "醯",
["醯"] = "醯",
["謑"] = "奚",
["膎"] = "奚",
["鞵"] = "奚",
["榽"] = "奚",
["鷄"] = "奚",
["雞"] = "奚",
["谿"] = "奚",
["嵠"] = "奚",
["溪"] = "奚",
["磎"] = "奚",
["螇"] = "奚",
["鸂"] = "奚",
["奚"] = "奚",
["豯"] = "奚",
["徯"] = "奚",
["蹊"] = "奚",
["騱"] = "奚",
["傒"] = "奚",
["鼷"] = "奚",
["蒵"] = "奚",
["貕"] = "奚",
["慀"] = "奚",
["摺"] = "習",
["磖"] = "習",
["褶"] = "習",
["慴"] = "習",
["霫"] = "習",
["習"] = "習",
["鰼"] = "習",
["騽"] = "習",
["飁"] = "習",
["槢"] = "習",
["熠"] = "習",
["簁"] = "徙",
["徙"] = "徙",
["褷"] = "徙",
["屣"] = "徙",
["縰"] = "徙",
["蓰"] = "徙",
["嘻"] = "喜",
["嬉"] = "喜",
["禧"] = "喜",
["熹"] = "喜",
["僖"] = "喜",
["歖"] = "喜",
["譆"] = "喜",
["瞦"] = "喜",
["喜"] = "喜",
["憙"] = "喜",
["蟢"] = "喜",
["糦"] = "喜",
["饎"] = "喜",
["係"] = "系",
["系"] = "系",
["寫"] = "舄",
["瀉"] = "舄",
["舄"] = "舄",
["獡"] = "舄",
["潟"] = "舄",
["磶"] = "舄",
["蕮"] = "舄",
["虩"] = "隙",
["隙"] = "隙",
["丅"] = "下",
["下"] = "下",
["芐"] = "下",
["榎"] = "夏",
["廈"] = "夏",
["嗄"] = "夏",
["夏"] = "夏",
["洗"] = "先",
["先"] = "先",
["銑"] = "先",
["跣"] = "先",
["毨"] = "先",
["姺"] = "先",
["筅"] = "先",
["冼"] = "先",
["箲"] = "先",
["駪"] = "先",
["兟"] = "先",
["詵"] = "先",
["侁"] = "先",
["鮮"] = "鮮",
["廯"] = "鮮",
["癬"] = "鮮",
["蘚"] = "鮮",
["感"] = "咸",
["鱤"] = "咸",
["顑"] = "咸",
["轗"] = "咸",
["撼"] = "咸",
["憾"] = "咸",
["喊"] = "咸",
["緘"] = "咸",
["瑊"] = "咸",
["黬"] = "咸",
["減"] = "咸",
["羬"] = "咸",
["麙"] = "咸",
["咸"] = "咸",
["鹹"] = "咸",
["醎"] = "咸",
["諴"] = "咸",
["椷"] = "咸",
["輱"] = "咸",
["鍼"] = "咸",
["箴"] = "咸",
["葴"] = "咸",
["鱵"] = "咸",
["閑"] = "閑",
["嫻"] = "閑",
["鷴"] = "閑",
["顯"] = "顯",
["韅"] = "顯",
["萏"] = "臽",
["窞"] = "臽",
["惂"] = "臽",
["輡"] = "臽",
["錎"] = "臽",
["埳"] = "臽",
["臽"] = "臽",
["淊"] = "臽",
["欿"] = "臽",
["蜭"] = "臽",
["啗"] = "臽",
["鵮"] = "臽",
["餡"] = "臽",
["陷"] = "臽",
["爓"] = "臽",
["諂"] = "臽",
["讇"] = "臽",
["閻"] = "臽",
["焰"] = "臽",
["壛"] = "臽",
["櫩"] = "臽",
["燄"] = "臽",
["掐"] = "臽",
["縣"] = "縣",
["懸"] = "縣",
["相"] = "相",
["廂"] = "相",
["湘"] = "相",
["緗"] = "相",
["箱"] = "相",
["葙"] = "相",
["想"] = "相",
["霜"] = "相",
["孀"] = "相",
["鸘"] = "相",
["驦"] = "相",
["香"] = "香",
["萫"] = "香",
["曏"] = "鄉",
["鄉"] = "鄉",
["薌"] = "鄉",
["膷"] = "鄉",
["響"] = "鄉",
["饗"] = "鄉",
["蠁"] = "鄉",
["嚮"] = "鄉",
["卿"] = "鄉",
["囊"] = "襄",
["蠰"] = "襄",
["曩"] = "襄",
["灢"] = "襄",
["儾"] = "襄",
["孃"] = "襄",
["瓤"] = "襄",
["鑲"] = "襄",
["釀"] = "襄",
["瓖"] = "襄",
["驤"] = "襄",
["襄"] = "襄",
["纕"] = "襄",
["忀"] = "襄",
["欀"] = "襄",
["饟"] = "襄",
["攘"] = "襄",
["禳"] = "襄",
["穰"] = "襄",
["躟"] = "襄",
["瀼"] = "襄",
["獽"] = "襄",
["儴"] = "襄",
["蘘"] = "襄",
["鬤"] = "襄",
["勷"] = "襄",
["壤"] = "襄",
["嚷"] = "襄",
["讓"] = "襄",
["懹"] = "襄",
["攮"] = "襄",
["晌"] = "向",
["餉"] = "向",
["向"] = "向",
["珦"] = "向",
["潒"] = "象",
["像"] = "象",
["象"] = "象",
["橡"] = "象",
["蟓"] = "象",
["襐"] = "象",
["勨"] = "象",
["鱌"] = "象",
["嶑"] = "象",
["梟"] = "梟",
["蟂"] = "梟",
["鄡"] = "梟",
["囂"] = "囂",
["虈"] = "囂",
["觘"] = "小",
["抄"] = "小",
["鈔"] = "小",
["訬"] = "小",
["炒"] = "小",
["吵"] = "小",
["耖"] = "小",
["仯"] = "小",
["眇"] = "小",
["渺"] = "小",
["杪"] = "小",
["秒"] = "小",
["篎"] = "小",
["妙"] = "小",
["玅"] = "小",
["釥"] = "小",
["小"] = "小",
["少"] = "小",
["麨"] = "小",
["尠"] = "小",
["梢"] = "肖",
["捎"] = "肖",
["筲"] = "肖",
["鞘"] = "肖",
["艄"] = "肖",
["蛸"] = "肖",
["髾"] = "肖",
["輎"] = "肖",
["旓"] = "肖",
["弰"] = "肖",
["鮹"] = "肖",
["綃"] = "肖",
["颵"] = "肖",
["莦"] = "肖",
["娋"] = "肖",
["稍"] = "肖",
["哨"] = "肖",
["揱"] = "肖",
["潲"] = "肖",
["睄"] = "肖",
["悄"] = "肖",
["俏"] = "肖",
["峭"] = "肖",
["陗"] = "肖",
["帩"] = "肖",
["誚"] = "肖",
["消"] = "肖",
["宵"] = "肖",
["霄"] = "肖",
["硝"] = "肖",
["銷"] = "肖",
["逍"] = "肖",
["魈"] = "肖",
["痟"] = "肖",
["焇"] = "肖",
["肖"] = "肖",
["韒"] = "肖",
["趙"] = "肖",
["箾"] = "肖",
["踃"] = "肖",
["削"] = "肖",
["矟"] = "肖",
["酵"] = "孝",
["窙"] = "孝",
["哮"] = "孝",
["庨"] = "孝",
["涍"] = "孝",
["孝"] = "孝",
["栛"] = "劦",
["珕"] = "劦",
["荔"] = "劦",
["脅"] = "劦",
["姭"] = "劦",
["搚"] = "劦",
["拹"] = "劦",
["愶"] = "劦",
["嗋"] = "劦",
["熁"] = "劦",
["協"] = "劦",
["勰"] = "劦",
["劦"] = "劦",
["叶"] = "劦",
["瀣"] = "韰",
["韰"] = "韰",
["薤"] = "韰",
["燮"] = "燮",
["躞"] = "燮",
["沁"] = "心",
["吣"] = "心",
["心"] = "心",
["杺"] = "心",
["伈"] = "心",
["親"] = "辛",
["寴"] = "辛",
["儭"] = "辛",
["瀙"] = "辛",
["辛"] = "辛",
["新"] = "辛",
["薪"] = "辛",
["襯"] = "辛",
["櫬"] = "辛",
["嚫"] = "辛",
["莘"] = "辛",
["騂"] = "辛",
["垶"] = "辛",
["觪"] = "辛",
["崽"] = "囟",
["偲"] = "囟",
["腮"] = "囟",
["鰓"] = "囟",
["揌"] = "囟",
["顋"] = "囟",
["愢"] = "囟",
["毢"] = "囟",
["諰"] = "囟",
["細"] = "囟",
["思"] = "囟",
["緦"] = "囟",
["罳"] = "囟",
["禗"] = "囟",
["楒"] = "囟",
["葸"] = "囟",
["恖"] = "囟",
["颸"] = "囟",
["囟"] = "囟",
["顖"] = "囟",
["毸"] = "囟",
["釁"] = "釁",
["舋"] = "釁",
["亹"] = "釁",
["斖"] = "釁",
["虋"] = "釁",
["璺"] = "釁",
["興"] = "興",
["臖"] = "興",
["嬹"] = "興",
["筕"] = "行",
["桁"] = "行",
["行"] = "行",
["胻"] = "行",
["衡"] = "行",
["蘅"] = "行",
["珩"] = "行",
["洐"] = "行",
["荇"] = "行",
["絎"] = "行",
["杏"] = "杏",
["莕"] = "杏",
["幸"] = "幸",
["倖"] = "幸",
["婞"] = "幸",
["涬"] = "幸",
["緈"] = "幸",
["悻"] = "幸",
["睪"] = "幸",
["酗"] = "凶",
["凶"] = "凶",
["匈"] = "凶",
["兇"] = "凶",
["訩"] = "凶",
["胸"] = "凶",
["胷"] = "凶",
["洶"] = "凶",
["恟"] = "凶",
["詾"] = "凶",
["怳"] = "兄",
["況"] = "兄",
["貺"] = "兄",
["况"] = "兄",
["兄"] = "兄",
["讂"] = "夐",
["矎"] = "夐",
["夐"] = "夐",
["瓊"] = "夐",
["藑"] = "夐",
["觼"] = "夐",
["茠"] = "休",
["烋"] = "休",
["恘"] = "休",
["休"] = "休",
["貅"] = "休",
["咻"] = "休",
["庥"] = "休",
["鵂"] = "休",
["髤"] = "休",
["髹"] = "休",
["透"] = "秀",
["莠"] = "秀",
["誘"] = "秀",
["蜏"] = "秀",
["琇"] = "秀",
["秀"] = "秀",
["銹"] = "秀",
["滅"] = "戌",
["搣"] = "戌",
["烕"] = "戌",
["戌"] = "戌",
["珬"] = "戌",
["銊"] = "戌",
["剨"] = "砉",
["湱"] = "砉",
["砉"] = "砉",
["盨"] = "須",
["須"] = "須",
["鬚"] = "須",
["嬃"] = "須",
["蕦"] = "須",
["羺"] = "需",
["獳"] = "需",
["擩"] = "需",
["譳"] = "需",
["懦"] = "需",
["糯"] = "需",
["需"] = "需",
["繻"] = "需",
["鑐"] = "需",
["儒"] = "需",
["濡"] = "需",
["襦"] = "需",
["嚅"] = "需",
["顬"] = "需",
["鱬"] = "需",
["嬬"] = "需",
["臑"] = "需",
["醹"] = "需",
["蠕"] = "需",
["孺"] = "需",
["畜"] = "畜",
["蓄"] = "畜",
["稸"] = "畜",
["滀"] = "畜",
["傗"] = "畜",
["鄐"] = "畜",
["慉"] = "畜",
["弦"] = "玄",
["絃"] = "玄",
["舷"] = "玄",
["痃"] = "玄",
["胘"] = "玄",
["蚿"] = "玄",
["伭"] = "玄",
["婱"] = "玄",
["玄"] = "玄",
["眩"] = "玄",
["玹"] = "玄",
["玆"] = "玄",
["詃"] = "玄",
["泫"] = "玄",
["鉉"] = "玄",
["炫"] = "玄",
["袨"] = "玄",
["衒"] = "玄",
["惤"] = "玄",
["旋"] = "旋",
["漩"] = "旋",
["璇"] = "旋",
["琁"] = "旋",
["蜁"] = "旋",
["嫙"] = "旋",
["鏇"] = "旋",
["縼"] = "旋",
["躠"] = "薛",
["嶭"] = "薛",
["櫱"] = "薛",
["薛"] = "薛",
["辥"] = "薛",
["孼"] = "薛",
["蘖"] = "薛",
["蠥"] = "薛",
["孽"] = "薛",
["糵"] = "薛",
["攪"] = "學",
["覺"] = "學",
["澩"] = "學",
["斆"] = "學",
["鱟"] = "學",
["嶨"] = "學",
["礐"] = "學",
["觷"] = "學",
["學"] = "學",
["鷽"] = "學",
["泬"] = "穴",
["坹"] = "穴",
["穴"] = "穴",
["袕"] = "穴",
["鴪"] = "穴",
["侐"] = "血",
["血"] = "血",
["恤"] = "血",
["卹"] = "血",
["賉"] = "血",
["欰"] = "血",
["洫"] = "血",
["殈"] = "血",
["櫄"] = "熏",
["薰"] = "熏",
["曛"] = "熏",
["勲"] = "熏",
["熏"] = "熏",
["燻"] = "熏",
["獯"] = "熏",
["纁"] = "熏",
["醺"] = "熏",
["臐"] = "熏",
["爋"] = "熏",
["襑"] = "尋",
["憳"] = "尋",
["蕁"] = "尋",
["撏"] = "尋",
["燖"] = "尋",
["尋"] = "尋",
["潯"] = "尋",
["樳"] = "尋",
["鄩"] = "尋",
["汛"] = "卂",
["軐"] = "卂",
["卂"] = "卂",
["訊"] = "卂",
["訙"] = "卂",
["迅"] = "卂",
["阠"] = "卂",
["扟"] = "卂",
["籸"] = "卂",
["蝨"] = "卂",
["撰"] = "巽",
["饌"] = "巽",
["譔"] = "巽",
["鐉"] = "巽",
["選"] = "巽",
["繏"] = "巽",
["潠"] = "巽",
["蟤"] = "巽",
["僎"] = "巽",
["襈"] = "巽",
["巽"] = "巽",
["簨"] = "巽",
["邪"] = "牙",
["衺"] = "牙",
["牙"] = "牙",
["芽"] = "牙",
["齖"] = "牙",
["呀"] = "牙",
["枒"] = "牙",
["雅"] = "牙",
["厊"] = "牙",
["庌"] = "牙",
["訝"] = "牙",
["迓"] = "牙",
["砑"] = "牙",
["犽"] = "牙",
["疨"] = "牙",
["岈"] = "牙",
["谺"] = "牙",
["颬"] = "牙",
["鴉"] = "牙",
["釾"] = "牙",
["賈"] = "襾",
["檟"] = "襾",
["價"] = "襾",
["覀"] = "襾",
["襾"] = "襾",
["椏"] = "亞",
["錏"] = "亞",
["鵶"] = "亞",
["啞"] = "亞",
["瘂"] = "亞",
["亞"] = "亞",
["婭"] = "亞",
["俹"] = "亞",
["稏"] = "亞",
["惡"] = "亞",
["噁"] = "亞",
["堊"] = "亞",
["蝁"] = "亞",
["嘕"] = "焉",
["嫣"] = "焉",
["焉"] = "焉",
["鄢"] = "焉",
["蔫"] = "焉",
["漹"] = "焉",
["傿"] = "焉",
["唌"] = "延",
["誕"] = "延",
["蜑"] = "延",
["蛋"] = "延",
["硟"] = "延",
["涎"] = "延",
["脠"] = "延",
["梴"] = "延",
["鋋"] = "延",
["埏"] = "延",
["挻"] = "延",
["鯅"] = "延",
["延"] = "延",
["筵"] = "延",
["蜒"] = "延",
["狿"] = "延",
["郔"] = "延",
["綖"] = "延",
["莚"] = "延",
["唁"] = "言",
["這"] = "言",
["言"] = "言",
["琂"] = "言",
["圁"] = "言",
["誾"] = "言",
["訔"] = "言",
["狺"] = "言",
["船"] = "沿",
["沿"] = "沿",
["鉛"] = "沿",
["倓"] = "炎",
["緂"] = "炎",
["毯"] = "炎",
["菼"] = "炎",
["裧"] = "炎",
["賧"] = "炎",
["睒"] = "炎",
["舕"] = "炎",
["談"] = "炎",
["郯"] = "炎",
["惔"] = "炎",
["錟"] = "炎",
["淡"] = "炎",
["痰"] = "炎",
["餤"] = "炎",
["啖"] = "炎",
["腅"] = "炎",
["剡"] = "炎",
["覢"] = "炎",
["掞"] = "炎",
["炎"] = "炎",
["琰"] = "炎",
["棪"] = "炎",
["扊"] = "炎",
["庵"] = "奄",
["鵪"] = "奄",
["菴"] = "奄",
["馣"] = "奄",
["晻"] = "奄",
["唵"] = "奄",
["黤"] = "奄",
["埯"] = "奄",
["淹"] = "奄",
["閹"] = "奄",
["崦"] = "奄",
["醃"] = "奄",
["掩"] = "奄",
["奄"] = "奄",
["罨"] = "奄",
["裺"] = "奄",
["俺"] = "奄",
["腌"] = "奄",
["殗"] = "奄",
["餣"] = "奄",
["弇"] = "弇",
["媕"] = "弇",
["黭"] = "弇",
["揜"] = "弇",
["渰"] = "弇",
["鞥"] = "弇",
["愆"] = "衍",
["衍"] = "衍",
["堰"] = "妟",
["躽"] = "妟",
["宴"] = "妟",
["蝘"] = "妟",
["偃"] = "妟",
["郾"] = "妟",
["鶠"] = "妟",
["褗"] = "妟",
["匽"] = "妟",
["鼴"] = "妟",
["鰋"] = "妟",
["揠"] = "妟",
["喭"] = "彦",
["鏟"] = "彦",
["産"] = "彦",
["簅"] = "彦",
["摌"] = "彦",
["嵼"] = "彦",
["滻"] = "彦",
["顏"] = "彦",
["楌"] = "彦",
["偐"] = "彦",
["齴"] = "彦",
["遃"] = "彦",
["嵃"] = "彦",
["彦"] = "彦",
["諺"] = "彦",
["猒"] = "猒",
["懕"] = "猒",
["饜"] = "猒",
["嬮"] = "猒",
["厭"] = "猒",
["黶"] = "猒",
["檿"] = "猒",
["魘"] = "猒",
["厴"] = "猒",
["擪"] = "猒",
["壓"] = "猒",
["靨"] = "猒",
["雁"] = "雁",
["鳫"] = "雁",
["鴈"] = "雁",
["贗"] = "雁",
["燕"] = "燕",
["驠"] = "燕",
["嬿"] = "燕",
["鷰"] = "燕",
["醼"] = "燕",
["讌"] = "燕",
["嚥"] = "燕",
["酀"] = "燕",
["獻"] = "鬳",
["甗"] = "鬳",
["巘"] = "鬳",
["讞"] = "鬳",
["鬳"] = "鬳",
["瓛"] = "鬳",
["囐"] = "鬳",
["齾"] = "鬳",
["钀"] = "鬳",
["豔"] = "豔",
["灩"] = "豔",
["鴦"] = "央",
["佒"] = "央",
["咉"] = "央",
["眏"] = "央",
["姎"] = "央",
["坱"] = "央",
["映"] = "央",
["泱"] = "央",
["盎"] = "央",
["駚"] = "央",
["軮"] = "央",
["醠"] = "央",
["央"] = "央",
["秧"] = "央",
["殃"] = "央",
["鞅"] = "央",
["鉠"] = "央",
["雵"] = "央",
["胦"] = "央",
["柍"] = "央",
["詇"] = "央",
["岟"] = "央",
["炴"] = "央",
["怏"] = "央",
["紻"] = "央",
["英"] = "央",
["瑛"] = "央",
["霙"] = "央",
["韺"] = "央",
["媖"] = "央",
["渶"] = "央",
["鶧"] = "央",
["楧"] = "央",
["暎"] = "央",
["样"] = "羊",
["佯"] = "羊",
["詳"] = "羊",
["洋"] = "羊",
["翔"] = "羊",
["庠"] = "羊",
["祥"] = "羊",
["痒"] = "羊",
["姜"] = "羊",
["羌"] = "羊",
["蜣"] = "羊",
["猐"] = "羊",
["唴"] = "羊",
["羊"] = "羊",
["徉"] = "羊",
["烊"] = "羊",
["蛘"] = "羊",
["眻"] = "羊",
["鴹"] = "羊",
["恙"] = "羊",
["羕"] = "羊",
["樣"] = "羊",
["漾"] = "羊",
["湯"] = "昜",
["踼"] = "昜",
["蝪"] = "昜",
["薚"] = "昜",
["簜"] = "昜",
["盪"] = "昜",
["偒"] = "昜",
["蕩"] = "昜",
["燙"] = "昜",
["啺"] = "昜",
["碭"] = "昜",
["婸"] = "昜",
["愓"] = "昜",
["璗"] = "昜",
["崵"] = "昜",
["逿"] = "昜",
["暢"] = "昜",
["畼"] = "昜",
["腸"] = "昜",
["場"] = "昜",
["傷"] = "昜",
["殤"] = "昜",
["觴"] = "昜",
["慯"] = "昜",
["禓"] = "昜",
["塲"] = "昜",
["陽"] = "昜",
["楊"] = "昜",
["揚"] = "昜",
["瘍"] = "昜",
["煬"] = "昜",
["鍚"] = "昜",
["暘"] = "昜",
["颺"] = "昜",
["昜"] = "昜",
["輰"] = "昜",
["敭"] = "昜",
["鰑"] = "昜",
["諹"] = "昜",
["瑒"] = "昜",
["鸉"] = "昜",
["餳"] = "昜",
["鯗"] = "養",
["養"] = "養",
["癢"] = "養",
["瀁"] = "養",
["幺"] = "幺",
["吆"] = "幺",
["笑"] = "夭",
["夭"] = "夭",
["镺"] = "夭",
["芺"] = "夭",
["妖"] = "夭",
["祅"] = "夭",
["枖"] = "夭",
["訞"] = "夭",
["殀"] = "夭",
["仸"] = "夭",
["妋"] = "夭",
["飫"] = "夭",
["沃"] = "夭",
["鋈"] = "夭",
["崤"] = "爻",
["郩"] = "爻",
["敎"] = "爻",
["較"] = "爻",
["肴"] = "爻",
["淆"] = "爻",
["倄"] = "爻",
["爻"] = "爻",
["餚"] = "爻",
["殽"] = "爻",
["笅"] = "爻",
["駁"] = "爻",
["撓"] = "垚",
["鐃"] = "垚",
["譊"] = "垚",
["橈"] = "垚",
["磽"] = "垚",
["墝"] = "垚",
["穘"] = "垚",
["顤"] = "垚",
["燒"] = "垚",
["饒"] = "垚",
["蟯"] = "垚",
["蕘"] = "垚",
["襓"] = "垚",
["繞"] = "垚",
["遶"] = "垚",
["嬈"] = "垚",
["趬"] = "垚",
["蹺"] = "垚",
["翹"] = "垚",
["澆"] = "垚",
["驍"] = "垚",
["僥"] = "垚",
["堯"] = "垚",
["垚"] = "垚",
["嶢"] = "垚",
["獟"] = "垚",
["膮"] = "垚",
["嘵"] = "垚",
["憢"] = "垚",
["曉"] = "垚",
["皢"] = "垚",
["搖"] = "謠",
["遙"] = "謠",
["瑤"] = "謠",
["徭"] = "謠",
["鰩"] = "謠",
["媱"] = "謠",
["傜"] = "謠",
["颻"] = "謠",
["窰"] = "謠",
["愮"] = "謠",
["鷂"] = "謠",
["榣"] = "謠",
["嗂"] = "謠",
["猺"] = "謠",
["謠"] = "謠",
["鎐"] = "謠",
["繇"] = "繇",
["蘨"] = "繇",
["櫾"] = "繇",
["滔"] = "舀",
["韜"] = "舀",
["縚"] = "舀",
["謟"] = "舀",
["慆"] = "舀",
["幍"] = "舀",
["槄"] = "舀",
["搯"] = "舀",
["瑫"] = "舀",
["稻"] = "舀",
["蹈"] = "舀",
["舀"] = "舀",
["腰"] = "要",
["要"] = "要",
["葽"] = "要",
["喓"] = "要",
["闄"] = "要",
["偠"] = "要",
["騕"] = "要",
["婹"] = "要",
["耶"] = "耶",
["椰"] = "耶",
["爺"] = "耶",
["瑘"] = "耶",
["鎁"] = "耶",
["他"] = "也",
["拖"] = "也",
["駞"] = "也",
["池"] = "也",
["灺"] = "也",
["鍦"] = "也",
["虵"] = "也",
["也"] = "也",
["忚"] = "也",
["髢"] = "也",
["杝"] = "也",
["肔"] = "也",
["馳"] = "也",
["阤"] = "也",
["施"] = "也",
["絁"] = "也",
["葹"] = "也",
["弛"] = "也",
["箷"] = "也",
["衪"] = "也",
["暆"] = "也",
["迆"] = "也",
["酏"] = "也",
["匜"] = "也",
["迤"] = "也",
["扡"] = "也",
["崺"] = "也",
["貤"] = "也",
["地"] = "也",
["洩"] = "曳",
["曳"] = "曳",
["拽"] = "曳",
["礏"] = "業",
["業"] = "業",
["鄴"] = "業",
["驜"] = "業",
["嶪"] = "業",
["鸈"] = "業",
["澲"] = "業",
["曄"] = "曄",
["爗"] = "曄",
["燁"] = "曄",
["曅"] = "曄",
["皣"] = "曄",
["瞱"] = "曄",
["一"] = "一",
["弌"] = "一",
["哀"] = "衣",
["依"] = "衣",
["衣"] = "衣",
["扆"] = "衣",
["庡"] = "衣",
["偯"] = "衣",
["曀"] = "壹",
["殪"] = "壹",
["豷"] = "壹",
["懿"] = "壹",
["饐"] = "壹",
["鷧"] = "壹",
["撎"] = "壹",
["亄"] = "壹",
["噎"] = "壹",
["壹"] = "壹",
["桋"] = "夷",
["荑"] = "夷",
["銕"] = "夷",
["鴺"] = "夷",
["鮧"] = "夷",
["洟"] = "夷",
["羠"] = "夷",
["咦"] = "夷",
["夷"] = "夷",
["姨"] = "夷",
["痍"] = "夷",
["峓"] = "夷",
["恞"] = "夷",
["眱"] = "夷",
["蛦"] = "夷",
["胰"] = "夷",
["跠"] = "夷",
["茝"] = "頤",
["洍"] = "頤",
["姬"] = "頤",
["宧"] = "頤",
["頤"] = "頤",
["弬"] = "頤",
["礙"] = "疑",
["儗"] = "疑",
["懝"] = "疑",
["譺"] = "疑",
["癡"] = "疑",
["疑"] = "疑",
["嶷"] = "疑",
["觺"] = "疑",
["擬"] = "疑",
["薿"] = "疑",
["凝"] = "疑",
["劜"] = "乙",
["札"] = "乙",
["扎"] = "乙",
["蚻"] = "乙",
["紮"] = "乙",
["軋"] = "乙",
["圠"] = "乙",
["穵"] = "乙",
["挖"] = "乙",
["鳦"] = "乙",
["耴"] = "乙",
["乙"] = "乙",
["肊"] = "乙",
["似"] = "以",
["姒"] = "以",
["耜"] = "以",
["佀"] = "以",
["以"] = "以",
["苡"] = "以",
["苢"] = "以",
["唉"] = "矣",
["埃"] = "矣",
["欸"] = "矣",
["娭"] = "矣",
["挨"] = "矣",
["騃"] = "矣",
["俟"] = "矣",
["竢"] = "矣",
["涘"] = "矣",
["誒"] = "矣",
["矣"] = "矣",
["艾"] = "乂",
["鴱"] = "乂",
["餀"] = "乂",
["刈"] = "乂",
["乂"] = "乂",
["戴"] = "弋",
["襶"] = "弋",
["貸"] = "弋",
["代"] = "弋",
["袋"] = "弋",
["岱"] = "弋",
["黛"] = "弋",
["玳"] = "弋",
["帒"] = "弋",
["甙"] = "弋",
["酨"] = "弋",
["試"] = "弋",
["弒"] = "弋",
["忒"] = "弋",
["貣"] = "弋",
["鴏"] = "弋",
["栻"] = "弋",
["侙"] = "弋",
["恜"] = "弋",
["式"] = "弋",
["軾"] = "弋",
["拭"] = "弋",
["鉽"] = "弋",
["烒"] = "弋",
["弋"] = "弋",
["芅"] = "弋",
["黓"] = "弋",
["隿"] = "弋",
["杙"] = "弋",
["釴"] = "弋",
["夜"] = "亦",
["鵺"] = "亦",
["迹"] = "亦",
["跡"] = "亦",
["亦"] = "亦",
["弈"] = "亦",
["奕"] = "亦",
["帟"] = "亦",
["腋"] = "亦",
["掖"] = "亦",
["焲"] = "亦",
["液"] = "亦",
["椺"] = "役",
["役"] = "役",
["疫"] = "役",
["垼"] = "役",
["炈"] = "役",
["鈠"] = "役",
["豛"] = "役",
["坄"] = "役",
["唈"] = "邑",
["浥"] = "邑",
["裛"] = "邑",
["俋"] = "邑",
["挹"] = "邑",
["邑"] = "邑",
["悒"] = "邑",
["賜"] = "易",
["儩"] = "易",
["舓"] = "易",
["易"] = "易",
["敡"] = "易",
["鬄"] = "易",
["睗"] = "易",
["晹"] = "易",
["痬"] = "易",
["蜴"] = "易",
["埸"] = "易",
["逷"] = "易",
["剔"] = "易",
["踢"] = "易",
["惕"] = "易",
["錫"] = "易",
["裼"] = "易",
["緆"] = "易",
["鷖"] = "医",
["翳"] = "医",
["嫛"] = "医",
["黳"] = "医",
["繄"] = "医",
["医"] = "医",
["嫕"] = "医",
["蘙"] = "医",
["瞖"] = "医",
["殹"] = "医",
["贀"] = "医",
["醫"] = "医",
["毉"] = "医",
["蠮"] = "医",
["洕"] = "佾",
["佾"] = "佾",
["屑"] = "佾",
["榍"] = "佾",
["糏"] = "佾",
["隘"] = "益",
["賹"] = "益",
["搤"] = "益",
["縊"] = "益",
["螠"] = "益",
["謚"] = "益",
["諡"] = "益",
["蠲"] = "益",
["溢"] = "益",
["鎰"] = "益",
["齸"] = "益",
["貖"] = "益",
["益"] = "益",
["嗌"] = "益",
["膉"] = "益",
["鷁"] = "益",
["艗"] = "益",
["褹"] = "埶",
["勢"] = "埶",
["藝"] = "埶",
["囈"] = "埶",
["埶"] = "埶",
["蓺"] = "埶",
["槸"] = "埶",
["爇"] = "埶",
["褻"] = "埶",
["暬"] = "埶",
["熱"] = "埶",
["槷"] = "埶",
["禩"] = "異",
["異"] = "異",
["潩"] = "異",
["廙"] = "異",
["趩"] = "異",
["瀷"] = "異",
["翼"] = "異",
["熼"] = "異",
["豙"] = "豙",
["藙"] = "豙",
["顡"] = "豙",
["毅"] = "豙",
["斁"] = "睪",
["籜"] = "睪",
["蘀"] = "睪",
["鐸"] = "睪",
["凙"] = "睪",
["襗"] = "睪",
["擇"] = "睪",
["澤"] = "睪",
["鸅"] = "睪",
["蠌"] = "睪",
["檡"] = "睪",
["釋"] = "睪",
["繹"] = "睪",
["睪"] = "睪",
["譯"] = "睪",
["嶧"] = "睪",
["懌"] = "睪",
["驛"] = "睪",
["醳"] = "睪",
["圛"] = "睪",
["墿"] = "睪",
["燡"] = "睪",
["噫"] = "意",
["譩"] = "意",
["醷"] = "意",
["意"] = "意",
["鷾"] = "意",
["憶"] = "意",
["億"] = "意",
["臆"] = "意",
["繶"] = "意",
["澺"] = "意",
["薏"] = "意",
["檍"] = "意",
["癔"] = "意",
["欭"] = "因",
["烟"] = "因",
["胭"] = "因",
["咽"] = "因",
["恩"] = "因",
["煾"] = "因",
["因"] = "因",
["姻"] = "因",
["茵"] = "因",
["鞇"] = "因",
["氤"] = "因",
["洇"] = "因",
["駰"] = "因",
["絪"] = "因",
["裀"] = "因",
["黫"] = "垔",
["甄"] = "垔",
["薽"] = "垔",
["籈"] = "垔",
["煙"] = "垔",
["湮"] = "垔",
["堙"] = "垔",
["禋"] = "垔",
["闉"] = "垔",
["垔"] = "垔",
["陻"] = "垔",
["諲"] = "垔",
["歅"] = "垔",
["鄄"] = "垔",
["諳"] = "音",
["腤"] = "音",
["嬜"] = "音",
["喑"] = "音",
["揞"] = "音",
["隌"] = "音",
["罯"] = "音",
["暗"] = "音",
["闇"] = "音",
["黯"] = "音",
["歆"] = "音",
["愔"] = "音",
["韾"] = "音",
["音"] = "音",
["瘖"] = "音",
["窨"] = "音",
["湆"] = "音",
["殷"] = "殷",
["慇"] = "殷",
["溵"] = "殷",
["磤"] = "殷",
["冘"] = "冘",
["抌"] = "冘",
["狖"] = "冘",
["貁"] = "冘",
["耽"] = "冘",
["眈"] = "冘",
["酖"] = "冘",
["妉"] = "冘",
["黕"] = "冘",
["衴"] = "冘",
["瓭"] = "冘",
["馾"] = "冘",
["髧"] = "冘",
["紞"] = "冘",
["鈂"] = "冘",
["沈"] = "冘",
["沉"] = "冘",
["枕"] = "冘",
["莐"] = "冘",
["霃"] = "冘",
["鴆"] = "冘",
["訦"] = "冘",
["忱"] = "冘",
["邥"] = "冘",
["魫"] = "冘",
["寅"] = "寅",
["蔩"] = "寅",
["鏔"] = "寅",
["演"] = "寅",
["縯"] = "寅",
["戭"] = "寅",
["夤"] = "寅",
["螾"] = "寅",
["濥"] = "寅",
["瞚"] = "寅",
["淫"] = "淫",
["霪"] = "淫",
["婬"] = "淫",
["芛"] = "尹",
["伊"] = "尹",
["咿"] = "尹",
["蛜"] = "尹",
["笋"] = "尹",
["尹"] = "尹",
["紖"] = "引",
["矧"] = "引",
["訠"] = "引",
["弞"] = "引",
["引"] = "引",
["蚓"] = "引",
["鈏"] = "引",
["靷"] = "引",
["隱"] = "隱",
["櫽"] = "隱",
["嶾"] = "隱",
["癮"] = "隱",
["懚"] = "隱",
["檼"] = "隱",
["穩"] = "隱",
["印"] = "印",
["鮣"] = "印",
["胤"] = "胤",
["酳"] = "胤",
["瀴"] = "賏",
["甖"] = "賏",
["鸚"] = "賏",
["櫻"] = "賏",
["嚶"] = "賏",
["罌"] = "賏",
["鸎"] = "賏",
["譻"] = "賏",
["賏"] = "賏",
["嬰"] = "賏",
["瓔"] = "賏",
["纓"] = "賏",
["攖"] = "賏",
["蘡"] = "賏",
["癭"] = "賏",
["廮"] = "賏",
["巊"] = "賏",
["應"] = "鷹",
["鷹"] = "鷹",
["膺"] = "鷹",
["譍"] = "鷹",
["噟"] = "鷹",
["盈"] = "盈",
["楹"] = "盈",
["鶯"] = "熒",
["罃"] = "熒",
["嫈"] = "熒",
["褮"] = "熒",
["覮"] = "熒",
["謍"] = "熒",
["䁝"] = "熒",
["嶸"] = "熒",
["嵤"] = "熒",
["榮"] = "熒",
["瑩"] = "熒",
["蠑"] = "熒",
["禜"] = "熒",
["醟"] = "熒",
["檾"] = "熒",
["煢"] = "熒",
["焭"] = "熒",
["縈"] = "熒",
["營"] = "熒",
["鎣"] = "熒",
["塋"] = "熒",
["濴"] = "熒",
["熒"] = "熒",
["螢"] = "熒",
["滎"] = "熒",
["濙"] = "熒",
["瀅"] = "熒",
["嬴"] = "贏",
["瀛"] = "贏",
["籝"] = "贏",
["贏"] = "贏",
["攍"] = "贏",
["郺"] = "邕",
["齆"] = "邕",
["甕"] = "邕",
["罋"] = "邕",
["雍"] = "邕",
["邕"] = "邕",
["嗈"] = "邕",
["灉"] = "邕",
["癰"] = "邕",
["廱"] = "邕",
["雝"] = "邕",
["壅"] = "邕",
["饔"] = "邕",
["噰"] = "邕",
["澭"] = "邕",
["擁"] = "邕",
["臃"] = "邕",
["永"] = "永",
["栐"] = "永",
["泳"] = "永",
["詠"] = "永",
["咏"] = "永",
["通"] = "用",
["俑"] = "用",
["蓪"] = "用",
["桶"] = "用",
["捅"] = "用",
["痛"] = "用",
["筩"] = "用",
["誦"] = "用",
["傭"] = "用",
["慵"] = "用",
["鱅"] = "用",
["滽"] = "用",
["墉"] = "用",
["鏞"] = "用",
["鄘"] = "用",
["槦"] = "用",
["銿"] = "用",
["甬"] = "用",
["勇"] = "用",
["涌"] = "用",
["踊"] = "用",
["蛹"] = "用",
["恿"] = "用",
["慂"] = "用",
["悀"] = "用",
["埇"] = "用",
["踴"] = "用",
["庸"] = "用",
["用"] = "用",
["佣"] = "用",
["絛"] = "攸",
["窱"] = "攸",
["蓧"] = "攸",
["條"] = "攸",
["鋚"] = "攸",
["鞗"] = "攸",
["樤"] = "攸",
["鰷"] = "攸",
["莜"] = "攸",
["翛"] = "攸",
["筱"] = "攸",
["篠"] = "攸",
["修"] = "攸",
["脩"] = "攸",
["樇"] = "攸",
["滫"] = "攸",
["悠"] = "攸",
["攸"] = "攸",
["浟"] = "攸",
["蓨"] = "攸",
["滌"] = "攸",
["儵"] = "攸",
["倐"] = "攸",
["倏"] = "攸",
["虪"] = "攸",
["鏖"] = "麀",
["𤏶"] = "麀",
["麀"] = "麀",
["憂"] = "憂",
["優"] = "憂",
["瀀"] = "憂",
["櫌"] = "憂",
["鄾"] = "憂",
["嚘"] = "憂",
["耰"] = "憂",
["獶"] = "憂",
["纋"] = "憂",
["懮"] = "憂",
["尤"] = "尤",
["疣"] = "尤",
["肬"] = "尤",
["沋"] = "尤",
["訧"] = "尤",
["忧"] = "尤",
["蚘"] = "尤",
["袖"] = "由",
["岫"] = "由",
["牰"] = "由",
["抽"] = "由",
["妯"] = "由",
["紬"] = "由",
["怞"] = "由",
["鮋"] = "由",
["菗"] = "由",
["宙"] = "由",
["胄"] = "由",
["冑"] = "由",
["伷"] = "由",
["駎"] = "由",
["油"] = "由",
["由"] = "由",
["蚰"] = "由",
["秞"] = "由",
["邮"] = "由",
["釉"] = "由",
["柚"] = "由",
["鼬"] = "由",
["苖"] = "由",
["笛"] = "由",
["迪"] = "由",
["頔"] = "由",
["軸"] = "由",
["舳"] = "由",
["游"] = "斿",
["遊"] = "斿",
["蝣"] = "斿",
["斿"] = "斿",
["楢"] = "酉",
["逎"] = "酉",
["遒"] = "酉",
["蝤"] = "酉",
["揂"] = "酉",
["酒"] = "酉",
["媨"] = "酉",
["鞧"] = "酉",
["緧"] = "酉",
["趥"] = "酉",
["酋"] = "酉",
["崷"] = "酉",
["鰌"] = "酉",
["煪"] = "酉",
["醜"] = "酉",
["猶"] = "酉",
["猷"] = "酉",
["輶"] = "酉",
["偤"] = "酉",
["莤"] = "酉",
["蕕"] = "酉",
["庮"] = "酉",
["槱"] = "酉",
["梄"] = "酉",
["丣"] = "酉",
["酉"] = "酉",
["郵"] = "郵",
["腄"] = "郵",
["絠"] = "又",
["醢"] = "又",
["珛"] = "又",
["栯"] = "又",
["有"] = "又",
["友"] = "又",
["右"] = "又",
["宥"] = "又",
["囿"] = "又",
["侑"] = "又",
["酭"] = "又",
["姷"] = "又",
["又"] = "又",
["佑"] = "又",
["祐"] = "又",
["賄"] = "又",
["蛕"] = "又",
["烠"] = "又",
["倄"] = "又",
["鮪"] = "又",
["洧"] = "又",
["痏"] = "又",
["郁"] = "又",
["戫"] = "又",
["哊"] = "又",
["黝"] = "幼",
["坳"] = "幼",
["軪"] = "幼",
["眑"] = "幼",
["拗"] = "幼",
["鴢"] = "幼",
["靿"] = "幼",
["狕"] = "幼",
["袎"] = "幼",
["怮"] = "幼",
["窈"] = "幼",
["苭"] = "幼",
["泑"] = "幼",
["呦"] = "幼",
["蚴"] = "幼",
["幼"] = "幼",
["侉"] = "于",
["夸"] = "于",
["姱"] = "于",
["胯"] = "于",
["跨"] = "于",
["誇"] = "于",
["垮"] = "于",
["銙"] = "于",
["骻"] = "于",
["咵"] = "于",
["釫"] = "于",
["摦"] = "于",
["鮬"] = "于",
["嶀"] = "于",
["扝"] = "于",
["刳"] = "于",
["郀"] = "于",
["挎"] = "于",
["袴"] = "于",
["絝"] = "于",
["褲"] = "于",
["恗"] = "于",
["洿"] = "于",
["瓠"] = "于",
["鄠"] = "于",
["污"] = "于",
["杇"] = "于",
["圬"] = "于",
["鴮"] = "于",
["盓"] = "于",
["汙"] = "于",
["樗"] = "于",
["摴"] = "于",
["荂"] = "于",
["雩"] = "于",
["吁"] = "于",
["盱"] = "于",
["訏"] = "于",
["扜"] = "于",
["旴"] = "于",
["冔"] = "于",
["紆"] = "于",
["陓"] = "于",
["迂"] = "于",
["虶"] = "于",
["于"] = "于",
["盂"] = "于",
["竽"] = "于",
["邘"] = "于",
["玗"] = "于",
["芋"] = "于",
["杅"] = "于",
["釪"] = "于",
["骬"] = "于",
["謣"] = "于",
["宇"] = "于",
["野"] = "予",
["壄"] = "予",
["序"] = "予",
["抒"] = "予",
["芧"] = "予",
["杼"] = "予",
["墅"] = "予",
["舒"] = "予",
["紓"] = "予",
["妤"] = "予",
["伃"] = "予",
["予"] = "予",
["預"] = "予",
["忬"] = "予",
["豫"] = "予",
["蕷"] = "予",
["澦"] = "予",
["斜"] = "余",
["茶"] = "余",
["荼"] = "余",
["梌"] = "余",
["搽"] = "余",
["塗"] = "余",
["佘"] = "余",
["賒"] = "余",
["畬"] = "余",
["舍"] = "余",
["捨"] = "余",
["騇"] = "余",
["涻"] = "余",
["稌"] = "余",
["悇"] = "余",
["庩"] = "余",
["捈"] = "余",
["途"] = "余",
["酴"] = "余",
["駼"] = "余",
["鵌"] = "余",
["涂"] = "余",
["嵞"] = "余",
["峹"] = "余",
["筡"] = "余",
["蒤"] = "余",
["徐"] = "余",
["俆"] = "余",
["敘"] = "余",
["漵"] = "余",
["除"] = "余",
["篨"] = "余",
["滁"] = "余",
["蒢"] = "余",
["蜍"] = "余",
["鵨"] = "余",
["瑹"] = "余",
["余"] = "余",
["餘"] = "余",
["艅"] = "余",
["狳"] = "余",
["雓"] = "余",
["悆"] = "余",
["閼"] = "於",
["菸"] = "於",
["於"] = "於",
["淤"] = "於",
["箊"] = "於",
["唹"] = "於",
["扵"] = "於",
["瘀"] = "於",
["棜"] = "於",
["萸"] = "臾",
["臾"] = "臾",
["腴"] = "臾",
["諛"] = "臾",
["楰"] = "臾",
["庾"] = "臾",
["斞"] = "臾",
["褕"] = "俞",
["偷"] = "俞",
["媮"] = "俞",
["鍮"] = "俞",
["緰"] = "俞",
["牏"] = "俞",
["揄"] = "俞",
["窬"] = "俞",
["歈"] = "俞",
["俞"] = "俞",
["隃"] = "俞",
["毹"] = "俞",
["輸"] = "俞",
["鄃"] = "俞",
["腧"] = "俞",
["逾"] = "俞",
["榆"] = "俞",
["愉"] = "俞",
["渝"] = "俞",
["瑜"] = "俞",
["蕍"] = "俞",
["覦"] = "俞",
["蝓"] = "俞",
["踰"] = "俞",
["崳"] = "俞",
["羭"] = "俞",
["堬"] = "俞",
["瘉"] = "俞",
["癒"] = "俞",
["萮"] = "俞",
["騟"] = "俞",
["愈"] = "俞",
["貐"] = "俞",
["喻"] = "俞",
["諭"] = "俞",
["攑"] = "舁",
["藇"] = "舁",
["嶼"] = "舁",
["鱮"] = "舁",
["舉"] = "舁",
["櫸"] = "舁",
["舁"] = "舁",
["與"] = "舁",
["輿"] = "舁",
["旟"] = "舁",
["璵"] = "舁",
["歟"] = "舁",
["譽"] = "舁",
["嬩"] = "舁",
["擧"] = "舁",
["鸒"] = "舁",
["礜"] = "舁",
["穥"] = "舁",
["齵"] = "禺",
["偶"] = "禺",
["耦"] = "禺",
["藕"] = "禺",
["髃"] = "禺",
["蕅"] = "禺",
["愚"] = "禺",
["隅"] = "禺",
["禺"] = "禺",
["湡"] = "禺",
["堣"] = "禺",
["嵎"] = "禺",
["鰅"] = "禺",
["鍝"] = "禺",
["遇"] = "禺",
["寓"] = "禺",
["庽"] = "禺",
["媀"] = "禺",
["喁"] = "禺",
["顒"] = "禺",
["蘇"] = "魚",
["穌"] = "魚",
["魚"] = "魚",
["漁"] = "魚",
["䱷"] = "魚",
["詡"] = "羽",
["栩"] = "羽",
["珝"] = "羽",
["祤"] = "羽",
["羽"] = "羽",
["頨"] = "羽",
["踽"] = "禹",
["萭"] = "禹",
["聥"] = "禹",
["楀"] = "禹",
["齲"] = "禹",
["禹"] = "禹",
["瑀"] = "禹",
["鄅"] = "禹",
["珏"] = "玉",
["砡"] = "玉",
["匤"] = "玉",
["玉"] = "玉",
["鳿"] = "玉",
["頊"] = "玉",
["筆"] = "聿",
["潷"] = "聿",
["硉"] = "聿",
["律"] = "聿",
["葎"] = "聿",
["聿"] = "聿",
["銉"] = "聿",
["育"] = "育",
["毓"] = "育",
["棛"] = "育",
["錥"] = "育",
["焴"] = "育",
["淯"] = "育",
["蜟"] = "育",
["堉"] = "育",
["逳"] = "育",
["蘛"] = "育",
["煜"] = "昱",
["翊"] = "昱",
["翌"] = "昱",
["昱"] = "昱",
["喅"] = "昱",
["瞲"] = "矞",
["璚"] = "矞",
["劀"] = "矞",
["鱊"] = "矞",
["譎"] = "矞",
["潏"] = "矞",
["鐍"] = "矞",
["憰"] = "矞",
["噊"] = "矞",
["驈"] = "矞",
["橘"] = "矞",
["繘"] = "矞",
["獝"] = "矞",
["燏"] = "矞",
["遹"] = "矞",
["鷸"] = "矞",
["矞"] = "矞",
["霱"] = "矞",
["嶽"] = "獄",
["鸑"] = "獄",
["哭"] = "獄",
["獄"] = "獄",
["竇"] = "𧶠",
["續"] = "𧶠",
["覿"] = "𧶠",
["黷"] = "𧶠",
["讟"] = "𧶠",
["殰"] = "𧶠",
["讀"] = "𧶠",
["櫝"] = "𧶠",
["牘"] = "𧶠",
["儥"] = "𧶠",
["贕"] = "𧶠",
["皾"] = "𧶠",
["瓄"] = "𧶠",
["瀆"] = "𧶠",
["豄"] = "𧶠",
["韇"] = "𧶠",
["嬻"] = "𧶠",
["犢"] = "𧶠",
["匵"] = "𧶠",
["藚"] = "𧶠",
["襩"] = "𧶠",
["贖"] = "𧶠",
["𧶠"] = "𧶠",
["鬱"] = "鬱",
["欝"] = "鬱",
["灪"] = "鬱",
["爩"] = "鬱",
["絹"] = "肙",
["狷"] = "肙",
["蜎"] = "肙",
["弲"] = "肙",
["娟"] = "肙",
["悁"] = "肙",
["捐"] = "肙",
["涓"] = "肙",
["鵑"] = "肙",
["睊"] = "肙",
["焆"] = "肙",
["鞙"] = "肙",
["埍"] = "肙",
["罥"] = "肙",
["羂"] = "肙",
["瓹"] = "肙",
["梋"] = "肙",
["鋗"] = "肙",
["駽"] = "肙",
["琄"] = "肙",
["剈"] = "肙",
["肙"] = "肙",
["冤"] = "冤",
["蒬"] = "冤",
["婣"] = "淵",
["鼘"] = "淵",
["囦"] = "淵",
["淵"] = "淵",
["裫"] = "淵",
["奫"] = "淵",
["冠"] = "元",
["莞"] = "元",
["脘"] = "元",
["筦"] = "元",
["梡"] = "元",
["岏"] = "元",
["刓"] = "元",
["园"] = "元",
["忨"] = "元",
["蚖"] = "元",
["黿"] = "元",
["抏"] = "元",
["玩"] = "元",
["貦"] = "元",
["翫"] = "元",
["妧"] = "元",
["完"] = "元",
["捖"] = "元",
["垸"] = "元",
["綄"] = "元",
["院"] = "元",
["皖"] = "元",
["晥"] = "元",
["浣"] = "元",
["頑"] = "元",
["睆"] = "元",
["鯇"] = "元",
["元"] = "元",
["沅"] = "元",
["芫"] = "元",
["杬"] = "元",
["邧"] = "元",
["阮"] = "元",
["俒"] = "元",
["暖"] = "爰",
["煖"] = "爰",
["喛"] = "爰",
["緩"] = "爰",
["鰀"] = "爰",
["嵈"] = "爰",
["鍰"] = "爰",
["湲"] = "爰",
["媛"] = "爰",
["瑗"] = "爰",
["援"] = "爰",
["褑"] = "爰",
["諼"] = "爰",
["愋"] = "爰",
["楥"] = "爰",
["爰"] = "爰",
["鶢"] = "爰",
["蝯"] = "爰",
["猨"] = "爰",
["羱"] = "原",
["豲"] = "原",
["謜"] = "原",
["縓"] = "原",
["原"] = "原",
["源"] = "原",
["厵"] = "原",
["嫄"] = "原",
["騵"] = "原",
["榞"] = "原",
["獂"] = "原",
["蒝"] = "原",
["願"] = "原",
["傆"] = "原",
["愿"] = "原",
["員"] = "員",
["圓"] = "員",
["塤"] = "員",
["損"] = "員",
["縜"] = "員",
["隕"] = "員",
["殞"] = "員",
["溳"] = "員",
["磒"] = "員",
["霣"] = "員",
["愪"] = "員",
["勛"] = "員",
["鄖"] = "員",
["篔"] = "員",
["貟"] = "員",
["韻"] = "員",
["薳"] = "袁",
["袁"] = "袁",
["園"] = "袁",
["轅"] = "袁",
["猿"] = "袁",
["榬"] = "袁",
["溒"] = "袁",
["遠"] = "袁",
["癏"] = "睘",
["擐"] = "睘",
["還"] = "睘",
["環"] = "睘",
["鬟"] = "睘",
["寰"] = "睘",
["闤"] = "睘",
["糫"] = "睘",
["圜"] = "睘",
["鐶"] = "睘",
["轘"] = "睘",
["澴"] = "睘",
["繯"] = "睘",
["檈"] = "睘",
["儇"] = "睘",
["翾"] = "睘",
["蠉"] = "睘",
["嬛"] = "睘",
["譞"] = "睘",
["懁"] = "睘",
["獧"] = "睘",
["噮"] = "睘",
["彋"] = "睘",
["睘"] = "睘",
["涴"] = "夗",
["埦"] = "夗",
["豌"] = "夗",
["剜"] = "夗",
["眢"] = "夗",
["蜿"] = "夗",
["帵"] = "夗",
["碗"] = "夗",
["椀"] = "夗",
["盌"] = "夗",
["腕"] = "夗",
["惋"] = "夗",
["捥"] = "夗",
["睕"] = "夗",
["琬"] = "夗",
["鴛"] = "夗",
["鵷"] = "夗",
["惌"] = "夗",
["宛"] = "夗",
["怨"] = "夗",
["葾"] = "夗",
["夗"] = "夗",
["婉"] = "夗",
["菀"] = "夗",
["苑"] = "夗",
["踠"] = "夗",
["畹"] = "夗",
["倇"] = "夗",
["晼"] = "夗",
["黦"] = "夗",
["焥"] = "夗",
["曰"] = "曰",
["汩"] = "曰",
["𦚢"] = "𦚢",
["𩨭"] = "𦚢",
["刖"] = "月",
["枂"] = "月",
["月"] = "月",
["跀"] = "月",
["抈"] = "月",
["鈅"] = "月",
["玥"] = "月",
["蚏"] = "月",
["泧"] = "戉",
["眓"] = "戉",
["越"] = "戉",
["狘"] = "戉",
["戉"] = "戉",
["鉞"] = "戉",
["樾"] = "戉",
["怴"] = "戉",
["岳"] = "岳",
["捳"] = "岳",
["讑"] = "龠",
["籲"] = "龠",
["爚"] = "龠",
["禴"] = "龠",
["蘥"] = "龠",
["鑰"] = "龠",
["瀹"] = "龠",
["龠"] = "龠",
["籥"] = "龠",
["鸙"] = "龠",
["魂"] = "云",
["沄"] = "云",
["忶"] = "云",
["囩"] = "云",
["夽"] = "云",
["雲"] = "云",
["芸"] = "云",
["耘"] = "云",
["妘"] = "云",
["紜"] = "云",
["云"] = "云",
["耺"] = "云",
["蕓"] = "云",
["澐"] = "云",
["橒"] = "云",
["抎"] = "云",
["枃"] = "匀",
["笉"] = "匀",
["郇"] = "匀",
["絢"] = "匀",
["眴"] = "匀",
["盷"] = "匀",
["訇"] = "匀",
["迿"] = "匀",
["姰"] = "匀",
["畇"] = "匀",
["荀"] = "匀",
["詢"] = "匀",
["洵"] = "匀",
["恂"] = "匀",
["峋"] = "匀",
["珣"] = "匀",
["槆"] = "匀",
["筍"] = "匀",
["箰"] = "匀",
["旬"] = "匀",
["殉"] = "匀",
["徇"] = "匀",
["侚"] = "匀",
["均"] = "匀",
["鈞"] = "匀",
["袀"] = "匀",
["汮"] = "匀",
["呁"] = "匀",
["筠"] = "匀",
["荺"] = "匀",
["匀"] = "匀",
["韵"] = "匀",
["輷"] = "匀",
["揈"] = "匀",
["鍧"] = "匀",
["渹"] = "匀",
["赹"] = "匀",
["憌"] = "匀",
["惸"] = "匀",
["咰"] = "匀",
["唆"] = "允",
["梭"] = "允",
["葰"] = "允",
["誜"] = "允",
["朘"] = "允",
["捘"] = "允",
["荾"] = "允",
["酸"] = "允",
["狻"] = "允",
["痠"] = "允",
["鋑"] = "允",
["脧"] = "允",
["悛"] = "允",
["吮"] = "允",
["萒"] = "允",
["沇"] = "允",
["抁"] = "允",
["馻"] = "允",
["兖"] = "允",
["渷"] = "允",
["兗"] = "允",
["焌"] = "允",
["允"] = "允",
["狁"] = "允",
["玧"] = "允",
["俊"] = "允",
["晙"] = "允",
["餕"] = "允",
["畯"] = "允",
["駿"] = "允",
["竣"] = "允",
["皴"] = "允",
["逡"] = "允",
["踆"] = "允",
["夋"] = "允",
["埈"] = "允",
["陖"] = "允",
["鵕"] = "允",
["浚"] = "允",
["峻"] = "允",
["帀"] = "帀",
["沞"] = "帀",
["魳"] = "帀",
["迊"] = "帀",
["匝"] = "帀",
["咂"] = "帀",
["韴"] = "帀",
["砸"] = "帀",
["灾"] = "災",
["災"] = "災",
["𢦏"] = "𢦏",
["栽"] = "𢦏",
["哉"] = "𢦏",
["烖"] = "𢦏",
["載"] = "𢦏",
["渽"] = "𢦏",
["睵"] = "𢦏",
["溨"] = "𢦏",
["裁"] = "𢦏",
["酨"] = "𢦏",
["蛓"] = "𢦏",
["胾"] = "𢦏",
["宰"] = "宰",
["縡"] = "宰",
["梓"] = "宰",
["滓"] = "宰",
["再"] = "再",
["洅"] = "再",
["贊"] = "贊",
["趲"] = "贊",
["讚"] = "贊",
["酇"] = "贊",
["饡"] = "贊",
["灒"] = "贊",
["襸"] = "贊",
["攢"] = "贊",
["瓚"] = "贊",
["禶"] = "贊",
["穳"] = "贊",
["囋"] = "贊",
["鑽"] = "贊",
["劗"] = "贊",
["纘"] = "贊",
["儹"] = "贊",
["鄼"] = "贊",
["欑"] = "贊",
["籫"] = "贊",
["巑"] = "贊",
["攅"] = "贊",
["髒"] = "葬",
["葬"] = "葬",
["早"] = "早",
["草"] = "早",
["愺"] = "早",
["騲"] = "早",
["皁"] = "早",
["皂"] = "早",
["蚤"] = "蚤",
["慅"] = "蚤",
["騷"] = "蚤",
["搔"] = "蚤",
["鰠"] = "蚤",
["溞"] = "蚤",
["颾"] = "蚤",
["瘙"] = "蚤",
["瑵"] = "蚤",
["糔"] = "蚤",
["鼜"] = "蚤",
["藻"] = "喿",
["澡"] = "喿",
["璪"] = "喿",
["繰"] = "喿",
["躁"] = "喿",
["趮"] = "喿",
["操"] = "喿",
["幧"] = "喿",
["懆"] = "喿",
["鄵"] = "喿",
["鐰"] = "喿",
["臊"] = "喿",
["鱢"] = "喿",
["燥"] = "喿",
["噪"] = "喿",
["髞"] = "喿",
["喿"] = "喿",
["譟"] = "喿",
["劋"] = "喿",
["橾"] = "喿",
["廁"] = "則",
["則"] = "則",
["賊"] = "則",
["鰂"] = "則",
["鱡"] = "則",
["蠈"] = "則",
["側"] = "則",
["萴"] = "則",
["測"] = "則",
["惻"] = "則",
["崱"] = "則",
["仄"] = "仄",
["昃"] = "仄",
["潧"] = "曾",
["繒"] = "曾",
["增"] = "曾",
["憎"] = "曾",
["磳"] = "曾",
["曾"] = "曾",
["矰"] = "曾",
["罾"] = "曾",
["熷"] = "曾",
["竲"] = "曾",
["橧"] = "曾",
["譄"] = "曾",
["蹭"] = "曾",
["層"] = "曾",
["贈"] = "曾",
["僧"] = "曾",
["鬙"] = "曾",
["甑"] = "曾",
["鄫"] = "曾",
["驓"] = "曾",
["嶒"] = "曾",
["噌"] = "曾",
["鏳"] = "曾",
["作"] = "乍",
["鮓"] = "乍",
["痄"] = "乍",
["厏"] = "乍",
["詐"] = "乍",
["咋"] = "乍",
["笮"] = "乍",
["榨"] = "乍",
["炸"] = "乍",
["乍"] = "乍",
["拃"] = "乍",
["酢"] = "乍",
["祚"] = "乍",
["胙"] = "乍",
["阼"] = "乍",
["飵"] = "乍",
["秨"] = "乍",
["迮"] = "乍",
["柞"] = "乍",
["昨"] = "乍",
["怍"] = "乍",
["砟"] = "乍",
["莋"] = "乍",
["岝"] = "乍",
["鈼"] = "乍",
["筰"] = "乍",
["葃"] = "乍",
["舴"] = "乍",
["窄"] = "乍",
["蚱"] = "乍",
["齚"] = "乍",
["泎"] = "乍",
["頕"] = "占",
["煔"] = "占",
["炶"] = "占",
["詀"] = "占",
["站"] = "占",
["檆"] = "占",
["黏"] = "占",
["粘"] = "占",
["枮"] = "占",
["霑"] = "占",
["沾"] = "占",
["覘"] = "占",
["鉆"] = "占",
["占"] = "占",
["颭"] = "占",
["佔"] = "占",
["苫"] = "占",
["痁"] = "占",
["蛅"] = "占",
["阽"] = "占",
["敁"] = "占",
["掂"] = "占",
["點"] = "占",
["玷"] = "占",
["店"] = "占",
["坫"] = "占",
["黇"] = "占",
["扂"] = "占",
["拈"] = "占",
["鮎"] = "占",
["砧"] = "占",
["笘"] = "占",
["跕"] = "占",
["貼"] = "占",
["帖"] = "占",
["怗"] = "占",
["呫"] = "占",
["甔"] = "詹",
["擔"] = "詹",
["儋"] = "詹",
["聸"] = "詹",
["膽"] = "詹",
["黵"] = "詹",
["澹"] = "詹",
["憺"] = "詹",
["瞻"] = "詹",
["詹"] = "詹",
["蟾"] = "詹",
["噡"] = "詹",
["譫"] = "詹",
["幨"] = "詹",
["襜"] = "詹",
["韂"] = "詹",
["贍"] = "詹",
["檐"] = "詹",
["簷"] = "詹",
["舚"] = "詹",
["碾"] = "展",
["輾"] = "展",
["展"] = "展",
["搌"] = "展",
["慚"] = "斬",
["慙"] = "斬",
["鏨"] = "斬",
["槧"] = "斬",
["暫"] = "斬",
["蹔"] = "斬",
["斬"] = "斬",
["獑"] = "斬",
["嶃"] = "斬",
["覱"] = "斬",
["摲"] = "斬",
["漸"] = "斬",
["塹"] = "斬",
["壍"] = "斬",
["嬱"] = "斬",
["螹"] = "斬",
["蔪"] = "斬",
["章"] = "章",
["樟"] = "章",
["彰"] = "章",
["漳"] = "章",
["鄣"] = "章",
["璋"] = "章",
["嫜"] = "章",
["獐"] = "章",
["慞"] = "章",
["墇"] = "章",
["障"] = "章",
["麞"] = "章",
["蔁"] = "章",
["暲"] = "章",
["嶂"] = "章",
["瘴"] = "章",
["丈"] = "丈",
["杖"] = "丈",
["仗"] = "丈",
["挑"] = "兆",
["洮"] = "兆",
["桃"] = "兆",
["逃"] = "兆",
["咷"] = "兆",
["鼗"] = "兆",
["鞉"] = "兆",
["駣"] = "兆",
["𣂁"] = "兆",
["脁"] = "兆",
["晁"] = "兆",
["兆"] = "兆",
["旐"] = "兆",
["狣"] = "兆",
["鮡"] = "兆",
["垗"] = "兆",
["姚"] = "兆",
["珧"] = "兆",
["銚"] = "兆",
["恌"] = "兆",
["烑"] = "兆",
["餆"] = "兆",
["筄"] = "兆",
["艞"] = "兆",
["佻"] = "兆",
["祧"] = "兆",
["朓"] = "兆",
["庣"] = "兆",
["趒"] = "兆",
["聎"] = "兆",
["眺"] = "兆",
["覜"] = "兆",
["頫"] = "兆",
["絩"] = "兆",
["跳"] = "兆",
["窕"] = "兆",
["誂"] = "兆",
["肁"] = "肁",
["肇"] = "肁",
["咤"] = "乇",
["吒"] = "乇",
["灹"] = "乇",
["矺"] = "乇",
["奼"] = "乇",
["侘"] = "乇",
["詫"] = "乇",
["秅"] = "乇",
["秺"] = "乇",
["亳"] = "乇",
["托"] = "乇",
["託"] = "乇",
["魠"] = "乇",
["馲"] = "乇",
["侂"] = "乇",
["飥"] = "乇",
["仛"] = "乇",
["虴"] = "乇",
["杔"] = "乇",
["乇"] = "乇",
["宅"] = "乇",
["厇"] = "乇",
["晢"] = "折",
["狾"] = "折",
["誓"] = "折",
["逝"] = "折",
["銴"] = "折",
["折"] = "折",
["娎"] = "折",
["哳"] = "折",
["踅"] = "折",
["哲"] = "折",
["蜇"] = "折",
["悊"] = "折",
["嚞"] = "折",
["喆"] = "折",
["硩"] = "折",
["浙"] = "折",
["晣"] = "折",
["焎"] = "折",
["觰"] = "者",
["諸"] = "者",
["者"] = "者",
["堵"] = "者",
["赭"] = "者",
["撦"] = "者",
["扯"] = "者",
["闍"] = "者",
["奢"] = "者",
["鍺"] = "者",
["都"] = "者",
["醏"] = "者",
["覩"] = "者",
["睹"] = "者",
["暏"] = "者",
["賭"] = "者",
["帾"] = "者",
["楮"] = "者",
["屠"] = "者",
["瘏"] = "者",
["廜"] = "者",
["鷵"] = "者",
["緒"] = "者",
["豬"] = "者",
["猪"] = "者",
["瀦"] = "者",
["藸"] = "者",
["櫫"] = "者",
["褚"] = "者",
["著"] = "者",
["箸"] = "者",
["儲"] = "者",
["躇"] = "者",
["櫧"] = "者",
["藷"] = "者",
["蠩"] = "者",
["煮"] = "者",
["渚"] = "者",
["煑"] = "者",
["陼"] = "者",
["翥"] = "者",
["署"] = "者",
["薯"] = "者",
["曙"] = "者",
["書"] = "者",
["暑"] = "者",
["鐯"] = "者",
["擆"] = "者",
["櫡"] = "者",
["踂"] = "耴",
["輒"] = "耴",
["耴"] = "耴",
["鮿"] = "耴",
["偵"] = "貞",
["幀"] = "貞",
["湞"] = "貞",
["貞"] = "貞",
["楨"] = "貞",
["禎"] = "貞",
["赬"] = "貞",
["遉"] = "貞",
["寘"] = "真",
["䡩"] = "真",
["黰"] = "真",
["顛"] = "真",
["滇"] = "真",
["齻"] = "真",
["槙"] = "真",
["瘨"] = "真",
["傎"] = "真",
["蹎"] = "真",
["厧"] = "真",
["巔"] = "真",
["癲"] = "真",
["瑱"] = "真",
["填"] = "真",
["窴"] = "真",
["闐"] = "真",
["磌"] = "真",
["鷏"] = "真",
["嗔"] = "真",
["搷"] = "真",
["鎮"] = "真",
["縝"] = "真",
["真"] = "真",
["禛"] = "真",
["稹"] = "真",
["蒖"] = "真",
["鬒"] = "真",
["瞋"] = "真",
["謓"] = "真",
["慎"] = "真",
["沴"] = "疹",
["趁"] = "疹",
["紾"] = "疹",
["跈"] = "疹",
["殄"] = "疹",
["抮"] = "疹",
["駗"] = "疹",
["珍"] = "疹",
["診"] = "疹",
["畛"] = "疹",
["疹"] = "疹",
["軫"] = "疹",
["胗"] = "疹",
["袗"] = "疹",
["眕"] = "疹",
["飻"] = "疹",
["餮"] = "疹",
["黱"] = "朕",
["朕"] = "朕",
["鰧"] = "朕",
["螣"] = "朕",
["栚"] = "朕",
["眹"] = "朕",
["騰"] = "朕",
["滕"] = "朕",
["縢"] = "朕",
["儯"] = "朕",
["幐"] = "朕",
["藤"] = "朕",
["謄"] = "朕",
["膡"] = "朕",
["籐"] = "朕",
["勝"] = "朕",
["蕂"] = "朕",
["榺"] = "朕",
["塍"] = "朕",
["媵"] = "朕",
["賸"] = "朕",
["琤"] = "爭",
["崢"] = "爭",
["鬇"] = "爭",
["爭"] = "爭",
["箏"] = "爭",
["猙"] = "爭",
["埩"] = "爭",
["諍"] = "爭",
["凈"] = "爭",
["錚"] = "爭",
["棦"] = "爭",
["竫"] = "爭",
["睜"] = "爭",
["淨"] = "爭",
["徵"] = "徵",
["癥"] = "徵",
["澂"] = "徵",
["懲"] = "徵",
["綻"] = "正",
["淀"] = "正",
["靛"] = "正",
["症"] = "正",
["竀"] = "正",
["征"] = "正",
["怔"] = "正",
["正"] = "正",
["鉦"] = "正",
["鴊"] = "正",
["眐"] = "正",
["佂"] = "正",
["整"] = "正",
["政"] = "正",
["証"] = "正",
["定"] = "正",
["顁"] = "正",
["錠"] = "正",
["掟"] = "正",
["之"] = "之",
["芝"] = "之",
["志"] = "之",
["痣"] = "之",
["娡"] = "之",
["誌"] = "之",
["蚩"] = "之",
["妛"] = "之",
["嗤"] = "之",
["媸"] = "之",
["旹"] = "之",
["滍"] = "之",
["支"] = "支",
["枝"] = "支",
["肢"] = "支",
["汥"] = "支",
["衼"] = "支",
["馶"] = "支",
["鳷"] = "支",
["忮"] = "支",
["伎"] = "支",
["豉"] = "支",
["翅"] = "支",
["翄"] = "支",
["妓"] = "支",
["庋"] = "支",
["跂"] = "支",
["蚑"] = "支",
["吱"] = "支",
["岐"] = "支",
["歧"] = "支",
["鬾"] = "支",
["技"] = "支",
["芰"] = "支",
["攱"] = "支",
["庪"] = "支",
["頍"] = "支",
["屐"] = "支",
["巵"] = "巵",
["梔"] = "巵",
["識"] = "戠",
["幟"] = "戠",
["織"] = "戠",
["熾"] = "戠",
["樴"] = "戠",
["職"] = "戠",
["軄"] = "戠",
["戠"] = "戠",
["膱"] = "戠",
["蟙"] = "戠",
["置"] = "直",
["值"] = "直",
["植"] = "直",
["埴"] = "直",
["惪"] = "直",
["德"] = "直",
["稙"] = "直",
["淔"] = "直",
["直"] = "直",
["犆"] = "直",
["殖"] = "直",
["騺"] = "執",
["摯"] = "執",
["贄"] = "執",
["鷙"] = "執",
["墊"] = "執",
["慹"] = "執",
["謺"] = "執",
["褺"] = "執",
["蓻"] = "執",
["縶"] = "執",
["漐"] = "執",
["蟄"] = "執",
["執"] = "執",
["瓡"] = "執",
["祉"] = "止",
["址"] = "止",
["止"] = "止",
["趾"] = "止",
["芷"] = "止",
["沚"] = "止",
["阯"] = "止",
["齒"] = "止",
["紕"] = "止",
["只"] = "只",
["胑"] = "只",
["疻"] = "只",
["軹"] = "只",
["咫"] = "只",
["枳"] = "只",
["抧"] = "只",
["伿"] = "只",
["齞"] = "只",
["稽"] = "旨",
["詣"] = "旨",
["栺"] = "旨",
["榰"] = "旨",
["脂"] = "旨",
["鴲"] = "旨",
["指"] = "旨",
["旨"] = "旨",
["恉"] = "旨",
["嗜"] = "旨",
["蓍"] = "旨",
["鰭"] = "旨",
["耆"] = "旨",
["鮨"] = "旨",
["鬐"] = "旨",
["致"] = "至",
["輊"] = "至",
["駤"] = "至",
["跮"] = "至",
["荎"] = "至",
["緻"] = "至",
["至"] = "至",
["鵄"] = "至",
["胵"] = "至",
["痓"] = "至",
["咥"] = "至",
["窒"] = "至",
["蛭"] = "至",
["垤"] = "至",
["耋"] = "至",
["姪"] = "至",
["絰"] = "至",
["恎"] = "至",
["挃"] = "至",
["庢"] = "至",
["銍"] = "至",
["秷"] = "至",
["螲"] = "至",
["侄"] = "至",
["桎"] = "至",
["郅"] = "至",
["晊"] = "至",
["室"] = "至",
["制"] = "制",
["淛"] = "制",
["製"] = "制",
["掣"] = "制",
["痸"] = "制",
["猘"] = "制",
["陟"] = "陟",
["騭"] = "陟",
["啑"] = "疐",
["疐"] = "疐",
["嚏"] = "疐",
["懥"] = "疐",
["質"] = "質",
["躓"] = "質",
["懫"] = "質",
["礩"] = "質",
["櫍"] = "質",
["劕"] = "質",
["鑕"] = "質",
["中"] = "中",
["忠"] = "中",
["衷"] = "中",
["忡"] = "中",
["浺"] = "中",
["盅"] = "中",
["种"] = "中",
["沖"] = "中",
["翀"] = "中",
["仲"] = "中",
["撞"] = "重",
["幢"] = "重",
["橦"] = "重",
["噇"] = "重",
["𩪘"] = "重",
["艟"] = "重",
["憧"] = "重",
["畽"] = "重",
["董"] = "重",
["蕫"] = "重",
["箽"] = "重",
["懂"] = "重",
["湩"] = "重",
["曈"] = "重",
["童"] = "重",
["僮"] = "重",
["瞳"] = "重",
["罿"] = "重",
["犝"] = "重",
["潼"] = "重",
["穜"] = "重",
["動"] = "重",
["慟"] = "重",
["堹"] = "重",
["諥"] = "重",
["蹱"] = "重",
["重"] = "重",
["緟"] = "重",
["蝩"] = "重",
["褈"] = "重",
["鐘"] = "重",
["鍾"] = "重",
["籦"] = "重",
["種"] = "重",
["腫"] = "重",
["踵"] = "重",
["歱"] = "重",
["喠"] = "重",
["偅"] = "重",
["衝"] = "重",
["揰"] = "重",
["尰"] = "重",
["潨"] = "眾",
["眾"] = "眾",
["洲"] = "州",
["州"] = "州",
["喌"] = "州",
["酬"] = "州",
["詶"] = "州",
["鵃"] = "舟",
["輈"] = "舟",
["侜"] = "舟",
["矪"] = "舟",
["舟"] = "舟",
["裯"] = "周",
["啁"] = "周",
["禂"] = "周",
["綢"] = "周",
["翢"] = "周",
["錭"] = "周",
["雕"] = "周",
["凋"] = "周",
["琱"] = "周",
["鯛"] = "周",
["鵰"] = "周",
["彫"] = "周",
["奝"] = "周",
["調"] = "周",
["蜩"] = "周",
["惆"] = "周",
["婤"] = "周",
["稠"] = "周",
["椆"] = "周",
["周"] = "周",
["輖"] = "周",
["賙"] = "周",
["郮"] = "周",
["晭"] = "周",
["倜"] = "周",
["粥"] = "粥",
["鬻"] = "粥",
["肘"] = "肘",
["疛"] = "肘",
["紂"] = "肘",
["葤"] = "肘",
["酎"] = "肘",
["婦"] = "帚",
["帚"] = "帚",
["箒"] = "帚",
["鯞"] = "帚",
["咮"] = "朱",
["株"] = "朱",
["誅"] = "朱",
["邾"] = "朱",
["鼄"] = "朱",
["跦"] = "朱",
["袾"] = "朱",
["鴸"] = "朱",
["蛛"] = "朱",
["殊"] = "朱",
["趎"] = "朱",
["珠"] = "朱",
["朱"] = "朱",
["侏"] = "朱",
["絑"] = "朱",
["祩"] = "朱",
["鮢"] = "朱",
["硃"] = "朱",
["姝"] = "朱",
["銖"] = "朱",
["茱"] = "朱",
["洙"] = "朱",
["陎"] = "朱",
["竺"] = "竹",
["篤"] = "竹",
["竹"] = "竹",
["筑"] = "竹",
["築"] = "竹",
["茿"] = "竹",
["篴"] = "逐",
["蓫"] = "逐",
["逐"] = "逐",
["鱁"] = "逐",
["飳"] = "主",
["妵"] = "主",
["黈"] = "主",
["蘣"] = "主",
["罜"] = "主",
["拄"] = "主",
["柱"] = "主",
["駐"] = "主",
["註"] = "主",
["鉒"] = "主",
["軴"] = "主",
["住"] = "主",
["跓"] = "主",
["嵀"] = "主",
["主"] = "主",
["麈"] = "主",
["宔"] = "主",
["炷"] = "主",
["注"] = "主",
["疰"] = "主",
["蛀"] = "主",
["霔"] = "主",
["貯"] = "宁",
["詝"] = "宁",
["柠"] = "宁",
["宁"] = "宁",
["佇"] = "宁",
["竚"] = "宁",
["苧"] = "宁",
["紵"] = "宁",
["羜"] = "宁",
["眝"] = "宁",
["壴"] = "壴",
["廚"] = "壴",
["躕"] = "壴",
["櫥"] = "壴",
["幮"] = "壴",
["樹"] = "壴",
["澍"] = "壴",
["尌"] = "壴",
["祝"] = "祝",
["呪"] = "祝",
["咒"] = "祝",
["柷"] = "祝",
["抓"] = "爪",
["爪"] = "爪",
["笊"] = "爪",
["找"] = "爪",
["竱"] = "專",
["團"] = "專",
["摶"] = "專",
["篿"] = "專",
["慱"] = "專",
["剸"] = "專",
["鄟"] = "專",
["漙"] = "專",
["鷒"] = "專",
["轉"] = "專",
["傳"] = "專",
["囀"] = "專",
["縳"] = "專",
["專"] = "專",
["磚"] = "專",
["甎"] = "專",
["塼"] = "專",
["嫥"] = "專",
["膞"] = "專",
["鱄"] = "專",
["蓴"] = "專",
["孨"] = "孨",
["孱"] = "孨",
["蜼"] = "隹",
["堆"] = "隹",
["嵟"] = "隹",
["碓"] = "隹",
["推"] = "隹",
["蓷"] = "隹",
["陮"] = "隹",
["魋"] = "隹",
["嶊"] = "隹",
["崔"] = "隹",
["猚"] = "隹",
["椎"] = "隹",
["顀"] = "隹",
["隹"] = "隹",
["錐"] = "隹",
["萑"] = "隹",
["騅"] = "隹",
["鵻"] = "隹",
["誰"] = "隹",
["脽"] = "隹",
["蘬"] = "追",
["磓"] = "追",
["塠"] = "追",
["頧"] = "追",
["鴭"] = "追",
["鎚"] = "追",
["搥"] = "追",
["縋"] = "追",
["膇"] = "追",
["槌"] = "追",
["追"] = "追",
["桘"] = "追",
["巋"] = "追",
["歸"] = "追",
["悼"] = "卓",
["淖"] = "卓",
["罩"] = "卓",
["鵫"] = "卓",
["趠"] = "卓",
["踔"] = "卓",
["棹"] = "卓",
["鋽"] = "卓",
["掉"] = "卓",
["逴"] = "卓",
["焯"] = "卓",
["綽"] = "卓",
["婥"] = "卓",
["繛"] = "卓",
["卓"] = "卓",
["桌"] = "卓",
["倬"] = "卓",
["啅"] = "卓",
["晫"] = "卓",
["蝃"] = "叕",
["欼"] = "叕",
["綴"] = "叕",
["醊"] = "叕",
["畷"] = "叕",
["啜"] = "叕",
["餟"] = "叕",
["腏"] = "叕",
["錣"] = "叕",
["輟"] = "叕",
["娺"] = "叕",
["窡"] = "叕",
["鵽"] = "叕",
["掇"] = "叕",
["剟"] = "叕",
["裰"] = "叕",
["敠"] = "叕",
["惙"] = "叕",
["罬"] = "叕",
["叕"] = "叕",
["歠"] = "叕",
["逫"] = "叕",
["輜"] = "甾",
["淄"] = "甾",
["錙"] = "甾",
["緇"] = "甾",
["甾"] = "甾",
["菑"] = "甾",
["鶅"] = "甾",
["椔"] = "甾",
["鯔"] = "甾",
["糍"] = "兹",
["茲"] = "兹",
["滋"] = "兹",
["孳"] = "兹",
["嵫"] = "兹",
["嗞"] = "兹",
["鎡"] = "兹",
["鰦"] = "兹",
["鶿"] = "兹",
["稵"] = "兹",
["螆"] = "兹",
["慈"] = "兹",
["鷀"] = "兹",
["磁"] = "兹",
["礠"] = "兹",
["濨"] = "兹",
["孜"] = "子",
["仔"] = "子",
["孖"] = "子",
["子"] = "子",
["虸"] = "子",
["耔"] = "子",
["秄"] = "子",
["杍"] = "子",
["籽"] = "子",
["字"] = "子",
["茡"] = "子",
["芓"] = "子",
["牸"] = "子",
["李"] = "子",
["姊"] = "秭",
["秭"] = "秭",
["趀"] = "秭",
["笫"] = "秭",
["胏"] = "秭",
["柹"] = "秭",
["柿"] = "秭",
["郋"] = "自",
["自"] = "自",
["洎"] = "自",
["臮"] = "自",
["垍"] = "自",
["詯"] = "自",
["淙"] = "宗",
["鬃"] = "宗",
["漴"] = "宗",
["粽"] = "宗",
["宗"] = "宗",
["倧"] = "宗",
["綜"] = "宗",
["錝"] = "宗",
["賨"] = "宗",
["琮"] = "宗",
["悰"] = "宗",
["孮"] = "宗",
["誴"] = "宗",
["崇"] = "宗",
["崈"] = "宗",
["踪"] = "宗",
["奏"] = "奏",
["凑"] = "奏",
["腠"] = "奏",
["輳"] = "奏",
["楱"] = "奏",
["湊"] = "奏",
["足"] = "足",
["莡"] = "足",
["捉"] = "足",
["齪"] = "足",
["娖"] = "足",
["浞"] = "足",
["鋜"] = "足",
["趗"] = "足",
["珿"] = "足",
["哫"] = "足",
["促"] = "足",
["晬"] = "卒",
["祽"] = "卒",
["綷"] = "卒",
["淬"] = "卒",
["啐"] = "卒",
["倅"] = "卒",
["焠"] = "卒",
["碎"] = "卒",
["誶"] = "卒",
["濢"] = "卒",
["噿"] = "卒",
["臎"] = "卒",
["醉"] = "卒",
["翠"] = "卒",
["悴"] = "卒",
["萃"] = "卒",
["瘁"] = "卒",
["顇"] = "卒",
["粹"] = "卒",
["睟"] = "卒",
["賥"] = "卒",
["卒"] = "卒",
["稡"] = "卒",
["猝"] = "卒",
["椊"] = "卒",
["捽"] = "卒",
["崪"] = "卒",
["窣"] = "卒",
["崒"] = "卒",
["踤"] = "卒",
["錊"] = "卒",
["蔟"] = "族",
["嗾"] = "族",
["鷟"] = "族",
["鏃"] = "族",
["瘯"] = "族",
["簇"] = "族",
["族"] = "族",
["罪"] = "罪",
["辠"] = "罪",
["𢶀"] = "罪",
["尊"] = "尊",
["樽"] = "尊",
["罇"] = "尊",
["嶟"] = "尊",
["繜"] = "尊",
["撙"] = "尊",
["噂"] = "尊",
["譐"] = "尊",
["僔"] = "尊",
["蹲"] = "尊",
["鱒"] = "尊",
["鐏"] = "尊",
["遵"] = "尊",
["鷷"] = "尊",
["墫"] = "尊",
["竴"] = "尊",
["左"] = "左",
["佐"] = "左",
["袏"] = "左",
["蹉"] = "左",
["瑳"] = "左",
["搓"] = "左",
["磋"] = "左",
["溠"] = "左",
["傞"] = "左",
["醝"] = "左",
["瘥"] = "左",
["鹺"] = "左",
["嵯"] = "左",
["嵳"] = "左",
["蒫"] = "左",
["艖"] = "左",
["齹"] = "左",
["縒"] = "左",
["褨"] = "左",
["嗟"] = "左",
["差"] = "左",
["鎈"] = "左",
["槎"] = "左",
["髊"] = "左",
["脞"] = "坐",
["侳"] = "坐",
["挫"] = "坐",
["夎"] = "坐",
["遳"] = "坐",
["銼"] = "坐",
["剉"] = "坐",
["莝"] = "坐",
["趖"] = "坐",
["矬"] = "坐",
["痤"] = "坐",
["睉"] = "坐",
["坐"] = "坐",
["座"] = "坐",
["髽"] = "坐",
["鑿"] = "丵",
["糳"] = "丵",
["艐"] = "翪",
["堫"] = "翪",
["葼"] = "翪",
["鬷"] = "翪",
["嵕"] = "翪",
["猣"] = "翪",
["鯼"] = "翪",
["椶"] = "翪",
["騣"] = "翪",
["蝬"] = "翪",
["翪"] = "翪",
["緵"] = "翪",
["稯"] = "翪",
["鬉"] = "翪",
["糉"] = "翪",
}
5yadar74lz1a1jnwi6xomv7nxpvdp59
nhẻn
0
278339
2561622
2093431
2026-09-08T09:16:12Z
Hiyuune
50834
2561622
wikitext
text/x-wiki
=={{langname|tyz}}==
==={{section|pron}}===
{{tyz-IPA}}
==={{section|adj}}===
{{tyz-adj}}
# [[thẹn|Thẹn]], [[xấu hổ]].
==={{section|ref}}===
* {{R:Lương Bèn}}
7wn937zrcbin31gu0b7897drdxywbn9
lằm
0
278340
2561606
2093432
2026-09-08T08:15:21Z
Hiyuune
50834
2561606
wikitext
text/x-wiki
=={{langname|tyz}}==
==={{section|pron}}===
{{tyz-IPA}}
==={{section|adj}}===
{{tyz-adj}}
# [[xấu|Xấu]], [[tệ]].
===={{section|drv}}====
{{col|mtq|lằm lằm}}
==={{section|ref}}===
* {{R:Lương Bèn}}
* {{R:Nguyễn Văn Khang, Bùi Chỉ, Hoàng Văn Hành 2002}}
cmwwj0h70alz9260d7wnwpcqri6hbpk
uối
0
278345
2561572
2093439
2026-09-08T05:21:13Z
Hiyuune
50834
2561572
wikitext
text/x-wiki
=={{langname|tyz}}==
==={{section|pron}}===
{{tyz-IPA}}
==={{section|adj}}===
{{tyz-adj}}
# [[bẩn|Bẩn]].
===={{section|syn}}====
{{col|tyz|slẳm|ẹc|nảy}}
==={{section|ref}}===
* {{R:Lương Bèn}}
4qp8vm99qkofnholt6r4z3pva5p9n7i
lặc lư̱n
0
278346
2561571
2093440
2026-09-08T05:19:23Z
Hiyuune
50834
2561571
wikitext
text/x-wiki
=={{langname|tyz}}==
==={{section|pron}}===
{{tyz-IPA}}
==={{section|adj}}===
{{tyz-adj}}
# [[ghê]], [[bẩn]], [[tởm lợm]].
==={{section|ref}}===
* {{R:Lương Bèn}}
sepdm3m22674c0tmhh74aermp5z5phn
đắm đươn
0
278347
2561570
2093441
2026-09-08T05:19:05Z
Hiyuune
50834
2561570
wikitext
text/x-wiki
=={{langname|tyz}}==
==={{section|pron}}===
{{tyz-IPA}}
==={{section|adj}}===
{{tyz-adj}}
# [[sượng]].
# [[ghê]].
==={{section|ref}}===
* {{R:Lương Bèn}}
sieldvn0xhm5gonec33soioidux7avz
đây ngòi
0
278366
2561569
2093488
2026-09-08T05:18:01Z
Hiyuune
50834
2561569
wikitext
text/x-wiki
=={{langname|tyz}}==
==={{section|pron}}===
{{tyz-IPA}}
==={{section|adj}}===
{{tyz-adj}}
# [[đẹp|Đẹp]].
==={{section|ref}}===
* {{R:Lương Bèn}}
ax4kguwm7nw73oxhzk4xf9bbrqs48xn
Mô đun:languages/data/exceptional
828
279282
2561611
2559533
2026-09-08T08:54:53Z
Hiyuune
50834
2561611
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["aav-bhu"] = {
"tiếng Bhumij",
57920059,
"mun",
nil,
"Tiếng Bhumij",
"Bhumij",
}
m["aav-khs-pro"] = {
"tiếng Khasi nguyên thủy",
nil,
"aav-khs",
"Latn",
"Tiếng Khasi nguyên thủy",
"Khasi nguyên thủy",
type = "reconstructed",
}
m["aav-nic-pro"] = {
"tiếng Nicobar nguyên thủy",
nil,
"aav-nic",
"Latn",
"Tiếng Nicobar nguyên thủy",
"Nicobar nguyên thủy",
type = "reconstructed",
}
m["aav-pkl-pro"] = {
"tiếng Pnar-Khasi-Lyngngam nguyên thủy",
nil,
"aav-pkl",
"Latn",
"Tiếng Pnar-Khasi-Lyngngam nguyên thủy",
"Pnar-Khasi-Lyngngam nguyên thủy",
type = "reconstructed",
}
m["aav-pro"] = { --The mkh-pro will merge into this.
"tiếng Nam Á nguyên thủy",
nil,
"aav",
"Latn",
"Tiếng Nam Á nguyên thủy",
"Nam Á nguyên thủy",
type = "reconstructed",
}
m["aav-tam"] = {
"tiếng Tà Mun",
130370566,
"mkh-ban",
nil,
"Tiếng Tà Mun",
"Tà Mun",
}
m["afa-pro"] = {
"tiếng Phi-Á nguyên thủy",
269125,
"afa",
"Latn",
"Tiếng Phi-Á nguyên thủy",
"Phi-Á nguyên thủy",
type = "reconstructed",
}
m["alg-aga"] = {
"tiếng Agawam",
nil,
"alg-eas",
"Latn",
"Tiếng Agawam",
"Agawam",
}
m["alg-pro"] = {
"tiếng Algonquin nguyên thủy",
7251834,
"alg",
"Latn",
"Tiếng Algonquin nguyên thủy",
"Algonquin nguyên thủy",
type = "reconstructed",
sort_key = {remove_diacritics = "·"},
}
m["alv-ama"] = {
"Amasi",
4740400,
"nic-grs",
"Latn",
entry_name = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.tilde .. c.macron},
}
m["alv-bgu"] = {
"Baïnounk Gubëeher",
17002646,
"alv-bny",
"Latn",
}
m["alv-bua-pro"] = {
"Proto-Bua",
nil,
"alv-bua",
"Latn",
type = "reconstructed",
}
m["alv-cng-pro"] = {
"Proto-Cangin",
nil,
"alv-cng",
"Latn",
type = "reconstructed",
}
m["alv-edo-pro"] = {
"tiếng Edoid nguyên thủy",
nil,
"alv-edo",
"Latn",
"Tiếng Edoid nguyên thủy",
"Edoid nguyên thủy",
type = "reconstructed",
}
m["alv-fli-pro"] = {
"Proto-Fali",
nil,
"alv-fli",
"Latn",
type = "reconstructed",
}
m["alv-gbe-pro"] = {
"tiếng Gbe nguyên thủy",
nil,
"alv-gbe",
"Latn",
"Tiếng Gbe nguyên thủy",
"Gbe nguyên thủy",
type = "reconstructed",
}
m["alv-gng-pro"] = {
"Proto-Guang",
nil,
"alv-gng",
"Latn",
type = "reconstructed",
}
m["alv-gtm-pro"] = {
"Proto-Central Togo",
nil,
"alv-gtm",
"Latn",
type = "reconstructed",
}
m["alv-gwa"] = {
"Gwara",
16945580,
"nic-pla",
"Latn",
}
m["alv-hei-pro"] = {
"Proto-Heiban",
nil,
"alv-hei",
"Latn",
type = "reconstructed",
}
m["alv-ido-pro"] = {
"Proto-Idomoid",
nil,
"alv-ido",
"Latn",
type = "reconstructed",
}
m["alv-igb-pro"] = {
"Proto-Igboid",
nil,
"alv-igb",
"Latn",
type = "reconstructed",
}
m["alv-kwa-pro"] = {
"Proto-Kwa",
nil,
"alv-kwa",
"Latn",
type = "reconstructed",
}
m["alv-mum-pro"] = {
"Proto-Mumuye",
nil,
"alv-mum",
"Latn",
type = "reconstructed",
}
m["alv-nup-pro"] = {
"Proto-Nupoid",
nil,
"alv-nup",
"Latn",
type = "reconstructed",
}
m["alv-pro"] = {
"tiếng Đại Tây Dương–Congo nguyên thủy",
nil,
"alv",
"Latn",
"Tiếng Đại Tây Dương–Congo nguyên thủy",
"Đại Tây Dương–Congo nguyên thủy",
type = "reconstructed",
}
m["alv-edk-pro"] = {
"tiếng Edekiri nguyên thủy",
nil,
"alv-edk",
"Latn",
"Tiếng Edekiri nguyên thủy",
"Edekiri nguyên thủy",
type = "reconstructed",
}
m["alv-yor-pro"] = {
"tiếng Yoruba nguyên thủy",
nil,
"alv-yor",
"Latn",
"Tiếng Yoruba nguyên thủy",
"Yoruba nguyên thủy",
type = "reconstructed",
}
m["alv-yrd-pro"] = {
"tiếng Yorubo nguyên thủy",
116773824,
"alv-yrd",
"Latn",
"Tiếng Yorubo nguyên thủy",
"Yorubo nguyên thủy",
type = "reconstructed",
}
m["alv-von-pro"] = {
"tiếng Volta-Niger nguyên thủy",
nil,
"alv-von",
"Latn",
"Tiếng Volta-Niger nguyên thủy",
"Volta-Niger nguyên thủy",
type = "reconstructed",
}
m["apa-pro"] = {
"Proto-Apachean",
nil,
"apa",
"Latn",
type = "reconstructed",
}
m["aql-pro"] = {
"tiếng Algic nguyên thủy",
18389588,
"aql",
"Latn",
"Tiếng Algic nguyên thủy",
"Algic nguyên thủy",
type = "reconstructed",
sort_key = {remove_diacritics = "·"},
}
m["art-blk"] = {
"Bolak",
2909283,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-bsp"] = {
"Black Speech",
686210,
"art",
"Latn, Teng",
type = "appendix-constructed",
}
m["art-com"] = {
"Communicationssprache",
35227,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-dtk"] = {
"Dothraki",
2914733,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-elo"] = {
"Eloi",
nil,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-gld"] = {
"Goa'uld",
19823,
"art",
"Latn, Egyp, Mero",
type = "appendix-constructed",
}
m["art-lap"] = {
"Lapine",
6488195,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-man"] = {
"Mandalorian",
54289,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-mun"] = {
"Mundolinco",
851355,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-nav"] = {
"Na'vi",
316939,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-nox"] = {
"Noxilo",
nil,
"art",
"Latn",
type = "appendix-constructed",
}
m["art-una"] = {
"Unas",
nil,
"art",
"Latn",
type = "appendix-constructed",
}
m["ath-nic"] = {
"Nicola",
20609,
"ath-nor",
"Latn",
}
m["ath-pro"] = {
"tiếng Athabasca nguyên thủy",
104841722,
"ath",
"Latn",
type = "reconstructed",
"Tiếng Athabasca nguyên thủy",
"Athabasca nguyên thủy",
}
m["auf-pro"] = {
"Proto-Arawa",
nil,
"auf",
"Latn",
type = "reconstructed",
}
m["aus-alu"] = {
"Alungul",
16827670,
"aus-pmn",
"Latn",
}
m["aus-and"] = {
"Andjingith",
4754509,
"aus-pmn",
"Latn",
}
m["aus-ang"] = {
"tiếng Angkula",
16828520,
"aus-pmn",
"Latn",
"Tiếng Angkula",
"Angkula",
}
m["aus-arn-pro"] = {
"Proto-Arnhem",
nil,
"aus-arn",
"Latn",
type = "reconstructed",
}
m["aus-bra"] = {
"Barranbinya",
4863220,
"aus-pmn",
"Latn",
}
m["aus-brm"] = {
"Barunggam",
4865914,
"aus-pmn",
"Latn",
}
m["aus-cww-pro"] = {
"Proto-Central New South Wales",
nil,
"aus-cww",
"Latn",
type = "reconstructed",
}
m["aus-dal-pro"] = {
"Proto-Daly",
nil,
"aus-dal",
"Latn",
type = "reconstructed",
}
m["aus-guw"] = {
"Guwar",
6652138,
"aus-pam",
"Latn",
}
m["aus-lsw"] = {
"Little Swanport",
6652138,
nil,
"Latn",
}
m["aus-mbi"] = {
"Mbiywom",
6799701,
"aus-pmn",
"Latn",
}
m["aus-ngk"] = {
"Ngkoth",
7022405,
"aus-pmn",
"Latn",
}
m["aus-nyu-pro"] = {
"Proto-Nyulnyulan",
nil,
"aus-nyu",
"Latn",
type = "reconstructed",
}
m["aus-pam-pro"] = {
"tiếng Pama-Nyungar nguyên thủy",
33942,
"aus-pam",
"Latn",
"Tiếng Pama-Nyungar nguyên thủy",
"Pama-Nyungar nguyên thủy",
type = "reconstructed",
}
m["aus-tul"] = {
"Tulua",
16938541,
"aus-pam",
"Latn",
}
m["aus-uwi"] = {
"Uwinymil",
7903995,
"aus-arn",
"Latn",
}
m["aus-wdj-pro"] = {
"Proto-Iwaidjan",
nil,
"aus-wdj",
"Latn",
type = "reconstructed",
}
m["aus-won"] = {
"Wong-gie",
nil,
"aus-pam",
"Latn",
}
m["aus-wul"] = {
"Wulguru",
8039196,
"aus-dyb",
"Latn",
}
m["aus-ynk"] = { -- contrast nny
"Yangkaal",
3913770,
"aus-tnk",
"Latn",
}
m["awd-amc-pro"] = {
"Proto-Amuesha-Chamicuro",
nil,
"awd",
"Latn",
type = "reconstructed",
ancestors = "awd-pro",
}
m["awd-kmp-pro"] = {
"Proto-Kampa",
nil,
"awd",
"Latn",
type = "reconstructed",
ancestors = "awd-pro",
}
m["awd-prw-pro"] = {
"Proto-Paresi-Waura",
nil,
"awd",
"Latn",
type = "reconstructed",
ancestors = "awd-pro",
}
m["awd-ama"] = {
"Amarizana",
16827787,
"awd",
"Latn",
}
m["awd-ana"] = {
"tiếng Anauyá",
16828252,
"awd",
"Latn",
"Tiếng Anauyá",
"Anauyá",
}
m["awd-apo"] = {
"Apolista",
16916645,
"awd",
"Latn",
}
m["awd-cav"] = {
"Cavere",
nil,
"awd",
"Latn",
}
m["awd-gnu"] = {
"Guinau",
3504087,
"awd",
"Latn",
}
m["awd-kar"] = {
"Cariay",
16920253,
"awd",
"Latn",
}
m["awd-kaw"] = {
"Kawishana",
6379993,
"awd-nwk",
"Latn",
}
m["awd-kus"] = {
"Kustenau",
5196293,
"awd",
"Latn",
}
m["awd-man"] = {
"Manao",
6746920,
"awd",
"Latn",
}
m["awd-mar"] = {
"Marawan",
6755108,
"awd",
"Latn",
}
m["awd-mpr"] = {
"Maypure",
nil,
"awd",
"Latn",
}
m["awd-mrt"] = {
"Mariaté",
16910017,
"awd-nwk",
"Latn",
}
m["awd-nwk-pro"] = {
"Proto-Nawiki",
nil,
"awd-nwk",
"Latn",
type = "reconstructed",
}
m["awd-pai"] = {
"Paikoneka",
nil,
"awd",
"Latn",
}
m["awd-pas"] = {
"Passé",
nil,
"awd-nwk",
"Latn",
}
m["awd-pro"] = {
"tiếng Arawak nguyên thủy",
nil,
"awd",
"Latn",
"Tiếng Arawak nguyên thủy",
"Arawak nguyên thủy",
type = "reconstructed",
}
m["awd-she"] = {
"tiếng Shebayo",
7492248,
"awd",
"Latn",
"Tiếng Shebayo",
"Shebayo"
}
m["awd-taa-pro"] = {
"Proto-Ta-Arawak",
nil,
"awd-taa",
"Latn",
type = "reconstructed",
}
m["awd-wai"] = {
"Wainumá",
16910017,
"awd-nwk",
"Latn",
}
m["awd-yum"] = {
"Yumana",
8061062,
"awd-nwk",
"Latn",
}
m["azc-caz"] = {
"Cazcan",
5055514,
"azc",
"Latn",
}
m["azc-cup-pro"] = {
"Proto-Cupan",
nil,
"azc-cup",
"Latn",
type = "reconstructed",
}
m["azc-ktn"] = {
"Kitanemuk",
3197558,
"azc-tak",
"Latn",
}
m["azc-nah-pro"] = {
"tiếng Nahua nguyên thủy",
7251860,
"azc-nah",
"Latn",
"Tiếng Nahua nguyên thủy",
"Nahua nguyên thủy",
type = "reconstructed",
}
m["azc-num-pro"] = {
"Proto-Numic",
nil,
"azc-num",
"Latn",
type = "reconstructed",
}
m["azc-pro"] = {
"tiếng Ute-Aztec nguyên thủy",
96400333,
"azc",
"Latn",
"Tiếng Ute-Aztec nguyên thủy",
"Ute-Aztec nguyên thủy",
type = "reconstructed",
}
m["azc-tak-pro"] = {
"Proto-Takic",
nil,
"azc-tak",
"Latn",
type = "reconstructed",
}
m["azc-tat"] = {
"Tataviam",
743736,
"azc",
"Latn",
}
m["ber-pro"] = {
"tiếng Berber nguyên thủy",
2855698,
"ber",
"Latn",
"Tiếng Berber nguyên thủy",
"Berber nguyên thủy",
type = "reconstructed",
}
m["ber-fog"] = {
"tiếng Fogaha",
107610173,
"ber",
"Latn",
"Tiếng Fogaha",
"Fogaha",
}
m["ber-zuw"] = {
"Zuwara",
4117169,
"ber",
"Latn",
}
m["bnt-bal"] = {
"Balong",
93935237,
"bnt-bbo",
"Latn",
}
m["bnt-bon"] = {
"Boma Nkuu",
nil,
"bnt",
"Latn",
}
m["bnt-boy"] = {
"Boma Yumu",
nil,
"bnt",
"Latn",
}
m["bnt-bwa"] = {
"Bwala",
nil,
"bnt-tek",
"Latn",
}
m["bnt-cmw"] = {
"Chimwiini",
4958328,
"bnt-swh",
"Latn",
}
m["bnt-ind"] = {
"Indanga",
51412803,
"bnt",
"Latn",
}
m["bnt-lal"] = {
"Lala (South Africa)",
6480154,
"bnt-ngu",
"Latn",
}
m["bnt-lwl"] = {
"Lwel",
93936908,
"bnt-bdz",
"Latn",
}
m["bnt-mpi"] = {
"Mpiin",
93937013,
"bnt-bdz",
"Latn",
}
m["bnt-mpu"] = {
"Mpuono", --not to be confused with Mbuun zmp
36056,
"bnt",
"Latn",
}
m["bnt-ngu-pro"] = {
"tiếng Nguni nguyên thủy",
961559,
"bnt-ngu",
"Latn",
"Tiếng Nguni nguyên thủy",
"Nguni nguyên thủy",
type = "reconstructed",
sort_key = {remove_diacritics = c.grave .. c.acute .. c.circ .. c.caron},
}
m["bnt-phu"] = {
"Phuthi",
33796,
"bnt-ngu",
"Latn",
entry_name = {remove_diacritics = c.grave .. c.acute},
}
m["bnt-pro"] = {
"tiếng Bantu nguyên thủy",
3408025,
"bnt",
"Latn",
"Tiếng Bantu nguyên thủy",
"Bantu nguyên thủy",
type = "reconstructed",
sort_key = "bnt-pro-sortkey",
}
m["bnt-sbo"] = {
"South Boma",
nil,
"bnt",
"Latn",
}
m["bnt-sts-pro"] = {
"Proto-Sotho-Tswana",
nil,
"bnt-sts",
"Latn",
type = "reconstructed",
}
m["btk-pro"] = {
"Proto-Batak",
nil,
"btk",
"Latn",
type = "reconstructed",
}
m["cau-abz-pro"] = {
"tiếng Abkhaz-Abaza nguyên thủy",
7251831,
"cau-abz",
"Latn",
"Tiếng Abkhaz-Abaza nguyên thủy",
"Abkhaz-Abaza nguyên thủy",
type = "reconstructed",
}
m["cau-ava-pro"] = {
"tiếng Avar-Andic nguyên thủy",
116773187,
"cau-ava",
"Latn",
"Tiếng Avar-Andic nguyên thủy",
"Avar-Andic nguyên thủy",
type = "reconstructed",
}
m["cau-cir-pro"] = {
"tiếng Circassia nguyên thủy",
7251838,
"cau-cir",
"Latn",
"Tiếng Circassia nguyên thủy",
"Circassia nguyên thủy",
type = "reconstructed",
}
m["cau-drg-pro"] = {
"tiếng Dargwa nguyên thủy",
nil,
"cau-drg",
"Latn",
"Tiếng Dargwa nguyên thủy",
"Dargwa nguyên thủy",
type = "reconstructed",
}
m["cau-lzg-pro"] = {
"tiếng Lezgi nguyên thủy",
nil,
"cau-lzg",
"Latn",
"Tiếng Lezgi nguyên thủy",
"Lezgi nguyên thủy",
type = "reconstructed",
}
m["cau-nec-pro"] = {
"tiếng Đông Bắc Kavkaz nguyên thủy",
nil,
"cau-nec",
"Latn",
"Tiếng Đông Bắc Kavkaz nguyên thủy",
"Đông Bắc Kavkaz nguyên thủy",
type = "reconstructed",
}
m["cau-nkh-pro"] = {
"tiếng Nakh nguyên thủy",
nil,
"cau-nkh",
"Latn",
"Tiếng Nakh nguyên thủy",
"Nakh nguyên thủy",
type = "reconstructed",
}
m["cau-nwc-pro"] = {
"tiếng Tây Bắc Kavkaz nguyên thủy",
7251861,
"cau-nwc",
"Latn",
"Tiếng Tây Bắc Kavkaz nguyên thủy",
"Tây Bắc Kavkaz nguyên thủy",
type = "reconstructed",
}
m["cau-tsz-pro"] = {
"Proto-Tsezian",
nil,
"cau-tsz",
"Latn",
type = "reconstructed",
}
m["cba-ata"] = {
"Atanques",
4812783,
"cba",
"Latn",
}
m["cba-cat"] = {
"Catío Chibcha",
7083619,
"cba",
"Latn",
}
m["cba-dor"] = {
"Dorasque",
5297532,
"cba",
"Latn",
}
m["cba-dui"] = {
"Duit",
3041061,
"cba",
"Latn",
}
m["cba-hue"] = {
"Huetar",
35514,
"cba",
"Latn",
}
m["cba-nut"] = {
"Nutabe",
7070405,
"cba",
"Latn",
}
m["cba-pro"] = {
"Proto-Chibchan",
nil,
"cba",
"Latn",
type = "reconstructed",
}
m["ccn-pro"] = {
"Proto-North Caucasian",
nil,
"ccn",
"Latn",
type = "reconstructed",
}
m["ccs-pro"] = {
"tiếng Kartvelia nguyên thủy",
2608203,
"ccs",
"Latn",
type = "reconstructed",
"Tiếng Kartvelia nguyên thủy",
"Kartvelia nguyên thủy",
entry_name = {
from = {"q̣", "p̣", "ʓ", "ċ"},
to = {"q̇", "ṗ", "ʒ", "c̣"}
},
}
m["ccs-gzn-pro"] = {
"tiếng Gruzia-Zan nguyên thủy",
23808119,
"ccs-gzn",
"Latn",
"Tiếng Gruzia-Zan nguyên thủy",
"Gruzia-Zan nguyên thủy",
type = "reconstructed",
entry_name = {
from = {"q̣", "p̣", "ʓ", "ċ"},
to = {"q̇", "ṗ", "ʒ", "c̣"}
},
}
m["cdc-cbm-pro"] = {
"Proto-Central Chadic",
nil,
"cdc-cbm",
"Latn",
type = "reconstructed",
}
m["cdc-mas-pro"] = {
"Proto-Masa",
nil,
"cdc-mas",
"Latn",
type = "reconstructed",
}
m["cdc-pro"] = {
"tiếng Tchad nguyên thủy",
nil,
"cdc",
"Latn",
"Tiếng Tchad nguyên thủy",
"Tchad nguyên thủy",
type = "reconstructed",
}
m["cdd-pro"] = {
"Proto-Caddoan",
nil,
"cdd",
"Latn",
type = "reconstructed",
}
m["cel-bry-pro"] = {
"tiếng Britton nguyên thủy",
1248800,
"cel-bry",
"Latn, Polyt",
"Tiếng Britton nguyên thủy",
"Britton nguyên thủy",
sort_key = {
Latn = "cel-bry-pro-sortkey",
},
-- Polyt translit, display_text, strip_diacritics, sort_key in [[Module:scripts/data]]
}
m["cel-gal"] = {
"Gallaecian",
3094789,
"cel",
}
m["cel-gau"] = {
"tiếng Gaul",
29977,
"cel",
"Latn, Grek, Ital",
"Tiếng Gaul",
"Gaul",
entry_name = {remove_diacritics = c.macron .. c.breve .. c.diaer},
}
m["cel-pro"] = {
"tiếng Celt nguyên thủy",
653649,
"cel",
"Latn",
"Tiếng Celt nguyên thủy",
"Celt nguyên thủy",
type = "reconstructed",
sort_key = "cel-pro-sortkey",
}
m["chi-pro"] = {
"Proto-Chimakuan",
nil,
"chi",
"Latn",
type = "reconstructed",
}
m["chm-pro"] = {
"tiếng Mari nguyên thủy",
nil,
"chm",
"Latn",
"Tiếng Mari nguyên thủy",
"Mari nguyên thủy",
type = "reconstructed",
}
m["cmc-pro"] = {
"tiếng Chăm nguyên thủy",
nil,
"cmc",
"Latn",
"Tiếng Chăm nguyên thủy",
"Chăm nguyên thủy",
type = "reconstructed",
}
m["cpe-mar"] = {
"Maroon Spirit Language",
1093206,
"crp",
"Latn",
ancestors = "en",
}
m["cpe-spp"] = {
"Samoan Plantation Pidgin",
7409948,
"crp",
"Latn",
ancestors = "en",
}
m["crp-gep"] = {
"West Greenlandic Pidgin",
17036301,
"crp",
"Latn",
ancestors = "kl",
}
m["crp-mpp"] = {
"Macau Pidgin Portuguese",
nil,
"crp",
"Hant, Latn",
ancestors = "pt",
sort_key = {Hant = "Hani-sortkey"},
}
m["crp-rsn"] = {
"Russenorsk",
505125,
"crp",
"Cyrl, Latn",
ancestors = "nn, ru",
}
m["crp-slb"] = {
"tiếng Anh Solombala",
7558525,
"crp",
"Cyrl, Latn",
"Tiếng Anh Solombala",
"Anh Solombala",
ancestors = "en, ru",
}
m["crp-tpr"] = {
"tiếng Nga bồi Taimyr",
16930506,
"crp",
"Cyrl",
"Tiếng Nga bồi Taimyr",
"Nga bồi Taimyr",
ancestors = "ru",
}
m["csu-bba-pro"] = {
"Proto-Bongo-Bagirmi",
nil,
"csu-bba",
"Latn",
type = "reconstructed",
}
m["csu-maa-pro"] = {
"Proto-Mangbetu",
nil,
"csu-maa",
"Latn",
type = "reconstructed",
}
m["csu-pro"] = {
"Proto-Central Sudanic",
nil,
"csu",
"Latn",
type = "reconstructed",
}
m["csu-sar-pro"] = {
"Proto-Sara",
nil,
"csu-sar",
"Latn",
type = "reconstructed",
}
m["ctp-san"] = {
"San Juan Quiahije Chatino",
nil,
"omq-cha",
"Latn",
}
m["cus-ash"] = {
"tiếng Ashraaf",
4805855,
"cus-eas",
"Latn",
"Tiếng Ashraaf",
"Ashraaf",
}
m["cus-hec-pro"] = {
"Proto-Highland East Cushitic",
nil,
"cus-hec",
"Latn",
type = "reconstructed",
}
m["cus-som-pro"] = {
"tiếng Somali nguyên thủy",
nil,
"cus-som",
"Latn",
"Tiếng Somali nguyên thủy",
"Somali nguyên thủy",
type = "reconstructed",
}
m["cus-sou-pro"] = {
"Proto-South Cushitic",
126081567,
"cus-sou",
"Latn",
type = "reconstructed",
}
m["cus-pro"] = {
"tiếng Cushit nguyên thủy",
nil,
"cus",
"Latn",
"Tiếng Cushit nguyên thủy",
"Cushit nguyên thủy",
type = "reconstructed",
}
m["dmn-dam"] = {
"Dama (Sierra Leone)",
19601574,
"dmn",
"Latn",
}
m["dra-mkn"] = {
"Middle Kannada",
nil,
"dra",
"Knda",
ancestors = "dra-okn",
translit = "kn-translit",
}
m["dra-okn"] = {
"tiếng Kannada cổ",
15723156,
"dra",
"Knda",
"Tiếng Kannada cổ",
"Kannada cổ",
ancestors = "dra-pro",
translit = "kn-translit",
}
m["dra-ote"] = {
"tiếng Telugu cổ",
126720868,
"dra-tel",
"Telu",
"Tiếng Telugu cổ",
"Telugu cổ",
translit = "te-translit",
}
m["dra-pro"] = {
"tiếng Dravida nguyên thủy",
1702853,
"dra",
"Latn",
"Tiếng Dravida nguyên thủy",
"Dravida nguyên thủy",
type = "reconstructed",
}
m["dra-sdo-pro"] = {
"tiếng Nam Dravida I nguyên thủy",
104847952, -- Wikipedia's "Proto-South Dravidian" is Proto-South Dravidian I in this scheme.
"dra-sdo",
"Latn",
"Tiếng Nam Dravida I nguyên thủy",
"Nam Dravida I nguyên thủy",
type = "reconstructed",
}
m["dra-sdt-pro"] = {
"tiếng Nam Dravida II nguyên thủy",
128885257,
"dra-sdt",
"Latn",
"Tiếng Nam Dravida II nguyên thủy",
"Nam Dravida II nguyên thủy",
type = "reconstructed",
}
m["dra-sou-pro"] = {
"tiếng Nam Dravida nguyên thủy",
128886121,
"dra-sou",
"Latn",
"Tiếng Nam Dravida nguyên thủy",
"Nam Dravida nguyên thủy",
type = "reconstructed",
}
m["egx-dem"] = {
"tiếng Ai Cập bình dân",
36765,
"egx",
"Latn, Egyd, Polyt",
"Tiếng Ai Cập bình dân",
"Ai Cập bình dân",
display_text = {
Polyt = s["Polyt-displaytext"],
},
entry_name = {
Polyt = s["Polyt-entryname"],
},
sort_key = {
Latn = {
remove_diacritics = "'%-%s",
from = {"ꜣ", "j", "e", "ꜥ", "y", "w", "b", "p", "f", "m", "n", "r", "l", "ḥ", "ḫ", "h̭", "ẖ", "h", "š", "s", "q", "k", "g", "ṱ", "ṯ", "t", "ḏ", "%.", "⸗"},
to = {p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9], p[10], p[11], p[12], p[13], p[15], p[16], p[16], p[17], p[14], p[19], p[18], p[20], p[21], p[22], p[23], p[24], p[23], p[25], p[26], p[26]}
},
Polyt = s["Polyt-sortkey"],
},
}
m["elu-prk"] = {
"Helu",
15080869,
"inc-mid",
"Brah",
ancestors = "inc-pra",
translit = "Brah-translit",
}
m["dmn-pro"] = {
"tiếng Mande nguyên thủy",
nil,
"dmn",
"Latn",
"Tiếng Mande nguyên thủy",
"Mande nguyên thủy",
type = "reconstructed",
}
m["dmn-mdw-pro"] = {
"Proto-Western Mande",
nil,
"dmn-mdw",
"Latn",
type = "reconstructed",
}
m["dru-pro"] = {
"tiếng Rukai nguyên thủy",
nil,
"map",
"Latn",
"Tiếng Rukai nguyên thủy",
"Rukai nguyên thủy",
type = "reconstructed",
}
m["ero-tau"] = {
"tiếng Stau",
nil,
"ero",
"Latn",
"Tiếng Stau",
"Stau",
}
m["esx-esk-pro"] = {
"tiếng Eskimo nguyên thủy",
7251842,
"esx-esk",
"Latn",
"Tiếng Eskimo nguyên thủy",
"Eskimo nguyên thủy",
type = "reconstructed",
}
m["esx-ink"] = {
"Inuktun",
1671647,
"esx-inu",
"Latn",
}
m["esx-inq"] = {
"Inuinnaqtun",
28070,
"esx-inu",
"Latn",
}
m["esx-inu-pro"] = {
"tiếng Inuit nguyên thủy",
60785588,
"esx-inu",
"Latn",
"Tiếng Inuit nguyên thủy",
"Inuit nguyên thủy",
type = "reconstructed",
}
m["esx-pro"] = {
"tiếng Eskimo-Aleut nguyên thủy",
7251843,
"esx",
"Latn",
"Tiếng Eskimo-Aleut nguyên thủy",
"Eskimo-Aleut nguyên thủy",
type = "reconstructed",
}
m["esx-tut"] = {
"Tunumiisut",
15665389,
"esx-inu",
"Latn",
}
m["euq-pro"] = {
"tiếng Basque nguyên thủy",
938011,
"euq",
"Latn",
"Tiếng Basque nguyên thủy",
"Basque nguyên thủy",
type = "reconstructed",
}
m["gem-bur"] = {
"Burgundian",
nil,
"gme",
"Latn",
}
m["gem-pro"] = {
"tiếng German nguyên thủy",
669623,
"gem",
"Latn",
"Tiếng German nguyên thủy",
"German nguyên thủy",
type = "reconstructed",
sort_key = "gem-pro-sortkey",
}
m["gme-cgo"] = {
"Crimean Gothic",
36211,
"gme",
"Latn",
}
m["gmq-bot"] = {
"Westrobothnian",
7989641,
"gmq",
"Latn",
ancestors = "non",
}
m["gmq-gut"] = {
"tiếng Gotland",
1256646,
"gmq",
"Latn",
"Tiếng Gotland",
"Gotland",
ancestors = "gmq-ogt",
}
m["gmq-ogt"] = {
"tiếng Gotland cổ",
1133488,
"gmq",
"Latn, Runr",
"Tiếng Gotland cổ",
"Gotland cổ",
ancestors = "non",
}
m["gmq-jmk"] = {
"Jamtish",
nil,
"gmq",
"Latn",
ancestors = "non",
}
m["gmq-mno"] = {
"tiếng Na Uy trung đại",
3417070,
"gmq-wes",
"Latn",
}
m["gmq-oda"] = {
"tiếng Đan Mạch cổ",
nil,
"gmq-eas",
"Latn, Runr",
"Tiếng Đan Mạch cổ",
"Đan Mạch cổ",
ancestors = "non",
strip_diacritics = {remove_diacritics = c.macron},
}
m["gmq-osw"] = {
"tiếng Thụy Điển cổ",
2417210,
"gmq",
"Latn",
"Tiếng Thụy Điển cổ",
"Thụy Điển cổ",
ancestors = "non",
strip_diacritics = {remove_diacritics = c.macron},
}
m["gmq-pro"] = {
"tiếng Bắc Âu nguyên thủy",
1671294,
"gmq",
"Runr",
"Tiếng Bắc Âu nguyên thủy",
"Bắc Âu nguyên thủy",
translit = "Runr-translit",
}
m["gmq-scy"] = {
"Scanian",
768017,
"gmq",
"Latn",
ancestors = "non",
}
m["gmw-bgh"] = {
"Bergish",
329030,
"gmw",
"Latn",
ancestors = "odt",
}
m["gmw-cfr"] = {
"tiếng Franken Trung",
nil,
"gmw",
"Latn",
"Tiếng Franken Trung",
"Franken Trung",
ancestors = "gmh",
wikimedia_codes = "ksh",
}
m["gmw-ecg"] = {
"tiếng Đức Đông Trung",
499344, -- subsumes Q699284, Q152965
"gmw",
"Latn",
"Tiếng Đức Đông Trung",
"Đức Đông Trung",
ancestors = "gmh",
}
m["gmw-gts"] = {
"Gottscheerish",
533109,
"gmw",
"Latn",
ancestors = "bar",
}
m["gmw-jdt"] = {
"tiếng Hà Lan Jersey",
1687911,
"gmw",
"Latn",
"Tiếng Hà Lan Jersey",
"Hà Lan Jersey",
ancestors = "nl",
}
m["gmw-msc"] = {
"tiếng Scots trung đại",
3327000,
"gmw-ang",
"Latn",
"Tiếng Scots trung đại",
"Scots trung đại",
ancestors = "enm-esc",
}
m["gmw-pro"] = {
"tiếng German Tây nguyên thủy",
78079021,
"gmw",
"Latn",
"Tiếng German Tây nguyên thủy",
"German Tây nguyên thủy",
type = "reconstructed",
sort_key = "gmw-pro-sortkey",
wikipedia_article = "Chi ngôn ngữ German phía Tây"
}
m["gmw-rfr"] = {
"Rhine Franconian",
707007,
"gmw",
"Latn",
ancestors = "gmh",
}
m["gmw-stm"] = {
"Sathmar Swabian",
2223059,
"gmw",
"Latn",
ancestors = "swg",
}
m["gmw-tsx"] = {
"tiếng Saxon Transylvania",
260942,
"gmw",
"Latn",
"Tiếng Saxon Transylvania",
"Saxon Transylvania",
ancestors = "gmw-cfr",
}
m["gmw-vog"] = {
"Volga German",
312574,
"gmw",
"Latn",
ancestors = "gmw-rfr",
}
m["gmw-zps"] = {
"Zipser German",
205548,
"gmw",
"Latn",
ancestors = "gmh",
}
m["gn-cls"] = {
"Classical Guaraní",
17478065,
"tup-gua",
"Latn",
ancestors = "gn",
}
m["grk-cal"] = {
"Calabrian Greek",
1146398,
"grk",
"Latn",
ancestors = "grc",
}
m["grk-ita"] = {
"tiếng Hy Lạp Italiot",
nil,
"grk",
"Latn, Grek",
"Tiếng Hy Lạp Italiot",
"Hy Lạp Italiot",
ancestors = "grc",
entry_name = {remove_diacritics = c.caron .. c.diaerbelow .. c.brevebelow},
sort_key = s["Grek-sortkey"],
}
m["grk-mar"] = {
"tiếng Hy Lạp Mariupol",
4400023,
"grk",
"Cyrl, Latn, Grek",
ancestors = "grc",
translit = "grk-mar-translit",
override_translit = true,
entry_name = "grk-mar-entryname",
sort_key = s["Grek-sortkey"],
"Tiếng Hy Lạp Mariupol",
"Hy Lạp Mariupol",
}
m["grk-pro"] = {
"tiếng Hellen nguyên thủy",
1231805,
"grk",
"Latn",
"Tiếng Hellen nguyên thủy",
"Hellen nguyên thủy",
type = "reconstructed",
sort_key = {
from = {"[áā]", "[éēḗ]", "[íī]", "[óōṓ]", "[úū]", "ď", "ľ", "ň", "ř", "ʰ", "ʷ", c.acute, c.macron},
to = {"a", "e", "i", "o", "u", "d", "l", "n", "r", "¯h", "¯w"}
},
}
m["hmn-pro"] = {
"Proto-Hmong",
nil,
"hmn",
"Latn",
type = "reconstructed",
}
m["hmx-mie-pro"] = {
"tiếng Miền nguyên thủy",
nil,
"hmx-mie",
"Latn",
"Tiếng Miền nguyên thủy",
"Miền nguyên thủy",
type = "reconstructed",
}
m["hmx-pro"] = {
"tiếng H'Mông-Miền nguyên thủy",
7251846,
"hmx",
"Latn",
"Tiếng H'Mông-Miền nguyên thủy",
"H'Mông-Miền nguyên thủy",
type = "reconstructed",
}
m["hyx-pro"] = {
"tiếng Armenia nguyên thủy",
3848498,
"hyx",
"Latn",
"Tiếng Armenia nguyên thủy",
"Armenia nguyên thủy",
type = "reconstructed",
}
m["iir-nur-pro"] = {
"tiếng Nuristan nguyên thủy",
nil,
"iir-nur",
"Latn",
"Tiếng Nuristan nguyên thủy",
"Nuristan nguyên thủy",
type = "reconstructed",
}
m["iir-pro"] = {
"tiếng Ấn-Iran nguyên thủy",
966439,
"iir",
"Latn",
"Tiếng Ấn-Iran nguyên thủy",
"Ấn-Iran nguyên thủy",
type = "reconstructed",
}
m["ijo-pro"] = {
"Proto-Ijoid",
nil,
"ijo",
"Latn",
type = "reconstructed",
}
m["inc-apa"] = {
"tiếng Apabhramsa",
616419,
"inc-mid",
"Deva, Shrd, Sidd",
"Tiếng Apabhramsa",
"Apabhramsa",
ancestors = "pra",
translit = {
Deva = "sa-translit",
Shrd = "Shrd-translit",
Sidd = "Sidd-translit",
},
}
m["inc-ash"] = {
"tiếng Prakrit Ashoka",
nil,
"inc-mid",
"Brah, Khar",
"Tiếng Prakrit Ashoka",
"Prakrit Ashoka",
ancestors = "sa",
translit = {
Brah = "Brah-translit",
Khar = "Khar-translit",
},
}
m["inc-gup"] = {
"Gurjar Apabhramsa",
nil,
"inc-mid",
"Deva",
ancestors = "psu",
}
m["inc-kam"] = {
"tiếng Kamarupi Prakrit",
6356097,
"inc-mid",
"Brah, Sidd",
"Tiếng Kamarupi Prakrit",
"Kamarupi Prakrit",
ancestors = "inc-mgd",
}
m["inc-kha"] = {
"tiếng Khasa Prakrit",
nil,
"inc-nor",
"Latn",
"Tiếng Khasa Prakrit",
"Khasa Prakrit",
ancestors = "inc-pra",
}
m["inc-kho"] = {
"tiếng Kholosi",
24952008,
"inc-snd",
"Latn",
"Tiếng Kholosi",
"Kholosi",
ancestors = "inc-vra",
}
m["inc-mas"] = {
"Middle Assamese",
nil,
"inc-eas",
"as-Beng",
ancestors = "inc-oas",
translit = "inc-mas-translit",
}
m["inc-mbn"] = {
"Middle Bengali",
nil,
"inc-eas",
"Beng",
ancestors = "inc-obn",
translit = "inc-mbn-translit",
}
m["inc-mgd"] = {
"Magadhi Prakrit",
2652214,
"inc-mid",
"Brah",
ancestors = "inc-pra",
translit = "Brah-translit",
}
m["inc-mgu"] = {
"tiếng Gujarat trung đại",
24907429,
"inc-wes",
"Deva",
"Tiếng Gujarat trung đại",
"Gujarat trung đại",
ancestors = "inc-ogu",
}
m["inc-mor"] = {
"tiếng Oriya trung đại",
128810882,
"inc-eas",
"Orya",
"Tiếng Oriya trung đại",
"Oriya trung đại",
ancestors = "inc-oor",
}
m["inc-oas"] = {
"tiếng Assam cận đại",
nil,
"inc-bas",
"as-Beng",
"Tiếng Assam cận đại",
"Assam cận đại",
ancestors = "inc-kam,pra-mag",
translit = "inc-oas-translit",
}
m["inc-oaw"] = {
"tiếng Awadh cổ",
nil,
"inc-hie",
"Deva, Kthi, ur-Arab",
"Tiếng Awadh cổ",
"Awadh cổ",
strip_diacritics = {
from = {"هٔ", "ۂ"}, -- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"
to = {"ہ", "ہ"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef
},
translit = {
Deva = "sa-translit",
Kthi = "sa-Kthi-translit",
["ur-Arab"] = "inc-ohi-translit",
},
}
m["inc-obn"] = {
"tiếng Bengal cổ",
113559926,
"inc-bas",
"Beng",
"Tiếng Bengal cổ",
"Bengal cổ",
ancestors = "inc-mgd",
}
m["inc-ogu"] = {
"tiếng Gujarat cổ",
24907427,
"inc-wes",
"Deva",
"Tiếng Gujarat cổ",
"Gujarat cổ",
ancestors = "inc-gup",
translit = "sa-translit",
}
m["inc-ohi"] = {
"tiếng Hindi cổ",
48767781,
"inc-hiw",
"Deva, ur-Arab",
"Tiếng Hindi cổ",
"Hindi cổ",
ancestors = "pra",
strip_diacritics = {
from = {"هٔ", "ۂ"}, -- character "ۂ" code U+06C2 to "ه" and "هٔ" (U+0647 + U+0654) to "ه"
to = {"ہ", "ہ"},
remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun .. c.nunghunna .. c.superalef
},
translit = {
Deva = "sa-translit",
["ur-Arab"] = "inc-ohi-translit",
},
}
m["inc-oor"] = {
"tiếng Oriya cổ",
128807801,
"inc-eas",
"Orya",
"Tiếng Oriya cổ",
"Oriya cổ",
}
m["inc-opa"] = {
"Old Punjabi",
nil,
"inc-pan",
"Guru, pa-Arab",
ancestors = "inc-tak",
translit = {
Guru = "inc-opa-Guru-translit",
["pa-Arab"] = "pa-Arab-translit",
},
entry_name = {remove_diacritics = c.fathatan .. c.dammatan .. c.kasratan .. c.fatha .. c.damma .. c.kasra .. c.shadda .. c.sukun},
}
m["inc-ork"] = {
"Old Kamta",
nil,
"inc-eas",
"as-Beng",
ancestors = "inc-kam",
translit = "as-translit",
}
m["inc-pra"] = {
"tiếng Prakrit",
192170,
"inc",
"Brah, Deva, Knda",
"Tiếng Prakrit",
"Prakrit",
ancestors = "inc-ash",
translit = {
Brah = "Brah-translit",
Deva = "inc-pra-Deva-translit",
Knda = "inc-pra-Knda-translit",
},
entry_name = {
from = {"ऎ", "ऒ", u(0x0946), u(0x094A), "य़", "ಯ಼", u(0x11071), u(0x11072), u(0x11073), u(0x11074)},
to = {"ए", "ओ", u(0x0947), u(0x094B), "य", "ಯ", "𑀏", "𑀑", u(0x11042), u(0x11044)}
} ,
}
m["inc-pro"] = {
"tiếng Ấn-Arya nguyên thủy",
23808344,
"inc",
"Latn",
"Tiếng Ấn-Arya nguyên thủy",
"Ấn-Arya nguyên thủy",
type = "reconstructed",
}
m["inc-psc"] = {
"tiếng Prakrit Paisaci",
2995607,
"inc-mid",
"Brah",
ancestors = "inc-ash",
translit = "Brah-translit",
"Tiếng Prakrit Paisaci",
"Prakrit Paisaci",
}
m["inc-sap"] = {
"Sauraseni Apabhramsa",
nil,
"inc-mid",
"Deva",
ancestors = "psu",
}
m["inc-tak"] = {
"Takka Apabhramsa",
nil,
"inc-mid",
"Deva",
ancestors = "inc-pra",
translit = "sa-translit",
}
m["inc-vra"] = {
"Vracada Apabhramsa",
nil,
"inc-mid",
"Deva",
ancestors = "inc-pra",
translit = "sa-translit",
}
m["inc-cen-pro"] = {
"Proto-Central Indo-Aryan",
nil,
"inc-cen",
"Latn",
type = "reconstructed",
ancestors = "psu",
}
m["ine-ana-pro"] = {
"tiếng Tiểu Á nguyên thủy",
7251833,
"ine-ana",
"Latn",
type = "reconstructed",
}
m["ine-bsl-pro"] = {
"tiếng Balt-Slav nguyên thủy",
1703347,
"ine-bsl",
"Latn",
"Tiếng Balt-Slav nguyên thủy",
"Balt-Slav nguyên thủy",
type = "reconstructed",
sort_key = {
from = {"[áā]", "[éēḗ]", "[íī]", "[óōṓ]", "[úū]", c.acute, c.macron, "ˀ"},
to = {"a", "e", "i", "o", "u"}
},
}
m["ine-grp-pro"] = {
"tiếng Graeco-Phrygia nguyên thủy",
nil,
"ine-grp",
"Latn",
"Tiếng Graeco-Phrygia nguyên thủy",
type = "reconstructed",
}
m["ine-pae"] = {
"Paeonian",
2705672,
"ine",
"polytonic",
translit = "grc-translit",
entry_name = {remove_diacritics = c.macron .. c.breve},
sort_key = s["Grek-sortkey"],
}
m["ine-pro"] = {
"tiếng Ấn-Âu nguyên thủy",
37178,
"ine",
"Latn",
"Tiếng Ấn-Âu nguyên thủy",
"Ấn-Âu nguyên thủy",
type = "reconstructed",
sort_key = {
from = {"[áā]", "[éēḗ]", "[íī]", "[óōṓ]", "[úū]", "ĺ", "ḿ", "ń", "ŕ", "ǵ", "ḱ", "ʰ", "ʷ", "₁", "₂", "₃", c.ringbelow, c.acute, c.macron},
to = {"a", "e", "i", "o", "u", "l", "m", "n", "r", "g'", "k'", "¯h", "¯w", "1", "2", "3"}
},
}
m["ine-toc-pro"] = {
"tiếng Tochari nguyên thủy",
37029,
"ine-toc",
"Latn",
"Tiếng Tochari nguyên thủy",
"Tochari nguyên thủy",
type = "reconstructed",
}
m["xme-old"] = {
"tiếng Media cổ",
36461,
"xme",
"Grek, Latn",
"Tiếng Media cổ",
"Media cổ",
}
m["xme-mid"] = {
"Middle Median",
nil,
"xme",
"Latn",
ancestors = "xme-old",
}
m["xme-ker"] = {
"tiếng Kerman",
129850,
"xme",
"fa-Arab, Latn",
"Tiếng Kerman",
"Kerman",
ancestors = "xme-mid",
}
m["xme-taf"] = {
"Tafreshi",
nil,
"xme",
"fa-Arab, Latn",
ancestors = "xme-mid",
}
m["xme-ttc-pro"] = {
"Proto-Tatic",
nil,
"xme-ttc",
"Latn",
ancestors = "xme-mid",
}
m["xme-kls"] = {
"Kalasuri",
nil,
"xme-ttc",
ancestors = "xme-ttc-nor",
}
m["xme-klt"] = {
"Kilit",
3612452,
"xme-ttc",
"Cyrl", -- and fa-Arab?
ancestors = "xme-ttc-pro",
}
m["xme-ott"] = {
"Old Tati",
434697,
"xme-ttc",
"fa-Arab, Latn",
ancestors = "xme-ttc-pro",
}
m["ira-pro"] = {
"tiếng Iran nguyên thủy",
4167865,
"ira",
"Latn",
"Tiếng Iran nguyên thủy",
"Iran nguyên thủy",
type = "reconstructed",
}
m["ira-mpr-pro"] = {
"Proto-Medo-Parthian",
nil,
"ira-mpr",
"Latn",
type = "reconstructed",
}
m["ira-kms-pro"] = {
"Proto-Komisenian",
nil,
"ira-kms",
"Latn",
type = "reconstructed",
}
m["ira-zgr-pro"] = {
"tiếng Zaza-Goran nguyên thủy",
nil,
"ira-zgr",
"Latn",
"Tiếng Zaza-Goran nguyên thủy",
"Zaza-Goran nguyên thủy",
type = "reconstructed",
}
m["ira-pat-pro"] = {
"tiếng Pathan nguyên thủy",
nil,
"ira-pat",
"Latn",
"Tiếng Pathan nguyên thủy",
"Pathan nguyên thủy",
type = "reconstructed",
}
m["os-pro"] = {
"Proto-Ossetic",
nil,
"xsc",
"Latn",
type = "reconstructed",
}
m["xsc-pro"] = {
"tiếng Scythia nguyên thủy",
nil,
"xsc",
"Latn",
"Tiếng Scythia nguyên thủy",
"Scythia nguyên thủy",
type = "reconstructed",
}
m["xsc-sar-pro"] = {
"tiếng Sarmatia nguyên thủy",
116773249,
"xsc-sar",
"Latn",
"Tiếng Sarmatia nguyên thủy",
"Sarmatia nguyên thủy",
type = "reconstructed",
}
m["xsc-skw-pro"] = {
"tiếng Saka-Wakhi nguyên thủy",
nil,
"xsc-skw",
"Latn",
"Tiếng Saka-Wakhi nguyên thủy",
"Saka-Wakhi nguyên thủy",
type = "reconstructed",
ancestors = "xsc-pro",
}
m["xsc-sak-pro"] = {
"Proto-Saka",
nil,
"xsc-sak",
"Latn",
type = "reconstructed",
ancestors = "xsc-skw-pro",
}
m["ira-sym-pro"] = {
"tiếng Shughnan-Yazghulom-Munji nguyên thủy",
nil,
"ira-sym",
"Latn",
"Tiếng Shughnan-Yazghulom-Munji nguyên thủy",
"Shughnan-Yazghulom-Munji nguyên thủy",
type = "reconstructed",
}
m["ira-sgi-pro"] = {
"Proto-Sanglechi-Ishkashimi",
nil,
"ira-sgi",
"Latn",
type = "reconstructed",
}
m["ira-mny-pro"] = {
"Proto-Munji-Yidgha",
nil,
"ira-mny",
"Latn",
type = "reconstructed",
ancestors = "ira-sym-pro",
}
m["ira-shy-pro"] = {
"tiếng Shughnan-Yazghulom nguyên thủy",
nil,
"ira-shy",
"Latn",
"Tiếng Shughnan-Yazghulom nguyên thủy",
"Shughnan-Yazghulom nguyên thủy",
type = "reconstructed",
ancestors = "ira-sym-pro",
}
m["ira-shr-pro"] = {
"tiếng Shughnan-Rushan nguyên thủy",
nil,
"ira-shy",
"Latn",
"Tiếng Shughnan-Rushan nguyên thủy",
"Shughnan-Rushan nguyên thủy",
type = "reconstructed",
ancestors = "ira-shy-pro",
}
m["ira-sgc-pro"] = {
"tiếng Sogdia nguyên thủy",
nil,
"ira-sgc",
"Latn",
"Tiếng Sogdia nguyên thủy",
"Sogdia nguyên thủy",
type = "reconstructed",
}
m["ira-wnj"] = {
"Vanji",
nil,
"ira-shy",
"Latn",
ancestors = "ira-shy-pro",
}
m["iro-ere"] = {
"Erie",
5388365,
"iro-nor",
"Latn",
}
m["iro-min"] = {
"Mingo",
128531,
"iro-nor",
"Latn",
}
m["iro-nor-pro"] = {
"tiếng Bắc Iroquois nguyên thủy",
nil,
"iro-nor",
"Latn",
"Tiếng Bắc Iroquois nguyên thủy",
"Bắc Iroquois nguyên thủy",
type = "reconstructed",
}
m["iro-pro"] = {
"tiếng Iroquois nguyên thủy",
7251852,
"iro",
"Latn",
"Tiếng Iroquois nguyên thủy",
"Iroquois nguyên thủy",
type = "reconstructed",
}
m["itc-pro"] = {
"tiếng Italic nguyên thủy",
17102720,
"itc",
"Latn",
"Tiếng Italic nguyên thủy",
"Italic nguyên thủy",
type = "reconstructed",
}
m["jpx-hcj"] = {
"tiếng Hachijō",
5637049,
"jpx",
"Jpan",
"Tiếng Hachijō",
"Hachijō",
ancestors = "ojp-eas",
translit = s["jpx-translit"],
display_text = s["jpx-displaytext"],
entry_name = s["jpx-entryname"],
sort_key = s["jpx-sortkey"],
}
m["jpx-pro"] = {
"tiếng Nhật Bản nguyên thủy",
nil,
"jpx",
"Latn",
"Tiếng Nhật Bản nguyên thủy",
"Nhật Bản nguyên thủy",
type = "reconstructed",
}
m["jpx-ryu-pro"] = {
"tiếng Lưu Cầu nguyên thủy",
nil,
"jpx-ryu",
"Latn",
"Tiếng Lưu Cầu nguyên thủy",
"Lưu Cầu nguyên thủy",
type = "reconstructed",
}
m["kar-pro"] = {
"tiếng Karen nguyên thủy",
nil,
"kar",
"Latn",
"Tiếng Karen nguyên thủy",
"Karen nguyên thủy",
type = "reconstructed",
}
m["kca-eas"] = {
"tiếng Đông Khanty",
30304622,
"kca",
"Cyrl",
"Tiếng Đông Khanty",
"Đông Khanty",
translit = "kca-translit",
override_translit = true,
-- TODO temporary until MediaWiki supports Unicode 16 (probably requires a PHP update from their side)
sort_key = { Cyrl = { from = {""}, to = {""} } },
}
m["kca-nor"] = {
"tiếng Bắc Khanty",
30304527,
"kca",
"Cyrl",
"Tiếng Bắc Khanty",
"Bắc Khanty",
translit = "kca-translit",
override_translit = true,
-- TODO temporary until MediaWiki supports Unicode 16 (probably requires a PHP update from their side)
sort_key = { Cyrl = { from = {""}, to = {""} } },
}
m["kca-sou"] = {
"Southern Khanty",
30304618,
"kca",
"Cyrl",
translit = "kca-translit",
override_translit = true,
}
m["khi-kho-pro"] = {
"Proto-Khoe",
nil,
"khi-kho",
"Latn",
type = "reconstructed",
}
m["khi-kun"] = {
"ǃKung",
32904,
"khi-kxa",
"Latn",
}
m["ko-ear"] = {
"Early Modern Korean",
756014,
"qfa-kor",
"Kore",
ancestors = "okm",
translit = "okm-translit",
entry_name = s["Kore-entryname"],
}
m["kro-pro"] = {
"Proto-Kru",
nil,
"kro",
"Latn",
type = "reconstructed",
}
m["ku-pro"] = {
"Proto-Kurdish",
nil,
"ku",
"Latn",
type = "reconstructed",
}
m["map-ata-pro"] = {
"Proto-Atayalic",
nil,
"map-ata",
"Latn",
type = "reconstructed",
}
m["map-bms"] = {
"tiếng Banyumas",
33219,
"map",
"Latn",
"Tiếng Banyumas",
"Banyumas",
}
m["map-pro"] = {
"tiếng Nam Đảo nguyên thủy",
49230,
"map",
"Latn",
"Tiếng Nam Đảo nguyên thủy",
"Nam Đảo nguyên thủy",
type = "reconstructed",
}
m["mis-xbi"] = {
"tiếng Tiên Ti",
4448647,
"qfa-xgx",
"Hani, Latn",
"Tiếng Tiên Ti",
"Tiên Ti",
sort_key = {Hani = "Hani-sortkey"},
}
m["mjg-mgl"] = {
"tiếng Mongghul",
53765528,
"mjg",
"Latn", -- also Mong, Cyrl ?
"Tiếng Mongghul",
"Mongghul",
}
m["mjg-mgr"] = {
"tiếng Mangghul",
56285392,
"mjg",
"Latn", -- also Mong, Cyrl ?
"Tiếng Mangghul",
"Mangghul",
}
m["mkh-asl-pro"] = {
"tiếng Asli nguyên thủy",
55630680,
"mkh-asl",
"Latn",
"Tiếng Asli nguyên thủy",
"Asli nguyên thủy",
type = "reconstructed",
}
m["mkh-ban-pro"] = {
"tiếng Bahnar nguyên thủy",
nil,
"mkh-ban",
"Latn",
"Tiếng Bahnar nguyên thủy",
"Bahnar nguyên thủy",
type = "reconstructed",
}
m["mkh-bhn"] = {
"tiếng Bhnong",
nil,
"mkh-nbn",
"Latn",
"Tiếng Bhnong",
"Bhnong",
}
m["mkh-kat-pro"] = {
"tiếng Cơ Tu nguyên thủy",
nil,
"mkh-kat",
"Latn",
"Tiếng Cơ Tu nguyên thủy",
"Cơ Tu nguyên thủy",
type = "reconstructed",
}
m["mkh-khm-pro"] = {
"tiếng Khơ Mú nguyên thủy",
nil,
"mkh-khm",
"Latn",
"Tiếng Khơ Mú nguyên thủy",
"Khơ Mú nguyên thủy",
type = "reconstructed",
}
m["mkh-kmr-pro"] = {
"tiếng Khmer nguyên thủy",
55630684,
"mkh-kmr",
"Latn",
"Tiếng Khmer nguyên thủy",
"Khmer nguyên thủy",
type = "reconstructed",
}
m["mkh-mmn"] = {
"tiếng Môn trung đại",
121337926,
"mkh-mnc",
"Latn, Mymr", --and also Pallava
"Tiếng Môn trung đại",
"Môn trung đại",
ancestors = "omx",
}
m["mkh-mnc-pro"] = {
"tiếng Môn nguyên thủy",
116773231,
"mkh-mnc",
"Latn",
"Tiếng Môn nguyên thủy",
"Môn nguyên thủy",
type = "reconstructed",
}
m["mkh-mvi"] = {
"tiếng Việt trung cổ",
9199,
"mkh-vie",
"Hani, Latn",
"Tiếng Việt trung cổ",
"Việt trung cổ",
sort_key = {Hani = "Hani-sortkey"},
}
m["mkh-pal-pro"] = {
"tiếng Palaung nguyên thủy",
nil,
"mkh-pal",
"Latn",
"Tiếng Palaung nguyên thủy",
"Palaung nguyên thủy",
type = "reconstructed",
}
m["mkh-pea-pro"] = {
"tiếng Pear nguyên thủy",
nil,
"mkh-pea",
"Latn",
"Tiếng Pear nguyên thủy",
"Pear nguyên thủy",
type = "reconstructed",
}
m["mkh-pkn-pro"] = {
"tiếng Pakan nguyên thủy",
nil,
"mkh-pkn",
"Latn",
"Tiếng Pakan nguyên thủy",
"Pakan nguyên thủy",
type = "reconstructed",
}
m["mkh-pro"] = { --This will be merged into 2015 aav-pro.
"tiếng Môn-Khmer nguyên thủy",
7251859,
"mkh",
"Latn",
"Tiếng Môn-Khmer nguyên thủy",
"Môn-Khmer nguyên thủy",
type = "reconstructed",
}
m["mkh-vie-pro"] = {
"tiếng Việt-Mường nguyên thủy",
nil,
"mkh-vie",
"Latn",
"Tiếng Việt-Mường nguyên thủy",
"Việt-Mường nguyên thủy",
type = "reconstructed",
}
m["mns-cen"] = {
"tiếng Trung Mansi",
128810384,
"mns",
"Cyrl",
"Tiếng Trung Mansi",
"Trung Mansi",
translit = "mns-translit",
override_translit = true,
}
m["mns-nor"] = {
"tiếng Bắc Mansi",
30304537,
"mns",
"Cyrl",
"Tiếng Bắc Mansi",
"Bắc Mansi",
translit = "mns-translit",
override_translit = true,
}
m["mns-pro"] = {
"tiếng Mansi nguyên thủy",
128883093,
"mns",
"Latn",
"Tiếng Mansi nguyên thủy",
"Mansi nguyên thủy",
type = "reconstructed",
}
m["mns-sou"] = {
"tiếng Nam Mansi",
30304629,
"mns",
"Cyrl",
"Tiếng Nam Mansi",
"Nam Mansi",
translit = "mns-translit",
override_translit = true,
}
m["mnw-tha"] = {
"tiếng Môn Thái",
nil,
"mkh-mnc",
"Mymr, Thai",
ancestors = "mkh-mmn",
sort_key = {
from = {"[%p]", "ျ", "ြ", "ွ", "ှ", "ၞ", "ၟ", "ၠ", "ၚ", "ဿ", "[็-๎]", "([เแโใไ])([ก-ฮ])ฺ?"},
to = {"", "္ယ", "္ရ", "္ဝ", "္ဟ", "္န", "္မ", "္လ", "င", "သ္သ", "", "%2%1"}
},
"Tiếng Môn Thái",
"Môn Thái"
}
m["mun-pro"] = {
"tiếng Munda nguyên thủy",
105102373,
"mun",
"Latn",
"Tiếng Munda nguyên thủy",
"Munda nguyên thủy",
type = "reconstructed",
}
m["myn-chl"] = { -- the stage after ''emy''
"Ch'olti'",
873995,
"myn",
"Latn",
}
m["myn-pro"] = {
"tiếng Maya nguyên thủy",
3321532,
"myn",
"Latn",
"Tiếng Maya nguyên thủy",
"Maya nguyên thủy",
type = "reconstructed",
}
m["nai-ala"] = {
"Alazapa",
nil,
nil,
"Latn",
}
m["nai-bay"] = {
"Bayogoula",
1563704,
nil,
"Latn",
}
m["nai-bvy"] = {
"Buena Vista Yokuts",
4985474,
"nai-yok",
"Latn",
}
m["nai-cal"] = {
"Calusa",
51782,
nil,
"Latn",
}
m["nai-chi"] = {
"Chiquimulilla",
25339627,
"nai-xin",
"Latn",
}
m["nai-chu-pro"] = {
"Proto-Chumash",
nil,
"nai-chu",
"Latn",
type = "reconstructed",
}
m["nai-cig"] = {
"Ciguayo",
20741700,
nil,
"Latn",
}
m["nai-ckn-pro"] = {
"Proto-Chinookan",
nil,
"nai-ckn",
"Latn",
type = "reconstructed",
}
m["nai-dly"] = {
"Delta Yokuts",
nil,
"nai-yok",
"Latn",
}
m["nai-gsy"] = {
"Gashowu",
nil,
"nai-yok",
"Latn",
}
m["nai-guz"] = {
"Guazacapán",
19572028,
"nai-xin",
"Latn",
}
m["nai-hit"] = {
"Hitchiti",
1542882,
"nai-mus",
"Latn",
}
m["nai-ipa"] = {
"Ipai",
3027474,
"nai-yuc",
"Latn",
}
m["nai-jtp"] = {
"Jutiapa",
nil,
"nai-xin",
"Latn",
}
m["nai-jum"] = {
"tiếng Jumaytepeque",
25339626,
"nai-xin",
"Latn",
"Tiếng Jumaytepeque",
"Jumaytepeque",
}
m["nai-kat"] = {
"Kathlamet",
6376639,
"nai-ckn",
"Latn",
}
m["nai-klp-pro"] = {
"Proto-Kalapuyan",
nil,
"nai-klp",
type = "reconstructed",
}
m["nai-knm"] = {
"Konomihu",
3198734,
"nai-shs",
"Latn",
}
m["nai-kry"] = {
"Kings River Yokuts",
6413014,
"nai-yok",
"Latn",
}
m["nai-kum"] = {
"tiếng Kumeyaay",
4910139,
"nai-yuc",
"Latn",
"Tiếng Kumeyaay",
"Kumeyaay",
}
m["nai-mac"] = {
"Macoris",
21070851,
nil,
"Latn",
}
m["nai-mdu-pro"] = {
"Proto-Maidun",
nil,
"nai-mdu",
"Latn",
type = "reconstructed",
}
m["nai-miz-pro"] = {
"Proto-Mixe-Zoque",
nil,
"nai-miz",
"Latn",
type = "reconstructed",
}
m["nai-mus-pro"] = {
"tiếng Muskogee nguyên thủy",
116775368,
"nai-mus",
"Latn",
"Tiếng Muskogee nguyên thủy",
"Muskogee nguyên thủy",
type = "reconstructed",
}
m["nai-nao"] = {
"Naolan",
6964594,
nil,
"Latn",
}
m["nai-nrs"] = {
"New River Shasta",
7011254,
"nai-shs",
"Latn",
}
m["nai-nvy"] = {
"Northern Valley Yokuts",
nil,
"nai-yok",
"Latn",
}
m["nai-okw"] = {
"Okwanuchu",
3350126,
"nai-shs",
"Latn",
}
m["nai-per"] = {
"Pericú",
3375369,
nil,
"Latn",
}
m["nai-pic"] = {
"Picuris",
7191257,
"nai-kta",
"Latn",
}
m["nai-plp-pro"] = {
"Proto-Plateau Penutian",
nil,
"nai-plp",
"Latn",
type = "reconstructed",
}
m["nai-ply"] = {
"Palewyami",
2387391,
"nai-yok",
"Latn",
}
m["nai-pom-pro"] = {
"Proto-Pomo",
nil,
"nai-pom",
"Latn",
type = "reconstructed",
}
m["nai-qng"] = {
"Quinigua",
36360,
nil,
"Latn",
}
m["nai-sca-pro"] = { -- NB 'sio-pro' "Proto-Siouan" which is Proto-Western Siouan
"Proto-Siouan-Catawban",
nil,
"nai-sca",
"Latn",
type = "reconstructed",
}
m["nai-sin"] = {
"Sinacantán",
24190249,
"nai-xin",
"Latn",
}
m["nai-sln"] = {
"Salvadoran Lenca",
3229434,
"nai-len",
"Latn",
}
m["nai-spt"] = {
"Sahaptin",
3833015,
"nai-shp",
"Latn",
}
m["nai-svy"] = {
"Southern Valley Yokuts",
nil,
"nai-yok",
"Latn",
}
m["nai-tap"] = {
"Tapachultec",
7684401,
"nai-miz",
"Latn",
}
m["nai-taw"] = {
"Tawasa",
7689233,
nil,
"Latn",
}
m["nai-teq"] = {
"Tequistlatec",
2964454,
"nai-tqn",
"Latn",
}
m["nai-tip"] = {
"tiếng Tipai",
3027471,
"nai-yuc",
"Latn",
"Tiếng Tipai",
"Tipai",
}
m["nai-tky"] = {
"Tule-Kaweah Yokuts",
7851988,
"nai-yok",
"Latn",
}
m["nai-tot-pro"] = {
"Proto-Totozoquean",
nil,
"nai-tot",
"Latn",
type = "reconstructed",
}
m["nai-tsi-pro"] = {
"Proto-Tsimshianic",
nil,
"nai-tsi",
"Latn",
type = "reconstructed",
}
m["nai-utn-pro"] = {
"Proto-Utian",
nil,
"nai-utn",
"Latn",
type = "reconstructed",
}
m["nai-wai"] = {
"Waikuri",
3118702,
nil,
"Latn",
}
m["nai-yup"] = {
"Yupiltepeque",
25339628,
"nai-xin",
"Latn",
}
m["nan-hbl"] = {
"tiếng Mân Tuyền Chương",
1624231,
"zhx-nan",
"Hants, Latn, Bopo, Kana",
"Tiếng Mân Tuyền Chương",
"Mân Tuyền Chương",
wikimedia_codes = "zh-min-nan",
generate_forms = "zh-generateforms",
sort_key = {
Hani = "Hani-sortkey",
Kana = "Kana-sortkey"
},
}
m["nan-tws"] = {
"tiếng Triều Châu",
36759,
"zhx-nan",
"Hants",
"Tiếng Triều Châu",
"Triều Châu",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["nds-de"] = {
"tiếng Hạ Đức tại Đức",
25433,
"gmw",
"Latn",
"Tiếng Hạ Đức tại Đức",
"Hạ Đức tại Đức",
ancestors = "nds",
wikimedia_codes = "nds",
}
m["nds-nl"] = {
"tiếng Hạ Saxon Hà Lan",
516137,
"gmw",
"Latn",
"Tiếng Hạ Saxon Hà Lan",
"Hạ Saxon Hà Lan",
ancestors = "nds",
}
m["ngf-pro"] = {
"tiếng Liên New Guinea nguyên thủy",
85794785,
"ngf",
"Latn",
type = "reconstructed",
}
m["nic-bco-pro"] = {
"tiếng Benue-Congo nguyên thủy",
nil,
"nic-bco",
"Latn",
"Tiếng Benue-Congo nguyên thủy",
"Benue-Congo nguyên thủy",
type = "reconstructed",
}
m["nic-bod-pro"] = {
"tiếng Bantoid nguyên thủy",
nil,
"nic-bod",
"Latn",
"Tiếng Bantoid nguyên thủy",
"Bantoid nguyên thủy",
type = "reconstructed",
}
m["nic-eov-pro"] = {
"Proto-Eastern Oti-Volta",
nil,
"nic-eov",
"Latn",
type = "reconstructed",
}
m["nic-gns-pro"] = {
"Proto-Gurunsi",
nil,
"nic-gns",
"Latn",
type = "reconstructed",
}
m["nic-grf-pro"] = {
"Proto-Grassfields",
nil,
"nic-grf",
"Latn",
type = "reconstructed",
}
m["nic-gur-pro"] = {
"Proto-Gur",
nil,
"nic-gur",
"Latn",
type = "reconstructed",
}
m["nic-jkn-pro"] = {
"Proto-Jukunoid",
nil,
"nic-jkn",
"Latn",
type = "reconstructed",
}
m["nic-lcr-pro"] = {
"Proto-Lower Cross River",
nil,
"nic-lcr",
"Latn",
type = "reconstructed",
}
m["nic-ogo-pro"] = {
"Proto-Ogoni",
nil,
"nic-ogo",
"Latn",
type = "reconstructed",
}
m["nic-ovo-pro"] = {
"Proto-Oti-Volta",
nil,
"nic-ovo",
"Latn",
type = "reconstructed",
}
m["nic-plt-pro"] = {
"tiếng Plateau nguyên thủy",
nil,
"nic-plt",
"Latn",
"Tiếng Plateau nguyên thủy",
"Plateau nguyên thủy",
type = "reconstructed",
}
m["nic-pro"] = {
"tiếng Niger-Congo nguyên thủy",
nil,
"nic",
"Latn",
"Tiếng Niger-Congo nguyên thủy",
"Niger-Congo nguyên thủy",
type = "reconstructed",
}
m["nic-ubg-pro"] = {
"tiếng Ubangi nguyên thủy",
nil,
"nic-ubg",
"Latn",
"Tiếng Ubangi nguyên thủy",
type = "reconstructed",
}
m["nic-ucr-pro"] = {
"Proto-Upper Cross River",
nil,
"nic-ucr",
"Latn",
type = "reconstructed",
}
m["nic-vco-pro"] = {
"tiếng Volta-Congo nguyên thủy",
nil,
"nic-vco",
"Latn",
"Tiếng Volta-Congo nguyên thủy",
"Volta-Congo nguyên thủy",
type = "reconstructed",
}
m["nub-har"] = {
"Haraza",
19572059,
"nub",
"Arab, Latn",
}
m["nub-pro"] = {
"Proto-Nubian",
nil,
"nub",
"Latn",
type = "reconstructed",
}
m["omq-cha-pro"] = {
"Proto-Chatino",
nil,
"omq-cha",
"Latn",
type = "reconstructed",
}
m["omq-maz-pro"] = {
"Proto-Mazatec",
nil,
"omq-maz",
"Latn",
type = "reconstructed",
}
m["omq-mix-pro"] = {
"tiếng Mixtec nguyên thủy",
21573423,
"omq-mix",
"Latn",
"Tiếng Mixtec nguyên thủy",
"Mixtec nguyên thủy",
type = "reconstructed",
}
m["omq-mxt-pro"] = {
"Proto-Mixtec",
nil,
"omq-mxt",
"Latn",
type = "reconstructed",
}
m["omq-otp-pro"] = {
"Proto-Oto-Pamean",
nil,
"omq-otp",
"Latn",
type = "reconstructed",
ancestors = "omq-pro",
}
m["omq-pro"] = {
"Proto-Oto-Manguean",
33669,
"omq",
"Latn",
type = "reconstructed",
}
m["omq-tel"] = {
"Teposcolula Mixtec",
nil,
"omq-mxt",
"Latn",
}
m["omq-teo"] = {
"Teojomulco Chatino",
25340451,
"omq-cha",
"Latn",
}
m["omq-tri-pro"] = {
"tiếng Triqui nguyên thủy",
116773817,
"omq-tri",
"Latn",
"Tiếng Triqui nguyên thủy",
"Triqui nguyên thủy",
type = "reconstructed",
}
m["omq-zap-pro"] = {
"Proto-Zapotecan",
nil,
"omq-zap",
"Latn",
type = "reconstructed",
}
m["omq-zpc-pro"] = {
"tiếng Zapotec nguyên thủy",
116773296,
"omq-zpc",
"Latn",
"Tiếng Zapotec nguyên thủy",
"Zapotec nguyên thủy",
type = "reconstructed",
}
m["omv-aro-pro"] = {
"tiếng Aari nguyên thủy",
nil,
"omv-aro",
"Latn",
"Tiếng Aari nguyên thủy",
"Aari nguyên thủy",
type = "reconstructed",
}
m["omv-diz-pro"] = {
"tiếng Dizi nguyên thủy",
nil,
"omv-diz",
"Latn",
"Tiếng Dizi nguyên thủy",
"Dizi nguyên thủy",
type = "reconstructed",
}
m["omv-pro"] = {
"tiếng Omo nguyên thủy",
nil,
"omv",
"Latn",
"Tiếng Omo nguyên thủy",
"Omo nguyên thủy",
type = "reconstructed",
}
m["oto-otm-pro"] = {
"Proto-Otomi",
nil,
"oto-otm",
"Latn",
type = "reconstructed",
ancestors = "oto-pro",
}
m["oto-pro"] = {
"Proto-Otomian",
nil,
"oto",
"Latn",
type = "reconstructed",
ancestors = "omq-otp-pro",
}
m["paa-kom"] = {
"Kómnzo",
18344310,
"paa-yam",
"Latn",
}
m["paa-kwn"] = {
"Kuwani",
6449056,
"paa",
"Latn",
}
m["paa-nha-pro"] = {
"Proto-North Halmahera",
nil,
"paa-nha",
"Latn",
type = "reconstructed"
}
m["paa-nun"] = {
"Nungon",
nil,
"paa",
"Latn",
}
m["phi-din"] = {
"Dinapigue Agta",
16945774,
"phi",
"Latn",
}
m["phi-kal-pro"] = {
"Proto-Kalamian",
nil,
"phi-kal",
"Latn",
type = "reconstructed",
}
m["phi-nag"] = {
"Nagtipunan Agta",
16966111,
"phi",
"Latn",
}
m["phi-pro"] = {
"tiếng Philippines nguyên thủy",
18204898,
"phi",
"Latn",
"Tiếng Philippines nguyên thủy",
"Philippines nguyên thủy",
type = "reconstructed",
}
m["poz-abi"] = {
"tiếng Abai",
19570729,
"poz-san",
"Latn",
"Tiếng Abai",
"Abai",
}
m["poz-bal"] = {
"Baliledo",
4850912,
"poz",
"Latn",
}
m["poz-btk-pro"] = {
"Proto-Bungku-Tolaki",
nil,
"poz-btk",
"Latn",
type = "reconstructed",
}
m["poz-cet-pro"] = {
"tiếng Mã Lai-Đa Đảo Trung Đông nguyên thủy",
2269883,
"poz-cet",
"Latn",
"Tiếng Mã Lai-Đa Đảo Trung Đông nguyên thủy",
"Mã Lai-Đa Đảo Trung Đông nguyên thủy",
type = "reconstructed",
}
m["poz-hce-pro"] = {
"Proto-Halmahera-Cenderawasih",
nil,
"poz-hce",
"Latn",
type = "reconstructed",
}
m["poz-lgx-pro"] = {
"Proto-Lampungic",
nil,
"poz-lgx",
"Latn",
type = "reconstructed",
}
m["poz-mcm-pro"] = {
"tiếng Mã Lai-Chăm nguyên thủy",
nil,
"poz-mcm",
"Latn",
"Tiếng Mã Lai-Chăm nguyên thủy",
"Mã Lai-Chăm nguyên thủy",
type = "reconstructed",
}
m["poz-mly-pro"] = {
"tiếng Mã Lai nguyên thủy",
nil,
"poz-mly",
"Latn",
"Tiếng Mã Lai nguyên thủy",
"Mã Lai nguyên thủy",
type = "reconstructed",
}
m["poz-msa-pro"] = {
"tiếng Mã Lai-Sumbawa nguyên thủy",
nil,
"poz-msa",
"Latn",
"Tiếng Mã Lai-Sumbawa nguyên thủy",
"Mã Lai-Sumbawa nguyên thủy",
type = "reconstructed",
}
m["poz-oce-pro"] = {
"tiếng Châu Đại Dương nguyên thủy",
141741,
"poz-oce",
"Latn",
"Tiếng Châu Đại Dương nguyên thủy",
"Châu Đại Dương nguyên thủy",
type = "reconstructed",
}
m["poz-pep-pro"] = {
"tiếng Đa Đảo Đông nguyên thủy",
nil,
"poz-pep",
"Latn",
"Tiếng Đa Đảo Đông nguyên thủy",
"Đa Đảo Đông nguyên thủy",
type = "reconstructed",
}
m["poz-pnp-pro"] = {
"tiếng Đa Đảo hạt nhân nguyên thủy",
nil,
"poz-pnp",
"Latn",
"Tiếng Đa Đảo hạt nhân nguyên thủy",
"Đa Đảo hạt nhân nguyên thủy",
type = "reconstructed",
}
m["poz-pol-pro"] = {
"tiếng Đa Đảo nguyên thủy",
1658709,
"poz-pol",
"Latn",
"Tiếng Đa Đảo nguyên thủy",
"Đa Đảo nguyên thủy",
type = "reconstructed",
}
m["poz-pro"] = {
"tiếng Mã Lai-Đa Đảo nguyên thủy",
3832960,
"poz",
"Latn",
"Tiếng Mã Lai-Đa Đảo nguyên thủy",
"Mã Lai-Đa Đảo nguyên thủy",
type = "reconstructed",
}
m["poz-sml"] = {
"tiếng Mã Lai Sarawak",
4251702,
"poz-mly",
"Latn, ms-Arab",
"Tiếng Mã Lai Sarawak",
"Mã Lai Sarawak",
}
m["poz-ssw-pro"] = {
"Proto-South Sulawesi",
nil,
"poz-ssw",
"Latn",
type = "reconstructed",
}
m["poz-sus-pro"] = {
"Proto-Sunda-Sulawesi",
nil,
"poz-sus",
"Latn",
type = "reconstructed",
}
m["poz-swa-pro"] = {
"Proto-North Sarawak",
nil,
"poz-swa",
"Latn",
type = "reconstructed",
}
m["pqe-pro"] = {
"tiếng Mã Lai-Đa Đảo Đông nguyên thủy",
2269883,
"pqe",
"Latn",
"Tiếng Mã Lai-Đa Đảo Đông nguyên thủy",
"Mã Lai-Đa Đảo Đông nguyên thủy",
type = "reconstructed",
}
m["pra-niy"] = {
"tiếng Prakrit Niya",
nil,
"inc-mid",
"Khar",
ancestors = "inc-ash",
translit = "Khar-translit",
"Tiếng Prakrit Niya",
"Prakrit Niya",
}
m["qfa-adm-pro"] = {
"Proto-Great Andamanese",
nil,
"qfa-adm",
"Latn",
type = "reconstructed",
}
m["qfa-bet-pro"] = {
"tiếng Bối-Thái nguyên thủy",
116773193,
"qfa-bet",
"Latn",
"Tiếng Bối-Thái nguyên thủy",
"Bối-Thái nguyên thủy",
type = "reconstructed",
}
m["qfa-cka-pro"] = {
"tiếng Chukotka-Kamchatka nguyên thủy",
7251837,
"qfa-cka",
"Latn",
type = "reconstructed",
}
m["qfa-hur-pro"] = {
"Proto-Hurro-Urartian",
nil,
"qfa-hur",
"Latn",
type = "reconstructed",
}
m["qfa-kad-pro"] = {
"Proto-Kadu",
nil,
"qfa-kad",
"Latn",
type = "reconstructed",
}
m["qfa-kms-pro"] = {
"tiếng Động-Thủy nguyên thủy",
nil,
"qfa-kms",
"Latn",
"Tiếng Động-Thủy nguyên thủy",
"Động-Thủy nguyên thủy",
type = "reconstructed",
}
m["qfa-kor-pro"] = {
"tiếng Triều Tiên nguyên thủy",
467883,
"qfa-kor",
"Latn",
"Tiếng Triều Tiên nguyên thủy",
"Triều Tiên nguyên thủy",
type = "reconstructed",
}
m["qfa-kra-pro"] = {
"tiếng Kra nguyên thủy",
7251854,
"qfa-kra",
"Latn",
"Tiếng Kra nguyên thủy",
"Kra nguyên thủy",
type = "reconstructed",
}
m["qfa-lic-pro"] = {
"tiếng Hlai nguyên thủy",
7251845,
"qfa-lic",
"Latn",
"Tiếng Hlai nguyên thủy",
"Hlai nguyên thủy",
type = "reconstructed",
}
m["qfa-onb-pro"] = {
"tiếng Ông Bối nguyên thủy",
nil,
"qfa-onb",
"Latn",
"Tiếng Ông Bối nguyên thủy",
"Ông Bối nguyên thủy",
type = "reconstructed",
}
m["qfa-ong-pro"] = {
"tiếng Önge nguyên thủy",
nil,
"qfa-ong",
"Latn",
"Tiếng Önge nguyên thủy",
"Önge nguyên thủy",
type = "reconstructed",
}
m["qfa-tak-pro"] = {
"tiếng Kra-Dai nguyên thủy",
nil,
"qfa-tak",
"Latn",
"Tiếng Kra-Dai nguyên thủy",
"Kra-Dai nguyên thủy",
type = "reconstructed",
}
m["qfa-xgx-rou"] = {
"tiếng Nhu Nhiên",
48816637,
"qfa-xgx",
"Hani, Latn",
"Tiếng Nhu Nhiên",
"Nhu Nhiên",
sort_key = {Hani = "Hani-sortkey"},
}
m["qfa-xgx-tuh"] = {
"tiếng Thổ Dục Hồn",
48816625,
"qfa-xgx",
"Hani, Latn",
"Tiếng Thổ Dục Hồn",
"Thổ Dục Hồn",
sort_key = {Hani = "Hani-sortkey"},
}
m["qfa-xgx-tuo"] = {
"tiếng Thác Bạt",
48816629,
"qfa-xgx",
"Hani, Latn",
"Tiếng Thác Bạt",
"Thác Bạt",
sort_key = {Hani = "Hani-sortkey"},
}
m["qfa-xgx-xbi"] = {
"tiếng Tiên Ti",
4448647,
"qfa-xgx",
"Hani, Latn",
"Tiếng Tiên Ti",
"Tiên Ti",
sort_key = {Hani = "Hani-sortkey"},
}
m["qfa-yen-pro"] = {
"tiếng Enisei nguyên thủy",
27639,
"qfa-yen",
"Latn",
"Tiếng Enisei nguyên thủy",
"Enisei nguyên thủy",
type = "reconstructed",
}
m["qfa-yuk-pro"] = {
"tiếng Yukaghir nguyên thủy",
nil,
"qfa-yuk",
"Latn",
"Tiếng Yukaghir nguyên thủy",
"Yukaghir nguyên thủy",
type = "reconstructed",
}
m["qwe-kch"] = {
"Kichwa",
1740805,
"qwe",
"Latn",
ancestors = "qu",
}
m["roa-ang"] = {
"Angevin",
56782,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-bbn"] = {
"Bourbonnais-Berrichon",
nil,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-brg"] = {
"tiếng Bourguignon",
508332,
"roa-oil",
"Latn",
"Tiếng Bourguignon",
"Bourguignon",
sort_key = s["roa-oil-sortkey"],
}
m["roa-cha"] = {
"Champenois",
430018,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-fcm"] = {
"tiếng Franche-Comté",
510561,
"roa-oil",
"Latn",
"Tiếng Franche-Comté",
"Franche-Comté",
sort_key = s["roa-oil-sortkey"],
}
m["roa-gal"] = {
"tiếng Gallo",
37300,
"roa-oil",
"Latn",
"Tiếng Gallo",
"Gallo",
sort_key = s["roa-oil-sortkey"],
}
m["roa-leo"] = {
"tiếng León",
34108,
"roa-ibe",
"Latn",
"Tiếng León",
"León",
ancestors = "roa-ole",
}
m["roa-lor"] = {
"tiếng Lorrain",
671198,
"roa-oil",
"Latn",
"Tiếng Lorrain",
"Lorrain",
sort_key = s["roa-oil-sortkey"],
}
m["roa-oan"] = {
"Navarro-Aragonese",
2736184,
"roa-ibe",
"Latn",
}
m["roa-oca"] = {
"tiếng Catalan cổ",
15478520,
"roa-ocr",
"Latn",
"Tiếng Catalan cổ",
"Catalan cổ",
sort_key = {
from = {"à", "[èé]", "[íï]", "[òó]", "[úü]", "ç", "·"},
to = {"a", "e", "i", "o", "u", "c"}
},
}
m["roa-ole"] = {
"tiếng León cổ",
125977465,
"roa-asl",
"Latn",
"Tiếng León cổ",
"León cổ",
}
m["roa-opt"] = {
"tiếng Galicia-Bồ Đào Nha",
1072111,
"roa-ibe",
"Latn",
"Tiếng Galicia-Bồ Đào Nha",
"Galicia-Bồ Đào Nha",
}
m["roa-orl"] = {
"Orléanais",
nil,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-poi"] = {
"Poitevin-Saintongeais",
514123,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["roa-tar"] = {
"tiếng Tarantino",
695526,
"roa-itd",
"Latn",
"Tiếng Tarantino",
"Tarantino",
ancestors = "nap",
wikimedia_codes = "roa-tara",
}
m["roa-tou"] = {
"Tourangeau",
nil,
"roa-oil",
"Latn",
sort_key = s["roa-oil-sortkey"],
}
m["sai-ajg"] = {
"Ajagua",
nil,
nil,
"Latn",
}
m["sai-all"] = {
"tiếng Alyentiyak",
19570789,
"sai-hrp",
"Latn",
"Tiếng Alyentiyak",
"Alyentiyak",
}
m["sai-and"] = { -- not to be confused with 'cbc' or 'ano'
"Andoquero",
16828359,
"sai-wit",
"Latn",
}
m["sai-ayo"] = {
"Ayomán",
16937754,
"sai-jir",
"Latn",
}
m["sai-bae"] = {
"Baenan",
3401998,
nil,
"Latn",
}
m["sai-bag"] = {
"tiếng Bagua",
5390321,
nil,
"Latn",
"Tiếng Bagua",
"Bagua",
}
m["sai-bet"] = {
"Betoi",
926551,
"qfa-iso",
"Latn",
}
m["sai-bor-pro"] = {
"Proto-Boran",
nil,
"sai-bor",
"Latn",
}
m["sai-cac"] = {
"Cacán",
945482,
nil,
"Latn",
}
m["sai-caq"] = {
"Caranqui",
2937753,
"sai-bar",
"Latn",
}
m["sai-car-pro"] = {
"tiếng Carib nguyên thủy",
nil,
"sai-car",
"Latn",
"Tiếng Carib nguyên thủy",
"Carib nguyên thủy",
type = "reconstructed",
}
m["sai-cat"] = {
"Catacao",
5051136,
"sai-ctc",
"Latn",
}
m["sai-cer-pro"] = {
"tiếng Cerrado nguyên thủy",
nil,
"sai-cer",
"Latn",
"Tiếng Cerrado nguyên thủy",
"Cerrado nguyên thủy",
type = "reconstructed",
}
m["sai-chi"] = {
"Chirino",
5390321,
nil,
"Latn",
}
m["sai-chn"] = {
"Chaná",
5072718,
"sai-crn",
"Latn",
}
m["sai-chp"] = {
"Chapacura",
5072884,
"sai-cpc",
"Latn",
}
m["sai-chr"] = {
"Charrua",
5086680,
"sai-crn",
"Latn",
}
m["sai-chu"] = {
"Churuya",
5118339,
"sai-guh",
"Latn",
}
m["sai-cje-pro"] = {
"Proto-Central Jê",
nil,
"sai-cje",
"Latn",
type = "reconstructed",
}
m["sai-cmg"] = {
"Comechingon",
6644203,
nil,
"Latn",
}
m["sai-cno"] = {
"Chono",
5104704,
nil,
"Latn",
}
m["sai-cnr"] = {
"Cañari",
5055572,
nil,
"Latn",
}
m["sai-coe"] = {
"Coeruna",
6425639,
"sai-wit",
"Latn",
}
m["sai-col"] = {
"Colán",
5141893,
"sai-ctc",
"Latn",
}
m["sai-cop"] = {
"Copallén",
5390321,
nil,
"Latn",
}
m["sai-crd"] = {
"Coroado Puri",
24191321,
"sai-mje",
"Latn",
}
m["sai-ctq"] = {
"Catuquinaru",
16858455,
nil,
"Latn",
}
m["sai-cul"] = {
"tiếng Culli",
2879660,
"qfa-unc",
"Latn",
}
m["sai-cva"] = {
"Cueva",
nil,
nil,
"Latn",
}
m["sai-esm"] = {
"Esmeralda",
3058083,
nil,
"Latn",
}
m["sai-ewa"] = {
"Ewarhuyana",
16898104,
nil,
"Latn",
}
m["sai-gam"] = {
"Gamela",
5403661,
nil,
"Latn",
}
m["sai-gay"] = {
"Gayón",
5528902,
"sai-jir",
"Latn",
}
m["sai-gmo"] = {
"Guamo",
5613495,
nil,
"Latn",
}
m["sai-gue"] = {
"Güenoa",
5626799,
"sai-crn",
"Latn",
}
m["sai-hau"] = {
"tiếng Haush",
3128376,
"sai-cho",
"Latn",
"Tiếng Haush",
"Haush",
}
m["sai-hoc-pro"] = {
"Proto-Huitoto-Ocaina",
nil,
"sai-hoc",
"Latn",
type = "reconstructed",
}
m["sai-jee-pro"] = {
"tiếng Jê nguyên thủy",
nil,
"sai-jee",
"Latn",
"Tiếng Jê nguyên thủy",
"Jê nguyên thủy",
type = "reconstructed",
}
m["sai-jko"] = {
"Jeikó",
6176527,
"sai-mje",
"Latn",
}
m["sai-jrj"] = {
"Jirajara",
6202966,
"sai-jir",
"Latn",
}
m["sai-kat"] = { -- contrast xoo, kzw, sai-xoc
"Katembri",
6375925,
nil,
"Latn",
}
m["sai-mal"] = {
"Malalí",
6741212,
nil,
"Latn",
}
m["sai-mar"] = {
"Maratino",
6755055,
nil,
"Latn",
}
m["sai-mat"] = {
"Matanawi",
6786047,
nil,
"Latn",
}
m["sai-mcn"] = {
"Mocana",
3402048,
nil,
"Latn",
}
m["sai-men"] = {
"Menien",
16890110,
"sai-mje",
"Latn",
}
m["sai-mil"] = {
"Millcayac",
19573012,
"sai-hrp",
"Latn",
}
m["sai-mlb"] = {
"Malibu",
3402048,
nil,
"Latn",
}
m["sai-msk"] = {
"Masakará",
6782426,
"sai-mje",
"Latn",
}
m["sai-muc"] = {
"Mucuchí",
nil,
nil,
"Latn",
}
m["sai-mue"] = {
"Muellama",
16886936,
"sai-bar",
"Latn",
}
m["sai-muz"] = {
"Muzo",
6644203,
nil,
"Latn",
}
m["sai-mys"] = {
"Maynas",
16919393,
nil,
"Latn",
}
m["sai-nat"] = {
"Natú",
9006749,
nil,
"Latn",
}
m["sai-nje-pro"] = {
"tiếng Jê Bắc nguyên thủy",
nil,
"sai-nje",
"Latn",
"Tiếng Jê Bắc nguyên thủy",
"Jê Bắc nguyên thủy",
type = "reconstructed",
}
m["sai-opo"] = {
"Opón",
7099152,
"sai-car",
"Latn",
}
m["sai-oto"] = {
"Otomaco",
16879234,
"sai-otm",
"Latn",
}
m["sai-pal"] = {
"Palta",
3042978,
nil,
"Latn",
}
m["sai-pam"] = {
"Pamigua",
5908689,
"sai-otm",
"Latn",
}
m["sai-par"] = {
"Paratió",
16890038,
nil,
"Latn",
}
m["sai-pnz"] = {
"Panzaleo",
3123275,
nil,
"Latn",
}
m["sai-prh"] = {
"Puruhá",
3410994,
nil,
"Latn",
}
m["sai-ptg"] = {
"Patagón",
nil,
nil,
"Latn",
}
m["sai-pur"] = {
"Purukotó",
7261622,
"sai-pem",
"Latn",
}
m["sai-pyg"] = {
"Payaguá",
7156643,
"sai-guc",
"Latn",
}
m["sai-pyk"] = {
"Pykobjê",
98113977,
"sai-nje",
"Latn",
}
m["sai-qmb"] = {
"Quimbaya",
7272043,
nil,
"Latn",
}
m["sai-qtm"] = {
"Quitemo",
7272651,
"sai-cpc",
"Latn",
}
m["sai-rab"] = {
"Rabona",
6644203,
nil,
"Latn",
}
m["sai-ram"] = {
"Ramanos",
16902824,
nil,
"Latn",
}
m["sai-sac"] = {
"Sácata",
5390321,
nil,
"Latn",
}
m["sai-san"] = {
"Sanaviron",
16895999,
nil,
"Latn",
}
m["sai-sap"] = {
"Sapará",
7420922,
"sai-car",
"Latn",
}
m["sai-sec"] = {
"Sechura",
7442912,
nil,
"Latn",
}
m["sai-sin"] = {
"Sinúfana",
7525275,
nil,
"Latn",
}
m["sai-sje-pro"] = {
"Proto-Southern Jê",
nil,
"sai-sje",
"Latn",
type = "reconstructed",
}
m["sai-tab"] = {
"Tabancale",
5390321,
nil,
"Latn",
}
m["sai-tal"] = {
"Tallán",
16910468,
nil,
"Latn",
}
m["sai-tap"] = {
"Tapayuna",
nil,
"sai-nje",
"Latn",
}
m["sai-tar-pro"] = {
"Proto-Taranoan",
nil,
"sai-tar",
"Latn",
type = "reconstructed",
}
m["sai-teu"] = {
"Teushen",
3519243,
nil,
"Latn",
}
m["sai-tim"] = {
"Timote",
nil,
nil,
"Latn",
}
m["sai-tpr"] = {
"Taparita",
7684460,
"sai-otm",
"Latn",
}
m["sai-trr"] = {
"Tarairiú",
7685313,
nil,
"Latn",
}
m["sai-wai"] = {
"Waitaká",
16918610,
nil,
"Latn",
}
m["sai-way"] = {
"Wayumará",
nil,
"sai-car",
"Latn",
}
m["sai-wit-pro"] = {
"Proto-Witotoan",
nil,
"sai-wit",
"Latn",
type = "reconstructed",
}
m["sai-wnm"] = {
"Wanham",
16879440,
"sai-cpc",
"Latn",
}
m["sai-xoc"] = { -- contrast xoo, kzw, sai-kat
"Xocó",
12953620,
nil,
"Latn",
}
m["sai-yao"] = {
"tiếng Yao (Nam Mĩ)",
nil,
"sai-ven",
"Latn",
"Tiếng Yao (Nam Mĩ)",
"Yao (Nam Mĩ)",
}
m["sai-yar"] = { -- not the same family as 'suy'
"Yarumá",
3505859,
"sai-pek",
"Latn",
}
m["sai-yri"] = {
"tiếng Yuri",
nil,
"sai-tyu",
"Latn",
"Tiếng Yuri",
"Yuri",
}
m["sai-yup"] = {
"Yupua",
8061430,
"sai-tuc",
"Latn",
}
m["sai-yur"] = {
"Yurumanguí",
1281291,
nil,
"Latn",
}
m["sal-pro"] = {
"tiếng Salish nguyên thủy",
nil,
"sal",
"Latn",
"Tiếng Salish nguyên thủy",
"Salish nguyên thủy",
type = "reconstructed",
}
m["sdv-daj-pro"] = {
"Proto-Daju",
nil,
"sdv-daj",
"Latn",
type = "reconstructed",
}
m["sdv-eje-pro"] = {
"Proto-Eastern Jebel",
nil,
"sdv-eje",
"Latn",
type = "reconstructed",
}
m["sdv-nil-pro"] = {
"Proto-Nilotic",
nil,
"sdv-nil",
"Latn",
type = "reconstructed",
}
m["sdv-nyi-pro"] = {
"Proto-Nyima",
nil,
"sdv-nyi",
"Latn",
type = "reconstructed",
}
m["sdv-tmn-pro"] = {
"Proto-Taman",
nil,
"sdv-tmn",
"Latn",
type = "reconstructed",
}
m["sel-nor"] = {
"tiếng Bắc Selkup",
30304565,
"sel",
"Cyrl",
"Tiếng Bắc Selkup",
"Bắc Selkup",
}
m["sel-pro"] = {
"tiếng Selkup nguyên thủy",
128884235,
"sel",
"Latn",
"Tiếng Selkup nguyên thủy",
"Selkup nguyên thủy",
type = "reconstructed",
}
m["sel-sou"] = {
"tiếng Nam Selkup",
30304639,
"sel",
"Cyrl",
"Tiếng Nam Selkup",
"Nam Selkup",
}
m["sem-amm"] = {
"Ammonite",
279181,
"sem-can",
"Phnx",
translit = "Phnx-translit",
}
m["sem-amo"] = {
"Amorite",
35941,
"sem-nwe",
"Xsux, Latn",
}
m["sem-cha"] = {
"Chaha",
nil,
"sem-eth",
"Ethi",
translit = "Ethi-translit",
ancestors = "sem-pro",
}
m["sem-dad"] = {
"Dadanitic",
21838040,
"sem-cen",
"Narb",
translit = "Narb-translit",
}
m["sem-dum"] = {
"Dumaitic",
nil,
"sem-cen",
"Narb",
translit = "Narb-translit",
}
m["sem-has"] = {
"Hasaitic",
3541433,
"sem-cen",
"Narb",
translit = "Narb-translit",
}
m["sem-him"] = {
"Himyaritic",
35604,
"sem",
"Arab, Sarb",
}
m["sem-his"] = {
"Hismaic",
22948260,
"sem-cen",
"Narb",
translit = "Narb-translit",
}
m["sem-mhr"] = {
"Muher",
33743,
"sem-eth",
"Latn",
}
m["sem-pro"] = {
"tiếng Semit nguyên thủy",
1658554,
"sem",
"Latn",
"Tiếng Semit nguyên thủy",
"Semit nguyên thủy",
type = "reconstructed",
}
m["sem-saf"] = {
"Safaitic",
472586,
"sem-cen",
"Narb",
translit = "Narb-translit",
}
m["sem-srb"] = {
"tiếng Nam Ả Rập cổ",
35025,
"sem-osa",
"Sarb",
"Tiếng Nam Ả Rập cổ",
"Nam Ả Rập cổ",
translit = "Sarb-translit",
}
m["sem-tay"] = {
"tiếng Tayma",
24912301,
"sem-cen",
"Narb",
"Tiếng Tayma",
"Tayma",
translit = "Narb-translit",
}
m["sem-tha"] = {
"Thamudic",
843030,
"sem-cen",
"Narb",
translit = "Narb-translit",
}
m["sem-wes-pro"] = {
"tiếng Semit Tây nguyên thủy",
98021726,
"sem-wes",
"Latn",
"Tiếng Semit Tây nguyên thủy",
"Semit Tây nguyên thủy",
type = "reconstructed",
}
m["sio-pro"] = { -- NB this is not Proto-Siouan-Catawban 'nai-sca-pro'
"tiếng Sioux nguyên thủy",
34181,
"sio",
"Latn",
"Tiếng Sioux nguyên thủy",
"Sioux nguyên thủy",
type = "reconstructed",
}
m["sit-aao-pro"] = {
"tiếng Naga Trung nguyên thủy",
nil,
"sit-aao",
"Latn",
"Tiếng Naga Trung nguyên thủy",
"Naga Trung nguyên thủy",
type = "reconstructed",
}
m["sit-bai-pro"] = {
"tiếng Bạch nguyên thủy",
nil,
"sit-bai",
"Latn",
"Tiếng Bạch nguyên thủy",
"Bạch nguyên thủy",
type = "reconstructed",
}
m["sit-ban"] = {
"Bangru",
56071779,
"sit-hrs",
"Latn",
}
m["sit-bdi-pro"] = {
"tiếng Bod nguyên thủy",
nil,
"sit-bdi",
"Latn",
"Tiếng Bod nguyên thủy",
"Bod nguyên thủy",
type = "reconstructed",
}
m["sit-bok"] = {
"tiếng Bokar",
4938727,
"sit-tan",
"Latn, Tibt",
"Tiếng Bokar",
"Bokar",
translit = {Tibt = "Tibt-translit"},
override_translit = true,
display_text = {Tibt = s["Tibt-displaytext"]},
entry_name = {Tibt = s["Tibt-entryname"]},
sort_key = {Tibt = "Tibt-sortkey"},
}
m["sit-cha"] = {
"Chairel",
5068066,
"sit-luu",
"Latn",
}
m["sit-gkh"] = {
"Gokhy",
5578069,
"tbq-lol",
"Latn",
}
m["sit-hrs-pro"] = {
"Proto-Hrusish",
nil,
"sit-hrs",
type = "reconstructed",
}
m["sit-jap"] = {
"tiếng Japhug",
3162245,
"sit-egy",
"Latn",
"Tiếng Japhug",
"Japhug",
}
m["sit-kha-pro"] = {
"Proto-Kham",
nil,
"sit-kha",
type = "reconstructed",
}
m["sit-liz"] = {
"Lizu",
6660653,
"sit-qia",
"Latn", -- and Ersu Shaba
}
m["sit-lrn"] = {
"tiếng Lư Nhân",
6660653,
"sit-qia",
nil,
"Tiếng Lư Nhân",
"Lư Nhân",
}
m["sit-luu-pro"] = {
"Proto-Luish",
nil,
"sit-luu",
type = "reconstructed",
}
m["sit-mor"] = {
"Moran",
6909216,
"tbq-bdg",
"Latn",
}
m["sit-prn"] = {
"Puiron",
7259048,
"sit-zem",
}
m["sit-pro"] = {
"tiếng Hán-Tạng nguyên thủy",
45961,
"sit",
"Latn",
"Tiếng Hán-Tạng nguyên thủy",
"Hán-Tạng nguyên thủy",
type = "reconstructed",
}
m["sit-sit"] = {
"tiếng Tứ Thổ",
19840830,
"sit-egy",
"Latn",
"Tiếng Tứ Thổ",
"Tứ Thổ",
}
m["sit-tan-pro"] = {
"Proto-Tani",
nil,
"sit-tan",
"Latn", -- needs verification
type = "reconstructed",
}
m["sit-tgm"] = {
"Tangam",
17041370,
"sit-tan",
"Latn",
}
m["sit-tos"] = {
"Tosu",
7827899,
"sit-qia",
"Latn", -- also Ersu Shaba
}
m["sit-tsh"] = {
"Tshobdun",
19840950,
"sit-egy",
"Latn",
}
m["sit-zbu"] = {
"Zbu",
19841106,
"sit-egy",
"Latn",
}
m["sla-pro"] = {
"tiếng Slav nguyên thủy",
747537,
"sla",
"Latn",
"Tiếng Slav nguyên thủy",
"Slav nguyên thủy",
type = "reconstructed",
entry_name = {
remove_diacritics = c.grave .. c.acute .. c.tilde .. c.macron .. c.dgrave .. c.invbreve,
remove_exceptions = {'ś'},
},
sort_key = {
from = {"č", "ď", "ě", "ę", "ь", "ľ", "ň", "ǫ", "ř", "š", "ś", "ť", "ъ", "ž"},
to = {"c²", "d²", "e²", "e³", "i²", "l²", "nj", "o²", "r²", "s²", "s³", "t²", "u²", "z²"},
}
}
m["smi-pro"] = {
"tiếng Sami nguyên thủy",
7251862,
"smi",
"Latn",
"Tiếng Sami nguyên thủy",
"Sami nguyên thủy",
type = "reconstructed",
sort_key = {
from = {"ā", "č", "δ", "[ëē]", "ŋ", "ń", "ō", "š", "θ", "%([^()]+%)"},
to = {"a", "c²", "d", "e", "n²", "n³", "o", "s²", "t²"}
},
}
m["son-pro"] = {
"Proto-Songhay",
nil,
"son",
"Latn",
type = "reconstructed",
}
m["sqj-pro"] = {
"tiếng Albani nguyên thủy",
18210846,
"sqj",
"Latn",
"Tiếng Albani nguyên thủy",
"Albani nguyên thủy",
type = "reconstructed",
}
m["ssa-klk-pro"] = {
"Proto-Kuliak",
nil,
"ssa-klk",
"Latn",
type = "reconstructed",
}
m["ssa-kom-pro"] = {
"tiếng Koman nguyên thủy",
nil,
"ssa-kom",
"Latn",
"Tiếng Koman nguyên thủy",
"Koman nguyên thủy",
type = "reconstructed",
}
m["ssa-pro"] = {
"tiếng Nin-Sahara nguyên thủy",
nil,
"ssa",
"Latn",
"Tiếng Nin-Sahara nguyên thủy",
"Nin-Sahara nguyên thủy",
type = "reconstructed",
}
m["syd-fne"] = {
"Forest Nenets",
1295107,
"syd",
"Cyrl",
entry_name = {remove_diacritics = c.grave .. c.acute .. c.macron .. c.breve .. c.dotabove},
}
m["syd-pro"] = {
"tiếng Samoyed nguyên thủy",
7251863,
"syd",
"Latn",
"Tiếng Samoyed nguyên thủy",
"Samoyed nguyên thủy",
type = "reconstructed",
}
m["tai-pro"] = {
"tiếng Thái nguyên thủy",
6583709,
"tai",
"Latn",
"Tiếng Thái nguyên thủy",
"Thái nguyên thủy",
type = "reconstructed",
}
m["tai-swe-pro"] = {
"tiếng Tai Tây Nam nguyên thủy",
nil,
"tai-swe",
"Latn",
"Tiếng Tai Tây Nam nguyên thủy",
"Tai Tây Nam nguyên thủy",
type = "reconstructed",
}
m["tbq-bdg-pro"] = {
"tiếng Bodo-Garo nguyên thủy",
nil,
"tbq-bdg",
"Latn",
"Tiếng Bodo-Garo nguyên thủy",
"Bodo-Garo nguyên thủy",
type = "reconstructed",
}
m["tbq-blg"] = {
"Bailang",
2879843,
"tbq-lob",
"Hani",
sort_key = "Hani-sortkey",
}
m["tbq-brm-pro"] = {
"tiếng Miến nguyên thủy",
nil,
"tbq-brm",
"Latn",
type = "reconstructed",
}
m["tbq-gkh"] = {
"Gokhy",
5578069,
"tbq-sil",
"Latn",
}
m["tbq-kuk-pro"] = {
"tiếng Kuki-Chin nguyên thủy",
nil,
"tbq-kuk",
"Latn",
"Tiếng Kuki-Chin nguyên thủy",
"Kuki-Chin nguyên thủy",
type = "reconstructed",
}
m["tbq-lal-pro"] = {
"Proto-Lalo",
nil,
"tbq-lol",
"Latn",
type = "reconstructed",
}
m["tbq-laz"] = {
"Laze",
17007626,
"sit-nax",
}
m["tbq-lob-pro"] = {
"tiếng Lô Lô-Miến nguyên thủy",
116773224,
"tbq-lob",
"Latn",
"Tiếng Lô Lô-Miến nguyên thủy",
"Lô Lô-Miến nguyên thủy",
type = "reconstructed",
}
m["tbq-lol-pro"] = {
"tiếng Lô Lô nguyên thủy",
7251855,
"tbq-lol",
"Latn",
type = "reconstructed",
}
m["tbq-ngo"] = {
"Ngochang",
nil,
"tbq-brm",
"Latn",
}
m["tbq-plg"] = {
"Pai-lang",
2879843,
"tbq-lob",
"Hani, Latn",
sort_key = {Hani = "Hani-sortkey"},
}
-- tbq-pro is now etymology-only
m["trk-dkh"] = {
"tiếng Dukha",
nil,
"trk-sib",
"Latn, Cyrl, Mong",
"Tiếng Dukha",
"Dukha",
translit = {Mong = "Mong-translit"},
display_text = {Mong = s["Mong-displaytext"]},
entry_name = {Mong = s["Mong-entryname"]},
}
m["trk-eog"] = {
"tiếng Oghuz cổ sơ kỳ",
nil,
"trk-ogz",
"ota-Arab",
strip_diacritics = {["ota-Arab"] = "ar-stripdiacritics"},
}
m["trk-fyk"] = {
"tiếng Kyrgyz Phú Dụ",
2598963,
nil,
"Latn",
"Tiếng Kyrgyz Phú Dụ",
"Kyrgyz Phú Dụ",
}
m["trk-oat"] = {
"tiếng Thổ Nhĩ Kỳ Anatolia cổ",
7083390,
"trk-ogz",
"ota-Arab",
strip_diacritics = {["ota-Arab"] = "ar-stripdiacritics"},
ancestors = "trk-eog",
"Tiếng Thổ Nhĩ Kỳ Anatolia cổ",
"Thổ Nhĩ Kỳ Anatolia cổ",
}
m["trk-pro"] = {
"tiếng Turk nguyên thủy",
3657773,
"trk",
"Latn",
"Tiếng Turk nguyên thủy",
"Turk nguyên thủy",
type = "reconstructed",
}
m["trk-soy"] = {
"tiếng Soyot",
4426878,
"trk",
"Cyrl",
"Tiếng Soyot",
"Soyot",
translit = "trk-soy-translit",
}
m["tup-gua-pro"] = {
"tiếng Tupi-Guarani nguyên thủy",
nil,
"tup-gua",
"Latn",
"Tiếng Tupi-Guarani nguyên thủy",
"Tupi-Guarani nguyên thủy",
type = "reconstructed",
}
m["tup-kab"] = {
"Kabishiana",
15302988,
"tup",
"Latn",
}
m["tup-pro"] = {
"tiếng Tupi nguyên thủy",
10354700,
"tup",
"Latn",
"Tiếng Tupi nguyên thủy",
"Tupi nguyên thủy",
type = "reconstructed",
}
m["tuw-alk"] = {
"tiếng Alchuka",
113553616,
"tuw-jrc",
"Latn, Hans",
"Tiếng Alchuka",
"Alchuka",
sort_key = {Hans = "Hani-sortkey"},
}
m["tuw-bal"] = {
"tiếng Bala",
86730632,
"tuw-jrc",
"Latn, Hans",
"Tiếng Bala",
"Bala",
sort_key = {Hans = "Hani-sortkey"},
}
m["tuw-kil"] = {
"tiếng Kili",
6406892,
"tuw",
nil,
"Tiếng Kili",
"Kili",
}
m["tuw-pro"] = {
"tiếng Tungus nguyên thủy",
nil,
"tuw",
"Latn",
"Tiếng Tungus nguyên thủy",
"Tungus nguyên thủy",
type = "reconstructed",
}
m["tuw-kkl"] = {
"tiếng Kyakala",
nil,
"tuw",
"Latn, Hani",
"Tiếng Kyakala",
"Kyakala",
sort_key = {Hani = "Hani-sortkey"},
}
m["tuw-sol"] = {
"tiếng Solon",
30004,
"tuw",
nil,
"Tiếng Solon",
"Solon",
}
m["und-isa"] = {
"Isaurian",
16956868,
nil,
-- "Xsux, Hluw, Latn",
}
m["und-kas"] = {
"Kassite",
35612,
nil,
"Xsux",
}
m["und-mil"] = {
"Milang",
6850761,
nil,
"Deva, Latn",
}
m["und-mmd"] = {
"Mimi of Decorse",
6862206,
nil,
"Latn",
}
m["und-mmn"] = {
"Mimi of Nachtigal",
6862207,
nil,
"Latn",
}
m["und-phi"] = {
"Philistine",
2230924,
nil,
"Phnx",
}
m["und-wji"] = {
"Western Jicaque",
3178610,
"hok",
"Latn",
}
m["urj-fin-pro"] = {
"tiếng Finn nguyên thủy",
11883720,
"urj-fin",
"Latn",
"Tiếng Finn nguyên thủy",
"Finn nguyên thủy",
type = "reconstructed",
}
m["urj-koo"] = {
"tiếng Komi cổ",
nil,
"urj-prm",
"Perm, Cyrs",
"Tiếng Komi cổ",
"Komi cổ",
translit = "urj-koo-translit",
sort_key = {Cyrs = s["Cyrs-sortkey"]},
}
m["urj-kuk"] = {
"Kukkuzi",
107410460,
"urj-fin",
"Latn",
ancestors = "vot",
}
m["urj-kya"] = {
"tiếng Komi-Yazva",
2365210,
"urj-prm",
"Cyrl",
"Tiếng Komi-Yazva",
"Komi-Yazva",
translit = "kv-translit",
override_translit = true,
entry_name = {remove_diacritics = c.acute},
}
m["urj-mdv-pro"] = {
"tiếng Mordvin nguyên thủy",
nil,
"urj-mdv",
"Latn",
"Tiếng Mordvin nguyên thủy",
"Mordvin nguyên thủy",
type = "reconstructed",
}
m["urj-prm-pro"] = {
"tiếng Perm nguyên thủy",
nil,
"urj-prm",
"Latn",
"Tiếng Perm nguyên thủy",
"Perm nguyên thủy",
type = "reconstructed",
}
m["urj-pro"] = {
"tiếng Ural nguyên thủy",
288765,
"urj",
"Latn",
"Tiếng Ural nguyên thủy",
"Ural nguyên thủy",
type = "reconstructed",
}
m["urj-ugr-pro"] = {
"tiếng Ugria nguyên thủy",
156631,
"urj-ugr",
"Latn",
"Tiếng Ugria nguyên thủy",
"Ugria nguyên thủy",
type = "reconstructed",
}
m["xnd-pro"] = {
"Proto-Na-Dene",
nil,
"xnd",
"Latn",
type = "reconstructed",
}
m["xgn-mgr"] = {
"tiếng Mangghuer",
34214,
"mjg",
"Latn", -- also Mong, Cyrl ?
"Tiếng Mangghuer",
"Mangghuer",
}
m["xgn-mgl"] = {
"tiếng Mongghul",
34214,
"mjg",
"Latn", -- also Mong, Cyrl ?
"Tiếng Mongghul",
"Mongghul",
}
m["xgn-pro"] = {
"tiếng Mông Cổ nguyên thủy",
2493677,
"xgn",
"Latn",
"Tiếng Mông Cổ nguyên thủy",
"Mông Cổ nguyên thủy",
type = "reconstructed",
}
m["ypk-pro"] = {
"Proto-Yupik",
nil,
"ypk",
"Latn",
type = "reconstructed",
}
m["yrk-for"] = {
"Forest Nenets",
1295107,
"yrk",
"Cyrl",
translit = "yrk-for-translit",
strip_diacritics = {remove_diacritics = c.grave .. c.acute .. c.macron .. c.breve .. c.dotabove},
}
m["yrk-tun"] = {
"tiếng Nenets lãnh nguyên",
36452,
"yrk",
"Cyrl",
"Tiếng Nenets lãnh nguyên",
"Nenets lãnh nguyên",
strip_diacritics = {
from = {"ӑ", "а̄", "э̇", "ӣ", "ы̄", "ӯ", "ю̄", "я̆", "я̄"},
to = {"а", "а", "э", "и", "ы", "у", "ю", "я", "я"},
},
translit = "yrk-tun-translit",
}
m["zhx-min-pro"] = {
"tiếng Mân nguyên thủy",
19646347,
"zhx-min",
"Latn",
"Tiếng Mân nguyên thủy",
"Mân nguyên thủy",
type = "reconstructed",
}
m["zhx-sht"] = {
"Shaozhou Tuhua",
1920769,
"zhx",
"Nshu, Hani, Hant, Hans",
generate_forms = "zh-generateforms",
sort_key = {Hani = "Hani-sortkey"},
}
m["zhx-sic"] = {
"tiếng Tứ Xuyên",
2278732,
"zhx-man",
"Hants",
"Tiếng Tứ Xuyên",
"Tứ Xuyên",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["zhx-tai"] = {
"tiếng Đài Sơn",
2208940,
"zhx",
"Hani, Hant, Hans",
"Tiếng Đài Sơn",
"Đài Sơn",
ancestors = "yue",
generate_forms = "zh-generateforms",
translit = "zh-translit",
sort_key = "Hani-sortkey",
}
m["zhx-taz"] = {
"tiếng Taz",
3516511,
"zhx",
nil,
"Tiếng Taz",
"Taz",
}
m["zhx-twa"] = {
"tiếng Đường Uông",
7683179,
"zhx",
"Hani",
"Tiếng Đường Uông",
"Đường Uông",
}
m["zle-ono"] = {
"tiếng Novgorod cổ",
162013,
"zle",
"Cyrs, Glag",
"Tiếng Novgorod cổ",
"Novgorod cổ",
translit = "Cyrs-Glag-translit",
entry_name = {Cyrs = s["Cyrs-entryname"]},
sort_key = {Cyrs = s["Cyrs-sortkey"]},
}
m["zle-ort"] = {
"tiếng Ruthenia cổ",
13211,
"zle",
"Cyrs",
"Tiếng Ruthenia cổ",
"Ruthenia cổ",
ancestors = "orv",
translit = "zle-ort-translit",
entry_name = {
remove_diacritics = s["Cyrs-entryname"].remove_diacritics,
remove_exceptions = {"Ї", "ї"}
},
sort_key = s["Cyrs-sortkey"],
}
m["zls-chs"] = {
"tiếng Slav Giáo hội",
33251,
"zls",
"Cyrs, Glag, Latn",
"Tiếng Slav Giáo hội",
"Slav Giáo hội",
ancestors = "cu",
translit = {
Cyrs = "Cyrs-translit",
Glag = "Glag-translit"
},
entry_name = {
Cyrs = s["Cyrs-entryname"]
},
sort_key = {
Cyrs = s["Cyrs-sortkey"]
},
}
m["zlw-ocs"] = {
"tiếng Séc cổ",
593096,
"zlw",
"Latn",
"Tiếng Séc cổ",
"Séc cổ",
}
m["zlw-osk"] = {
"tiếng Slovak cổ",
12776676,
"zlw",
"Latn",
"Tiếng Slovak cổ",
"Slovak cổ",
}
m["zlw-opl"] = {
"tiếng Ba Lan cổ",
149838,
"zlw-lch",
"Latn",
"Tiếng Ba Lan cổ",
"Ba Lan cổ",
entry_name = {remove_diacritics = c.ringabove},
}
m["zlw-pom-pro"] = {
"Proto-Pomeranian",
149588,
"zlw-pom",
"Latn",
type = "reconstructed",
}
m["zlw-slv"] = {
"tiếng Slovincia",
36822,
"zlw-pom",
"Latn",
"Tiếng Slovincia",
"Slovincia",
ancestors = "zlw-pom-pro",
entry_name = "zlw-slv-entryname"
}
m["aav-qal"] = {
"tiếng Quảng Lâm",
19894302,
"mkh-pal",
"Latn",
"Tiếng Quảng Lâm",
"Quảng Lâm",
}
return require("Module:languages").finalizeData(m, "language")
r3sv3c845ow9rz94l5a3v3odnixfuhk
iʰt
0
280201
2561684
2097527
2026-09-08T11:08:40Z
WhoAlone
40420
2561684
wikitext
text/x-wiki
{{-ybe-}}
{{-noun-}}
{{pn}}
# [[thịt]].
[[Thể loại:Danh từ tiếng Tây Yugur]]
{{c|ybe|Thực phẩm}}
jl9wdh8diljmjq5zqe23kvm5twd5v44
Mô đun:labels/data/lang/vi
828
280313
2561573
2513846
2026-09-08T05:27:57Z
Hiyuune
50834
2561573
Scribunto
text/plain
local labels = {}
labels["xứ Nẫu"] = {
aliases = {"xứ Nẩu", "Nẫu", "Nẩu", "Nau", "Nẫu dialects", "Nẫu dialect", "Nẩu dialects", "Nẩu dialect"},
plain_categories = "Nẫu",
}
labels["Bình Định"] = {
aliases = {"Binh Dinh", "Bình Định dialect", "Binh Dinh dialect"},
Wikipedia = "Bình Định province",
plain_categories = "Nẫu",
}
labels["Trung Bộ"] = {
aliases = {"central Vietnam", "Central Vietnamese", "central Vietnamese"},
Wikipedia = true,
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Fangcheng"] = {
aliases = {"Fangcheng dialect"},
Wikipedia = "Gin people",
plain_categories = true,
}
labels["Hải Phòng"] = {
aliases = {"Hai Phong", "Haiphong", "Hải Phòng dialect", "Hai Phong dialect", "Haiphong dialect"},
Wikipedia = true,
plain_categories = "Northern",
}
labels["Hà Nội"] = {
aliases = {"Hanoi"},
Wikipedia = {"Hanoi"},
plain_categories = "Northern",
}
labels["Hà Tĩnh"] = {
aliases = {"Ha Tinh", "Hà Tĩnh dialect", "Ha Tinh dialect"},
Wikipedia = "Hà Tĩnh province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Huế"] = {
aliases = {"Hue", "Huế dialect", "Hue dialect"},
Wikipedia = true,
plain_categories = "Tiếng Việt Huế",
}
labels["Louisiana"] = {
aliases = {"New Orleans"},
Wikipedia = "Vietnamese in New Orleans",
plain_categories = true,
}
labels["Đồng bằng Sông Cửu Long"] = {
aliases = {"Mekong Delta dialect", "Southwestern Vietnamese", "South Western Vietnamese", "Southwest Vietnamese", "southwestern Vietnamese", "south western Vietnamese", "southwest Vietnamese"},
Wikipedia = true,
plain_categories = "Tiếng Việt Đồng bằng Sông Cửu Long",
}
labels["Nghệ An"] = {
aliases = {"Nghe An", "Nghệ An dialect", "Nghe An dialect"},
Wikipedia = "Nghệ An province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Nghệ Tĩnh"] = {
aliases = {"Nghe Tinh", "Nghệ Tinh dialect", "Nghe Tinh dialect"},
Wikipedia = true,
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["North Central Vietnam"] = {
aliases = {"North-Central Vietnam", "Northern Central Vietnam", "north central Vietnam", "north-central Vietnam", "northern central Vietnam", "North Central Vietnamese", "North-Central Vietnamese", "Northern Central Vietnamese", "north central Vietnamese", "north-central Vietnamese", "northern central Vietnamese"},
Wikipedia = "North Central Coast",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Bắc Bộ"] = {
aliases = {"Northern Vietnam","North Vietnam", "northern Vietnam", "north Vietnam", "Northern Vietnamese", "North Vietnamese", "northern Vietnamese", "north Vietnamese"},
Wikipedia = true,
plain_categories = "Tiếng Việt Bắc Bộ",
}
labels["South Central Vietnam"] = {
aliases = {"Southcentral Vietnam", "South central Vietnam", "South-Central Vietnam", "South Central Coast", "South central coast"},
Wikipedia = "South Central Coast",
plain_categories = "South Central",
}
labels["Northeastern Vietnam"] = {
aliases = {"Northeast Vietnam", "northeastern Vietnam", "northeast Vietnam", "Northeastern Vietnamese", "Northeast Vietnamese", "northeastern Vietnamese", "northeast Vietnamese"},
Wikipedia = true,
plain_categories = "Northern",
}
labels["Overseas Vietnamese"] = {
aliases = {"overseas Vietnamese"},
Wikipedia = true,
plain_categories = true,
}
labels["Phú Yên"] = {
aliases = {"Phu Yen", "Phú Yên dialect", "Phu Yen dialect"},
Wikipedia = "Phú Yên province",
plain_categories = "Nẫu",
}
labels["Quảng Bình"] = {
aliases = {"Quang Binh", "Quảng Bình dialect", "Quang Binh dialect"},
Wikipedia = "Quảng Bình province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Đà Nẵng"] = {
aliases = {"Danang", "Da Nang", "Đà Nẵng dialect", "Danang dialect"},
Wikipedia = true,
plain_categories = "South Central",
}
labels["Quảng Nam"] = {
aliases = {"Quang Nam", "Quảng Nam dialect", "Quang Nam dialect"},
Wikipedia = "Quảng Nam province",
plain_categories = "South Central",
}
labels["Quảng Ngãi"] = {
aliases = {"Quang Ngai", "Quảng Ngãi dialect", "Quang Ngai dialect"},
Wikipedia = "Quảng Ngãi province",
plain_categories = "South Central",
}
labels["Quảng Trị"] = {
aliases = {"Quang Tri", "Quảng Trị dialect", "Quang Tri dialect"},
Wikipedia = "Quảng Trị province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Sài Gòn"] = {
aliases = {"Saigon", "Saigonese", "Ho Chi Minh City", "Hồ Chí Minh City"},
Wikipedia = true,
plain_categories = "Tiếng Việt Nam Việt Nam",
}
labels["Nam Việt Nam"] = {
aliases = {"South Vietnam", "southern Vietnam", "south Vietnam", "Southern Vietnamese", "South Vietnamese", "southern Vietnamese", "south Vietnamese"},
Wikipedia = "Nam Bộ",
plain_categories = "Tiếng Việt Nam Việt Nam",
}
labels["Thanh Hoá"] = {
aliases = {"Thanh Hoa", "Thanh Hoá dialect", "Thanh Hoa dialect"},
Wikipedia = "Thanh Hóa province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Việt Nam"] = {
aliases = {"Vietnamese", "Vietnam"},
Wikipedia = true,
plain_categories = "Tiếng Việt Việt Nam",
}
---------------- non-regional ----------------
labels["tulay"] = {
display = "[[từ láy]]",
}
return require("Module:labels").finalize_data(labels)
nyaux17j8ovn11nyzrbnqn74whbeqob
2561575
2561573
2026-09-08T05:30:55Z
Hiyuune
50834
2561575
Scribunto
text/plain
local labels = {}
labels["xứ Nẫu"] = {
aliases = {"xứ Nẩu", "Nẫu", "Nẩu", "Nau", "Nẫu dialects", "Nẫu dialect", "Nẩu dialects", "Nẩu dialect"},
plain_categories = "Nẫu",
}
labels["Bình Định"] = {
aliases = {"Binh Dinh", "Bình Định dialect", "Binh Dinh dialect"},
Wikipedia = "Bình Định province",
plain_categories = "Nẫu",
}
labels["Trung Bộ"] = {
aliases = {"central Vietnam", "Central Vietnamese", "central Vietnamese"},
Wikipedia = true,
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Fangcheng"] = {
aliases = {"Fangcheng dialect"},
Wikipedia = "Gin people",
plain_categories = true,
}
labels["Hải Phòng"] = {
aliases = {"Hai Phong", "Haiphong", "Hải Phòng dialect", "Hai Phong dialect", "Haiphong dialect"},
Wikipedia = true,
plain_categories = "Northern",
}
labels["Hà Nội"] = {
aliases = {"Hanoi"},
Wikipedia = {"Hanoi"},
plain_categories = "Northern",
}
labels["Hà Tĩnh"] = {
aliases = {"Ha Tinh", "Hà Tĩnh dialect", "Ha Tinh dialect"},
Wikipedia = "Hà Tĩnh province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Huế"] = {
aliases = {"Hue", "Huế dialect", "Hue dialect"},
Wikipedia = true,
plain_categories = "Tiếng Việt Huế",
}
labels["Louisiana"] = {
aliases = {"New Orleans"},
Wikipedia = "Vietnamese in New Orleans",
plain_categories = true,
}
labels["Đồng bằng Sông Cửu Long"] = {
aliases = {"Mekong Delta dialect", "Southwestern Vietnamese", "South Western Vietnamese", "Southwest Vietnamese", "southwestern Vietnamese", "south western Vietnamese", "southwest Vietnamese"},
Wikipedia = true,
plain_categories = "Tiếng Việt Đồng bằng Sông Cửu Long",
}
labels["Nghệ An"] = {
aliases = {"Nghe An", "Nghệ An dialect", "Nghe An dialect"},
Wikipedia = "Nghệ An province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Nghệ Tĩnh"] = {
aliases = {"Nghe Tinh", "Nghệ Tinh dialect", "Nghe Tinh dialect"},
Wikipedia = true,
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Bắc Trung Bộ"] = {
aliases = {"North Central Vietnam","North-Central Vietnam", "Northern Central Vietnam", "north central Vietnam", "north-central Vietnam", "northern central Vietnam", "North Central Vietnamese", "North-Central Vietnamese", "Northern Central Vietnamese", "north central Vietnamese", "north-central Vietnamese", "northern central Vietnamese"},
Wikipedia = "North Central Coast",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Bắc Bộ"] = {
aliases = {"Northern Vietnam","North Vietnam", "northern Vietnam", "north Vietnam", "Northern Vietnamese", "North Vietnamese", "northern Vietnamese", "north Vietnamese"},
Wikipedia = true,
plain_categories = "Tiếng Việt Bắc Bộ",
}
labels["South Central Vietnam"] = {
aliases = {"Southcentral Vietnam", "South central Vietnam", "South-Central Vietnam", "South Central Coast", "South central coast"},
Wikipedia = "South Central Coast",
plain_categories = "South Central",
}
labels["Northeastern Vietnam"] = {
aliases = {"Northeast Vietnam", "northeastern Vietnam", "northeast Vietnam", "Northeastern Vietnamese", "Northeast Vietnamese", "northeastern Vietnamese", "northeast Vietnamese"},
Wikipedia = true,
plain_categories = "Northern",
}
labels["Overseas Vietnamese"] = {
aliases = {"overseas Vietnamese"},
Wikipedia = true,
plain_categories = true,
}
labels["Phú Yên"] = {
aliases = {"Phu Yen", "Phú Yên dialect", "Phu Yen dialect"},
Wikipedia = "Phú Yên province",
plain_categories = "Nẫu",
}
labels["Quảng Bình"] = {
aliases = {"Quang Binh", "Quảng Bình dialect", "Quang Binh dialect"},
Wikipedia = "Quảng Bình province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Đà Nẵng"] = {
aliases = {"Danang", "Da Nang", "Đà Nẵng dialect", "Danang dialect"},
Wikipedia = true,
plain_categories = "South Central",
}
labels["Quảng Nam"] = {
aliases = {"Quang Nam", "Quảng Nam dialect", "Quang Nam dialect"},
Wikipedia = "Quảng Nam province",
plain_categories = "South Central",
}
labels["Quảng Ngãi"] = {
aliases = {"Quang Ngai", "Quảng Ngãi dialect", "Quang Ngai dialect"},
Wikipedia = "Quảng Ngãi province",
plain_categories = "South Central",
}
labels["Quảng Trị"] = {
aliases = {"Quang Tri", "Quảng Trị dialect", "Quang Tri dialect"},
Wikipedia = "Quảng Trị province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Sài Gòn"] = {
aliases = {"Saigon", "Saigonese", "Ho Chi Minh City", "Hồ Chí Minh City"},
Wikipedia = true,
plain_categories = "Tiếng Việt Nam Việt Nam",
}
labels["Nam Việt Nam"] = {
aliases = {"South Vietnam", "southern Vietnam", "south Vietnam", "Southern Vietnamese", "South Vietnamese", "southern Vietnamese", "south Vietnamese"},
Wikipedia = "Nam Bộ",
plain_categories = "Tiếng Việt Nam Việt Nam",
}
labels["Thanh Hoá"] = {
aliases = {"Thanh Hoa", "Thanh Hoá dialect", "Thanh Hoa dialect"},
Wikipedia = "Thanh Hóa province",
plain_categories = "Tiếng Việt Trung Bộ",
}
labels["Việt Nam"] = {
aliases = {"Vietnamese", "Vietnam"},
Wikipedia = true,
plain_categories = "Tiếng Việt Việt Nam",
}
---------------- non-regional ----------------
labels["tulay"] = {
display = "[[từ láy]]",
}
return require("Module:labels").finalize_data(labels)
3xb1tqwzjtvbqqfhzrxzbbygcuilppb
Bản mẫu:quote-song
10
280531
2561503
2218379
2026-09-07T15:00:39Z
TheHighFighter2
42988
/* */
2561503
wikitext
text/x-wiki
<includeonly>{{#invoke:quote|quote_t
| default-authorlabel = (nhạc và lời)
| chapter = {{#if:{{{title|}}}
| {{{title|}}}
| {{maintenance line|Please provide the song title}}
}}
| chapter_plain = {{#if:{{{track|}}}|track {{{track|}}}{{#if:{{{time|}}}{{{at|}}}|, }}
}}{{#if:{{{time|}}}
| đoạn {{{time}}}{{#if:{{{at|}}}
|, {{{at}}}
}}
| {{#if:{{{at|}}}
| {{{at}}}
}}
}}
| url = {{ifmatch|1={{{url|}}}|2=^https://www%.youtube%.com/watch%?v=|3={{{url|}}}<!--add &t= to youtube URLs when possible
-->{{ifmatch|1={{{time|}}}|2=^%d+:%d%d:%d%d$
| 3=&t={{#invoke:string|match|{{{time|}}}|^%d+}}h{{#invoke:string|match|{{{time|}}}|^%d+:(%d%d)}}m{{#invoke:string|match|{{{time|}}}|^%d+:%d%d:(%d%d)$}}s
| 4={{ifmatch|1={{{time|}}}|2=^[^0]%d?:%d%d$
| 3=&t={{#invoke:string|match|{{{time|}}}|^([^0]%d?):%d%d}}m{{#invoke:string|match|{{{time|}}}|^[^0]%d?:(%d%d)$}}s
| 4={{ifmatch|1={{{time|}}}|2=^0:%d%d$
| 3=&t={{#invoke:string|match|{{{time|}}}|^0:(%d%d)$}}s
| 4=<!--invalid or missing time parameter; do nothing-->
}}
}}
}} | 4={{{url|}}} }}<!--non-Youtube url-->
| notitle = {{#ifeq:{{{album|}}}{{{work|}}}|
| yes
}}
| alias =
chapterurl: titleurl;
trans-chapter: trans-title;
chapter_series: title_series;
chapter_seriesvolume: title_seriesvolume;
chapter_number: title_number;
title: album,work;
trans-title: trans-album,trans-work;
| ignore = title,track,time,at
| error_if = chapter,chapter_plain
}}</includeonly><!--
--><noinclude>{{quote-song|en|author=[[w:Lana Del Rey|Lana Del Rey]]; [[w:Justin Parker|Justin Parker]]|title=[[w:Video Games (song)|Video Games]]|album=[[w:Born to Die|Born to Die]]|date=7 October 2011|artist=Lana Del Rey|passage=Swinging in the backyard / Pull up in your fast car whistling my name / Open up a beer / And you say get over here and play a '''video game''' / {{...}} / I say you the bestest / Lean in for a big kiss, put his favorite perfume on / Go play your '''video game'''}}<!--
-->{{documentation}}</noinclude>
tb0f41u2minlxisiiu7rpo1bwn4inpv
kʰempiʂtïɣ
0
288708
2561683
2118539
2026-09-08T11:07:50Z
WhoAlone
40420
2561683
wikitext
text/x-wiki
{{-ybe-}}
{{-noun-}}
{{pn}}
# [[phụ nữ]].
[[Thể loại:Danh từ tiếng Tây Yugur]]
{{c|ybe|Mọi người}}
lb69nsz0vtoyvy99flo71cm10dx7brg
Mô đun:scripts/canonical names
828
291755
2561536
2513052
2026-09-08T00:47:31Z
Hiyuune
50834
2561536
Scribunto
text/plain
return {
["Adlam"] = "Adlm",
["Afaka"] = "Afak",
["Ahom"] = "Ahom",
["Anatolian hieroglyphic"] = "Hluw",
["Ancient North Arabian"] = "Narb",
["Ancient South Arabian"] = "Sarb",
["Armenia"] = "Armn",
["Assam"] = "as-Beng",
["Avestan"] = "Avst",
["Bali"] = "Bali",
["Bamum"] = "Bamu",
["Bassa"] = "Bass",
["Batak"] = "Batk",
["Baybayin"] = "Tglg",
["Bengal"] = "Beng",
["Bhaiksuki"] = "Bhks",
["Blissymbolic"] = "Blis",
["Book Pahlavi"] = "Phlv",
["Brahmi"] = "Brah",
["Braille"] = "Brai",
["Buhid"] = "Buhd",
["Canadian syllabic"] = "Cans",
["Carian"] = "Cari",
["Caucasian Albanian"] = "Aghb",
["Chakma"] = "Cakm",
["Cherokee"] = "Cher",
["Chisoi"] = "Chis",
["Chăm"] = "Cham",
["Clear Script"] = "xwo-Mong",
["Coptic"] = "Copt",
["hình nêm"] = "Xsux",
["Cypriot"] = "Cprt",
["Cypro-Minoan"] = "Cpmn",
["Demotic"] = "Egyd",
["Deseret"] = "Dsrt",
["Devanagari"] = "Deva",
["Dhives Akuru"] = "Diak",
["Dogra"] = "Dogr",
["Dongba"] = "Nkdb",
["Duployan"] = "Dupl",
["Duy Ngô Nhĩ cổ"] = "Ougr",
["Egyptian hieroglyphic"] = "Egyp",
["Elbasan"] = "Elba",
["Elymaic"] = "Elym",
["Ethiopic"] = "Ethi",
["Fraktur"] = "Latf",
["Fraser"] = "Lisu",
["Gaelic"] = "Latg",
["Garay"] = "Gara",
["Geba"] = "Nkgb",
["Gruzia"] = "Geor",
["Glagolitic"] = "Glag",
["Gothic"] = "Goth",
["Grantha"] = "Gran",
["Hy Lạp"] = "Grek",
["Gujarat"] = "Gujr",
["Gunjala Gondi"] = "Gong",
["Gurmukhi"] = "Guru",
["Hangul"] = "Hang",
["Hanifi Rohingya"] = "Rohg",
["Hanunoo"] = "Hano",
["Hatran"] = "Hatr",
["Hebrew"] = "Hebr",
["Hieratic"] = "Egyh",
["Hiragana"] = "Hira",
["Hán"] = "Hani",
["Image-rendered"] = "Image",
["Imperial Aramaic"] = "Armi",
["Indus"] = "Inds",
["Inscriptional Pahlavi"] = "Phli",
["Inscriptional Parthian"] = "Prti",
["International Phonetic Alphabet"] = "Ipach",
["Japanese"] = "Jpan",
["Java"] = "Java",
["Jurchen"] = "Jurc",
["Kaithi"] = "Kthi",
["Kana"] = "Hrkt",
["Kannada"] = "Knda",
["Katakana"] = "Kana",
["Kawi"] = "Kawi",
["Kayah Li"] = "Kali",
["Kharoshthi"] = "Khar",
["Khema"] = "Gukh",
["Khitan large"] = "Kitl",
["Khitan small"] = "Kits",
["Khmer"] = "Khmr",
["Khojki"] = "Khoj",
["Khom Thai"] = "Khomt",
["Khudabadi"] = "Sind",
["Khutsuri"] = "Geok",
["Khwarezmian"] = "Chrs",
["Kirat Rai"] = "Krai",
["Kirin"] = "Cyrl",
["Kirin cổ"] = "Cyrs",
["Korean"] = "Kore",
["Kpelle"] = "Kpel",
["Kulitan"] = "Kulit",
["Lai Tay"] = "Tayo",
["Lào"] = "Laoo",
["Latin"] = "pjt-Latn",
["Latinh"] = "Latn",
["Leke"] = "Leke",
["Lepcha"] = "Lepc",
["Limbu"] = "Limb",
["Linear A"] = "Lina",
["Linear B"] = "Linb",
["Loma"] = "Loma",
["Lontara"] = "Bugi",
["Lycian"] = "Lyci",
["Lydian"] = "Lydi",
["Mahajani"] = "Mahj",
["Makasar"] = "Maka",
["Malayalam"] = "Mlym",
["Manchu"] = "mnc-Mong",
["Mandaic"] = "Mand",
["Manichaean"] = "Mani",
["Marchen"] = "Marc",
["Masaram Gondi"] = "Gonm",
["Maya"] = "Maya",
["Medefaidrin"] = "Medf",
["Meitei Mayek"] = "Mtei",
["Mende"] = "Mend",
["Meroitic cursive"] = "Merc",
["Meroitic hieroglyphic"] = "Mero",
["Miến Điện"] = "Mymr",
["Modi"] = "Modi",
["Mongolian"] = "Mong",
["Moon"] = "Moon",
["Morse code"] = "Morse",
["Mru"] = "Mroo",
["Multani"] = "Mult",
["Mundari Bani"] = "Nagm",
["N'Ko"] = "Nkoo",
["Nabataean"] = "Nbat",
["Nandinagari"] = "Nand",
["Newa"] = "Newa",
["Northeastern Iberian"] = "Ibrnn",
["Nyiakeng Puachue Hmong"] = "Hmnp",
["Nüshu"] = "Nshu",
["Odia"] = "Orya",
["Ogham"] = "Ogam",
["Ol Chiki"] = "Olck",
["Ol Onal"] = "Onao",
["Old Hungarian"] = "Hung",
["Old Italic"] = "Ital",
["Old Permic"] = "Perm",
["Old Persian"] = "Xpeo",
["Old Sogdian"] = "Sogo",
["Old Turkic"] = "Orkh",
["Osage"] = "Osge",
["Osmanya"] = "Osma",
["Pahawh Hmong"] = "Hmng",
["Palmyrene"] = "Palm",
["Pau Cin Hau"] = "Pauc",
["Pazend"] = "pal-Avst",
["Phags-pa"] = "Phag",
["Phoenician"] = "Phnx",
["Pollard"] = "Plrd",
["Proto-Cuneiform"] = "Pcun",
["Proto-Elamite"] = "Pelm",
["Proto-Sinaitic"] = "Psin",
["Psalter Pahlavi"] = "Phlp",
["Ranjana"] = "Ranj",
["Rejang"] = "Rjng",
["Rongorongo"] = "Roro",
["Rumi numerals"] = "Rumin",
["Runic"] = "Runr",
["Samaritan"] = "Samr",
["Saurashtra"] = "Saur",
["Shahmukhi"] = "pa-Arab",
["Sharada"] = "Shrd",
["Shavian"] = "Shaw",
["Siddham"] = "Sidd",
["Sidetic"] = "Sidt",
["SignWriting"] = "Sgnw",
["Hán giản thể"] = "Hans",
["Sinhalese"] = "Sinh",
["Sogdian"] = "Sogd",
["Sorang Sompeng"] = "Sora",
["Southeastern Iberian"] = "Ibrns",
["Soyombo"] = "Soyo",
["Sui"] = "Shui",
["Sundanese"] = "Sund",
["Sunuwar"] = "Sunu",
["Sylheti Nagri"] = "Sylo",
["Syriac"] = "Syrc",
["Tagbanwa"] = "Tagb",
["Tai Nüa"] = "Tale",
["Tai Tham"] = "Lana",
["Tai Viet"] = "Tavt",
["Takri"] = "Takr",
["Tamil"] = "Taml",
["Tamyig"] = "sit-tam-Tibt",
["Tangsa"] = "Tnsa",
["Tangut"] = "Tang",
["Telugu"] = "Telu",
["Tengwar"] = "Teng",
["Thaana"] = "Thaa",
["Thái"] = "Thai",
["Tifinagh"] = "Tfng",
["Tigalari"] = "Tutg",
["Tirhuta"] = "Tirh",
["Todhri"] = "Todr",
["Tolong Siki"] = "Tols",
["Toto"] = "Toto",
["Hán phồn thể"] = "Hant",
["Tày Lự mới"] = "Talu",
["Tạng"] = "Tibt",
["Ugarit"] = "Ugar",
["Vai"] = "Vaii",
["Varang Kshiti"] = "Wara",
["Visible Speech"] = "Visp",
["Vithkuqi"] = "Vith",
["Wancho"] = "Wcho",
["Woleai"] = "Wole",
["Xibe"] = "sjo-Mong",
["Yezidi"] = "Yezi",
["Yi"] = "Yiii",
["Zanabazar Square"] = "Zanb",
["Zhuyin"] = "Bopo",
["flag semaphore"] = "Semap",
["mathematical notation"] = "Zmth",
["musical notation"] = "Music",
["symbolic"] = "Zsym",
["uncoded"] = "Zzzz",
["undetermined"] = "Zyyy",
["unspecified"] = "None",
["Ả Rập"] = "Arab",
}
ox5tw6yh2ijqwld0ke3equwh8z5hokw
2561614
2561536
2026-09-08T08:57:47Z
Hiyuune
50834
2561614
Scribunto
text/plain
return {
["Adlam"] = "Adlm",
["Afaka"] = "Afak",
["Ahom"] = "Ahom",
["Anatolian hieroglyphic"] = "Hluw",
["Ancient North Arabian"] = "Narb",
["Ancient South Arabian"] = "Sarb",
["Armenia"] = "Armn",
["Assam"] = "as-Beng",
["Avestan"] = "Avst",
["Bali"] = "Bali",
["Bamum"] = "Bamu",
["Bassa"] = "Bass",
["Batak"] = "Batk",
["Baybayin"] = "Tglg",
["Bengal"] = "Beng",
["Bhaiksuki"] = "Bhks",
["Blissymbolic"] = "Blis",
["Book Pahlavi"] = "Phlv",
["Brahmi"] = "Brah",
["Braille"] = "Brai",
["Buhid"] = "Buhd",
["Canadian syllabic"] = "Cans",
["Carian"] = "Cari",
["Caucasian Albanian"] = "Aghb",
["Chakma"] = "Cakm",
["Cherokee"] = "Cher",
["Chisoi"] = "Chis",
["Chăm"] = "Cham",
["Clear Script"] = "xwo-Mong",
["Coptic"] = "Copt",
["hình nêm"] = "Xsux",
["Cypriot"] = "Cprt",
["Cypro-Minoan"] = "Cpmn",
["Demotic"] = "Egyd",
["Deseret"] = "Dsrt",
["Devanagari"] = "Deva",
["Dhives Akuru"] = "Diak",
["Dogra"] = "Dogr",
["Dongba"] = "Nkdb",
["Duployan"] = "Dupl",
["Duy Ngô Nhĩ cổ"] = "Ougr",
["Egyptian hieroglyphic"] = "Egyp",
["Elbasan"] = "Elba",
["Elymaic"] = "Elym",
["Ethiopic"] = "Ethi",
["Fraktur"] = "Latf",
["Fraser"] = "Lisu",
["Gaelic"] = "Latg",
["Garay"] = "Gara",
["Geba"] = "Nkgb",
["Gruzia"] = "Geor",
["Glagolitic"] = "Glag",
["Gothic"] = "Goth",
["Grantha"] = "Gran",
["Hy Lạp"] = "Grek",
["Gujarat"] = "Gujr",
["Gunjala Gondi"] = "Gong",
["Gurmukhi"] = "Guru",
["Hangul"] = "Hang",
["Hanifi Rohingya"] = "Rohg",
["Hanunoo"] = "Hano",
["Hatran"] = "Hatr",
["Hebrew"] = "Hebr",
["Hieratic"] = "Egyh",
["Hiragana"] = "Hira",
["Hán"] = "Hani",
["Image-rendered"] = "Image",
["Imperial Aramaic"] = "Armi",
["Indus"] = "Inds",
["Inscriptional Pahlavi"] = "Phli",
["Inscriptional Parthian"] = "Prti",
["International Phonetic Alphabet"] = "Ipach",
["Japanese"] = "Jpan",
["Java"] = "Java",
["Jurchen"] = "Jurc",
["Kaithi"] = "Kthi",
["Kana"] = "Hrkt",
["Kannada"] = "Knda",
["Katakana"] = "Kana",
["Kawi"] = "Kawi",
["Kayah Li"] = "Kali",
["Kharoshthi"] = "Khar",
["Khema"] = "Gukh",
["Khitan large"] = "Kitl",
["Khitan small"] = "Kits",
["Khmer"] = "Khmr",
["Khojki"] = "Khoj",
["Khom Thai"] = "Khomt",
["Khudabadi"] = "Sind",
["Khutsuri"] = "Geok",
["Khwarezmian"] = "Chrs",
["Kirat Rai"] = "Krai",
["Kirin"] = "Cyrl",
["Kirin cổ"] = "Cyrs",
["Korean"] = "Kore",
["Kpelle"] = "Kpel",
["Kulitan"] = "Kulit",
["Lai Tay"] = "Tayo",
["Lào"] = "Laoo",
["Latin"] = "pjt-Latn",
["Latinh"] = "Latn",
["Leke"] = "Leke",
["Lepcha"] = "Lepc",
["Limbu"] = "Limb",
["Linear A"] = "Lina",
["Linear B"] = "Linb",
["Loma"] = "Loma",
["Lontara"] = "Bugi",
["Lycian"] = "Lyci",
["Lydian"] = "Lydi",
["Mahajani"] = "Mahj",
["Makasar"] = "Maka",
["Malayalam"] = "Mlym",
["Manchu"] = "mnc-Mong",
["Mandaic"] = "Mand",
["Manichaean"] = "Mani",
["Marchen"] = "Marc",
["Masaram Gondi"] = "Gonm",
["Maya"] = "Maya",
["Medefaidrin"] = "Medf",
["Meitei Mayek"] = "Mtei",
["Mende"] = "Mend",
["Meroitic cursive"] = "Merc",
["Meroitic hieroglyphic"] = "Mero",
["Miến Điện"] = "Mymr",
["Modi"] = "Modi",
["Mongolian"] = "Mong",
["Moon"] = "Moon",
["Morse code"] = "Morse",
["Mru"] = "Mroo",
["Multani"] = "Mult",
["Mundari Bani"] = "Nagm",
["N'Ko"] = "Nkoo",
["Nabataean"] = "Nbat",
["Nandinagari"] = "Nand",
["Newa"] = "Newa",
["Northeastern Iberian"] = "Ibrnn",
["Nyiakeng Puachue Hmong"] = "Hmnp",
["Nüshu"] = "Nshu",
["Odia"] = "Orya",
["Ogham"] = "Ogam",
["Ol Chiki"] = "Olck",
["Ol Onal"] = "Onao",
["Old Hungarian"] = "Hung",
["Old Italic"] = "Ital",
["Old Permic"] = "Perm",
["Old Persian"] = "Xpeo",
["Old Sogdian"] = "Sogo",
["Old Turkic"] = "Orkh",
["Osage"] = "Osge",
["Osmanya"] = "Osma",
["Pahawh Hmong"] = "Hmng",
["Palmyrene"] = "Palm",
["Pau Cin Hau"] = "Pauc",
["Pazend"] = "pal-Avst",
["Phags-pa"] = "Phag",
["Phoenician"] = "Phnx",
["Pollard"] = "Plrd",
["Proto-Cuneiform"] = "Pcun",
["Proto-Elamite"] = "Pelm",
["Proto-Sinaitic"] = "Psin",
["Psalter Pahlavi"] = "Phlp",
["Ranjana"] = "Ranj",
["Rejang"] = "Rjng",
["Rongorongo"] = "Roro",
["Rumi numerals"] = "Rumin",
["Runic"] = "Runr",
["Samaritan"] = "Samr",
["Saurashtra"] = "Saur",
["Shahmukhi"] = "pa-Arab",
["Sharada"] = "Shrd",
["Shavian"] = "Shaw",
["Siddham"] = "Sidd",
["Sidetic"] = "Sidt",
["SignWriting"] = "Sgnw",
["Hán giản thể"] = "Hans",
["Sinhalese"] = "Sinh",
["Sogdian"] = "Sogd",
["Sorang Sompeng"] = "Sora",
["Southeastern Iberian"] = "Ibrns",
["Soyombo"] = "Soyo",
["Sui"] = "Shui",
["Sundanese"] = "Sund",
["Sunuwar"] = "Sunu",
["Sylheti Nagri"] = "Sylo",
["Syriac"] = "Syrc",
["Tagbanwa"] = "Tagb",
["Tai Nüa"] = "Tale",
["Tai Tham"] = "Lana",
["Tai Viet"] = "Tavt",
["Takri"] = "Takr",
["Tamil"] = "Taml",
["Tamyig"] = "sit-tam-Tibt",
["Tangsa"] = "Tnsa",
["Tangut"] = "Tang",
["Telugu"] = "Telu",
["Tengwar"] = "Teng",
["Thaana"] = "Thaa",
["Thái"] = "Thai",
["Tifinagh"] = "Tfng",
["Tigalari"] = "Tutg",
["Tirhuta"] = "Tirh",
["Todhri"] = "Todr",
["Tolong Siki"] = "Tols",
["Toto"] = "Toto",
["Hán phồn thể"] = "Hant",
["Tày Lự mới"] = "Talu",
["Tạng"] = "Tibt",
["Ugarit"] = "Ugar",
["Vai"] = "Vaii",
["Varang Kshiti"] = "Wara",
["Visible Speech"] = "Visp",
["Vithkuqi"] = "Vith",
["Wancho"] = "Wcho",
["Woleai"] = "Wole",
["Xibe"] = "sjo-Mong",
["Yezidi"] = "Yezi",
["Lô Lô"] = "Yiii",
["Zanabazar Square"] = "Zanb",
["Zhuyin"] = "Bopo",
["flag semaphore"] = "Semap",
["mathematical notation"] = "Zmth",
["musical notation"] = "Music",
["symbolic"] = "Zsym",
["uncoded"] = "Zzzz",
["undetermined"] = "Zyyy",
["unspecified"] = "None",
["Ả Rập"] = "Arab",
}
88o0drrzg513f77b0wvrcoctfzzree5
tïrmaq
0
293947
2561694
2134596
2026-09-08T11:10:17Z
WhoAlone
40420
2561694
wikitext
text/x-wiki
{{-ybe-}}
{{-noun-}}
{{head|ybe|Danh từ}}
# [[móng tay]].
{{c|ybe|Bộ phận cơ thể}}
ruxo2yjldyb10ddxhwwf1qqi4py9rjp
ji1
0
313099
2561629
2286844
2026-09-08T09:39:52Z
Hiyuune
50834
2561629
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|jī}}
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA|yue|/ji˥/}}
==={{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|猗}}
# {{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|𪘲}}
9ma3gibbgxez0c0ffejj9ju5nzznall
ji3
0
313101
2561630
2286850
2026-09-08T09:43:29Z
Hiyuune
50834
/* Tiếng Quan Thoại */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561630
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|jǐ}}
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA|yue|/ji˧/}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|衣}}
# {{yue-jyutping of|薏}}
# {{yue-jyutping of|意}}
tk3gw1b2u3ti7zbe1a3ivq99dllity0
ji2
0
313117
2561628
2286843
2026-09-08T09:39:02Z
Hiyuune
50834
2561628
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|jí}}
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA|yue|/ji˧˥/}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|椅}}
# {{yue-jyutping of|倚}}
# {{yue-jyutping of|咦}}
# {{yue-jyutping of|猗}}
# {{yue-jyutping of|綺}}
fg4n7xfq72nnh288mte1mi565w32v02
Bản mẫu:ĐM
10
324658
2561510
2559647
2026-09-07T15:33:48Z
Hiyuune
50834
2561510
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}|{{#switch:{{lc:{{{1|}}}}}
|abbreviation|abbr|abr=Viết tắt
|affix=Phụ tố
|affixed forms=Hình thức phụ tố
|adjective|adj=Tính từ
|adnominal=Danh tính từ
|adverb|adv=Phó từ
|alternative forms|alternative form|alt|alter|alter form=Cách viết khác
|alternative script|alt sc|alt-script|alter sc=Chữ viết khác
|alternative reconstructions=Từ tái tạo khác
|ambiposition=-->
|anagrams|anagram|ana=Từ đảo chữ
|antonyms|antonym|ant=Trái nghĩa
|article=Trợ từ
|circumfix=Phụ tố chu vi
|circumposition|circumpos=Yếu tố quanh
|classifier|cls=Loại từ
<!--|collocations=
|combining form=-->
|compound|com=Từ ghép
|conjugation|forms|conjug=Chia động từ
|conjunction|conj=Liên từ
|contraction|contr=Từ rút gọn
|coordinate terms|coordinate|coord|cot=Từ cùng trường nghĩa
|counter=Lượng từ
|cuneiform sign=Ký tự hình nêm
|declension|decl=Biến cách
|definition|dfn=Định nghĩa
|derived terms|drv|der|derived=Từ phái sinh
|description|desction=Mô tả
|descendants|desc=Hậu duệ
<!--|determinative=-->
|determiner|det=Từ hạn định
<!--|diacritical mark=-->
|derived characters|der char|drv-char=Ký tự phái sinh
|etymology|etym=Từ nguyên
|further reading|further=Đọc thêm
|glyph origin=Nguồn gốc ký tự
|han character|han|han char|=Ký tự chữ Hán
|hanja=Hanja
|hanviet=Phiên âm Hán–Việt
|hanviet-t=Phồn thể
<!--|hanzi=-->
|holonyms|holonym=Từ toàn thể
|homophones|homo=Từ đồng âm
|hyponyms|hypo=Từ có nghĩa hẹp hơn
|hypernyms|hyper=Từ có nghĩa rộng hơn
<!--|ideophone=-->
|idiom=Thành ngữ
|infix=Trung tố
|inflection|infl=Biến tố
|instance=Ví dụ
<!--|interfix=-->
|interjection|interj|intj=Thán từ
|interrogative|interrog=Từ nghi vấn
|kanji=Kanji
|letter=Chữ cái
<!--|ligature=-->
|logogram=Chữ tượng hình
|meronyms|meronym|mero=Từ bộ phận
|mutation|mut=Biến đổi âm
|note=Ghi chú
|noun|n=Danh từ
|nôm=Chữ Nôm
|number=Ký tự số
|numeral|num=Số từ
|paronym|paro=Từ tương tự
|participle|ptcp=Phân từ
|particle|part=Trợ từ
|phonogram=Chữ biểu âm
|phrase|phr=Cụm từ
|place=Địa danh
|postposition|postpos=Yếu tố sau
|prefix|pref=Tiền tố
|preposition|prep=Giới từ
|prepositional phrase|pp=Cụm giới từ
|pronoun=Đại từ
|pronunciation|pron=Cách phát âm
|prop|proper|proper noun|pr-noun|pr-n=Danh từ riêng
|proverb=Tục ngữ
|punctuation mark|punctuation|punc=Dấu câu
|quotation|quot=Trích dẫn
|reading=Âm đọc
|reconstruction notes=Ghi chú từ tái tạo
|references|reference|ref=Tham khảo
|related terms|related|rel=Từ liên hệ
|related characters|Ký tự liên quan
|rhymes=Vần
|romanization|rom=Latinh hóa
|root=Gốc từ
|see also|see=Xem thêm
|statistics|stats|stat=Thống kê
|stem=Thân từ
|suffix|suff|suf=Hậu tố
|syllable|syll=Âm tiết
|symbol=Ký hiệu
|synonyms|synonym|syn=Đồng nghĩa
|translations|trans=Dịch
|transliteration|translit=Chuyển tự
<!--|trivia=
|troponyms=-->
|usage notes|usage=Ghi chú sử dụng
|verb|v=Động từ
|verbal noun|vn=Vị danh từ
|#default={{error|Tên đề mục không đúng hoặc không có sẵn}}}}
|{{error|Cần phải chỉ định tên đề mục}}}}</includeonly><noinclude>{{tài liệu}}</noinclude>
8fwmh9dytutztchotbvbkoy9d1dwusq
2561512
2561510
2026-09-07T15:35:13Z
Hiyuune
50834
2561512
wikitext
text/x-wiki
<includeonly>{{#if:{{{1|}}}|{{#switch:{{lc:{{{1|}}}}}
|abbreviation|abbr|abr=Viết tắt
|affix=Phụ tố
|affixed forms=Hình thức phụ tố
|adjective|adj=Tính từ
|adnominal=Danh tính từ
|adverb|adv=Phó từ
|alternative forms|alternative form|alt|alter|alter form=Cách viết khác
|alternative script|alt sc|alt-script|alter sc=Chữ viết khác
|alternative reconstructions=Từ tái tạo khác
|ambiposition=-->
|anagrams|anagram|ana=Từ đảo chữ
|antonyms|antonym|ant=Trái nghĩa
|article=Trợ từ
|circumfix=Phụ tố chu vi
|circumposition|circumpos=Yếu tố quanh
|classifier|cls=Loại từ
<!--|collocations=
|combining form=-->
|compound|com=Từ ghép
|conjugation|forms|conjug=Chia động từ
|conjunction|conj=Liên từ
|contraction|contr=Từ rút gọn
|coordinate terms|coordinate|coord|cot=Từ cùng trường nghĩa
|counter=Lượng từ
|cuneiform sign=Ký tự hình nêm
|declension|decl=Biến cách
|definition|dfn=Định nghĩa
|derived terms|drv|der|derived=Từ phái sinh
|description|desction=Mô tả
|descendants|desc=Hậu duệ
<!--|determinative=-->
|determiner|det=Từ hạn định
<!--|diacritical mark=-->
|derived characters|der char|drv-char=Ký tự phái sinh
|etymology|etym=Từ nguyên
|further reading|further=Đọc thêm
|glyph origin=Nguồn gốc ký tự
|han character|han|han char|=Ký tự chữ Hán
|hanja=Hanja
|hanviet=Phiên âm Hán–Việt
|hanviet-t=Phồn thể
<!--|hanzi=-->
|holonyms|holonym=Từ toàn thể
|homophones|homo=Từ đồng âm
|hyponyms|hypo=Từ có nghĩa hẹp hơn
|hypernyms|hyper=Từ có nghĩa rộng hơn
<!--|ideophone=-->
|idiom=Thành ngữ
|infix=Trung tố
|inflection|infl=Biến tố
|instance=Ví dụ
<!--|interfix=-->
|interjection|interj|intj=Thán từ
|interrogative|interrog=Từ nghi vấn
|kanji=Kanji
|letter=Chữ cái
<!--|ligature=-->
|logogram=Chữ tượng hình
|meronyms|meronym|mero=Từ bộ phận
|mutation|mut=Biến đổi âm
|note=Ghi chú
|noun|n=Danh từ
|nôm=Chữ Nôm
|number=Ký tự số
|numeral|num=Số từ
|paronym|paro=Từ tương tự
|participle|ptcp=Phân từ
|particle|part=Trợ từ
|phonogram=Chữ biểu âm
|phrase|phr=Cụm từ
|place=Địa danh
|postposition|postpos=Yếu tố sau
|prefix|pref=Tiền tố
|preposition|prep=Giới từ
|prepositional phrase|pp=Cụm giới từ
|pronoun=Đại từ
|pronunciation|pron=Cách phát âm
|prop|proper|proper noun|pr-noun|pr-n=Danh từ riêng
|proverb=Tục ngữ
|punctuation mark|punctuation|punc=Dấu câu
|quotation|quot=Trích dẫn
|reading=Âm đọc
|reconstruction notes=Ghi chú từ tái tạo
|references|reference|ref=Tham khảo
|related terms|related|rel=Từ liên hệ
|related characters=Ký tự liên quan
|rhymes=Vần
|romanization|rom=Latinh hóa
|root=Gốc từ
|see also|see=Xem thêm
|statistics|stats|stat=Thống kê
|stem=Thân từ
|suffix|suff|suf=Hậu tố
|syllable|syll=Âm tiết
|symbol=Ký hiệu
|synonyms|synonym|syn=Đồng nghĩa
|translations|trans=Dịch
|transliteration|translit=Chuyển tự
<!--|trivia=
|troponyms=-->
|usage notes|usage=Ghi chú sử dụng
|verb|v=Động từ
|verbal noun|vn=Vị danh từ
|#default={{error|Tên đề mục không đúng hoặc không có sẵn}}}}
|{{error|Cần phải chỉ định tên đề mục}}}}</includeonly><noinclude>{{tài liệu}}</noinclude>
4yiy1qrkcsairhk7dunldq03aw9w5jf
Mô đun:etymon
828
331836
2561505
2474102
2026-09-07T15:05:14Z
TheHighFighter2
42988
2561505
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Tác giả:
- Triển khai ban đầu: [[:en:User:Ioaxxere]]
- Tái cấu trúc lại mô đun (tháng 9 năm 2025): [[:en:User:Fenakhay]] ([[:en:Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
local ucfirst = require("Module:string utilities").ucfirst
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
if opts.gloss ~= "suppress" then
link_params.gloss = term.t
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
return M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "từ" and (base.text == "Từ" or base.text == "từ"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "By [[Phụ lục:Từ điển thuật ngữ#phân tích mặt chữ|phân tích mặt chữ]],"
local surf_phrase = "theo cách phân tích mặt chữ:"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and #code == 2 then
local gender_adj = codes[code:sub(1, 1)]
local number_adj = codes[code:sub(2, 2)]
if gender_adj and number_adj then
adj = gender_adj .. " " .. number_adj
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Phụ lục:Từ điển thuật ngữ#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Phụ lục:Từ điển thuật ngữ#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
}
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. ".")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\".")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
return M.links.full_link({
term = page,
lang = norm_lang,
no_generate_forms = true,
}, "term")
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find("^Etymology") then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if template_name == "etymon" then
local template_args = node:get_arguments()
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code and not is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
term.id = etymon_data.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == 118 then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:stripDiacritics(M.links.remove_links(tree_title)) ~= lang:stripDiacritics(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local nl = args.nl
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == "" then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == "" then
entry_pagename = "*" .. entry_pagename
end
if lang:stripDiacritics(M.links.remove_links(title)) ~= lang:stripDiacritics(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = ucfirst(norm_lang:getCanonicalName())
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Ngôn ngữ '" .. lang_desc .. "' không khớp với đầu mục L2 (" .. current_L2 .. ").")
end
end
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = nl and true or false,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if nl then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
ehn094s0lmvq7g10s6ij7l0jxs6te5i
2561506
2561505
2026-09-07T15:06:51Z
TheHighFighter2
42988
2561506
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Tác giả:
- Triển khai ban đầu: [[:en:User:Ioaxxere]]
- Tái cấu trúc lại mô đun (tháng 9 năm 2025): [[:en:User:Fenakhay]] ([[:en:Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
local ucfirst = require("Module:string utilities").ucfirst
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
if opts.gloss ~= "suppress" then
link_params.gloss = term.t
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
return M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "từ" and (base.text == "Từ" or base.text == "từ"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "Theo cách [[Phụ lục:Từ điển thuật ngữ#phân tích mặt chữ|phân tích mặt chữ]],"
local surf_phrase = "theo cách phân tích mặt chữ:"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and #code == 2 then
local gender_adj = codes[code:sub(1, 1)]
local number_adj = codes[code:sub(2, 2)]
if gender_adj and number_adj then
adj = gender_adj .. " " .. number_adj
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Phụ lục:Từ điển thuật ngữ#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Phụ lục:Từ điển thuật ngữ#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
}
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. ".")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\".")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
return M.links.full_link({
term = page,
lang = norm_lang,
no_generate_forms = true,
}, "term")
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find("^Etymology") then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if template_name == "etymon" then
local template_args = node:get_arguments()
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code and not is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
term.id = etymon_data.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == 118 then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:stripDiacritics(M.links.remove_links(tree_title)) ~= lang:stripDiacritics(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local nl = args.nl
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == "" then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == "" then
entry_pagename = "*" .. entry_pagename
end
if lang:stripDiacritics(M.links.remove_links(title)) ~= lang:stripDiacritics(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = ucfirst(norm_lang:getCanonicalName())
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Ngôn ngữ '" .. lang_desc .. "' không khớp với đầu mục L2 (" .. current_L2 .. ").")
end
end
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = nl and true or false,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if nl then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
gkxssgywg8zdzt0b5sffhs4lkka815q
2561508
2561506
2026-09-07T15:07:49Z
TheHighFighter2
42988
2561508
Scribunto
text/plain
--[=[
This module implements the {{etymon}} template for structured etymology data on Wiktionary.
It enables the creation of etymology trees and text by parsing etymon chains,
scraping linked pages for their own {{etymon}} data, and recursively building a tree
of derivational relationships.
Tác giả:
- Triển khai ban đầu: [[:en:User:Ioaxxere]]
- Tái cấu trúc lại mô đun (tháng 9 năm 2025): [[:en:User:Fenakhay]] ([[:en:Special:Diff/86717746]])
Modules:
- [[Module:etymon]]: main module handling parsing, validation, tree building, and page scraping
- [[Module:etymon/data]]: keyword definitions, configuration, and status constants
- [[Module:etymon/tree]]: etymology tree rendering
- [[Module:etymon/text]]: etymology text generation
- [[Module:etymon/categories]]: category generation logic
- [[Module:etymon/tracking]]: tracking
]=]
local export = {}
local __state = {
cached_etymon_args = {},
cached_etymon_pages = {},
cached_descendants_checks = {},
senseid_parent_etymon = {},
available_etymon_ids = {},
single_etymons = {},
entry_title = nil,
entry_lang_code = nil,
current_page_has_inline_etymology = false,
current_page_has_redundant_etymology = false,
used_idless_etymon = false,
toplevel_has_inline_etymology = false,
toplevel_redundant_etymology = false,
toplevel_idless_etymon = false,
has_mismatched_id = false,
linked_page_multiple_etymons_idless = false,
linked_page_partial_etymology_sections = false,
partial_etymology_targets = {},
skip_partial_etymology_category = false,
max_depth_reached = 0,
total_nodes = 0,
language_count = {},
toplevel_keyword_stats = {},
id_stats = nil,
warnings = {},
}
local M = require("Module:module loader").init({
require = {
data = "Module:etymon/data",
tree = "Module:etymon/tree",
text = "Module:etymon/text",
categories = "Module:etymon/categories",
tracking = "Module:etymon/tracking",
descendants = "Module:etymon/descendants",
anchors = "Module:anchors",
etydate = "Module:etydate",
etymology = "Module:etymology",
families = "Module:families",
languages = "Module:languages",
languages_errorgetby = "Module:languages/errorGetBy",
links = "Module:links",
pages = "Module:pages",
parameters = "Module:parameters",
string_utilities = "Module:string utilities",
template_parser = "Module:template parser",
utilities = "Module:utilities",
debug = "Module:debug",
en_utilities = "Module:en-utilities",
parse_utilities = "Module:parse utilities",
references = "Module:references",
template_styles = "Module:TemplateStyles",
script_utilities = "Module:script utilities",
JSON = "Module:JSON",
yesno = "Module:yesno",
},
loadData = {
headword_data = "Module:headword/data",
parameters_data = "Module:parameters/data",
text_allowed = "Module:etymon/data/text_allowed",
},
})
local ucfirst = require("Module:string utilities").ucfirst
local Util = {}
function Util.format_error(message, preview_only)
if preview_only and not M.pages.is_preview() then
return nil
end
return '<span class="error">' .. message .. '</span>'
end
function Util.add_warning(message, preview_only)
local formatted = Util.format_error(message, preview_only)
if formatted then
table.insert(__state.warnings, formatted)
end
end
function Util.is_text_param_allowed_for_lang(lang)
if not lang or type(lang) ~= "table" then
return false
end
local types = lang.getTypes and lang:getTypes()
if types and types.family then
local code = lang.getCode and lang:getCode()
return code and M.text_allowed.families[code] == true
end
local full_code = lang.getFullCode and lang:getFullCode()
if full_code and M.text_allowed.langs[full_code] then
return true
end
if lang.inFamily then
for family_code in pairs(M.text_allowed.families) do
if lang:inFamily(family_code) then
return true
end
end
end
return false
end
function Util.get_lang(code, no_error)
if no_error then
return M.languages.getByCode(code, nil, true)
end
return M.languages.getByCode(code, nil, true) or M.languages_errorgetby.code(code, true, true)
end
-- Match a term language against a text=:lang stop target (supports etymology-only codes).
function Util.lang_matches_stop_code(term_lang, stop_code)
if not term_lang or not stop_code or stop_code == "" then
return false
end
local stop_lang = Util.get_lang(stop_code, true)
if not stop_lang then
return false
end
if term_lang:getCode() == stop_lang:getCode() then
return true
end
if stop_lang:getFullCode() == stop_lang:getCode() then
return term_lang:getFullCode() == stop_lang:getCode()
end
return false
end
function Util.get_family(code)
return M.families.getByCode(code)
end
function Util.get_lang_exception(lang)
-- Families have no language-specific exceptions
if lang.getTypes and lang:getTypes().family then
return nil
end
local code = lang:getCode()
local lang_exceptions = M.data.config.lang_exceptions
if lang_exceptions[code] then
return lang_exceptions[code]
end
for norm_code, exc in pairs(lang_exceptions) do
if exc.normalize_to and code == exc.normalize_to then
return exc
end
if exc.normalize_from_families then
local should_normalize = false
for _, family in ipairs(exc.normalize_from_families) do
if lang:inFamily(family) then
should_normalize = true
break
end
end
if should_normalize and exc.normalize_exclude_families then
for _, family in ipairs(exc.normalize_exclude_families) do
if lang:inFamily(family) then
should_normalize = false
break
end
end
end
if should_normalize then
local ret = {}
for k, v in pairs(exc) do
ret[k] = v
end
ret.suppress_tr = nil
return ret
end
end
end
return nil
end
function Util.get_norm_lang(lang)
local exc = Util.get_lang_exception(lang)
if exc and exc.normalize_to then
return M.languages.getByCode(exc.normalize_to)
end
return lang
end
-- Add default values for boolean modifiers (e.g., <unc> becomes <unc:1>)
-- This is needed because Module:parse utilities expects boolean modifiers to have explicit values
function Util.add_boolean_defaults(str, param_mods)
local result = str
for name, spec in pairs(param_mods) do
if spec.type == "boolean" then
-- Replace <name> with <name:1> (but not <name:...> which already has a value)
result = result:gsub("<" .. name .. ">", "<" .. name .. ":1>")
end
end
return result
end
local REQUEST_TEMPLATE_PARAM_MODS = {
rfe = {
nocat = { type = "boolean" },
sort = {},
y = {},
m = {},
fragment = {},
section = {},
box = { type = "boolean" },
noes = { type = "boolean" },
},
etystub = {
nocat = { type = "boolean" },
sort = {},
nocap = { type = "boolean" },
nodot = { type = "boolean" },
},
}
function Util.expand_request_template(frame, template_name, param_value, lang_code)
local param_mods = REQUEST_TEMPLATE_PARAM_MODS[template_name]
local with_defaults = Util.add_boolean_defaults(param_value, param_mods)
local parsed = M.parse_utilities.parse_inline_modifiers(with_defaults, {
param_mods = param_mods,
generate_obj = function(text)
if M.yesno(text, false) then
return { is_boolean = true }
end
return { text = text }
end,
})
local template_args = { [1] = lang_code }
for name in pairs(param_mods) do
template_args[name] = parsed[name]
end
if not parsed.is_boolean then
template_args[2] = parsed.text
end
return " " .. frame:expandTemplate({
title = template_name,
args = template_args,
})
end
-- Centralized term formatting: handles suppress_term (-), unknown_term (empty/+), and regular terms
function Util.format_term(term, is_toplevel, opts)
opts = opts or {}
-- suppress_term (-) returns nil
if term.suppress_term then
return nil
end
local lang = term.lang
local exc = Util.get_lang_exception(lang)
if is_toplevel then
local display_text = term.alt or term.title or ""
local sc = term.sc or lang:findBestScript(display_text)
local bold_text = tostring(mw.html.create("strong")
:addClass("selflink")
:wikitext(display_text))
return M.script_utilities.tag_text(bold_text, lang, sc, "term")
end
local link_params = { lang = lang }
link_params.term = not term.unknown_term and term.title or nil
link_params.alt = term.alt
link_params.id = (not term.unknown_term and term.id and term.id ~= "") and term.id or nil
if not (exc and exc.suppress_tr) then
link_params.tr = term.tr
link_params.ts = term.ts
else
link_params.suppress_tr = true
end
link_params.lit = (opts.lit ~= "suppress") and term.lit or nil
if opts.gloss ~= "suppress" then
link_params.gloss = term.t
end
if term.g and term.g ~= "" then
local genders = M.string_utilities.split(term.g, ",")
for i = 1, #genders do
genders[i] = M.string_utilities.trim(genders[i])
end
link_params.genders = genders
end
if opts.pos ~= "suppress" then
link_params.pos = term.pos
link_params.ng = term.ng
end
if exc and exc.suppress_tr then
link_params.lit = nil
end
local show_qualifiers
if opts.tree_ql ~= "suppress" then
if term.q then
link_params.q = term.q
end
if term.qq then
link_params.qq = term.qq
end
if term.l then
link_params.l = term.l
end
if term.ll then
link_params.ll = term.ll
end
show_qualifiers = term.q or term.qq or term.l or term.ll
end
return M.links.full_link(link_params, "term", nil, show_qualifiers and true or nil)
end
local __is_content_page_cached
function Util.is_content_page()
if __is_content_page_cached == nil then
__is_content_page_cached = M.pages.is_content_page(mw.title.getCurrentTitle())
end
return __is_content_page_cached
end
local __page_data_cached
function Util.get_page_data()
if not __page_data_cached then
__page_data_cached = M.headword_data.page
end
return __page_data_cached
end
-- Extract base keyword from param (without modifiers)
local function get_keyword_base(param)
if type(param) ~= "string" then return nil end
local base = param:match("^:?([^<]+)") or param:gsub("^:", "")
return base
end
local function is_keyword(param, allow_colon_less)
if type(param) ~= "string" then return false end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
if allow_colon_less then
local base = get_keyword_base(param)
return keywords[base] ~= nil
end
return false
end
local function get_keyword(param, allow_colon_less)
if type(param) ~= "string" then return nil end
local keywords = M.data.keywords
if param:sub(1, 1) == ":" then
return get_keyword_base(param)
end
if allow_colon_less then
local base = get_keyword_base(param)
if keywords[base] then
return base
end
end
return nil
end
local function normalize_keyword(keyword)
if keyword:sub(1, 1) == ":" then
return keyword
end
return ":" .. keyword
end
-- Resolve keyword (possibly an alias) to its canonical form. Used only at input boundaries
local function get_canonical_keyword(keyword)
if not keyword then return keyword end
return M.data.keyword_canonical[keyword] or keyword
end
local function is_affix_group_keyword(keyword)
local config = keyword and M.data.keywords[keyword]
return config and config.affix_categories or false
end
local function reject_removed_surf_keyword(param)
local base = get_keyword_base(param)
if base == "surf" then
error("The `:surf` keyword has been removed. Use `<surf>` on a formation keyword instead (e.g. `:af<surf>`, `:bor<surf>`).")
end
end
local function copy_keyword_info(source)
local copy = {}
for k, v in pairs(source) do
copy[k] = v
end
return copy
end
local function lowercase_glossary_display(text)
return text:gsub("(%[%[Appendix:Glossary#[^|]+|)([^%]])([^%]]*)%]%]", function(prefix, first, rest)
return prefix .. mw.ustring.lower(first) .. rest .. "]]"
end)
end
local function surf_should_keep_formation_phrase(base)
if not base.phrase then
return false
end
if base.glossary then
return true
end
return not (base.phrase == "từ" and (base.text == "Từ" or base.text == "từ"))
end
-- Runtime overrides when <surf> is present on a keyword.
local function get_effective_keyword_info(keyword, modifiers)
local base = M.data.keywords[keyword]
if not base or not modifiers or not modifiers.surf then
return base
end
local effective = copy_keyword_info(base)
local surf_text = "Theo cách [[Phụ lục:Từ điển thuật ngữ#phân tích mặt chữ|phân tích mặt chữ]]:"
local surf_phrase = "theo cách phân tích mặt chữ:"
effective.new_sentence = true
effective.invisible = "tree"
if surf_should_keep_formation_phrase(base) then
effective.phrase = surf_phrase .. " " .. base.phrase
if base.text then
effective.text = surf_text .. " " .. lowercase_glossary_display(base.text)
else
effective.text = surf_text .. " " .. base.phrase
end
else
effective.text = surf_text
effective.phrase = surf_phrase
end
return effective
end
-- Build text/phrase for nominalization with <g:code> (uses data module for codes only).
local function get_nominalization_label_for_g(code)
if not code or code == "" then return nil end
local codes = M.data.nominalization_g_codes
local adj = codes[code]
if not adj and #code == 2 then
local gender_adj = codes[code:sub(1, 1)]
local number_adj = codes[code:sub(2, 2)]
if gender_adj and number_adj then
adj = gender_adj .. " " .. number_adj
end
end
if not adj then return nil end
local text = adj:gsub("^%l", function(c) return string.upper(c) end) .. " [[Phụ lục:Từ điển thuật ngữ#nominalization|nominalization]] of"
local phrase = M.en_utilities.add_indefinite_article(adj .. " [[Phụ lục:Từ điển thuật ngữ#nominalization|nominalization]] of", false)
return { text = text, phrase = phrase }
end
local EtymonParser = {}
-- Keyword modifier definitions
EtymonParser.keyword_param_mods = {
unc = { type = "boolean" },
ref = {},
text = { restrict = { keywords = { "from", "derived" } } },
lit = { restrict = { affix_group = true } },
conj = {}, -- conjunction for alternatives: "and", "or", "and/or", etc.
g = { restrict = { keywords = { "nominalization" } } },
surf = { type = "boolean" },
senseid = { restrict = { keywords = { "semantic loan" } } },
}
-- Term modifier definitions
EtymonParser.etymon_param_mods = {
id = {},
t = {},
tr = {},
ts = {},
q = {},
qq = {},
l = {},
ll = {},
pos = {},
ng = {},
alt = {},
g = {},
ety = {},
lit = {},
unc = { type = "boolean" },
ref = {},
aftype = { restrict = { affix_group = true } },
postype = {},
bor = { type = "boolean", restrict = { affix_group = true } },
slbor = { type = "boolean", restrict = { affix_group = true } },
lbor = { type = "boolean", restrict = { affix_group = true } },
}
local function get_clean_param_mods(param_mods)
local clean = {}
for mod_name, mod_def in pairs(param_mods) do
clean[mod_name] = {}
for key, value in pairs(mod_def) do
if key ~= "restrict" then
clean[mod_name][key] = value
end
end
end
return clean
end
function EtymonParser.check_modifier_restrictions(modifiers, current_keyword, param_mods)
for mod_name, mod_value in pairs(modifiers) do
-- Only check restrictions if the modifier has a non-false/nil value
if mod_value then
local mod_def = param_mods[mod_name]
if mod_def and mod_def.restrict then
if mod_def.restrict.affix_group then
if not is_affix_group_keyword(current_keyword) then
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for affix-group keywords (e.g. `:af`, `:blend`, `:univ`).")
end
elseif mod_def.restrict.keywords then
local allowed_keywords = mod_def.restrict.keywords
local is_allowed = false
for _, allowed_keyword in ipairs(allowed_keywords) do
if current_keyword == allowed_keyword then
is_allowed = true
break
end
end
if not is_allowed then
local keyword_list = {}
for _, kw in ipairs(allowed_keywords) do
table.insert(keyword_list, ":" .. kw)
end
local keyword_str = table.concat(keyword_list, #keyword_list == 2 and " or " or ", ")
if #keyword_list > 2 then
-- Replace last comma with "or"
keyword_str = keyword_str:gsub(", ([^,]+)$", " or %1")
end
local mod_display = mod_value == true and "<" .. mod_name .. ">" or "<" .. mod_name .. ":" .. tostring(mod_value) .. ">"
error("The modifier `" .. mod_display .. "` is only allowed for the keyword" .. (#keyword_list > 1 and "s " or " ") .. keyword_str .. ".")
end
end
end
end
end
end
local TERM_RULE_DISALLOW = {
suppress = { field = "suppress_term", label = "suppressed" },
unknown = { field = "unknown_term", label = "unknown" },
family = { field = "is_family", label = "family" },
}
function EtymonParser.check_etymon_limits(count, limits, label, opts)
if not limits then
return
end
opts = opts or {}
local min_etymons = limits.min_etymons
if min_etymons == nil and not opts.skip_default_min then
min_etymons = 1
end
if min_etymons and count < min_etymons then
if min_etymons > 1 then
error("Detected " .. label .. " group with fewer than " .. min_etymons .. " etymons.")
else
error("Detected " .. label .. " with no etymons.")
end
end
if limits.max_etymons and count > limits.max_etymons then
local unit = (limits.max_etymons == 1) and "etymon" or "etymons"
error("Detected " .. label .. " with more than " .. limits.max_etymons .. " " .. unit .. ".")
end
end
function EtymonParser.check_term_rules(etymon_data, entry_lang, rules, label)
label = label or "term"
if rules and rules.disallow then
local disallowed = {}
for _, typ in ipairs(rules.disallow) do
local spec = TERM_RULE_DISALLOW[typ]
if spec and etymon_data[spec.field] then
table.insert(disallowed, spec.label)
end
end
if #disallowed > 0 then
error(label .. " does not support " ..
mw.text.listToText(disallowed, "or") .. " etymons.")
end
end
if etymon_data.is_family then
if rules and rules.family == "disallowed" then
error(label .. " does not support family codes" .. (rules.family_suffix or "."))
elseif not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
if rules then
if rules.require_term and (not etymon_data.term or etymon_data.term == "") then
error(label .. " requires a term for each listed form.")
end
if rules.entry_lang then
if Util.get_norm_lang(etymon_data.lang):getFullCode() ~=
Util.get_norm_lang(entry_lang):getFullCode() then
error(label .. " terms must be in the entry language (" ..
entry_lang:getFullCode() .. "), got '" .. etymon_data.lang:getFullCode() .. "'.")
end
end
if rules.ancestor_check then
M.etymology.check_ancestor(entry_lang, etymon_data.lang)
end
elseif etymon_data.is_family and not etymon_data.suppress_term then
error("Family codes require suppressed term (use family:-).")
end
end
function EtymonParser.check_keyword_term(etymon_data, entry_lang, keyword)
local config = M.data.keywords[keyword]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "`:" .. keyword .. "`")
end
function EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local config = M.data.supplements[supplement_type]
EtymonParser.check_term_rules(etymon_data, entry_lang, config and config.term_rules, "|" .. supplement_type .. "=")
end
-- Parse keyword with modifiers (e.g., ":bor<unc>" or ":bor<ref:{{R:example}}>")
function EtymonParser.parse_keyword_modifiers(param)
if type(param) ~= "string" then return nil, {} end
local base_keyword = get_keyword_base(param)
if not base_keyword then return nil, {} end
local canonical_keyword = get_canonical_keyword(base_keyword)
-- Check if there are any modifiers
if not param:find("<", 1, true) then
return canonical_keyword, {}
end
-- Parse modifiers using the same mechanism as etymon parsing
local rest_with_defaults = Util.add_boolean_defaults(param, EtymonParser.keyword_param_mods)
local function generate_obj(ignored)
return {}
end
local parsed = M.parse_utilities.parse_inline_modifiers(rest_with_defaults:gsub("^:?[^<]+", ""),
{ param_mods = get_clean_param_mods(EtymonParser.keyword_param_mods), generate_obj = generate_obj })
local modifiers = {
unc = parsed.unc or false,
ref = parsed.ref,
text = parsed.text,
lit = parsed.lit,
conj = parsed.conj,
g = parsed.g,
surf = parsed.surf or false,
senseid = parsed.senseid,
}
-- Validate modifiers against restrictions
EtymonParser.check_modifier_restrictions(modifiers, canonical_keyword, EtymonParser.keyword_param_mods)
return canonical_keyword, modifiers
end
local function normalize_keyword_param(keyword_with_mods)
local trimmed = M.string_utilities.trim(keyword_with_mods)
reject_removed_surf_keyword(trimmed:match("^:") and trimmed or (":" .. trimmed))
local base = get_keyword_base(trimmed)
if not base or not M.data.keywords[base] then
error("Invalid keyword '" .. trimmed .. "' in inline etymology")
end
local canonical_base = get_canonical_keyword(base)
local without_colon = trimmed:gsub("^:", "")
local mods_part = without_colon:sub(#base + 1)
local kw_param = normalize_keyword(canonical_base .. mods_part)
EtymonParser.parse_keyword_modifiers(kw_param)
return kw_param
end
local function get_keyword_mod_names()
local names = {}
for mod_name in pairs(EtymonParser.keyword_param_mods) do
names[mod_name] = true
end
return names
end
local function parse_inline_ety_run(ety_string)
local body = ety_string or ""
if body == "" then
error("Empty inline etymology")
end
local keyword_mod_names = get_keyword_mod_names()
local pos = 1
local len = #body
local function parse_err(msg)
error(msg .. " in inline etymology: '" .. body .. "'")
end
local function peek_double()
return body:sub(pos, pos + 1) == "<<"
end
local function mod_name_from_unwrapped(unwrapped)
return unwrapped:match("^<([^:>]+)")
end
local function is_keyword_mod(unwrapped)
local name = mod_name_from_unwrapped(unwrapped)
return name and keyword_mod_names[name] or false
end
local function read_double_bracket()
if not peek_double() then
return nil
end
local start = pos
pos = pos + 2
while pos <= len - 1 do
if body:sub(pos, pos + 1) == ">>" then
local token = body:sub(start, pos + 1)
pos = pos + 2
return token, token:sub(2, -2)
end
pos = pos + 1
end
parse_err("Unmatched <<")
end
local function read_angle_cell()
if body:sub(pos, pos) ~= "<" or peek_double() then
return nil
end
local open = pos
pos = pos + 1
local depth = 1
local i = pos
while i <= len do
local ch = body:sub(i, i)
if ch == "<" then
depth = depth + 1
elseif ch == ">" then
depth = depth - 1
if depth == 0 then
local inner = body:sub(open + 1, i - 1)
pos = i + 1
return inner
end
end
i = i + 1
end
parse_err("Unmatched <")
end
local function read_bare_run()
local start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
return body:sub(start, pos - 1)
end
local function absorb_double_keyword_mods(keyword_str)
while peek_double() do
local saved = pos
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
keyword_str = keyword_str .. unwrapped
else
pos = saved
break
end
end
return keyword_str
end
local kw_start = pos
while pos <= len and body:sub(pos, pos) ~= "<" do
pos = pos + 1
end
local keyword = body:sub(kw_start, pos - 1)
if keyword:match("^%s*$") then
parse_err("Missing keyword")
end
keyword = absorb_double_keyword_mods(keyword)
local cells = {}
while pos <= len do
if peek_double() then
local _, unwrapped = read_double_bracket()
if is_keyword_mod(unwrapped) then
parse_err("Unexpected keyword modifier " .. unwrapped .. " outside of a keyword")
end
table.insert(cells, "+" .. unwrapped)
elseif body:sub(pos, pos) == "<" then
local inner = read_angle_cell()
if inner ~= "" then
table.insert(cells, inner)
end
else
local bare = read_bare_run()
if bare ~= "" then
if bare:sub(1, 1) ~= ":" then
parse_err("Unexpected bare text '" .. bare .. "' (use :keyword for nested keywords in inline etymology)")
end
if not is_keyword(bare, true) then
parse_err("Invalid keyword '" .. bare .. "' in inline etymology")
end
table.insert(cells, absorb_double_keyword_mods(bare))
end
end
end
return {
keyword = keyword,
cells = cells,
}
end
function EtymonParser.inline_ety_to_pipe(ety_string)
local run = parse_inline_ety_run(ety_string)
if not run.keyword or run.keyword:match("^%s*$") then
return "|"
end
local pipe_parts = { normalize_keyword_param(M.string_utilities.trim(run.keyword)) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(pipe_parts, normalize_keyword_param(segment))
else
table.insert(pipe_parts, segment)
end
end
return "|" .. table.concat(pipe_parts, "|") .. "|"
end
function EtymonParser.pipe_to_inline_ety(pipe_string)
local cells = {}
for cell in pipe_string:gmatch("([^|]+)") do
if cell ~= "" then
table.insert(cells, cell)
end
end
if #cells == 0 then
return ""
end
local inline_parts = {}
for index, cell in ipairs(cells) do
local base = get_keyword_base(cell)
if base and M.data.keywords[base] then
local without_colon = cell:gsub("^:", "")
local kw_base, mods = without_colon:match("^([^<]+)(.*)$")
local inline_kw = (kw_base or without_colon) .. (mods or ""):gsub("<([^>]+)>", "<<%1>>")
if index > 1 then
inline_kw = ":" .. inline_kw
end
table.insert(inline_parts, inline_kw)
elseif cell:sub(1, 1) == "+" then
local mod = cell:sub(2)
if mod:match("^<.->$") then
mod = mod:sub(2, -2)
end
table.insert(inline_parts, "<<" .. mod .. ">>")
else
table.insert(inline_parts, "<" .. cell .. ">")
end
end
return table.concat(inline_parts, "")
end
function EtymonParser.parse_inline_ety(ety_string, context_lang)
local run = parse_inline_ety_run(ety_string)
local keyword = M.string_utilities.trim(run.keyword)
reject_removed_surf_keyword(":" .. keyword)
if not is_keyword(keyword, true) then
error("Invalid keyword '" .. keyword .. "' in inline etymology <ety:" .. keyword .. "...>")
end
local args = { context_lang:getCode(), normalize_keyword_param(keyword) }
for _, segment in ipairs(run.cells) do
if is_keyword(segment, true) then
table.insert(args, normalize_keyword_param(segment))
else
table.insert(args, segment)
end
end
return args
end
function EtymonParser.parse_etymon(param, context_lang)
if is_keyword(param) then
return nil
end
if type(param) ~= "string" then
return nil
end
local lang, rest
local is_family = false
local before_bracket = param:match("^([^<]*)") or param
local lang_code, rest_match = before_bracket:match("^([a-zA-Z][a-zA-Z0-9._-]*):(.*)$")
if lang_code then
local potential_lang = Util.get_lang(lang_code, true)
if potential_lang then
lang = potential_lang
rest = param:sub(#lang_code + 2)
else
local potential_family = Util.get_family(lang_code)
if potential_family then
lang = potential_family
rest = param:sub(#lang_code + 2)
is_family = true
else
lang = context_lang
rest = param
end
end
else
lang = context_lang
rest = param
end
M.tracking.track_term(rest)
if rest == "" or rest == "+" then
return {
lang = lang,
term = nil,
unknown_term = true,
is_family = is_family,
}
end
if rest == "-" then
return {
lang = lang,
term = nil,
suppress_term = true,
is_family = is_family,
}
end
if not rest:find("<", 1, true) then
return {
lang = lang,
term = M.string_utilities.trim(rest),
is_family = is_family,
}
end
local term_text = rest:match("^([^<]*)") or ""
local is_unknown = (term_text == "" or term_text == "+")
local is_suppress = (term_text == "-")
local function generate_obj(ignored_term)
return { term = (is_unknown or is_suppress) and nil or M.string_utilities.trim(term_text) }
end
local rest_with_defaults = Util.add_boolean_defaults(rest, EtymonParser.etymon_param_mods)
local parsed_obj = M.parse_utilities.parse_inline_modifiers(rest_with_defaults,
{ param_mods = get_clean_param_mods(EtymonParser.etymon_param_mods), generate_obj = generate_obj })
if parsed_obj.id and parsed_obj.id:match("^!") then
parsed_obj.id = parsed_obj.id:sub(2)
parsed_obj.override = true
end
parsed_obj.lang = lang
parsed_obj.is_family = is_family
if is_unknown then
parsed_obj.unknown_term = true
elseif is_suppress then
parsed_obj.suppress_term = true
end
return parsed_obj
end
function EtymonParser.validate(lang, args, id, title, pos, starts_with_lang_code)
-- id is now optional, so only validate if provided
if id then
if mw.ustring.len(id) < 2 then
error("The `id` parameter must have at least two characters.")
end
if id == title or id == Util.get_page_data().pagename then
error("The `id` parameter must not be the same as the page title.")
end
end
local valid_pos = { prefix = true, suffix = true, interfix = true, infix = true, root = true, word = true }
if pos and not valid_pos[pos] then
error("Unknown value provided for `pos`. Valid values: " .. table.concat(require("Module:table").keysToList(valid_pos), ", ") .. ".")
end
local current_keyword = "from"
local current_keyword_explicit = false
local keyword_etymons = {}
local keywords = M.data.keywords
local function checkKeyword()
local config = keywords[current_keyword]
if current_keyword == "from" and not current_keyword_explicit and #keyword_etymons == 0 then
keyword_etymons = {}
return
end
EtymonParser.check_etymon_limits(#keyword_etymons, config, "`:" .. current_keyword .. "`")
keyword_etymons = {}
end
local start_index = starts_with_lang_code and 2 or 1
for i = start_index, #args do
local param = args[i]
if type(param) ~= "string" then
elseif param:sub(1, 1) == ":" and not is_keyword(param) then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif is_keyword(param) then
checkKeyword()
current_keyword = get_canonical_keyword(get_keyword(param))
current_keyword_explicit = true
else
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
table.insert(keyword_etymons, param)
EtymonParser.check_keyword_term(etymon_data, lang, current_keyword)
-- Check modifier restrictions
EtymonParser.check_modifier_restrictions(etymon_data, current_keyword, EtymonParser.etymon_param_mods)
-- postype must be "root" or "word"
local VALID_POSTYPES = { root = true, word = true }
if etymon_data.postype and not VALID_POSTYPES[etymon_data.postype] then
error("Invalid <postype:" .. etymon_data.postype .. ">; must be \"root\" or \"word\".")
end
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
EtymonParser.validate(etymon_data.lang, inline_args, nil, nil, nil, true)
end
else
table.insert(keyword_etymons, param)
end
end
end
checkKeyword()
end
local DataRetriever = {}
local function format_etymon_id_hint(id_data, idx)
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
return '"' .. id .. '"'
end
if pos and pos ~= "" then
return "unnamed (|pos=" .. pos .. "|)"
end
return "etymon #" .. idx .. " (no |id= on page)"
end
local function etymon_target_page_link(page, norm_lang)
return M.links.full_link({
term = page,
lang = norm_lang,
no_generate_forms = true,
}, "term")
end
-- Summarize {{etymon}} id slots on a linked page for preview warnings.
local function summarize_available_etymon_ids(ids)
local id_list = {}
local all_idless = true
local target_has_idless = false
local any_pos = false
for i, id_data in ipairs(ids) do
local id = type(id_data) == "table" and id_data.id or id_data
local pos = type(id_data) == "table" and id_data.pos
if id and id ~= "" and id ~= "*" then
all_idless = false
else
target_has_idless = true
end
if pos and pos ~= "" then
any_pos = true
end
table.insert(id_list, format_etymon_id_hint(id_data, i))
end
return {
id_list = id_list,
all_idless = all_idless,
target_has_idless = target_has_idless,
any_pos = any_pos,
count = #ids,
options_text = mw.text.listToText(id_list),
}
end
local function ambiguous_etymon_suggestion(page_link, summary)
if summary.all_idless then
if summary.any_pos then
return " None set `|id=` yet; add a unique `|id=` to each on " .. page_link
.. ", then `<id:identifier>` after the term here. Section order / hints: "
.. summary.options_text .. "."
end
return " None set `|id=` yet; add a unique `|id=` to each {{etymon}} in that section from top to bottom, then `<id:identifier>` after the term here (same value as `|id=`)."
end
return " Specify which one with `<id:identifier>` after the term. Options: " .. summary.options_text .. "."
end
local function warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(ids)
if is_toplevel and summary.target_has_idless then
__state.linked_page_multiple_etymons_idless = true
end
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " is ambiguous (" .. summary.count
.. " {{etymon}} templates for " .. lang_name .. ")."
Util.add_warning(lead .. ambiguous_etymon_suggestion(page_link, summary), true)
end
local function is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
return cached_args == M.data.STATUS.MISSING and not parent_etymon
and #(__state.available_etymon_ids[base_key] or {}) > 0
end
local function maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
if not is_toplevel or __state.skip_partial_etymology_category then
return
end
if not __state.partial_etymology_targets[base_key] then
return
end
if etymon_data.id and type(cached_args) == "table" then
return
end
__state.linked_page_partial_etymology_sections = true
end
local function is_nonlemma_etymon_template(template_args)
return template_args and M.yesno(template_args.nl, false)
end
local function warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_id)
local page_link = etymon_target_page_link(page, norm_lang)
local summary = summarize_available_etymon_ids(__state.available_etymon_ids[base_key] or {})
local lang_name = norm_lang:getCanonicalName()
local lead = "Etymology link to " .. page_link .. " uses `<id:" .. etymon_id
.. ">`, but no {{etymon}} on that page has `|id=" .. etymon_id .. "|` for " .. lang_name .. "."
Util.add_warning(lead .. " Valid IDs: " .. summary.options_text .. ".", true)
end
-- Given an etymon data, scrape its page and cache the result in the global state object.
function DataRetriever.cache_page_etymons(etymon_page, etymon_title, key, etymon_lang, etymon_id, redirected_from, descendants_is_toplevel)
local content = etymon_title:getContent()
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.REDLINK
return
end
-- Check if the linked page is a redirect. If it is, the template parsing
-- code below will be effectively skipped, and `scrape_page` will be called
-- again on the redirect target (see the bottom of this function)
local lang_section_for_descendants = nil
local redirect_target = etymon_title.redirect_target
if not redirect_target then
content = M.pages.get_section(content, etymon_lang:getFullName(), 2)
if not content then
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
return
end
lang_section_for_descendants = content
end
local etymon_lang_code = etymon_lang:getFullCode()
local lang_page_key = etymon_lang_code .. ":" .. etymon_page
local found_templates_for_lang = {}
local found_ids = {}
local get_node_class = M.template_parser.class_else_type
-- Look for all {{etymon}} templates within the page content using the template parser
-- This way the same page is never parsed more than once
-- Build a map from senseids to their parent etymonids.
local active_etymon_args = nil
local etymology_section_count = 0
local etymology_sections_with_etymon = 0
local current_etymology_has_etymon = false
local function finalize_current_etymology_section()
if etymology_section_count == 0 then
return
end
if current_etymology_has_etymon then
etymology_sections_with_etymon = etymology_sections_with_etymon + 1
end
current_etymology_has_etymon = false
end
for node in M.template_parser.parse(content):iterate_nodes() do
local node_class = get_node_class(node)
if node_class == "heading" then
-- A new L2 or etymology section acts as a barrier: an {{etymon}} usage
-- used previously cannot be the parent of any subsequent senseids.
-- Note that we don't have to check for L2s due to the usage of `M.pages.get_section` above.
if node:get_name():find("^Etymology") then
finalize_current_etymology_section()
etymology_section_count = etymology_section_count + 1
active_etymon_args = nil
end
elseif node_class == "template" then
local template_name = node:get_name()
if template_name == "etymon" then
local template_args = node:get_arguments()
-- Check if this etymon is for our language
if template_args[1] == etymon_lang_code and not is_nonlemma_etymon_template(template_args) then
if etymology_section_count > 0 then
current_etymology_has_etymon = true
end
table.insert(found_templates_for_lang, template_args)
if template_args.id then
local etymon_key = lang_page_key .. ":" .. template_args.id
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, template_args.id)
active_etymon_args = template_args
else
-- Store idless etymon with default key
local etymon_key = lang_page_key .. ":*"
__state.cached_etymon_args[etymon_key] = template_args
__state.cached_etymon_pages[etymon_key] = tostring(etymon_page)
table.insert(found_ids, "*")
active_etymon_args = template_args
end
end
elseif active_etymon_args and template_name == "senseid" then
local template_args = node:get_arguments()
-- This should always be true for proper usages of {{senseid}}.
if template_args[1] == etymon_lang_code and template_args[2] then
local sense_id_key = lang_page_key .. ":" .. template_args[2]
__state.senseid_parent_etymon[sense_id_key] = active_etymon_args
__state.cached_etymon_pages[sense_id_key] = tostring(etymon_page)
end
end
end
end
finalize_current_etymology_section()
if lang_section_for_descendants
and etymology_section_count > 1
and etymology_sections_with_etymon > 0
and etymology_sections_with_etymon < etymology_section_count
then
__state.partial_etymology_targets[lang_page_key] = true
end
if descendants_is_toplevel and lang_section_for_descendants and #found_templates_for_lang > 0 then
M.descendants.cache_page_checks({
lang_section = lang_section_for_descendants,
etymon_lang_code = etymon_lang_code,
found_templates_for_lang = found_templates_for_lang,
entry_title = __state.entry_title,
entry_lang_code = __state.entry_lang_code,
entry_lang = __state.entry_lang_code and Util.get_lang(__state.entry_lang_code, true) or nil,
cached_descendants_checks = __state.cached_descendants_checks,
lang_page_key = lang_page_key,
redirected_from = redirected_from,
})
end
local id_data_list = {}
for _, args in ipairs(found_templates_for_lang) do
local id = args.id or "*"
table.insert(id_data_list, { id = id, pos = args.pos })
end
__state.available_etymon_ids[lang_page_key] = id_data_list
if #found_templates_for_lang == 1 then
__state.single_etymons[lang_page_key] = found_templates_for_lang[1]
end
if redirected_from and __state.available_etymon_ids[lang_page_key] then
__state.available_etymon_ids[redirected_from] = __state.available_etymon_ids[redirected_from] or {}
for _, id_data in ipairs(__state.available_etymon_ids[lang_page_key]) do
table.insert(__state.available_etymon_ids[redirected_from], id_data)
end
end
if __state.cached_etymon_args[key] ~= nil or __state.senseid_parent_etymon[key] ~= nil then
-- All done!
return
elseif redirect_target and not redirected_from then
-- Try scraping the redirect.
etymon_page = redirect_target.prefixedText
DataRetriever.cache_page_etymons(etymon_page, redirect_target, lang_page_key .. ":" .. etymon_id, etymon_lang, etymon_id, lang_page_key, descendants_is_toplevel)
__state.cached_etymon_args[key] = __state.cached_etymon_args[etymon_lang_code .. ":" .. etymon_page .. ":" .. etymon_id]
else
__state.cached_etymon_args[key] = M.data.STATUS.MISSING
end
end
local function has_linkable_term(etymon_data)
if etymon_data.is_family or etymon_data.suppress_term or etymon_data.unknown_term then
return false
end
local term = etymon_data.term
if term == nil or term == "" then
return false
end
return M.string_utilities.trim(term) ~= ""
end
local function record_term_id_tracking(etymon_data)
if not has_linkable_term(etymon_data) then
return
end
local term_page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
M.tracking.record_term_id_usage(__state.id_stats, etymon_data, term_page)
end
-- Given an etymon object, scrape its page (if necessary) and return its own etymon arguments as well as the page name.
function DataRetriever.get_etymon_args(etymon_data, is_toplevel)
if not has_linkable_term(etymon_data) then
return M.data.STATUS.MISSING, nil, nil, nil
end
local page = M.links.get_link_page(etymon_data.term, etymon_data.lang)
local norm_lang = Util.get_norm_lang(etymon_data.lang)
local base_key = norm_lang:getFullCode() .. ":" .. page
if etymon_data.id then
local key = base_key .. ":" .. etymon_data.id
local cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key]
if cached_args == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, is_toplevel)
end
cached_args = __state.cached_etymon_args[key] or __state.senseid_parent_etymon[key] -- refresh
-- Get etymon_id from parent if this was resolved via senseid
local parent_etymon = __state.senseid_parent_etymon[key]
local resolved_etymon_id = parent_etymon and parent_etymon.id
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, key, norm_lang, etymon_data.id, nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = {
explicit_id = etymon_data.id,
parent_etymon = parent_etymon,
},
})
end
end
local mismatched_id = is_mismatched_explicit_id(base_key, cached_args, parent_etymon)
if mismatched_id and is_toplevel then
__state.has_mismatched_id = true
M.tracking.record_mismatched_id_usage(__state.id_stats, norm_lang, page, etymon_data.id)
warn_mismatched_explicit_id(page, norm_lang, base_key, etymon_data.id)
end
maybe_flag_partial_etymology_reference(base_key, etymon_data, cached_args, is_toplevel)
return cached_args, __state.cached_etymon_pages[key], resolved_etymon_id, descendants_check
else
__state.used_idless_etymon = true
if is_toplevel then
__state.toplevel_idless_etymon = true
end
if __state.available_etymon_ids[base_key] == nil then
local title = mw.title.new(page)
if not title then error('Invalid page title "' .. page .. '" encountered.') end
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, is_toplevel)
end
local ids = __state.available_etymon_ids[base_key] or {}
local count = #ids
-- Try to filter by postype if available and we have multiple candidates
if count > 1 and etymon_data.postype then
local matching_ids = {}
for _, id_data in ipairs(ids) do
if id_data.pos == etymon_data.postype then
table.insert(matching_ids, id_data)
end
end
if #matching_ids == 1 then
local matched_id = matching_ids[1].id
local matched_key = base_key .. ":" .. matched_id
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "postype")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id = matched_id },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id = matched_id },
})
end
end
local matched_args = __state.cached_etymon_args[matched_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, matched_args, is_toplevel)
return matched_args, __state.cached_etymon_pages[matched_key], nil, descendants_check
end
end
if count == 1 then
local only_id_data = ids[1]
local only_id = (type(only_id_data) == "table" and only_id_data.id) or only_id_data or "*"
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "single")
local descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = is_toplevel,
base_key = base_key,
lookup = { id_data = only_id_data },
})
if is_toplevel and descendants_check == nil then
local title = mw.title.new(page)
if title then
DataRetriever.cache_page_etymons(page, title, base_key .. ":*", norm_lang, "*", nil, true)
descendants_check = M.descendants.get_lookup_check({
cached_descendants_checks = __state.cached_descendants_checks,
is_toplevel = true,
base_key = base_key,
lookup = { id_data = only_id_data },
})
end
end
local single_args = __state.single_etymons[base_key]
maybe_flag_partial_etymology_reference(base_key, etymon_data, single_args, is_toplevel)
return single_args, __state.cached_etymon_pages[base_key .. ":" .. only_id], nil, descendants_check
elseif count > 1 then
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "ambiguous")
warn_ambiguous_etymon_link(page, norm_lang, ids, is_toplevel)
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.AMBIGUOUS, is_toplevel)
return M.data.STATUS.AMBIGUOUS, nil, nil, nil
else
M.tracking.record_idless_resolution(__state.id_stats, norm_lang, page, "missing")
maybe_flag_partial_etymology_reference(base_key, etymon_data, M.data.STATUS.MISSING, is_toplevel)
return M.data.STATUS.MISSING, nil, nil, nil
end
end
end
local function keyword_invisible_in_tree(keyword_info)
if not keyword_info then
return false
end
local inv = keyword_info.invisible
return inv == "all" or inv == true or inv == "tree"
end
-- True when the node has at least one top-level child container visible in the tree.
local function node_has_visible_tree_children(node)
for _, container in ipairs(node.children or {}) do
if not keyword_invisible_in_tree(container.keyword_info) then
return true
end
end
return false
end
-- Count visible term nodes in the tree.
local function get_visible_tree_depth(node, skip_child_rendering)
local max_depth = 1
if skip_child_rendering or not node then
return max_depth
end
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if not keyword_invisible_in_tree(keyword_info) then
local skip_grandchildren = keyword_info and keyword_info.no_child_categories
for _, term in ipairs(container.terms or {}) do
if term.is_duplicate then
if term.original_has_children then
max_depth = math.max(max_depth, 2)
end
else
max_depth = math.max(max_depth, 1 + get_visible_tree_depth(term, skip_grandchildren))
end
end
end
end
return max_depth
end
local function as_param_list(val)
if val == nil then
return {}
end
if type(val) == "table" then
return val
end
if type(val) == "string" and val ~= "" then
return { val }
end
return {}
end
local TreeBuilder = {}
local function parse_etymon_references(refs_text)
if not refs_text or refs_text == "" then
return ""
end
return M.references.parse_references(refs_text)
end
local function parse_tree_references(node)
if node.ref then
node.parsed_ref = parse_etymon_references(node.ref)
end
if node.children then
for _, container in ipairs(node.children) do
if container.terms then
for _, term in ipairs(container.terms) do
parse_tree_references(term)
end
end
end
end
if node.supplements then
for _, supplement in ipairs(node.supplements) do
if supplement.terms then
for _, term in ipairs(supplement.terms) do
parse_tree_references(term)
end
end
end
end
end
-- Build a unique key for deduplication in the seen table
function TreeBuilder.build_key(lang, title, args)
local norm_lang_code = Util.get_norm_lang(lang):getFullCode()
local is_table = type(args) == "table"
local id = (is_table and args.id) or ""
if title then
return norm_lang_code .. ":" .. M.links.get_link_page(title, lang) .. ":" .. id
end
if is_table and args.status == M.data.STATUS.INLINE then
local content_parts = {}
for i = 1, #args do
content_parts[i] = tostring(args[i])
end
return norm_lang_code .. ":*:" .. id .. "\0" .. table.concat(content_parts, "\0")
end
return norm_lang_code .. ":*:" .. id
end
-- Copy parsed etymon modifiers onto a tree/supplement term node.
function TreeBuilder.apply_etymon_fields(term, etymon_data)
term.id = etymon_data.id
term.t = etymon_data.t
term.tr = etymon_data.tr
term.ts = etymon_data.ts
term.alt = etymon_data.alt
term.g = etymon_data.g
term.pos = etymon_data.pos
term.ng = etymon_data.ng
term.ref = etymon_data.ref
term.is_uncertain = etymon_data.unc
term.lit = etymon_data.lit
term.q = etymon_data.q
term.qq = etymon_data.qq
term.l = etymon_data.l
term.ll = etymon_data.ll
term.suppress_term = etymon_data.suppress_term
term.unknown_term = etymon_data.unknown_term
term.is_family = etymon_data.is_family
term.override = etymon_data.override
term.aftype = etymon_data.aftype
term.postype = etymon_data.postype
term.bor = etymon_data.bor
term.lbor = etymon_data.lbor
term.slbor = etymon_data.slbor
end
function TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type)
EtymonParser.check_supplement_term(etymon_data, entry_lang, supplement_type)
local term = {
lang = etymon_data.lang,
title = etymon_data.term,
children = {},
status = M.data.STATUS.OK,
}
TreeBuilder.apply_etymon_fields(term, etymon_data)
return term
end
function TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
local terms = {}
for _, term_param in ipairs(as_param_list(param_value)) do
if type(term_param) == "string" and term_param ~= "" then
local etymon_data = EtymonParser.parse_etymon(term_param, entry_lang)
if etymon_data then
table.insert(terms, TreeBuilder.build_supplement_term(etymon_data, entry_lang, supplement_type))
end
end
end
return terms
end
-- Attach a |param= supplement defined in etymon_data.supplements (e.g. doublet=).
function TreeBuilder.append_term_supplement(data_tree, entry_lang, supplement_type, param_value)
local config = M.data.supplements[supplement_type]
if not config then
error("Unknown supplement '" .. tostring(supplement_type) .. "'.")
end
local terms = TreeBuilder.build_supplement_terms(entry_lang, supplement_type, param_value)
if #terms == 0 then
return
end
data_tree.supplements = data_tree.supplements or {}
table.insert(data_tree.supplements, {
type = supplement_type,
config = config,
terms = terms,
})
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, supplement_type, entry_lang, entry_lang, true)
end
function TreeBuilder.build(lang, title, args, seen, depth, stop_recursion)
seen = seen or {}
depth = depth or 0
local is_toplevel = (depth == 0)
if depth > __state.max_depth_reached then
__state.max_depth_reached = depth
end
__state.total_nodes = __state.total_nodes + 1
local lang_code = lang:getCode()
__state.language_count[lang_code] = (__state.language_count[lang_code] or 0) + 1
local current_id = (type(args) == "table" and args.id) or ""
local key = TreeBuilder.build_key(lang, title, args)
local node = { lang = lang, title = title, id = current_id, args = args, children = {}, status = M.data.STATUS.OK }
if type(args) ~= "table" or seen[key] then
node.status = args or M.data.STATUS.MISSING
-- Mark as duplicate if we've seen this node before
if seen[key] then
node.is_duplicate = true
node.duplicate_key = key
local original_node = seen[key]
if type(original_node) == "table" and original_node.children and #original_node.children > 0 then
node.original_has_children = true
end
end
return node
end
node.status = args.status or M.data.STATUS.OK
seen[key] = node
-- If stop_recursion is set, skip parsing children but check for visible children
if stop_recursion then
local keywords = M.data.keywords
local has_visible_children = false
for i = 2, #args do
local param = args[i]
if type(param) == "string" then
local keyword_base = get_keyword_base(param)
if keyword_base and keywords[keyword_base] then
local _, kw_modifiers = EtymonParser.parse_keyword_modifiers(param:sub(1, 1) == ":" and param or (":" .. param))
if not keyword_invisible_in_tree(get_effective_keyword_info(keyword_base, kw_modifiers)) then
has_visible_children = true
break
end
elseif param:sub(1, 1) ~= ":" then
-- It's a term (not a keyword), so there are visible children
has_visible_children = true
break
end
end
end
node.has_visible_children = has_visible_children
return node
end
-- Parse args into keyword containers
local current_keyword = "from"
local current_keyword_modifiers = {}
local current_container = nil
local function ensure_container()
if not current_container or current_container.keyword ~= current_keyword then
local keyword_info = get_effective_keyword_info(current_keyword, current_keyword_modifiers)
current_container = {
keyword = current_keyword,
keyword_info = keyword_info,
keyword_modifiers = current_keyword_modifiers,
terms = {},
}
table.insert(node.children, current_container)
-- Override keyword text/phrase for nominalization with <g:code>
if current_keyword_modifiers.g and current_keyword == "nominalization" then
local labels = get_nominalization_label_for_g(current_keyword_modifiers.g)
if not labels then
local codes = {}
for c in pairs(M.data.nominalization_g_codes) do table.insert(codes, c) end
table.sort(codes)
error("Invalid <g:" .. tostring(current_keyword_modifiers.g) .. ">. Supported codes for nominalization: " .. table.concat(codes, ", "))
end
current_container.keyword_info = copy_keyword_info(keyword_info)
current_container.keyword_info.text = labels.text
current_container.keyword_info.phrase = labels.phrase
end
end
return current_container
end
for i = 2, #args do
local param = args[i]
if is_keyword(param) then
local keyword, modifiers = EtymonParser.parse_keyword_modifiers(param)
if not keyword then
error("Invalid keyword '" .. param .. "'.")
end
current_keyword = keyword
current_keyword_modifiers = modifiers
current_container = nil -- Force new container for new keyword
elseif type(param) == "string" and param:sub(1, 1) == ":" then
reject_removed_surf_keyword(param)
error("Invalid keyword '" .. param .. "'. Did you mean a valid keyword like ':bor', ':inh', etc.?")
elseif type(param) == "string" then
local etymon_data = EtymonParser.parse_etymon(param, lang)
if etymon_data then
-- Track keyword usage at top level
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, current_keyword, lang, etymon_data.lang, is_toplevel)
local term_node = {}
local container
-- Handle suppress_term (-) and unknown_term (empty or +) directly
if etymon_data.suppress_term or etymon_data.unknown_term then
container = ensure_container()
if etymon_data.ety then
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
term_node = TreeBuilder.build(etymon_data.lang, nil, inline_args, seen, depth + 1)
else
term_node = {
lang = etymon_data.lang,
children = {},
status = M.data.STATUS.OK,
}
end
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
else
-- Regular term: fetch arguments from page
record_term_id_tracking(etymon_data)
local etymon_args, page_of, resolved_etymon_id, descendants_check =
DataRetriever.get_etymon_args(etymon_data, is_toplevel)
-- Check for <ety> inline parameter doesn't override the scraped arguments, unless the latter are missing
if etymon_data.ety then
if etymon_args == M.data.STATUS.REDLINK or etymon_args == M.data.STATUS.MISSING then
__state.current_page_has_inline_etymology = true
if is_toplevel then
__state.toplevel_has_inline_etymology = true
end
local inline_args = EtymonParser.parse_inline_ety(etymon_data.ety, etymon_data.lang)
-- Track inline ety keywords too
local inline_keyword = get_keyword(inline_args[2], true)
if inline_keyword and #inline_args >= 3 then
local inline_etymon = EtymonParser.parse_etymon(inline_args[3], etymon_data.lang)
if inline_etymon then
M.tracking.record_keyword_usage(__state.toplevel_keyword_stats, inline_keyword, etymon_data.lang, inline_etymon.lang, is_toplevel)
end
end
inline_args.id = etymon_data.id
inline_args.status = M.data.STATUS.INLINE
etymon_args = inline_args
term_node.page_of = __state.cached_etymon_pages[key] -- term node is on the same page as the parent
else
-- Scraped arguments exist, <ety> is redundant and ignored
__state.current_page_has_redundant_etymology = true
if is_toplevel then
__state.toplevel_redundant_etymology = true
end
end
end
-- Ensure container exists before checking keyword info
container = ensure_container()
-- Check if current keyword has no_child_categories - if so, stop recursion
local keyword_info = container.keyword_info
local should_stop_recursion = (stop_recursion or (keyword_info and keyword_info.no_child_categories))
term_node = TreeBuilder.build(etymon_data.lang, etymon_data.term, etymon_args, seen, depth + 1, should_stop_recursion)
term_node.target_key = Util.get_norm_lang(etymon_data.lang):getFullCode() ..
":" .. M.links.get_link_page(etymon_data.term, etymon_data.lang)
term_node.etymon_id = resolved_etymon_id -- The actual etymon id when resolved via senseid
term_node.page_of = page_of
TreeBuilder.apply_etymon_fields(term_node, etymon_data)
term_node.missing_descendants_header, term_node.missing_descendants_entry =
M.descendants.get_term_sync_flags(current_keyword, term_node.status, descendants_check)
end
table.insert(container.terms, term_node)
end
end
end
return node
end
-- Convert etymology tree to JSON-serializable table
local function tree_to_json(node)
local obj = {
term = node.title,
lang = node.lang:getCode(),
lang_name = node.lang:getCanonicalName(),
id = (node.id and node.id ~= "") and node.id or nil,
status = node.status,
is_uncertain = node.is_uncertain or nil,
is_duplicate = node.is_duplicate or nil,
gloss = node.t,
transliteration = node.tr,
transcription = node.ts,
alt = node.alt,
g = node.g,
pos = node.pos,
ng = node.ng,
children = {},
}
for _, container in ipairs(node.children or {}) do
local keyword_info = container.keyword_info
if keyword_info then
local container_obj = {
keyword = container.keyword,
keyword_label = keyword_info.text,
keyword_abbrev = keyword_info.abbrev,
is_group = keyword_info.is_group or nil,
is_invisible = keyword_info.invisible or nil,
is_uncertain = (container.keyword_modifiers and container.keyword_modifiers.unc) or nil,
terms = {},
}
for _, term in ipairs(container.terms or {}) do
table.insert(container_obj.terms, tree_to_json(term))
end
table.insert(obj.children, container_obj)
end
end
return obj
end
-- Build and return the etymology data tree for a given term.
function export.get_tree(lang, title, args, options)
options = options or {}
__state.entry_title = title
__state.entry_lang_code = lang:getCode()
__state.id_stats = M.tracking.new_id_stats()
__state.skip_partial_etymology_category = options.skip_partial_etymology_category == true
if options.validate then
EtymonParser.validate(lang, args, options.id, title, options.pos, false)
end
local lang_code = lang:getCode()
local start_index = (args[1] == lang_code) and 2 or 1
local tree_args = { [1] = lang_code, id = options.id or args.id }
for i = start_index, #args do
table.insert(tree_args, args[i])
end
__state.cached_etymon_args[lang_code .. ":" .. title .. ":" .. (tree_args.id or "")] = tree_args
local ety_data_tree = TreeBuilder.build(lang, title, tree_args)
parse_tree_references(ety_data_tree)
if options.json then
return M.JSON.toJSON(tree_to_json(ety_data_tree))
end
return ety_data_tree
end
-- Given a language code, page name and optionally the id= parameter,
-- render the tree and only the etymology tree for the relevant page.
-- Fetches and parses the corresponding {{etymon}} from the requested page,
-- and any further pages needed to render the tree.
-- Parameters can be passed either through the #invoke or as
-- template parameters *through* an #invoke.
function export.render_tree_for_etymon_on_page(frame)
local frame_args = frame.args
local parent_args = frame:getParent().args
local langcode = frame_args[1] or parent_args[1]
local pagename = frame_args[2] or parent_args[2]
local id = frame_args["id"] or parent_args["id"]
local display_title = frame_args["title"] or parent_args["title"]
local parsed_title = mw.title.new(pagename, 0)
local title
if parsed_title.namespace == 0 then
title = M.pages.safe_page_name(parsed_title)
elseif parsed_title.namespace == 118 then
title = "*" .. M.pages.safe_page_name(parsed_title)
else
error("Unsupported namespace for render_tree_for_etymon_on_page: " .. parsed_title.namespace)
end
local lang = Util.get_lang(langcode)
-- Construct etymon_data for DataRetriever.get_args.
local etymon_data = {
lang = lang,
term = title,
id = id
}
local args, pagename = DataRetriever.get_etymon_args(etymon_data, true)
if args == M.data.STATUS.MISSING then
error("The etymon template was not found (language " ..
langcode ..
", title '" ..
title ..
"'" ..
(id and ", ID '" .. id .. "'" or ", no ID given") .. "). Page contents may have changed in the interim.")
end
local tree_title = display_title or title
if lang:stripDiacritics(M.links.remove_links(tree_title)) ~= lang:stripDiacritics(M.links.remove_links(title)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local ety_data_tree = export.get_tree(lang, tree_title, args, {
validate = true,
id = id,
})
local output = {}
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
return table.concat(output)
end
function export.main(frame)
local parent_args = frame:getParent().args
local args = M.parameters.process(parent_args, M.parameters_data.etymon)
local lang = args[1]
local etymon_args = args[2]
local id = args.id
local title = args.title
local text = args.text
local tree = args.tree
local etydate = args.etydate
local doublet = args.doublet
local rfe = args.rfe
local etystub = args.etystub
local nl = args.nl
local page_data = Util.get_page_data()
if not title then
title = page_data.pagename
if page_data.namespace == "" then title = "*" .. title end
end
local entry_pagename = page_data.pagename
if page_data.namespace == "" then
entry_pagename = "*" .. entry_pagename
end
if lang:stripDiacritics(M.links.remove_links(title)) ~= lang:stripDiacritics(M.links.remove_links(entry_pagename)) then
M.tracking.track_title_pagename_mismatch(lang)
end
local current_L2 = M.pages.get_current_L2()
if current_L2 then
local norm_lang = Util.get_norm_lang(lang)
local norm_name = ucfirst(norm_lang:getCanonicalName())
if current_L2 ~= norm_name then
local lang_desc = lang:getCode() .. " (" .. lang:getCanonicalName() .. ")"
if norm_lang:getCode() ~= lang:getCode() then
lang_desc = lang_desc .. ", normalized to " .. norm_lang:getCode() .. " (" .. norm_name .. ")"
end
error("Ngôn ngữ '" .. lang_desc .. "' không khớp với đầu mục L2 (" .. current_L2 .. ").")
end
end
local ety_data_tree = export.get_tree(lang, title, etymon_args, {
validate = true,
pos = args.pos,
id = id,
json = args.json,
skip_partial_etymology_category = nl and true or false,
})
if args.json then
return ety_data_tree
end
local output = {}
local text_allowlist_mode = M.text_allowed.default_mode or "off"
if text and text_allowlist_mode ~= "off" and not Util.is_text_param_allowed_for_lang(lang) then
local msg = "Etymology texts (parameter <code>text=</code>) are not allowed for " .. lang:getFullName() ..
"; see [[Template:etymon#Text allowlist|Template:etymon § Text allowlist]] for the list of languages that may use the <code>text=</code> parameter."
if text_allowlist_mode == "error" then
error(msg)
else
Util.add_warning(msg, true)
end
end
local lang_exc = Util.get_lang_exception(lang)
if lang_exc and lang_exc.disallow then
local disallow = lang_exc.disallow
local error_text = " for " .. lang:getFullName()
if disallow.ref then
error_text = error_text .. "; see " .. disallow.ref
else
error_text = error_text .. "."
end
if tree and disallow.tree then
error("Etymology trees are not allowed" .. error_text)
end
if text and disallow.text then
error("Etymology texts are not allowed" .. error_text)
end
end
if etydate then
local etydate_param_mods = {
ref = { list = true, type = "references", allow_holes = true },
refn = { list = true, allow_holes = true },
nocap = { type = "boolean" },
}
local function generate_etydate_obj(etydate_text)
local etydate_specs = {}
for spec in etydate_text:gmatch("[^,]+") do
table.insert(etydate_specs, mw.text.trim(spec))
end
return { [1] = etydate_specs }
end
local parsed_etydate = M.parse_utilities.parse_inline_modifiers(etydate, { param_mods = etydate_param_mods, generate_obj = generate_etydate_obj })
local etydate_args = {
[1] = parsed_etydate[1],
nocap = parsed_etydate.nocap or false,
}
ety_data_tree.supplements = ety_data_tree.supplements or {}
table.insert(ety_data_tree.supplements, {
type = "etydate",
etydate_text = M.etydate.format_etydate(etydate_args, { omit_refs = true }),
etydate_refs = (parsed_etydate.ref and #parsed_etydate.ref > 0) and parsed_etydate.ref or nil,
})
end
TreeBuilder.append_term_supplement(ety_data_tree, lang, "doublet", doublet)
if ety_data_tree.supplements then
parse_tree_references(ety_data_tree)
end
local has_visible_children = node_has_visible_tree_children(ety_data_tree)
-- Suppress trees for multiword entries and one-step chains
local visible_tree_depth = get_visible_tree_depth(ety_data_tree)
local is_trivial_tree = visible_tree_depth <= 2
local is_multiword = title:find("%s") ~= nil or title:find("_") ~= nil
if tree and (is_multiword or is_trivial_tree) then
tree = false
end
if tree then
table.insert(output, M.template_styles("Module:etymon/styles.css"))
table.insert(output, M.tree.render({
data_tree = ety_data_tree,
format_term_func = function(term, is_toplevel)
return Util.format_term(term, is_toplevel, {
gloss = "suppress",
pos = "suppress",
lit = "suppress",
tree_ql = "suppress",
})
end,
}))
end
local tree_disallowed = lang_exc and lang_exc.disallow and lang_exc.disallow.tree
local ety_tree_json = M.JSON.toJSON(tree_to_json(ety_data_tree))
local anchor = M.anchors.etymonid(lang, id, {
no_tree = args.notree,
title = title,
empty_tree = (not has_visible_children) or tree_disallowed,
ety_tree_json = ety_tree_json,
})
table.insert(output, anchor)
local text_stop_lang_missing = nil
if text then
local max_depth, stop_at_blue_link, stop_at_lang, stop_at_lang_or_bluelink
if text == "++" then
max_depth, stop_at_blue_link = false, false
elseif text == "+" then
max_depth, stop_at_blue_link = 1, false
elseif text == "*" then
max_depth, stop_at_blue_link = false, true
elseif text:match("^:[^*]+%*$") then
-- Stop at a specific language OR first bluelink after it, e.g., ":ota*"
-- If the target language is a redlink, continue to the first bluelink
local lang_code = text:match("^:([^*]+)%*$")
if lang_code and lang_code ~= "" then
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang_or_bluelink = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false
end
elseif text:sub(1, 1) == ":" then
-- Stop at a specific language, e.g., ":ar" stops at first Arabic term
local lang_code = text:sub(2)
if lang_code ~= "" then
-- Validate the language code
local lang_obj = Util.get_lang(lang_code, true)
if lang_obj then
stop_at_lang = lang_code
else
Util.add_warning('Invalid language code "' .. lang_code .. '" in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
Util.add_warning('Empty language code in text parameter. Showing full chain instead.')
max_depth, stop_at_blue_link = false, false -- default to ++
end
else
local num = tonumber(text)
if num and num >= 1 then
max_depth, stop_at_blue_link = num, false
else
error('Invalid text value "' ..
text .. '". Valid values are: "++" (full chain), "+" (first step only), "*" (until first blue link), a number (max steps), ":lang" (stop at language), or ":lang*" (stop at language or first bluelink if redlink)')
end
end
local text_output, text_render_meta = M.text.render({
data_tree = ety_data_tree,
format_term_func = Util.format_term,
lang_matches_stop_code = Util.lang_matches_stop_code,
max_depth = max_depth,
stop_at_blue_link = stop_at_blue_link,
curr_page = page_data.pagename,
nodot = args.nodot,
dot = args.dot,
stop_at_lang = stop_at_lang,
stop_at_lang_or_bluelink = stop_at_lang_or_bluelink,
})
table.insert(output, text_output)
if stop_at_lang and text_render_meta and not text_render_meta.stop_lang_reached then
M.tracking.track_text_stop_lang_missing(lang, stop_at_lang)
text_stop_lang_missing = stop_at_lang
end
end
if rfe then
table.insert(output, Util.expand_request_template(frame, "rfe", rfe, lang:getCode()))
end
if etystub then
table.insert(output, Util.expand_request_template(frame, "etystub", etystub, lang:getCode()))
end
if nl then
table.insert(output, " " .. frame:expandTemplate({
title = "nonlemma",
args = {},
}))
end
local categories = {}
if Util.is_content_page() then
M.tracking.track_tree_metrics({
max_depth_reached = __state.max_depth_reached,
total_nodes = __state.total_nodes,
language_count = __state.language_count,
lang = lang,
})
categories = M.categories.build({
data_tree = ety_data_tree,
page_lang = lang,
available_etymon_ids = __state.available_etymon_ids,
senseid_parent_etymon = __state.senseid_parent_etymon,
get_norm_lang_func = Util.get_norm_lang,
lang_exc = lang_exc,
suppress_categories = lang_exc and lang_exc.suppress_categories,
nocat = args.nocat,
tree = tree,
text = text,
exnihilo = args.exnihilo,
toplevel_has_inline_etymology = __state.toplevel_has_inline_etymology,
toplevel_redundant_etymology = __state.toplevel_redundant_etymology,
toplevel_idless_etymon = __state.toplevel_idless_etymon,
has_mismatched_id = __state.has_mismatched_id,
linked_page_multiple_etymons_idless = __state.linked_page_multiple_etymons_idless,
linked_page_partial_etymology_sections = __state.linked_page_partial_etymology_sections,
text_stop_lang_missing = text_stop_lang_missing,
})
M.tracking.track_keywords(__state.toplevel_keyword_stats, lang)
M.tracking.track_page_id(lang, id)
M.tracking.track_ids(__state.id_stats, lang)
end
if #categories > 0 then
table.insert(output, M.categories.format(categories, lang))
end
if __state.warnings then
for i, warning in ipairs(__state.warnings) do
table.insert(output, (i == 1 and "\n" or "") .. warning .. "\n")
end
end
return table.concat(output)
end
return export
sqz33azqv1qgwc7ts4rv5xec9ytjc7l
Bản mẫu:tg-infl-noun
10
346741
2561637
2241847
2026-09-08T09:56:11Z
Hiyuune
50834
2561637
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{inflection-table-block|
{{tg-infl-noun/inflection|broken={{{broken|}}}|broken2={{{broken2|}}}|nb={{{nb|}}}|anim={{{anim|}}}|gem={{{gem|}}}}}
{{tg-infl-noun/possessive|broken={{{broken|}}}|broken2={{{broken2|}}}|nb={{{nb|}}}|anim={{{anim|}}}|gem={{{gem|}}}}}
}}<!---
--->{{#if:{{{gem|}}}|{{cln|tg|terms with underlying geminate consonants}}|}}<!---
---><noinclude>{{documentation}}</noinclude>
bm50ph4l63pv280mij6pw21b8uu2au7
Bản mẫu:ĐM/doc
10
359077
2561511
2559097
2026-09-07T15:34:22Z
Hiyuune
50834
/* Tham số */
2561511
wikitext
text/x-wiki
{{Trang tài liệu}}
<!-- XIN HÃY THÊM THỂ LOẠI VÀ INTERWIKI VÀO PHÍA DƯỚI TRANG NÀY -->
Bản mẫu này được sử dụng để tạo ra các đề mục phổ biến cho mục từ, nó thay thế tất cả các bản mẫu <code><nowiki>{{-tên đề mục-}}</nowiki></code> trước đây.
=== Cách sử dụng ===
<code><nowiki>{{ĐM|Tên đề mục hoặc từ đặc biệt}}</nowiki></code>
=== Ví dụ ===
<pre>
==={{ĐM|noun}}===
===={{ĐM|pron}}====
</pre>
===Tham số===
; {{para|1|req=1}}
: Tên đề mục hoặc từ đặc biệt. Mặc định là '''không hiển thị nếu để trống'''.
Có nhiều từ đặc biệt khác nhau có thể được sử dụng để tạo đề mục; Dưới đây là danh sách từ đặc biệt có thể sử dụng:
{| class="wikitable"
|-
! Từ đặc biệt !! Đề mục tiếng Việt
|-
| abbreviations<br>abbr || Viết tắt
|-
| affix || Phụ tố
|-
| affixed forms || Hình thức phụ tố
|-
| adjective<br>adj || Tính từ
|-
| adnominal || Danh tính từ
|-
| adverb<br>adv || Phó từ
|-
| alternative forms<br>alternative form<br>alt<br>alter<br>alter form || Cách viết khác
|-
| alternative script<br>alt sc<br>alter sc || Chữ viết khác
|-
| anagrams<br>anagram<br>ana || Từ đảo chữ
|-
| antonyms<br>antonym<br>ant || Trái nghĩa
|-
| article || Trợ từ
|-
| circumfix || Phụ tố chu vi
|-
| circumposition<br>circumpos || Yếu tố quanh
|-
| classifier<br>cls || Loại từ
|-
| compound<br>com || Từ ghép
|-
| conjugation<br>forms<br>conjug || Chia động từ
|-
| conjunction<br>conj || Liên từ
|-
| contraction<br>contr || Từ rút gọn
|-
| coordinate terms<br>coordinate<br>coord<br>cot || Từ cùng trường nghĩa
|-
| counter || Lượng từ
|-
| cuneiform sign || Ký tự hình nêm
|-
| declension<br>decl || Biến cách
|-
| definition<br>dfn || Định nghĩa
|-
| derived terms<br>drv<br>der<br>derived || Từ phái sinh
|-
| description<br>desction || Mô tả
|-
| descendants<br>desc || Hậu duệ
|-
| determiner<br>det || Từ hạn định
|-
| etymology<br>etym || Từ nguyên
|-
| further reading<br>further || Đọc thêm
|-
| glyph origin || Nguồn gốc ký tự
|-
| han character<br>han || Ký tự chữ Hán
|-
| hanja || Hanja
|-
| hanviet || Phiên âm Hán–Việt
|-
| holonyms<br>holonym || Từ toàn thể
|-
| homophones<br>homo || Từ đồng âm
|-
| hyponyms<br>hypo || Từ có nghĩa hẹp hơn
|-
| hypernyms<br>hyper || Từ có nghĩa rộng hơn
|-
| idiom || Thành ngữ
|-
| infix || Trung tố
|-
| inflection<br>infl || Biến tố
|-
| instance || Ví dụ
|-
| interjection<br>interj<br>intj || Thán từ
|-
| interrogative<br>interrog || Từ nghi vấn
|-
| kanji || Kanji
|-
| letter || Chữ cái
|-
| logogram || Chữ tượng hình
|-
| meronyms<br>meronym<br>mero || Từ bộ phận
|-
| mutation<br>mut || Biến đổi âm
|-
| noun<br>n || Danh từ
|-
| nôm || Chữ Nôm
|-
| number || Ký tự số
|-
| numeral<br>num || Số từ
|-
| paronym<br>paro || Từ tương tự
|-
| participle || Phân từ
|-
| particle<br>part || Trợ từ
|-
| phrase<br>phr || Cụm từ
|-
| place || Địa danh
|-
| postposition<br>postpos || Yếu tố sau
|-
| prefix<br>pref || Tiền tố
|-
| preposition<br>prep || Giới từ
|-
| prepositional phrase<br>pp || Cụm giới từ
|-
| pronoun || Đại từ
|-
| pronunciation<br>pron || Cách phát âm
|-
| proper noun<br>pr-noun<br>pr-n || Danh từ riêng
|-
| proverb || Tục ngữ
|-
| punctuation mark<br>punctuation<br>punc || Dấu câu
|-
| quotation<br>quot || Trích dẫn
|-
| reading || Âm đọc
|-
| references<br>reference<br>ref || Tham khảo
|-
| related terms<br>related<br>rel || Từ liên hệ
|-
| related characters || Ký tự liên quan
|-
| rhymes || Vần
|-
| romanization<br>rom || Latinh hóa
|-
| root || Gốc từ
|-
| see also<br>see || Xem thêm
|-
| statistics<br>stats<br>stat || Thống kê
|-
| suffix<br>suff<br>suf || Hậu tố
|-
| syllable<br>syll || Âm tiết
|-
| symbol || Ký tự
|-
| synonyms<br>syn || Đồng nghĩa
|-
| translations<br>trans || Dịch
|-
| transliteration<br>translit || Chuyển tự
|-
| usage notes<br>usage || Ghi chú sử dụng
|-
| verb<br>v || Động từ
|}
===TemplateData===
{{TemplateDataHeader}}
<templatedata>
{
"params": {
"1": {
"required": true,
"label": "Tên đề mục",
"type": "string",
"default": "Không hiển thị",
"description": "Tên đề mục hoặc từ đặc biệt.",
"suggested": true,
"suggestedvalues": [
"abbreviations",
"affix",
"adjective",
"adverb",
"alternative forms",
"anagrams",
"antonyms",
"article",
"circumfix",
"circumposition",
"classifier",
"compound",
"conjugation",
"conjunction",
"contraction",
"coordinate terms",
"counter",
"cuneiform sign",
"declension",
"definition",
"derived terms",
"description",
"descendants",
"determiner",
"derived characters",
"etymology",
"further reading",
"glyph origin",
"han character",
"hanja",
"hanviet",
"holonyms",
"homophones",
"hyponyms",
"hypernyms",
"idiom",
"infix",
"inflection",
"instance",
"interjection",
"interrogative",
"kanji",
"letter",
"logogram",
"meronyms",
"mutation",
"noun",
"nôm",
"number",
"numeral",
"paronym",
"participle",
"particle",
"phrase",
"place",
"postposition",
"prefix",
"preposition",
"pronoun",
"pronunciation",
"proper noun",
"proverb",
"punctuation mark",
"quotation",
"reading",
"references",
"related terms",
"rhymes",
"romanization",
"root",
"see also",
"statistics",
"suffix",
"syllable",
"symbol",
"synonyms",
"translations",
"transliteration",
"usage notes",
"verb"
]
}
},
"description": "Bản mẫu này được sử dụng để tạo ra các đề mục phổ biến cho mục từ."
}
</templatedata>
<includeonly>
<!-- THỂ LOẠI VÀ INTERWIKI TẠI ĐÂY, CẢM ƠN -->
[[Thể loại:Bản mẫu văn bản]]
</includeonly>
1ks3zvfqmnps0o8bjch1vtlexq77amc
Bản mẫu:my-numeral
10
360240
2561530
2272230
2026-09-07T16:24:09Z
Hiyuune
50834
2561530
wikitext
text/x-wiki
{{head|my|Số từ|chữ số|{{{1}}}|cat2={{#switch:{{{2|}}}|c=Số đếm|o=Số thứ tự}}}}<noinclude>{{documentation}}</noinclude>
60bjtg1pq3ri7umhio4xcooh83a95i2
Thành viên:Renamed user 3b0ac64b1d74ce1fbe5382d087ed3d0b/Nhật ký Sự cố trên Wiktionary tiếng Việt
2
367985
2561470
2295578
2026-09-07T14:03:22Z
EmausBot
33069
Giải quyết đổi hướng kép đến [[Thành viên:TienMinh-mun6xnChing/Nhật ký Sự cố trên Wiktionary tiếng Việt]]
2561470
wikitext
text/x-wiki
#đổi [[Thành viên:TienMinh-mun6xnChing/Nhật ký Sự cố trên Wiktionary tiếng Việt]]
giaryzg7an7sc82txqu0wovbryyvrom
Thành viên:Renamed user 3b0ac64b1d74ce1fbe5382d087ed3d0b/Nhật trình tuần tra:Mục từ chất lượng kém
2
367986
2561471
2295580
2026-09-07T14:03:32Z
EmausBot
33069
Giải quyết đổi hướng kép đến [[Thành viên:TienMinh-mun6xnChing/Nhật trình tuần tra mục từ chất lượng kém]]
2561471
wikitext
text/x-wiki
#đổi [[Thành viên:TienMinh-mun6xnChing/Nhật trình tuần tra mục từ chất lượng kém]]
sgg5voqzksfpq72il8d5hup1niyvgdn
Thành viên:Renamed user 3b0ac64b1d74ce1fbe5382d087ed3d0b/Thời gian
2
367987
2561472
2295583
2026-09-07T14:03:42Z
EmausBot
33069
Giải quyết đổi hướng kép đến [[Thành viên:TienMinh-mun6xnChing/Thời gian]]
2561472
wikitext
text/x-wiki
#đổi [[Thành viên:TienMinh-mun6xnChing/Thời gian]]
ikz24uq3vbl5qzizmegaikf93g61h3g
Mô đun:mak-headword
828
383002
2561593
2351936
2026-09-08T07:18:56Z
Hiyuune
50834
2561593
Scribunto
text/plain
local export = {}
local pos_functions = {}
local force_cat = false -- for testing; if true, categories appear in non-mainspace pages
local headword_utilities_module = "Module:headword utilities"
local languages_module = "Module:languages"
local lang = require(languages_module).getByCode("mak")
local insert = table.insert
local ugsub = mw.ustring.gsub
local ufind = mw.ustring.find
local usub = mw.ustring.sub
-- Function to remove stress accents since suffixation regularizes stress
local function remove_accents(text)
text = ugsub(text, "[áàâä]", "a")
text = ugsub(text, "[éèêë]", "e")
text = ugsub(text, "[íìîï]", "i")
text = ugsub(text, "[óòôö]", "o")
text = ugsub(text, "[úùûü]", "u")
return text
end
--[==[
Main entry point. Takes these params:
; {{para|1}}
: The part of speech, pluralized; omit for {{tl|mak-head}}.
; {{para|def}}
: Optional default value for the template page.
]==]
function export.show(frame)
return require(headword_utilities_module).process_headword {
lang = lang,
frame = frame,
pos_functions = pos_functions,
include_tr = true,
include_sc = true,
force_cat = force_cat,
augment_params = function(data)
data.params.lon = true
end,
augment_headdata = function(data)
local headdata = data.headdata
local sc = headdata.sc
if headdata.var == nil then
headdata.var = sc:getCode() ~= "Latn"
end
local lons = headdata:parse_inflection("lon")
if sc:getCode() == "Latn" then
local tr_bugi = require("Module:mak-Latn-Bugi-translit").tr(headdata.pagename, "mak", sc:getCode())
local tr_maka = require("Module:mak-Latn-Maka-translit").tr(headdata.pagename, "mak", sc:getCode())
if lons[1] then
for _, lon in ipairs(lons) do
if lon.term == tr_bugi or lon.term == tr_maka then
headdata:track("redundant-lon")
else
headdata:track("nonredundant-lon")
end
end
else
if tr_bugi then
insert(lons, {term = tr_bugi})
end
if tr_maka then
insert(lons, {term = tr_maka})
end
end
end
headdata:insert_inflection(lons, "chính tả Lontara")
end,
}
end
pos_functions["verbs"] = {
params = {
st = true,
pass = true,
},
func = function(data, args)
data:parse_and_insert_inflection("st", "bán ngoại động từ")
local passobjs = data:parse_inflection("pass")
if args.st and not passobjs[1] and data.sc:getCode() == "Latn" then
-- If Latin and no passive (and also only if a semi-transitive exists; why do we do this?),
-- add a default passive.
passobjs[1] = {term = "+"}
end
passobjs = data:resolve_special(passobjs, function(termdata)
return "ni" .. termdata.head
end)
data:insert_inflection(passobjs, "bị động")
end
}
pos_functions["Danh từ"] = {
params = {
def = true,
poss = true,
},
func = function(data, _args)
if data.sc:getCode() == "Latn" then
local defobjs = data:parse_inflection("def")
if not defobjs[1] then
defobjs = {{term = "+"}}
end
defobjs = data:resolve_special(defobjs, function(termdata)
local head = remove_accents(termdata.head)
local last_char = usub(head, -1)
local def_form
if last_char == "a" then
def_form = head .. "ya"
elseif last_char:find("[eiou]") then
def_form = head .. "a"
elseif ufind(last_char, "[ʼ'’]") then
def_form = usub(head, 1, -2) .. "ka"
else
def_form = head .. "a"
end
return def_form
end)
data:insert_inflection(defobjs, "xác định")
local possobjs = data:parse_inflection("poss")
if not possobjs[1] then
possobjs = {{term = "+def"}}
end
possobjs = data:resolve_special(possobjs, function(termdata)
local head = remove_accents(termdata.head)
local last_char = usub(head, -1)
local infl = termdata.infl.term
if infl == "+nna" then
return head .. "nna"
elseif infl == "+na" then
return head .. "na"
elseif last_char:find("[aeiou]") then
if infl == "+" then
error(("Head %s ends in a vowel; no default available, specify either `+na`, `+nna` or `+nna,+na` for both"):format(termdata.head))
else
return nil
end
elseif head:find("ng$") then
return usub(head, 1, -3) .. "nna"
else
return head .. "na"
end
end, {
is_special = function(inflobj)
local term = inflobj.term
return term == "+nna" or term == "+na" or term == "+" or term == "+def"
end,
})
data:insert_inflection(possobjs, "sở hữu ở ngôi thứ ba")
else
data:parse_and_insert_inflection("def", "xác định")
data:parse_and_insert_inflection("poss", "sở hữu ở ngôi thứ ba")
end
end
}
pos_functions["Tính từ"] = {
params = {
ma = true,
},
func = function(data, _args)
-- Manual input for stative/adjectival prefix ma- (e.g., |ma=mabajiʼ or simply |mabajiʼ as 1st parameter)
data:parse_and_insert_inflection("ma", "tĩnh")
end
}
return export
12di8nja703t7idetfdzyvmwrlkjdzq
ध्वनी
0
395431
2561602
2349588
2026-09-08T07:29:45Z
Hiyuune
50834
/* Danh từ riêng */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561602
wikitext
text/x-wiki
{{also|ध्वनि}}
=={{langname|hi}}==
==={{section|pron}}===
* {{hi-IPA}}
==={{section|n}}===
{{hi-noun|f}}
# {{alternative form of|mr|ध्वनि}}
=={{langname|mr}}==
==={{section|etym}}===
{{bor+|mr|sa|ध्वनि}}.
==={{section|pron}}===
* {{mr-IPA}}
==={{section|n}}===
{{mr-noun|g=f}}<ref>{{R:mr:Berntsen}}</ref><ref>{{R:mr:Amarkosh}}</ref><ref>{{R:mr:Molesworth}}</ref>
# [[âm thanh|Âm thanh]], [[thanh điệu]], [[tiếng ồn]].
#: {{syn|mr|आवाज|स्वर|रव|निनाद}}
===={{section|drv}}====
{{col2|mr|ध्वनित|ध्वनिप्रदूषण|ध्वन्यात्मक|ध्वन्यात्मकता}}
==={{section|pr-noun}}===
{{mr-proper noun|g=f}}
# {{given name|mr|nữ|from=tiếng Phạn}}
==={{section|ref}}===
{{reflist}}
{{C|mr|Âm thanh}}
=={{langname|sa}}==
==={{section|n}}===
{{head|sa|Biến thể hình thái danh từ}}
# {{infl of|sa|ध्वनि||nom//acc//voc|d}}
my4bhklxuzkexpxh7us4aqxz7j7h5rt
ध्वनि
0
395432
2561601
2349592
2026-09-08T07:28:53Z
Hiyuune
50834
/* Danh từ riêng */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561601
wikitext
text/x-wiki
{{also|ध्वनी}}
=={{langname|hi}}==
{{wp|hi:}}
==={{section|etym}}===
{{bor+|hi|sa|ध्वनि|tr=dhvaní}}.
==={{section|pron}}===
* {{hi-IPA}}
==={{section|n}}===
{{hi-noun|f|ur=دھونی}}
# [[âm thanh|Âm thanh]], [[thanh điệu]]
===={{section|decl}}====
{{hi-ndecl|<F>}}
==={{section|pr-noun}}===
{{hi-proper noun|f}}
# {{given name|hi|nữ|from=tiếng Phạn}}
===={{section|decl}}====
{{hi-ndecl|<F.sg>}}
===={{section|drv}}====
* {{l|hi|ध्वन्यात्मक}}
===={{section|see}}====
* {{l|hi|स्वर}}
* {{l|hi|शब्द}}
===={{section|ref}}====
* {{R:hi:Dasa||2497}}
* {{R:hi:McGregor||536}}
* {{R:hi:Bahri||333}}
* {{R:hi:Chaturvedi||345}}
=={{langname|sa}}==
==={{section|alternative script}}===
{{sa-alt}}
==={{section|etym}}===
Từ {{inh|sa|inc-pro|*dʰwaníṣ}}, từ {{inh|sa|iir-pro|*dʰwaníš}}, từ {{der|sa|ine-pro|*dʰwen-||tạo tiếng ồn}}. Cùng gốc với {{cog|ang|dyne}} (từ khi có {{cog|en|din}}). Có liên quan đến {{mention|sa|ध्वनति|tr=dhvánati}}.
==={{section|pron}}===
{{sa-IPA|a=2}}
==={{section|n}}===
{{sa-noun|tr=dhvaní|g=m}}
# [[âm thanh|Âm thanh]], [[tiếng ồn]], [[tiếng nói]], [[thanh điệu]], [[giai điệu]], [[tiếng]] [[sấm]].
# [[tiếng|Tiếng]] [[trống]].
# [[không có|Không có]] [[âm thanh]] trong [[thực tế]].
# [[từ|Từ]].
# [[lời|Lời]] [[gợi ý]]; [[lời nói]] [[bóng gió]], [[lời nói]] ám chỉ.
===={{section|decl}}====
{{sa-decl-noun-m|dhvaní}}
===={{section|desc}}====
* {{desc|bn|ধ্বনি|bor=1}}
* {{desc|gu|ધ્વનિ|bor=1}}
* {{desc|hi|ध्वनि|bor=1}}
* {{desc|kn|ಧ್ವನಿ|bor=1}}
* {{desc|ml|ധ്വനി|bor=1}}
* {{desc|mr|ध्वनी|bor=1}}
* {{desc|ta|தொனி|bor=1}}
* {{desc|te|ధ్వని|bor=1}}
===={{section|ref}}====
* {{R:sa:MW|0522}}
99c54kw1i6angtyb8cc6itlclezv6v9
山原
0
396913
2561476
2352818
2026-09-07T14:13:54Z
WhoAlone
40420
2561476
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab|yomi=i,n|sort=やんばる|やま|k1=やん|ばる}}
===={{ĐM|pr-noun}}====
{{xug-head|proper|やんばる}}
# Vùng [[rừng núi]] phía bắc đảo [[Okinawa]].
=={{langname|ja}}==
==={{ĐM|etym}} 1===
{{ja-kanjitab|yomi=i,n|sort=やんばる|やま|k1=やん|ばる}}
{{wp|ja:}}
{{wp|Yanbaru}}
Từ {{bor|ja|ryu|sort=やんはる<!--|-}} và {{bor|ja|xug|tr=やんはる-->|山原|tr=Yanbaru|lit=[[ruộng]] trên [[núi]]}}.
===={{ĐM|pr-noun}}====
{{ja-pos|proper|やんばる}}
# Vùng [[rừng núi]] phía bắc đảo [[Okinawa]].
#: {{syn|ja|国頭|tr=Kunigami}}
====={{ĐM|derived}}=====
* {{ja-r|山原 水鶏|^ヤンバル クイナ}}
* {{ja-r|山原%船|^やんばる%-せん}}
* {{ja-r|山原 蔓%薄%荷|^ヤンバル ツル%ハッ%カ}}
* {{ja-r|山原 手%長 黄金虫|^ヤンバル テ%ナガ コガネ|rom=-}}, {{ja-r|山原 手%長 金亀子|^ヤンバル テ%ナガ コガネ}}
==={{ĐM|etym}} 2===
{{ja-kanjitab|yomi=k|やま|はら}}
Từ {{com|ja|sort=やまはら|山|tr1=yama|t1=[[núi]]|原|tr2=hara|t2=[[cánh đồng]], [[bình nguyên]]}}.
===={{ĐM|pr-noun}}====
{{ja-pos|proper|やまはら}}
# {{n-g|một [[địa danh]]}}
# {{surname|ja|sort=やまはら}}
nvdjtojgdg0ftrc5ja35wkzizr80td6
پایدوس
0
415037
2561460
2561241
2026-09-07T12:48:15Z
TheHighFighter2
42988
/* Tiếng Thổ Nhĩ Kỳ Ottoman */
2561460
wikitext
text/x-wiki
=={{langname|ota}}==
==={{ĐM|alter}}===
* {{alter|ota|پایدوست|tr1=paydost|پای دوست|tr2=pay dost}}
==={{ĐM|etym}}===
Có thể bắt nguồn từ {{bor|ota|fa|پاییدن|alt=پای|tr=pây}} + {{m|fa|دوست|tr=dôst}}, ban đầu vốn là mệnh lệnh mang nghĩa "dừng lại đi bạn!", sau đó được dùng đi kèm với động từ nhẹ {{m|ota|ایتمك|tr=etmek}}, rồi chuyển hóa thành danh từ.<ref>{{R:ota:Hindoglu|page=107a}}, với cách viết khác là {{m|ota||پای دوست}}, do đó ám chỉ đến nguồn gốc Ba Tư</ref><ref>{{R:tr:Spies:1931|column=1026}}</ref>
Tác giả Redhouse cho rằng từ này xuất phát từ {{bor|ota|el||φάγετος|t=giờ ăn}}.<ref>{{R:ota:Redhouse|page=437a}}</ref> Tuy nhiên, không có từ Hy Lạp nào như vậy được ghi nhận trong thực tế. So sánh thay thế với các từ {{cog|el|φαγητό}}, {{cog|pnt|φαετό|t=bữa ăn}} đã được chứng thực. Giải thích về âm cuối -''s'', người ta cho rằng nó có thể mượn từ biểu thức {{m|el|φαγητό [[σου]]|t=bữa ăn của bạn}}, dạng biến thể phương ngữ Pontos là {{m|pnt|[[φαετό]] [['ς]]|t=bữu ăn của bạn}}. Nếu giả thuyết Hy Lạp chính xác, các dạng tiếng Thổ Nhĩ Kỳ phương ngữ như {{m|tr|faydos}}, {{m|tr|faydoz}} ở Paphlagonia và Síp là gần với nguyên gốc nhất; trong khi đó hiện tượng đổi ''p → f'' và âm -''t'' ký sinh ở cuối sau âm -''s'' là sự phát triển về sau này.
==={{ĐM|interj}}===
{{head|ota|interjection|tr=paydos}}
# {{n-g|Tiếng hô báo hiệu cho công nhân đến giờ [[tan]] làm.}}
==={{ĐM|noun}}===
{{head|ota|noun|tr=paydos}}
# Sự [[ngừng]] làm việc, giờ [[giải lao]], thời gian [[nghỉ ngơi]].
==={{ĐM|desc}}===
* {{desc|tr|paydos|alts=1}}
* {{desc|sq|pajdós|bor=1}}
* {{desc|ar|-|bor=1}}
*: {{desc|apc|فوداس|tr=fôdās}}, {{l|apc|فايدوس|tr=fāydôs}}
*: {{desc|ajp|فيدوس|tr=fēdūs}}, {{l|ajp|فدوس|tr=fadūs}}
* {{desc|hy|փայտօս|alts=1|bor=1}}
* {{desc|rup|paidos|alt=paidós|bor=1}}
* {{desc|bg|па́йдос|bor=1}}
* {{desc|el|πάϊντος|bor=1}}
* → Tiếng Kurd:
*: {{desc|kmr|paydos}}
*: {{desc|ckb|پایدۆست|t=đình chiến, tạm ngừng bắn}}
* {{desc|lad|paytós|bor=1}}
* {{desc|mk|пајдос|bor=1}}
* {{desc|ro|paidos|alt=paidós|bor=1}}
* {{desc|sh|pàjdos|bor=1}} / {{l|sh|па̀јдос}}
==={{ĐM|ref}}===
<references/>
==={{ĐM|further}}===
* {{R:tr:MBTS|paydos}}, lưu ý các từ nguyên Hy Lạp truyền thống là không chắc chắn
* {{R:tr:OTK|paydos|vol=IV|page=3803}}, đặt nghi vấn bắt nguồn từ {{m+|grc|παῦσις}}
* {{R:tr:Eyuboğlu:1991|paydos|page=263a}}
* {{R:ota:Kanun-name:1830|column=125}}, trong đó lệnh quân sự được đọc là ''paydüs'' và bắt nguồn từ {{bor|ota|de|bei Fuß}}, Zenker dẫn lại với sự hoài nghi.
* {{R:tr:Nshanyan|paydos|accessdate=2021-07-02}}, nghiêng về nguồn gốc Hy Lạp
* {{R:ota:Zenker|volume=1|page=174a}}
soslufanijxts2n9mnvb5j0jacucmzc
Bản mẫu:R:tr:Nshanyan
10
415175
2561453
2026-09-07T12:09:33Z
TheHighFighter2
42988
Trang mới: “{{#invoke:checkparams|warn}}<!-- Validate template parameters -->{{cite-web<!-- -->|first=Sevan|last=Nişanyan|authorlink=Sevan Nişanyan<!-- -->|work=Nişanyan Sözlük<!-- -->|entry={{lang|tr|{{{1|{{pagename}}}}}}}<!-- -->|entryurl=http://www.nisanyansozluk.com/{{#if:{{{ek|}}}|ek/|?k=}}{{urlencode:{{{1|{{pagename}}}}}}}{{#if:{{{ek|}}}||&x=0&y=0}}<!-- -->|accessdate={{{accessdate|}}}|year={{{date|2002–}}}<!-- -->}}<noinclude>{{refcat}}{{documentation}}</noinclude>”
2561453
wikitext
text/x-wiki
{{#invoke:checkparams|warn}}<!-- Validate template parameters
-->{{cite-web<!--
-->|first=Sevan|last=Nişanyan|authorlink=Sevan Nişanyan<!--
-->|work=Nişanyan Sözlük<!--
-->|entry={{lang|tr|{{{1|{{pagename}}}}}}}<!--
-->|entryurl=http://www.nisanyansozluk.com/{{#if:{{{ek|}}}|ek/|?k=}}{{urlencode:{{{1|{{pagename}}}}}}}{{#if:{{{ek|}}}||&x=0&y=0}}<!--
-->|accessdate={{{accessdate|}}}|year={{{date|2002–}}}<!--
-->}}<noinclude>{{refcat}}{{documentation}}</noinclude>
33ponvgehkekvavd9vcozygg1ybc8uy
2561454
2561453
2026-09-07T12:12:16Z
TheHighFighter2
42988
/* */
2561454
wikitext
text/x-wiki
#đổi [[Bản mẫu:R:tr:Nishanyan]]
83foix4b4r9c87oetnjmv881a484s0e
Bản mẫu:R:ota:Kanun-name:1830
10
415176
2561455
2026-09-07T12:14:19Z
TheHighFighter2
42988
Trang mới: “{{#invoke:quote|call_template |template=cite-journal |{{{lang|de}}} |title=Türkisches Militär-Reglement. Kanun-name, d. i. militärisches Dienstreglement für die neuen türkischen Truppen. Gedruckt zu Constantinopel im Silkide 1244. (May 1829.) 189 Seiten in Quart |year=1830 |issue=16 |publisher=Breitkopf & Härtel |work={{w|lang=de|Leipziger Literaturzeitung}} |location=Leipzig |columns={{#if:{{{column|}}}||{{#if:{{{columns|}}}||123–127}}}}{{{columns|}}} |columnur…”
2561455
wikitext
text/x-wiki
{{#invoke:quote|call_template
|template=cite-journal
|{{{lang|de}}}
|title=Türkisches Militär-Reglement. Kanun-name, d. i. militärisches Dienstreglement für die neuen türkischen Truppen. Gedruckt zu Constantinopel im Silkide 1244. (May 1829.) 189 Seiten in Quart
|year=1830
|issue=16
|publisher=Breitkopf & Härtel
|work={{w|lang=de|Leipziger Literaturzeitung}}
|location=Leipzig
|columns={{#if:{{{column|}}}||{{#if:{{{columns|}}}||123–127}}}}{{{columns|}}}
|columnurl={{#if:{{{column|{{{columns|}}}}}}|//www.google.com/books/edition/Leipziger_Literaturzeitung/IdtaAAAAcAAJ?gbpv=1&pg=PA{{#ifexpr:({{#invoke:string/templates|match|{{{column|{{{columns}}}}}}|[0-9]+|}} mod 2)=0|{{#expr:{{#invoke:string/templates|match|{{{column|{{{columns}}}}}}|[0-9]+|}}-1}}|{{#invoke:string/templates|match|{{{column|{{{columns}}}}}}|[0-9]+|}}}}}}
|url=https://zs.thulb.uni-jena.de/receive/jportal_jparticle_00400713
|translation={{{translation|{{{t|}}}}}}
|passage_block={{{passage_block|{{{text_block|}}}}}}
|propagateparams=column,subst,tr,line,lines,nocat,section
|allowparams=lang,columns,translation,t,passage_block,text_block
}}<noinclude>{{refcat}}</noinclude>
2qe78dbgn7qlbffxmbhpkrg249m4mgn
Thể loại:Bản mẫu tham khảo tiếng Thổ Nhĩ Kỳ Ottoman
14
415177
2561456
2026-09-07T12:14:46Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2561456
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Bản mẫu liên kết tiếng Thổ Nhĩ Kỳ Ottoman
14
415178
2561457
2026-09-07T12:15:07Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2561457
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Bản mẫu tiếng Thổ Nhĩ Kỳ Ottoman
14
415179
2561458
2026-09-07T12:15:25Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2561458
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
жапалақ
0
415180
2561459
2026-09-07T12:30:58Z
Hiyuune
50834
/* */ + kk
2561459
wikitext
text/x-wiki
=={{langname|kk}}==
{{kk-regional|жапалақ|جاپالاق}}
==={{section|etym}}===
Từ {{inh|kk|trk-pro|*yapalak}}. Cùng gốc với {{cog|tt|ябалак}}, {{cog|ba|ябалаҡ}}, {{cog|kum|ябалакъ}}, {{cog|alt|јаба кулак}}, {{cog|az|yapalaq}}, v.v.
==={{section|pron}}===
* {{IPA|kk|[ʒɑpɑˈɫɑq]}}
==={{section|n}}===
{{kk-noun}}
# [[owl]], {{taxfmt|Bubo|chi}}
===={{section|decl}}====
{{kk-noun-c|а|қ}}
===={{section|syn}}====
* {{l|kk|үкі}}
50ol2rsr0tp3beakr1v1d2liqi9sir4
2561463
2561459
2026-09-07T13:04:37Z
TheHighFighter2
42988
2561463
wikitext
text/x-wiki
=={{langname|kk}}==
{{kk-regional|жапалақ|جاپالاق}}
==={{section|etym}}===
Từ {{inh|kk|trk-pro|*yapalak}}. Cùng gốc với {{cog|tt|ябалак}}, {{cog|ba|ябалаҡ}}, {{cog|kum|ябалакъ}}, {{cog|alt|јаба кулак}}, {{cog|az|yapalaq}}, v.v.
==={{section|pron}}===
* {{IPA|kk|[ʒɑpɑˈɫɑq]}}
==={{section|n}}===
{{kk-noun}}
# [[cú|Cú]], {{taxfmt|Bubo|chi}}.
===={{section|decl}}====
{{kk-noun-c|а|қ}}
===={{section|syn}}====
* {{l|kk|үкі}}
8vfn68ecm888mbij81wdgzdw2yvg9bn
Thể loại:Thán từ tiếng Thổ Nhĩ Kỳ Ottoman
14
415181
2561461
2026-09-07T12:53:37Z
TheHighFighter2
42988
Trang mới: “{{auto cat}}”
2561461
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
अजुषत्
0
415182
2561462
2026-09-07T13:04:11Z
Hiyuune
50834
/* */
2561462
wikitext
text/x-wiki
=={{langname|sa}}==
==={{section|alternative script}}===
{{sa-alt}}
==={{section|pron}}===
{{sa-IPA|a=1}}
==={{section|v}}===
{{sa-verb|जुष्||P|thì quá khứ bất định|tr=ájuṣat}} {{tlb|sa|Vedic}}
# {{inflection of|sa|जुष्||aorist}}
===={{section|forms}}====
{{sa-conj|aor|ájusat}}
==={{section|ref}}===
* {{R:inc:IAIL|head=joṣ|page=256|passage=Aorist A}}
* {{R:ine:LIV|page=167|passage=thematisiert ''ájuṣat''}}
fnazjgebapi5cmytz2ae01e1dl9p21v
अशकत्
0
415183
2561465
2026-09-07T13:08:31Z
Hiyuune
50834
/* */
2561465
wikitext
text/x-wiki
=={{langname|sa}}==
==={{section|alternative script}}===
{{sa-alt}}
==={{section|etym}}===
{{root|sa|ine-pro|*ḱek-}}
{{inh+|sa|inc-pro|*śákt|*śákt ~ *śačánt}}, từ {{inh|sa|iir-pro|*ćákt|*ćákt ~ *ćačánt}}, từ {{inh|sa|ine-pro||*ḱék-t ~ *ḱk-ént}}, từ {{m|ine-pro|*ḱek-|pos=thì hoàn thành}}.
==={{section|pron}}===
{{sa-IPA|a=1}}
==={{section|v}}===
{{sa-verb|शक्||P|thì quá khứ bất định|tr=áśakat}}
# {{infl of|sa|शक्||aorist}}
===={{section|forms}}====
{{sa-conj|aor|áśakat}}
==={{section|ref}}===
* {{R:sa:MW|1044}}
463ftu0cnbi9iii4i82oqain3w1lq9n
ɵ
0
415184
2561468
2026-09-07T13:54:39Z
Lcsnes
40261
Trang mới: “{{also|Ө|Ꝋ|Θ|Ɵ}} {{minitoc}} {{-Latn-}} {{character info}} ==={{ĐM|desction}}=== {{mul-letter}} #[[chữ cái|Chữ cái]] '''[[o]] viết thương''' với nét sổ ngang giữa chữ. ==={{ĐM|see}}=== {{Latn-script}} =={{langname|mul}}== ==={{ĐM|pron}}=== *{{audio|mul|Close-mid_central_rounded_vowel.ogg|IPA}} ==={{ĐM|symbol}}=== {{mul-symbol}} #{{lb|mul|IPA}} [[nguyên âm|Nguyên âm]] tròn môi giữa bán khép. #{{lb|mul|IPA|dated}} Nguyên âm giảm gi…”
2561468
wikitext
text/x-wiki
{{also|Ө|Ꝋ|Θ|Ɵ}}
{{minitoc}}
{{-Latn-}}
{{character info}}
==={{ĐM|desction}}===
{{mul-letter}}
#[[chữ cái|Chữ cái]] '''[[o]] viết thương''' với nét sổ ngang giữa chữ.
==={{ĐM|see}}===
{{Latn-script}}
=={{langname|mul}}==
==={{ĐM|pron}}===
*{{audio|mul|Close-mid_central_rounded_vowel.ogg|IPA}}
==={{ĐM|symbol}}===
{{mul-symbol}}
#{{lb|mul|IPA}} [[nguyên âm|Nguyên âm]] tròn môi giữa bán khép.
#{{lb|mul|IPA|dated}} Nguyên âm giảm giữa tròn môi.
#{{label|mul|viết trên ⟨ᶱ⟩|IPA}} {{IPAfont|[ɵ]}} thêm âm sắc hoặc nhẹ, thoáng qua hay vang.
#{{lb|mul|Teuthonista}} {{ng|Như trong IPA; xem thêm {{l|mul|ꝋ}}.}}
#{{lb|mul|phonetics}} Nguyên âm giảm tròn môi giữa.
===={{ĐM|usage}}====
Nguyên âm tròn môi giữa trong bảng Teuthonista, từ cao/gần đến gần mở, bao gồm:
:[[ʉ]] [[ꭏ]] [[ɵ]] [[϶]] [[ꭂ]]
IPA cung cấp hai chữ cái cho các nguyên âm giảm : thấp/mở ⟨ɐ⟩ và trung bình ⟨ə⟩, không gồm trong định nghĩa tròn môi. Đối với các ngôn ngữ như tiếng Anh, tiếng Pháp và tiếng Nga có thêm hoặc chỉ khác các nguyên âm giảm, một số nguồn sử dụng các chữ cái không thuộc IPA ⟨ᵿ⟩ và ⟨ᵻ⟩ cho các nguyên âm giảm cao/đóng có làm tròn môi và không làm tròn môi, hoặc định nghĩa lại IPA ⟨ɵ⟩ cho một nguyên âm giảm trung bình được làm tròn môi cụ thể.
==={{ĐM|letter}}===
{{mul-letter}}
#{{lb|mul|obsolete}} {{ng|Chữ cái trong Bảng chữ cái Bắc Âu thống nhất, Yañalif và các hệ chữ viết tương tự, được dùng trong chiến dịch Latin hóa ngắn ngủi của Liên Xô vào thập niên 1930.}}
=={{langname|dnj}}==
==={{ĐM|pron}}===
*{{IPA4|dnj|/ɵ/}}
==={{ĐM|letter}}===
{{letter|dnj}}
#Chữ cái thứ 25 viết thường trong bảng chữ cái Latinh tiếng Dan ở Liberia.
#:{{quote|dnj|L'''ɵ'''ɛ kǝ wãã̀ à gb'''ɵ'''nù bɔúnù pèètɛ wó ɓɛ wò yeà zɛ̃ã wò lóà Zúdà sɛ̀ gɥ́, kǝǝ lɛ̀ wó kǝ̀ lólɛ̀àɛ̀,|Vậy, người lìa-bỏ chỗ mình đã ở, cùng hai dâu mình lên đường đặng trở về xứ Giu-đa. ([[s:Ru-tơ/1#1:7|Ru-tơ 1:7]])}}
==={{ĐM|see}}===
*{{letters|lang=dnj|sc=Latn|qual=Bảng chữ cái Latinh tiếng Dan ở Liberia|Aa|Bb|Ɓɓ|Dd|Ɗɗ|Ee|Ɛɛ|Ff|Gg|GB/gb|Hh|Ii|Kk|KP/kp|KW/kw|Ll|Mm|Nn|NW/nw|NY/ny|Ŋŋ|Oo|Ɔɔ|Əə|Ɵɵ|Pp|Rr|Ss|Tt|Uu|Ɥɥ|Vv|Ww|Xx|Yy|Zz}}
*{{letters|lang=dnj|sc=Latn|qual=Bảng chữ cái Latinh tiếng Dan Tây ở Bờ Biển Ngà|Aa|AƆ/aɔ|Bb|BH/bh|Dd|DH/dh|Ee|Ɛɛ|Ëë|ƐA/ɛa|Ff|Gg|GB/gb|GW/gw|Ii|Kk|KP/kp|KW/kw|Ll|Mm|Nn|NG/ng|Oo|Ɔɔ|Öö|Pp|Rr|Ss|Tt|Uu|Üü|Vv|Ww|Yy|Zz}}
*{{letters|lang=dnj|sc=Latn|qual=Bảng chữ cái Latinh tiếng Dan Đông ở Bờ Biển Ngà|Aa|Œœ|Bb|BH/bh|Dd|DH/dh|Ee|Ʌʌ|Ɛɛ|Ææ|Ff|Gg|GB/gb|GW/gw|Hh|Ii|Ɩɩ|Kk|KP/kp|KW/kw|Ll|Mm|Nn|Oo|ɤ|Ɔɔ|Pp|Rr|Ss|Tt|Uu|Ɯɯ|Ʋʋ|Vv|Ww|Yy|Zz}}
==={{ĐM|ref}}===
*{{Chú thích web|dnj|author=Bible Society in Liberia|entryurl=https://www.bible.com/bible/2828/RUT.1.DHB|entry=Wrúfè 1|year=2025|work=Aaɓi Kwì}}
*{{Chú thích web|dnj|author=Wycliffe Bible Translators|entryurl=https://www.bible.com/bible/1831/EPH.1.DNJBL|entry=Efɛzö 1|year=1991|work=Dan Blowo (Yacouba) Nouveau Testament}}
=={{langname|ug}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Ả Rập
| [[ئۆ#Tiếng_Duy_Ngô_Nhĩ|ئۆ]]
|-
! Latinh
| {{pn}}
|-
! Kirin
| [[ө#Tiếng_Duy_Ngô_Nhĩ|ө]]
|-
|}
==={{ĐM|pron}}===
*{{IPA4|ug|/ø/}}
==={{ĐM|letter}}===
{{letter|ug}}
#{{label|ug|obsolete}} Chữ cái thứ 31 viết thường trong bảng chữ cái Latinh UYY.
==={{ĐM|see}}===
*{{letters|lang=ug|sc=Latn|qual=Bảng chữ cái Latinh ULY|Aa|Bb|Ch/ch|Dd|Ee|Ëë|Ff|Gg|Gh/gh|Hh|Ii|Jj|Kk|Ll|Mm|Nn|Ng/ng|Oo|Öö|Pp|Qq|Rr|Ss|Sh/sh|Tt|Uu|Üü|Ww|Xx|Yy|Zz|Zh/zh}}
*{{letters|lang=ug|sc=Latn|qual=Bảng chữ cái Latinh UYY (1965-1982)|Aa|Bb|Cc|Dd|Ee|Ff|Gg|Hh|Ii|Jj|Kk|Ll|Mm|Nn|Oo|Pp|Qq|Rr|Ss|Tt|Uu|Vv|Ww|Xx|Yy|Zz|Ƣƣ|Ⱨⱨ|Ⱪⱪ|Əə|Ɵɵ|Üü|Ⱬⱬ|Ng/ng|Zh/zh|Ch/ch|Sh/sh}}
=={{langname|kdr}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Kirin
| [[ӧ#Tiếng_Karaim|ӧ]]
|-
! Latinh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|kdr|[ø]}}
==={{ĐM|letter}}===
{{letter|kdr}}
#{{label|kdr|obsolete}} Chữ cái thứ 19 viết thường trong bảng chữ cái Latinh tiếng Karaim năm 1920.
#:{{ux|kdr|k'''ɵ'''z|tr=[[кӧз#Tiếng_Karaim|к'''ӧ'''з]]|[[mắt]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=kdr|sc=Latn|qual=Bảng chữ cái Latinh tiếng Karaim năm 1920|Aa|Bb|Cc|Çç|Dd|Ee|Ff|Gg|Ƣƣ|Hh|Ii|Jj|Kk|Ll|Mm|Nn|N̡/n̡|Oo|Ɵɵ|Pp|Qq|Rr|Ss|Șș|Tt|Uu|Vv|Xx|Yy|Zz|Ƶƶ|Ьь}}
*{{letters|lang=kdr|sc=Latn|qual=Bảng chữ cái Latinh tiếng Karaim tại Litva|Aa|Bb|Cc|Ch/ch|Čč|Dd|Ďď|Dž/dž|Ee|Ėė|Ff|Gg|Hh|Ii|Yy|Jj|Kk|Ll|Ľľ|Mm|Nn|Ńń|Oo|Öö|Pp|Rr|Ss|Śś|Šš|Tt|Ťť|Uu|Üü|Vv|Zz|Žž|Źź}}
==={{ĐM|reference}}===
*{{Chú thích web|author=Kale|work=Русско-караимский словарь|year=2009|entryurl=https://kale.at.ua/publ/3-1-0-16|entry=О-П}}
=={{langname|kjh}}==
==={{ĐM|pron}}===
*{{IPA4|kjh|/ø/}}
==={{ĐM|letter}}===
{{letter|kjh}}
#{{label|kjh|obsolete}} Chữ cái thứ 20 viết thường trong bảng chữ cái Latinh tiếng Khakas năm 1929-1939.
==={{ĐM|see}}===
*{{letters|lang=kjh|sc=Latn|qual=Bảng chữ cái Latinh tiếng Khakas năm 1929-1939|Aa|Bb|Cc|Çç|Dd|Ee|Əə|Ff|Gg|Ƣƣ|Ii|Įį|Jj|Kk|Ll|Mm|Nn|Ꞑꞑ|Oo|Ɵɵ|Pp|Rr|Ss|Şş|Tt|Uu|Vv|Xx|Yy|Zz|Ƶƶ|Ьь}}
==={{ĐM|ref}}===
*{{Chú thích sách|author=Marc Marti|title=[https://web.archive.org/web/20210725072821/https://altaica.ru/LIBRARY/turks/khakas_english_dictionary.pdf Khakas-English Dictionary]|year=2021}}
=={{langname|jct}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Kirin
| [[ӧ#Tiếng_Krymchak|ӧ]]
|-
! Latinh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|jct|[ø~œ]}}
==={{ĐM|letter}}===
{{letter|jct}}
#{{label|jct|obsolete}} Chữ cái thứ 21 viết thường trong bảng chữ cái Latinh tiếng Krymchak.
==={{ĐM|see}}===
*{{letters|lang=jct|sc=Latn|qual=Bảng chữ cái Latinh tiếng Krymchak|Aa|Bʙ|Cc|Çç|Dd|Ee|Ff|Gg|Hh|Ii|Jj|Ьь|Kk|Qq|Ƣƣ|Ll|Mm|Nn|N̡/n̡|Oo|Ɵɵ|Pp|Rr|Ss|Şş|Tt|Uu|Yy|Vv|Zz|Ƶƶ}}
=={{langname|lbe}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Kirin
| [[оь#Tiếng_Lak|оь]]
|-
! Latinh
| {{pn}}
|-
! Ả Rập
| [[اۊ#Tiếng_Lak|اۊ]]
|-
|}
==={{ĐM|pron}}===
*{{IPA4|lbe|[oˤ]}}
==={{ĐM|letter}}===
{{letter|lbe}}
#Chữ cái thứ 22 viết thường trong bảng chữ cái Latinh tiếng Lak.
#:{{ux|lbe|'''ɵ'''rus|tr=[[w:lbe:Оьрус|'''оь'''рус]]|[[người Nga]]|inline=1}}
===={{ĐM|see}}====
*{{letters|lang=lbe|sc=Latn|qual=Bảng chữ cái Latinh tiếng Lak|Aa|Bb|Cc|Çç|Dd|Ee|Әә|Ff|Gg|Ƣƣ|Hh|Ħħ|Ⱨⱨ|Ii|Jj|Kk|Ⱪⱪ|Ll|Mm|Nn|Oo|Ɵɵ|Pp|Ҏҏ|Qq|Ꝗꝗ|Rr|Ss|Şş|S̷/s̷|Tt|T̨/t̨|Uu|Vv|Xx|Ҳҳ|Ӿӿ|Zz|Ⱬⱬ|Ƶƶ}}
==={{ĐM|n}}===
{{head|lbe|Danh từ}}
#[[máu|Máu]].
==={{ĐM|ref}}===
*{{Chú thích sách|author=Саид Магомедович Хайдаков|year=1962|title=[http://cathedra.dgu.ru/Content/files/%D0%A4%D0%B8%D0%BB%D0%BE%D0%BB%D0%BE%D0%B3%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%B9%20%D1%84%D0%B0%D0%BA%D1%83%D0%BB%D1%8C%D1%82%D0%B5%D1%82/%D0%A5%D0%B0%D0%B9%D0%B4%D0%B0%D0%BA%D0%BE%D0%B2_%D0%A1_%D0%9C__%D0%9B%D0%B0%D0%BA%D1%81%D0%BA%D0%BE-%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9_%D1%81%D0%BB%D0%BE%D0%B2%D0%B0%D1%80%D1%8C.pdf Лакско-русский словарь]}}
=={{langname|mdm}}==
==={{ĐM|pron}}===
*{{IPA4|mdm|/ɵ/}}
==={{ĐM|letter}}===
{{letter|mdm}}
#Chữ cái thứ 27 viết thường trong bảng chữ cái Latinh tiếng Mayogo.
#:{{quote|mdm|Engʉ́ ma ngapa e pɨ olɨngbangɨ ne o'''ɵ'''k'''ɵ'''sɨ-e ngae ɨnde: a ndjɨndjɨ pɨ yi nadʉ kpi yi kpi maka ma.|Vậy, tôi nói với những kẻ chưa cưới gả, và kẻ góa-bụa rằng ở được như tôi thì hơn. ([[s:I Cô-rinh-tô/7#7:8|I Cô-rinh-tô 7:8]])}}
==={{ĐM|see}}===
*{{letters|lang=mdm|sc=Latn|qual=Bảng chữ cái Latinh tiếng Mayogo|a|b|bh|d|dh|dy|dj|e|f|g|gb|h|i|ɨ|k|kp|l|m|mb|n|nd|ndj|ng|ngb|nv|o|ɵ|p|s|t|ts|u|ʉ|v|w|y|z}}
==={{ĐM|ref}}===
*{{Chú thích web|mdm|author=Wycliffe Bible Translators, Inc.|entryurl=https://www.bible.com/bible/2648/1CO.7.MDM|entry=1 Kolito 7|year=2015|work=Gandja na Mbɨa}}
=={{langname|nog}}==
{| class="floatright wikitable" style="text-align:center;"
|-
! Kirin
| [[оь#Tiếng_Nogai|оь]]
|-
! Latinh
| {{pn}}
|-
|}
==={{ĐM|pron}}===
*{{IPA4|nog|[œ]}}
==={{ĐM|letter}}===
{{letter|nog}}
#{{label|nog|obsolete}} Chữ cái thứ 17 viết thường trong bảng chữ cái Latinh tiếng Nogai năm 1928.
#:{{ux|nog|'''ɵ'''pke|tr=[[оьпке#Tiếng_Nogai|'''оь'''пке]]|[[phổi]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=nog|sc=Latn|qual=Bảng chữ cái Latinh tiếng Nogai năm 1928|Aa|Вв|Çç|Dd|Ee|Əə|Ff|Gg|Ƣƣ|Ii|Kk|Ll|Mm|Nn|Ꞑꞑ|Oo|Ɵɵ|Pp|Qq|Rr|Ss|Şş|Tt|Uu|Yy|Jj|Ьь|Zz|Vv}}
==={{ĐM|ref}}===
*{{Chú thích sách|author=С. А. Калмыкова|title=Вопросы совершенствования алфавитов тюркских языков СССР: Алфавит ногайского языка|publisher=Наука|year=1972|pages=118–125}}
=={{langname|za}}==
==={{ĐM|pron}}===
*{{IPA4|za|[œ]}}
==={{ĐM|letter}}===
{{letter|za}}
#{{label|za|obsolete}} Chữ cái thứ 27 viết thường trong bảng chữ cái Latinh năm 1957, tương đương với {{l|za|oe}}.
#:{{ux|za|r'''ɵ'''k|tr=[[roek#Tiếng_Tráng|r'''oe'''k]]|[[6]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=za|sc=Latn|qual=Bảng chữ cái Latinh tiếng Tráng năm 1957|Aa|Əə|Bb|By/by|Cc|Dd|Ee|Ff|Gg|Gv/gv|Gy/gy|Hh|Ƅƅ|Ii|Зз|Kk|Ll|Mm|Ƃƃ|My/my|Nn|Ƌƌ|Ŋŋ|Ŋv/ŋv|Ny/ny|Oo|Ɵɵ|Pp|Ƽƽ|Rr|Ss|Tt|Uu|Vv|Ɯɯ|Чч|Yy|Ƨƨ}}
*{{letters|lang=za|sc=Latn|qual=Bảng chữ cái Latinh tiếng Tráng năm 1982|Aa|AE/ae|Bb|BY/by|Cc|Dd|Ee|Ff|Gg|GV/gv|GY/gy|Hh|Ii|Jj|Kk|Ll|Mm|MB/mb|MY/my|Nn|ND/nd|NG/ng|NGV/ngv|NY/ny|Oo|OE/oe|Pp|Qq|Rr|Ss|Tt|Uu|Vv|Ww|Xx|Yy|Zz}}
=={{langname|ute}}==
==={{ĐM|pron}}===
*{{IPA4|ute|[ø]}}
==={{ĐM|letter}}===
{{letter|ute}}
#Chữ cái thứ 13 viết thường trong bảng chữ cái Latinh tiếng Ute.
#:{{ux|ute|m'''ɵ'''m'''ɵ'''-pi̱|[[muỗi]] [[mắt]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=ute|sc=Latn|qual=Bảng chữ cái Latinh tiếng Ute|’|a|ch|g|gh|h|i|k|kh|m|n|o|ɵ|p|q|qh|r|s|t|u|ʉ|v|w|y}}
==={{ĐM|ref}}===
*{{Chú thích sách|en|author=T. Givón|title=Ute Dictionary|publisher=John Benjamins Publishing Company|year=2016|page=[https://books.google.com/books?id=cKm8CwAAQBAJ&pg=PA100 100]|isbn=9789027268396}}
=={{langname|sah}}==
==={{ĐM|pron}}===
*{{IPA4|sah|/œ/}}
==={{ĐM|letter}}===
{{letter|sah|Cyrl:ө}}
#{{lb|sah|obsolete}} Chữ cái thứ 20 viết thường trong trong bảng chữ cái Latinh 1929–1939.
#:{{ux|sah|'''ɵ'''l'''ɵ'''r|tr=[[өлөр#Tiếng_Yakut|'''ө'''л'''ө'''р]]|[[giết]]|inline=1}}
==={{ĐM|see}}===
*{{letters|lang=sah|sc=Latn|qual=Bảng chữ cái Latinh tiếng Yakut (1917–1929)|a|e|ɔ|ꭢ|ꭠ|ꭡ|ꭣ|w|ɯ|i|u|y|k|q|ɡ|ʃ|ŋ|t|d|n|c|з|ɲ|p|b|j|ɟ|m|r|l|ʎ|s|h}}
*{{letters|lang=sah|sc=Latn|qual=Bảng chữ cái Latinh tiếng Yakut (1929–1939)|Aa|Bb|Cc|Çç|Dd|Ee|Ff|Gg|Ƣƣ|Hh|Ii|Jj|Kk|Ll|Mm|Nn|Ꞑꞑ|Nj/nj|Oo|Ɵɵ|Pp|Qq|Rr|Ss|Şş|Tt|Uu|Vv|Yy|Ьь|Zz|Ƶƶ}}
[[Thể loại:Khối ký tự IPA Extensions|75]]
rgllefquqt4g3yc9o8ttc3tqltcf6po
œsophage
0
415185
2561469
2026-09-07T13:56:17Z
Kelly zhrm
58416
Trang mới: “{{also|oesophage}} =={{langname|fr}}== {{wp|fr:}} ==={{ĐM|etym}}=== {{ety|fr|:lbor|grc:οἰσοφάγος}} {{lbor|fr|grc|οἰσοφάγος}}. ==={{ĐM|pron}}=== * {{fr-IPA|+|qual2=bị cấm nhưng phổ biến|eûsophage}} * {{audio|fr|LL-Q150 (fra)-Lyokoï-œsophage.wav|a=Lyon}} * {{audio|fr|LL-Q150 (fra)-WikiLucas00-œsophage.wav|a=Lyon}} ==={{ĐM|n}}=== {{fr-noun|m}} # [[thực quản|Thực quản]]. ===={{ĐM|drv}}==== * {{l|fr|œsophagien}} ==={{ĐM|furt…”
2561469
wikitext
text/x-wiki
{{also|oesophage}}
=={{langname|fr}}==
{{wp|fr:}}
==={{ĐM|etym}}===
{{ety|fr|:lbor|grc:οἰσοφάγος}}
{{lbor|fr|grc|οἰσοφάγος}}.
==={{ĐM|pron}}===
* {{fr-IPA|+|qual2=bị cấm nhưng phổ biến|eûsophage}}
* {{audio|fr|LL-Q150 (fra)-Lyokoï-œsophage.wav|a=Lyon}}
* {{audio|fr|LL-Q150 (fra)-WikiLucas00-œsophage.wav|a=Lyon}}
==={{ĐM|n}}===
{{fr-noun|m}}
# [[thực quản|Thực quản]].
===={{ĐM|drv}}====
* {{l|fr|œsophagien}}
==={{ĐM|further}}===
* {{R:fr:TLFi}}
{{C|fr|Giải phẫu học}}
dsvhuzani7r2kxu611xbhrrflmjxdne
くとぅーば
0
415186
2561473
2026-09-07T14:06:10Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|noun}}=== {{xug-head|noun}} # {{xug-def|言葉}} [[ngôn ngữ]], [[tiếng nói]], [[phương ngữ]], [[từ ngữ]], [[phương ngôn]].”
2561473
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|noun}}===
{{xug-head|noun}}
# {{xug-def|言葉}} [[ngôn ngữ]], [[tiếng nói]], [[phương ngữ]], [[từ ngữ]], [[phương ngôn]].
7mr3hbw3ycli1zgrqwqg6ot765j43wg
山原言葉
0
415187
2561474
2026-09-07T14:10:26Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== {{xug-kanjitab|しま|くとぅー|ば|yomi=k}} ==={{ĐM|etym}}=== Ghép từ {{suffix|xug|山原|tr1=Yanbaru|t1=vùng rừng núi phía bắc đảo Okinawa|言葉|tr2=kutūba|t2=tiếng nói, phương ngữ, ngôn ngữ}}. ==={{ĐM|pron}}=== {{xug-pron|しま くとぅーば}} ==={{ĐM|noun}}=== {{xug-noun|しま くとぅーば}} # {{w|Tiếng Kunigami}}. {{c|xug|Tên ngôn ngữ}}”
2561474
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab|しま|くとぅー|ば|yomi=k}}
==={{ĐM|etym}}===
Ghép từ {{suffix|xug|山原|tr1=Yanbaru|t1=vùng rừng núi phía bắc đảo Okinawa|言葉|tr2=kutūba|t2=tiếng nói, phương ngữ, ngôn ngữ}}.
==={{ĐM|pron}}===
{{xug-pron|しま くとぅーば}}
==={{ĐM|noun}}===
{{xug-noun|しま くとぅーば}}
# {{w|Tiếng Kunigami}}.
{{c|xug|Tên ngôn ngữ}}
n0n44vspooliujnzpuxi5bg3box5ky5
2561475
2561474
2026-09-07T14:12:18Z
WhoAlone
40420
2561475
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab|やん|ばる|くとぅー|ば|yomi=k}}
==={{ĐM|etym}}===
Ghép từ {{suffix|xug|山原|tr1=Yanbaru|t1=vùng rừng núi phía bắc đảo Okinawa|言葉|tr2=kutūba|t2=tiếng nói, phương ngữ, ngôn ngữ}}.
==={{ĐM|pron}}===
* {{IPA4|xug|/jˀanbaru kʰut˭uuba/}}
==={{ĐM|noun}}===
{{xug-head|noun|やんばる くとぅーば}}
# {{w|Tiếng Kunigami}}.
{{c|xug|Tên ngôn ngữ}}
93df425alcidr0kjewa783kqy15xp17
2561477
2561475
2026-09-07T14:14:41Z
WhoAlone
40420
2561477
wikitext
text/x-wiki
=={{langname|xug}}==
{{xug-kanjitab}}
==={{ĐM|etym}}===
Ghép từ {{suffix|xug|山原|tr1=Yanbaru|t1=vùng rừng núi phía bắc đảo Okinawa|言葉|tr2=kutūba|t2=tiếng nói, phương ngữ, ngôn ngữ}}.
==={{ĐM|pron}}===
* {{IPA4|xug|/jambaɾuɸutuːba/}}
==={{ĐM|noun}}===
{{xug-head|proper noun|やんばる-ふと゚ぅーば|rom=Yanbaru-futūba}}
# {{w|Tiếng Kunigami}}.
{{c|xug|Tên ngôn ngữ}}
edskf8ujb2u79xwiqzm796tgjbs4z3r
やんばるふと゚ぅーば
0
415188
2561478
2026-09-07T14:15:24Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pr-noun}}=== {{xug-head|proper noun|やんばる-ふと゚ぅーば|rom=Yanbaru-futūba|sort=やんばるふと゚ぅうば}} # {{xug-def|山原言葉}} {{w|Tiếng Kunigami}}.”
2561478
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pr-noun}}===
{{xug-head|proper noun|やんばる-ふと゚ぅーば|rom=Yanbaru-futūba|sort=やんばるふと゚ぅうば}}
# {{xug-def|山原言葉}} {{w|Tiếng Kunigami}}.
fsibvl620cfm78mwmnpvzfpe076anwq
ヤンバルクトゥーバ
0
415189
2561479
2026-09-07T14:16:42Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pr-noun}}=== {{xug-head|proper noun|やんばる-ふと゚ぅーば}} # {{xug-def|山原言葉}} {{w|Tiếng Kunigami}}.”
2561479
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pr-noun}}===
{{xug-head|proper noun|やんばる-ふと゚ぅーば}}
# {{xug-def|山原言葉}} {{w|Tiếng Kunigami}}.
190salf5uc9i6rkx89vzcp6k07w1tvn
あらぐすく
0
415190
2561480
2026-09-07T14:22:47Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]''”
2561480
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
01xm2r6sha97z3w9il1xze0fktk060c
うぐすく
0
415191
2561481
2026-09-07T14:23:02Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]''”
2561481
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
01xm2r6sha97z3w9il1xze0fktk060c
うふぐすく
0
415192
2561482
2026-09-07T14:26:39Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]''”
2561482
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
01xm2r6sha97z3w9il1xze0fktk060c
かなぐすく
0
415193
2561483
2026-09-07T14:27:50Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]''”
2561483
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
01xm2r6sha97z3w9il1xze0fktk060c
かにぐすく
0
415194
2561484
2026-09-07T14:28:52Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]''”
2561484
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
01xm2r6sha97z3w9il1xze0fktk060c
くぐすく
0
415195
2561485
2026-09-07T14:31:39Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]''”
2561485
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
01xm2r6sha97z3w9il1xze0fktk060c
2561486
2561485
2026-09-07T14:32:03Z
WhoAlone
40420
2561486
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
ぐすくま
0
415196
2561487
2026-09-07T14:32:09Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561487
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
Thể loại:ryu:Địa danh
14
415197
2561488
2026-09-07T14:32:14Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561488
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ryu:Tên
14
415198
2561489
2026-09-07T14:33:36Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561489
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
ぐすくんちゅ
0
415199
2561490
2026-09-07T14:34:54Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561490
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
たまぐすく
0
415200
2561491
2026-09-07T14:35:06Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561491
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
っゐーぐすく
0
415201
2561492
2026-09-07T14:37:08Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561492
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
てぃみぐすく
0
415202
2561493
2026-09-07T14:37:20Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561493
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
なーぐすく
0
415203
2561494
2026-09-07T14:39:24Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561494
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
なかぐすく
0
415204
2561495
2026-09-07T14:40:35Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561495
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
はなぐすく
0
415205
2561496
2026-09-07T14:42:05Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561496
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
みゃーぐすく
0
415206
2561497
2026-09-07T14:42:19Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561497
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
やまぐすく
0
415207
2561498
2026-09-07T14:42:32Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561498
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
ゆなぐすく
0
415208
2561499
2026-09-07T14:42:44Z
WhoAlone
40420
Trang mới: “=={{langname|ryu}}== ==={{ĐM|pr-noun}}=== {{ryu-head|proper noun}} # ''Một [[địa danh]]'' {{c|ryu|Địa danh}}”
2561499
wikitext
text/x-wiki
=={{langname|ryu}}==
==={{ĐM|pr-noun}}===
{{ryu-head|proper noun}}
# ''Một [[địa danh]]''
{{c|ryu|Địa danh}}
qovhy3nesmc11xp3cs6t6v1h0pepeig
hạ giải
0
415209
2561500
2026-09-07T14:43:14Z
Phan Trong Nghia
50745
Trang mới: “=={{langname|vi}}== ==={{section|pron}}=== {{vi-IPA}} ==={{section|verb}}=== {{vi-verb}} # Hoạt động tháo rời [[cấu kiện]] tạo thành [[kiến trúc]] của một [[công trình]] nhằm [[mục đích]] [[tu bổ]] hoặc [[di chuyển]] cấu kiện đến một nơi khác để lắp dựng lại mà vẫn giữ gìn tối đa sự nguyên vẹn các cấu kiện đó.”
2561500
wikitext
text/x-wiki
=={{langname|vi}}==
==={{section|pron}}===
{{vi-IPA}}
==={{section|verb}}===
{{vi-verb}}
# Hoạt động tháo rời [[cấu kiện]] tạo thành [[kiến trúc]] của một [[công trình]] nhằm [[mục đích]] [[tu bổ]] hoặc [[di chuyển]] cấu kiện đến một nơi khác để lắp dựng lại mà vẫn giữ gìn tối đa sự nguyên vẹn các cấu kiện đó.
qwh9aoyzan6js483p7emca3yjurzrol
すーぐむ
0
415210
2561501
2026-09-07T14:45:36Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pron}}=== * {{IPA4|xug|[suːɡumu]}} ==={{ĐM|noun}}=== {{xug-head|noun}} # {{label|xug|Benoki}} {{xug-def|白雲}} [[mây]] [[trắng]]. ==={{ĐM|ref}}=== *{{R:JLect|すーぐむ【白雲】|5851/suugumu}}”
2561501
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pron}}===
* {{IPA4|xug|[suːɡumu]}}
==={{ĐM|noun}}===
{{xug-head|noun}}
# {{label|xug|Benoki}} {{xug-def|白雲}} [[mây]] [[trắng]].
==={{ĐM|ref}}===
*{{R:JLect|すーぐむ【白雲】|5851/suugumu}}
brxkgc891b14mnjgoapt71cr5lnlnpj
дилбар
0
415211
2561502
2026-09-07T14:50:49Z
TheHighFighter2
42988
Trang mới: “{{also|dilber|दिलबर|દિલબર}} =={{langname|tg}}== [[File:Reza Abbasi - Two Lovers (1630).jpg|thumb|ҷуфти '''дилбарон''']] ==={{ĐM|etym}}=== {{ety|tg|:inh|fa-cls:دِلْبَر|:afeq<surf><lit:người mang trái tim>|дил|-бар|text=++|tree=1}} ==={{ĐM|pron}}=== {{tg-IPA|дилˈбар}} {{rfap|tg}} ==={{ĐM|noun}}=== {{tg-noun|fa=دلبر}} # [[người yêu|Người yêu]], [[người tình]], [[người thương]]. #* {{quote-so…”
2561502
wikitext
text/x-wiki
{{also|dilber|दिलबर|દિલબર}}
=={{langname|tg}}==
[[File:Reza Abbasi - Two Lovers (1630).jpg|thumb|ҷуфти '''дилбарон''']]
==={{ĐM|etym}}===
{{ety|tg|:inh|fa-cls:دِلْبَر|:afeq<surf><lit:người mang trái tim>|дил|-бар|text=++|tree=1}}
==={{ĐM|pron}}===
{{tg-IPA|дилˈбар}}
{{rfap|tg}}
==={{ĐM|noun}}===
{{tg-noun|fa=دلبر}}
# [[người yêu|Người yêu]], [[người tình]], [[người thương]].
#* {{quote-song|tg|trans-title=Em có biết hay không?|genre=[[soft rock]], [[folk rock]]|url=https://www.youtube.com/watch?v=047uS7A1w3A|
time=00:35-00:45|year=1997|author=w:Parem|title=tg:Медонӣ ё не|passage='''Дилбарам''', ошиқат ҳастам ман, медонӣ ё не? <br/> Ошиқи ду зулфи парешонат ҳастам ман, медонӣ ё не?
|t='''Người thương''' ơi, anh đã trót yêu em rồi, em có biết hay không?<br/>Anh đã say đắm hai bím tóc rối của em, em có biết hay không?}}
===={{ĐM|infl}}====
{{tg-infl-noun|anim=1}}
==={{ĐM|further}}===
* {{R:tg:Vozhaju}}
ii5599j13b8ucukb1mf4tmsdwgpfw15
あがち
0
415212
2561504
2026-09-07T15:04:20Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pron}}=== * {{IPA4|xug|[ʔaɡat͡ɕi]}} ==={{ĐM|noun}}=== {{xug-head|noun}} # {{label|xug|Oku}} Một loài [[chim]]. ==={{ĐM|ref}}=== *{{R:JLect|あがち|3936/agachi}} =={{langname|ryu}}== ==={{ĐM|pron}}=== * {{IPA4|ryu|[ʔaɡat͡ɕi]}} ==={{ĐM|noun}}=== {{ryu-head|noun}} # Một loài [[chim]]. ==={{ĐM|ref}}=== *{{R:JLect|あがち|3936/agachi}}”
2561504
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pron}}===
* {{IPA4|xug|[ʔaɡat͡ɕi]}}
==={{ĐM|noun}}===
{{xug-head|noun}}
# {{label|xug|Oku}} Một loài [[chim]].
==={{ĐM|ref}}===
*{{R:JLect|あがち|3936/agachi}}
=={{langname|ryu}}==
==={{ĐM|pron}}===
* {{IPA4|ryu|[ʔaɡat͡ɕi]}}
==={{ĐM|noun}}===
{{ryu-head|noun}}
# Một loài [[chim]].
==={{ĐM|ref}}===
*{{R:JLect|あがち|3936/agachi}}
byyq7odpxqo0i3sl6w9jx3cta89vssi
あがちゃー
0
415213
2561507
2026-09-07T15:07:33Z
WhoAlone
40420
Trang mới: “=={{langname|xug}}== ==={{ĐM|pron}}=== * {{IPA4|xug|[ʔaɡat͡ɕaː]}} ==={{ĐM|noun}}=== {{xug-head|noun}} # Một loài [[chim]]. ==={{ĐM|ref}}=== *{{R:JLect|あがちゃー|4429/agachaa}} =={{langname|ryu}}== ==={{ĐM|pron}}=== * {{IPA4|ryu|[ʔaɡat͡ɕaː]}} ==={{ĐM|noun}}=== {{ryu-head|noun}} # Một loài [[chim]]. ==={{ĐM|ref}}=== *{{R:JLect|あがちゃー|4429/agachaa}}”
2561507
wikitext
text/x-wiki
=={{langname|xug}}==
==={{ĐM|pron}}===
* {{IPA4|xug|[ʔaɡat͡ɕaː]}}
==={{ĐM|noun}}===
{{xug-head|noun}}
# Một loài [[chim]].
==={{ĐM|ref}}===
*{{R:JLect|あがちゃー|4429/agachaa}}
=={{langname|ryu}}==
==={{ĐM|pron}}===
* {{IPA4|ryu|[ʔaɡat͡ɕaː]}}
==={{ĐM|noun}}===
{{ryu-head|noun}}
# Một loài [[chim]].
==={{ĐM|ref}}===
*{{R:JLect|あがちゃー|4429/agachaa}}
7x2f8ap8sxveflz8nvpu7x3wvrcuag8
𲁕
0
415214
2561509
2026-09-07T15:31:00Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=147|rad=见|as=6|sn=10|four=|canj=|ids=⿰吉见}} ===={{ĐM|ref}}==== * {{Han ref|kx=|dkj=|dj=|hdz=|uh=32055}}”
2561509
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=147|rad=见|as=6|sn=10|four=|canj=|ids=⿰吉见}}
===={{ĐM|ref}}====
* {{Han ref|kx=|dkj=|dj=|hdz=|uh=32055}}
d8ako7atshduclyfc1s3j8ibu2dcax4
𲁖
0
415215
2561513
2026-09-07T15:35:24Z
Hiyuune
50834
Trang mới: “{{also|覮}} {{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=147|rad=见|as=6|sn=10|four=|canj=|ids=⿱𫇦见}} ===={{section|related characters}}==== * {{l|mul|[[覮]]}} ''({{w|chữ Hán phồn thể|chữ Hán phồn thể}} của {{lang|mul|𲁖}})'' ===={{section|ref}}==== {{Han ref|uh=32056}} =={{langname|zh}}== {{zh-see|覮}}”
2561513
wikitext
text/x-wiki
{{also|覮}}
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=147|rad=见|as=6|sn=10|four=|canj=|ids=⿱𫇦见}}
===={{section|related characters}}====
* {{l|mul|[[覮]]}} ''({{w|chữ Hán phồn thể|chữ Hán phồn thể}} của {{lang|mul|𲁖}})''
===={{section|ref}}====
{{Han ref|uh=32056}}
=={{langname|zh}}==
{{zh-see|覮}}
qrle44jeu7rfelvkmonkkf0ftkffv9y
覮
0
415216
2561514
2026-09-07T15:36:22Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=147|rad=見|as=10|sn=17|four=99216|canj=FFBBU|ids=⿱𤇾見}} ===={{section|ref}}==== * {{Han ref|kx=1136.310|dkj=34943|hdz=63673.050|uh=89AE}} =={{langname|zh}}== {{zh-forms|s=𲁖}} ==={{section|glyph origin}}=== {{Han etym}} ==={{section|pron}}=== {{zh-pron |m=yíng |c=ping1,jing4 |mc=y |oc=y |cat= }} ==={{section|dfn}}=== {{head|zh|hanzi}} # {{rfdef|zh}} ==={{section|ref}}=== * {{R:yu…”
2561514
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=147|rad=見|as=10|sn=17|four=99216|canj=FFBBU|ids=⿱𤇾見}}
===={{section|ref}}====
* {{Han ref|kx=1136.310|dkj=34943|hdz=63673.050|uh=89AE}}
=={{langname|zh}}==
{{zh-forms|s=𲁖}}
==={{section|glyph origin}}===
{{Han etym}}
==={{section|pron}}===
{{zh-pron
|m=yíng
|c=ping1,jing4
|mc=y
|oc=y
|cat=
}}
==={{section|dfn}}===
{{head|zh|hanzi}}
# {{rfdef|zh}}
==={{section|ref}}===
* {{R:yue:mfccd}}
8kyh9ymktgnfrpwp8e1opku80zr7n2i
ying2
0
415217
2561515
2026-09-07T15:36:48Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{ĐM|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|yíng}}”
2561515
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{ĐM|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|yíng}}
5gis24v0nf10ysqkayv5jx34ma913gj
yíng
0
415218
2561516
2026-09-07T15:38:31Z
Hiyuune
50834
Trang mới: “{{also|ying|Ying|yìng|yīng|yǐng|Yǐng|þing}} =={{langname|cmn}}== ==={{section|alt}}=== * {{alt|cmn|ying||nonstandard}} * {{alt|cmn|yíŋ||tốc ký rất hiếm gặp}} ==={{section|pron}}=== * {{audio|cmn|Zh-yíng.ogg}} ==={{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 o…”
2561516
wikitext
text/x-wiki
{{also|ying|Ying|yìng|yīng|yǐng|Yǐng|þing}}
=={{langname|cmn}}==
==={{section|alt}}===
* {{alt|cmn|ying||nonstandard}}
* {{alt|cmn|yíŋ||tốc ký rất hiếm gặp}}
==={{section|pron}}===
* {{audio|cmn|Zh-yíng.ogg}}
==={{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|熒}}
# {{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|鎣}}
igmw9h193y1zvuaxg00wjpvc595479p
ying
0
415219
2561517
2026-09-07T15:41:23Z
Hiyuune
50834
Trang mới: “{{also|Ying|yíng|yìng|yīng|yǐng|Yǐng|þing}} =={{langname|en}}== ==={{section|pron}}=== * {{IPA|en|/ˈjɪŋ/}} * {{audio|en|LL-Q1860 (eng)-Vealhurl-ying.wav|a=Southern England}} * {{rhymes|en|ɪŋ|s=1}} ==={{section|n}}=== {{en-noun}} # {{lb|en|MLE|slang|cũng là âm tiết lặp lại một phần}} {{alt form|en|ching}} ==={{section|v}}=== {{en-verb}} # {{lb|en|MLE|slang}} {{alt form|en|ching}} ==={{section|ana}}=== * {{anagrams|en|a=giny|iyng}} =={{langnam…”
2561517
wikitext
text/x-wiki
{{also|Ying|yíng|yìng|yīng|yǐng|Yǐng|þing}}
=={{langname|en}}==
==={{section|pron}}===
* {{IPA|en|/ˈjɪŋ/}}
* {{audio|en|LL-Q1860 (eng)-Vealhurl-ying.wav|a=Southern England}}
* {{rhymes|en|ɪŋ|s=1}}
==={{section|n}}===
{{en-noun}}
# {{lb|en|MLE|slang|cũng là âm tiết lặp lại một phần}} {{alt form|en|ching}}
==={{section|v}}===
{{en-verb}}
# {{lb|en|MLE|slang}} {{alt form|en|ching}}
==={{section|ana}}===
* {{anagrams|en|a=giny|iyng}}
=={{langname|enm}}==
==={{section|adj}}===
{{head|enm|Tính từ}}
# {{alt form|enm|yong}}
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin|notr=1}}
# {{nonstandard spelling of|cmn|sc=Latn|yīng}}
# {{nonstandard spelling of|cmn|sc=Latn|yíng}}
# {{nonstandard spelling of|cmn|sc=Latn|yǐng}}
# {{nonstandard spelling of|cmn|sc=Latn|yìng}}
sf4mrfuxbfxa1e9vgvahrsy8qln723w
yíŋ
0
415220
2561518
2026-09-07T15:42:07Z
Hiyuune
50834
Trang mới: “{{also|yīŋ|yǐŋ|yìŋ}} =={{langname|cmn}}== ==={{ĐM|rom}}=== {{cmn-pinyin|notr=1}} # {{rare sp|cmn|sc=Latn|yíng}} ===={{ĐM|usage}}==== * {{cmn-abbreviated-note}}”
2561518
wikitext
text/x-wiki
{{also|yīŋ|yǐŋ|yìŋ}}
=={{langname|cmn}}==
==={{ĐM|rom}}===
{{cmn-pinyin|notr=1}}
# {{rare sp|cmn|sc=Latn|yíng}}
===={{ĐM|usage}}====
* {{cmn-abbreviated-note}}
mw1zs85ky2edr1en3eeg77v73qoz4wx
ping1
0
415221
2561519
2026-09-07T15:43:49Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|pīng}} =={{langname|yue}}== ==={{section|pron}}=== * {{IPA|yue|/pʰɪŋ˥/}} ==={{section|rom}}=== {{yue-jyut}} # {{yue-jyutping of|乒}}”
2561519
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|pīng}}
=={{langname|yue}}==
==={{section|pron}}===
* {{IPA|yue|/pʰɪŋ˥/}}
==={{section|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|乒}}
iw4v3sixqr3syrpwnepxgnwhtwi3wos
pīng
0
415222
2561520
2026-09-07T15:44:32Z
Hiyuune
50834
Trang mới: “{{also|ping|píng|pìng|Píng|pǐng}} =={{langname|cmn}}== ==={{ĐM|alt}}=== * {{alt|cmn|ping||nonstandard}} * {{alt|cmn|pīŋ||tốc ký rất hiếm gặp}} ==={{Đ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|頩}}”
2561520
wikitext
text/x-wiki
{{also|ping|píng|pìng|Píng|pǐng}}
=={{langname|cmn}}==
==={{ĐM|alt}}===
* {{alt|cmn|ping||nonstandard}}
* {{alt|cmn|pīŋ||tốc ký rất hiếm gặp}}
==={{Đ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|頩}}
b9u3trmh53l6lzjzz2fdcs9evqjm5bj
píng
0
415223
2561521
2026-09-07T15:45:29Z
Hiyuune
50834
Trang mới: “{{also|ping|pìng|Píng|pīng|pǐng}} =={{langname|cmn}}== ==={{ĐM|alt}}=== * {{alt|cmn|ping||nonstandard}} * {{alt|cmn|píŋ||tốc ký rất hiếm gặp}} ==={{ĐM|pron}}=== * {{audio|cmn|Zh-pí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 o…”
2561521
wikitext
text/x-wiki
{{also|ping|pìng|Píng|pīng|pǐng}}
=={{langname|cmn}}==
==={{ĐM|alt}}===
* {{alt|cmn|ping||nonstandard}}
* {{alt|cmn|píŋ||tốc ký rất hiếm gặp}}
==={{ĐM|pron}}===
* {{audio|cmn|Zh-pí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|鵧}}
43wd0vspppmxgxpqlbnyf7y2lfo2idz
jing4
0
415224
2561522
2026-09-07T15:58:06Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{ĐM|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|jìng}} =={{langname|yue}}== ==={{ĐM|pron}}=== * {{IPA|yue|/jɪŋ˩/}} ==={{ĐM|rom}}=== {{yue-jyut}} # {{yue-jyutping of|形}} # {{yue-jyutping of|型}} # {{yue-jyutping of|熒}} # {{yue-jyutping of|螢}}”
2561522
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{ĐM|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|jìng}}
=={{langname|yue}}==
==={{ĐM|pron}}===
* {{IPA|yue|/jɪŋ˩/}}
==={{ĐM|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|形}}
# {{yue-jyutping of|型}}
# {{yue-jyutping of|熒}}
# {{yue-jyutping of|螢}}
k40dwajsmztbpqrcq3lbslypxcvekwd
jìng
0
415225
2561523
2026-09-07T15:59:50Z
Hiyuune
50834
Trang mới: “{{also|jing|Jing|jīng|jǐng}} =={{langname|cmn}}== ==={{section|alt}}=== * {{alt|cmn|jing||nonstandard}} * {{alt|cmn|jìŋ||tốc ký rất hiếm gặp}} ==={{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…”
2561523
wikitext
text/x-wiki
{{also|jing|Jing|jīng|jǐng}}
=={{langname|cmn}}==
==={{section|alt}}===
* {{alt|cmn|jing||nonstandard}}
* {{alt|cmn|jìŋ||tốc ký rất hiếm gặp}}
==={{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|濪}}
# {{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|靖}}
9ur3383rgpuvvmhwjbkaolgl07cbpdn
jing
0
415226
2561524
2026-09-07T16:00:41Z
Hiyuune
50834
Trang mới: “{{also|Jing|jìng|jīng|jǐng}} =={{langname|cmn}}== ==={{ĐM|rom}}=== {{cmn-pinyin|notr=1}} # {{nonstandard spelling of|cmn|sc=Latn|jīng}} # {{nonstandard spelling of|cmn|sc=Latn|jǐng}} # {{nonstandard spelling of|cmn|sc=Latn|jìng}}”
2561524
wikitext
text/x-wiki
{{also|Jing|jìng|jīng|jǐng}}
=={{langname|cmn}}==
==={{ĐM|rom}}===
{{cmn-pinyin|notr=1}}
# {{nonstandard spelling of|cmn|sc=Latn|jīng}}
# {{nonstandard spelling of|cmn|sc=Latn|jǐng}}
# {{nonstandard spelling of|cmn|sc=Latn|jìng}}
ouwkp2yhrt29d2fiy83e3q0n7ofgnue
Mô đun:number list/data/bg
828
415227
2561525
2026-09-07T16:14:35Z
Hiyuune
50834
Trang mới: “local export = {numbers = {}} export.additional_number_types = { {key = "male_person_cardinal", after = "cardinal"}, {key = "approximative", after = "adverbial"} } local numbers = export.numbers -- WARNING: Some of the stresses here may be wrong, as sources sometimes disagree or have mistakes. numbers[0] = { cardinal = "ну́ла", ordinal = "ну́лев", } numbers[1] = { cardinal = "еди́н", ordinal = "пъ́рви", ordinal_abbr = "1-ви", adverbial…”
2561525
Scribunto
text/plain
local export = {numbers = {}}
export.additional_number_types = {
{key = "male_person_cardinal", after = "cardinal"},
{key = "approximative", after = "adverbial"}
}
local numbers = export.numbers
-- WARNING: Some of the stresses here may be wrong, as sources sometimes disagree or have mistakes.
numbers[0] = {
cardinal = "ну́ла",
ordinal = "ну́лев",
}
numbers[1] = {
cardinal = "еди́н",
ordinal = "пъ́рви",
ordinal_abbr = "1-ви",
adverbial = {"веднъж", "[[еди́н]] [[път]]", "еднокра́тно"}
}
numbers[2] = {
cardinal = "два",
male_person_cardinal = "два́ма",
ordinal = "вто́ри",
ordinal_abbr = "2-ри",
adverbial = {"[[два́]] [[пъ́ти]]", "дваж", "двукра́тно"},
fractional = {"полови́на", "[[една́]] [[вто́ра]]"}
}
numbers[3] = {
cardinal = "три",
male_person_cardinal = "три́ма",
ordinal = "тре́ти",
ordinal_abbr = "3-ти",
adverbial = {"[[три́]] [[пъ́ти]]", "триж", "трикра́тно"},
fractional = {"[[една]]́ [[тре́та]]", "трети́на"}
}
numbers[4] = {
cardinal = "че́тири",
male_person_cardinal = "четири́ма",
ordinal = "четвъ́рти",
ordinal_abbr = "4-ти",
adverbial = {"[[че́тири]] [[пъ́ти]]", "четирикра́тно"},
fractional = {"[[една]]́ [[че́твърт]]", "четвърти́на"}
}
numbers[5] = {
cardinal = "пет",
male_person_cardinal = "пети́ма",
ordinal = "пе́ти",
ordinal_abbr = "5-и",
adverbial = {"[[пе́т]] [[пъ́ти]]", "петкра́тно"},
fractional = "[[една́]] [[пе́та]]"
}
numbers[6] = {
cardinal = "шест",
male_person_cardinal = "шести́ма",
ordinal = "ше́сти",
ordinal_abbr = "6-и",
adverbial = {"[[ше́ст]] [[пъ́ти]]", "шесткра́тно"},
fractional = "[[една́]] [[ше́ста]]"
}
numbers[7] = {
cardinal = "се́дем",
male_person_cardinal = "седми́на",
ordinal = "се́дми",
ordinal_abbr = "7-и",
adverbial = {"[[се́дем]] [[пъ́ти]]", "седемкра́тно", "седмокра́тно"},
fractional = "[[една́]] [[се́дма]]"
}
numbers[8] = {
cardinal = "о́сем",
male_person_cardinal = "осми́на",
ordinal = "о́сми",
ordinal_abbr = "8-и",
adverbial = {"[[о́сем]] [[пъ́ти]]", "осемкра́тно", "осмокра́тно"},
fractional = "[[една́]] [[о́сма]]"
}
numbers[9] = {
cardinal = "де́вет",
male_person_cardinal = "девети́ма",
ordinal = "деве́ти",
ordinal_abbr = "9-и",
adverbial = {"[[де́вет]] [[пъ́ти]]", "деветкра́тно"},
fractional = "[[една́]] [[деве́та]]"
}
numbers[10] = {
cardinal = "де́сет",
male_person_cardinal = "десети́ма",
ordinal = "десе́ти",
ordinal_abbr = "10-и",
adverbial = {"[[де́сет]] [[пъ́ти]]", "десеткра́тно"},
approximative = "десети́на",
fractional = "[[една́]] [[десе́та]]"
}
numbers[11] = {
cardinal = {"едина́десет", "едина́йсет"},
male_person_cardinal = "единайсети́ма",
ordinal = {"едина́десети", "едина́йсети"},
ordinal_abbr = "11-и",
fractional = "[[една́]] [[едина́йсета]]"
}
numbers[12] = {
cardinal = {"двана́десет", "двана́йсет"},
male_person_cardinal = "дванайсети́ма",
ordinal = {"двана́десети", "двана́йсети"},
ordinal_abbr = "12-и",
fractional = "[[една́]] [[двана́йсета]]"
}
numbers[13] = {
cardinal = {"трина́десет", "трина́йсет"},
male_person_cardinal = "тринайсети́ма",
ordinal = {"трина́десети", "трина́йсети"},
ordinal_abbr = "13-и",
fractional = "[[една́]] [[трина́йсета]]"
}
numbers[14] = {
cardinal = {"четирина́десет", "четирина́йсет"},
male_person_cardinal = "четиринайсети́ма",
ordinal = {"четирина́десети", "четирина́йсети"},
ordinal_abbr = "14-и",
fractional = "[[една́]] [[четирина́йсета]]"
}
numbers[15] = {
cardinal = {"петна́десет", "петна́йсет"},
male_person_cardinal = "петнайсети́ма",
ordinal = {"петна́десети", "петна́йсети"},
ordinal_abbr = "15-и",
fractional = "[[една́]] [[петна́йсета]]"
}
numbers[16] = {
cardinal = {"шестна́десет", "шестна́йсет"},
male_person_cardinal = "шестнайсети́ма",
ordinal = {"шестна́десети", "шестна́йсети"},
ordinal_abbr = "16-и",
fractional = "[[една́]] [[шестна́йсета]]"
}
numbers[17] = {
cardinal = {"седемна́десет", "седемна́йсет"},
male_person_cardinal = "седемнайсети́ма",
ordinal = {"седемна́десети", "седемна́йсети"},
ordinal_abbr = "17-и",
fractional = "[[една́]] [[седемна́йсета]]"
}
numbers[18] = {
cardinal = {"осемна́десет", "осемна́йсет"},
male_person_cardinal = "осемнайсети́ма",
ordinal = {"осемна́десети", "осемна́йсети"},
ordinal_abbr = "18-и",
fractional = "[[една́]] [[осемна́йсета]]"
}
numbers[19] = {
cardinal = {"деветна́десет", "деветна́йсет"},
male_person_cardinal = "деветнайсети́ма",
ordinal = {"деветна́десети", "деветна́йсети"},
ordinal_abbr = "19-и",
fractional = "[[една́]] [[деветна́йсета]]"
}
numbers[20] = {
cardinal = {"два́десет", "два́йсет"},
male_person_cardinal = "двайсети́ма",
ordinal = {"два́десети", "два́йсети"},
ordinal_abbr = "20-и",
approximative = "два́десетина",
fractional = "[[една́]] [[два́йсета]]"
}
numbers[21] = {
cardinal = {"два́десет и еди́н", "два́йсет и еди́н"},
ordinal = {"два́десет и пъ́рви", "два́йсет и пъ́рви"},
ordinal_abbr = "21-ви"
}
numbers[22] = {
cardinal = {"два́десет и два́", "два́йсет и два́"},
male_person_cardinal = "два́йсет и два́ма",
ordinal = {"два́десет и вто́ри", "два́йсет и вто́ри"},
ordinal_abbr = "22-ри"
}
numbers[23] = {
cardinal = {"два́десет и три́", "два́йсет и три́"},
male_person_cardinal = "два́десет и три́ма",
ordinal = {"два́йсет и тре́ти", "два́йсет и тре́ти"},
ordinal_abbr = "23-ти"
}
numbers[24] = {
cardinal = {"два́десет и че́тири", "два́йсет и че́тири"},
male_person_cardinal = "два́йсет и четири́ма",
ordinal = {"два́десет и четвъ́рти", "два́йсет и четвъ́рти"},
ordinal_abbr = "24-ти"
}
numbers[25] = {
cardinal = {"два́десет и пе́т", "два́йсет и пе́т"},
male_person_cardinal = "два́йсет и пети́ма",
ordinal = {"два́десет и пе́ти", "два́йсет и пе́ти"},
ordinal_abbr = "25-и"
}
numbers[26] = {
cardinal = {"два́десет и ше́ст", "два́йсет и ше́ст"},
male_person_cardinal = "два́йсет и шести́ма",
ordinal = {"два́десет и ше́сти", "два́йсет и ше́сти"},
ordinal_abbr = "26-и"
}
numbers[27] = {
cardinal = {"два́десет и се́дем", "два́йсет и се́дем"},
male_person_cardinal = "два́йсет и седми́на",
ordinal = {"два́десет и се́дми", "два́йсет и се́дми"},
ordinal_abbr = "27-и"
}
numbers[28] = {
cardinal = {"два́десет и о́сем", "два́йсет и о́сем"},
male_person_cardinal = "два́йсет и осми́на",
ordinal = {"два́десет и о́сми", "два́йсет и о́сми"},
ordinal_abbr = "28-и"
}
numbers[29] = {
cardinal = {"два́десет и де́вет", "два́йсет и де́вет"},
male_person_cardinal = "два́йсет и девети́ма",
ordinal = {"два́десет и деве́ти", "два́йсет и деве́ти"},
ordinal_abbr = "29-и"
}
numbers[30] = {
cardinal = {"три́десет", "три́йсет"},
male_person_cardinal = "трийсети́ма",
ordinal = {"три́десети", "три́йсети"},
ordinal_abbr = "30-и",
approximative = "тридесети́на",
fractional = "[[една́]] [[три́йсета]]"
}
numbers[31] = {
cardinal = {"три́десет и еди́н", "три́йсет и еди́н"},
ordinal = {"три́десет и пъ́рви", "три́йсет и пъ́рви"}
}
numbers[32] = {
cardinal = {"три́десет и два́", "три́йсет и два́"},
ordinal = {"три́десет и вто́ри", "три́йсет и вто́ри"}
}
numbers[33] = {
cardinal = {"три́десет и три́", "три́йсет и три́"},
ordinal = {"три́десет и тре́ти", "три́йсет и тре́ти"}
}
numbers[34] = {
cardinal = {"три́десет и че́тири", "три́йсет и че́тири"},
ordinal = {"три́десет и четвъ́рти", "три́йсет и четвъ́рти"}
}
numbers[35] = {
cardinal = {"три́десет и пе́т", "три́йсет и пе́т"},
ordinal = {"три́десет и пе́ти", "три́йсет и пе́ти"}
}
numbers[36] = {
cardinal = {"три́десет и ше́ст", "три́йсет и ше́ст"},
ordinal = {"три́десет и ше́сти", "три́йсет и ше́сти"}
}
numbers[37] = {
cardinal = {"три́десет и се́дем", "три́йсет и се́дем"},
ordinal = {"три́десет и се́дми", "три́йсет и се́дми"}
}
numbers[38] = {
cardinal = {"три́десет и о́сем", "три́йсет и о́сем"},
ordinal = {"три́десет и о́сми", "три́йсет и о́сми"}
}
numbers[39] = {
cardinal = {"три́десет и де́вет", "три́йсет и де́вет"},
ordinal = {"три́десет и деве́ти", "три́йсет и деве́ти"}
}
numbers[40] = {
cardinal = {"четири́десет", "чети́ресет"},
ordinal = {"четири́десети", "чети́ресети"},
approximative = "четири́десетина",
fractional = "[[една́]] [[чети́ресета]]"
}
numbers[41] = {
cardinal = {"четири́десет и еди́н", "чети́ресет и еди́н"},
ordinal = {"четири́десет и пъ́рви", "чети́ресет и пъ́рви"}
}
numbers[42] = {
cardinal = {"четири́десет и два́", "чети́ресет и два́"},
ordinal = {"четири́десет и вто́ри", "чети́ресет и вто́ри"}
}
numbers[43] = {
cardinal = {"четири́десет и три́", "чети́ресет и три́"},
ordinal = {"четири́десет и тре́ти", "чети́ресет и тре́ти"}
}
numbers[44] = {
cardinal = {"четири́десет и че́тири", "чети́ресет и че́тири"},
ordinal = {"четири́десет и четвъ́рти", "чети́ресет и четвъ́рти"}
}
numbers[45] = {
cardinal = {"четири́десет и пе́т", "чети́ресет и пе́т"},
ordinal = {"четири́десет и пе́ти", "чети́ресет и пе́ти"}
}
numbers[46] = {
cardinal = {"четири́десет и ше́ст", "чети́ресет и ше́ст"},
ordinal = {"четири́десет и ше́сти", "чети́ресет и ше́сти"}
}
numbers[47] = {
cardinal = {"четири́десет и се́дем", "чети́ресет и се́дем"},
ordinal = {"четири́десет и се́дми", "чети́ресет и се́дми"}
}
numbers[48] = {
cardinal = {"четири́десет и о́сем", "чети́ресет и о́сем"},
ordinal = {"четири́десет и о́сми", "чети́ресет и о́сми"}
}
numbers[49] = {
cardinal = {"четири́десет и де́вет", "чети́ресет и де́вет"},
ordinal = {"четири́десет и деве́ти", "чети́ресет и деве́ти"}
}
numbers[50] = {
cardinal = "петдесе́т",
ordinal = "петдесе́ти",
approximative = "петдесе́тина",
fractional = "[[една́]] [[петдесе́та]]"
}
numbers[51] = {
cardinal = "петдесе́т и еди́н",
ordinal = "петдесе́т и пъ́рви"
}
numbers[52] = {
cardinal = "петдесе́т и два́",
ordinal = "петдесе́т и вто́ри"
}
numbers[53] = {
cardinal = "петдесе́т и три́",
ordinal = "петдесе́т и тре́ти"
}
numbers[54] = {
cardinal = "петдесе́т и че́тири",
ordinal = "петдесе́т и четвъ́рти"
}
numbers[55] = {
cardinal = "петдесе́т и пе́т",
ordinal = "петдесе́т и пе́ти"
}
numbers[56] = {
cardinal = "петдесе́т и ше́ст",
ordinal = "петдесе́т и ше́сти"
}
numbers[57] = {
cardinal = "петдесе́т и се́дем",
ordinal = "петдесе́т и се́дми"
}
numbers[58] = {
cardinal = "петдесе́т и о́сем",
ordinal = "петдесе́т и о́сми"
}
numbers[59] = {
cardinal = "петдесе́т и де́вет",
ordinal = "петдесе́т и деве́ти"
}
numbers[60] = {
cardinal = {"шестдесе́т", "шейсе́т"},
ordinal = {"шестдесе́ти", "шейсе́ти"},
approximative = "шестдесе́тина",
fractional = "[[една́]] [[шейсе́та]]"
}
numbers[61] = {
cardinal = {"шестдесе́т и еди́н", "шейсе́т и еди́н"},
ordinal = {"шестдесе́т и пъ́рви", "шейсе́т и пъ́рви"}
}
numbers[62] = {
cardinal = {"шестдесе́т и два́", "шейсе́т и два́"},
ordinal = {"шестдесе́т и вто́ри", "шейсе́т и вто́ри"}
}
numbers[63] = {
cardinal = {"шестдесе́т и три́", "шейсе́т и три́"},
ordinal = {"шестдесе́т и тре́ти", "шейсе́т и тре́ти"}
}
numbers[64] = {
cardinal = {"шестдесе́т и че́тири", "шейсе́т и че́тири"},
ordinal = {"шестдесе́т и четвъ́рти", "шейсе́т и четвъ́рти"}
}
numbers[65] = {
cardinal = {"шестдесе́т и пе́т", "шейсе́т и пе́т"},
ordinal = {"шестдесе́т и пе́ти", "шейсе́т и пе́ти"}
}
numbers[66] = {
cardinal = {"шестдесе́т и ше́ст", "шейсе́т и ше́ст"},
ordinal = {"шестдесе́т и ше́сти", "шейсе́т и ше́сти"}
}
numbers[67] = {
cardinal = {"шестдесе́т и се́дем", "шейсе́т и се́дем"},
ordinal = {"шестдесе́т и се́дми", "шейсе́т и се́дми"}
}
numbers[68] = {
cardinal = {"шестдесе́т и о́сем", "шейсе́т и о́сем"},
ordinal = {"шестдесе́т и о́сми", "шейсе́т и о́сми"}
}
numbers[69] = {
cardinal = {"шестдесе́т и де́вет", "шейсе́т и де́вет"},
ordinal = {"шестдесе́т и деве́ти", "шейсе́т и деве́ти"}
}
numbers[70] = {
cardinal = "седемдесе́т",
ordinal = "седемдесе́ти",
approximative = "седемдесе́тина",
fractional = "[[една́]] [[седемдесе́та]]"
}
numbers[71] = {
cardinal = "седемдесе́т и еди́н",
ordinal = "седемдесе́т и пъ́рви"
}
numbers[72] = {
cardinal = "седемдесе́т и два́",
ordinal = "седемдесе́т и вто́ри"
}
numbers[73] = {
cardinal = "седемдесе́т и три́",
ordinal = "седемдесе́т и тре́ти"
}
numbers[74] = {
cardinal = "седемдесе́т и че́тири",
ordinal = "седемдесе́т и четвъ́рти"
}
numbers[75] = {
cardinal = "седемдесе́т и пе́т",
ordinal = "седемдесе́т и пе́ти"
}
numbers[76] = {
cardinal = "седемдесе́т и ше́ст",
ordinal = "седемдесе́т и ше́сти"
}
numbers[77] = {
cardinal = "седемдесе́т и се́дем",
ordinal = "седемдесе́т и се́дми"
}
numbers[78] = {
cardinal = "седемдесе́т и о́сем",
ordinal = "седемдесе́т и о́сми"
}
numbers[79] = {
cardinal = "седемдесе́т и де́вет",
ordinal = "седемдесе́т и деве́ти"
}
numbers[80] = {
cardinal = "осемдесе́т",
ordinal = "осемдесе́ти",
approximative = "осемдесе́тина",
fractional = "[[една́]] [[осемдесе́та]]"
}
numbers[81] = {
cardinal = "осемдесе́т и еди́н",
ordinal = "осемдесе́т и пъ́рви"
}
numbers[82] = {
cardinal = "осемдесе́т и два́",
ordinal = "осемдесе́т и вто́ри"
}
numbers[83] = {
cardinal = "осемдесе́т и три́",
ordinal = "осемдесе́т и тре́ти"
}
numbers[84] = {
cardinal = "осемдесе́т и че́тири",
ordinal = "осемдесе́т и четвъ́рти"
}
numbers[85] = {
cardinal = "осемдесе́т и пе́т",
ordinal = "осемдесе́т и пе́ти"
}
numbers[86] = {
cardinal = "осемдесе́т и ше́ст",
ordinal = "осемдесе́т и ше́сти"
}
numbers[87] = {
cardinal = "осемдесе́т и се́дем",
ordinal = "осемдесе́т и се́дми"
}
numbers[88] = {
cardinal = "осемдесе́т и о́сем",
ordinal = "осемдесе́т и о́сми"
}
numbers[89] = {
cardinal = "осемдесе́т и де́вет",
ordinal = "осемдесе́т и деве́ти"
}
numbers[90] = {
cardinal = "деветдесе́т",
ordinal = "деветдесе́ти",
approximative = "деветдесе́тина",
fractional = "[[една́]] [[деветдесе́та]]"
}
numbers[91] = {
cardinal = "деветдесе́т и еди́н",
ordinal = "деветдесе́т и пъ́рви"
}
numbers[92] = {
cardinal = "деветдесе́т и два́",
ordinal = "деветдесе́т и вто́ри"
}
numbers[93] = {
cardinal = "деветдесе́т и три́",
ordinal = "деветдесе́т и тре́ти"
}
numbers[94] = {
cardinal = "деветдесе́т и че́тири",
ordinal = "деветдесе́т и четвъ́рти"
}
numbers[95] = {
cardinal = "деветдесе́т и пе́т",
ordinal = "деветдесе́т и пе́ти"
}
numbers[96] = {
cardinal = "деветдесе́т и ше́ст",
ordinal = "деветдесе́т и ше́сти"
}
numbers[97] = {
cardinal = "деветдесе́т и се́дем",
ordinal = "деветдесе́т и се́дми"
}
numbers[98] = {
cardinal = "деветдесе́т и о́сем",
ordinal = "деветдесе́т и о́сми"
}
numbers[99] = {
cardinal = "деветдесе́т и де́вет",
ordinal = "деветдесе́т и деве́ти"
}
numbers[100] = {
cardinal = "сто",
ordinal = "сто́тен",
approximative = "стоти́на",
fractional = "[[една́]] [[сто́тна]]"
}
numbers[200] = {
cardinal = {"две́ста"},
ordinal = "двусто́тен",
approximative = "две́статина",
fractional = "[[една́]] [[двусто́тна]]"
}
numbers[300] = {
cardinal = "три́ста",
ordinal = "тристо́тен",
approximative = "три́статина",
fractional = "[[една́]] [[тристо́тна]]"
}
numbers[400] = {
cardinal = "че́тиристотин",
ordinal = "четиристо́тен",
approximative = "че́тирист́отина",
fractional = "[[една́]] [[че́тиристотна]]"
}
numbers[500] = {
cardinal = "пе́тстотин",
ordinal = "петсто́тен",
approximative = "пе́тстотина",
fractional = "[[една́]] [[пе́тстотна]]"
}
numbers[600] = {
cardinal = "ше́стстотин",
ordinal = "шестсто́тен",
approximative = "ше́стст́отина",
fractional = "[[една́]] [[ше́стстотна]]"
}
numbers[700] = {
cardinal = "се́демстотин",
ordinal = "седемсто́тен",
approximative = "се́демст́отина",
fractional = "[[една́]] [[се́демстотна]]"
}
numbers[800] = {
cardinal = "о́семстотин",
ordinal = "о́семстотен",
approximative = "о́семст́отина",
fractional = "[[една́]] [[о́семстотна]]"
}
numbers[900] = {
cardinal = "де́ветстотин",
ordinal = "де́ветстотен",
approximative = "де́ветстотина",
fractional = "[[една́]] [[де́ветстотна]]"
}
numbers[1000] = {
cardinal = "хиля́да",
ordinal = "хи́ляден",
fractional = "[[една́]] [[хи́лядна]]"
}
numbers[1000000] = {
cardinal = "милио́н",
ordinal = "милио́нен",
fractional = "[[една́]] [[милио́нна]]"
}
numbers[1000000000] = {
cardinal = "милиа́рд",
ordinal = "милиа́рден",
fractional = "[[една́]] [[милиа́рдна]]"
}
numbers[1000000000000] = {
cardinal = "трилио́н",
ordinal = "трилио́нен",
fractional = "[[една́]] [[трилио́нна]]"
}
return export
apftmjw02yha0fb1t07sbgay89eqra6
десет
0
415228
2561526
2026-09-07T16:14:45Z
Hiyuune
50834
Trang mới: “=={{langname|bg}}== {{wp|bg:}} {{number box|bg|10}} ==={{section|etym}}=== {{inh+|bg|cu|десѧть}}, từ {{inh|bg|sla-pro|*desętь}}, từ {{inh|bg|ine-bsl-pro|*déśimt}}, từ {{inh|bg|ine-pro|*déḱm̥t}}. ==={{section|pron}}=== {{bg-pr|де́сет|a=[KK]}} ==={{section|num}}=== {{head|bg|Số từ|head=де́сет}} # {{cln|bg|Số đếm}} [[mười|Mười]] (10). ===={{section|decl}}==== {{bg-ndecl|де́сет</n:pl/def_pl:десетте́:десет…”
2561526
wikitext
text/x-wiki
=={{langname|bg}}==
{{wp|bg:}}
{{number box|bg|10}}
==={{section|etym}}===
{{inh+|bg|cu|десѧть}}, từ {{inh|bg|sla-pro|*desętь}}, từ {{inh|bg|ine-bsl-pro|*déśimt}}, từ {{inh|bg|ine-pro|*déḱm̥t}}.
==={{section|pron}}===
{{bg-pr|де́сет|a=[KK]}}
==={{section|num}}===
{{head|bg|Số từ|head=де́сет}}
# {{cln|bg|Số đếm}} [[mười|Mười]] (10).
===={{section|decl}}====
{{bg-ndecl|де́сет</n:pl/def_pl:десетте́:десеття́х[d]>}}
===={{section|coord}}====
{{bg-cardinals}}
===={{section|rel}}====
* {{l|bg|деся́тък}}
* {{l|bg|десети́чен}}
=={{langname|mk}}==
{{number box|mk|10}}
==={{section|etym}}===
{{inh+|mk|sla-pro|*desętь}}, từ {{inh|mk|ine-bsl-pro|*déśimt}}, từ {{inh|mk|ine-pro|*déḱm̥t}}.
==={{section|pron}}===
* {{mk-IPA}}
* {{audio|mk|LL-Q9296 (mkd)-Bjankuloski06-десет.wav}}
==={{section|num}}===
{{head|mk|Số từ}}
# [[mười|Mười]] (10).
#: {{uxi|mk|'''Десе́т''' дена.|'''Mười''' ngày.}}
===={{section|decl}}====
{{mk-decl-num-три}}
===={{section|drv}}====
{{col4|mk
|десетти
|десетина
|десеттина
|десетмина
|десетици
|десет илјади
|десетка<g:f>
|десетче<g:n>
}}
{{C|mk|Số|Mười}}
=={{langname|sh}}==
==={{section|num}}===
{{inh+|sh|sla-pro|*desętь}}, từ {{inh|sh|ine-bsl-pro|*déśimt}}, từ {{inh|sh|ine-pro|*déḱm̥t}}.
==={{section|pron}}===
* {{IPA|sh|/dêset/}}
* {{audio|sh|Sr-deset.ogg}}
* {{hyphenation|sh|де|сет}}
==={{section|num}}===
{{sh-num|де̏сет}}
# [[mười|Mười]] (10).
{{C|sh|Mười}}
{{cln|sh|Số đếm}}
dfwgl7khnxhblxz0gmqdb5cmnc7v94m
Bản mẫu:mk-decl-num-nogender
10
415229
2561527
2026-09-07T16:17:31Z
Hiyuune
50834
Trang mới: “{{inflection-table-top|palette=amber|title=Biến cách của {{m|mk||{{pagename}}|tr=-}}|tall=yes}} ! bất định | {{#if:{{{ind|}}}|{{l-self|mk|{{{ind}}}}}|—}} |- ! xác định<br/>{{small|(không chỉ rõ)}} | {{#if:{{{def_unsp|}}}|{{l-self|mk|{{{def_unsp}}}|accel-form=unspecified{{!}}def{{!}}sg}}|—}} |- ! xác định<br/>{{small|(gần người nói)}} | {{#if:{{{def_prox|}}}|{{l-self|mk|{{{def_prox}}}|accel-form=prox{{!}}def{{!}}sg}}|—}} |- ! x…”
2561527
wikitext
text/x-wiki
{{inflection-table-top|palette=amber|title=Biến cách của {{m|mk||{{pagename}}|tr=-}}|tall=yes}}
! bất định
| {{#if:{{{ind|}}}|{{l-self|mk|{{{ind}}}}}|—}}
|-
! xác định<br/>{{small|(không chỉ rõ)}}
| {{#if:{{{def_unsp|}}}|{{l-self|mk|{{{def_unsp}}}|accel-form=unspecified{{!}}def{{!}}sg}}|—}}
|-
! xác định<br/>{{small|(gần người nói)}}
| {{#if:{{{def_prox|}}}|{{l-self|mk|{{{def_prox}}}|accel-form=prox{{!}}def{{!}}sg}}|—}}
|-
! xác định<br/>{{small|(xa người nói)}}
| {{#if:{{{def_dist|}}}|{{l-self|mk|{{{def_dist}}}|accel-form=distal{{!}}def{{!}}sg}}|—}}
{{inflection-table-bottom}}<!--
--><noinclude>{{documentation}}</noinclude>
9fvf5u50t6zt3aqnm89tpal375ihj9l
Bản mẫu:mk-decl-num-три
10
415230
2561528
2026-09-07T16:18:09Z
Hiyuune
50834
Trang mới: “{{mk-decl-num-nogender |ind={{pagename}} |def_unsp={{pagename}}те |def_prox={{pagename}}ве |def_dist={{pagename}}не }}<!-- --><noinclude>{{documentation}}</noinclude>”
2561528
wikitext
text/x-wiki
{{mk-decl-num-nogender
|ind={{pagename}}
|def_unsp={{pagename}}те
|def_prox={{pagename}}ве
|def_dist={{pagename}}не
}}<!--
--><noinclude>{{documentation}}</noinclude>
mo2q2hlkmlqk7e5e048x9tek8ghehsu
Mô đun:number list/data/my
828
415231
2561529
2026-09-07T16:23:15Z
Hiyuune
50834
Trang mới: “local export = {} local numbers = {} export.numbers = numbers export.numeral_config = { zero_codepoint = 0x1040, -- ၀, MYANMAR DIGIT ZERO } numbers[0] = { cardinal = "သုည" } numbers[1] = { cardinal = "တစ်", ordinal = { "ပဌမ", "ပထမ" }, } numbers[2] = { cardinal = { "နှစ်" }, ordinal = { "ဒုတိယ" }, } numbers[3] = { cardinal = "သုံး", ordinal = { "တတိယ" }, } numbers[4] = { cardinal = "လေး", or…”
2561529
Scribunto
text/plain
local export = {}
local numbers = {}
export.numbers = numbers
export.numeral_config = {
zero_codepoint = 0x1040, -- ၀, MYANMAR DIGIT ZERO
}
numbers[0] = {
cardinal = "သုည"
}
numbers[1] = {
cardinal = "တစ်",
ordinal = { "ပဌမ", "ပထမ" },
}
numbers[2] = {
cardinal = { "နှစ်" },
ordinal = { "ဒုတိယ" },
}
numbers[3] = {
cardinal = "သုံး",
ordinal = { "တတိယ" },
}
numbers[4] = {
cardinal = "လေး",
ordinal = { "စတုတ္ထ" },
}
numbers[5] = {
cardinal = "ငါး",
ordinal = { "ပဉ္စမ" },
}
numbers[6] = {
cardinal = "ခြောက်",
ordinal = { "ဆဋ္ဌမ" },
}
numbers[7] = {
cardinal = { "ခုနစ်", "ခုနှစ်" },
ordinal = { "သတ္တမ" },
}
numbers[8] = {
cardinal = "ရှစ်",
ordinal = { "အဋ္ဌမ" },
}
numbers[9] = {
cardinal = "ကိုး",
ordinal = { "နဝမ" },
}
numbers[10] = {
cardinal = { "ဆယ်", "တဆယ်", "တစ်ဆယ်" },
ordinal = { "ဒသမ" },
}
numbers[11] = {
cardinal = { "ဆယ့်တစ်" },
ordinal = { "ဧကာဒသမ" },
}
numbers[12] = {
cardinal = { "ဆယ့်နှစ်" },
ordinal = { "ဒွါဒသ" },
}
numbers[13] = {
cardinal = { "ဆယ့်သုံး" },
}
numbers[14] = {
cardinal = { "ဆယ့်လေး" },
}
numbers[15] = {
cardinal = { "ဆယ့်ငါး" },
}
numbers[16] = {
cardinal = { "ဆယ့်ခြောက်" },
}
numbers[17] = {
cardinal = { "ဆယ့်ခုနှစ်" },
}
numbers[18] = {
cardinal = { "ဆယ့်ရှစ်" },
}
numbers[20] = {
cardinal = { "နှစ်ဆယ်" },
}
numbers[30] = {
cardinal = { "သုံးဆယ်" },
}
numbers[40] = {
cardinal = { "လေးဆယ်" },
}
numbers[50] = {
cardinal = { "ငါးဆယ်" },
}
numbers[60] = {
cardinal = { "ခြောက်ဆယ်" },
}
numbers[70] = {
cardinal = { "ခုနစ်ဆယ်" },
}
numbers[80] = {
cardinal = { "ရှစ်ဆယ်" },
}
numbers[90] = {
cardinal = { "ကိုးဆယ်" },
}
numbers[100] = {
cardinal = { "ရာ" },
}
numbers[1000] = {
cardinal = { "ထောင်" },
}
numbers[10000] = {
cardinal = { "သောင်း" },
}
numbers[100000] = {
cardinal = { "သိန်း" },
}
numbers[1000000] = {
cardinal = { "သန်း" },
}
numbers[10000000] = {
cardinal = { "ကုဋေ" },
}
numbers[100000000000000] = {
cardinal = { "ကောဋိ" },
}
numbers[1000000000000000000000] = {
cardinal = { "ပကောဋိ" },
}
numbers[10000000000000000000000000000] = {
cardinal = { "ကောဋိပကောဋိ" },
}
return export
7jcg1uy5if4tp50z4dv29ixuwgc43nk
တဆယ်
0
415232
2561531
2026-09-07T16:24:12Z
Hiyuune
50834
Trang mới: “{{also|တဆံယဲၢ်}} =={{langname|my}}== {{number box|my|10}} ==={{section|alt}}=== * {{l|my|တစ်ဆယ်}} ==={{section|pron}}=== * {{my-IPA|တ'+ဆယ်}} ==={{section|num}}=== {{my-numeral|၁၀|c}} # [[mười|Mười]].”
2561531
wikitext
text/x-wiki
{{also|တဆံယဲၢ်}}
=={{langname|my}}==
{{number box|my|10}}
==={{section|alt}}===
* {{l|my|တစ်ဆယ်}}
==={{section|pron}}===
* {{my-IPA|တ'+ဆယ်}}
==={{section|num}}===
{{my-numeral|၁၀|c}}
# [[mười|Mười]].
csyc45hlp5m9nc9s3246rxbqkwrkxld
Mô đun:zh/data/och-pron-ZS/覮
828
415233
2561533
2026-09-08T00:42:59Z
Hiyuune
50834
Trang mới: “return { { "15359", "熒", "耕", "0", "竮", "pqʰʷeːŋ", "淮南子也從目" }, }”
2561533
Scribunto
text/plain
return {
{ "15359", "熒", "耕", "0", "竮", "pqʰʷeːŋ", "淮南子也從目" },
}
8h8tyinz6i781izn90u546soytaqwxv
Thể loại:Chữ Hán phồn thể
14
415234
2561537
2026-09-08T00:48:07Z
Hiyuune
50834
Trang mới: “{{auto cat}}”
2561537
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Mô đun:nod-alt
828
415235
2561538
2026-09-08T00:54:21Z
Hiyuune
50834
Trang mới: “local export = {} local links = require("Module:links") local gsub = mw.ustring.gsub local lang = require("Module:languages").getByCode("nod") local script1 = require("Module:scripts").getByCode("Lana") local script2 = require("Module:scripts").getByCode("Thai") local PAGENAME = mw.title.getCurrentTitle().text function export.show(frame) local args = frame:getParent().args local common = args["c"] or args["common"] local commonForms = (common and mw.text.split(comm…”
2561538
Scribunto
text/plain
local export = {}
local links = require("Module:links")
local gsub = mw.ustring.gsub
local lang = require("Module:languages").getByCode("nod")
local script1 = require("Module:scripts").getByCode("Lana")
local script2 = require("Module:scripts").getByCode("Thai")
local PAGENAME = mw.title.getCurrentTitle().text
function export.show(frame)
local args = frame:getParent().args
local common = args["c"] or args["common"]
local commonForms = (common and mw.text.split(common, ",", true) or {})
local nonstandard = args["ns"] or args["nonstandard"]
local nonstandardForms = (nonstandard and mw.text.split(nonstandard, ",", true) or {})
local transliteration = args["tl"] or args["l"] or args["transliteration"]
local transliteratedForms = (transliteration and mw.text.split(transliteration, ",", true) or {})
local transcription = args["ts"] or args["s"] or args["transcription"]
local transcribedForms = (transcription and mw.text.split(transcription, ",", true) or {})
local transliterationAndTranscription = args["tlts"] or args["tstl"] or args["ls"] or args["sl"] or args["~"]
local transliteratedAndTranscribedForms = (transliterationAndTranscription and mw.text.split(transliterationAndTranscription, ",", true) or {})
local followingThai = args["fth"] or args["ft"] or args["f"] or args["followingThai"]
local followedThaiForms = (followingThai and mw.text.split(followingThai, ",", true) or {})
local altForms = { ["common"] = commonForms, ["nonstandard"] = nonstandardForms, ["transliteration"] = transliteratedForms, ["transcription"] = transcribedForms, ["transliterationAndTranscription"] = transliteratedAndTranscribedForms, ["followingThai"] = followedThaiForms}
local output = "<ul>"
for _,term in ipairs(altForms.common) do
output = output .. "<li>" .. links.full_link({lang = lang, term = term, sc = script1}) .. "</li>"
end
for _,term in ipairs(altForms.nonstandard) do
output = output .. "<li>(<i>ไม่มาตรฐาน</i>) " .. links.full_link({lang = lang, term = term, sc = script1}) .. "</li>"
end
for _,term in ipairs(altForms.transliteration) do
output = output .. "<li>(<i>รูปสะกดอักษรไทย</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
for _,term in ipairs(altForms.transcription) do
output = output .. "<li>(<i>รูปสะกดออกเสียง</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
for _,term in ipairs(altForms.transliterationAndTranscription) do
output = output .. "<li>(<i>รูปสะกดอักษรไทย, รูปสะกดออกเสียง</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
for _,term in ipairs(altForms.followingThai) do
output = output .. "<li>(<i>ยืมรูปภาษาไทย</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
output = output .. "</ul>"
return output
end
return export
7b91t2o69kvpm6ryhsxa08umvo5nkjv
2561540
2561538
2026-09-08T00:57:28Z
Hiyuune
50834
2561540
Scribunto
text/plain
local export = {}
local links = require("Module:links")
local gsub = mw.ustring.gsub
local lang = require("Module:languages").getByCode("nod")
local script1 = require("Module:scripts").getByCode("Lana")
local script2 = require("Module:scripts").getByCode("Thai")
local PAGENAME = mw.title.getCurrentTitle().text
function export.show(frame)
local args = frame:getParent().args
local common = args["c"] or args["common"]
local commonForms = (common and mw.text.split(common, ",", true) or {})
local nonstandard = args["ns"] or args["nonstandard"]
local nonstandardForms = (nonstandard and mw.text.split(nonstandard, ",", true) or {})
local transliteration = args["tl"] or args["l"] or args["transliteration"]
local transliteratedForms = (transliteration and mw.text.split(transliteration, ",", true) or {})
local transcription = args["ts"] or args["s"] or args["transcription"]
local transcribedForms = (transcription and mw.text.split(transcription, ",", true) or {})
local transliterationAndTranscription = args["tlts"] or args["tstl"] or args["ls"] or args["sl"] or args["~"]
local transliteratedAndTranscribedForms = (transliterationAndTranscription and mw.text.split(transliterationAndTranscription, ",", true) or {})
local followingThai = args["fth"] or args["ft"] or args["f"] or args["followingThai"]
local followedThaiForms = (followingThai and mw.text.split(followingThai, ",", true) or {})
local altForms = { ["common"] = commonForms, ["nonstandard"] = nonstandardForms, ["transliteration"] = transliteratedForms, ["transcription"] = transcribedForms, ["transliterationAndTranscription"] = transliteratedAndTranscribedForms, ["followingThai"] = followedThaiForms}
local output = "<ul>"
for _,term in ipairs(altForms.common) do
output = output .. "<li>" .. links.full_link({lang = lang, term = term, sc = script1}) .. "</li>"
end
for _,term in ipairs(altForms.nonstandard) do
output = output .. "<li>(<i>không tiêu chuẩn</i>) " .. links.full_link({lang = lang, term = term, sc = script1}) .. "</li>"
end
for _,term in ipairs(altForms.transliteration) do
output = output .. "<li>(<i>chuyển tự</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
for _,term in ipairs(altForms.transcription) do
output = output .. "<li>(<i>phiên âm</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
for _,term in ipairs(altForms.transliterationAndTranscription) do
output = output .. "<li>(<i>chuyển tự và phiên âm</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
for _,term in ipairs(altForms.followingThai) do
output = output .. "<li>(<i>chữ Thái</i>) " .. links.full_link({lang = lang, term = term, sc = script2}) .. "</li>"
end
output = output .. "</ul>"
return output
end
return export
p2imp8t3lijiwye6gqcwfyd6gbu3db0
Bản mẫu:nod-alt
10
415236
2561539
2026-09-08T00:55:10Z
Hiyuune
50834
Trang mới: “<includeonly>{{#invoke:nod-alt|show}}</includeonly><noinclude>{{documentation}}</noinclude>”
2561539
wikitext
text/x-wiki
<includeonly>{{#invoke:nod-alt|show}}</includeonly><noinclude>{{documentation}}</noinclude>
fugnbotq9fi8wdn2pqx7iv76kruu9gi
ᩁᩮᩬᩥᩋᨷᩥ᩠ᨶ
0
415237
2561541
2026-09-08T00:58:00Z
Hiyuune
50834
Trang mới: “=={{langname|nod}}== ==={{section|alt}}=== {{nod-alt|l=เรือบิน|s=เฮือบิน}} ==={{section|etym}}=== {{com|nod|ᩁᩮᩬᩥᩋ|ᨷᩥ᩠ᨶ}}; có liên quan đến {{cog|khb|ᦵᦣᦲᦢᦲᧃ}}, {{cog|lo|ເຮືອບິນ}}, {{cog|shn|ႁိူဝ်းမိၼ်}}, {{cog|th|เรือบิน}} ==={{section|pron}}=== * {{IPA|nod|/hɯa˧˧.bin˧˧/|a=Chiang Mai}} ==={{section|n}}=== {{nod-noun|ᩃᩣᩴ}} # [[máy bay|Máy bay]] =…”
2561541
wikitext
text/x-wiki
=={{langname|nod}}==
==={{section|alt}}===
{{nod-alt|l=เรือบิน|s=เฮือบิน}}
==={{section|etym}}===
{{com|nod|ᩁᩮᩬᩥᩋ|ᨷᩥ᩠ᨶ}}; có liên quan đến {{cog|khb|ᦵᦣᦲᦢᦲᧃ}}, {{cog|lo|ເຮືອບິນ}}, {{cog|shn|ႁိူဝ်းမိၼ်}}, {{cog|th|เรือบิน}}
==={{section|pron}}===
* {{IPA|nod|/hɯa˧˧.bin˧˧/|a=Chiang Mai}}
==={{section|n}}===
{{nod-noun|ᩃᩣᩴ}}
# [[máy bay|Máy bay]]
==={{section|ref}}===
* {{R:nod:LannaDic}}
ofvl5do1xaztm7dg7y1x16m66hzuzhj
ႁိူဝ်းမိၼ်
0
415238
2561542
2026-09-08T01:00:36Z
Hiyuune
50834
Trang mới: “=={{langname|shn}}== ==={{section|etym}}=== {{af|shn|ႁိူဝ်း|မိၼ်}}; so sánh với {{cog|th|เรือบิน}} và {{cog|lo|ເຮືອບິນ}}. ==={{section|pron}}=== {{shn-pron|ႁိူဝ်း-မိၼ်}} ==={{section|n}}=== {{shn-noun}} # [[máy bay|Máy bay]]. ===={{section|syn}}==== {{col4|shn|လေႇယိၼ်ႇပျၢၼ်ႇ |လဵင်ႇပျၢၼ်ႇ |ၶိူင်ႈမိၼ် }}”
2561542
wikitext
text/x-wiki
=={{langname|shn}}==
==={{section|etym}}===
{{af|shn|ႁိူဝ်း|မိၼ်}}; so sánh với {{cog|th|เรือบิน}} và {{cog|lo|ເຮືອບິນ}}.
==={{section|pron}}===
{{shn-pron|ႁိူဝ်း-မိၼ်}}
==={{section|n}}===
{{shn-noun}}
# [[máy bay|Máy bay]].
===={{section|syn}}====
{{col4|shn|လေႇယိၼ်ႇပျၢၼ်ႇ
|လဵင်ႇပျၢၼ်ႇ
|ၶိူင်ႈမိၼ်
}}
svhe21r5mdl2vd9l14sulq1edppp5y3
ବିମାନ
0
415239
2561543
2026-09-08T01:03:07Z
Hiyuune
50834
Trang mới: “=={{langname|or}}== ==={{section|pron}}=== * {{audio|or|LL-Q33810 (ori)-Psubhashish-ବିମାନ.wav}} * {{audio|or|LL-Q33810 (ori)-Sangram Keshari Senapati (Ssgapu22)-ବିମାନ.wav}} ==={{section|n}}=== {{or-noun}} # [[máy bay|Máy bay]], [[khinh khí cầu]].”
2561543
wikitext
text/x-wiki
=={{langname|or}}==
==={{section|pron}}===
* {{audio|or|LL-Q33810 (ori)-Psubhashish-ବିମାନ.wav}}
* {{audio|or|LL-Q33810 (ori)-Sangram Keshari Senapati (Ssgapu22)-ବିମାନ.wav}}
==={{section|n}}===
{{or-noun}}
# [[máy bay|Máy bay]], [[khinh khí cầu]].
fqhzs35jeakb5vzoyk7ij9y881b649s
derelictio
0
415240
2561545
2026-09-08T01:06:45Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|etym}}=== {{ety|la|title=dērelictiō|:af|dērelinquō|-tiō|text=+|tree=1}} ==={{section|pron}}=== * {{la-IPA|dērelictiō|eccl=1}} ==={{section|n}}=== {{la-noun|dērelictiō<3>}} # Sự [[sao nhãng]]; sự không [[để ý]]. # Sự [[từ bỏ]], sự [[bỏ rơi]], sự [[ruồng bỏ]]. ===={{section|decl}}==== {{la-ndecl|dērelictiō<3>}} ===={{section|desc}}==== * {{desc|en|dereliction|bor=1}} * {{desc|it|derelizione|bor=1}}…”
2561545
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|etym}}===
{{ety|la|title=dērelictiō|:af|dērelinquō|-tiō|text=+|tree=1}}
==={{section|pron}}===
* {{la-IPA|dērelictiō|eccl=1}}
==={{section|n}}===
{{la-noun|dērelictiō<3>}}
# Sự [[sao nhãng]]; sự không [[để ý]].
# Sự [[từ bỏ]], sự [[bỏ rơi]], sự [[ruồng bỏ]].
===={{section|decl}}====
{{la-ndecl|dērelictiō<3>}}
===={{section|desc}}====
* {{desc|en|dereliction|bor=1}}
* {{desc|it|derelizione|bor=1}}
* {{desc|es|derelicción|bor=1}}
==={{section|ref}}===
* {{R:la:L&S}}
* {{R:la:Elementary Lewis}}
* {{R:la:Gaffiot}}
refh3mz750ewvxfrbs2fhrlwf1dq35m
2561546
2561545
2026-09-08T01:07:14Z
Hiyuune
50834
/* Danh từ */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561546
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|etym}}===
{{ety|la|title=dērelictiō|:af|dērelinquō|-tiō|text=+|tree=1}}
==={{section|pron}}===
* {{la-IPA|dērelictiō|eccl=1}}
==={{section|n}}===
{{la-noun|dērelictiō<3>}}
# Sự [[xao nhãng]]; sự không [[để ý]].
# Sự [[từ bỏ]], sự [[bỏ rơi]], sự [[ruồng bỏ]].
===={{section|decl}}====
{{la-ndecl|dērelictiō<3>}}
===={{section|desc}}====
* {{desc|en|dereliction|bor=1}}
* {{desc|it|derelizione|bor=1}}
* {{desc|es|derelicción|bor=1}}
==={{section|ref}}===
* {{R:la:L&S}}
* {{R:la:Elementary Lewis}}
* {{R:la:Gaffiot}}
46hj3c8tjwhoecm69bmwl49pst04bin
derelinquo
0
415241
2561547
2026-09-08T01:09:26Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|etym}}=== {{ety|la|title=dērelinquō|:af|dē-|relinquō|text=+|tree=1}} ==={{section|pron}}=== * {{la-IPA|dērelinquō}} ==={{section|v}}=== {{la-verb|3|dērelinquō|dērelīqu|dērelict}} # [[từ bỏ|Từ bỏ]], [[bỏ rơi]], [[bỏ hoang]]. # [[để|Để]] [[lại]]; [[truyền]] lại. ===={{section|forms}}==== {{la-conj|3|dērelinquō|dērelīqu|dērelict}} ===={{section|desc}}==== * {{desc|ca|derelinquir|bor=1}} * {{desc|…”
2561547
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|etym}}===
{{ety|la|title=dērelinquō|:af|dē-|relinquō|text=+|tree=1}}
==={{section|pron}}===
* {{la-IPA|dērelinquō}}
==={{section|v}}===
{{la-verb|3|dērelinquō|dērelīqu|dērelict}}
# [[từ bỏ|Từ bỏ]], [[bỏ rơi]], [[bỏ hoang]].
# [[để|Để]] [[lại]]; [[truyền]] lại.
===={{section|forms}}====
{{la-conj|3|dērelinquō|dērelīqu|dērelict}}
===={{section|desc}}====
* {{desc|ca|derelinquir|bor=1}}
* {{desc|it|derelinquere|bor=1}}
* {{desc|es|derelinquir|bor=1}}
==={{section|ref}}===
* {{R:la:L&S}}
* {{R:la:Elementary Lewis}}
* {{R:la:Gaffiot}}
if9pizrcz2eulc8iexxel82mdyhr5w0
derelictiones
0
415242
2561548
2026-09-08T01:11:05Z
Hiyuune
50834
+ la
2561548
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōnēs}}
# {{inflection of|la|dērelictiō||nom//acc//voc|p}}
asjmp4ldy1q9vlqqx3200p8bg4kjggc
derelictionis
0
415243
2561549
2026-09-08T01:12:20Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|n}}=== {{head|la|Biến thể hình thái danh từ|head=dērelictiōnis}} # {{inflection of|la|dērelictiō||gen|s}}”
2561549
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōnis}}
# {{inflection of|la|dērelictiō||gen|s}}
adbwg58gjn7zj6ki6lb5i6dcyl9iv2p
derelictionum
0
415244
2561550
2026-09-08T01:14:34Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|n}}=== {{head|la|Biến thể hình thái danh từ|head=dērelictiōnum}} # {{inflection of|la|dērelictiō||gen|p}}”
2561550
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōnum}}
# {{inflection of|la|dērelictiō||gen|p}}
r73x9g1fz202e5979xhhj5354l9gx9r
derelictioni
0
415245
2561551
2026-09-08T01:18:10Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|n}}=== {{head|la|Biến thể hình thái danh từ|head=dērelictiōnī}} # {{inflection of|la|dērelictiō||dat|s}}”
2561551
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōnī}}
# {{inflection of|la|dērelictiō||dat|s}}
jx4vinur8p7x5gz73gough2sly10iz2
derelictionibus
0
415246
2561552
2026-09-08T01:19:01Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|n}}=== {{head|la|Biến thể hình thái danh từ|head=dērelictiōnibus}} # {{inflection of|la|dērelictiō||dat//abl|p}}”
2561552
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōnibus}}
# {{inflection of|la|dērelictiō||dat//abl|p}}
81zy6hrwesrn30fubzh4gihxbod4x3o
derelictionem
0
415247
2561553
2026-09-08T01:24:50Z
Hiyuune
50834
+ la
2561553
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōnem}}
# {{inflection of|la|dērelictiō||acc|s}}
db8py2fzlk1d0dxru8yqtkmy6iz4h6k
derelictione
0
415248
2561554
2026-09-08T01:27:45Z
Hiyuune
50834
Trang mới: “=={{langname|la}}== ==={{section|n}}=== {{head|la|Biến thể hình thái danh từ|head=dērelictiōne}} # {{inflection of|la|dērelictiō||abl|s}}”
2561554
wikitext
text/x-wiki
=={{langname|la}}==
==={{section|n}}===
{{head|la|Biến thể hình thái danh từ|head=dērelictiōne}}
# {{inflection of|la|dērelictiō||abl|s}}
2b0u02iojcutfpmsgjptztrnnq2padx
Thể loại:Tiếng Anh Nam Á
14
415249
2561563
2026-09-08T02:37:34Z
Hiyuune
50834
Trang mới: “{{auto cat|lect=1|lang=en|cat=Tiếng Anh châu Á|Nam Á}}”
2561563
wikitext
text/x-wiki
{{auto cat|lect=1|lang=en|cat=Tiếng Anh châu Á|Nam Á}}
hvbmrxfyo8t6j4ppo8r3hu1gfohs6qi
Từ tái tạo:Tiếng Tiểu Á nguyên thủy/ʔésti
0
415250
2561566
2026-09-08T02:45:36Z
Hiyuune
50834
Trang mới: “{{reconstructed}} =={{langname|ine-ana-pro}}== ==={{section|etym}}=== {{etymon|ine-ana-pro|:inh|ine-pro:*h₁ésti<id:được, bị, là>|id=được, bị, là}} Từ {{inh|ine-ana-pro|ine-pro|*h₁ésti}}. ==={{section|pron}}=== * {{IPA|ine-ana-pro|/ʔɛ́stːi/}} ==={{section|v}}=== {{head|ine-ana-pro|Động từ|số nhiều||*ʔsánti|head=*ʔésti}} # [[được|Được]], [[bị]], [[là]]. ===={{section|desc}}==== * {{desc|hit|𒂊𒌍𒍣|tr=e-eš-zi}} *…”
2561566
wikitext
text/x-wiki
{{reconstructed}}
=={{langname|ine-ana-pro}}==
==={{section|etym}}===
{{etymon|ine-ana-pro|:inh|ine-pro:*h₁ésti<id:được, bị, là>|id=được, bị, là}}
Từ {{inh|ine-ana-pro|ine-pro|*h₁ésti}}.
==={{section|pron}}===
* {{IPA|ine-ana-pro|/ʔɛ́stːi/}}
==={{section|v}}===
{{head|ine-ana-pro|Động từ|số nhiều||*ʔsánti|head=*ʔésti}}
# [[được|Được]], [[bị]], [[là]].
===={{section|desc}}====
* {{desc|hit|𒂊𒌍𒍣|tr=e-eš-zi}}
* {{desc|xlc|𐊁𐊖𐊆}}
* {{desc|xlu|𒀀𒀸𒋾|tr=a-aš-ti}}
* {{desc|plq|𒀀𒀸𒋾|tr=a-aš-ti}}
==={{section|ref}}===
* {{R:hit:EDHIL|pages=250-252|head=eš-{{sup|zi}} / aš-|passage=PAnat. ''*ʔes- / *ʔs-''}}
[[en:Reconstruction:Proto-Anatolian/ʔésti]]
[[tr:YeniKurum:Ana Anadoluca/ʔésti]]
npwnnnj00btf0a764r96qo2kfrdxe8t
2561568
2561566
2026-09-08T02:52:12Z
Hiyuune
50834
2561568
wikitext
text/x-wiki
{{reconstructed}}
=={{langname|ine-ana-pro}}==
==={{section|etym}}===
{{etymon|ine-ana-pro|:inh|ine-pro:*h₁ésti<id:được, bị, là>|id=được, bị, là}}
Từ {{inh|ine-ana-pro|ine-pro|*h₁ésti}}.
==={{section|pron}}===
* {{IPA|ine-ana-pro|/ʔɛ́stːi/}}
==={{section|v}}===
{{head|ine-ana-pro|Động từ|số nhiều||*ʔsánti|head=*ʔésti}}
# [[được|Được]], [[bị]], [[là]].
===={{section|desc}}====
* {{desc|hit|𒂊𒌍𒍣|tr=e-eš-zi}}
* {{desc|xlc|𐊁𐊖𐊆}}
* {{desc|xlu|𒀀𒀸𒋾|tr=a-aš-ti}}
* {{desc|plq|𒀀𒀸𒋾|tr=a-aš-ti}}
==={{section|ref}}===
* {{R:hit:EDHIL|pages=250-252|head=eš-{{sup|zi}} / aš-|passage=PAnat. ''*ʔes- / *ʔs-''}}
[[en:Reconstruction:Proto-Anatolian/ʔésti]]
[[ja:付録:アナトリア祖語/ʔésti]]
[[tr:YeniKurum:Ana Anadoluca/ʔésti]]
ehzjl4xnfceo3pozhhi56khhe700bni
bửn
0
415251
2561576
2026-09-08T05:31:15Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "bun"}} =={{langname|vi}}== ==={{section|pron}}=== {{vi-IPA}} ==={{section|adj}}=== {{vi-adj}} # {{lb|vi|North Central Vietnam|North Vietnam}} {{alternative form of|vi|bẩn}} #: {{ux|vi|Hắn chơi '''bửn''' dữ, {{l|vi|nỏ}} chơi với hắn nữa.}} #: {{ux|vi|Mày sống '''bửn''' thế mà vẫn sống là con người được à?}}”
2561576
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "bun"}}
=={{langname|vi}}==
==={{section|pron}}===
{{vi-IPA}}
==={{section|adj}}===
{{vi-adj}}
# {{lb|vi|North Central Vietnam|North Vietnam}} {{alternative form of|vi|bẩn}}
#: {{ux|vi|Hắn chơi '''bửn''' dữ, {{l|vi|nỏ}} chơi với hắn nữa.}}
#: {{ux|vi|Mày sống '''bửn''' thế mà vẫn sống là con người được à?}}
ii5m0m7i48ves36nvpz62kaikcor7cn
𪷪
0
415252
2561577
2026-09-08T05:33:38Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=85|rad=水|as=14|sn=17|four=|canj=|ids=⿰污貧}} ==={{section|further}}=== {{Han ref|uh=2ADEA}} =={{langname|vi}}== ==={{section|glyph origin}}=== {{Han compound|污|貧|lang=vi|ls=psc|c1=s|c2=p|t1=[[bẩn]]|tr={{vi-l|bẩn}}|tr2={{vi-l|bần}}}}. ==={{section|han}}=== {{vi-readings|rs=水14|nom=bẩn}} # {{vi-Nom form of|bẩn}} ==={{section|ref}}=== * [http://nomfoundation.org/common/no…”
2561577
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=85|rad=水|as=14|sn=17|four=|canj=|ids=⿰污貧}}
==={{section|further}}===
{{Han ref|uh=2ADEA}}
=={{langname|vi}}==
==={{section|glyph origin}}===
{{Han compound|污|貧|lang=vi|ls=psc|c1=s|c2=p|t1=[[bẩn]]|tr={{vi-l|bẩn}}|tr2={{vi-l|bần}}}}.
==={{section|han}}===
{{vi-readings|rs=水14|nom=bẩn}}
# {{vi-Nom form of|bẩn}}
==={{section|ref}}===
* [http://nomfoundation.org/common/nom_details.php?codepoint=2ADEA Nom Foundation]
5ftjolukcqxxnfu2ri5trntmoefye52
𬉂
0
415253
2561578
2026-09-08T05:34:31Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=85|rad=水|as=12|sn=15|four=|canj=|ids=⿰氵粪}} ===={{section|ref}}==== {{Han ref|uh=2C242}} {{clear}} =={{langname|zh}}== {{zh-see|瀵|ns}}”
2561578
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=85|rad=水|as=12|sn=15|four=|canj=|ids=⿰氵粪}}
===={{section|ref}}====
{{Han ref|uh=2C242}}
{{clear}}
=={{langname|zh}}==
{{zh-see|瀵|ns}}
tv96agruwgsdgdhd8eu23t2zghz9u57
𬇸
0
415254
2561579
2026-09-08T05:35:14Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=85|rad=水|as=8|sn=|four=|canj=|ids=⿰污本}} ===={{ĐM|ref}}==== * {{Han ref|kx=|dkj=|dj=|hdz=|uh=2C1F8}}”
2561579
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=85|rad=水|as=8|sn=|four=|canj=|ids=⿰污本}}
===={{ĐM|ref}}====
* {{Han ref|kx=|dkj=|dj=|hdz=|uh=2C1F8}}
5masa43mnz9ba58hn74rx2sv90ewhvq
𬇹
0
415255
2561581
2026-09-08T05:48:27Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=85|rad=水|as=8|sn=11|four=|canj=|ids=⿰氵国}} ===={{ĐM|ref}}==== {{Han ref|uh=2C1F9}} =={{langname|zh}}== {{zh-see|漍}}”
2561581
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=85|rad=水|as=8|sn=11|four=|canj=|ids=⿰氵国}}
===={{ĐM|ref}}====
{{Han ref|uh=2C1F9}}
=={{langname|zh}}==
{{zh-see|漍}}
734syadoqy4d7wgjs5w0asyuj6wgaby
漐
0
415256
2561582
2026-09-08T06:04:42Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=85|rad=水|as=11|sn=14|four=|canj=GIE|ids=⿱執水}} ===={{ĐM|ref}}==== * {{Han ref|kx=0645.150|dkj=18122|dj=1054.080|hdz=31711.130|uh=6F10}} =={{langname|zh}}== {{zh-forms|s=𰛣}} ==={{ĐM|glyph origin}}=== {{Han etym}} ==={{ĐM|pron}}=== {{zh-pron |m=zhí |c=zap6 |mc=y |oc=y |ma= |cat=a }} ==={{ĐM|dfn}}=== {{head|zh|hanzi}} # Đổ [[mồ hôi]]; [[toát]] mồ hôi. ==={{ĐM|com}}=== {{…”
2561582
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=85|rad=水|as=11|sn=14|four=|canj=GIE|ids=⿱執水}}
===={{ĐM|ref}}====
* {{Han ref|kx=0645.150|dkj=18122|dj=1054.080|hdz=31711.130|uh=6F10}}
=={{langname|zh}}==
{{zh-forms|s=𰛣}}
==={{ĐM|glyph origin}}===
{{Han etym}}
==={{ĐM|pron}}===
{{zh-pron
|m=zhí
|c=zap6
|mc=y
|oc=y
|ma=
|cat=a
}}
==={{ĐM|dfn}}===
{{head|zh|hanzi}}
# Đổ [[mồ hôi]]; [[toát]] mồ hôi.
==={{ĐM|com}}===
{{col|zh|漐習|漐漐}}
===={{ĐM|ref}}====
* (''tiếng Quảng Đông'') [http://www.iso10646hk.net/jp/document/download.jsp Jyutping Database (iso10646hk.net) - Cantonese Pronunciation List (Phần 2), tr. 143]
lx9eimjxa6112lq3nfkq0va6arvy5bz
Mô đun:zh/data/ltc-pron/漐
828
415257
2561583
2026-09-08T06:05:32Z
Hiyuune
50834
Trang mới: “return { "徹侵三開 入丑入-重鈕" }”
2561583
Scribunto
text/plain
return {
"徹侵三開 入丑入-重鈕"
}
dpaplnswx9db05gdm8tu69s8jkxlug9
Mô đun:zh/data/och-pron-ZS/漐
828
415258
2561585
2026-09-08T06:17:38Z
Hiyuune
50834
Trang mới: “return { { "17288", "執", "緝", "2", "湁", "tʰib", "見傷寒論" }, }”
2561585
Scribunto
text/plain
return {
{ "17288", "執", "緝", "2", "湁", "tʰib", "見傷寒論" },
}
mkz9mfelo6muk8k4dyt6613se0c27pc
màu cờ sắc áo
0
415259
2561589
2026-09-08T06:56:01Z
TheHighFighter2
42988
Trang mới: “=={{langname|vi}}== ==={{ĐM|pron}}=== {{vi-pron}} ==={{ĐM|noun}}=== {{vi-noun}} # {{lb|vi|idiomatic}} [[màu sắc|Màu sắc]] của lá [[quốc kỳ]] và [[trang phục]] [[thi đấu]] của các [[vận động viên]], biểu trưng cho [[danh dự]], [[thể diện]] và [[tinh thần]] [[dân tộc]] trong [[thể thao]]. ==={{ĐM|ref}}=== * {{R:Tratu}}”
2561589
wikitext
text/x-wiki
=={{langname|vi}}==
==={{ĐM|pron}}===
{{vi-pron}}
==={{ĐM|noun}}===
{{vi-noun}}
# {{lb|vi|idiomatic}} [[màu sắc|Màu sắc]] của lá [[quốc kỳ]] và [[trang phục]] [[thi đấu]] của các [[vận động viên]], biểu trưng cho [[danh dự]], [[thể diện]] và [[tinh thần]] [[dân tộc]] trong [[thể thao]].
==={{ĐM|ref}}===
* {{R:Tratu}}
06scjy87v0ybi3bs7he47y2ftqy2kwx
mië
0
415260
2561590
2026-09-08T07:08:09Z
Hiyuune
50834
Trang mới: “{{also|Phụ lục:Biến thể của "mie"}} =={{langname|ace}}== {{wp|ace:}} ==={{section|n}}=== {{head|ace|Danh từ}} # [[mèo|Mèo]]. {{C|ace|Mèo}}”
2561590
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "mie"}}
=={{langname|ace}}==
{{wp|ace:}}
==={{section|n}}===
{{head|ace|Danh từ}}
# [[mèo|Mèo]].
{{C|ace|Mèo}}
7wk7z7xbqbz2s5tl94zqnhdtewr4ats
2561591
2561590
2026-09-08T07:09:34Z
Hiyuune
50834
/* Tiếng Aceh */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561591
wikitext
text/x-wiki
{{also|Phụ lục:Biến thể của "mie"}}
=={{langname|ace}}==
{{wp|ace:}}
[[Tập tin:Domestic_cat_cropped.jpg|thumb|{{pagename}}]]
==={{section|n}}===
{{head|ace|Danh từ}}
# [[mèo|Mèo]].
{{C|ace|Mèo}}
82u1zlylk2uh0s29pz0l0yhgkj9ec3o
dummuuta
0
415261
2561592
2026-09-08T07:12:41Z
Hiyuune
50834
Trang mới: “=={{langname|aa}}== ==={{section|alt}}=== * {{alter|aa|dummuyta}} ==={{section|etym}} 1=== [[Image:Verärgerter roter Kater.JPG|thumb|Dummuuta (1).]] Từ {{suffix|aa|dummú|t1=mèo|-ytu|alt2=-ta}}. ===={{section|pron}}==== * {{aa-IPA|dummúuta}} ===={{section|n}}==== {{aa-noun|dummúuta|g=m|pl=dummú|gpl=f}} # {{lb|aa|Afar Bắc}} [[mèo|Mèo]] [[đực]]. ====={{section|decl}}===== {{aa-decl|dummúuta|dummúuta|dummuutí|dummuutí}} ====={{section|syn}}===== * {{…”
2561592
wikitext
text/x-wiki
=={{langname|aa}}==
==={{section|alt}}===
* {{alter|aa|dummuyta}}
==={{section|etym}} 1===
[[Image:Verärgerter roter Kater.JPG|thumb|Dummuuta (1).]]
Từ {{suffix|aa|dummú|t1=mèo|-ytu|alt2=-ta}}.
===={{section|pron}}====
* {{aa-IPA|dummúuta}}
===={{section|n}}====
{{aa-noun|dummúuta|g=m|pl=dummú|gpl=f}}
# {{lb|aa|Afar Bắc}} [[mèo|Mèo]] [[đực]].
====={{section|decl}}=====
{{aa-decl|dummúuta|dummúuta|dummuutí|dummuutí}}
====={{section|syn}}=====
* {{q|Afar Nam}} {{l|aa|dimmatóyta}}
==={{section|etym}} 2===
[[Image:Dalaja--10122009.JPG|thumb|Dummuuta (2).]]
Từ {{suffix|aa|dummú|t1=mèo|-ytó|alt2=-tá}}.
===={{section|pron}}====
* {{aa-IPA|dummuutá}}
===={{section|n}}====
{{aa-noun|dummuutá|g=f|pl=dummú|gpl=f}}
# {{lb|aa|Afar Bắc}} [[mèo|Mèo]] [[cái]].
====={{section|decl}}=====
{{aa-decl|dummuutá}}
====={{section|syn}}=====
* {{q|Afar Nam}} {{l|aa|dimmatoytá}}
==={{section|ref}}===
* {{R:aa:Parker:1985|dummu}}
39owbfh9kxm93b4tvm6kepz2zjjwxvg
ꌦ
0
415262
2561594
2026-09-08T07:20:44Z
TheHighFighter2
42988
Trang mới: “{{character info}} =={{langname|ii}}== ==={{ĐM|pron}}=== * {{IPA|ii|/sz̩˧/}} ==={{ĐM|etym}} 1=== Từ {{inh|ii|tbq-lol-pro|*swe² ||máu}}, từ {{inh|ii|tbq-lob-pro|*swəj²||máu}}, từ {{inh|ii|sit-pro|*swiʔ||máu}}. ===={{ĐM|noun}}==== {{head|ii|noun}} # [[máu|Máu]]. ==={{ĐM|etym}} 2=== Từ {{inh|ii|tbq-lol-pro|*ʃe²||chết}}, từ {{inh|ii|tbq-lob-pro|*səj¹||chết}}, từ {{inh|ii|sit-pro|*sij||chết}}. ===={{ĐM|verb}}==== {{head|ii|verb}}…”
2561594
wikitext
text/x-wiki
{{character info}}
=={{langname|ii}}==
==={{ĐM|pron}}===
* {{IPA|ii|/sz̩˧/}}
==={{ĐM|etym}} 1===
Từ {{inh|ii|tbq-lol-pro|*swe² ||máu}}, từ {{inh|ii|tbq-lob-pro|*swəj²||máu}}, từ {{inh|ii|sit-pro|*swiʔ||máu}}.
===={{ĐM|noun}}====
{{head|ii|noun}}
# [[máu|Máu]].
==={{ĐM|etym}} 2===
Từ {{inh|ii|tbq-lol-pro|*ʃe²||chết}}, từ {{inh|ii|tbq-lob-pro|*səj¹||chết}}, từ {{inh|ii|sit-pro|*sij||chết}}.
===={{ĐM|verb}}====
{{head|ii|verb}}
# [[chết|Chết]].
# [[dập tắt|Dập tắt]] ([[lửa]]).
==={{ĐM|ref}}===
* "600 Phrases in the Liangshan Yi Dialect." [http://www.babelstone.co.uk/Yi/contents.html Babel Stone].
{{C|ii|Dịch cơ thể}}
3db8iljf348fnatnryjvyvkdlh9woki
katte
0
415263
2561595
2026-09-08T07:20:54Z
Hiyuune
50834
Trang mới: “{{also|kätte}} =={{langname|af}}== ==={{section|n}}=== {{head|af|Biến thể hình thái danh từ}} # {{plural of|af|kat}} =={{langname|nl}}== ==={{section|pron}}=== * {{audio|nl|Nl-katte.ogg}} ==={{section|v}}=== {{head|nl|Biến thể hình thái động từ}} # {{infl of|nl|katten||ind|past|s|;|sub|past//pres|s}} =={{langname|mak}}== ==={{section|pron}}=== * {{IPA|mak|[ˈkatːɛ]}} ==={{section|pron}}=== {{mak-head|pron}} # [[chúng tôi|Chúng tôi]] ({{…”
2561595
wikitext
text/x-wiki
{{also|kätte}}
=={{langname|af}}==
==={{section|n}}===
{{head|af|Biến thể hình thái danh từ}}
# {{plural of|af|kat}}
=={{langname|nl}}==
==={{section|pron}}===
* {{audio|nl|Nl-katte.ogg}}
==={{section|v}}===
{{head|nl|Biến thể hình thái động từ}}
# {{infl of|nl|katten||ind|past|s|;|sub|past//pres|s}}
=={{langname|mak}}==
==={{section|pron}}===
* {{IPA|mak|[ˈkatːɛ]}}
==={{section|pron}}===
{{mak-head|pron}}
# [[chúng tôi|Chúng tôi]] ({{ng|ngôi thứ nhất bao hàm}})
# [[bạn|Bạn]] ({{ng|ngôi thứ hai trang trọng}})
===={{section|see}}====
{{mak-personal pronouns}}
=={{langname|ja}}==
==={{section|rom}}===
{{ja-romaji}}
# {{ja-romanization of|かって}}
n55xwkujaipg3vj4bz303xapyt9ex6z
Bản mẫu:mak-head
10
415264
2561596
2026-09-08T07:21:01Z
Hiyuune
50834
Trang mới: “{{#invoke:mak-headword|show}}<!-- --><noinclude>{{documentation}}</noinclude>”
2561596
wikitext
text/x-wiki
{{#invoke:mak-headword|show}}<!--
--><noinclude>{{documentation}}</noinclude>
f7mw90j5s7rha6qcgv2fd4ffat9a9x0
2561599
2561596
2026-09-08T07:25:15Z
Hiyuune
50834
2561599
wikitext
text/x-wiki
<includeonly>{{#invoke:mak-headword|show}}</includeonly><!--
--><noinclude>{{documentation}}</noinclude>
j5jci9ee5jvb1r5kg8vlgzczrws7cyq
Mô đun:mak-Latn-Maka-translit
828
415265
2561600
2026-09-08T07:26:49Z
Hiyuune
50834
Trang mới: “local export = {} local tt = { ["Latn"] = { ["ka"]="𑻠", ["ki"]="𑻠𑻳", ["ku"]="𑻠𑻴", ["ke"]="𑻠𑻵", ["ko"]="𑻠𑻶", ["ga"]="𑻡", ["gi"]="𑻡𑻳", ["gu"]="𑻡𑻴", ["ge"]="𑻡𑻵", ["go"]="𑻡𑻶", ["pa"]="𑻣", ["pi"]="𑻣𑻳", ["pu"]="𑻣𑻴", ["pe"]="𑻣𑻵", ["po"]="𑻣𑻶", ["ba"]="𑻤", ["bi"]="𑻤𑻳", ["bu"]="𑻤𑻴", ["be"]="𑻤𑻵", ["bo"]="𑻤𑻶", ["ma"]="𑻥", ["mi"]="𑻥𑻳", ["mu"]="𑻥𑻴", ["m…”
2561600
Scribunto
text/plain
local export = {}
local tt = {
["Latn"] = {
["ka"]="𑻠", ["ki"]="𑻠𑻳", ["ku"]="𑻠𑻴", ["ke"]="𑻠𑻵", ["ko"]="𑻠𑻶",
["ga"]="𑻡", ["gi"]="𑻡𑻳", ["gu"]="𑻡𑻴", ["ge"]="𑻡𑻵", ["go"]="𑻡𑻶",
["pa"]="𑻣", ["pi"]="𑻣𑻳", ["pu"]="𑻣𑻴", ["pe"]="𑻣𑻵", ["po"]="𑻣𑻶",
["ba"]="𑻤", ["bi"]="𑻤𑻳", ["bu"]="𑻤𑻴", ["be"]="𑻤𑻵", ["bo"]="𑻤𑻶",
["ma"]="𑻥", ["mi"]="𑻥𑻳", ["mu"]="𑻥𑻴", ["me"]="𑻥𑻵", ["mo"]="𑻥𑻶",
["ta"]="𑻦", ["ti"]="𑻦𑻳", ["tu"]="𑻦𑻴", ["te"]="𑻦𑻵", ["to"]="𑻦𑻶",
["da"]="𑻧", ["di"]="𑻧𑻳", ["du"]="𑻧𑻴", ["de"]="𑻧𑻵", ["do"]="𑻧𑻶",
["na"]="𑻨", ["ni"]="𑻨𑻳", ["nu"]="𑻨𑻴", ["ne"]="𑻨𑻵", ["no"]="𑻨𑻶",
["ca"]="𑻩", ["ci"]="𑻩𑻳", ["cu"]="𑻩𑻴", ["ce"]="𑻩𑻵", ["co"]="𑻩𑻶",
["ja"]="𑻪", ["ji"]="𑻪𑻳", ["ju"]="𑻪𑻴", ["je"]="𑻪𑻵", ["jo"]="𑻪𑻶",
["ya"]="𑻬", ["yi"]="𑻬𑻳", ["yu"]="𑻬𑻴", ["ye"]="𑻬𑻵", ["yo"]="𑻬𑻶",
["ra"]="𑻭", ["ri"]="𑻭𑻳", ["ru"]="𑻭𑻴", ["re"]="𑻭𑻵", ["ro"]="𑻭𑻶",
["la"]="𑻮", ["li"]="𑻮𑻳", ["lu"]="𑻮𑻴", ["le"]="𑻮𑻵", ["lo"]="𑻮𑻶",
["wa"]="𑻯", ["wi"]="𑻯𑻳", ["wu"]="𑻯𑻴", ["we"]="𑻯𑻵", ["wo"]="𑻯𑻶",
["sa"]="𑻰", ["si"]="𑻰𑻳", ["su"]="𑻰𑻴", ["se"]="𑻰𑻵", ["so"]="𑻰𑻶",
["a"]="𑻱", ["i"]="𑻱𑻳", ["u"]="𑻱𑻴", ["e"]="𑻱𑻵", ["o"]="𑻱𑻶",
["ha"]="𑻱", ["hi"]="𑻱𑻳", ["hu"]="𑻱𑻴", ["he"]="𑻱𑻵", ["ho"]="𑻱𑻶",
["nga"]="𑻢", ["ngi"]="𑻢𑻳", ["ngu"]="𑻢𑻴", ["nge"]="𑻢𑻵", ["ngo"]="𑻢𑻶",
["nya"]="𑻫", ["nyi"]="𑻫𑻳", ["nyu"]="𑻫𑻴", ["nye"]="𑻫𑻵", ["nyo"]="𑻫𑻶",
["kà"]="𑻠", ["kì"]="𑻠𑻳", ["kù"]="𑻠𑻴", ["kè"]="𑻠𑻵", ["kò"]="𑻠𑻶",
["gà"]="𑻡", ["gì"]="𑻡𑻳", ["gù"]="𑻡𑻴", ["gè"]="𑻡𑻵", ["gò"]="𑻡𑻶",
["pà"]="𑻣", ["pì"]="𑻣𑻳", ["pù"]="𑻣𑻴", ["pè"]="𑻣𑻵", ["pò"]="𑻣𑻶",
["bà"]="𑻤", ["bì"]="𑻤𑻳", ["bù"]="𑻤𑻴", ["bè"]="𑻤𑻵", ["bò"]="𑻤𑻶",
["mà"]="𑻥", ["mì"]="𑻥𑻳", ["mù"]="𑻥𑻴", ["mè"]="𑻥𑻵", ["mò"]="𑻥𑻶",
["tà"]="𑻦", ["tì"]="𑻦𑻳", ["tù"]="𑻦𑻴", ["tè"]="𑻦𑻵", ["tò"]="𑻦𑻶",
["dà"]="𑻧", ["dì"]="𑻧𑻳", ["dù"]="𑻧𑻴", ["dè"]="𑻧𑻵", ["dò"]="𑻧𑻶",
["nà"]="𑻨", ["nì"]="𑻨𑻳", ["nù"]="𑻨𑻴", ["nè"]="𑻨𑻵", ["nò"]="𑻨𑻶",
["cà"]="𑻩", ["cì"]="𑻩𑻳", ["cù"]="𑻩𑻴", ["cè"]="𑻩𑻵", ["cò"]="𑻩𑻶",
["jà"]="𑻪", ["jì"]="𑻪𑻳", ["jù"]="𑻪𑻴", ["jè"]="𑻪𑻵", ["jò"]="𑻪𑻶",
["yà"]="𑻬", ["yì"]="𑻬𑻳", ["yù"]="𑻬𑻴", ["yè"]="𑻬𑻵", ["yò"]="𑻬𑻶",
["rà"]="𑻭", ["rì"]="𑻭𑻳", ["rù"]="𑻭𑻴", ["rè"]="𑻭𑻵", ["rò"]="𑻭𑻶",
["là"]="𑻮", ["lì"]="𑻮𑻳", ["lù"]="𑻮𑻴", ["lè"]="𑻮𑻵", ["lò"]="𑻮𑻶",
["wà"]="𑻯", ["wì"]="𑻯𑻳", ["wù"]="𑻯𑻴", ["wè"]="𑻯𑻵", ["wò"]="𑻯𑻶",
["sà"]="𑻰", ["sì"]="𑻰𑻳", ["sù"]="𑻰𑻴", ["sè"]="𑻰𑻵", ["sò"]="𑻰𑻶",
["à"]="𑻱", ["ì"]="𑻱𑻳", ["ù"]="𑻱𑻴", ["è"]="𑻱𑻵", ["ò"]="𑻱𑻶",
["hà"]="𑻱", ["hì"]="𑻱𑻳", ["hù"]="𑻱𑻴", ["hè"]="𑻱𑻵", ["hò"]="𑻱𑻶",
["ngà"]="𑻢", ["ngì"]="𑻢𑻳", ["ngù"]="𑻢𑻴", ["ngè"]="𑻢𑻵", ["ngò"]="𑻢𑻶",
["nyà"]="𑻫", ["nyì"]="𑻫𑻳", ["nyù"]="𑻫𑻴", ["nyè"]="𑻫𑻵", ["nyò"]="𑻫𑻶",
}
}
function export.tr(text, lang, sc)
if (sc == "Latn") then
-- Lowercase
text = mw.ustring.lower(text)
-- Hapus semua spasi
text = mw.ustring.gsub(text, "%s+", "")
-- Sisipkan huruf 'w' jika vokal o/u/ò/ù bertemu vokal a/e/i/à/è/ì
text = mw.ustring.gsub(text, "([ouòù])([aeiàèì])", "%1w%2")
-- Sisipkan huruf 'y' jika vokal e/i/è/ì bertemu vokal a/o/u/à/ò/ù
text = mw.ustring.gsub(text, "([eièì])([aouàòù])", "%1y%2")
-- Remove glottal stop (dilakukan setelah penyisipan glide)
text = mw.ustring.gsub(text, "['ʼ]", "")
-- Replace character clusters
text = mw.ustring.gsub(text, "ng[aeiouàèìòù]", tt[sc])
text = mw.ustring.gsub(text, "ny[aeiouàèìòù]", tt[sc])
-- Replace the rest of the characters
text = mw.ustring.gsub(text, "[kgnpbmtdnrcjyclwsh][aeiouàèìòù]", tt[sc])
-- Replace one-vowel syllables
text = mw.ustring.gsub(text, "[aeiouàèìòù]", tt[sc])
-- Remove left-overs (konsonan mati yang tidak ditulis pada skrip)
text = mw.ustring.gsub(text, "[kgnpbmtdnrcjyclwsh-]", "")
-- Logic sistem reduplikasi (Angka Makassar) disesuaikan
text = mw.ustring.gsub(text, "([𑻠-𑻶]+)", function(word)
local prev_c, prev_v = nil, nil
local res = mw.ustring.gsub(word, "([𑻠-𑻱])([𑻳-𑻶]?)", function(c, v)
if prev_c then
if prev_c == c then
if prev_v == v and prev_v ~= "" then
-- dudu -> 𑻧𑻴𑻴, tete -> 𑻦𑻵𑻵
prev_c, prev_v = nil, nil
return v
elseif prev_v == "" and v == "" then
-- dada -> 𑻧𑻲
prev_c, prev_v = nil, nil
return "𑻲"
else
-- dadu -> 𑻧𑻲𑻴, duda -> 𑻧𑻴𑻲, dido -> 𑻧𑻳𑻲𑻶
prev_c, prev_v = nil, nil
return "𑻲" .. v
end
else
prev_c, prev_v = c, v
return c .. v
end
else
prev_c, prev_v = c, v
return c .. v
end
end)
return res
end)
end
return mw.ustring.toNFC(text)
end
return export
63aohz8p7xy0bf1i501opp84zem55sy
snowy owl
0
415266
2561603
2026-09-08T07:32:14Z
Hiyuune
50834
Trang mới: “=={{langname|en}}== ==={{section|pron}}=== * {{audio|en|LL-Q1860 (eng)-Vealhurl-snowy owl.wav|a=Southern England}} ==={{section|n}}=== [[Image:Snowy.owl.overall.arp.750pix.jpg|thumb|A snowy owl]] {{en-noun}} # [[cú tuyết|Cú tuyết]], ({{taxfmt|Bubo scandiacus|loài}}). ==={{section|further}}=== * {{pedia|lanng=en}} * {{specieslite|Bubo scandiacus|i=1}} * {{comcatlite|Bubo scandiacus|i=1}} {{C|en|Bộ Cú}}”
2561603
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|pron}}===
* {{audio|en|LL-Q1860 (eng)-Vealhurl-snowy owl.wav|a=Southern England}}
==={{section|n}}===
[[Image:Snowy.owl.overall.arp.750pix.jpg|thumb|A snowy owl]]
{{en-noun}}
# [[cú tuyết|Cú tuyết]], ({{taxfmt|Bubo scandiacus|loài}}).
==={{section|further}}===
* {{pedia|lanng=en}}
* {{specieslite|Bubo scandiacus|i=1}}
* {{comcatlite|Bubo scandiacus|i=1}}
{{C|en|Bộ Cú}}
i6jraeba7rmwhh6e9culm3s1y54uhwk
2561604
2561603
2026-09-08T07:32:25Z
Hiyuune
50834
/* Đọc thêm */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561604
wikitext
text/x-wiki
=={{langname|en}}==
==={{section|pron}}===
* {{audio|en|LL-Q1860 (eng)-Vealhurl-snowy owl.wav|a=Southern England}}
==={{section|n}}===
[[Image:Snowy.owl.overall.arp.750pix.jpg|thumb|A snowy owl]]
{{en-noun}}
# [[cú tuyết|Cú tuyết]], ({{taxfmt|Bubo scandiacus|loài}}).
==={{section|further}}===
* {{pedia|lang=en}}
* {{specieslite|Bubo scandiacus|i=1}}
* {{comcatlite|Bubo scandiacus|i=1}}
{{C|en|Bộ Cú}}
eoy5z0vl1ekxpnu08ko64nj6oc4dmlt
雪鴞
0
415267
2561605
2026-09-08T07:34:16Z
Hiyuune
50834
Trang mới: “=={{langname|zh}}== {{zh-forms|s=雪鸮}} {{wp|zh:}} ==={{section|pron}}=== {{zh-pron |m=xuěxiāo |c=syut3 hiu1 |cat=n }} ==={{section|n}}=== {{head|zh|Danh từ}} # [[cú tuyết|Cú tuyết]] ({{taxfmt|Bubo scandiacus|loài}}). {{C|zh|Bộ Cú}}”
2561605
wikitext
text/x-wiki
=={{langname|zh}}==
{{zh-forms|s=雪鸮}}
{{wp|zh:}}
==={{section|pron}}===
{{zh-pron
|m=xuěxiāo
|c=syut3 hiu1
|cat=n
}}
==={{section|n}}===
{{head|zh|Danh từ}}
# [[cú tuyết|Cú tuyết]] ({{taxfmt|Bubo scandiacus|loài}}).
{{C|zh|Bộ Cú}}
n1pv91s9f4g9hxqfykw22e6ixucbczq
ꪵꪚ꪿ꪉꪼꪔ
0
415268
2561607
2026-09-08T08:18:36Z
Hiyuune
50834
Trang mới: “=={{langname|blt}}== ==={{section|pron}}=== {{blt-pron|ꪵꪚ꪿ꪉ-ꪼꪔ}} ==={{section|n}}=== {{head|blt|Danh từ|tr=béng tay}} # [[bánh|Bánh]]. ===={{section|syn}}==== {{col4|blt|title=bánh |ꪹꪄ꫁ꪱꪊꪲ꪿ }} ==={{section|ref}}=== * Baccam, D., Baccam F., Baccam H., & Fippinger, D. (1989). ''Tai Dam-English, English-Tai Dam vocabulary book''. Summer Institute of Linguistics.”
2561607
wikitext
text/x-wiki
=={{langname|blt}}==
==={{section|pron}}===
{{blt-pron|ꪵꪚ꪿ꪉ-ꪼꪔ}}
==={{section|n}}===
{{head|blt|Danh từ|tr=béng tay}}
# [[bánh|Bánh]].
===={{section|syn}}====
{{col4|blt|title=bánh
|ꪹꪄ꫁ꪱꪊꪲ꪿
}}
==={{section|ref}}===
* Baccam, D., Baccam F., Baccam H., & Fippinger, D. (1989). ''Tai Dam-English, English-Tai Dam vocabulary book''. Summer Institute of Linguistics.
qbtqjok7j123yx20y848tv7cdp5r68z
雪鸮
0
415269
2561608
2026-09-08T08:21:31Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{zh-see|雪鴞}}”
2561608
wikitext
text/x-wiki
=={{langname|ja}}==
{{zh-see|雪鴞}}
46714ifn6waqj3y2ef5imr5w45n5njl
勤
0
415270
2561609
2026-09-08T08:29:46Z
Hiyuune
50834
Trang mới: “{{also|懃|勒}} {{character info}} {{character info|0xFA34}} {{character info|0x2F827}} =={{langname|mul}}== {{CJKV-forms|勤|勤|勤|勤}} ==={{section|han}}=== {{Han char|rn=19|rad=力|as=11|asj+=10|sn=13|snj+=12|four=44127|canj=TMKS|ids=⿰堇力(GHTKVP),⿰𦰌力(J)}} ===={{section|derived characters}}==== * {{charlist|sc=Hani|懄懃㢙}} {{col-top|1|Các ký tự phái sinh khác}} * {{charlist|sc=Hani|𡀣𰔭𣝀𤯺𮜺𫦽𥵚𭏶𤐂𠪲}} * {{ch…”
2561609
wikitext
text/x-wiki
{{also|懃|勒}}
{{character info}}
{{character info|0xFA34}}
{{character info|0x2F827}}
=={{langname|mul}}==
{{CJKV-forms|勤|勤|勤|勤}}
==={{section|han}}===
{{Han char|rn=19|rad=力|as=11|asj+=10|sn=13|snj+=12|four=44127|canj=TMKS|ids=⿰堇力(GHTKVP),⿰𦰌力(J)}}
===={{section|derived characters}}====
* {{charlist|sc=Hani|懄懃㢙}}
{{col-top|1|Các ký tự phái sinh khác}}
* {{charlist|sc=Hani|𡀣𰔭𣝀𤯺𮜺𫦽𥵚𭏶𤐂𠪲}}
* {{charlist|sc=Hani|𦻵𤏊}} {{qualifier|có liên quan}}
{{col-bottom}}
==={{section|ref}}===
{{Han ref|kx=0149.060|dkj=02415|dj=0336.130|hdz=10378.030|uh=52E4}}
{{Han ref|dkj=2424|uh=FA34}}
{{Han ref|uh=2F827}}
=={{langname|vi}}==
===Hán-Nôm===
{{vi-readings|hanviet=cần-tdcndg;gdhn;ntqatd;taberd;btcn|nom=cần-tdcndg;gdhn;taberd;ndtd,cùn-tdcndg;gdhn;btcn,cằn-tdcndg;ntqatd|rs=力11}}
# {{vi-Han form of|cần}}
# {{vi-Nom form of|cần}}
# {{vi-Nom form of|cằn}}
# {{vi-Nom form of|cùn}}
===={{section|com}}====
{{col|vi
|{{vi-l|勤敏|cần mẫn}}
|{{vi-l|勤拳|cần quyền}}
|{{vi-l|勤不如專|cần bất như chuyên}}
|{{vi-l|勤鉤|cần câu}}
|{{vi-l|勤桲|cần vọt}}
|{{vi-l|勤急|cần kíp}}
|{{vi-l|蔞勤|rau cần}}
|{{vi-l|局勤|cục cằn}}
}}
==={{section|ref}}===
{{reflist}}
=={{langname|zh}}==
==={{section|glyph origin}} 1===
{{zh-forms|ss=𰅉|alt=𠢄,𠢀,廑-cổ xưa}}
{{Han etym}}
{{Han compound|堇|力|ls=psc|c1=p|c2=s}}.
===={{section|etym}}====
{{rfe|zh}}
===={{section|pron}}====
{{zh-pron
|m=qín
|ma=y
|m-s=
|m-x=qín
|c=kan4
|c-dg=kan4
|c-t=kin3
|g=qin2
|h=pfs=khiùn;hrs=h:kiun/d:kiunˇ/r:kiun/z:kim/z:kinnˋ;gd=kiun2
|j=qing1
|mb=kěng
|md=kṳ̀ng
|mn=xm,qz,tp,lk,km,mg,hc,tc,ph:khûn/zz,kh,yl,tn:khîn/ha,dh:khêrn/sx:khîrn
|mn-t=keng5/kêng5/king5
|mn-t_note=keng5 - Triều Châu, Sán Đầu, Trừng Hải; kêng5 - Yết Dương; king5 - Triều Dương
|mn-l=kieng5
|px=pt:gyng2/jk:goeng2/nr,xy,yy:kyng2/dh,ft:king2
|sp=gan4
|w=sh:6jin;jd,sj,cm,sz,cz,jx,hz,sx,nb,zs:2jin
|w-j=2jin
|x=jin2
|mc=y
|oc=y
|cat=v,a,adv,n,pn
}}
===={{section|dfn}}====
{{head|zh|hanzi}}
# {{lb|zh|archaic}} [[gánh vác|Gánh vác]], [[ép buộc]] ai đó [[làm việc]] vất vả hoặc gây áp lực, [[gánh nặng]] cho người khác.
# {{lb|zh|literary|or|từ ghép}} [[cần cù|Cần cù]], [[siêng năng]].
# {{lb|zh|archaic}} Sự [[giúp đỡ]], sự [[cứu giúp]], sự [[viện trợ]].
# {{surname|zh}}
===={{section|com}}====
{{col3|zh|倦勤|勤力|值勤|克儉克勤|克勤克儉|內勤|全勤|出勤|加二殷勤|勤儉|勤兒|勤勉|勤務|勤務兵|勤務召集|勤務員|勤勞|勤奮|勤學|勤快|勤恤|勤慎|勤懇|勤政|勤政愛民|勤敏|勤王|勤練|勤能補拙|勤苦|勤行|勤謹|勤雜人員|地勤|執勤|外勤|夜勤|天道酬勤|將勤補拙|專勤制度|後勤|恩勤|懋勤殿|打勤勞|打勤獻趣|服勤|查勤|業精於勤|殷勤|殷殷勤勤|父母恩勤|特勤|獻勤|獻殷勤|矢勤矢勇|空勤|精勤|缺勤|考勤|耄勤|耒耜之勤|聯勤總部|調勤|警勤區|警察勤務|辛勤|通勤|通勤圈|電子通勤|顏勤禮碑|勤有功,戲無益|業精於勤,荒於嬉}}
==={{section|glyph origin}} 2===
{{Han simp|懃|f=心|t= }}.
===={{section|etym}}====
{{zh-see|懃}}
==={{section|further}}===
* {{R:yue:Hanzi}}
* {{R:zh:cbgycdxdb|6536}}
* {{R:twedu|A00401}}
* {{R:cpx:PHDB|entry=勤|pp=236}}
b8xw6au4obvqti113m1qa2zhl0iu9ij
懄
0
415271
2561610
2026-09-08T08:47:33Z
Hiyuune
50834
Trang mới: “{{also|慬|懃}} {{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=61|rad=心|as=13|sn=16|canj=PTMS|four=94027|ids=⿰忄勤}} ==={{ĐM|ref}}=== * {{Han ref|kx=0405.140|dkj=11322|dj=0745.240|hdz=42360.010|uh=61C4}} =={{langname|ja}}== ==={{ĐM|kanji}}=== {{ja-kanji|rs=心13}} # {{rfdef|ja|sort=心13}} ===={{ĐM|reading}}==== {{ja-readings|on=きん}} =={{langname|ko}}== ==={{ĐM|pron}}=== {{ko-hanja-pron|근}} ==={{ĐM|hanja}}=== {{ko-hanja|…”
2561610
wikitext
text/x-wiki
{{also|慬|懃}}
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=61|rad=心|as=13|sn=16|canj=PTMS|four=94027|ids=⿰忄勤}}
==={{ĐM|ref}}===
* {{Han ref|kx=0405.140|dkj=11322|dj=0745.240|hdz=42360.010|uh=61C4}}
=={{langname|ja}}==
==={{ĐM|kanji}}===
{{ja-kanji|rs=心13}}
# {{rfdef|ja|sort=心13}}
===={{ĐM|reading}}====
{{ja-readings|on=きん}}
=={{langname|ko}}==
==={{ĐM|pron}}===
{{ko-hanja-pron|근}}
==={{ĐM|hanja}}===
{{ko-hanja|근심하다|근심할|근}}
# {{alt form|ko|慬||lo lắng}}
=={{langname|zh}}==
{{zh-forms}}
==={{ĐM|glyph origin}}===
{{Han etym}}
{{Han compound|心|勤|ls=psc|c1=s|c2=p|t1=trái tim}}.
==={{ĐM|etym}} 1===
{{zh-see|慬|hv}}
==={{ĐM|etym}} 2===
{{zh-see|懃|v}}
==={{ĐM|further}}===
* {{R:twedu|B01171-001}}
* {{R:twedu|B01206-001}}
hyrs5p0dvtluy52bmju50763164sznt
ᰟᰧ
0
415272
2561615
2026-09-08T08:59:15Z
Hiyuune
50834
Trang mới: “=={{langname|lep}}== ==={{section|etym}}=== Từ {{inh|lep|sit-pro|*swiʔ}}. ==={{section|pron}}=== * {{lep-IPA}} ==={{section|n}}=== {{head|lep|Danh từ|tr=vi}} # [[máu|Máu]].”
2561615
wikitext
text/x-wiki
=={{langname|lep}}==
==={{section|etym}}===
Từ {{inh|lep|sit-pro|*swiʔ}}.
==={{section|pron}}===
* {{lep-IPA}}
==={{section|n}}===
{{head|lep|Danh từ|tr=vi}}
# [[máu|Máu]].
jiwcpw7urp92y0aatjmqu2ik6ffmb46
Mô đun:txg-headword
828
415273
2561616
2026-09-08T09:07:45Z
Hiyuune
50834
Trang mới: “local export = {} local m_headword = require("Module:headword") local m_param = require("Module:parameters") local txg = require("Module:languages").getByCode("txg") local Tang_pattern = "[" .. require("Module:scripts").getByCode("Tang"):getCharacters() .. "]" local pagename = mw.loadData("Module:headword/data").pagename local function lang_txg(text) return '<span class="Tang" lang="txg">' .. text .. '</span>' end local function l_txg(text) return lang_txg("[[" .. t…”
2561616
Scribunto
text/plain
local export = {}
local m_headword = require("Module:headword")
local m_param = require("Module:parameters")
local txg = require("Module:languages").getByCode("txg")
local Tang_pattern = "[" .. require("Module:scripts").getByCode("Tang"):getCharacters() .. "]"
local pagename = mw.loadData("Module:headword/data").pagename
local function lang_txg(text)
return '<span class="Tang" lang="txg">' .. text .. '</span>'
end
local function l_txg(text)
return lang_txg("[[" .. text .. "#Tiếng_Tangut|" .. text .. "]]")
end
function export.char(frame)
local params = {
[1] = {list = true},
["rad"] = {},
["as"] = {},
["sn"] = {},
["ids"] = {},
}
local args = m_param.process(frame:getParent().args, params)
if args[1] then
for i,cat in ipairs(args[1]) do
args[1][i] = "Tangut "..cat.."s"
end
end
local data = {
lang = txg,
pagename = nil,
heads = {'<span style="font-size:200%;">' .. pagename .. '</span>'},
pos_category = "Chữ tượng hình",
categories = args[1],
sort_key = nil, --TODO?
}
if args.rad then
args.rad = "[[Phụ lục:Danh mục bộ thủ chữ Tây Hạ/" .. args.rad .. "|" .. lang_txg(args.rad) .. "]]"
end
if args.ids then
local ids_split = {}
for id in mw.text.gsplit(args.ids, "%s*[,]%s*") do
table.insert(ids_split,
lang_txg(mw.ustring.gsub(id, Tang_pattern, l_txg("%0"))))
end
args.ids = table.concat(ids_split, " or ")
end
return m_headword.full_headword(data) .. " ("
.. (args.rad and ("''bộ thủ'' " .. args.rad .. "+" .. args.as .. ", " .. args.sn .. " nét") or "")
.. (args.ids and (", ''bố cục'' " .. args.ids) or "")
.. ")"
end
return export
qtm75axqlsibl88vjocyukr83xscz24
2561618
2561616
2026-09-08T09:10:35Z
Hiyuune
50834
2561618
Scribunto
text/plain
local export = {}
local m_headword = require("Module:headword")
local m_param = require("Module:parameters")
local txg = require("Module:languages").getByCode("txg")
local Tang_pattern = "[" .. require("Module:scripts").getByCode("Tang"):getCharacters() .. "]"
local pagename = mw.loadData("Module:headword/data").pagename
local function lang_txg(text)
return '<span class="Tang" lang="txg">' .. text .. '</span>'
end
local function l_txg(text)
return lang_txg("[[" .. text .. "#Tiếng_Tangut|" .. text .. "]]")
end
function export.char(frame)
local params = {
[1] = {list = true},
["rad"] = {},
["as"] = {},
["sn"] = {},
["ids"] = {},
}
local args = m_param.process(frame:getParent().args, params)
if args[1] then
for i,cat in ipairs(args[1]) do
args[1][i] = cat .. " tiếng Tangut"
end
end
local data = {
lang = txg,
pagename = nil,
heads = {'<span style="font-size:200%;">' .. pagename .. '</span>'},
pos_category = "Chữ tượng hình",
categories = args[1],
sort_key = nil, --TODO?
}
if args.rad then
args.rad = "[[Phụ lục:Danh mục bộ thủ chữ Tây Hạ/" .. args.rad .. "|" .. lang_txg(args.rad) .. "]]"
end
if args.ids then
local ids_split = {}
for id in mw.text.gsplit(args.ids, "%s*[,]%s*") do
table.insert(ids_split,
lang_txg(mw.ustring.gsub(id, Tang_pattern, l_txg("%0"))))
end
args.ids = table.concat(ids_split, " or ")
end
return m_headword.full_headword(data) .. " ("
.. (args.rad and ("''bộ thủ'' " .. args.rad .. "+" .. args.as .. ", " .. args.sn .. " nét") or "")
.. (args.ids and (", ''bố cục'' " .. args.ids) or "")
.. ")"
end
return export
28nshqq8vpqw02zh1p174lw3y6uuyk3
Bản mẫu:txg-char
10
415274
2561617
2026-09-08T09:08:22Z
Hiyuune
50834
Trang mới: “<includeonly>{{#invoke:txg-headword|char}}</includeonly><noinclude>{{documentation}}{{tcat|hw}}</noinclude>”
2561617
wikitext
text/x-wiki
<includeonly>{{#invoke:txg-headword|char}}</includeonly><noinclude>{{documentation}}{{tcat|hw}}</noinclude>
ideq355mv329nfbkxxaacict5wcul8y
𗊴
0
415275
2561619
2026-09-08T09:10:52Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|txg}}== ==={{section|etym}}=== Từ {{inh|txg|sit-pro|*swiʔ}}. Cùng gốc với {{cog|bo|ཡི་དམ}}, {{cog|ksw|သွံၣ်}}, {{cog|pwo|ၥွံၪ}}, {{cog|my|သွေး}}, và {{cog|kyu|ꤞꤝꤤ꤬}}. ==={{section|pron}}=== {{txg-pron}} ==={{section|n}}=== {{txg-char|Danh từ|rad=𘠣|as=7|sn=9|ids=⿲𘠣𘤣𘠢}} # [[máu|Máu]]. ===={{section|com}}==== {{col|txg|𗊴𗆧|𗊴𘒓|𗮸𗊴|𘋢𗊴}} ==={{sectio…”
2561619
wikitext
text/x-wiki
{{character info}}
=={{langname|txg}}==
==={{section|etym}}===
Từ {{inh|txg|sit-pro|*swiʔ}}. Cùng gốc với {{cog|bo|ཡི་དམ}}, {{cog|ksw|သွံၣ်}}, {{cog|pwo|ၥွံၪ}}, {{cog|my|သွေး}}, và {{cog|kyu|ꤞꤝꤤ꤬}}.
==={{section|pron}}===
{{txg-pron}}
==={{section|n}}===
{{txg-char|Danh từ|rad=𘠣|as=7|sn=9|ids=⿲𘠣𘤣𘠢}}
# [[máu|Máu]].
===={{section|com}}====
{{col|txg|𗊴𗆧|𗊴𘒓|𗮸𗊴|𘋢𗊴}}
==={{section|ref}}===
{{txg-ref|wh=L48.112|tya=28B78|tyb=29B47|x=|l=2734|m=1|k=3923-0|s=4221|n=181-072}}
{{c|txg|Chất lỏng cơ thể}}
3tlfn0vmoag5t2xxhdzmj7jbsk9fuf5
अकार्षीत्
0
415276
2561620
2026-09-08T09:14:03Z
Hiyuune
50834
Trang mới: “=={{langname|sa}}== ==={{section|alt}}=== {{sa-alt}} ==={{section|pron}}=== {{sa-IPA|a=1}} ==={{section|v}}=== {{sa-verb|tr=ákārṣīt|कृ||P|thì quá khứ bất định}} # {{inflection of|sa|कृ||aorist}} ===={{section|forms}}==== {{sa-conj|aor|ákārṣīt|ákṛṣṭa}} ==={{section|further}}=== * {{R:sa:Narten:1964|page=95-6}}”
2561620
wikitext
text/x-wiki
=={{langname|sa}}==
==={{section|alt}}===
{{sa-alt}}
==={{section|pron}}===
{{sa-IPA|a=1}}
==={{section|v}}===
{{sa-verb|tr=ákārṣīt|कृ||P|thì quá khứ bất định}}
# {{inflection of|sa|कृ||aorist}}
===={{section|forms}}====
{{sa-conj|aor|ákārṣīt|ákṛṣṭa}}
==={{section|further}}===
* {{R:sa:Narten:1964|page=95-6}}
lz1lmar0071gpyc5uwupeagpiryacp7
Bản mẫu:R:sa:Narten:1964
10
415277
2561621
2026-09-08T09:14:43Z
Hiyuune
50834
Trang mới: “{{#invoke:quote|call_template |template=cite-book |de |title=Die sigmatischen Aoriste im Veda |year=1964 |last=Narten |first=Johanna |authorlink=Johanna Narten |location=Wiesbaden |publisher=Otto Harrassowitz |pageparam=1 |textparam=2 }}<noinclude>{{refcat|inc-pro|sa}}</noinclude>”
2561621
wikitext
text/x-wiki
{{#invoke:quote|call_template
|template=cite-book
|de
|title=Die sigmatischen Aoriste im Veda
|year=1964
|last=Narten
|first=Johanna
|authorlink=Johanna Narten
|location=Wiesbaden
|publisher=Otto Harrassowitz
|pageparam=1
|textparam=2
}}<noinclude>{{refcat|inc-pro|sa}}</noinclude>
rgzieyz37s1ddroemtq8wjp808f3meg
gam3
0
415278
2561623
2026-09-08T09:34:44Z
Hiyuune
50834
Trang mới: “=={{langname|yue}}== ==={{ĐM|rom}}=== * {{IPA|yue|/kɐm˧/}} ==={{Đ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|贛}}”
2561623
wikitext
text/x-wiki
=={{langname|yue}}==
==={{ĐM|rom}}===
* {{IPA|yue|/kɐm˧/}}
==={{Đ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|贛}}
o37ca1b1lwucxs026xy0k0l3x02zvsi
zep4
0
415279
2561624
2026-09-08T09:35:26Z
Hiyuune
50834
Trang mới: “{{also|zep|Zep|zēp|žep|Zep.|zep6}} =={{langname|yue}}== ==={{ĐM|rom}}=== {{yue-jyut}} # {{yue-jyutping of|㗱}}”
2561624
wikitext
text/x-wiki
{{also|zep|Zep|zēp|žep|Zep.|zep6}}
=={{langname|yue}}==
==={{ĐM|rom}}===
{{yue-jyut}}
# {{yue-jyutping of|㗱}}
33bf9y1cemgkaxmyx166a2f0db6zrou
㗱
0
415280
2561625
2026-09-08T09:37:52Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{section|han}}=== {{Han char|rn=30|rad=口|as=12|sn=15|canj=ROGD|four=60094|ids=⿰口集}} ==={{section|ref}}=== * {{Han ref|kx=0206.300|dkj=4244|hdz=10684.090|uh=35F1}} =={{langname|vi}}== ==={{section|glyph origin}}=== {{Han compound|lang=vi|口|集|ls=psc|tr=tấp/tộp|c1=s|c2=p|t1=miệng|tr2=tập}}. ===Hán-Nôm=== {{vi-readings|rs=口12|nom=tấp-tdcndg,tộp-btcn}} # {{vi-Nom form of|tấp}} # {{vi-Nom form of|t…”
2561625
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=30|rad=口|as=12|sn=15|canj=ROGD|four=60094|ids=⿰口集}}
==={{section|ref}}===
* {{Han ref|kx=0206.300|dkj=4244|hdz=10684.090|uh=35F1}}
=={{langname|vi}}==
==={{section|glyph origin}}===
{{Han compound|lang=vi|口|集|ls=psc|tr=tấp/tộp|c1=s|c2=p|t1=miệng|tr2=tập}}.
===Hán-Nôm===
{{vi-readings|rs=口12|nom=tấp-tdcndg,tộp-btcn}}
# {{vi-Nom form of|tấp}}
# {{vi-Nom form of|tộp|chomping, munching}}
===={{sectio|com}}====
{{col|vi
|{{vi-l|㗱|tấp tểnh}}
}}
==={{section|ref}}===
{{reflist}}
8qj96ejq1lo225fri4lg87mvhsy3lrg
2561626
2561625
2026-09-08T09:38:08Z
Hiyuune
50834
/* Hán-Nôm */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561626
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=30|rad=口|as=12|sn=15|canj=ROGD|four=60094|ids=⿰口集}}
==={{section|ref}}===
* {{Han ref|kx=0206.300|dkj=4244|hdz=10684.090|uh=35F1}}
=={{langname|vi}}==
==={{section|glyph origin}}===
{{Han compound|lang=vi|口|集|ls=psc|tr=tấp/tộp|c1=s|c2=p|t1=miệng|tr2=tập}}.
===Hán-Nôm===
{{vi-readings|rs=口12|nom=tấp-tdcndg,tộp-btcn}}
# {{vi-Nom form of|tấp}}
# {{vi-Nom form of|tộp}}
===={{sectio|com}}====
{{col|vi
|{{vi-l|㗱|tấp tểnh}}
}}
==={{section|ref}}===
{{reflist}}
qgk88d9zwx7a6a1j1ksrcabcm72omxd
2561627
2561626
2026-09-08T09:38:16Z
Hiyuune
50834
/* Bản mẫu:sectio */ (sử dụng [[MediaWiki:Gadget-AjaxEdit.js|AjaxEdit]])
2561627
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{section|han}}===
{{Han char|rn=30|rad=口|as=12|sn=15|canj=ROGD|four=60094|ids=⿰口集}}
==={{section|ref}}===
* {{Han ref|kx=0206.300|dkj=4244|hdz=10684.090|uh=35F1}}
=={{langname|vi}}==
==={{section|glyph origin}}===
{{Han compound|lang=vi|口|集|ls=psc|tr=tấp/tộp|c1=s|c2=p|t1=miệng|tr2=tập}}.
===Hán-Nôm===
{{vi-readings|rs=口12|nom=tấp-tdcndg,tộp-btcn}}
# {{vi-Nom form of|tấp}}
# {{vi-Nom form of|tộp}}
===={{section|com}}====
{{col|vi
|{{vi-l|㗱|tấp tểnh}}
}}
==={{section|ref}}===
{{reflist}}
h19c9tyjfdefc22h0fmxdrin4udrajl
yīn
0
415281
2561631
2026-09-08T09:44:44Z
Hiyuune
50834
Trang mới: “{{also|yin|yin'|yín|yìn|yǐn|þin|þín}} =={{langname|cmn}}== ==={{ĐM|pron}}=== * {{audio|cmn|Zh-yīn.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 o…”
2561631
wikitext
text/x-wiki
{{also|yin|yin'|yín|yìn|yǐn|þin|þín}}
=={{langname|cmn}}==
==={{ĐM|pron}}===
* {{audio|cmn|Zh-yīn.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|栶}}
f3o9qocergt0rcax4t30vbh4o10gi1i
yin1
0
415282
2561632
2026-09-08T09:45:29Z
Hiyuune
50834
Trang mới: “=={{langname|cmn}}== ==={{section|rom}}=== {{cmn-pinyin}} # {{alternative spelling of|cmn|yīn}}”
2561632
wikitext
text/x-wiki
=={{langname|cmn}}==
==={{section|rom}}===
{{cmn-pinyin}}
# {{alternative spelling of|cmn|yīn}}
e7cikfs4vxqohkmdsspyzjf9mwvvk7i
yìn
0
415283
2561633
2026-09-08T09:46:36Z
Hiyuune
50834
Trang mới: “{{also|yin|yin'|yín|yīn|yǐn|þin|þín}} =={{langname|cmn}}== ==={{ĐM|pron}}=== * {{audio|cmn|Zh-yìn.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 o…”
2561633
wikitext
text/x-wiki
{{also|yin|yin'|yín|yīn|yǐn|þin|þín}}
=={{langname|cmn}}==
==={{ĐM|pron}}===
* {{audio|cmn|Zh-yìn.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|鮣}}
h248jbuf3dvgejembebtgqrepg6daqh
𬘡
0
415284
2561634
2026-09-08T09:48:52Z
Hiyuune
50834
Trang mới: “{{character info}} =={{langname|mul}}== ==={{ĐM|han}}=== {{Han char|rn=120|rad=纟|as=6|sn=9|four=|canj=|ids=⿰纟因}} ===={{ĐM|ref}}==== {{Han ref|uh=2C621}} {{-}} =={{langname|zh}}== {{zh-see|絪}}”
2561634
wikitext
text/x-wiki
{{character info}}
=={{langname|mul}}==
==={{ĐM|han}}===
{{Han char|rn=120|rad=纟|as=6|sn=9|four=|canj=|ids=⿰纟因}}
===={{ĐM|ref}}====
{{Han ref|uh=2C621}}
{{-}}
=={{langname|zh}}==
{{zh-see|絪}}
lxokznklndmi1a1tl8i1j8qgxs4yr0h
гуруснагӣ
0
415285
2561635
2026-09-08T09:53:13Z
Hiyuune
50834
Trang mới: “=={{langname|tg}}== ==={{section|etym}}=== {{ety|tg|:inh|fa-cls:گُرُسْنَگِی|text=+|tree=1}} {{surf|tg|гурусна|-гӣ}}. ==={{section|pron}}=== {{tg-IPA}} ==={{section|n}}=== {{tg-noun|fa=گرسنگی}} # [[đói|Đói]]. ===={{section|infl}}==== {{tg-infl-noun|nb=sg}}”
2561635
wikitext
text/x-wiki
=={{langname|tg}}==
==={{section|etym}}===
{{ety|tg|:inh|fa-cls:گُرُسْنَگِی|text=+|tree=1}} {{surf|tg|гурусна|-гӣ}}.
==={{section|pron}}===
{{tg-IPA}}
==={{section|n}}===
{{tg-noun|fa=گرسنگی}}
# [[đói|Đói]].
===={{section|infl}}====
{{tg-infl-noun|nb=sg}}
it190irrk3us5rwjogojma2lkxcyoch
گرسنگی
0
415286
2561636
2026-09-08T09:53:58Z
Hiyuune
50834
Trang mới: “=={{langname|fa}}== {{wp|fa:}} ==={{section|etym}}=== {{ety|fa|:af|گرسنه<tr:gorosne>|ـگی<tr:-gi>|text=+|tree=1}} ==={{section|v}}=== {{fa-IPA|gurusna`gī|ir=gurusni`gī}} ==={{section|n}}=== {{fa-regional|گرسنگی|گرسنگی|гуруснагӣ}} {{fa-noun|cls=گُرُسْنَگِی}} # [[đói|Đói]]. #: {{syn|fa|گشنگی|tr1=gošnegi}} ==={{section|see}}=== * {{l|fa|تشنگی|tr=tešnegi}}”
2561636
wikitext
text/x-wiki
=={{langname|fa}}==
{{wp|fa:}}
==={{section|etym}}===
{{ety|fa|:af|گرسنه<tr:gorosne>|ـگی<tr:-gi>|text=+|tree=1}}
==={{section|v}}===
{{fa-IPA|gurusna`gī|ir=gurusni`gī}}
==={{section|n}}===
{{fa-regional|گرسنگی|گرسنگی|гуруснагӣ}}
{{fa-noun|cls=گُرُسْنَگِی}}
# [[đói|Đói]].
#: {{syn|fa|گشنگی|tr1=gošnegi}}
==={{section|see}}===
* {{l|fa|تشنگی|tr=tešnegi}}
7gbi0sfhdlankc7y043dc1z3mwcim16
こまち
0
415287
2561638
2026-09-08T10:29:51Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|pr-noun}}=== {{ja-pos|proper}} # {{ja-def|小町}} {{given name|ja|nữ}} ==={{ĐM|noun}}=== {{ja-noun}} # {{ja-def|小町}} [[phụ nữ]] [[đẹp]].”
2561638
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|pr-noun}}===
{{ja-pos|proper}}
# {{ja-def|小町}} {{given name|ja|nữ}}
==={{ĐM|noun}}===
{{ja-noun}}
# {{ja-def|小町}} [[phụ nữ]] [[đẹp]].
t1fjs0ljhw9r2ebofdq4vh9hafe0muz
Komachi
0
415288
2561639
2026-09-08T10:31:52Z
WhoAlone
40420
Trang mới: “{{also|komachi}} =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|こまち}}”
2561639
wikitext
text/x-wiki
{{also|komachi}}
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|こまち}}
q471h2ayiax1t1zfb3rd1jd3s4v9ohp
komachi
0
415289
2561640
2026-09-08T10:33:16Z
WhoAlone
40420
Trang mới: “{{also|Komachi}} =={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|こまち}}”
2561640
wikitext
text/x-wiki
{{also|Komachi}}
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|こまち}}
8ujp02wzkmbv1prbm2rh87ivij5ml5p
小町
0
415290
2561641
2026-09-08T10:36:34Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|まち|yomi=k}} ==={{ĐM|pron}}=== {{ja-pron|こまち|acc=1|acc_ref=DJR}} ==={{ĐM|etym}} 1=== ===={{ĐM|noun}}==== {{ja-pos|proper|こまち}} # {{given name|ja|nữ|sort=こまち}} ==={{ĐM|etym}} 2=== Từ tên nhà thơ {{w|Ono no Komachi}} ({{ja-l|小野}}{{ja-l|小町}}), người được biết đến với vẻ đẹp tuyệt trần. ===={{ĐM|noun}}==== {{ja-noun|こまち}} # Người [[phụ nữ]] [[xinh đẹp]]…”
2561641
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|まち|yomi=k}}
==={{ĐM|pron}}===
{{ja-pron|こまち|acc=1|acc_ref=DJR}}
==={{ĐM|etym}} 1===
===={{ĐM|noun}}====
{{ja-pos|proper|こまち}}
# {{given name|ja|nữ|sort=こまち}}
==={{ĐM|etym}} 2===
Từ tên nhà thơ {{w|Ono no Komachi}} ({{ja-l|小野}}{{ja-l|小町}}), người được biết đến với vẻ đẹp tuyệt trần.
===={{ĐM|noun}}====
{{ja-noun|こまち}}
# Người [[phụ nữ]] [[xinh đẹp]].
#: {{syn|ja|小町娘|tr=komachimusume}}
==={{ĐM|ref}}===
{{reflist}}
{{C|ja|Nữ giới|sort=こまち}}
n9zya9pngfa6oigudd50mk3tk8xgr7i
小町娘
0
415291
2561642
2026-09-08T10:38:33Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|まち|むすめ|yomi=k}} ==={{ĐM|pron}}=== {{ja-pron|こまちむすめ|acc=1}} ==={{ĐM|noun}}=== {{ja-noun|こまちむすめ}} # Người [[phụ nữ]] [[xinh đẹp]]. #: {{syn|ja|小町|tr=komachi}}”
2561642
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|まち|むすめ|yomi=k}}
==={{ĐM|pron}}===
{{ja-pron|こまちむすめ|acc=1}}
==={{ĐM|noun}}===
{{ja-noun|こまちむすめ}}
# Người [[phụ nữ]] [[xinh đẹp]].
#: {{syn|ja|小町|tr=komachi}}
1szp0xnpxau9t2tn6uxopdvu29wa3zk
こまちむすめ
0
415292
2561643
2026-09-08T10:39:19Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小町娘}}”
2561643
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小町娘}}
ilusfba52ssfeecrh83a1sas7wpspv1
komachimusume
0
415293
2561644
2026-09-08T10:40:25Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|こまちむすめ}}”
2561644
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|こまちむすめ}}
ewk9y3ohb40tsll9rh8ipgzrysq58uz
小真智
0
415294
2561645
2026-09-08T10:41:23Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|ま|ち}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こまち}} # {{given name|ja|nữ|sort=こまち}}”
2561645
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|ま|ち}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こまち}}
# {{given name|ja|nữ|sort=こまち}}
oarsmoteq725gchph4dqjgf3jtifkf9
小眞智
0
415295
2561646
2026-09-08T10:42:01Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小真智}}”
2561646
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小真智}}
o2gnq6tfx8fq3jlztjact2cnk76vrp3
小毬
0
415296
2561647
2026-09-08T10:43:41Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|まり}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こまり}} # {{given name|ja|nữ|sort=こまり}}”
2561647
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|まり}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こまり}}
# {{given name|ja|nữ|sort=こまり}}
ce8b6lu9qdk6xcwfu7k0gv272x45d75
こまり
0
415297
2561648
2026-09-08T10:44:20Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小毬}}”
2561648
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小毬}}
2ssa31ok6d8ri81qt9rqznrpzxe2gxn
小桃
0
415298
2561649
2026-09-08T10:52:49Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|もも}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こもも}} # {{given name|ja|nữ|sort=こもも}}”
2561649
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|もも}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こもも}}
# {{given name|ja|nữ|sort=こもも}}
8vidmhb3s2qeiu8bqzwhigqg7jkiof9
こもも
0
415299
2561650
2026-09-08T10:53:02Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小桃}}”
2561650
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小桃}}
r61c84sthoqq00wx2viv5mfdxc1m516
2561651
2561650
2026-09-08T10:53:18Z
WhoAlone
40420
2561651
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小桃|幸桃}}
q8vqtjeauwkbn0bn4fes2bycmgyejeq
幸桃
0
415300
2561652
2026-09-08T10:53:37Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こう|k1=こ|もも|yomi=ok}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こもも}} # {{given name|ja|nữ|sort=こもも}}”
2561652
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こう|k1=こ|もも|yomi=ok}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こもも}}
# {{given name|ja|nữ|sort=こもも}}
5l5hodss27r6yp9fmhdav1ey2vclqpu
芽具子
0
415301
2561653
2026-09-08T10:54:53Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|め|く|k2=ぐ|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|めぐこ}} # {{given name|ja|nữ|sort=めぐこ}}”
2561653
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|め|く|k2=ぐ|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|めぐこ}}
# {{given name|ja|nữ|sort=めぐこ}}
fs3kv10tg0we0juun8tvdzujcknz8by
めぐこ
0
415302
2561654
2026-09-08T10:55:08Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|芽具子}}”
2561654
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|芽具子}}
58i55x2rhy8xu2f20cif46fpy6cbpyp
小詠
0
415303
2561655
2026-09-08T10:55:58Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|よみ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こよみ}} # {{given name|ja|nữ|sort=こよみ}}”
2561655
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|よみ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こよみ}}
# {{given name|ja|nữ|sort=こよみ}}
3wnd157sr9o6y2orda8g0j08nkztxji
こよみ
0
415304
2561656
2026-09-08T10:56:16Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|暦|小詠}}”
2561656
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|暦|小詠}}
2zbg2gh6vik0gyfcen85fcae2m1pl6u
いつわ
0
415305
2561657
2026-09-08T10:57:04Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|noun}}=== {{ja-noun}} # {{ja-def|逸話}} [[giai thoại]].”
2561657
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|noun}}===
{{ja-noun}}
# {{ja-def|逸話}} [[giai thoại]].
s54ox73nd59ahuetpq5gfjjb3ls4buu
itsuwa
0
415306
2561658
2026-09-08T10:57:28Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== ==={{ĐM|rom}}=== {{ja-romaji}} # {{ja-romanization of|いつわ}}”
2561658
wikitext
text/x-wiki
=={{langname|ja}}==
==={{ĐM|rom}}===
{{ja-romaji}}
# {{ja-romanization of|いつわ}}
4xzdylcdoxxdyiihhwozpggkbcknisa
衣音
0
415307
2561659
2026-09-08T10:58:13Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|ころも|ね|k1=ころ|yomi=k}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|ころね}} # {{given name|ja|nữ|sort=ころね}}”
2561659
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|ころも|ね|k1=ころ|yomi=k}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|ころね}}
# {{given name|ja|nữ|sort=ころね}}
kd23r2n0jeoj8jb4d6v53pjdaa3g5dc
ころね
0
415308
2561660
2026-09-08T10:58:30Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|衣音}}”
2561660
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|衣音}}
n4ux583m5jsybg8jfvl738huz5ahvi2
小文美
0
415309
2561661
2026-09-08T10:59:06Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|ふ|み}} ==={{ĐM|pron}}=== {{ja-pron|こふみ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こふみ}} # {{given name|ja|nữ|sort=こふみ}}”
2561661
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|ふ|み}}
==={{ĐM|pron}}===
{{ja-pron|こふみ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こふみ}}
# {{given name|ja|nữ|sort=こふみ}}
476e7p5mlii00kxxpuqa9wb3al8iqup
こふみ
0
415310
2561662
2026-09-08T10:59:24Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小文美}}”
2561662
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小文美}}
0y7s0rgj2826eobv8horssxcah3jjdg
小春子
0
415311
2561663
2026-09-08T10:59:52Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる|こ}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはるこ}} # {{given name|ja|nữ|sort=こはるこ}}”
2561663
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる|こ}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはるこ}}
# {{given name|ja|nữ|sort=こはるこ}}
bcqoauxwmpmdt7jo2wmbnck2cp8jht9
こはるこ
0
415312
2561664
2026-09-08T11:00:05Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小春子}}”
2561664
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小春子}}
lm6d424ntjs8za271z9v9tcm5biuyxt
小晴
0
415313
2561665
2026-09-08T11:01:42Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561665
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
小遥
0
415314
2561666
2026-09-08T11:01:45Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561666
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
小暖
0
415315
2561667
2026-09-08T11:01:47Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561667
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
小花
0
415316
2561668
2026-09-08T11:01:57Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561668
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
子晴
0
415317
2561669
2026-09-08T11:02:06Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561669
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
瑚花
0
415318
2561670
2026-09-08T11:02:25Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561670
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
小遙
0
415319
2561671
2026-09-08T11:02:38Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|小遥}}”
2561671
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|小遥}}
53rugfe7c7q6uttnsgdq7amv5xljg4e
子治
0
415320
2561672
2026-09-08T11:03:38Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561672
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
小春
0
415321
2561673
2026-09-08T11:03:47Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561673
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
胡遥
0
415322
2561674
2026-09-08T11:04:15Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561674
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
香花
0
415323
2561675
2026-09-08T11:04:17Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561675
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
香遥
0
415324
2561676
2026-09-08T11:04:19Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561676
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
胡遙
0
415325
2561677
2026-09-08T11:04:36Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|胡遥}}”
2561677
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|胡遥}}
9fj45nwekijte5ib9f9a2vs3lc9jar1
香遙
0
415326
2561678
2026-09-08T11:04:52Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-see|香遥}}”
2561678
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-see|香遥}}
3rahqwkyl4ihcik3nx3jo249s0s48zz
湖暖
0
415327
2561679
2026-09-08T11:05:28Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561679
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
鼓晴
0
415328
2561680
2026-09-08T11:05:29Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561680
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
香晴
0
415329
2561681
2026-09-08T11:06:50Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561681
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
香陽
0
415330
2561682
2026-09-08T11:07:12Z
WhoAlone
40420
Trang mới: “=={{langname|ja}}== {{ja-kanjitab|こ|はる}} ==={{ĐM|pr-noun}}=== {{ja-pos|proper|こはる}} # {{given name|ja|nữ|sort=こはる}}”
2561682
wikitext
text/x-wiki
=={{langname|ja}}==
{{ja-kanjitab|こ|はる}}
==={{ĐM|pr-noun}}===
{{ja-pos|proper|こはる}}
# {{given name|ja|nữ|sort=こはる}}
h3t9v0ix180h4kt5qgoau0igqifteyy
Thể loại:ybe:Mọi người
14
415331
2561685
2026-09-08T11:08:47Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561685
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Thực phẩm
14
415332
2561686
2026-09-08T11:08:50Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561686
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Tháng
14
415333
2561687
2026-09-08T11:09:03Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561687
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:Mục từ có chứa nhiều từ tiếng Tây Yugur
14
415334
2561688
2026-09-08T11:09:06Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561688
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Sự kiện theo chu kỳ
14
415335
2561689
2026-09-08T11:09:19Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561689
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Ăn
14
415336
2561690
2026-09-08T11:09:24Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561690
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Thời gian
14
415337
2561691
2026-09-08T11:09:30Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561691
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Ngày trong tuần
14
415338
2561692
2026-09-08T11:09:41Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561692
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx
Thể loại:ybe:Danh sách chủ đề thuộc nhóm tên gọi
14
415339
2561693
2026-09-08T11:09:52Z
WhoAlone
40420
Trang mới: “{{auto cat}}”
2561693
wikitext
text/x-wiki
{{auto cat}}
eomzlm5v4j7ond1phrju7cnue91g5qx